From 0b626f1be8ad55b065384837131b9f91d07b053d Mon Sep 17 00:00:00 2001 From: S2kael Date: Mon, 30 Sep 2024 18:10:54 +0700 Subject: [PATCH 001/204] [Issue-3711] Re-handle state for balance item --- .../balance-service/helpers/subscribe/index.ts | 11 +++++++++++ .../src/services/balance-service/index.ts | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/extension-base/src/services/balance-service/helpers/subscribe/index.ts b/packages/extension-base/src/services/balance-service/helpers/subscribe/index.ts index a5208545e9f..2f39de9a810 100644 --- a/packages/extension-base/src/services/balance-service/helpers/subscribe/index.ts +++ b/packages/extension-base/src/services/balance-service/helpers/subscribe/index.ts @@ -157,6 +157,17 @@ export function subscribeBalance ( }); } + // If the chain is not ready, return pending state + if (!substrateApiMap[chainSlug].isApiReady) { + handleUnsupportedOrPendingAddresses( + useAddresses, + chainSlug, + chainAssetMap, + APIItemState.PENDING, + callback + ); + } + const substrateApi = await substrateApiMap[chainSlug].isReady; return subscribeSubstrateBalance(useAddresses, chainInfo, chainAssetMap, substrateApi, evmApi, callback, extrinsicType); diff --git a/packages/extension-base/src/services/balance-service/index.ts b/packages/extension-base/src/services/balance-service/index.ts index 63e234b5b85..6896eb313e4 100644 --- a/packages/extension-base/src/services/balance-service/index.ts +++ b/packages/extension-base/src/services/balance-service/index.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { BalanceError } from '@subwallet/extension-base/background/errors/BalanceError'; -import { AmountData, BalanceErrorType, DetectBalanceCache, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes'; +import { AmountData, APIItemState, BalanceErrorType, DetectBalanceCache, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes'; import { ALL_ACCOUNT_KEY } from '@subwallet/extension-base/constants'; import { _isXcmWithinSameConsensus } from '@subwallet/extension-base/core/substrate/xcm-parser'; import KoniState from '@subwallet/extension-base/koni/background/handlers/State'; @@ -215,7 +215,7 @@ export class BalanceService implements StoppableServiceInterface { unsub = subscribeBalance([address], [chain], [tSlug], assetMap, chainInfoMap, substrateApiMap, evmApiMap, (result) => { const rs = result[0]; - if (rs.tokenSlug === tSlug) { + if (rs.tokenSlug === tSlug && rs.state !== APIItemState.PENDING) { hasError = false; const balance: AmountData = { value: rs.free, From af14f519f507fafbcad2eac6ffaf0afaff2fd4ae Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Wed, 9 Oct 2024 18:25:43 +0700 Subject: [PATCH 002/204] [Add] Extension - Add check balance condition --- .../src/core/logic-validation/transfer.ts | 21 +++++++++++------ .../src/core/substrate/system-pallet.ts | 2 +- .../src/koni/background/handlers/Extension.ts | 18 ++++++++++----- .../src/services/balance-service/index.ts | 23 +++++++++++++++++-- .../src/types/transaction/error.ts | 1 + 5 files changed, 49 insertions(+), 16 deletions(-) diff --git a/packages/extension-base/src/core/logic-validation/transfer.ts b/packages/extension-base/src/core/logic-validation/transfer.ts index 78ea7e4f836..f739f8337a5 100644 --- a/packages/extension-base/src/core/logic-validation/transfer.ts +++ b/packages/extension-base/src/core/logic-validation/transfer.ts @@ -6,7 +6,7 @@ import { TransactionError } from '@subwallet/extension-base/background/errors/Tr import { _Address, AmountData, ExtrinsicDataTypeMap, ExtrinsicType, FeeData } from '@subwallet/extension-base/background/KoniTypes'; import { TransactionWarning } from '@subwallet/extension-base/background/warnings/TransactionWarning'; import { LEDGER_SIGNING_COMPATIBLE_MAP, SIGNING_COMPATIBLE_MAP, XCM_MIN_AMOUNT_RATIO } from '@subwallet/extension-base/constants'; -import { _canAccountBeReaped } from '@subwallet/extension-base/core/substrate/system-pallet'; +import { _canAccountBeReaped, _isAccountActive } from '@subwallet/extension-base/core/substrate/system-pallet'; import { FrameSystemAccountInfo } from '@subwallet/extension-base/core/substrate/types'; import { isBounceableAddress } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/ton/utils'; import { _TRANSFER_CHAIN_GROUP } from '@subwallet/extension-base/services/chain-service/constants'; @@ -56,7 +56,7 @@ export function validateTransferRequest (tokenInfo: _ChainAsset, from: _Address, return [errors, keypair, transferValue]; } -export function additionalValidateTransfer (tokenInfo: _ChainAsset, nativeTokenInfo: _ChainAsset, extrinsicType: ExtrinsicType, receiverTransferTokenFreeBalance: string, transferAmount: string, senderTransferTokenTransferable?: string, receiverNativeTransferable?: string): [TransactionWarning[], TransactionError[]] { +export function additionalValidateTransfer (tokenInfo: _ChainAsset, nativeTokenInfo: _ChainAsset, extrinsicType: ExtrinsicType, receiverTransferTokenTotalBalance: string, transferAmount: string, senderTransferTokenTransferable?: string, _receiverNativeTotal?: string, isReceiverActive?: unknown): [TransactionWarning[], TransactionError[]] { const minAmount = _getTokenMinAmount(tokenInfo); const nativeMinAmount = _getTokenMinAmount(nativeTokenInfo); const warnings: TransactionWarning[] = []; @@ -72,17 +72,24 @@ export function additionalValidateTransfer (tokenInfo: _ChainAsset, nativeTokenI } // Check ed for receiver before sending - if (extrinsicType === ExtrinsicType.TRANSFER_TOKEN && receiverNativeTransferable) { - if (new BigN(receiverNativeTransferable).lt(nativeMinAmount)) { - const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, t('The recipient account has {{amount}} {{nativeSymbol}} which can lead to your {{localSymbol}} being lost. Change recipient account and try again', { replace: { amount: receiverNativeTransferable, nativeSymbol: nativeTokenInfo.symbol, localSymbol: tokenInfo.symbol } })); + if (extrinsicType === ExtrinsicType.TRANSFER_TOKEN && _receiverNativeTotal) { + if (new BigN(_receiverNativeTotal).lt(nativeMinAmount) && new BigN(nativeMinAmount).gt(0)) { + const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, t('The recipient account has {{amount}} {{nativeSymbol}} which can lead to your {{localSymbol}} being lost. Change recipient account and try again', { replace: { amount: _receiverNativeTotal, nativeSymbol: nativeTokenInfo.symbol, localSymbol: tokenInfo.symbol } })); errors.push(error); } } + // Check if receiver's account is active + if (isReceiverActive && _isAccountActive(isReceiverActive as FrameSystemAccountInfo)) { + const error = new TransactionError(TransferTxErrorType.RECEIVER_ACCOUNT_INACTIVE, t('The recipient account may be inactive. Change recipient account and try again')); + + errors.push(error); + } + // Check ed for receiver after sending - if (new BigN(receiverTransferTokenFreeBalance).plus(transferAmount).lt(minAmount)) { - const atLeast = new BigN(minAmount).minus(receiverTransferTokenFreeBalance).plus((tokenInfo.decimals || 0) === 0 ? 0 : 1); + if (new BigN(receiverTransferTokenTotalBalance).plus(transferAmount).lt(minAmount)) { + const atLeast = new BigN(minAmount).minus(receiverTransferTokenTotalBalance).plus((tokenInfo.decimals || 0) === 0 ? 0 : 1); const atLeastStr = formatNumber(atLeast, tokenInfo.decimals || 0, balanceFormatter, { maxNumberFormat: tokenInfo.decimals || 6 }); diff --git a/packages/extension-base/src/core/substrate/system-pallet.ts b/packages/extension-base/src/core/substrate/system-pallet.ts index d1b2c12e1e8..57fa499955b 100644 --- a/packages/extension-base/src/core/substrate/system-pallet.ts +++ b/packages/extension-base/src/core/substrate/system-pallet.ts @@ -24,7 +24,7 @@ export function _canAccountBeReaped (accountInfo: FrameSystemAccountInfo): boole } export function _isAccountActive (accountInfo: FrameSystemAccountInfo): boolean { - return accountInfo.providers === 0 && accountInfo.consumers === 0; + return accountInfo.consumers === 0 && accountInfo.providers === 0 && accountInfo.sufficients === 0; } export function _getSystemPalletTotalBalance (accountInfo: FrameSystemAccountInfo): bigint { diff --git a/packages/extension-base/src/koni/background/handlers/Extension.ts b/packages/extension-base/src/koni/background/handlers/Extension.ts index be6fd11e002..e4806a6632f 100644 --- a/packages/extension-base/src/koni/background/handlers/Extension.ts +++ b/packages/extension-base/src/koni/background/handlers/Extension.ts @@ -1376,22 +1376,24 @@ export default class KoniExtension { const additionalValidator = async (inputTransaction: SWTransactionResponse): Promise => { let senderTransferTokenTransferable: string | undefined; - let receiverNativeTransferable: string | undefined; + let receiverNativeTotal: string | undefined; + let isReceiverActive: unknown; // Check ed for sender if (!isTransferNativeToken) { - const [_senderTransferTokenTransferable, _receiverNativeTransferable] = await Promise.all([ + const [_senderTransferTokenTransferable, _receiverNativeTotal] = await Promise.all([ this.getAddressTransferableBalance({ address: from, networkKey, token: tokenSlug, extrinsicType }), - this.getAddressTransferableBalance({ address: to, networkKey, token: nativeTokenSlug, extrinsicType: ExtrinsicType.TRANSFER_BALANCE }) + this.getAddressTotalBalance({ address: to, networkKey, token: nativeTokenSlug, extrinsicType: ExtrinsicType.TRANSFER_BALANCE }) ]); senderTransferTokenTransferable = _senderTransferTokenTransferable.value; - receiverNativeTransferable = _receiverNativeTransferable.value; + receiverNativeTotal = _receiverNativeTotal.value; + isReceiverActive = _receiverNativeTotal.metadata; } - const { value: receiverTransferTokenTransferable } = await this.getAddressTransferableBalance({ address: to, networkKey, token: tokenSlug, extrinsicType }); // todo: shouldn't be just transferable, locked also counts + const { value: receiverTransferTokenTransferable } = await this.getAddressTotalBalance({ address: to, networkKey, token: tokenSlug, extrinsicType }); // todo: shouldn't be just transferable, locked also counts - const [warnings, errors] = additionalValidateTransfer(transferTokenInfo, nativeTokenInfo, extrinsicType, receiverTransferTokenTransferable, transferAmount.value, senderTransferTokenTransferable, receiverNativeTransferable); + const [warnings, errors] = additionalValidateTransfer(transferTokenInfo, nativeTokenInfo, extrinsicType, receiverTransferTokenTransferable, transferAmount.value, senderTransferTokenTransferable, receiverNativeTotal, isReceiverActive); warnings.length && inputTransaction.warnings.push(...warnings); errors.length && inputTransaction.errors.push(...errors); @@ -1652,6 +1654,10 @@ export default class KoniExtension { return await this.#koniState.balanceService.getTransferableBalance(address, networkKey, token, extrinsicType); } + private async getAddressTotalBalance ({ address, extrinsicType, networkKey, token }: RequestFreeBalance): Promise { + return await this.#koniState.balanceService.getTotalBalance(address, networkKey, token, extrinsicType); + } + private async getMaxTransferable ({ address, destChain, isXcmTransfer, networkKey, token }: RequestMaxTransferable): Promise { const tokenInfo = token ? this.#koniState.chainService.getAssetBySlug(token) : this.#koniState.chainService.getNativeTokenInfo(networkKey); diff --git a/packages/extension-base/src/services/balance-service/index.ts b/packages/extension-base/src/services/balance-service/index.ts index df03477d337..7e8bda4c4bf 100644 --- a/packages/extension-base/src/services/balance-service/index.ts +++ b/packages/extension-base/src/services/balance-service/index.ts @@ -17,6 +17,7 @@ import { addLazy, createPromiseHandler, isAccountAll, PromiseHandler, waitTimeou import { getKeypairTypeByAddress } from '@subwallet/keyring'; import { EthereumKeypairTypes, SubstrateKeypairTypes } from '@subwallet/keyring/types'; import keyring from '@subwallet/ui-keyring'; +import BigN from 'bignumber.js'; import { t } from 'i18next'; import { BehaviorSubject } from 'rxjs'; @@ -189,7 +190,7 @@ export class BalanceService implements StoppableServiceInterface { } /** Subscribe token free balance of an address on chain */ - public async subscribeTransferableBalance (address: string, chain: string, tokenSlug: string | undefined, extrinsicType?: ExtrinsicType, callback?: (rs: AmountData) => void): Promise<[() => void, AmountData]> { + public async subscribeBalance (address: string, chain: string, tokenSlug: string | undefined, balanceType: 'transferable' | 'total', extrinsicType?: ExtrinsicType, callback?: (rs: AmountData) => void): Promise<[() => void, AmountData]> { const chainInfo = this.state.chainService.getChainInfoByKey(chain); const chainState = this.state.chainService.getChainStateByKey(chain); @@ -218,10 +219,14 @@ export class BalanceService implements StoppableServiceInterface { unsub = subscribeBalance([address], [chain], [tSlug], assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, (result) => { const rs = result[0]; + const value = balanceType === 'total' + ? new BigN(rs.free).plus(new BigN(rs.locked)).toString() + : rs.free; + if (rs.tokenSlug === tSlug) { hasError = false; const balance: AmountData = { - value: rs.free, + value, decimals: tokenInfo.decimals || 0, symbol: tokenInfo.symbol, metadata: rs.metadata @@ -247,6 +252,14 @@ export class BalanceService implements StoppableServiceInterface { }); } + public async subscribeTransferableBalance (address: string, chain: string, tokenSlug: string | undefined, extrinsicType?: ExtrinsicType, callback?: (rs: AmountData) => void): Promise<[() => void, AmountData]> { + return this.subscribeBalance(address, chain, tokenSlug, 'transferable', extrinsicType, callback); + } + + public async subscribeTotalBalance (address: string, chain: string, tokenSlug: string | undefined, extrinsicType?: ExtrinsicType, callback?: (rs: AmountData) => void): Promise<[() => void, AmountData]> { + return this.subscribeBalance(address, chain, tokenSlug, 'total', extrinsicType, callback); + } + /** * @public * @async @@ -264,6 +277,12 @@ export class BalanceService implements StoppableServiceInterface { return balance; } + public async getTotalBalance (address: string, chain: string, tokenSlug?: string, extrinsicType?: ExtrinsicType): Promise { + const [, balance] = await this.subscribeTotalBalance(address, chain, tokenSlug, extrinsicType); + + return balance; + } + /** Remove balance from the subject object by addresses */ public removeBalanceByAddresses (addresses: string[]) { this.balanceMap.removeBalanceItems([...addresses, ALL_ACCOUNT_KEY]); diff --git a/packages/extension-base/src/types/transaction/error.ts b/packages/extension-base/src/types/transaction/error.ts index a0c00d6101c..d86b8f17946 100644 --- a/packages/extension-base/src/types/transaction/error.ts +++ b/packages/extension-base/src/types/transaction/error.ts @@ -42,6 +42,7 @@ export enum TransferTxErrorType { INVALID_TOKEN = 'INVALID_TOKEN', TRANSFER_ERROR = 'TRANSFER_ERROR', RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT = 'RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT', + RECEIVER_ACCOUNT_INACTIVE = 'RECEIVER_ACCOUNT_INACTIVE' } export type TransactionErrorType = BasicTxErrorType | TransferTxErrorType | StakingTxErrorType | YieldValidationStatus | SwapErrorType; From 113620859afc2ecaf4835739f84d029f2ffeb29c Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Sat, 12 Oct 2024 17:09:08 +0700 Subject: [PATCH 003/204] [Add] - Support Rari NFT --- package.json | 2 +- packages/extension-base/package.json | 2 +- .../extension-base/src/koni/api/nft/index.ts | 11 ++ .../src/koni/api/nft/rari/index.ts | 128 ++++++++++++++++++ .../src/services/chain-service/constants.ts | 3 +- packages/extension-koni-ui/package.json | 2 +- packages/extension-web-ui/package.json | 2 +- yarn.lock | 14 +- 8 files changed, 152 insertions(+), 12 deletions(-) create mode 100644 packages/extension-base/src/koni/api/nft/rari/index.ts diff --git a/package.json b/package.json index f84f74a6052..ff48f5439c7 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@polkadot/types-support": "^12.0.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/chain-list": "0.2.88-beta.6", + "@subwallet/chain-list": "0.2.89-beta.8", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b79", "@subwallet/ui-keyring": "0.1.8-beta.0 ", diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index 1342385d77f..eba378c8525 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -55,7 +55,7 @@ "@reduxjs/toolkit": "^1.9.1", "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", - "@subwallet/chain-list": "0.2.88-beta.6", + "@subwallet/chain-list": "0.2.89-beta.8", "@subwallet/extension-base": "^1.2.32-0", "@subwallet/extension-chains": "^1.2.32-0", "@subwallet/extension-dapp": "^1.2.32-0", diff --git a/packages/extension-base/src/koni/api/nft/index.ts b/packages/extension-base/src/koni/api/nft/index.ts index a7bb62f39e5..f3337406c3b 100644 --- a/packages/extension-base/src/koni/api/nft/index.ts +++ b/packages/extension-base/src/koni/api/nft/index.ts @@ -22,6 +22,7 @@ import { _isChainSupportEvmNft, _isChainSupportNativeNft, _isChainSupportWasmNft import { categoryAddresses, targetIsWeb } from '@subwallet/extension-base/utils'; import AssetHubNftsPalletApi from './assethub_nft'; +import { RariNftApi } from './rari'; import { TernoaNftApi } from './ternoa_nft'; function createSubstrateNftApi (chain: string, substrateApi: _SubstrateApi | null, addresses: string[]): BaseNftApi[] | null { @@ -49,6 +50,8 @@ function createSubstrateNftApi (chain: string, substrateApi: _SubstrateApi | nul return [new BlobInscriptionApi(chain, substrateAddresses)]; } else if (_NFT_CHAIN_GROUP.ternoa.includes(chain)) { return [new TernoaNftApi(substrateApi, substrateAddresses, chain)]; + } else if (_NFT_CHAIN_GROUP.rari.includes(chain)) { + return [new RariNftApi(chain, evmAddresses)]; } return null; @@ -165,6 +168,14 @@ export class NftHandler { } } + if (chain === 'rari') { + const handlers = createSubstrateNftApi(chain, null, evmAddresses); + + if (handlers && !!handlers.length) { + this.handlers.push(...handlers); + } + } + if (chain === 'ternoa') { const handlers = createSubstrateNftApi(chain, this.substrateApiMap[chain], substrateAddresses); diff --git a/packages/extension-base/src/koni/api/nft/rari/index.ts b/packages/extension-base/src/koni/api/nft/rari/index.ts new file mode 100644 index 00000000000..4e3cb843a15 --- /dev/null +++ b/packages/extension-base/src/koni/api/nft/rari/index.ts @@ -0,0 +1,128 @@ +// Copyright 2019-2022 @subwallet/extension-koni authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import { NftCollection, NftItem } from '@subwallet/extension-base/background/KoniTypes'; + +import { BaseNftApi, HandleNftParams } from '../nft'; + +const options = { + method: 'GET', + headers: { + accept: 'application/json', + 'X-API-KEY': 'ed9df6bf-7eba-4ca2-8a42-9006706be064' + } +}; + +interface NftResponse { + items: ItemData[]; +} + +interface ItemData { + collection: string; + id: string; + meta: MetaData; + tokenId: string; + itemCollection: CollectionData; +} + +interface MetaData { + content: Content[]; + description?: string; + name: string; +} + +interface Content { + url: string; +} + +interface CollectionData { + name: string +} + +export class RariNftApi extends BaseNftApi { + constructor (chain: string, addresses: string[]) { + super(chain, undefined, addresses); + } + + private wait (ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)); + } + + public async handleNfts (params: HandleNftParams): Promise { + const collectionMap = new Map(); + const size = 4; + const waitTime = 1000; + + for (let i = 0; i < this.addresses.length; i += size) { + const group = this.addresses.slice(i, i + size); + + await Promise.all(group.map(async (address) => { + const nftResponse = await fetch( + `https://api.rarible.org/v0.1/items/byOwner?blockchains=RARI&owner=ETHEREUM%3A${address}&size=5000`, + options + ) + .then((response) => response.json()) + .catch((err) => { + console.error(err); + + return null; + }) as NftResponse; + + if (!nftResponse || !nftResponse.items) { + return; + } + + const nftItems = nftResponse.items; + + // eslint-disable-next-line @typescript-eslint/require-await + await Promise.all(nftItems.map(async (nft) => { + const collectionId = nft.collection; + const collectionName = nft.itemCollection.name; + const NftMetadata = nft.meta; + const NFTimageUrl = NftMetadata.content[0]?.url || ''; + + const parsedNft = { + id: nft.tokenId, + name: NftMetadata.name, + description: NftMetadata.description || '', + image: NFTimageUrl, + collectionId: nft.collection, + chain: this.chain, + owner: address + } as NftItem; + + params.updateItem(this.chain, parsedNft, address); + + if (!collectionMap.has(collectionId)) { + collectionMap.set(collectionId, collectionName); + } + })); + })); + + if (i + size < this.addresses.length) { + await this.wait(waitTime); + } + } + + for (const [collectionId, collectionName] of collectionMap.entries()) { + const parsedCollection = { + collectionId, + chain: this.chain, + collectionName, + image: '' + } as NftCollection; + + params.updateCollection(this.chain, parsedCollection); + } + } + + public async fetchNfts (params: HandleNftParams): Promise { + try { + await this.handleNfts(params); + } catch (e) { + return 0; + } + + return 1; + } +} diff --git a/packages/extension-base/src/services/chain-service/constants.ts b/packages/extension-base/src/services/chain-service/constants.ts index 41e7a66e718..04b580d5365 100644 --- a/packages/extension-base/src/services/chain-service/constants.ts +++ b/packages/extension-base/src/services/chain-service/constants.ts @@ -56,7 +56,8 @@ export const _NFT_CHAIN_GROUP = { bitcountry: ['bitcountry', 'pioneer', 'continuum_network'], vara: ['vara_network'], avail: ['avail_mainnet'], - ternoa: ['ternoa', 'ternoa_alphanet'] + ternoa: ['ternoa', 'ternoa_alphanet'], + rari: ['rari'] }; // Staking-------------------------------------------------------------------------------------------------------------- diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index dcfba2bf268..61e33a2d62f 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -34,7 +34,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.88-beta.6", + "@subwallet/chain-list": "0.2.89-beta.8", "@subwallet/extension-base": "^1.2.32-0", "@subwallet/extension-chains": "^1.2.32-0", "@subwallet/extension-dapp": "^1.2.32-0", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index 9c47b4b8361..b6c6ba927e1 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -35,7 +35,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.88-beta.6", + "@subwallet/chain-list": "0.2.89-beta.8", "@subwallet/extension-base": "^1.2.32-0", "@subwallet/extension-chains": "^1.2.32-0", "@subwallet/extension-dapp": "^1.2.32-0", diff --git a/yarn.lock b/yarn.lock index 51b7b64c8b1..70768980706 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6265,14 +6265,14 @@ __metadata: languageName: node linkType: hard -"@subwallet/chain-list@npm:0.2.88-beta.6": - version: 0.2.88-beta.6 - resolution: "@subwallet/chain-list@npm:0.2.88-beta.6" +"@subwallet/chain-list@npm:0.2.89-beta.8": + version: 0.2.89-beta.8 + resolution: "@subwallet/chain-list@npm:0.2.89-beta.8" dependencies: "@polkadot/dev": 0.67.167 "@polkadot/util": ^12.5.1 eventemitter3: ^5.0.1 - checksum: 2d2db1dd398a1d373e8eb663d16e1c878033c9cc97042e3a0ade81da522b91f269bc192f6b538617ecbf8c17c3b5113ead446620108a7b9357b5a981c4ef7f3d + checksum: d98b5c01b5a2b04473a7777fd06f8552cdf6c32ea7abb148809b1a70b68206390d9d0d647c466555cf65fe35f838d34253e95772434db1d63aef2c2e1baaa67c languageName: node linkType: hard @@ -6315,7 +6315,7 @@ __metadata: "@reduxjs/toolkit": ^1.9.1 "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 - "@subwallet/chain-list": 0.2.88-beta.6 + "@subwallet/chain-list": 0.2.89-beta.8 "@subwallet/extension-base": ^1.2.32-0 "@subwallet/extension-chains": ^1.2.32-0 "@subwallet/extension-dapp": ^1.2.32-0 @@ -6453,7 +6453,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.88-beta.6 + "@subwallet/chain-list": 0.2.89-beta.8 "@subwallet/extension-base": ^1.2.32-0 "@subwallet/extension-chains": ^1.2.32-0 "@subwallet/extension-dapp": ^1.2.32-0 @@ -6593,7 +6593,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.88-beta.6 + "@subwallet/chain-list": 0.2.89-beta.8 "@subwallet/extension-base": ^1.2.32-0 "@subwallet/extension-chains": ^1.2.32-0 "@subwallet/extension-dapp": ^1.2.32-0 From 3e0d3e301cecae1fbb02ebc292b0abd888091ac2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 16 Oct 2024 08:46:54 +0000 Subject: [PATCH 004/204] [CI Skip] release/beta 1.3.3-0 skip-checks: true --- CONTRIBUTORS | 12 ++-- package.json | 2 +- packages/extension-base/package.json | 12 ++-- packages/extension-base/src/packageInfo.ts | 2 +- packages/extension-chains/package.json | 4 +- packages/extension-chains/src/packageInfo.ts | 2 +- .../extension-compat-metamask/package.json | 4 +- .../src/packageInfo.ts | 2 +- packages/extension-dapp/package.json | 4 +- packages/extension-dapp/src/packageInfo.ts | 2 +- packages/extension-inject/package.json | 2 +- packages/extension-inject/src/packageInfo.ts | 2 +- packages/extension-koni-ui/package.json | 12 ++-- packages/extension-koni/package.json | 8 +-- packages/extension-koni/src/packageInfo.ts | 2 +- packages/extension-mocks/package.json | 2 +- packages/extension-web-ui/package.json | 12 ++-- packages/web-runner/package.json | 8 +-- packages/webapp/package.json | 8 +-- yarn.lock | 68 +++++++++---------- 20 files changed, 85 insertions(+), 85 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index db52dbeef7c..8640cd0350c 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,13 +1,13 @@ - 2858 AnhMTV Release version 1.3.2 - 2545 Nam Phạm [Issue 3609] chore: fix eslint - 2343 S2kael [Issue-3634] Fix swap error + 2864 AnhMTV + 2546 Nam Phạm [Issue 3747] chore: fix eslint + 2344 S2kael [Issue-3794] Update stable version for chain-list 869 lw-cdm [MasterAccount] Update logic to reorder account on select account modal 568 nguyentiendung [Issue-3553] [Issue-3553] Refactor code and add recipient to swap history. 465 Jaco 0.42.5 (#969) 393 bluezdot [Issue-3760] fix: fix chainlist 354 Thiendekaco [Issue-3707] [fix] Unified account - fix dApp ui bug #4 185 quangdo - 178 dominhquang [Issue-3756] Improve UI related to Select token screen + 179 dominhquang [Issue-3732] Fix bug do not show watch-only account on History (All account mode) 172 Frenkie Nguyen [Issue-3696] Update UI for derivation 170 lw-cdm 160 Automation Bot [CI Skip] Auto increase webapp build number @@ -19,9 +19,9 @@ 73 bluedot [Issue-3579] fix: update check fully migrate 63 Roman fix ui issues 53 Dominhquangdev update Bridge code - 37 PDTnhah + 40 PDTnhah [Issue-3747] Extension - Update Network details screen for TON + 26 tunghp2002 [Fix] - Handle kodadot NFT 25 S2kael - 20 tunghp2002 [Add] Extension - Add type notification 10 Trang Trịnh api get karura and acala nfts 9 Minh Le 9 minhld1029 [#115] [ForgetAccount] catch exception refList undefined diff --git a/package.json b/package.json index f77f7c15674..d7d989b17fd 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "url": "https://github.com/Koniverse/Subwallet-V2.git" }, "sideEffects": false, - "version": "1.3.2", + "version": "1.3.3-0", "workspaces": [ "packages/*" ], diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index 1ee0b3003ac..06d85678291 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -17,7 +17,7 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.2-0", + "version": "1.3.3-0", "main": "index.js", "dependencies": { "@acala-network/api": "^5.0.2", @@ -56,10 +56,10 @@ "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", "@subwallet/chain-list": "0.2.90", - "@subwallet/extension-base": "^1.3.2-0", - "@subwallet/extension-chains": "^1.3.2-0", - "@subwallet/extension-dapp": "^1.3.2-0", - "@subwallet/extension-inject": "^1.3.2-0", + "@subwallet/extension-base": "^1.3.3-0", + "@subwallet/extension-chains": "^1.3.3-0", + "@subwallet/extension-dapp": "^1.3.3-0", + "@subwallet/extension-inject": "^1.3.3-0", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/ui-keyring": "^0.1.8-beta.0", "@ton/core": "^0.56.3", @@ -104,7 +104,7 @@ "web3-utils": "^1.10.0" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.3.2-0", + "@subwallet/extension-mocks": "^1.3.3-0", "@types/uuid": "^9.0.1" } } diff --git a/packages/extension-base/src/packageInfo.ts b/packages/extension-base/src/packageInfo.ts index e4a9d9cdbe1..af63c3cb857 100644 --- a/packages/extension-base/src/packageInfo.ts +++ b/packages/extension-base/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-base', path: 'auto', type: 'auto', version: '1.3.2-0' }; +export const packageInfo = { name: '@subwallet/extension-base', path: 'auto', type: 'auto', version: '1.3.3-0' }; diff --git a/packages/extension-chains/package.json b/packages/extension-chains/package.json index 2910e39a824..a609dca12f6 100644 --- a/packages/extension-chains/package.json +++ b/packages/extension-chains/package.json @@ -17,14 +17,14 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.2-0", + "version": "1.3.3-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@polkadot/networks": "^12.6.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/extension-inject": "^1.3.2-0" + "@subwallet/extension-inject": "^1.3.3-0" }, "peerDependencies": { "@polkadot/api": "*", diff --git a/packages/extension-chains/src/packageInfo.ts b/packages/extension-chains/src/packageInfo.ts index aff7880053c..78ce779280c 100644 --- a/packages/extension-chains/src/packageInfo.ts +++ b/packages/extension-chains/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-chains', path: 'auto', type: 'auto', version: '1.3.2-0' }; +export const packageInfo = { name: '@subwallet/extension-chains', path: 'auto', type: 'auto', version: '1.3.3-0' }; diff --git a/packages/extension-compat-metamask/package.json b/packages/extension-compat-metamask/package.json index f9d7880e894..280a9319c3b 100644 --- a/packages/extension-compat-metamask/package.json +++ b/packages/extension-compat-metamask/package.json @@ -17,14 +17,14 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.2-0", + "version": "1.3.3-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@metamask/detect-provider": "^1.2.0", "@polkadot/types": "^11.0.3", "@polkadot/util": "^12.6.2", - "@subwallet/extension-inject": "^1.3.2-0", + "@subwallet/extension-inject": "^1.3.3-0", "web3": "^1.10.0" }, "peerDependencies": { diff --git a/packages/extension-compat-metamask/src/packageInfo.ts b/packages/extension-compat-metamask/src/packageInfo.ts index 1b68deb4eb4..26146a5ecac 100644 --- a/packages/extension-compat-metamask/src/packageInfo.ts +++ b/packages/extension-compat-metamask/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-compat-metamask', path: 'auto', type: 'auto', version: '1.3.2-0' }; +export const packageInfo = { name: '@subwallet/extension-compat-metamask', path: 'auto', type: 'auto', version: '1.3.3-0' }; diff --git a/packages/extension-dapp/package.json b/packages/extension-dapp/package.json index 5c7139affa2..04b3d4acad5 100644 --- a/packages/extension-dapp/package.json +++ b/packages/extension-dapp/package.json @@ -17,13 +17,13 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.2-0", + "version": "1.3.3-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/extension-inject": "^1.3.2-0" + "@subwallet/extension-inject": "^1.3.3-0" }, "peerDependencies": { "@polkadot/api": "*", diff --git a/packages/extension-dapp/src/packageInfo.ts b/packages/extension-dapp/src/packageInfo.ts index af4d256b593..2a4604b5590 100644 --- a/packages/extension-dapp/src/packageInfo.ts +++ b/packages/extension-dapp/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-dapp', path: 'auto', type: 'auto', version: '1.3.2-0' }; +export const packageInfo = { name: '@subwallet/extension-dapp', path: 'auto', type: 'auto', version: '1.3.3-0' }; diff --git a/packages/extension-inject/package.json b/packages/extension-inject/package.json index b6c1911c8ec..dc4efcadac5 100644 --- a/packages/extension-inject/package.json +++ b/packages/extension-inject/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.3.2-0", + "version": "1.3.3-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", diff --git a/packages/extension-inject/src/packageInfo.ts b/packages/extension-inject/src/packageInfo.ts index 5a2401d913b..07824c0fd3a 100644 --- a/packages/extension-inject/src/packageInfo.ts +++ b/packages/extension-inject/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-inject', path: 'auto', type: 'auto', version: '1.3.2-0' }; +export const packageInfo = { name: '@subwallet/extension-inject', path: 'auto', type: 'auto', version: '1.3.3-0' }; diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index 04f3cc1f5ed..c9e2d335f33 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.3.2-0", + "version": "1.3.3-0", "dependencies": { "@babel/runtime": "^7.20.6", "@coinbase/cbpay-js": "^1.7.0", @@ -35,10 +35,10 @@ "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", "@subwallet/chain-list": "0.2.90", - "@subwallet/extension-base": "^1.3.2-0", - "@subwallet/extension-chains": "^1.3.2-0", - "@subwallet/extension-dapp": "^1.3.2-0", - "@subwallet/extension-inject": "^1.3.2-0", + "@subwallet/extension-base": "^1.3.3-0", + "@subwallet/extension-chains": "^1.3.3-0", + "@subwallet/extension-dapp": "^1.3.3-0", + "@subwallet/extension-inject": "^1.3.3-0", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b77", "@subwallet/ui-keyring": "^0.1.8-beta.0", @@ -87,7 +87,7 @@ "usehooks-ts": "^2.9.1" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.3.2-0", + "@subwallet/extension-mocks": "^1.3.3-0", "@types/bn.js": "^5.1.1", "@types/enzyme": "^3.10.12", "@types/enzyme-adapter-react-16": "^1.0.6", diff --git a/packages/extension-koni/package.json b/packages/extension-koni/package.json index 3a6c7e4a5d8..37797fab271 100644 --- a/packages/extension-koni/package.json +++ b/packages/extension-koni/package.json @@ -14,12 +14,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.2-0", + "version": "1.3.3-0", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.3.2-0", - "@subwallet/extension-inject": "^1.3.2-0", - "@subwallet/extension-koni-ui": "^1.3.2-0" + "@subwallet/extension-base": "^1.3.3-0", + "@subwallet/extension-inject": "^1.3.3-0", + "@subwallet/extension-koni-ui": "^1.3.3-0" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/packages/extension-koni/src/packageInfo.ts b/packages/extension-koni/src/packageInfo.ts index f8f4c5802ce..49a4841063b 100644 --- a/packages/extension-koni/src/packageInfo.ts +++ b/packages/extension-koni/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-koni', path: 'auto', type: 'auto', version: '1.3.2-0' }; +export const packageInfo = { name: '@subwallet/extension-koni', path: 'auto', type: 'auto', version: '1.3.3-0' }; diff --git a/packages/extension-mocks/package.json b/packages/extension-mocks/package.json index fe6aca581dc..df5110ce66b 100644 --- a/packages/extension-mocks/package.json +++ b/packages/extension-mocks/package.json @@ -14,7 +14,7 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.2-0", + "version": "1.3.3-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index 1d2ee10bbc5..713f626d5fa 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.3.2-0", + "version": "1.3.3-0", "dependencies": { "@babel/runtime": "^7.20.6", "@coinbase/cbpay-js": "^1.7.0", @@ -36,10 +36,10 @@ "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", "@subwallet/chain-list": "0.2.90", - "@subwallet/extension-base": "^1.3.2-0", - "@subwallet/extension-chains": "^1.3.2-0", - "@subwallet/extension-dapp": "^1.3.2-0", - "@subwallet/extension-inject": "^1.3.2-0", + "@subwallet/extension-base": "^1.3.3-0", + "@subwallet/extension-chains": "^1.3.3-0", + "@subwallet/extension-dapp": "^1.3.3-0", + "@subwallet/extension-inject": "^1.3.3-0", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "^5.1.2-b77", "@subwallet/ui-keyring": "^0.1.8-beta.0", @@ -88,7 +88,7 @@ "usehooks-ts": "^2.9.1" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.3.2-0", + "@subwallet/extension-mocks": "^1.3.3-0", "@types/bn.js": "^5.1.1", "@types/enzyme": "^3.10.12", "@types/enzyme-adapter-react-16": "^1.0.6", diff --git a/packages/web-runner/package.json b/packages/web-runner/package.json index 8988092fd62..124f476ec2b 100644 --- a/packages/web-runner/package.json +++ b/packages/web-runner/package.json @@ -14,12 +14,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.2-0", + "version": "1.3.3-0", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.3.2-0", - "@subwallet/extension-inject": "^1.3.2-0", - "@subwallet/extension-koni-ui": "^1.3.2-0" + "@subwallet/extension-base": "^1.3.3-0", + "@subwallet/extension-inject": "^1.3.3-0", + "@subwallet/extension-koni-ui": "^1.3.3-0" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/packages/webapp/package.json b/packages/webapp/package.json index 8072b451859..f4adf170e3e 100644 --- a/packages/webapp/package.json +++ b/packages/webapp/package.json @@ -15,12 +15,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.2-0", + "version": "1.3.3-0", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.3.2-0", - "@subwallet/extension-inject": "^1.3.2-0", - "@subwallet/extension-web-ui": "^1.3.2-0" + "@subwallet/extension-base": "^1.3.3-0", + "@subwallet/extension-inject": "^1.3.3-0", + "@subwallet/extension-web-ui": "^1.3.3-0" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/yarn.lock b/yarn.lock index 0f42accc16e..c9fc4c6a3c3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6276,7 +6276,7 @@ __metadata: languageName: node linkType: hard -"@subwallet/extension-base@^1.3.2-0, @subwallet/extension-base@workspace:packages/extension-base": +"@subwallet/extension-base@^1.3.3-0, @subwallet/extension-base@workspace:packages/extension-base": version: 0.0.0-use.local resolution: "@subwallet/extension-base@workspace:packages/extension-base" dependencies: @@ -6316,11 +6316,11 @@ __metadata: "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 "@subwallet/chain-list": 0.2.90 - "@subwallet/extension-base": ^1.3.2-0 - "@subwallet/extension-chains": ^1.3.2-0 - "@subwallet/extension-dapp": ^1.3.2-0 - "@subwallet/extension-inject": ^1.3.2-0 - "@subwallet/extension-mocks": ^1.3.2-0 + "@subwallet/extension-base": ^1.3.3-0 + "@subwallet/extension-chains": ^1.3.3-0 + "@subwallet/extension-dapp": ^1.3.3-0 + "@subwallet/extension-inject": ^1.3.3-0 + "@subwallet/extension-mocks": ^1.3.3-0 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/ui-keyring": ^0.1.8-beta.0 "@ton/core": ^0.56.3 @@ -6367,7 +6367,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-chains@^1.3.2-0, @subwallet/extension-chains@workspace:packages/extension-chains": +"@subwallet/extension-chains@^1.3.3-0, @subwallet/extension-chains@workspace:packages/extension-chains": version: 0.0.0-use.local resolution: "@subwallet/extension-chains@workspace:packages/extension-chains" dependencies: @@ -6375,7 +6375,7 @@ __metadata: "@polkadot/networks": ^12.6.2 "@polkadot/util": ^12.6.2 "@polkadot/util-crypto": ^12.6.2 - "@subwallet/extension-inject": ^1.3.2-0 + "@subwallet/extension-inject": ^1.3.3-0 peerDependencies: "@polkadot/api": "*" "@polkadot/types": "*" @@ -6390,21 +6390,21 @@ __metadata: "@metamask/detect-provider": ^1.2.0 "@polkadot/types": ^11.0.3 "@polkadot/util": ^12.6.2 - "@subwallet/extension-inject": ^1.3.2-0 + "@subwallet/extension-inject": ^1.3.3-0 web3: ^1.10.0 peerDependencies: "@polkadot/util": "*" languageName: unknown linkType: soft -"@subwallet/extension-dapp@^1.3.2-0, @subwallet/extension-dapp@workspace:packages/extension-dapp": +"@subwallet/extension-dapp@^1.3.3-0, @subwallet/extension-dapp@workspace:packages/extension-dapp": version: 0.0.0-use.local resolution: "@subwallet/extension-dapp@workspace:packages/extension-dapp" dependencies: "@babel/runtime": ^7.20.6 "@polkadot/util": ^12.6.2 "@polkadot/util-crypto": ^12.6.2 - "@subwallet/extension-inject": ^1.3.2-0 + "@subwallet/extension-inject": ^1.3.3-0 peerDependencies: "@polkadot/api": "*" "@polkadot/util": "*" @@ -6412,7 +6412,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-inject@^1.3.2-0, @subwallet/extension-inject@workspace:packages/extension-inject": +"@subwallet/extension-inject@^1.3.3-0, @subwallet/extension-inject@workspace:packages/extension-inject": version: 0.0.0-use.local resolution: "@subwallet/extension-inject@workspace:packages/extension-inject" dependencies: @@ -6431,7 +6431,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-koni-ui@^1.3.2-0, @subwallet/extension-koni-ui@workspace:packages/extension-koni-ui": +"@subwallet/extension-koni-ui@^1.3.3-0, @subwallet/extension-koni-ui@workspace:packages/extension-koni-ui": version: 0.0.0-use.local resolution: "@subwallet/extension-koni-ui@workspace:packages/extension-koni-ui" dependencies: @@ -6454,11 +6454,11 @@ __metadata: "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 "@subwallet/chain-list": 0.2.90 - "@subwallet/extension-base": ^1.3.2-0 - "@subwallet/extension-chains": ^1.3.2-0 - "@subwallet/extension-dapp": ^1.3.2-0 - "@subwallet/extension-inject": ^1.3.2-0 - "@subwallet/extension-mocks": ^1.3.2-0 + "@subwallet/extension-base": ^1.3.3-0 + "@subwallet/extension-chains": ^1.3.3-0 + "@subwallet/extension-dapp": ^1.3.3-0 + "@subwallet/extension-inject": ^1.3.3-0 + "@subwallet/extension-mocks": ^1.3.3-0 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/react-ui": 5.1.2-b77 "@subwallet/ui-keyring": ^0.1.8-beta.0 @@ -6531,9 +6531,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.2-0 - "@subwallet/extension-inject": ^1.3.2-0 - "@subwallet/extension-koni-ui": ^1.3.2-0 + "@subwallet/extension-base": ^1.3.3-0 + "@subwallet/extension-inject": ^1.3.3-0 + "@subwallet/extension-koni-ui": ^1.3.3-0 "@types/chrome": ^0.0.254 "@types/serviceworker": ^0.0.80 assert: ^2.0.0 @@ -6561,7 +6561,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-mocks@^1.3.2-0, @subwallet/extension-mocks@workspace:packages/extension-mocks": +"@subwallet/extension-mocks@^1.3.3-0, @subwallet/extension-mocks@workspace:packages/extension-mocks": version: 0.0.0-use.local resolution: "@subwallet/extension-mocks@workspace:packages/extension-mocks" dependencies: @@ -6570,7 +6570,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-web-ui@^1.3.2-0, @subwallet/extension-web-ui@workspace:packages/extension-web-ui": +"@subwallet/extension-web-ui@^1.3.3-0, @subwallet/extension-web-ui@workspace:packages/extension-web-ui": version: 0.0.0-use.local resolution: "@subwallet/extension-web-ui@workspace:packages/extension-web-ui" dependencies: @@ -6594,11 +6594,11 @@ __metadata: "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 "@subwallet/chain-list": 0.2.90 - "@subwallet/extension-base": ^1.3.2-0 - "@subwallet/extension-chains": ^1.3.2-0 - "@subwallet/extension-dapp": ^1.3.2-0 - "@subwallet/extension-inject": ^1.3.2-0 - "@subwallet/extension-mocks": ^1.3.2-0 + "@subwallet/extension-base": ^1.3.3-0 + "@subwallet/extension-chains": ^1.3.3-0 + "@subwallet/extension-dapp": ^1.3.3-0 + "@subwallet/extension-inject": ^1.3.3-0 + "@subwallet/extension-mocks": ^1.3.3-0 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/react-ui": ^5.1.2-b77 "@subwallet/ui-keyring": ^0.1.8-beta.0 @@ -6790,9 +6790,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.2-0 - "@subwallet/extension-inject": ^1.3.2-0 - "@subwallet/extension-koni-ui": ^1.3.2-0 + "@subwallet/extension-base": ^1.3.3-0 + "@subwallet/extension-inject": ^1.3.3-0 + "@subwallet/extension-koni-ui": ^1.3.3-0 assert: ^2.0.0 babel-loader: ^9.1.3 browser-resolve: ^2.0.0 @@ -6823,9 +6823,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.2-0 - "@subwallet/extension-inject": ^1.3.2-0 - "@subwallet/extension-web-ui": ^1.3.2-0 + "@subwallet/extension-base": ^1.3.3-0 + "@subwallet/extension-inject": ^1.3.3-0 + "@subwallet/extension-web-ui": ^1.3.3-0 assert: ^2.0.0 babel-loader: ^9.1.3 browser-resolve: ^2.0.0 From 744f95d3f2d9cdb91b1fcfd5a86c4839ad708c29 Mon Sep 17 00:00:00 2001 From: AnhMTV Date: Wed, 16 Oct 2024 18:14:36 +0700 Subject: [PATCH 005/204] Release version 1.3.3 --- CHANGELOG.md | 15 +++++++++++++++ package.json | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c20e45d953..632faa528ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # CHANGELOG +## 1.3.3 +Build date: Oct 16, 2024. + +Features & Update: +- Fix bug Do not show watch-only account on History (#3732) +- Update Network details screen for TON (#3747) +- Update chain-list + - Update logo for MATIC token + - Remove Tinkernet + +Bugs fixed: +- Fix min stake for TAO(Bittensor) (#3788) +- Fix bug show OG WUD BURN NFT Collection (#3791) + + ## 1.3.2 Build date: Oct 12, 2024. diff --git a/package.json b/package.json index d7d989b17fd..0d97ac6cf79 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "url": "https://github.com/Koniverse/Subwallet-V2.git" }, "sideEffects": false, - "version": "1.3.3-0", + "version": "1.3.3", "workspaces": [ "packages/*" ], From 947cf51896254d173bfe7399eef105032f88fb22 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 16 Oct 2024 11:25:30 +0000 Subject: [PATCH 006/204] [CI Skip] release/stable 1.3.3 skip-checks: true --- .123trigger | 3 ++- CONTRIBUTORS | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.123trigger b/.123trigger index 70c871cc3bf..0d8d675c206 100644 --- a/.123trigger +++ b/.123trigger @@ -167,4 +167,5 @@ 1.2.30 1.2.31 1.2.32 -1.3.2 \ No newline at end of file +1.3.2 +1.3.3 \ No newline at end of file diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 8640cd0350c..a375e65b890 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,4 +1,4 @@ - 2864 AnhMTV + 2865 AnhMTV Release version 1.3.3 2546 Nam Phạm [Issue 3747] chore: fix eslint 2344 S2kael [Issue-3794] Update stable version for chain-list 869 lw-cdm [MasterAccount] Update logic to reorder account on select account modal From a2a3ced286ce6b3a17891e59a9a401953a0a1019 Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Thu, 17 Oct 2024 17:36:02 +0700 Subject: [PATCH 007/204] [Update] Migrate STAKING_JOIN_POOL --- .../extension-base/src/background/KoniTypes.ts | 2 +- .../src/koni/api/yield/helper/utils.ts | 2 +- .../handlers/nomination-pool/index.ts | 16 +++++++--------- .../Confirmations/variants/Transaction/index.tsx | 2 +- .../variants/Transaction/variants/JoinPool.tsx | 15 ++++++++------- .../src/messaging/transaction/staking.ts | 6 +++--- 6 files changed, 21 insertions(+), 22 deletions(-) diff --git a/packages/extension-base/src/background/KoniTypes.ts b/packages/extension-base/src/background/KoniTypes.ts index 890205b5de4..fe4e77d3cce 100644 --- a/packages/extension-base/src/background/KoniTypes.ts +++ b/packages/extension-base/src/background/KoniTypes.ts @@ -1887,7 +1887,7 @@ export interface KoniRequestSignatures { 'pri(bonding.subscribeNominatorMetadata)': [null, NominatorMetadata[], NominatorMetadata[]]; 'pri(bonding.getBondingOptions)': [BondingOptionParams, ValidatorInfo[]]; 'pri(bonding.getNominationPoolOptions)': [string, NominationPoolInfo[]]; - 'pri(bonding.nominationPool.submitBonding)': [RequestStakePoolingBonding, SWTransactionResponse]; + 'pri(bonding.nominationPool.submitBonding)': [RequestYieldStepSubmit, SWTransactionResponse]; 'pri(bonding.nominationPool.submitUnbonding)': [RequestStakePoolingUnbonding, SWTransactionResponse]; // Chains, assets functions diff --git a/packages/extension-base/src/koni/api/yield/helper/utils.ts b/packages/extension-base/src/koni/api/yield/helper/utils.ts index 52120f110d7..f08513fd46c 100644 --- a/packages/extension-base/src/koni/api/yield/helper/utils.ts +++ b/packages/extension-base/src/koni/api/yield/helper/utils.ts @@ -19,7 +19,7 @@ export const YIELD_EXTRINSIC_TYPES = [ ExtrinsicType.REDEEM_VDOT, ExtrinsicType.REDEEM_LDOT, ExtrinsicType.REDEEM_STDOT, - ExtrinsicType.STAKING_JOIN_POOL, + ExtrinsicType.JOIN_YIELD_POOL, ExtrinsicType.STAKING_CLAIM_REWARD, ExtrinsicType.STAKING_LEAVE_POOL, ExtrinsicType.STAKING_POOL_WITHDRAW diff --git a/packages/extension-base/src/services/earning-service/handlers/nomination-pool/index.ts b/packages/extension-base/src/services/earning-service/handlers/nomination-pool/index.ts index 096606c1f1f..156eeaa72c7 100644 --- a/packages/extension-base/src/services/earning-service/handlers/nomination-pool/index.ts +++ b/packages/extension-base/src/services/earning-service/handlers/nomination-pool/index.ts @@ -9,7 +9,7 @@ import KoniState from '@subwallet/extension-base/koni/background/handlers/State' import { _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants'; import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types'; import { _getChainSubstrateAddressPrefix } from '@subwallet/extension-base/services/chain-service/utils'; -import { BaseYieldPositionInfo, BasicTxErrorType, EarningRewardHistoryItem, EarningRewardItem, EarningStatus, HandleYieldStepData, NominationPoolInfo, NominationYieldPoolInfo, OptimalYieldPath, OptimalYieldPathParams, PalletNominationPoolsBondedPoolInner, PalletStakingActiveEraInfo, PalletStakingExposure, PalletStakingExposureItem, PalletStakingNominations, RequestStakePoolingBonding, SpStakingExposurePage, StakeCancelWithdrawalParams, StakingTxErrorType, SubmitJoinNominationPool, SubmitYieldJoinData, TransactionData, UnstakingStatus, YieldPoolInfo, YieldPoolMethodInfo, YieldPoolType, YieldPositionInfo, YieldStepBaseInfo, YieldStepType, YieldTokenBaseInfo } from '@subwallet/extension-base/types'; +import { BaseYieldPositionInfo, BasicTxErrorType, EarningRewardHistoryItem, EarningRewardItem, EarningStatus, HandleYieldStepData, NominationPoolInfo, NominationYieldPoolInfo, OptimalYieldPath, OptimalYieldPathParams, PalletNominationPoolsBondedPoolInner, PalletStakingActiveEraInfo, PalletStakingExposure, PalletStakingExposureItem, PalletStakingNominations, RequestYieldStepSubmit, SpStakingExposurePage, StakeCancelWithdrawalParams, StakingTxErrorType, SubmitJoinNominationPool, SubmitYieldJoinData, TransactionData, UnstakingStatus, YieldPoolInfo, YieldPoolMethodInfo, YieldPoolType, YieldPositionInfo, YieldStepBaseInfo, YieldStepType, YieldTokenBaseInfo } from '@subwallet/extension-base/types'; import { balanceFormatter, formatNumber, reformatAddress } from '@subwallet/extension-base/utils'; import BigN from 'bignumber.js'; import { t } from 'i18next'; @@ -569,21 +569,19 @@ export default class NominationPoolHandler extends BasePoolHandler { async handleYieldJoin (_data: SubmitYieldJoinData, path: OptimalYieldPath, currentStep: number): Promise { const data = _data as SubmitJoinNominationPool; - const { address, amount, selectedPool } = data; + const { address, amount } = data; const positionInfo = await this.getPoolPosition(address); const [extrinsic] = await this.createJoinExtrinsic(data, positionInfo); - const joinPoolData: RequestStakePoolingBonding = { - poolPosition: positionInfo, - slug: this.slug, - selectedPool, - amount, - address + const joinPoolData: RequestYieldStepSubmit = { + path, + data: data, + currentStep }; return { txChain: this.chain, - extrinsicType: ExtrinsicType.STAKING_JOIN_POOL, + extrinsicType: ExtrinsicType.JOIN_YIELD_POOL, extrinsic, txData: joinPoolData, transferNativeAmount: amount, diff --git a/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/index.tsx b/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/index.tsx index bf91f3e4d97..c1758674538 100644 --- a/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/index.tsx +++ b/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/index.tsx @@ -34,11 +34,11 @@ const getTransactionComponent = (extrinsicType: ExtrinsicType): typeof BaseTrans case ExtrinsicType.SEND_NFT: return SendNftTransactionConfirmation; case ExtrinsicType.STAKING_JOIN_POOL: + case ExtrinsicType.JOIN_YIELD_POOL: return JoinPoolTransactionConfirmation; case ExtrinsicType.STAKING_LEAVE_POOL: return LeavePoolTransactionConfirmation; case ExtrinsicType.STAKING_BOND: - case ExtrinsicType.JOIN_YIELD_POOL: return BondTransactionConfirmation; case ExtrinsicType.STAKING_UNBOND: return UnbondTransactionConfirmation; diff --git a/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/JoinPool.tsx b/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/JoinPool.tsx index 6382cf89074..982388b673e 100644 --- a/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/JoinPool.tsx +++ b/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/JoinPool.tsx @@ -1,7 +1,7 @@ // Copyright 2019-2022 @subwallet/extension-koni-ui authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { RequestStakePoolingBonding } from '@subwallet/extension-base/background/KoniTypes'; +import { RequestYieldStepSubmit, SubmitJoinNominationPool } from '@subwallet/extension-base/types'; import CommonTransactionInfo from '@subwallet/extension-koni-ui/components/Confirmation/CommonTransactionInfo'; import MetaInfo from '@subwallet/extension-koni-ui/components/MetaInfo/MetaInfo'; import useGetNativeTokenBasicInfo from '@subwallet/extension-koni-ui/hooks/common/useGetNativeTokenBasicInfo'; @@ -16,7 +16,8 @@ type Props = BaseTransactionConfirmationProps; const Component: React.FC = (props: Props) => { const { className, transaction } = props; - const data = transaction.data as RequestStakePoolingBonding; + const requestData = transaction.data as RequestYieldStepSubmit; + const data = requestData.data as SubmitJoinNominationPool; const { t } = useTranslation(); const { decimals, symbol } = useGetNativeTokenBasicInfo(transaction.chain); @@ -31,11 +32,11 @@ const Component: React.FC = (props: Props) => { className={'meta-info'} hasBackgroundWrapper > - {/* */} + {/* { +export async function submitPoolBonding (request: RequestYieldStepSubmit): Promise { return sendMessage('pri(bonding.nominationPool.submitBonding)', request); } From 9550ad703922dfeb7b75fbc6ab5ee4ca9016eafa Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Thu, 17 Oct 2024 18:06:46 +0700 Subject: [PATCH 008/204] [Fixed] - History transaction input data --- .../src/services/transaction-service/index.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/extension-base/src/services/transaction-service/index.ts b/packages/extension-base/src/services/transaction-service/index.ts index 08e319d924f..70219e4d4f0 100644 --- a/packages/extension-base/src/services/transaction-service/index.ts +++ b/packages/extension-base/src/services/transaction-service/index.ts @@ -20,7 +20,7 @@ import { getBaseTransactionInfo, getTransactionId, isSubstrateTransaction, isTon import { SWTransaction, SWTransactionInput, SWTransactionResponse, TransactionEmitter, TransactionEventMap, TransactionEventResponse, ValidateTransactionResponseInput } from '@subwallet/extension-base/services/transaction-service/types'; import { getExplorerLink, parseTransactionData } from '@subwallet/extension-base/services/transaction-service/utils'; import { isWalletConnectRequest } from '@subwallet/extension-base/services/wallet-connect-service/helpers'; -import { AccountJson, BasicTxErrorType, BasicTxWarningCode, LeavePoolAdditionalData, RequestStakePoolingBonding, RequestYieldStepSubmit, SpecialYieldPoolInfo, Web3Transaction, YieldPoolType } from '@subwallet/extension-base/types'; +import { AccountJson, BasicTxErrorType, BasicTxWarningCode, LeavePoolAdditionalData, RequestStakePoolingBonding, RequestYieldStepSubmit, SpecialYieldPoolInfo, SubmitJoinNominationPool, Web3Transaction, YieldPoolType } from '@subwallet/extension-base/types'; import { _isRuntimeUpdated, anyNumberToBN, pairToAccount, reformatAddress } from '@subwallet/extension-base/utils'; import { mergeTransactionAndSignature } from '@subwallet/extension-base/utils/eth/mergeTransactionAndSignature'; import { isContractAddress, parseContractInput } from '@subwallet/extension-base/utils/eth/parseTransaction'; @@ -402,11 +402,12 @@ export default class TransactionService { } break; - case ExtrinsicType.STAKING_JOIN_POOL: { - const data = parseTransactionData(transaction.data); + case ExtrinsicType.JOIN_YIELD_POOL: { + const data = parseTransactionData(transaction.data); + const poolData = data.data as SubmitJoinNominationPool; - historyItem.amount = { ...baseNativeAmount, value: data.amount || '0' }; - historyItem.to = data.selectedPool.name || data.selectedPool.id.toString(); + historyItem.amount = { ...baseNativeAmount, value: poolData.amount || '0' }; + historyItem.to = poolData.selectedPool.name || poolData.selectedPool.id.toString(); } break; @@ -717,7 +718,7 @@ export default class TransactionService { } catch (e) { console.error(e); } - } else if ([ExtrinsicType.STAKING_BOND, ExtrinsicType.STAKING_UNBOND, ExtrinsicType.STAKING_WITHDRAW, ExtrinsicType.STAKING_CANCEL_UNSTAKE, ExtrinsicType.STAKING_CLAIM_REWARD, ExtrinsicType.STAKING_JOIN_POOL, ExtrinsicType.STAKING_POOL_WITHDRAW, ExtrinsicType.STAKING_LEAVE_POOL].includes(transaction.extrinsicType)) { + } else if ([ExtrinsicType.STAKING_BOND, ExtrinsicType.STAKING_UNBOND, ExtrinsicType.STAKING_WITHDRAW, ExtrinsicType.STAKING_CANCEL_UNSTAKE, ExtrinsicType.STAKING_CLAIM_REWARD, ExtrinsicType.JOIN_YIELD_POOL, ExtrinsicType.STAKING_POOL_WITHDRAW, ExtrinsicType.STAKING_LEAVE_POOL].includes(transaction.extrinsicType)) { this.state.eventService.emit('transaction.submitStaking', transaction.chain); } else if (transaction.extrinsicType === ExtrinsicType.SWAP) { const inputData = parseTransactionData(transaction.data); From 43b3d13a0b7be85bc707972eb3728269aa3c48ca Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Thu, 17 Oct 2024 18:24:59 +0700 Subject: [PATCH 009/204] [Update] - Change unstake type of native staking --- .../earning-service/handlers/native-staking/amplitude.ts | 2 +- .../services/earning-service/handlers/native-staking/astar.ts | 2 +- .../earning-service/handlers/native-staking/para-chain.ts | 2 +- .../earning-service/handlers/native-staking/relay-chain.ts | 2 +- .../src/services/earning-service/handlers/native-staking/tao.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/extension-base/src/services/earning-service/handlers/native-staking/amplitude.ts b/packages/extension-base/src/services/earning-service/handlers/native-staking/amplitude.ts index b613f527b1d..2d66422ad2e 100644 --- a/packages/extension-base/src/services/earning-service/handlers/native-staking/amplitude.ts +++ b/packages/extension-base/src/services/earning-service/handlers/native-staking/amplitude.ts @@ -563,7 +563,7 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta extrinsic = chainApi.api.tx.parachainStaking.leaveDelegators(); } - return [ExtrinsicType.STAKING_LEAVE_POOL, extrinsic]; + return [ExtrinsicType.STAKING_UNBOND, extrinsic]; } /* Leave pool action */ diff --git a/packages/extension-base/src/services/earning-service/handlers/native-staking/astar.ts b/packages/extension-base/src/services/earning-service/handlers/native-staking/astar.ts index 32aee7bf944..58f0f2a9774 100644 --- a/packages/extension-base/src/services/earning-service/handlers/native-staking/astar.ts +++ b/packages/extension-base/src/services/earning-service/handlers/native-staking/astar.ts @@ -459,7 +459,7 @@ export default class AstarNativeStakingPoolHandler extends BaseParaNativeStaking const extrinsic = chainApi.api.tx.dappsStaking.unbondAndUnstake(dappParam, binaryAmount); - return [ExtrinsicType.STAKING_LEAVE_POOL, extrinsic]; + return [ExtrinsicType.STAKING_UNBOND, extrinsic]; } /* Leave pool action */ diff --git a/packages/extension-base/src/services/earning-service/handlers/native-staking/para-chain.ts b/packages/extension-base/src/services/earning-service/handlers/native-staking/para-chain.ts index 5ae44563a00..563c063086a 100644 --- a/packages/extension-base/src/services/earning-service/handlers/native-staking/para-chain.ts +++ b/packages/extension-base/src/services/earning-service/handlers/native-staking/para-chain.ts @@ -606,7 +606,7 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP extrinsic = apiPromise.api.tx.parachainStaking.scheduleRevokeDelegation(selectedTarget); } - return [ExtrinsicType.STAKING_LEAVE_POOL, extrinsic]; + return [ExtrinsicType.STAKING_UNBOND, extrinsic]; } /* Leave pool action */ diff --git a/packages/extension-base/src/services/earning-service/handlers/native-staking/relay-chain.ts b/packages/extension-base/src/services/earning-service/handlers/native-staking/relay-chain.ts index 674174d33c8..defd6d7842f 100644 --- a/packages/extension-base/src/services/earning-service/handlers/native-staking/relay-chain.ts +++ b/packages/extension-base/src/services/earning-service/handlers/native-staking/relay-chain.ts @@ -774,7 +774,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool extrinsic = chainApi.api.tx.staking.unbond(binaryAmount); } - return [ExtrinsicType.STAKING_LEAVE_POOL, extrinsic]; + return [ExtrinsicType.STAKING_UNBOND, extrinsic]; } /* Leave pool action */ diff --git a/packages/extension-base/src/services/earning-service/handlers/native-staking/tao.ts b/packages/extension-base/src/services/earning-service/handlers/native-staking/tao.ts index 971b94246a2..d5f46cb1b8a 100644 --- a/packages/extension-base/src/services/earning-service/handlers/native-staking/tao.ts +++ b/packages/extension-base/src/services/earning-service/handlers/native-staking/tao.ts @@ -466,7 +466,7 @@ export default class TaoNativeStakingPoolHandler extends BaseParaStakingPoolHand const extrinsic = apiPromise.api.tx.subtensorModule.removeStake(selectedTarget, binaryAmount); - return [ExtrinsicType.STAKING_LEAVE_POOL, extrinsic]; + return [ExtrinsicType.STAKING_UNBOND, extrinsic]; } /* Leave pool action */ From 7a3e7bd7784351652b11519a505e8e22b36b08c0 Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Fri, 18 Oct 2024 11:42:06 +0700 Subject: [PATCH 010/204] [Update] - Remove some STAKING_POOL_WITHDRAW type --- .../src/koni/api/yield/helper/utils.ts | 3 +-- .../src/services/transaction-service/index.ts | 2 +- .../Confirmations/variants/Transaction/index.tsx | 2 +- .../variants/Transaction/variants/JoinPool.tsx | 15 ++++++++------- .../src/messaging/transaction/staking.ts | 6 +++--- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/extension-base/src/koni/api/yield/helper/utils.ts b/packages/extension-base/src/koni/api/yield/helper/utils.ts index f08513fd46c..a63393dd237 100644 --- a/packages/extension-base/src/koni/api/yield/helper/utils.ts +++ b/packages/extension-base/src/koni/api/yield/helper/utils.ts @@ -21,8 +21,7 @@ export const YIELD_EXTRINSIC_TYPES = [ ExtrinsicType.REDEEM_STDOT, ExtrinsicType.JOIN_YIELD_POOL, ExtrinsicType.STAKING_CLAIM_REWARD, - ExtrinsicType.STAKING_LEAVE_POOL, - ExtrinsicType.STAKING_POOL_WITHDRAW + ExtrinsicType.STAKING_LEAVE_POOL ]; export const YIELD_POOL_STAT_REFRESH_INTERVAL = 90000; diff --git a/packages/extension-base/src/services/transaction-service/index.ts b/packages/extension-base/src/services/transaction-service/index.ts index 70219e4d4f0..e0a3822b72f 100644 --- a/packages/extension-base/src/services/transaction-service/index.ts +++ b/packages/extension-base/src/services/transaction-service/index.ts @@ -718,7 +718,7 @@ export default class TransactionService { } catch (e) { console.error(e); } - } else if ([ExtrinsicType.STAKING_BOND, ExtrinsicType.STAKING_UNBOND, ExtrinsicType.STAKING_WITHDRAW, ExtrinsicType.STAKING_CANCEL_UNSTAKE, ExtrinsicType.STAKING_CLAIM_REWARD, ExtrinsicType.JOIN_YIELD_POOL, ExtrinsicType.STAKING_POOL_WITHDRAW, ExtrinsicType.STAKING_LEAVE_POOL].includes(transaction.extrinsicType)) { + } else if ([ExtrinsicType.STAKING_BOND, ExtrinsicType.STAKING_UNBOND, ExtrinsicType.STAKING_WITHDRAW, ExtrinsicType.STAKING_CANCEL_UNSTAKE, ExtrinsicType.STAKING_CLAIM_REWARD, ExtrinsicType.JOIN_YIELD_POOL, ExtrinsicType.STAKING_LEAVE_POOL].includes(transaction.extrinsicType)) { this.state.eventService.emit('transaction.submitStaking', transaction.chain); } else if (transaction.extrinsicType === ExtrinsicType.SWAP) { const inputData = parseTransactionData(transaction.data); diff --git a/packages/extension-web-ui/src/Popup/Confirmations/variants/Transaction/index.tsx b/packages/extension-web-ui/src/Popup/Confirmations/variants/Transaction/index.tsx index ee007392344..6aa6ad6d2c6 100644 --- a/packages/extension-web-ui/src/Popup/Confirmations/variants/Transaction/index.tsx +++ b/packages/extension-web-ui/src/Popup/Confirmations/variants/Transaction/index.tsx @@ -33,11 +33,11 @@ const getTransactionComponent = (extrinsicType: ExtrinsicType): typeof BaseTrans case ExtrinsicType.SEND_NFT: return SendNftTransactionConfirmation; case ExtrinsicType.STAKING_JOIN_POOL: + case ExtrinsicType.JOIN_YIELD_POOL: return JoinPoolTransactionConfirmation; case ExtrinsicType.STAKING_LEAVE_POOL: return LeavePoolTransactionConfirmation; case ExtrinsicType.STAKING_BOND: - case ExtrinsicType.JOIN_YIELD_POOL: return BondTransactionConfirmation; case ExtrinsicType.STAKING_UNBOND: return UnbondTransactionConfirmation; diff --git a/packages/extension-web-ui/src/Popup/Confirmations/variants/Transaction/variants/JoinPool.tsx b/packages/extension-web-ui/src/Popup/Confirmations/variants/Transaction/variants/JoinPool.tsx index b578e54630b..ff0a6073d70 100644 --- a/packages/extension-web-ui/src/Popup/Confirmations/variants/Transaction/variants/JoinPool.tsx +++ b/packages/extension-web-ui/src/Popup/Confirmations/variants/Transaction/variants/JoinPool.tsx @@ -1,7 +1,7 @@ // Copyright 2019-2022 @subwallet/extension-web-ui authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { RequestStakePoolingBonding } from '@subwallet/extension-base/background/KoniTypes'; +import { RequestYieldStepSubmit, SubmitJoinNominationPool } from '@subwallet/extension-base/types'; import { AlertBox } from '@subwallet/extension-web-ui/components'; import CommonTransactionInfo from '@subwallet/extension-web-ui/components/Confirmation/CommonTransactionInfo'; import MetaInfo from '@subwallet/extension-web-ui/components/MetaInfo/MetaInfo'; @@ -17,7 +17,8 @@ type Props = BaseTransactionConfirmationProps; const Component: React.FC = (props: Props) => { const { className, transaction } = props; - const data = transaction.data as RequestStakePoolingBonding; + const requestData = transaction.data as RequestYieldStepSubmit; + const data = requestData.data as SubmitJoinNominationPool; const { t } = useTranslation(); const { decimals, symbol } = useGetNativeTokenBasicInfo(transaction.chain); @@ -32,11 +33,11 @@ const Component: React.FC = (props: Props) => { className={'meta-info'} hasBackgroundWrapper > - {/* */} + {/* { +export async function submitPoolBonding (request: RequestYieldStepSubmit): Promise { return sendMessage('pri(bonding.nominationPool.submitBonding)', request); } From 70dacfedf7e1c849d11c42a44690e940bfe1bdd1 Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Wed, 23 Oct 2024 10:14:11 +0700 Subject: [PATCH 011/204] [Update] - Update message in case perform Liquid staking have XCM --- .../services/earning-service/handlers/special.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/extension-base/src/services/earning-service/handlers/special.ts b/packages/extension-base/src/services/earning-service/handlers/special.ts index 9d95dda327f..411e5a450c4 100644 --- a/packages/extension-base/src/services/earning-service/handlers/special.ts +++ b/packages/extension-base/src/services/earning-service/handlers/special.ts @@ -3,7 +3,7 @@ import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError'; import { AmountData, ChainType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes'; -import { ALL_ACCOUNT_KEY } from '@subwallet/extension-base/constants'; +import { ALL_ACCOUNT_KEY, XCM_FEE_RATIO } from '@subwallet/extension-base/constants'; import { YIELD_POOL_STAT_REFRESH_INTERVAL } from '@subwallet/extension-base/koni/api/yield/helper/utils'; import KoniState from '@subwallet/extension-base/koni/background/handlers/State'; import { createXcmExtrinsic } from '@subwallet/extension-base/services/balance-service/transfer/xcm'; @@ -345,26 +345,27 @@ export default abstract class BaseSpecialStakingPoolHandler extends BasePoolHand const missingAmount = bnAmount.sub(bnInputTokenBalance); // TODO: what if input token is not LOCAL ?? const xcmFee = new BN(path.totalFee[1].amount || '0'); + const xcmAmount = missingAmount.add(xcmFee); + const existentialDeposit = new BN(this.nativeToken.minAmount || '0'); const bnAltInputTokenBalance = new BN(altInputTokenBalance.value || '0'); - if (!bnAltInputTokenBalance.sub(xcmAmount).sub(xcmFee).gt(BN_ZERO)) { + if (!bnAltInputTokenBalance.sub(xcmAmount).sub(xcmFee).sub(existentialDeposit).gt(BN_ZERO)) { processValidation.failedStep = path.steps[1]; processValidation.ok = false; processValidation.status = YieldValidationStatus.NOT_ENOUGH_BALANCE; - const maxBn = bnInputTokenBalance.add(new BN(altInputTokenBalance.value)).sub(xcmFee).sub(xcmFee); + const bnMaxXCM = new BN(altInputTokenBalance.value).sub(xcmFee.mul(new BN(XCM_FEE_RATIO))).sub(existentialDeposit); + const maxBn = bnInputTokenBalance.add(bnMaxXCM); const maxValue = formatNumber(maxBn.toString(), inputTokenInfo.decimals || 0); + const maxXCMValue = formatNumber(bnMaxXCM.toString(), inputTokenInfo.decimals || 0); - const altInputTokenInfo = this.state.getAssetBySlug(altInputTokenSlug); const symbol = altInputTokenInfo.symbol; const altNetwork = this.state.getChainInfo(altInputTokenInfo.originChain); const inputNetworkName = this.chainInfo.name; const altNetworkName = altNetwork.name; const currentValue = formatNumber(bnInputTokenBalance.toString(), inputTokenInfo.decimals || 0); - const bnMaxXCM = new BN(altInputTokenBalance.value).sub(xcmFee).sub(xcmFee); - const maxXCMValue = formatNumber(bnMaxXCM.toString(), inputTokenInfo.decimals || 0); processValidation.message = t( 'You can only enter a maximum of {{maxValue}} {{symbol}}, which is {{currentValue}} {{symbol}} ({{inputNetworkName}}) and {{maxXCMValue}} {{symbol}} ({{altNetworkName}}). Lower your amount and try again.', From 18e34e8b755a501b8db0a678cd4f6eb64185e7c4 Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Sat, 26 Oct 2024 12:12:48 +0700 Subject: [PATCH 012/204] [Issue-3070] Refactor logic parsing data from contract response --- .../chain-service/handler/EvmChainHandler.ts | 7 --- .../handler/SubstrateChainHandler.ts | 59 +++++++------------ 2 files changed, 20 insertions(+), 46 deletions(-) diff --git a/packages/extension-base/src/services/chain-service/handler/EvmChainHandler.ts b/packages/extension-base/src/services/chain-service/handler/EvmChainHandler.ts index fc616516da6..b9ce715769e 100644 --- a/packages/extension-base/src/services/chain-service/handler/EvmChainHandler.ts +++ b/packages/extension-base/src/services/chain-service/handler/EvmChainHandler.ts @@ -144,28 +144,21 @@ export class EvmChainHandler extends AbstractChainHandler { try { if (tokenType === _AssetType.ERC721) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access tokenContract = new evmApi.api.eth.Contract(_ERC721_ABI, contractAddress); const [_name, _symbol] = await Promise.all([ - // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access tokenContract.methods.name().call() as string, - // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access tokenContract.methods.symbol().call() as string ]); name = _name; symbol = _symbol; } else { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access tokenContract = new evmApi.api.eth.Contract(_ERC20_ABI, contractAddress); const [_decimals, _symbol, _name] = await Promise.all([ - // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access tokenContract.methods.decimals().call() as number, - // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access tokenContract.methods.symbol().call() as string, - // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access tokenContract.methods.name().call() as string ]); diff --git a/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts b/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts index 8e3c29f85e4..520b86d911b 100644 --- a/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts +++ b/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts @@ -22,6 +22,12 @@ import { _PSP22_ABI, _PSP34_ABI } from '../../../koni/api/contract-handler/utils export const DEFAULT_AUX = ['Aux1', 'Aux2', 'Aux3', 'Aux4', 'Aux5', 'Aux6', 'Aux7', 'Aux8', 'Aux9']; +interface AssetMetadata { + name: string, + symbol: string, + decimals: number +} + export class SubstrateChainHandler extends AbstractChainHandler { private substrateApiMap: Record = {}; @@ -129,11 +135,11 @@ export class SubstrateChainHandler extends AbstractChainHandler { const decimalsObj = decimalsResp.output?.toHuman() as Record; const nameObj = nameResp.output?.toHuman() as Record; - const name = nameResp.output ? (nameObj.Ok as string || nameObj.ok as string) : ''; - const decimals = decimalsResp.output ? (new BN((decimalsObj.Ok || decimalsObj.ok) as string | number)).toNumber() : 0; - const symbol = decimalsResp.output ? (symbolObj.Ok as string || symbolObj.ok as string) : ''; + const name = nameResp.output ? nameObj.Ok as string : ''; + const decimals = decimalsResp.output ? new BN((decimalsObj.Ok) as string | number).toNumber() : 0; + const symbol = decimalsResp.output ? symbolObj.Ok as string : ''; - if (!name || !symbol || typeof name === 'object' || typeof symbol === 'object') { + if (!name || !symbol) { contractError = true; } @@ -160,48 +166,29 @@ export class SubstrateChainHandler extends AbstractChainHandler { } } - private async getGrc20TokenInfo (apiPromise: ApiPromise, contractAddress: string): Promise<[string, number, string, boolean]> { + private async getGrc20VftTokenInfo (apiPromise: ApiPromise, contractAddress: string, tokenType: _AssetType): Promise<[string, number, string, boolean]> { if (!(apiPromise instanceof GearApi)) { - console.warn('Cannot subscribe GRC20 balance without GearApi instance'); + console.warn(`Cannot subscribe ${tokenType} balance without GearApi instance`); return ['', -1, '', true]; } let contractError = false; - const tokenContract = getGRC20ContractPromise(apiPromise, contractAddress); - - const [nameRes, symbolRes, decimalsRes] = await Promise.all([ - tokenContract.service.name(GEAR_DEFAULT_ADDRESS), - tokenContract.service.symbol(GEAR_DEFAULT_ADDRESS), - tokenContract.service.decimals(GEAR_DEFAULT_ADDRESS) - ]); - - const decimals = typeof decimalsRes === 'string' ? parseInt(decimalsRes) : decimalsRes; + let tokenContract : any; - if (!nameRes || !symbolRes) { - contractError = true; + if (tokenType === _AssetType.GRC20) { + tokenContract = getGRC20ContractPromise(apiPromise, contractAddress); + } else if (tokenType === _AssetType.VFT) { + tokenContract = getVFTContractPromise(apiPromise, contractAddress); } - return [nameRes, decimals, symbolRes, contractError]; - } - - private async getVftTokenInfo (apiPromise: ApiPromise, contractAddress: string): Promise<[string, number, string, boolean]> { - if (!(apiPromise instanceof GearApi)) { - console.warn('Cannot subscribe VFT balance without GearApi instance'); - - return ['', -1, '', true]; - } - - let contractError = false; - const tokenContract = getVFTContractPromise(apiPromise, contractAddress); - const [nameRes, symbolRes, decimalsRes] = await Promise.all([ tokenContract.service.name(GEAR_DEFAULT_ADDRESS), tokenContract.service.symbol(GEAR_DEFAULT_ADDRESS), tokenContract.service.decimals(GEAR_DEFAULT_ADDRESS) ]); - const decimals = typeof decimalsRes === 'string' ? parseInt(decimalsRes) : decimalsRes; + const decimals = parseInt(decimalsRes.toString()); if (!nameRes || !symbolRes) { contractError = true; @@ -213,12 +200,6 @@ export class SubstrateChainHandler extends AbstractChainHandler { private async getLocalTokenInfo (apiPromise: ApiPromise, assetId: string): Promise<[string, number, string, boolean]> { const _metadata = await apiPromise.query.assets.metadata(assetId); - interface AssetMetadata { - name: string, - symbol: string, - decimals: number - } - const metadata = _metadata.toPrimitive() as unknown as AssetMetadata; let idError = false; @@ -249,10 +230,10 @@ export class SubstrateChainHandler extends AbstractChainHandler { [name, decimals, symbol, contractError] = await this.getPsp34TokenInfo(apiPromise, contractAddress, contractCaller); break; case _AssetType.GRC20: - [name, decimals, symbol, contractError] = await this.getGrc20TokenInfo(apiPromise, contractAddress); + [name, decimals, symbol, contractError] = await this.getGrc20VftTokenInfo(apiPromise, contractAddress, tokenType); break; case _AssetType.VFT: - [name, decimals, symbol, contractError] = await this.getVftTokenInfo(apiPromise, contractAddress); + [name, decimals, symbol, contractError] = await this.getGrc20VftTokenInfo(apiPromise, contractAddress, tokenType); break; } From 052132b3ca0562b665f19bda32d17e1eeab3d32c Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Sat, 26 Oct 2024 14:33:38 +0700 Subject: [PATCH 013/204] [Issue-3070] Refactor logic parsing data from contract response --- .../src/koni/api/contract-handler/utils/index.ts | 5 +++-- .../chain-service/handler/SubstrateChainHandler.ts | 8 +------- 2 files changed, 4 insertions(+), 9 deletions(-) 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 5cebbe2a33b..9d4f2703a70 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 @@ -3,11 +3,12 @@ import { COMMON_CHAIN_SLUGS } from '@subwallet/chain-list'; import { _Address } from '@subwallet/extension-base/background/KoniTypes'; +import {AbiItem} from "web3-utils"; // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-assignment -export const _ERC20_ABI = require('./erc20_abi.json'); +export const _ERC20_ABI: AbiItem[] | AbiItem = require('./erc20_abi.json'); // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-assignment -export const _ERC721_ABI = require('./erc721_abi.json'); +export const _ERC721_ABI: AbiItem[] | AbiItem = require('./erc721_abi.json'); // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-assignment export const _TEST_ERC721_ABI = require('./test_erc721_abi.json'); // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-assignment diff --git a/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts b/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts index 520b86d911b..2ffaee813b9 100644 --- a/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts +++ b/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts @@ -174,13 +174,7 @@ export class SubstrateChainHandler extends AbstractChainHandler { } let contractError = false; - let tokenContract : any; - - if (tokenType === _AssetType.GRC20) { - tokenContract = getGRC20ContractPromise(apiPromise, contractAddress); - } else if (tokenType === _AssetType.VFT) { - tokenContract = getVFTContractPromise(apiPromise, contractAddress); - } + const tokenContract = tokenType === _AssetType.GRC20 ? getGRC20ContractPromise(apiPromise, contractAddress) : getVFTContractPromise(apiPromise, contractAddress); const [nameRes, symbolRes, decimalsRes] = await Promise.all([ tokenContract.service.name(GEAR_DEFAULT_ADDRESS), From a0154eca3393087212af0da68300842561b98e57 Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Sat, 26 Oct 2024 15:05:31 +0700 Subject: [PATCH 014/204] [Issue-3070] Fix: Fix eslint --- .../src/koni/api/contract-handler/utils/index.ts | 2 +- .../src/services/chain-service/handler/EvmChainHandler.ts | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) 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 9d4f2703a70..ef1066b1415 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 @@ -3,7 +3,7 @@ import { COMMON_CHAIN_SLUGS } from '@subwallet/chain-list'; import { _Address } from '@subwallet/extension-base/background/KoniTypes'; -import {AbiItem} from "web3-utils"; +import { AbiItem } from 'web3-utils'; // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-assignment export const _ERC20_ABI: AbiItem[] | AbiItem = require('./erc20_abi.json'); diff --git a/packages/extension-base/src/services/chain-service/handler/EvmChainHandler.ts b/packages/extension-base/src/services/chain-service/handler/EvmChainHandler.ts index b9ce715769e..fa3a69bff50 100644 --- a/packages/extension-base/src/services/chain-service/handler/EvmChainHandler.ts +++ b/packages/extension-base/src/services/chain-service/handler/EvmChainHandler.ts @@ -147,7 +147,9 @@ export class EvmChainHandler extends AbstractChainHandler { tokenContract = new evmApi.api.eth.Contract(_ERC721_ABI, contractAddress); const [_name, _symbol] = await Promise.all([ + // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access tokenContract.methods.name().call() as string, + // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access tokenContract.methods.symbol().call() as string ]); @@ -157,8 +159,11 @@ export class EvmChainHandler extends AbstractChainHandler { tokenContract = new evmApi.api.eth.Contract(_ERC20_ABI, contractAddress); const [_decimals, _symbol, _name] = await Promise.all([ + // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access tokenContract.methods.decimals().call() as number, + // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access tokenContract.methods.symbol().call() as string, + // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access tokenContract.methods.name().call() as string ]); From 2f255472bfedee52b641c6e5c313d44dfe189d08 Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Sat, 26 Oct 2024 18:21:11 +0700 Subject: [PATCH 015/204] [Issue-3070] Refactor logic parsing data from contract respons --- .../handler/SubstrateChainHandler.ts | 109 +++++++++++------- 1 file changed, 68 insertions(+), 41 deletions(-) diff --git a/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts b/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts index 2ffaee813b9..8677ca22f1d 100644 --- a/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts +++ b/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts @@ -117,8 +117,14 @@ export class SubstrateChainHandler extends AbstractChainHandler { return result; } - private async getPsp22TokenInfo (apiPromise: ApiPromise, contractAddress: string, contractCaller?: string): Promise<[string, number, string, boolean]> { + private async getPsp22TokenInfo (apiPromise: ApiPromise, contractAddress: string, contractCaller?: string): Promise<_SmartContractTokenInfo> { const tokenContract = new ContractPromise(apiPromise, _PSP22_ABI, contractAddress); + let tokenSmartContract : _SmartContractTokenInfo = { + name: '', + decimals: -1, + symbol: '', + contractError: false + } const [nameResp, symbolResp, decimalsResp] = await Promise.all([ tokenContract.query['psp22Metadata::tokenName'](contractCaller || contractAddress, { gasLimit: getDefaultWeightV2(apiPromise) }), // read-only operation so no gas limit @@ -127,53 +133,72 @@ export class SubstrateChainHandler extends AbstractChainHandler { ]); if (!(nameResp.result.isOk && symbolResp.result.isOk && decimalsResp.result.isOk) || !nameResp.output || !decimalsResp.output || !symbolResp.output) { - return ['', 1, '', true]; - } else { - let contractError = false; + tokenSmartContract.contractError = true; + return tokenSmartContract; + } else { const symbolObj = symbolResp.output?.toHuman() as Record; const decimalsObj = decimalsResp.output?.toHuman() as Record; const nameObj = nameResp.output?.toHuman() as Record; - const name = nameResp.output ? nameObj.Ok as string : ''; - const decimals = decimalsResp.output ? new BN((decimalsObj.Ok) as string | number).toNumber() : 0; - const symbol = decimalsResp.output ? symbolObj.Ok as string : ''; + tokenSmartContract.name = nameResp.output ? (nameObj.Ok as string || nameObj.ok as string) : ''; + tokenSmartContract.decimals = decimalsResp.output ? (new BN((decimalsObj.Ok || decimalsObj.ok) as string | number)).toNumber() : 0; + tokenSmartContract.symbol = decimalsResp.output ? (symbolObj.Ok as string || symbolObj.ok as string) : ''; - if (!name || !symbol) { - contractError = true; + if (!tokenSmartContract.name || !tokenSmartContract.symbol) { + tokenSmartContract.contractError = true } - return [name, decimals, symbol, contractError]; + return tokenSmartContract; } } - private async getPsp34TokenInfo (apiPromise: ApiPromise, contractAddress: string, contractCaller?: string): Promise<[string, number, string, boolean]> { + private async getPsp34TokenInfo (apiPromise: ApiPromise, contractAddress: string, contractCaller?: string): Promise<_SmartContractTokenInfo> { const tokenContract = new ContractPromise(apiPromise, _PSP34_ABI, contractAddress); + let tokenSmartContract : _SmartContractTokenInfo = { + name: '', + decimals: -1, + symbol: '', + contractError: false + } const collectionIdResp = await tokenContract.query['psp34::collectionId'](contractCaller || contractAddress, { gasLimit: getDefaultWeightV2(apiPromise) }); // read-only operation so no gas limit if (!collectionIdResp.result.isOk || !collectionIdResp.output) { - return ['', -1, '', true]; + tokenSmartContract.contractError = true; + + return tokenSmartContract; } else { - let contractError = false; const collectionIdDict = collectionIdResp.output?.toHuman() as Record; if (collectionIdDict.Bytes === '') { - contractError = true; + tokenSmartContract.contractError = true; } - return ['', -1, '', contractError]; + return tokenSmartContract; } } - private async getGrc20VftTokenInfo (apiPromise: ApiPromise, contractAddress: string, tokenType: _AssetType): Promise<[string, number, string, boolean]> { + private async getVaraFungibleTokenInfo (apiPromise: ApiPromise, contractAddress: string, tokenType: _AssetType): Promise<_SmartContractTokenInfo> { + let tokenSmartContract : _SmartContractTokenInfo = { + name: '', + decimals: -1, + symbol: '', + contractError: false + } + if (!(apiPromise instanceof GearApi)) { - console.warn(`Cannot subscribe ${tokenType} balance without GearApi instance`); + if (tokenType === _AssetType.GRC20) { + console.warn('Cannot subscribe GRC20 balance without GearApi instance'); + } else if (tokenType === _AssetType.VFT) { + console.warn('Cannot subscribe VFT balance without GearApi instance'); + } + + tokenSmartContract.contractError = true; - return ['', -1, '', true]; + return tokenSmartContract; } - let contractError = false; const tokenContract = tokenType === _AssetType.GRC20 ? getGRC20ContractPromise(apiPromise, contractAddress) : getVFTContractPromise(apiPromise, contractAddress); const [nameRes, symbolRes, decimalsRes] = await Promise.all([ @@ -184,11 +209,15 @@ export class SubstrateChainHandler extends AbstractChainHandler { const decimals = parseInt(decimalsRes.toString()); + tokenSmartContract.name = nameRes; + tokenSmartContract.decimals = decimals; + tokenSmartContract.symbol = symbolRes; + if (!nameRes || !symbolRes) { - contractError = true; + tokenSmartContract.contractError = true; } - return [nameRes, decimals, symbolRes, contractError]; + return tokenSmartContract; } private async getLocalTokenInfo (apiPromise: ApiPromise, assetId: string): Promise<[string, number, string, boolean]> { @@ -208,44 +237,42 @@ export class SubstrateChainHandler extends AbstractChainHandler { public async getSubstrateContractTokenInfo (contractAddress: string, tokenType: _AssetType, originChain: string, contractCaller?: string): Promise<_SmartContractTokenInfo> { // todo: improve this funtion later - let name = ''; - let decimals: number | undefined = -1; - let symbol = ''; - let contractError = false; + let tokenSmartContract : _SmartContractTokenInfo = { + name : '', + decimals : -1, + symbol : '', + contractError : false + } + + // let name = ''; + // let decimals: number | undefined = -1; + // let symbol = ''; + // let contractError = false; const apiPromise = this.getSubstrateApiByChain(originChain).api; try { switch (tokenType) { case _AssetType.PSP22: - [name, decimals, symbol, contractError] = await this.getPsp22TokenInfo(apiPromise, contractAddress, contractCaller); + tokenSmartContract = await this.getPsp22TokenInfo(apiPromise, contractAddress, contractCaller); break; case _AssetType.PSP34: - [name, decimals, symbol, contractError] = await this.getPsp34TokenInfo(apiPromise, contractAddress, contractCaller); + tokenSmartContract = await this.getPsp34TokenInfo(apiPromise, contractAddress, contractCaller); break; case _AssetType.GRC20: - [name, decimals, symbol, contractError] = await this.getGrc20VftTokenInfo(apiPromise, contractAddress, tokenType); + tokenSmartContract = await this.getVaraFungibleTokenInfo(apiPromise, contractAddress, tokenType); break; case _AssetType.VFT: - [name, decimals, symbol, contractError] = await this.getGrc20VftTokenInfo(apiPromise, contractAddress, tokenType); + tokenSmartContract = await this.getVaraFungibleTokenInfo(apiPromise, contractAddress, tokenType); break; } - return { - name, - decimals, - symbol, - contractError - }; + return tokenSmartContract; } catch (e) { this.logger.error(e); + tokenSmartContract.contractError = true; - return { - name: '', - decimals: -1, - symbol: '', - contractError: true - }; + return tokenSmartContract; } } From c2572582268c11001f3692fbc64392802e185668 Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Sat, 26 Oct 2024 18:29:20 +0700 Subject: [PATCH 016/204] [Issue-3070] Fix: Fix eslint --- .../chain-service/handler/SubstrateChainHandler.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts b/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts index 8677ca22f1d..07d8102d3d4 100644 --- a/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts +++ b/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts @@ -119,12 +119,12 @@ export class SubstrateChainHandler extends AbstractChainHandler { private async getPsp22TokenInfo (apiPromise: ApiPromise, contractAddress: string, contractCaller?: string): Promise<_SmartContractTokenInfo> { const tokenContract = new ContractPromise(apiPromise, _PSP22_ABI, contractAddress); - let tokenSmartContract : _SmartContractTokenInfo = { + const tokenSmartContract: _SmartContractTokenInfo = { name: '', decimals: -1, symbol: '', contractError: false - } + }; const [nameResp, symbolResp, decimalsResp] = await Promise.all([ tokenContract.query['psp22Metadata::tokenName'](contractCaller || contractAddress, { gasLimit: getDefaultWeightV2(apiPromise) }), // read-only operation so no gas limit @@ -146,7 +146,7 @@ export class SubstrateChainHandler extends AbstractChainHandler { tokenSmartContract.symbol = decimalsResp.output ? (symbolObj.Ok as string || symbolObj.ok as string) : ''; if (!tokenSmartContract.name || !tokenSmartContract.symbol) { - tokenSmartContract.contractError = true + tokenSmartContract.contractError = true; } return tokenSmartContract; @@ -155,12 +155,12 @@ export class SubstrateChainHandler extends AbstractChainHandler { private async getPsp34TokenInfo (apiPromise: ApiPromise, contractAddress: string, contractCaller?: string): Promise<_SmartContractTokenInfo> { const tokenContract = new ContractPromise(apiPromise, _PSP34_ABI, contractAddress); - let tokenSmartContract : _SmartContractTokenInfo = { + const tokenSmartContract: _SmartContractTokenInfo = { name: '', decimals: -1, symbol: '', contractError: false - } + }; const collectionIdResp = await tokenContract.query['psp34::collectionId'](contractCaller || contractAddress, { gasLimit: getDefaultWeightV2(apiPromise) }); // read-only operation so no gas limit @@ -180,12 +180,12 @@ export class SubstrateChainHandler extends AbstractChainHandler { } private async getVaraFungibleTokenInfo (apiPromise: ApiPromise, contractAddress: string, tokenType: _AssetType): Promise<_SmartContractTokenInfo> { - let tokenSmartContract : _SmartContractTokenInfo = { + const tokenSmartContract: _SmartContractTokenInfo = { name: '', decimals: -1, symbol: '', contractError: false - } + }; if (!(apiPromise instanceof GearApi)) { if (tokenType === _AssetType.GRC20) { From 7fbf409c5c7c7391739cc401340c4a553c85ad28 Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Sat, 26 Oct 2024 18:33:27 +0700 Subject: [PATCH 017/204] [Issue-3070] Fix: Fix eslint --- .../chain-service/handler/SubstrateChainHandler.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts b/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts index 07d8102d3d4..24dee144f6f 100644 --- a/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts +++ b/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts @@ -237,12 +237,12 @@ export class SubstrateChainHandler extends AbstractChainHandler { public async getSubstrateContractTokenInfo (contractAddress: string, tokenType: _AssetType, originChain: string, contractCaller?: string): Promise<_SmartContractTokenInfo> { // todo: improve this funtion later - let tokenSmartContract : _SmartContractTokenInfo = { - name : '', - decimals : -1, - symbol : '', - contractError : false - } + let tokenSmartContract: _SmartContractTokenInfo = { + name: '', + decimals: -1, + symbol: '', + contractError: false + }; // let name = ''; // let decimals: number | undefined = -1; From 35e736544c457f817c6c8a0bac2750524f44a437 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 26 Oct 2024 16:48:15 +0000 Subject: [PATCH 018/204] [CI Skip] release/beta 1.3.4-0 skip-checks: true --- CONTRIBUTORS | 16 ++--- package.json | 2 +- packages/extension-base/package.json | 12 ++-- packages/extension-base/src/packageInfo.ts | 2 +- packages/extension-chains/package.json | 4 +- packages/extension-chains/src/packageInfo.ts | 2 +- .../extension-compat-metamask/package.json | 4 +- .../src/packageInfo.ts | 2 +- packages/extension-dapp/package.json | 4 +- packages/extension-dapp/src/packageInfo.ts | 2 +- packages/extension-inject/package.json | 2 +- packages/extension-inject/src/packageInfo.ts | 2 +- packages/extension-koni-ui/package.json | 12 ++-- packages/extension-koni/package.json | 8 +-- .../public/locales/en/translation.json | 35 +++++++++- .../public/locales/ja/translation.json | 35 +++++++++- .../public/locales/ru/translation.json | 35 +++++++++- .../public/locales/vi/translation.json | 35 +++++++++- .../public/locales/zh/translation.json | 35 +++++++++- packages/extension-koni/src/packageInfo.ts | 2 +- packages/extension-mocks/package.json | 2 +- packages/extension-web-ui/package.json | 12 ++-- packages/web-runner/package.json | 8 +-- .../public/locales/en/translation.json | 35 +++++++++- .../public/locales/ja/translation.json | 35 +++++++++- .../public/locales/ru/translation.json | 35 +++++++++- .../public/locales/vi/translation.json | 35 +++++++++- .../public/locales/zh/translation.json | 35 +++++++++- packages/webapp/package.json | 8 +-- .../webapp/public/locales/en/translation.json | 35 +++++++++- .../webapp/public/locales/ja/translation.json | 35 +++++++++- .../webapp/public/locales/ru/translation.json | 35 +++++++++- .../webapp/public/locales/vi/translation.json | 35 +++++++++- .../webapp/public/locales/zh/translation.json | 35 +++++++++- yarn.lock | 68 +++++++++---------- 35 files changed, 597 insertions(+), 102 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index a375e65b890..59e8461353d 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,14 +1,14 @@ - 2865 AnhMTV Release version 1.3.3 + 2871 AnhMTV 2546 Nam Phạm [Issue 3747] chore: fix eslint - 2344 S2kael [Issue-3794] Update stable version for chain-list + 2359 S2kael [Issue-3806] Update stable version for chain-list 869 lw-cdm [MasterAccount] Update logic to reorder account on select account modal 568 nguyentiendung [Issue-3553] [Issue-3553] Refactor code and add recipient to swap history. 465 Jaco 0.42.5 (#969) - 393 bluezdot [Issue-3760] fix: fix chainlist + 458 bluezdot [Issue-3515] fix: minor fix 354 Thiendekaco [Issue-3707] [fix] Unified account - fix dApp ui bug #4 + 186 dominhquang [Issue-3507] Fix UI bug for Notification 185 quangdo - 179 dominhquang [Issue-3732] Fix bug do not show watch-only account on History (All account mode) - 172 Frenkie Nguyen [Issue-3696] Update UI for derivation + 179 Frenkie Nguyen [Issue-3696] Update UI for derivation 170 lw-cdm 160 Automation Bot [CI Skip] Auto increase webapp build number 104 khainh predefine metadata for Polkadot & Kusama chains @@ -18,10 +18,10 @@ 82 Thibaut Sardan Add account filtering feature (#832) 73 bluedot [Issue-3579] fix: update check fully migrate 63 Roman fix ui issues + 59 PDTnhah [Issue-3806] Fix UI bug 53 Dominhquangdev update Bridge code - 40 PDTnhah [Issue-3747] Extension - Update Network details screen for TON - 26 tunghp2002 [Fix] - Handle kodadot NFT - 25 S2kael + 28 tunghp2002 [Chore] Change cache + 26 S2kael 10 Trang Trịnh api get karura and acala nfts 9 Minh Le 9 minhld1029 [#115] [ForgetAccount] catch exception refList undefined diff --git a/package.json b/package.json index baf4d2f459d..a7639cff749 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "url": "https://github.com/Koniverse/Subwallet-V2.git" }, "sideEffects": false, - "version": "1.3.3", + "version": "1.3.4-0", "workspaces": [ "packages/*" ], diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index e3dfe27c57b..dfcd214978f 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -17,7 +17,7 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.3-0", + "version": "1.3.4-0", "main": "index.js", "dependencies": { "@acala-network/api": "^5.0.2", @@ -56,10 +56,10 @@ "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", "@subwallet/chain-list": "0.2.91", - "@subwallet/extension-base": "^1.3.3-0", - "@subwallet/extension-chains": "^1.3.3-0", - "@subwallet/extension-dapp": "^1.3.3-0", - "@subwallet/extension-inject": "^1.3.3-0", + "@subwallet/extension-base": "^1.3.4-0", + "@subwallet/extension-chains": "^1.3.4-0", + "@subwallet/extension-dapp": "^1.3.4-0", + "@subwallet/extension-inject": "^1.3.4-0", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/ui-keyring": "^0.1.8-beta.0", "@ton/core": "^0.56.3", @@ -104,7 +104,7 @@ "web3-utils": "^1.10.0" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.3.3-0", + "@subwallet/extension-mocks": "^1.3.4-0", "@types/uuid": "^9.0.1" } } diff --git a/packages/extension-base/src/packageInfo.ts b/packages/extension-base/src/packageInfo.ts index af63c3cb857..6fcaf598466 100644 --- a/packages/extension-base/src/packageInfo.ts +++ b/packages/extension-base/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-base', path: 'auto', type: 'auto', version: '1.3.3-0' }; +export const packageInfo = { name: '@subwallet/extension-base', path: 'auto', type: 'auto', version: '1.3.4-0' }; diff --git a/packages/extension-chains/package.json b/packages/extension-chains/package.json index a609dca12f6..83b57f3fffb 100644 --- a/packages/extension-chains/package.json +++ b/packages/extension-chains/package.json @@ -17,14 +17,14 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.3-0", + "version": "1.3.4-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@polkadot/networks": "^12.6.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/extension-inject": "^1.3.3-0" + "@subwallet/extension-inject": "^1.3.4-0" }, "peerDependencies": { "@polkadot/api": "*", diff --git a/packages/extension-chains/src/packageInfo.ts b/packages/extension-chains/src/packageInfo.ts index 78ce779280c..696e2c883a6 100644 --- a/packages/extension-chains/src/packageInfo.ts +++ b/packages/extension-chains/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-chains', path: 'auto', type: 'auto', version: '1.3.3-0' }; +export const packageInfo = { name: '@subwallet/extension-chains', path: 'auto', type: 'auto', version: '1.3.4-0' }; diff --git a/packages/extension-compat-metamask/package.json b/packages/extension-compat-metamask/package.json index 280a9319c3b..6b149d1fd37 100644 --- a/packages/extension-compat-metamask/package.json +++ b/packages/extension-compat-metamask/package.json @@ -17,14 +17,14 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.3-0", + "version": "1.3.4-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@metamask/detect-provider": "^1.2.0", "@polkadot/types": "^11.0.3", "@polkadot/util": "^12.6.2", - "@subwallet/extension-inject": "^1.3.3-0", + "@subwallet/extension-inject": "^1.3.4-0", "web3": "^1.10.0" }, "peerDependencies": { diff --git a/packages/extension-compat-metamask/src/packageInfo.ts b/packages/extension-compat-metamask/src/packageInfo.ts index 26146a5ecac..d3333bec0f2 100644 --- a/packages/extension-compat-metamask/src/packageInfo.ts +++ b/packages/extension-compat-metamask/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-compat-metamask', path: 'auto', type: 'auto', version: '1.3.3-0' }; +export const packageInfo = { name: '@subwallet/extension-compat-metamask', path: 'auto', type: 'auto', version: '1.3.4-0' }; diff --git a/packages/extension-dapp/package.json b/packages/extension-dapp/package.json index 04b3d4acad5..2962c2e4ea2 100644 --- a/packages/extension-dapp/package.json +++ b/packages/extension-dapp/package.json @@ -17,13 +17,13 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.3-0", + "version": "1.3.4-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/extension-inject": "^1.3.3-0" + "@subwallet/extension-inject": "^1.3.4-0" }, "peerDependencies": { "@polkadot/api": "*", diff --git a/packages/extension-dapp/src/packageInfo.ts b/packages/extension-dapp/src/packageInfo.ts index 2a4604b5590..fc65035c460 100644 --- a/packages/extension-dapp/src/packageInfo.ts +++ b/packages/extension-dapp/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-dapp', path: 'auto', type: 'auto', version: '1.3.3-0' }; +export const packageInfo = { name: '@subwallet/extension-dapp', path: 'auto', type: 'auto', version: '1.3.4-0' }; diff --git a/packages/extension-inject/package.json b/packages/extension-inject/package.json index dc4efcadac5..67e9f9610e9 100644 --- a/packages/extension-inject/package.json +++ b/packages/extension-inject/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.3.3-0", + "version": "1.3.4-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", diff --git a/packages/extension-inject/src/packageInfo.ts b/packages/extension-inject/src/packageInfo.ts index 07824c0fd3a..ace5cbebda1 100644 --- a/packages/extension-inject/src/packageInfo.ts +++ b/packages/extension-inject/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-inject', path: 'auto', type: 'auto', version: '1.3.3-0' }; +export const packageInfo = { name: '@subwallet/extension-inject', path: 'auto', type: 'auto', version: '1.3.4-0' }; diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index 5c7164fa3ca..73c91f76e0d 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.3.3-0", + "version": "1.3.4-0", "dependencies": { "@babel/runtime": "^7.20.6", "@coinbase/cbpay-js": "^1.7.0", @@ -35,10 +35,10 @@ "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", "@subwallet/chain-list": "0.2.91", - "@subwallet/extension-base": "^1.3.3-0", - "@subwallet/extension-chains": "^1.3.3-0", - "@subwallet/extension-dapp": "^1.3.3-0", - "@subwallet/extension-inject": "^1.3.3-0", + "@subwallet/extension-base": "^1.3.4-0", + "@subwallet/extension-chains": "^1.3.4-0", + "@subwallet/extension-dapp": "^1.3.4-0", + "@subwallet/extension-inject": "^1.3.4-0", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b77", "@subwallet/ui-keyring": "^0.1.8-beta.0", @@ -87,7 +87,7 @@ "usehooks-ts": "^2.9.1" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.3.3-0", + "@subwallet/extension-mocks": "^1.3.4-0", "@types/bn.js": "^5.1.1", "@types/enzyme": "^3.10.12", "@types/enzyme-adapter-react-16": "^1.0.6", diff --git a/packages/extension-koni/package.json b/packages/extension-koni/package.json index 37797fab271..b83f82894f7 100644 --- a/packages/extension-koni/package.json +++ b/packages/extension-koni/package.json @@ -14,12 +14,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.3-0", + "version": "1.3.4-0", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.3.3-0", - "@subwallet/extension-inject": "^1.3.3-0", - "@subwallet/extension-koni-ui": "^1.3.3-0" + "@subwallet/extension-base": "^1.3.4-0", + "@subwallet/extension-inject": "^1.3.4-0", + "@subwallet/extension-koni-ui": "^1.3.4-0" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/packages/extension-koni/public/locales/en/translation.json b/packages/extension-koni/public/locales/en/translation.json index 1595abea75b..98ed6adbfa5 100644 --- a/packages/extension-koni/public/locales/en/translation.json +++ b/packages/extension-koni/public/locales/en/translation.json @@ -1373,5 +1373,38 @@ "Unsupported address": "", "Failed to import. Incompatible NFT": "", "TON wallets have multiple versions, each with its own wallet address and balance. Change versions if you don't see balances": "", - "Change wallet address & version": "" + "Change wallet address & version": "", + "Mark as unread": "", + "Mark as read": "", + "Claim token": "", + "Claim tokens": "", + "Claim confirmation": "", + "Claim token transaction": "", + "Browser notifications": "", + "View notifications in": "", + "In-app notifications": "", + "Unread": "", + "Read": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start withdrawing your funds": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start claiming your funds": "", + "You’ve {{action}} tokens": "", + "You’ve already {{action}} your tokens. Check for unread notifications to stay updated on any important": "", + "Your notifications will appear here": "", + "No notifications yet": "", + "Enable notifications": "", + "Enable notifications now to not miss anything!": "", + "Notifications are disabled": "", + "Mark all as read": "", + "Search notification": "", + "Withdraw tokens": "", + "Claim AVAIL bridge": "", + "Today": "", + "This week": "", + "This month": "", + "Notification settings": "", + "Show notifications about": "", + "Save settings": "", + "Invalid asset ID": "", + "Please type or paste an asset ID": "", + "Asset ID": "" } diff --git a/packages/extension-koni/public/locales/ja/translation.json b/packages/extension-koni/public/locales/ja/translation.json index 1653afefd5a..b5e1e24eda1 100644 --- a/packages/extension-koni/public/locales/ja/translation.json +++ b/packages/extension-koni/public/locales/ja/translation.json @@ -1373,5 +1373,38 @@ "Unsupported address": "", "Failed to import. Incompatible NFT": "", "TON wallets have multiple versions, each with its own wallet address and balance. Change versions if you don't see balances": "", - "Change wallet address & version": "" + "Change wallet address & version": "", + "Mark as unread": "", + "Mark as read": "", + "Claim token": "", + "Claim tokens": "", + "Claim confirmation": "", + "Claim token transaction": "", + "Browser notifications": "", + "View notifications in": "", + "In-app notifications": "", + "Unread": "", + "Read": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start withdrawing your funds": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start claiming your funds": "", + "You’ve {{action}} tokens": "", + "You’ve already {{action}} your tokens. Check for unread notifications to stay updated on any important": "", + "Your notifications will appear here": "", + "No notifications yet": "", + "Enable notifications": "", + "Enable notifications now to not miss anything!": "", + "Notifications are disabled": "", + "Mark all as read": "", + "Search notification": "", + "Withdraw tokens": "", + "Claim AVAIL bridge": "", + "Today": "", + "This week": "", + "This month": "", + "Notification settings": "", + "Show notifications about": "", + "Save settings": "", + "Invalid asset ID": "", + "Please type or paste an asset ID": "", + "Asset ID": "" } diff --git a/packages/extension-koni/public/locales/ru/translation.json b/packages/extension-koni/public/locales/ru/translation.json index 618a9edb076..a85ad52adfb 100644 --- a/packages/extension-koni/public/locales/ru/translation.json +++ b/packages/extension-koni/public/locales/ru/translation.json @@ -1373,5 +1373,38 @@ "Unsupported address": "", "Failed to import. Incompatible NFT": "", "TON wallets have multiple versions, each with its own wallet address and balance. Change versions if you don't see balances": "", - "Change wallet address & version": "" + "Change wallet address & version": "", + "Mark as unread": "", + "Mark as read": "", + "Claim token": "", + "Claim tokens": "", + "Claim confirmation": "", + "Claim token transaction": "", + "Browser notifications": "", + "View notifications in": "", + "In-app notifications": "", + "Unread": "", + "Read": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start withdrawing your funds": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start claiming your funds": "", + "You’ve {{action}} tokens": "", + "You’ve already {{action}} your tokens. Check for unread notifications to stay updated on any important": "", + "Your notifications will appear here": "", + "No notifications yet": "", + "Enable notifications": "", + "Enable notifications now to not miss anything!": "", + "Notifications are disabled": "", + "Mark all as read": "", + "Search notification": "", + "Withdraw tokens": "", + "Claim AVAIL bridge": "", + "Today": "", + "This week": "", + "This month": "", + "Notification settings": "", + "Show notifications about": "", + "Save settings": "", + "Invalid asset ID": "", + "Please type or paste an asset ID": "", + "Asset ID": "" } diff --git a/packages/extension-koni/public/locales/vi/translation.json b/packages/extension-koni/public/locales/vi/translation.json index d2276af156a..b496f6f5f9b 100644 --- a/packages/extension-koni/public/locales/vi/translation.json +++ b/packages/extension-koni/public/locales/vi/translation.json @@ -1373,5 +1373,38 @@ "Unsupported address": "", "Failed to import. Incompatible NFT": "", "TON wallets have multiple versions, each with its own wallet address and balance. Change versions if you don't see balances": "", - "Change wallet address & version": "" + "Change wallet address & version": "", + "Mark as unread": "", + "Mark as read": "", + "Claim token": "", + "Claim tokens": "", + "Claim confirmation": "", + "Claim token transaction": "", + "Browser notifications": "", + "View notifications in": "", + "In-app notifications": "", + "Unread": "", + "Read": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start withdrawing your funds": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start claiming your funds": "", + "You’ve {{action}} tokens": "", + "You’ve already {{action}} your tokens. Check for unread notifications to stay updated on any important": "", + "Your notifications will appear here": "", + "No notifications yet": "", + "Enable notifications": "", + "Enable notifications now to not miss anything!": "", + "Notifications are disabled": "", + "Mark all as read": "", + "Search notification": "", + "Withdraw tokens": "", + "Claim AVAIL bridge": "", + "Today": "", + "This week": "", + "This month": "", + "Notification settings": "", + "Show notifications about": "", + "Save settings": "", + "Invalid asset ID": "", + "Please type or paste an asset ID": "", + "Asset ID": "" } diff --git a/packages/extension-koni/public/locales/zh/translation.json b/packages/extension-koni/public/locales/zh/translation.json index f5bb1ec9f20..f895cb44248 100644 --- a/packages/extension-koni/public/locales/zh/translation.json +++ b/packages/extension-koni/public/locales/zh/translation.json @@ -1373,5 +1373,38 @@ "Unsupported address": "", "Failed to import. Incompatible NFT": "", "TON wallets have multiple versions, each with its own wallet address and balance. Change versions if you don't see balances": "", - "Change wallet address & version": "" + "Change wallet address & version": "", + "Mark as unread": "", + "Mark as read": "", + "Claim token": "", + "Claim tokens": "", + "Claim confirmation": "", + "Claim token transaction": "", + "Browser notifications": "", + "View notifications in": "", + "In-app notifications": "", + "Unread": "", + "Read": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start withdrawing your funds": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start claiming your funds": "", + "You’ve {{action}} tokens": "", + "You’ve already {{action}} your tokens. Check for unread notifications to stay updated on any important": "", + "Your notifications will appear here": "", + "No notifications yet": "", + "Enable notifications": "", + "Enable notifications now to not miss anything!": "", + "Notifications are disabled": "", + "Mark all as read": "", + "Search notification": "", + "Withdraw tokens": "", + "Claim AVAIL bridge": "", + "Today": "", + "This week": "", + "This month": "", + "Notification settings": "", + "Show notifications about": "", + "Save settings": "", + "Invalid asset ID": "", + "Please type or paste an asset ID": "", + "Asset ID": "" } diff --git a/packages/extension-koni/src/packageInfo.ts b/packages/extension-koni/src/packageInfo.ts index 49a4841063b..7d5239681ec 100644 --- a/packages/extension-koni/src/packageInfo.ts +++ b/packages/extension-koni/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-koni', path: 'auto', type: 'auto', version: '1.3.3-0' }; +export const packageInfo = { name: '@subwallet/extension-koni', path: 'auto', type: 'auto', version: '1.3.4-0' }; diff --git a/packages/extension-mocks/package.json b/packages/extension-mocks/package.json index df5110ce66b..5294576c802 100644 --- a/packages/extension-mocks/package.json +++ b/packages/extension-mocks/package.json @@ -14,7 +14,7 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.3-0", + "version": "1.3.4-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index ecb4a3e7fe6..1df6471a45c 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.3.3-0", + "version": "1.3.4-0", "dependencies": { "@babel/runtime": "^7.20.6", "@coinbase/cbpay-js": "^1.7.0", @@ -36,10 +36,10 @@ "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", "@subwallet/chain-list": "0.2.91", - "@subwallet/extension-base": "^1.3.3-0", - "@subwallet/extension-chains": "^1.3.3-0", - "@subwallet/extension-dapp": "^1.3.3-0", - "@subwallet/extension-inject": "^1.3.3-0", + "@subwallet/extension-base": "^1.3.4-0", + "@subwallet/extension-chains": "^1.3.4-0", + "@subwallet/extension-dapp": "^1.3.4-0", + "@subwallet/extension-inject": "^1.3.4-0", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "^5.1.2-b77", "@subwallet/ui-keyring": "^0.1.8-beta.0", @@ -88,7 +88,7 @@ "usehooks-ts": "^2.9.1" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.3.3-0", + "@subwallet/extension-mocks": "^1.3.4-0", "@types/bn.js": "^5.1.1", "@types/enzyme": "^3.10.12", "@types/enzyme-adapter-react-16": "^1.0.6", diff --git a/packages/web-runner/package.json b/packages/web-runner/package.json index 124f476ec2b..7a145372329 100644 --- a/packages/web-runner/package.json +++ b/packages/web-runner/package.json @@ -14,12 +14,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.3-0", + "version": "1.3.4-0", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.3.3-0", - "@subwallet/extension-inject": "^1.3.3-0", - "@subwallet/extension-koni-ui": "^1.3.3-0" + "@subwallet/extension-base": "^1.3.4-0", + "@subwallet/extension-inject": "^1.3.4-0", + "@subwallet/extension-koni-ui": "^1.3.4-0" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/packages/web-runner/public/locales/en/translation.json b/packages/web-runner/public/locales/en/translation.json index 1595abea75b..98ed6adbfa5 100644 --- a/packages/web-runner/public/locales/en/translation.json +++ b/packages/web-runner/public/locales/en/translation.json @@ -1373,5 +1373,38 @@ "Unsupported address": "", "Failed to import. Incompatible NFT": "", "TON wallets have multiple versions, each with its own wallet address and balance. Change versions if you don't see balances": "", - "Change wallet address & version": "" + "Change wallet address & version": "", + "Mark as unread": "", + "Mark as read": "", + "Claim token": "", + "Claim tokens": "", + "Claim confirmation": "", + "Claim token transaction": "", + "Browser notifications": "", + "View notifications in": "", + "In-app notifications": "", + "Unread": "", + "Read": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start withdrawing your funds": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start claiming your funds": "", + "You’ve {{action}} tokens": "", + "You’ve already {{action}} your tokens. Check for unread notifications to stay updated on any important": "", + "Your notifications will appear here": "", + "No notifications yet": "", + "Enable notifications": "", + "Enable notifications now to not miss anything!": "", + "Notifications are disabled": "", + "Mark all as read": "", + "Search notification": "", + "Withdraw tokens": "", + "Claim AVAIL bridge": "", + "Today": "", + "This week": "", + "This month": "", + "Notification settings": "", + "Show notifications about": "", + "Save settings": "", + "Invalid asset ID": "", + "Please type or paste an asset ID": "", + "Asset ID": "" } diff --git a/packages/web-runner/public/locales/ja/translation.json b/packages/web-runner/public/locales/ja/translation.json index 1653afefd5a..b5e1e24eda1 100644 --- a/packages/web-runner/public/locales/ja/translation.json +++ b/packages/web-runner/public/locales/ja/translation.json @@ -1373,5 +1373,38 @@ "Unsupported address": "", "Failed to import. Incompatible NFT": "", "TON wallets have multiple versions, each with its own wallet address and balance. Change versions if you don't see balances": "", - "Change wallet address & version": "" + "Change wallet address & version": "", + "Mark as unread": "", + "Mark as read": "", + "Claim token": "", + "Claim tokens": "", + "Claim confirmation": "", + "Claim token transaction": "", + "Browser notifications": "", + "View notifications in": "", + "In-app notifications": "", + "Unread": "", + "Read": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start withdrawing your funds": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start claiming your funds": "", + "You’ve {{action}} tokens": "", + "You’ve already {{action}} your tokens. Check for unread notifications to stay updated on any important": "", + "Your notifications will appear here": "", + "No notifications yet": "", + "Enable notifications": "", + "Enable notifications now to not miss anything!": "", + "Notifications are disabled": "", + "Mark all as read": "", + "Search notification": "", + "Withdraw tokens": "", + "Claim AVAIL bridge": "", + "Today": "", + "This week": "", + "This month": "", + "Notification settings": "", + "Show notifications about": "", + "Save settings": "", + "Invalid asset ID": "", + "Please type or paste an asset ID": "", + "Asset ID": "" } diff --git a/packages/web-runner/public/locales/ru/translation.json b/packages/web-runner/public/locales/ru/translation.json index 618a9edb076..a85ad52adfb 100644 --- a/packages/web-runner/public/locales/ru/translation.json +++ b/packages/web-runner/public/locales/ru/translation.json @@ -1373,5 +1373,38 @@ "Unsupported address": "", "Failed to import. Incompatible NFT": "", "TON wallets have multiple versions, each with its own wallet address and balance. Change versions if you don't see balances": "", - "Change wallet address & version": "" + "Change wallet address & version": "", + "Mark as unread": "", + "Mark as read": "", + "Claim token": "", + "Claim tokens": "", + "Claim confirmation": "", + "Claim token transaction": "", + "Browser notifications": "", + "View notifications in": "", + "In-app notifications": "", + "Unread": "", + "Read": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start withdrawing your funds": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start claiming your funds": "", + "You’ve {{action}} tokens": "", + "You’ve already {{action}} your tokens. Check for unread notifications to stay updated on any important": "", + "Your notifications will appear here": "", + "No notifications yet": "", + "Enable notifications": "", + "Enable notifications now to not miss anything!": "", + "Notifications are disabled": "", + "Mark all as read": "", + "Search notification": "", + "Withdraw tokens": "", + "Claim AVAIL bridge": "", + "Today": "", + "This week": "", + "This month": "", + "Notification settings": "", + "Show notifications about": "", + "Save settings": "", + "Invalid asset ID": "", + "Please type or paste an asset ID": "", + "Asset ID": "" } diff --git a/packages/web-runner/public/locales/vi/translation.json b/packages/web-runner/public/locales/vi/translation.json index d2276af156a..b496f6f5f9b 100644 --- a/packages/web-runner/public/locales/vi/translation.json +++ b/packages/web-runner/public/locales/vi/translation.json @@ -1373,5 +1373,38 @@ "Unsupported address": "", "Failed to import. Incompatible NFT": "", "TON wallets have multiple versions, each with its own wallet address and balance. Change versions if you don't see balances": "", - "Change wallet address & version": "" + "Change wallet address & version": "", + "Mark as unread": "", + "Mark as read": "", + "Claim token": "", + "Claim tokens": "", + "Claim confirmation": "", + "Claim token transaction": "", + "Browser notifications": "", + "View notifications in": "", + "In-app notifications": "", + "Unread": "", + "Read": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start withdrawing your funds": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start claiming your funds": "", + "You’ve {{action}} tokens": "", + "You’ve already {{action}} your tokens. Check for unread notifications to stay updated on any important": "", + "Your notifications will appear here": "", + "No notifications yet": "", + "Enable notifications": "", + "Enable notifications now to not miss anything!": "", + "Notifications are disabled": "", + "Mark all as read": "", + "Search notification": "", + "Withdraw tokens": "", + "Claim AVAIL bridge": "", + "Today": "", + "This week": "", + "This month": "", + "Notification settings": "", + "Show notifications about": "", + "Save settings": "", + "Invalid asset ID": "", + "Please type or paste an asset ID": "", + "Asset ID": "" } diff --git a/packages/web-runner/public/locales/zh/translation.json b/packages/web-runner/public/locales/zh/translation.json index f5bb1ec9f20..f895cb44248 100644 --- a/packages/web-runner/public/locales/zh/translation.json +++ b/packages/web-runner/public/locales/zh/translation.json @@ -1373,5 +1373,38 @@ "Unsupported address": "", "Failed to import. Incompatible NFT": "", "TON wallets have multiple versions, each with its own wallet address and balance. Change versions if you don't see balances": "", - "Change wallet address & version": "" + "Change wallet address & version": "", + "Mark as unread": "", + "Mark as read": "", + "Claim token": "", + "Claim tokens": "", + "Claim confirmation": "", + "Claim token transaction": "", + "Browser notifications": "", + "View notifications in": "", + "In-app notifications": "", + "Unread": "", + "Read": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start withdrawing your funds": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start claiming your funds": "", + "You’ve {{action}} tokens": "", + "You’ve already {{action}} your tokens. Check for unread notifications to stay updated on any important": "", + "Your notifications will appear here": "", + "No notifications yet": "", + "Enable notifications": "", + "Enable notifications now to not miss anything!": "", + "Notifications are disabled": "", + "Mark all as read": "", + "Search notification": "", + "Withdraw tokens": "", + "Claim AVAIL bridge": "", + "Today": "", + "This week": "", + "This month": "", + "Notification settings": "", + "Show notifications about": "", + "Save settings": "", + "Invalid asset ID": "", + "Please type or paste an asset ID": "", + "Asset ID": "" } diff --git a/packages/webapp/package.json b/packages/webapp/package.json index f4adf170e3e..0676d59adc3 100644 --- a/packages/webapp/package.json +++ b/packages/webapp/package.json @@ -15,12 +15,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.3-0", + "version": "1.3.4-0", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.3.3-0", - "@subwallet/extension-inject": "^1.3.3-0", - "@subwallet/extension-web-ui": "^1.3.3-0" + "@subwallet/extension-base": "^1.3.4-0", + "@subwallet/extension-inject": "^1.3.4-0", + "@subwallet/extension-web-ui": "^1.3.4-0" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/packages/webapp/public/locales/en/translation.json b/packages/webapp/public/locales/en/translation.json index 1595abea75b..98ed6adbfa5 100644 --- a/packages/webapp/public/locales/en/translation.json +++ b/packages/webapp/public/locales/en/translation.json @@ -1373,5 +1373,38 @@ "Unsupported address": "", "Failed to import. Incompatible NFT": "", "TON wallets have multiple versions, each with its own wallet address and balance. Change versions if you don't see balances": "", - "Change wallet address & version": "" + "Change wallet address & version": "", + "Mark as unread": "", + "Mark as read": "", + "Claim token": "", + "Claim tokens": "", + "Claim confirmation": "", + "Claim token transaction": "", + "Browser notifications": "", + "View notifications in": "", + "In-app notifications": "", + "Unread": "", + "Read": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start withdrawing your funds": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start claiming your funds": "", + "You’ve {{action}} tokens": "", + "You’ve already {{action}} your tokens. Check for unread notifications to stay updated on any important": "", + "Your notifications will appear here": "", + "No notifications yet": "", + "Enable notifications": "", + "Enable notifications now to not miss anything!": "", + "Notifications are disabled": "", + "Mark all as read": "", + "Search notification": "", + "Withdraw tokens": "", + "Claim AVAIL bridge": "", + "Today": "", + "This week": "", + "This month": "", + "Notification settings": "", + "Show notifications about": "", + "Save settings": "", + "Invalid asset ID": "", + "Please type or paste an asset ID": "", + "Asset ID": "" } diff --git a/packages/webapp/public/locales/ja/translation.json b/packages/webapp/public/locales/ja/translation.json index 1653afefd5a..b5e1e24eda1 100644 --- a/packages/webapp/public/locales/ja/translation.json +++ b/packages/webapp/public/locales/ja/translation.json @@ -1373,5 +1373,38 @@ "Unsupported address": "", "Failed to import. Incompatible NFT": "", "TON wallets have multiple versions, each with its own wallet address and balance. Change versions if you don't see balances": "", - "Change wallet address & version": "" + "Change wallet address & version": "", + "Mark as unread": "", + "Mark as read": "", + "Claim token": "", + "Claim tokens": "", + "Claim confirmation": "", + "Claim token transaction": "", + "Browser notifications": "", + "View notifications in": "", + "In-app notifications": "", + "Unread": "", + "Read": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start withdrawing your funds": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start claiming your funds": "", + "You’ve {{action}} tokens": "", + "You’ve already {{action}} your tokens. Check for unread notifications to stay updated on any important": "", + "Your notifications will appear here": "", + "No notifications yet": "", + "Enable notifications": "", + "Enable notifications now to not miss anything!": "", + "Notifications are disabled": "", + "Mark all as read": "", + "Search notification": "", + "Withdraw tokens": "", + "Claim AVAIL bridge": "", + "Today": "", + "This week": "", + "This month": "", + "Notification settings": "", + "Show notifications about": "", + "Save settings": "", + "Invalid asset ID": "", + "Please type or paste an asset ID": "", + "Asset ID": "" } diff --git a/packages/webapp/public/locales/ru/translation.json b/packages/webapp/public/locales/ru/translation.json index 618a9edb076..a85ad52adfb 100644 --- a/packages/webapp/public/locales/ru/translation.json +++ b/packages/webapp/public/locales/ru/translation.json @@ -1373,5 +1373,38 @@ "Unsupported address": "", "Failed to import. Incompatible NFT": "", "TON wallets have multiple versions, each with its own wallet address and balance. Change versions if you don't see balances": "", - "Change wallet address & version": "" + "Change wallet address & version": "", + "Mark as unread": "", + "Mark as read": "", + "Claim token": "", + "Claim tokens": "", + "Claim confirmation": "", + "Claim token transaction": "", + "Browser notifications": "", + "View notifications in": "", + "In-app notifications": "", + "Unread": "", + "Read": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start withdrawing your funds": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start claiming your funds": "", + "You’ve {{action}} tokens": "", + "You’ve already {{action}} your tokens. Check for unread notifications to stay updated on any important": "", + "Your notifications will appear here": "", + "No notifications yet": "", + "Enable notifications": "", + "Enable notifications now to not miss anything!": "", + "Notifications are disabled": "", + "Mark all as read": "", + "Search notification": "", + "Withdraw tokens": "", + "Claim AVAIL bridge": "", + "Today": "", + "This week": "", + "This month": "", + "Notification settings": "", + "Show notifications about": "", + "Save settings": "", + "Invalid asset ID": "", + "Please type or paste an asset ID": "", + "Asset ID": "" } diff --git a/packages/webapp/public/locales/vi/translation.json b/packages/webapp/public/locales/vi/translation.json index d2276af156a..b496f6f5f9b 100644 --- a/packages/webapp/public/locales/vi/translation.json +++ b/packages/webapp/public/locales/vi/translation.json @@ -1373,5 +1373,38 @@ "Unsupported address": "", "Failed to import. Incompatible NFT": "", "TON wallets have multiple versions, each with its own wallet address and balance. Change versions if you don't see balances": "", - "Change wallet address & version": "" + "Change wallet address & version": "", + "Mark as unread": "", + "Mark as read": "", + "Claim token": "", + "Claim tokens": "", + "Claim confirmation": "", + "Claim token transaction": "", + "Browser notifications": "", + "View notifications in": "", + "In-app notifications": "", + "Unread": "", + "Read": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start withdrawing your funds": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start claiming your funds": "", + "You’ve {{action}} tokens": "", + "You’ve already {{action}} your tokens. Check for unread notifications to stay updated on any important": "", + "Your notifications will appear here": "", + "No notifications yet": "", + "Enable notifications": "", + "Enable notifications now to not miss anything!": "", + "Notifications are disabled": "", + "Mark all as read": "", + "Search notification": "", + "Withdraw tokens": "", + "Claim AVAIL bridge": "", + "Today": "", + "This week": "", + "This month": "", + "Notification settings": "", + "Show notifications about": "", + "Save settings": "", + "Invalid asset ID": "", + "Please type or paste an asset ID": "", + "Asset ID": "" } diff --git a/packages/webapp/public/locales/zh/translation.json b/packages/webapp/public/locales/zh/translation.json index f5bb1ec9f20..f895cb44248 100644 --- a/packages/webapp/public/locales/zh/translation.json +++ b/packages/webapp/public/locales/zh/translation.json @@ -1373,5 +1373,38 @@ "Unsupported address": "", "Failed to import. Incompatible NFT": "", "TON wallets have multiple versions, each with its own wallet address and balance. Change versions if you don't see balances": "", - "Change wallet address & version": "" + "Change wallet address & version": "", + "Mark as unread": "", + "Mark as read": "", + "Claim token": "", + "Claim tokens": "", + "Claim confirmation": "", + "Claim token transaction": "", + "Browser notifications": "", + "View notifications in": "", + "In-app notifications": "", + "Unread": "", + "Read": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start withdrawing your funds": "", + "{{networkName}} network is currently disabled. Enable the network and then re-click the notification to start claiming your funds": "", + "You’ve {{action}} tokens": "", + "You’ve already {{action}} your tokens. Check for unread notifications to stay updated on any important": "", + "Your notifications will appear here": "", + "No notifications yet": "", + "Enable notifications": "", + "Enable notifications now to not miss anything!": "", + "Notifications are disabled": "", + "Mark all as read": "", + "Search notification": "", + "Withdraw tokens": "", + "Claim AVAIL bridge": "", + "Today": "", + "This week": "", + "This month": "", + "Notification settings": "", + "Show notifications about": "", + "Save settings": "", + "Invalid asset ID": "", + "Please type or paste an asset ID": "", + "Asset ID": "" } diff --git a/yarn.lock b/yarn.lock index e45a903f34b..0ba752196e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6276,7 +6276,7 @@ __metadata: languageName: node linkType: hard -"@subwallet/extension-base@^1.3.3-0, @subwallet/extension-base@workspace:packages/extension-base": +"@subwallet/extension-base@^1.3.4-0, @subwallet/extension-base@workspace:packages/extension-base": version: 0.0.0-use.local resolution: "@subwallet/extension-base@workspace:packages/extension-base" dependencies: @@ -6316,11 +6316,11 @@ __metadata: "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 "@subwallet/chain-list": 0.2.91 - "@subwallet/extension-base": ^1.3.3-0 - "@subwallet/extension-chains": ^1.3.3-0 - "@subwallet/extension-dapp": ^1.3.3-0 - "@subwallet/extension-inject": ^1.3.3-0 - "@subwallet/extension-mocks": ^1.3.3-0 + "@subwallet/extension-base": ^1.3.4-0 + "@subwallet/extension-chains": ^1.3.4-0 + "@subwallet/extension-dapp": ^1.3.4-0 + "@subwallet/extension-inject": ^1.3.4-0 + "@subwallet/extension-mocks": ^1.3.4-0 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/ui-keyring": ^0.1.8-beta.0 "@ton/core": ^0.56.3 @@ -6367,7 +6367,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-chains@^1.3.3-0, @subwallet/extension-chains@workspace:packages/extension-chains": +"@subwallet/extension-chains@^1.3.4-0, @subwallet/extension-chains@workspace:packages/extension-chains": version: 0.0.0-use.local resolution: "@subwallet/extension-chains@workspace:packages/extension-chains" dependencies: @@ -6375,7 +6375,7 @@ __metadata: "@polkadot/networks": ^12.6.2 "@polkadot/util": ^12.6.2 "@polkadot/util-crypto": ^12.6.2 - "@subwallet/extension-inject": ^1.3.3-0 + "@subwallet/extension-inject": ^1.3.4-0 peerDependencies: "@polkadot/api": "*" "@polkadot/types": "*" @@ -6390,21 +6390,21 @@ __metadata: "@metamask/detect-provider": ^1.2.0 "@polkadot/types": ^11.0.3 "@polkadot/util": ^12.6.2 - "@subwallet/extension-inject": ^1.3.3-0 + "@subwallet/extension-inject": ^1.3.4-0 web3: ^1.10.0 peerDependencies: "@polkadot/util": "*" languageName: unknown linkType: soft -"@subwallet/extension-dapp@^1.3.3-0, @subwallet/extension-dapp@workspace:packages/extension-dapp": +"@subwallet/extension-dapp@^1.3.4-0, @subwallet/extension-dapp@workspace:packages/extension-dapp": version: 0.0.0-use.local resolution: "@subwallet/extension-dapp@workspace:packages/extension-dapp" dependencies: "@babel/runtime": ^7.20.6 "@polkadot/util": ^12.6.2 "@polkadot/util-crypto": ^12.6.2 - "@subwallet/extension-inject": ^1.3.3-0 + "@subwallet/extension-inject": ^1.3.4-0 peerDependencies: "@polkadot/api": "*" "@polkadot/util": "*" @@ -6412,7 +6412,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-inject@^1.3.3-0, @subwallet/extension-inject@workspace:packages/extension-inject": +"@subwallet/extension-inject@^1.3.4-0, @subwallet/extension-inject@workspace:packages/extension-inject": version: 0.0.0-use.local resolution: "@subwallet/extension-inject@workspace:packages/extension-inject" dependencies: @@ -6431,7 +6431,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-koni-ui@^1.3.3-0, @subwallet/extension-koni-ui@workspace:packages/extension-koni-ui": +"@subwallet/extension-koni-ui@^1.3.4-0, @subwallet/extension-koni-ui@workspace:packages/extension-koni-ui": version: 0.0.0-use.local resolution: "@subwallet/extension-koni-ui@workspace:packages/extension-koni-ui" dependencies: @@ -6454,11 +6454,11 @@ __metadata: "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 "@subwallet/chain-list": 0.2.91 - "@subwallet/extension-base": ^1.3.3-0 - "@subwallet/extension-chains": ^1.3.3-0 - "@subwallet/extension-dapp": ^1.3.3-0 - "@subwallet/extension-inject": ^1.3.3-0 - "@subwallet/extension-mocks": ^1.3.3-0 + "@subwallet/extension-base": ^1.3.4-0 + "@subwallet/extension-chains": ^1.3.4-0 + "@subwallet/extension-dapp": ^1.3.4-0 + "@subwallet/extension-inject": ^1.3.4-0 + "@subwallet/extension-mocks": ^1.3.4-0 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/react-ui": 5.1.2-b77 "@subwallet/ui-keyring": ^0.1.8-beta.0 @@ -6531,9 +6531,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.3-0 - "@subwallet/extension-inject": ^1.3.3-0 - "@subwallet/extension-koni-ui": ^1.3.3-0 + "@subwallet/extension-base": ^1.3.4-0 + "@subwallet/extension-inject": ^1.3.4-0 + "@subwallet/extension-koni-ui": ^1.3.4-0 "@types/chrome": ^0.0.254 "@types/serviceworker": ^0.0.80 assert: ^2.0.0 @@ -6561,7 +6561,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-mocks@^1.3.3-0, @subwallet/extension-mocks@workspace:packages/extension-mocks": +"@subwallet/extension-mocks@^1.3.4-0, @subwallet/extension-mocks@workspace:packages/extension-mocks": version: 0.0.0-use.local resolution: "@subwallet/extension-mocks@workspace:packages/extension-mocks" dependencies: @@ -6570,7 +6570,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-web-ui@^1.3.3-0, @subwallet/extension-web-ui@workspace:packages/extension-web-ui": +"@subwallet/extension-web-ui@^1.3.4-0, @subwallet/extension-web-ui@workspace:packages/extension-web-ui": version: 0.0.0-use.local resolution: "@subwallet/extension-web-ui@workspace:packages/extension-web-ui" dependencies: @@ -6594,11 +6594,11 @@ __metadata: "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 "@subwallet/chain-list": 0.2.91 - "@subwallet/extension-base": ^1.3.3-0 - "@subwallet/extension-chains": ^1.3.3-0 - "@subwallet/extension-dapp": ^1.3.3-0 - "@subwallet/extension-inject": ^1.3.3-0 - "@subwallet/extension-mocks": ^1.3.3-0 + "@subwallet/extension-base": ^1.3.4-0 + "@subwallet/extension-chains": ^1.3.4-0 + "@subwallet/extension-dapp": ^1.3.4-0 + "@subwallet/extension-inject": ^1.3.4-0 + "@subwallet/extension-mocks": ^1.3.4-0 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/react-ui": ^5.1.2-b77 "@subwallet/ui-keyring": ^0.1.8-beta.0 @@ -6790,9 +6790,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.3-0 - "@subwallet/extension-inject": ^1.3.3-0 - "@subwallet/extension-koni-ui": ^1.3.3-0 + "@subwallet/extension-base": ^1.3.4-0 + "@subwallet/extension-inject": ^1.3.4-0 + "@subwallet/extension-koni-ui": ^1.3.4-0 assert: ^2.0.0 babel-loader: ^9.1.3 browser-resolve: ^2.0.0 @@ -6823,9 +6823,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.3-0 - "@subwallet/extension-inject": ^1.3.3-0 - "@subwallet/extension-web-ui": ^1.3.3-0 + "@subwallet/extension-base": ^1.3.4-0 + "@subwallet/extension-inject": ^1.3.4-0 + "@subwallet/extension-web-ui": ^1.3.4-0 assert: ^2.0.0 babel-loader: ^9.1.3 browser-resolve: ^2.0.0 From ab9d39fc87aeb16bcd656ed35f6afe8267b60774 Mon Sep 17 00:00:00 2001 From: AnhMTV Date: Mon, 28 Oct 2024 08:53:18 +0700 Subject: [PATCH 019/204] Release version 1.3.4 --- CHANGELOG.md | 13 +++++++++++++ package.json | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 632faa528ca..a27f57029fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # CHANGELOG +## 1.3.4 +Build date: Oct 28, 2024. + +Features & Update: +- Integrate Avail Bridge (#3423) +- Support Notification in app (#3507, #3515) +- Allow importing assets on Asset Hub (#3636) +- Update api key for TAO(Bittensor) (#3809) +- Update chain-list (#3806) + - Add support for Unichain testnet + - Update address prefix for Bifrost + + ## 1.3.3 Build date: Oct 16, 2024. diff --git a/package.json b/package.json index a7639cff749..c01b47485be 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "url": "https://github.com/Koniverse/Subwallet-V2.git" }, "sideEffects": false, - "version": "1.3.4-0", + "version": "1.3.4", "workspaces": [ "packages/*" ], From 4b898b40b9c59407ab9e1dc1004090310c5975c3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 28 Oct 2024 02:04:37 +0000 Subject: [PATCH 020/204] [CI Skip] release/stable 1.3.4 skip-checks: true --- .123trigger | 3 ++- CONTRIBUTORS | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.123trigger b/.123trigger index 0d8d675c206..6edaa829c7e 100644 --- a/.123trigger +++ b/.123trigger @@ -168,4 +168,5 @@ 1.2.31 1.2.32 1.3.2 -1.3.3 \ No newline at end of file +1.3.3 +1.3.4 \ No newline at end of file diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 59e8461353d..b7cc7a4130e 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,4 +1,4 @@ - 2871 AnhMTV + 2872 AnhMTV Release version 1.3.4 2546 Nam Phạm [Issue 3747] chore: fix eslint 2359 S2kael [Issue-3806] Update stable version for chain-list 869 lw-cdm [MasterAccount] Update logic to reorder account on select account modal From 8453927cbe6d68120ade567acf5f7b1febc0027f Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Mon, 28 Oct 2024 11:10:58 +0700 Subject: [PATCH 021/204] [Issue-3070] Refactor logic parsing data from contract response --- .../chain-service/handler/SubstrateChainHandler.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts b/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts index 24dee144f6f..218c7e2f876 100644 --- a/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts +++ b/packages/extension-base/src/services/chain-service/handler/SubstrateChainHandler.ts @@ -145,7 +145,7 @@ export class SubstrateChainHandler extends AbstractChainHandler { tokenSmartContract.decimals = decimalsResp.output ? (new BN((decimalsObj.Ok || decimalsObj.ok) as string | number)).toNumber() : 0; tokenSmartContract.symbol = decimalsResp.output ? (symbolObj.Ok as string || symbolObj.ok as string) : ''; - if (!tokenSmartContract.name || !tokenSmartContract.symbol) { + if (!tokenSmartContract.name || !tokenSmartContract.symbol || typeof tokenSmartContract.name === 'object' || typeof tokenSmartContract.symbol === 'object') { tokenSmartContract.contractError = true; } @@ -244,11 +244,6 @@ export class SubstrateChainHandler extends AbstractChainHandler { contractError: false }; - // let name = ''; - // let decimals: number | undefined = -1; - // let symbol = ''; - // let contractError = false; - const apiPromise = this.getSubstrateApiByChain(originChain).api; try { From 3b069ed9716399902b37ea5b1bc18a8e5e080729 Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Tue, 29 Oct 2024 16:59:17 +0700 Subject: [PATCH 022/204] [Issue-3815] Update chainlist --- package.json | 2 +- packages/extension-base/package.json | 2 +- packages/extension-koni-ui/package.json | 2 +- packages/extension-web-ui/package.json | 2 +- yarn.lock | 14 +++++++------- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index ece82dff201..83d80b398aa 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@polkadot/types-support": "^12.0.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/chain-list": "0.2.91", + "@subwallet/chain-list": "0.2.92-beta.1", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b79", "@subwallet/ui-keyring": "0.1.8-beta.0", diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index 6f0cecc4780..e19a17ca733 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -55,7 +55,7 @@ "@reduxjs/toolkit": "^1.9.1", "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", - "@subwallet/chain-list": "0.2.91", + "@subwallet/chain-list": "0.2.92-beta.1", "@subwallet/extension-base": "^1.3.2-0", "@subwallet/extension-chains": "^1.3.2-0", "@subwallet/extension-dapp": "^1.3.2-0", diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index 06fa9ec686b..688b4384429 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -34,7 +34,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.91", + "@subwallet/chain-list": "0.2.92-beta.1", "@subwallet/extension-base": "^1.3.2-0", "@subwallet/extension-chains": "^1.3.2-0", "@subwallet/extension-dapp": "^1.3.2-0", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index b79dee682b1..d9e64b1ab3c 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -35,7 +35,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.91", + "@subwallet/chain-list": "0.2.92-beta.1", "@subwallet/extension-base": "^1.3.2-0", "@subwallet/extension-chains": "^1.3.2-0", "@subwallet/extension-dapp": "^1.3.2-0", diff --git a/yarn.lock b/yarn.lock index b01be9c461c..3b32d060c6c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6265,14 +6265,14 @@ __metadata: languageName: node linkType: hard -"@subwallet/chain-list@npm:0.2.91": - version: 0.2.91 - resolution: "@subwallet/chain-list@npm:0.2.91" +"@subwallet/chain-list@npm:0.2.92-beta.1": + version: 0.2.92-beta.1 + resolution: "@subwallet/chain-list@npm:0.2.92-beta.1" dependencies: "@polkadot/dev": 0.67.167 "@polkadot/util": ^12.5.1 eventemitter3: ^5.0.1 - checksum: 9ea465c44509c540f6a0a1efc5f743c9621dbaeebd6b17ace6f6e45d312e13ac2fdbe27fba8690314be9bedf4a7859fade15d4fbf6be7a09fab5abb4f3c73780 + checksum: 46c33e7fca4a5c3403a45f459caff267cff52dbca083037b51a1605cb2132e35c8c2e4d99e2387e28499b2a6d4331b9a4fc047d06b12a9ffcbbb55ef899381ab languageName: node linkType: hard @@ -6315,7 +6315,7 @@ __metadata: "@reduxjs/toolkit": ^1.9.1 "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 - "@subwallet/chain-list": 0.2.91 + "@subwallet/chain-list": 0.2.92-beta.1 "@subwallet/extension-base": ^1.3.2-0 "@subwallet/extension-chains": ^1.3.2-0 "@subwallet/extension-dapp": ^1.3.2-0 @@ -6453,7 +6453,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.91 + "@subwallet/chain-list": 0.2.92-beta.1 "@subwallet/extension-base": ^1.3.2-0 "@subwallet/extension-chains": ^1.3.2-0 "@subwallet/extension-dapp": ^1.3.2-0 @@ -6593,7 +6593,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.91 + "@subwallet/chain-list": 0.2.92-beta.1 "@subwallet/extension-base": ^1.3.2-0 "@subwallet/extension-chains": ^1.3.2-0 "@subwallet/extension-dapp": ^1.3.2-0 From 24815f6c140ac5b568c5cf2477942bf944066c61 Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Tue, 29 Oct 2024 17:47:34 +0700 Subject: [PATCH 023/204] [Issue-3815] Update chainlist --- package.json | 2 +- packages/extension-base/package.json | 2 +- packages/extension-koni-ui/package.json | 2 +- packages/extension-web-ui/package.json | 2 +- yarn.lock | 14 +++++++------- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 83d80b398aa..2b3059cb22a 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@polkadot/types-support": "^12.0.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/chain-list": "0.2.92-beta.1", + "@subwallet/chain-list": "0.2.92-beta.2", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b79", "@subwallet/ui-keyring": "0.1.8-beta.0", diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index e19a17ca733..8915a14286c 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -55,7 +55,7 @@ "@reduxjs/toolkit": "^1.9.1", "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", - "@subwallet/chain-list": "0.2.92-beta.1", + "@subwallet/chain-list": "0.2.92-beta.2", "@subwallet/extension-base": "^1.3.2-0", "@subwallet/extension-chains": "^1.3.2-0", "@subwallet/extension-dapp": "^1.3.2-0", diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index 688b4384429..d444bb43798 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -34,7 +34,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.92-beta.1", + "@subwallet/chain-list": "0.2.92-beta.2", "@subwallet/extension-base": "^1.3.2-0", "@subwallet/extension-chains": "^1.3.2-0", "@subwallet/extension-dapp": "^1.3.2-0", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index d9e64b1ab3c..967929d552c 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -35,7 +35,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.92-beta.1", + "@subwallet/chain-list": "0.2.92-beta.2", "@subwallet/extension-base": "^1.3.2-0", "@subwallet/extension-chains": "^1.3.2-0", "@subwallet/extension-dapp": "^1.3.2-0", diff --git a/yarn.lock b/yarn.lock index 3b32d060c6c..a40c766afb7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6265,14 +6265,14 @@ __metadata: languageName: node linkType: hard -"@subwallet/chain-list@npm:0.2.92-beta.1": - version: 0.2.92-beta.1 - resolution: "@subwallet/chain-list@npm:0.2.92-beta.1" +"@subwallet/chain-list@npm:0.2.92-beta.2": + version: 0.2.92-beta.2 + resolution: "@subwallet/chain-list@npm:0.2.92-beta.2" dependencies: "@polkadot/dev": 0.67.167 "@polkadot/util": ^12.5.1 eventemitter3: ^5.0.1 - checksum: 46c33e7fca4a5c3403a45f459caff267cff52dbca083037b51a1605cb2132e35c8c2e4d99e2387e28499b2a6d4331b9a4fc047d06b12a9ffcbbb55ef899381ab + checksum: 990603d8f35c517184a256703d45af98c103eb5e073a32d548c65761616a4c86de3fd3fefe8f0258aa1202e807aa82e6b23f11630365c394396592f4ee790bef languageName: node linkType: hard @@ -6315,7 +6315,7 @@ __metadata: "@reduxjs/toolkit": ^1.9.1 "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 - "@subwallet/chain-list": 0.2.92-beta.1 + "@subwallet/chain-list": 0.2.92-beta.2 "@subwallet/extension-base": ^1.3.2-0 "@subwallet/extension-chains": ^1.3.2-0 "@subwallet/extension-dapp": ^1.3.2-0 @@ -6453,7 +6453,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.92-beta.1 + "@subwallet/chain-list": 0.2.92-beta.2 "@subwallet/extension-base": ^1.3.2-0 "@subwallet/extension-chains": ^1.3.2-0 "@subwallet/extension-dapp": ^1.3.2-0 @@ -6593,7 +6593,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.92-beta.1 + "@subwallet/chain-list": 0.2.92-beta.2 "@subwallet/extension-base": ^1.3.2-0 "@subwallet/extension-chains": ^1.3.2-0 "@subwallet/extension-dapp": ^1.3.2-0 From 8f48c51df6137054ff2ae3df6c60664ca1c76b09 Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Wed, 30 Oct 2024 14:53:54 +0700 Subject: [PATCH 024/204] [Issue-3814] feat: process config by environment; process blocked list --- .../src/constants/blocked-actions-list.ts | 14 -- .../src/constants/blocked-actions.ts | 145 ++++++++++++++++++ .../extension-base/src/constants/index.ts | 2 +- .../src/services/transaction-service/index.ts | 29 +++- 4 files changed, 171 insertions(+), 19 deletions(-) delete mode 100644 packages/extension-base/src/constants/blocked-actions-list.ts create mode 100644 packages/extension-base/src/constants/blocked-actions.ts diff --git a/packages/extension-base/src/constants/blocked-actions-list.ts b/packages/extension-base/src/constants/blocked-actions-list.ts deleted file mode 100644 index 4a1d722ff73..00000000000 --- a/packages/extension-base/src/constants/blocked-actions-list.ts +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2019-2022 @subwallet/extension-base authors & contributors -// SPDX-License-Identifier: Apache-2.0 - -import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes'; -import { fetchStaticData } from '@subwallet/extension-base/utils'; - -interface BlockedActionsFeaturesMap { - blockedActionsMap: Record - blockedFeaturesList: string[], -} - -export const fetchLastestBlockedActionsAndFeatures = async () => { - return await fetchStaticData('blocked-actions-features'); -}; diff --git a/packages/extension-base/src/constants/blocked-actions.ts b/packages/extension-base/src/constants/blocked-actions.ts new file mode 100644 index 00000000000..c899ac5524f --- /dev/null +++ b/packages/extension-base/src/constants/blocked-actions.ts @@ -0,0 +1,145 @@ +// Copyright 2019-2022 @subwallet/extension-base authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes'; +import { fetchStaticData } from '@subwallet/extension-base/utils'; + +interface BlockedActionsFeaturesMap { + blockedActionsMap: Record, + blockedFeaturesList: string[] +} + +const PRODUCTION_BRANCHES = ['master', 'webapp', 'webapp-dev']; +const branchName = process.env.BRANCH_NAME || 'koni-dev'; +const targetFolder = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'list' : 'preview'; + +interface EnvConfig { + appConfig?: AppConfig, + browserConfig?: BrowserConfig, + osConfig?: OSConfig +} + +// todo: check if can check exactly App Environment, Browser Type, OS Type + +interface AppConfig { + environment: string, + version?: string, +} + +interface BrowserConfig { + type: string, + version?: string +} + +interface OSConfig { + type: string, + version?: string +} + +type BlockedConfigObjects = Record + +export async function fetchBlockedConfigObjects (): Promise { // todo: recheck default return + const targetFile = `${targetFolder}/envConfig.json`; + + return await fetchStaticData('blocked-actions', targetFile); +} + +export function getPassConfigId (currentConfig: EnvConfig, blockedConfigObjects: BlockedConfigObjects) { + const passList: string[] = []; + + Object.entries(blockedConfigObjects).forEach(([key, appliedConfig]) => { + let passAppConfig = false; + let passBrowserConfig = false; + let passOSConfig = false; + + if (!appliedConfig.appConfig || !currentConfig.appConfig) { + passAppConfig = true; + } else { + const isPassEnv = currentConfig.appConfig.environment === appliedConfig.appConfig.environment; + const isPassVer = isPassVersion(currentConfig.appConfig.version as string, appliedConfig.appConfig.version); + + passAppConfig = isPassEnv && isPassVer; + } + + if (!appliedConfig.browserConfig || !currentConfig.browserConfig) { + passBrowserConfig = true; + } else { + const isPassType = currentConfig.browserConfig.type === appliedConfig.browserConfig.type; + const isPassVer = isPassVersion(currentConfig.browserConfig.version as string, appliedConfig.browserConfig.version); + + passBrowserConfig = isPassType && isPassVer; + } + + if (!appliedConfig.osConfig || !currentConfig.osConfig) { + passOSConfig = true; + } else { + const isPassType = currentConfig.osConfig.type === appliedConfig.osConfig.type; + const isPassVer = isPassVersion(currentConfig.osConfig.version as string, appliedConfig.osConfig.version); + + passOSConfig = isPassType && isPassVer; + } + + if (passAppConfig && passBrowserConfig && passOSConfig) { + passList.push(key); + } + }); + + return passList; +} + +function isPassVersion (versionStr: string, versionCondition?: string) { // todo: check if has case versionStr = undefined? + const versionArr = versionStr.split('.'); + + if (!versionCondition) { + return true; + } + + if (versionCondition.includes('>=')) { + const versionConditionStr = versionCondition.replace('>=', '').trim(); + const versionConditionArr = versionConditionStr.split('.'); // todo: map(Number) instead of parseInt later + + if (versionConditionStr === versionStr) { + return true; + } + + for (let i = 0; i < versionArr.length; i++) { + if (parseInt(versionArr[i]) < parseInt(versionConditionArr[i])) { + return false; + } + + if (parseInt(versionArr[i]) > parseInt(versionConditionArr[i])) { + return true; + } + } + + return true; + } + + if (versionCondition.includes('>')) { + const versionConditionArr = versionCondition.replace('>', '').trim().split('.'); + + for (let i = 0; i < versionArr.length; i++) { + if (parseInt(versionArr[i]) < parseInt(versionConditionArr[i])) { + return false; + } + + if (parseInt(versionArr[i]) > parseInt(versionConditionArr[i])) { + return true; + } + } + + return false; + } + + // todo: also handle less use cases: <, <= + + const versionConditionStr = versionCondition.trim(); + + return versionStr === versionConditionStr; +} + +export async function fetchLastestBlockedActionsAndFeatures (ids: string[]) { + const targetFiles = ids.map((id) => `${targetFolder}/${id}.json`); + + return await Promise.all(targetFiles.map((targetFile) => fetchStaticData('blocked-actions', targetFile))); +} diff --git a/packages/extension-base/src/constants/index.ts b/packages/extension-base/src/constants/index.ts index f83dd094371..0261ecd9d84 100644 --- a/packages/extension-base/src/constants/index.ts +++ b/packages/extension-base/src/constants/index.ts @@ -48,7 +48,7 @@ export const ORDINAL_METHODS = ['drc-20', 'pol-20']; export const PERMISSIONS_TO_REVOKE = ['eth_accounts']; -export * from './blocked-actions-list'; +export * from './blocked-actions'; export * from './environment'; export * from './signing'; export * from './staking'; diff --git a/packages/extension-base/src/services/transaction-service/index.ts b/packages/extension-base/src/services/transaction-service/index.ts index 00881fc998d..e70dba87f37 100644 --- a/packages/extension-base/src/services/transaction-service/index.ts +++ b/packages/extension-base/src/services/transaction-service/index.ts @@ -4,7 +4,7 @@ import { EvmProviderError } from '@subwallet/extension-base/background/errors/EvmProviderError'; import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError'; import { AmountData, ChainType, EvmProviderErrorType, EvmSendTransactionRequest, ExtrinsicStatus, ExtrinsicType, NotificationType, TransactionAdditionalInfo, TransactionDirection, TransactionHistoryItem } from '@subwallet/extension-base/background/KoniTypes'; -import { ALL_ACCOUNT_KEY, fetchLastestBlockedActionsAndFeatures } from '@subwallet/extension-base/constants'; +import { ALL_ACCOUNT_KEY, fetchBlockedConfigObjects, fetchLastestBlockedActionsAndFeatures, getPassConfigId } from '@subwallet/extension-base/constants'; import { checkBalanceWithTransactionFee, checkSigningAccountForTransaction, checkSupportForAction, checkSupportForFeature, checkSupportForTransaction, estimateFeeForTransaction } from '@subwallet/extension-base/core/logic-validation/transfer'; import KoniState from '@subwallet/extension-base/koni/background/handlers/State'; import { cellToBase64Str, externalMessage, getTransferCellPromise } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/ton/utils'; @@ -100,11 +100,32 @@ export default class TransactionService { const { additionalValidator, address, chain, extrinsicType } = validationResponse; const chainInfo = this.state.chainService.getChainInfoByKey(chain); - const { blockedActionsMap, blockedFeaturesList } = await fetchLastestBlockedActionsAndFeatures(); + const blockedConfigObjects = await fetchBlockedConfigObjects(); + const currentConfig = { // todo: do something to get config + appConfig: { + environment: 'extension', + version: '3.4' + }, + browserConfig: { + type: 'chrome', + version: '1.0' + }, + osConfig: { + type: 'macOS', + version: '1.0' + } + }; + const passBlockedConfigId = getPassConfigId(currentConfig, blockedConfigObjects); + + const blockedActionsFeaturesMaps = await fetchLastestBlockedActionsAndFeatures(passBlockedConfigId); - checkSupportForFeature(validationResponse, blockedFeaturesList, chainInfo); + for (const blockedActionsFeaturesMap of blockedActionsFeaturesMaps) { + const { blockedActionsMap, blockedFeaturesList } = blockedActionsFeaturesMap; - checkSupportForAction(validationResponse, blockedActionsMap); + checkSupportForFeature(validationResponse, blockedFeaturesList, chainInfo); + + checkSupportForAction(validationResponse, blockedActionsMap); + } const transaction = transactionInput.transaction; From 1a542420eea63b44ca0c3a4f3875ec34b0e0df15 Mon Sep 17 00:00:00 2001 From: S2kael Date: Wed, 30 Oct 2024 18:09:34 +0700 Subject: [PATCH 025/204] [Issue-3815] Update stable version for chain-list --- package.json | 2 +- packages/extension-base/package.json | 2 +- packages/extension-koni-ui/package.json | 2 +- packages/extension-web-ui/package.json | 2 +- yarn.lock | 14 +++++++------- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 2b3059cb22a..e75b4bf32c2 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@polkadot/types-support": "^12.0.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/chain-list": "0.2.92-beta.2", + "@subwallet/chain-list": "0.2.92", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b79", "@subwallet/ui-keyring": "0.1.8-beta.0", diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index 8915a14286c..2596858a20d 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -55,7 +55,7 @@ "@reduxjs/toolkit": "^1.9.1", "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", - "@subwallet/chain-list": "0.2.92-beta.2", + "@subwallet/chain-list": "0.2.92", "@subwallet/extension-base": "^1.3.2-0", "@subwallet/extension-chains": "^1.3.2-0", "@subwallet/extension-dapp": "^1.3.2-0", diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index d444bb43798..da8ad9fa183 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -34,7 +34,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.92-beta.2", + "@subwallet/chain-list": "0.2.92", "@subwallet/extension-base": "^1.3.2-0", "@subwallet/extension-chains": "^1.3.2-0", "@subwallet/extension-dapp": "^1.3.2-0", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index 967929d552c..d70c3e4f575 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -35,7 +35,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.92-beta.2", + "@subwallet/chain-list": "0.2.92", "@subwallet/extension-base": "^1.3.2-0", "@subwallet/extension-chains": "^1.3.2-0", "@subwallet/extension-dapp": "^1.3.2-0", diff --git a/yarn.lock b/yarn.lock index a40c766afb7..de4976ad293 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6265,14 +6265,14 @@ __metadata: languageName: node linkType: hard -"@subwallet/chain-list@npm:0.2.92-beta.2": - version: 0.2.92-beta.2 - resolution: "@subwallet/chain-list@npm:0.2.92-beta.2" +"@subwallet/chain-list@npm:0.2.92": + version: 0.2.92 + resolution: "@subwallet/chain-list@npm:0.2.92" dependencies: "@polkadot/dev": 0.67.167 "@polkadot/util": ^12.5.1 eventemitter3: ^5.0.1 - checksum: 990603d8f35c517184a256703d45af98c103eb5e073a32d548c65761616a4c86de3fd3fefe8f0258aa1202e807aa82e6b23f11630365c394396592f4ee790bef + checksum: 358078ca2948031004ba5f62b1aa870e8ac5189f51beafafdfefa0091858e10b4c52a8987be49a5445b63fd969f13bb7b572f4fdfb43fa45076514b8f7fbdb18 languageName: node linkType: hard @@ -6315,7 +6315,7 @@ __metadata: "@reduxjs/toolkit": ^1.9.1 "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 - "@subwallet/chain-list": 0.2.92-beta.2 + "@subwallet/chain-list": 0.2.92 "@subwallet/extension-base": ^1.3.2-0 "@subwallet/extension-chains": ^1.3.2-0 "@subwallet/extension-dapp": ^1.3.2-0 @@ -6453,7 +6453,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.92-beta.2 + "@subwallet/chain-list": 0.2.92 "@subwallet/extension-base": ^1.3.2-0 "@subwallet/extension-chains": ^1.3.2-0 "@subwallet/extension-dapp": ^1.3.2-0 @@ -6593,7 +6593,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.92-beta.2 + "@subwallet/chain-list": 0.2.92 "@subwallet/extension-base": ^1.3.2-0 "@subwallet/extension-chains": ^1.3.2-0 "@subwallet/extension-dapp": ^1.3.2-0 From 8234af81d1afb7d606e83d7b6c1804effb4e0f23 Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Wed, 30 Oct 2024 18:48:10 +0700 Subject: [PATCH 026/204] [Issue-3814] feat: add logic to update environment config setting --- .../src/background/KoniTypes.ts | 12 ++++++++ .../src/constants/blocked-actions.ts | 12 +++++--- .../src/koni/background/handlers/Extension.ts | 30 +++++++++++++++++-- .../src/koni/background/handlers/State.ts | 13 +++++++- .../environment-service/stores/Environment.ts | 14 +++++++++ .../setting-service/SettingService.ts | 18 ++++++++++- .../src/services/transaction-service/index.ts | 6 ++-- .../src/stores/EnvironmentStore.ts | 12 ++++++++ packages/extension-base/src/stores/index.ts | 1 + .../src/messaging/settings/base.ts | 14 ++++++++- 10 files changed, 120 insertions(+), 12 deletions(-) create mode 100644 packages/extension-base/src/services/environment-service/stores/Environment.ts create mode 100644 packages/extension-base/src/stores/EnvironmentStore.ts diff --git a/packages/extension-base/src/background/KoniTypes.ts b/packages/extension-base/src/background/KoniTypes.ts index 456f09af57e..87e0bb4acb4 100644 --- a/packages/extension-base/src/background/KoniTypes.ts +++ b/packages/extension-base/src/background/KoniTypes.ts @@ -5,6 +5,7 @@ import { _AssetRef, _AssetType, _ChainAsset, _ChainInfo, _FundStatus, _MultiChai import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError'; import { Resolver } from '@subwallet/extension-base/background/handlers/State'; import { AccountAuthType, AuthorizeRequest, ConfirmationRequestBase, RequestAccountList, RequestAccountSubscribe, RequestAccountUnsubscribe, RequestAuthorizeCancel, RequestAuthorizeReject, RequestAuthorizeSubscribe, RequestAuthorizeTab, RequestCurrentAccountAddress, ResponseAuthorizeList } from '@subwallet/extension-base/background/types'; +import { AppConfig, BrowserConfig, OSConfig } from '@subwallet/extension-base/constants'; import { RequestOptimalTransferProcess } from '@subwallet/extension-base/services/balance-service/helpers'; import { TonTransactionConfig } from '@subwallet/extension-base/services/balance-service/transfer/ton-transfer'; import { _CHAIN_VALIDATION_ERROR } from '@subwallet/extension-base/services/chain-service/handler/types'; @@ -447,6 +448,12 @@ export type RequestChangeShowBalance = { enable: boolean }; export type DetectBalanceCache = Record; +export type RequestSaveAppConfig = { appConfig: AppConfig }; + +export type RequestSaveBrowserConfig = { browserConfig: BrowserConfig }; + +export type RequestSaveOSConfig = { osConfig: OSConfig }; + export interface RandomTestRequest { start: number; end: number; @@ -2065,6 +2072,11 @@ export interface KoniRequestSignatures { 'pri(settings.logo.assets.subscribe)': [null, Record, Record]; 'pri(settings.logo.chains.subscribe)': [null, Record, Record]; + // Environment Config + 'pri(settings.saveAppConfig)': [RequestSaveAppConfig, boolean]; + 'pri(settings.saveBrowserConfig)': [RequestSaveBrowserConfig, boolean]; + 'pri(settings.saveOSConfig)': [RequestSaveOSConfig, boolean]; + /* Earning */ /* Info */ diff --git a/packages/extension-base/src/constants/blocked-actions.ts b/packages/extension-base/src/constants/blocked-actions.ts index c899ac5524f..b9ce085c6f3 100644 --- a/packages/extension-base/src/constants/blocked-actions.ts +++ b/packages/extension-base/src/constants/blocked-actions.ts @@ -1,6 +1,7 @@ // Copyright 2019-2022 @subwallet/extension-base authors & contributors // SPDX-License-Identifier: Apache-2.0 +import { packageInfo } from '@subwallet/extension-base'; import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes'; import { fetchStaticData } from '@subwallet/extension-base/utils'; @@ -9,11 +10,14 @@ interface BlockedActionsFeaturesMap { blockedFeaturesList: string[] } +export const APP_ENV = process.env.TARGET_ENV as string; +export const APP_VER = packageInfo.version; + const PRODUCTION_BRANCHES = ['master', 'webapp', 'webapp-dev']; const branchName = process.env.BRANCH_NAME || 'koni-dev'; const targetFolder = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'list' : 'preview'; -interface EnvConfig { +export interface EnvConfig { appConfig?: AppConfig, browserConfig?: BrowserConfig, osConfig?: OSConfig @@ -21,17 +25,17 @@ interface EnvConfig { // todo: check if can check exactly App Environment, Browser Type, OS Type -interface AppConfig { +export interface AppConfig { environment: string, version?: string, } -interface BrowserConfig { +export interface BrowserConfig { type: string, version?: string } -interface OSConfig { +export interface OSConfig { type: string, version?: string } diff --git a/packages/extension-base/src/koni/background/handlers/Extension.ts b/packages/extension-base/src/koni/background/handlers/Extension.ts index 0c5dd069529..8824798c6fe 100644 --- a/packages/extension-base/src/koni/background/handlers/Extension.ts +++ b/packages/extension-base/src/koni/background/handlers/Extension.ts @@ -7,7 +7,7 @@ import { _AssetRef, _AssetType, _ChainAsset, _ChainInfo, _MultiChainAsset } from import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError'; import { withErrorLog } from '@subwallet/extension-base/background/handlers/helpers'; import { createSubscription } from '@subwallet/extension-base/background/handlers/subscriptions'; -import { AccountExternalError, AddressBookInfo, AmountData, AmountDataWithId, AssetSetting, AssetSettingUpdateReq, BondingOptionParams, BrowserConfirmationType, CampaignBanner, CampaignData, CampaignDataType, ChainType, CronReloadRequest, CrowdloanJson, ExternalRequestPromiseStatus, ExtrinsicType, KeyringState, MantaPayEnableMessage, MantaPayEnableParams, MantaPayEnableResponse, MantaPaySyncState, MetadataItem, NftCollection, NftJson, NftTransactionRequest, NftTransactionResponse, PriceJson, RequestAccountCreateExternalV2, RequestAccountCreateHardwareMultiple, RequestAccountCreateHardwareV2, RequestAccountCreateWithSecretKey, RequestAccountExportPrivateKey, RequestAddInjectedAccounts, RequestApproveConnectWalletSession, RequestApproveWalletConnectNotSupport, RequestAuthorization, RequestAuthorizationBlock, RequestAuthorizationPerAccount, RequestAuthorizationPerSite, RequestAuthorizeApproveV2, RequestBondingSubmit, RequestCameraSettings, RequestCampaignBannerComplete, RequestChangeEnableChainPatrol, RequestChangeLanguage, RequestChangeMasterPassword, RequestChangePriceCurrency, RequestChangeShowBalance, RequestChangeShowZeroBalance, RequestChangeTimeAutoLock, RequestConfirmationComplete, RequestConfirmationCompleteTon, RequestConnectWalletConnect, RequestCrowdloanContributions, RequestDeleteContactAccount, RequestDisconnectWalletConnectSession, RequestEditContactAccount, RequestFindRawMetadata, RequestForgetSite, RequestFreeBalance, RequestGetTransaction, RequestKeyringExportMnemonic, RequestMaxTransferable, RequestMigratePassword, RequestParseEvmContractInput, RequestParseTransactionSubstrate, RequestPassPhishingPage, RequestQrParseRLP, RequestQrSignEvm, RequestQrSignSubstrate, RequestRejectConnectWalletSession, RequestRejectExternalRequest, RequestRejectWalletConnectNotSupport, RequestRemoveInjectedAccounts, RequestResetWallet, RequestResolveExternalRequest, RequestSaveRecentAccount, RequestSettingsType, RequestSigningApprovePasswordV2, RequestStakePoolingBonding, RequestStakePoolingUnbonding, RequestSubscribeHistory, RequestSubstrateNftSubmitTransaction, RequestTuringCancelStakeCompound, RequestTuringStakeCompound, RequestUnbondingSubmit, RequestUnlockKeyring, RequestUnlockType, ResolveAddressToDomainRequest, ResolveDomainRequest, ResponseAccountCreateWithSecretKey, ResponseAccountExportPrivateKey, ResponseChangeMasterPassword, ResponseFindRawMetadata, ResponseKeyringExportMnemonic, ResponseMigratePassword, ResponseNftImport, ResponseParseEvmContractInput, ResponseParseTransactionSubstrate, ResponseQrParseRLP, ResponseQrSignEvm, ResponseQrSignSubstrate, ResponseRejectExternalRequest, ResponseResetWallet, ResponseResolveExternalRequest, ResponseSubscribeHistory, ResponseUnlockKeyring, ShowCampaignPopupRequest, StakingJson, StakingRewardJson, StakingType, ThemeNames, TransactionHistoryItem, TransactionResponse, ValidateNetworkRequest, ValidateNetworkResponse, ValidatorInfo } from '@subwallet/extension-base/background/KoniTypes'; +import { AccountExternalError, AddressBookInfo, AmountData, AmountDataWithId, AssetSetting, AssetSettingUpdateReq, BondingOptionParams, BrowserConfirmationType, CampaignBanner, CampaignData, CampaignDataType, ChainType, CronReloadRequest, CrowdloanJson, ExternalRequestPromiseStatus, ExtrinsicType, KeyringState, MantaPayEnableMessage, MantaPayEnableParams, MantaPayEnableResponse, MantaPaySyncState, MetadataItem, NftCollection, NftJson, NftTransactionRequest, NftTransactionResponse, PriceJson, RequestAccountCreateExternalV2, RequestAccountCreateHardwareMultiple, RequestAccountCreateHardwareV2, RequestAccountCreateWithSecretKey, RequestAccountExportPrivateKey, RequestAddInjectedAccounts, RequestApproveConnectWalletSession, RequestApproveWalletConnectNotSupport, RequestAuthorization, RequestAuthorizationBlock, RequestAuthorizationPerAccount, RequestAuthorizationPerSite, RequestAuthorizeApproveV2, RequestBondingSubmit, RequestCameraSettings, RequestCampaignBannerComplete, RequestChangeEnableChainPatrol, RequestChangeLanguage, RequestChangeMasterPassword, RequestChangePriceCurrency, RequestChangeShowBalance, RequestChangeShowZeroBalance, RequestChangeTimeAutoLock, RequestConfirmationComplete, RequestConfirmationCompleteTon, RequestConnectWalletConnect, RequestCrowdloanContributions, RequestDeleteContactAccount, RequestDisconnectWalletConnectSession, RequestEditContactAccount, RequestFindRawMetadata, RequestForgetSite, RequestFreeBalance, RequestGetTransaction, RequestKeyringExportMnemonic, RequestMaxTransferable, RequestMigratePassword, RequestParseEvmContractInput, RequestParseTransactionSubstrate, RequestPassPhishingPage, RequestQrParseRLP, RequestQrSignEvm, RequestQrSignSubstrate, RequestRejectConnectWalletSession, RequestRejectExternalRequest, RequestRejectWalletConnectNotSupport, RequestRemoveInjectedAccounts, RequestResetWallet, RequestResolveExternalRequest, RequestSaveAppConfig, RequestSaveBrowserConfig, RequestSaveOSConfig, RequestSaveRecentAccount, RequestSettingsType, RequestSigningApprovePasswordV2, RequestStakePoolingBonding, RequestStakePoolingUnbonding, RequestSubscribeHistory, RequestSubstrateNftSubmitTransaction, RequestTuringCancelStakeCompound, RequestTuringStakeCompound, RequestUnbondingSubmit, RequestUnlockKeyring, RequestUnlockType, ResolveAddressToDomainRequest, ResolveDomainRequest, ResponseAccountCreateWithSecretKey, ResponseAccountExportPrivateKey, ResponseChangeMasterPassword, ResponseFindRawMetadata, ResponseKeyringExportMnemonic, ResponseMigratePassword, ResponseNftImport, ResponseParseEvmContractInput, ResponseParseTransactionSubstrate, ResponseQrParseRLP, ResponseQrSignEvm, ResponseQrSignSubstrate, ResponseRejectExternalRequest, ResponseResetWallet, ResponseResolveExternalRequest, ResponseSubscribeHistory, ResponseUnlockKeyring, ShowCampaignPopupRequest, StakingJson, StakingRewardJson, StakingType, ThemeNames, TransactionHistoryItem, TransactionResponse, ValidateNetworkRequest, ValidateNetworkResponse, ValidatorInfo } from '@subwallet/extension-base/background/KoniTypes'; import { AccountAuthType, AuthorizeRequest, MessageTypes, MetadataRequest, RequestAccountExport, RequestAuthorizeCancel, RequestAuthorizeReject, RequestCurrentAccountAddress, RequestMetadataApprove, RequestMetadataReject, RequestSigningApproveSignature, RequestSigningCancel, RequestTypes, ResponseAccountExport, ResponseAuthorizeList, ResponseType, SigningRequest, WindowOpenParams } from '@subwallet/extension-base/background/types'; import { TransactionWarning } from '@subwallet/extension-base/background/warnings/TransactionWarning'; import { ALL_ACCOUNT_KEY, LATEST_SESSION, XCM_FEE_RATIO } from '@subwallet/extension-base/constants'; @@ -2829,11 +2829,29 @@ export default class KoniExtension { } // Phishing detect - private async passPhishingPage ({ url }: RequestPassPhishingPage) { return await this.#koniState.approvePassPhishingPage(url); } + // Set environment config + private saveAppConfig (request: RequestSaveAppConfig) { + this.#koniState.saveEnvConfig('appConfig', request.appConfig); + + return true; + } + + private saveBrowserConfig (request: RequestSaveBrowserConfig) { + this.#koniState.saveEnvConfig('browserConfig', request.browserConfig); + + return true; + } + + private saveOSConfig (request: RequestSaveOSConfig) { + this.#koniState.saveEnvConfig('osConfig', request.osConfig); + + return true; + } + /// Wallet connect // Connect @@ -4259,6 +4277,14 @@ export default class KoniExtension { case 'pri(phishing.pass)': return await this.passPhishingPage(request as RequestPassPhishingPage); + // Set Environment config + case 'pri(settings.saveAppConfig)': + return this.saveAppConfig(request as RequestSaveAppConfig); + case 'pri(settings.saveBrowserConfig)': + return this.saveBrowserConfig(request as RequestSaveBrowserConfig); + case 'pri(settings.saveOSConfig)': + return this.saveOSConfig(request as RequestSaveOSConfig); + /// Keyring state case 'pri(keyring.subscribe)': return this.keyringStateSubscribe(id, port); diff --git a/packages/extension-base/src/koni/background/handlers/State.ts b/packages/extension-base/src/koni/background/handlers/State.ts index b79a3f78710..d67a57068c5 100644 --- a/packages/extension-base/src/koni/background/handlers/State.ts +++ b/packages/extension-base/src/koni/background/handlers/State.ts @@ -8,7 +8,7 @@ import { withErrorLog } from '@subwallet/extension-base/background/handlers/help import { isSubscriptionRunning, unsubscribe } from '@subwallet/extension-base/background/handlers/subscriptions'; import { AddTokenRequestExternal, AmountData, APIItemState, ApiMap, AuthRequestV2, ChainStakingMetadata, ChainType, ConfirmationsQueue, ConfirmationsQueueTon, CrowdloanItem, CrowdloanJson, CurrencyType, EvmProviderErrorType, EvmSendTransactionParams, EvmSendTransactionRequest, EvmSignatureRequest, ExternalRequestPromise, ExternalRequestPromiseStatus, ExtrinsicType, MantaAuthorizationContext, MantaPayConfig, MantaPaySyncState, NftCollection, NftItem, NftJson, NominatorMetadata, RequestAccountExportPrivateKey, RequestConfirmationComplete, RequestConfirmationCompleteTon, RequestCrowdloanContributions, RequestSettingsType, ResponseAccountExportPrivateKey, ServiceInfo, SingleModeJson, StakingItem, StakingJson, StakingRewardItem, StakingRewardJson, StakingType, UiSettings } from '@subwallet/extension-base/background/KoniTypes'; import { RequestAuthorizeTab, RequestRpcSend, RequestRpcSubscribe, RequestRpcUnsubscribe, RequestSign, ResponseRpcListProviders, ResponseSigning } from '@subwallet/extension-base/background/types'; -import { MANTA_PAY_BALANCE_INTERVAL, REMIND_EXPORT_ACCOUNT } from '@subwallet/extension-base/constants'; +import { EnvConfig, MANTA_PAY_BALANCE_INTERVAL, REMIND_EXPORT_ACCOUNT } from '@subwallet/extension-base/constants'; import { convertErrorFormat, generateValidationProcess, PayloadValidated, ValidateStepFunction, validationAuthMiddleware, validationAuthWCMiddleware, validationConnectMiddleware, validationEvmDataTransactionMiddleware, validationEvmSignMessageMiddleware } from '@subwallet/extension-base/core/logic-validation'; import { BalanceService } from '@subwallet/extension-base/services/balance-service'; import { ServiceStatus } from '@subwallet/extension-base/services/base/types'; @@ -1617,6 +1617,17 @@ export default class KoniState { }); } + public saveEnvConfig (key: T, value: EnvConfig[T]): void { + this.settingService.getEnvironmentList((config) => { + const newSettings: EnvConfig = { + ...config, + [key]: value + }; + + this.settingService.setEnvironment(newSettings); + }); + } + public async resetWallet (resetAll: boolean) { await this.keyringService.resetWallet(resetAll); await this.earningService.resetYieldPosition(); diff --git a/packages/extension-base/src/services/environment-service/stores/Environment.ts b/packages/extension-base/src/services/environment-service/stores/Environment.ts new file mode 100644 index 00000000000..e406751ab73 --- /dev/null +++ b/packages/extension-base/src/services/environment-service/stores/Environment.ts @@ -0,0 +1,14 @@ +// Copyright 2019-2022 @subwallet/extension-base +// SPDX-License-Identifier: Apache-2.0 + +import { EnvConfig } from '@subwallet/extension-base/constants'; +import { StoreSubject } from '@subwallet/extension-base/services/keyring-service/context/stores/Base'; +import { EnvironmentStore } from '@subwallet/extension-base/stores'; +import { BehaviorSubject } from 'rxjs'; + +export class EnvironmentStoreSubject extends StoreSubject { + store = new EnvironmentStore(); + subject = new BehaviorSubject({}); + key = 'Environment'; + defaultValue = {}; +} diff --git a/packages/extension-base/src/services/setting-service/SettingService.ts b/packages/extension-base/src/services/setting-service/SettingService.ts index 91e757b7b9d..237f99b6148 100644 --- a/packages/extension-base/src/services/setting-service/SettingService.ts +++ b/packages/extension-base/src/services/setting-service/SettingService.ts @@ -2,7 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 import { LanguageType, PassPhishing, RequestSettingsType, UiSettings } from '@subwallet/extension-base/background/KoniTypes'; -import { LANGUAGE } from '@subwallet/extension-base/constants'; +import { EnvConfig, LANGUAGE } from '@subwallet/extension-base/constants'; +import { EnvironmentStoreSubject } from '@subwallet/extension-base/services/environment-service/stores/Environment'; import { SWStorage } from '@subwallet/extension-base/storage'; import PassPhishingStore from '@subwallet/extension-base/stores/PassPhishingStore'; import SettingsStore from '@subwallet/extension-base/stores/Settings'; @@ -14,6 +15,7 @@ import { DEFAULT_SETTING } from './constants'; export default class SettingService { private readonly settingsStore = new SettingsStore(); private readonly passPhishingStore = new PassPhishingStore(); + private readonly environmentStore = new EnvironmentStoreSubject(); constructor () { this.initSetting().catch(console.error); @@ -73,6 +75,20 @@ export default class SettingService { this.passPhishingStore.set('PassPhishing', data, callback); } + public getEnvironmentSubject (): Subject { + return this.environmentStore.subject; + } + + public getEnvironmentList (update: (value: EnvConfig) => void): void { + this.environmentStore.store.get('Environment', (value) => { + update(value || {}); + }); + } + + public setEnvironment (data: EnvConfig): void { + this.environmentStore.upsertData(data); + } + // Use for mobile only public get isAlwaysRequired (): Promise { return new Promise((resolve) => { diff --git a/packages/extension-base/src/services/transaction-service/index.ts b/packages/extension-base/src/services/transaction-service/index.ts index e70dba87f37..9b8b647a566 100644 --- a/packages/extension-base/src/services/transaction-service/index.ts +++ b/packages/extension-base/src/services/transaction-service/index.ts @@ -4,7 +4,7 @@ import { EvmProviderError } from '@subwallet/extension-base/background/errors/EvmProviderError'; import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError'; import { AmountData, ChainType, EvmProviderErrorType, EvmSendTransactionRequest, ExtrinsicStatus, ExtrinsicType, NotificationType, TransactionAdditionalInfo, TransactionDirection, TransactionHistoryItem } from '@subwallet/extension-base/background/KoniTypes'; -import { ALL_ACCOUNT_KEY, fetchBlockedConfigObjects, fetchLastestBlockedActionsAndFeatures, getPassConfigId } from '@subwallet/extension-base/constants'; +import { ALL_ACCOUNT_KEY, APP_ENV, APP_VER, fetchBlockedConfigObjects, fetchLastestBlockedActionsAndFeatures, getPassConfigId } from '@subwallet/extension-base/constants'; import { checkBalanceWithTransactionFee, checkSigningAccountForTransaction, checkSupportForAction, checkSupportForFeature, checkSupportForTransaction, estimateFeeForTransaction } from '@subwallet/extension-base/core/logic-validation/transfer'; import KoniState from '@subwallet/extension-base/koni/background/handlers/State'; import { cellToBase64Str, externalMessage, getTransferCellPromise } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/ton/utils'; @@ -103,8 +103,8 @@ export default class TransactionService { const blockedConfigObjects = await fetchBlockedConfigObjects(); const currentConfig = { // todo: do something to get config appConfig: { - environment: 'extension', - version: '3.4' + environment: APP_ENV, + version: APP_VER }, browserConfig: { type: 'chrome', diff --git a/packages/extension-base/src/stores/EnvironmentStore.ts b/packages/extension-base/src/stores/EnvironmentStore.ts new file mode 100644 index 00000000000..795ce43988a --- /dev/null +++ b/packages/extension-base/src/stores/EnvironmentStore.ts @@ -0,0 +1,12 @@ +// Copyright 2019-2022 @subwallet/extension-base +// SPDX-License-Identifier: Apache-2.0 + +import { EnvConfig } from '@subwallet/extension-base/constants'; +import { EXTENSION_PREFIX } from '@subwallet/extension-base/defaults'; +import SubscribableStore from '@subwallet/extension-base/stores/SubscribableStore'; + +export default class EnvironmentStore extends SubscribableStore { + constructor () { + super(EXTENSION_PREFIX ? `${EXTENSION_PREFIX}environment` : null); + } +} diff --git a/packages/extension-base/src/stores/index.ts b/packages/extension-base/src/stores/index.ts index 7cb938abb58..83f53d8324f 100644 --- a/packages/extension-base/src/stores/index.ts +++ b/packages/extension-base/src/stores/index.ts @@ -8,3 +8,4 @@ export { default as CurrentAccountStore } from './CurrentAccountStore'; export { default as CurrentCurrencyStore } from './CurrentCurrencyStore'; export { default as MetadataStore } from './Metadata'; export { default as ModifyPairStore } from './ModifyPairStore'; +export { default as EnvironmentStore } from './EnvironmentStore'; diff --git a/packages/extension-koni-ui/src/messaging/settings/base.ts b/packages/extension-koni-ui/src/messaging/settings/base.ts index 2491341d319..1fa93af7774 100644 --- a/packages/extension-koni-ui/src/messaging/settings/base.ts +++ b/packages/extension-koni-ui/src/messaging/settings/base.ts @@ -1,7 +1,7 @@ // Copyright 2019-2022 @subwallet/extension-koni-ui authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { BrowserConfirmationType, CurrencyType, LanguageType, RequestSettingsType, RequestSubscribeBalancesVisibility, ThemeNames, UiSettings, WalletUnlockType } from '@subwallet/extension-base/background/KoniTypes'; +import { BrowserConfirmationType, CurrencyType, LanguageType, RequestSaveAppConfig, RequestSaveBrowserConfig, RequestSaveOSConfig, RequestSettingsType, RequestSubscribeBalancesVisibility, ThemeNames, UiSettings, WalletUnlockType } from '@subwallet/extension-base/background/KoniTypes'; import { NotificationSetup } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; import { sendMessage } from '@subwallet/extension-koni-ui/messaging'; @@ -60,3 +60,15 @@ export async function saveShowBalance (value: boolean): Promise { export async function saveUnlockType (value: WalletUnlockType): Promise { return sendMessage('pri(settings.saveUnlockType)', { unlockType: value }); } + +export function saveAppConfig (request: RequestSaveAppConfig): Promise { + return sendMessage('pri(settings.saveAppConfig)', request); +} + +export function saveBrowserConfig (request: RequestSaveBrowserConfig): Promise { + return sendMessage('pri(settings.saveBrowserConfig)', request); +} + +export function saveOSConfig (request: RequestSaveOSConfig): Promise { + return sendMessage('pri(settings.saveOSConfig)', request); +} From 1b321d131e817b36659990fe242818556b3a270d Mon Sep 17 00:00:00 2001 From: AnhMTV Date: Thu, 31 Oct 2024 09:27:54 +0700 Subject: [PATCH 027/204] Release version 1.3.4 --- yarn.lock | 68 +++++++++++++++++++++++++++---------------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/yarn.lock b/yarn.lock index de4976ad293..9fb1740a757 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6276,7 +6276,7 @@ __metadata: languageName: node linkType: hard -"@subwallet/extension-base@^1.3.2-0, @subwallet/extension-base@workspace:packages/extension-base": +"@subwallet/extension-base@^1.3.4-0, @subwallet/extension-base@workspace:packages/extension-base": version: 0.0.0-use.local resolution: "@subwallet/extension-base@workspace:packages/extension-base" dependencies: @@ -6316,11 +6316,11 @@ __metadata: "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 "@subwallet/chain-list": 0.2.92 - "@subwallet/extension-base": ^1.3.2-0 - "@subwallet/extension-chains": ^1.3.2-0 - "@subwallet/extension-dapp": ^1.3.2-0 - "@subwallet/extension-inject": ^1.3.2-0 - "@subwallet/extension-mocks": ^1.3.2-0 + "@subwallet/extension-base": ^1.3.4-0 + "@subwallet/extension-chains": ^1.3.4-0 + "@subwallet/extension-dapp": ^1.3.4-0 + "@subwallet/extension-inject": ^1.3.4-0 + "@subwallet/extension-mocks": ^1.3.4-0 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/ui-keyring": ^0.1.8-beta.0 "@ton/core": ^0.56.3 @@ -6367,7 +6367,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-chains@^1.3.2-0, @subwallet/extension-chains@workspace:packages/extension-chains": +"@subwallet/extension-chains@^1.3.4-0, @subwallet/extension-chains@workspace:packages/extension-chains": version: 0.0.0-use.local resolution: "@subwallet/extension-chains@workspace:packages/extension-chains" dependencies: @@ -6375,7 +6375,7 @@ __metadata: "@polkadot/networks": ^12.6.2 "@polkadot/util": ^12.6.2 "@polkadot/util-crypto": ^12.6.2 - "@subwallet/extension-inject": ^1.3.2-0 + "@subwallet/extension-inject": ^1.3.4-0 peerDependencies: "@polkadot/api": "*" "@polkadot/types": "*" @@ -6390,21 +6390,21 @@ __metadata: "@metamask/detect-provider": ^1.2.0 "@polkadot/types": ^11.0.3 "@polkadot/util": ^12.6.2 - "@subwallet/extension-inject": ^1.3.2-0 + "@subwallet/extension-inject": ^1.3.4-0 web3: ^1.10.0 peerDependencies: "@polkadot/util": "*" languageName: unknown linkType: soft -"@subwallet/extension-dapp@^1.3.2-0, @subwallet/extension-dapp@workspace:packages/extension-dapp": +"@subwallet/extension-dapp@^1.3.4-0, @subwallet/extension-dapp@workspace:packages/extension-dapp": version: 0.0.0-use.local resolution: "@subwallet/extension-dapp@workspace:packages/extension-dapp" dependencies: "@babel/runtime": ^7.20.6 "@polkadot/util": ^12.6.2 "@polkadot/util-crypto": ^12.6.2 - "@subwallet/extension-inject": ^1.3.2-0 + "@subwallet/extension-inject": ^1.3.4-0 peerDependencies: "@polkadot/api": "*" "@polkadot/util": "*" @@ -6412,7 +6412,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-inject@^1.3.2-0, @subwallet/extension-inject@workspace:packages/extension-inject": +"@subwallet/extension-inject@^1.3.4-0, @subwallet/extension-inject@workspace:packages/extension-inject": version: 0.0.0-use.local resolution: "@subwallet/extension-inject@workspace:packages/extension-inject" dependencies: @@ -6431,7 +6431,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-koni-ui@^1.3.2-0, @subwallet/extension-koni-ui@workspace:packages/extension-koni-ui": +"@subwallet/extension-koni-ui@^1.3.4-0, @subwallet/extension-koni-ui@workspace:packages/extension-koni-ui": version: 0.0.0-use.local resolution: "@subwallet/extension-koni-ui@workspace:packages/extension-koni-ui" dependencies: @@ -6454,11 +6454,11 @@ __metadata: "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 "@subwallet/chain-list": 0.2.92 - "@subwallet/extension-base": ^1.3.2-0 - "@subwallet/extension-chains": ^1.3.2-0 - "@subwallet/extension-dapp": ^1.3.2-0 - "@subwallet/extension-inject": ^1.3.2-0 - "@subwallet/extension-mocks": ^1.3.2-0 + "@subwallet/extension-base": ^1.3.4-0 + "@subwallet/extension-chains": ^1.3.4-0 + "@subwallet/extension-dapp": ^1.3.4-0 + "@subwallet/extension-inject": ^1.3.4-0 + "@subwallet/extension-mocks": ^1.3.4-0 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/react-ui": 5.1.2-b77 "@subwallet/ui-keyring": ^0.1.8-beta.0 @@ -6531,9 +6531,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.2-0 - "@subwallet/extension-inject": ^1.3.2-0 - "@subwallet/extension-koni-ui": ^1.3.2-0 + "@subwallet/extension-base": ^1.3.4-0 + "@subwallet/extension-inject": ^1.3.4-0 + "@subwallet/extension-koni-ui": ^1.3.4-0 "@types/chrome": ^0.0.254 "@types/serviceworker": ^0.0.80 assert: ^2.0.0 @@ -6561,7 +6561,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-mocks@^1.3.2-0, @subwallet/extension-mocks@workspace:packages/extension-mocks": +"@subwallet/extension-mocks@^1.3.4-0, @subwallet/extension-mocks@workspace:packages/extension-mocks": version: 0.0.0-use.local resolution: "@subwallet/extension-mocks@workspace:packages/extension-mocks" dependencies: @@ -6570,7 +6570,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-web-ui@^1.3.2-0, @subwallet/extension-web-ui@workspace:packages/extension-web-ui": +"@subwallet/extension-web-ui@^1.3.4-0, @subwallet/extension-web-ui@workspace:packages/extension-web-ui": version: 0.0.0-use.local resolution: "@subwallet/extension-web-ui@workspace:packages/extension-web-ui" dependencies: @@ -6594,11 +6594,11 @@ __metadata: "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 "@subwallet/chain-list": 0.2.92 - "@subwallet/extension-base": ^1.3.2-0 - "@subwallet/extension-chains": ^1.3.2-0 - "@subwallet/extension-dapp": ^1.3.2-0 - "@subwallet/extension-inject": ^1.3.2-0 - "@subwallet/extension-mocks": ^1.3.2-0 + "@subwallet/extension-base": ^1.3.4-0 + "@subwallet/extension-chains": ^1.3.4-0 + "@subwallet/extension-dapp": ^1.3.4-0 + "@subwallet/extension-inject": ^1.3.4-0 + "@subwallet/extension-mocks": ^1.3.4-0 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/react-ui": ^5.1.2-b77 "@subwallet/ui-keyring": ^0.1.8-beta.0 @@ -6790,9 +6790,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.2-0 - "@subwallet/extension-inject": ^1.3.2-0 - "@subwallet/extension-koni-ui": ^1.3.2-0 + "@subwallet/extension-base": ^1.3.4-0 + "@subwallet/extension-inject": ^1.3.4-0 + "@subwallet/extension-koni-ui": ^1.3.4-0 assert: ^2.0.0 babel-loader: ^9.1.3 browser-resolve: ^2.0.0 @@ -6823,9 +6823,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.2-0 - "@subwallet/extension-inject": ^1.3.2-0 - "@subwallet/extension-web-ui": ^1.3.2-0 + "@subwallet/extension-base": ^1.3.4-0 + "@subwallet/extension-inject": ^1.3.4-0 + "@subwallet/extension-web-ui": ^1.3.4-0 assert: ^2.0.0 babel-loader: ^9.1.3 browser-resolve: ^2.0.0 From 4698ac32041543f36b1930dae9aa503666623b60 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 31 Oct 2024 02:39:04 +0000 Subject: [PATCH 028/204] [CI Skip] release/beta 1.3.5-0 skip-checks: true --- CONTRIBUTORS | 10 +-- package.json | 2 +- packages/extension-base/package.json | 12 ++-- packages/extension-base/src/packageInfo.ts | 2 +- packages/extension-chains/package.json | 4 +- packages/extension-chains/src/packageInfo.ts | 2 +- .../extension-compat-metamask/package.json | 4 +- .../src/packageInfo.ts | 2 +- packages/extension-dapp/package.json | 4 +- packages/extension-dapp/src/packageInfo.ts | 2 +- packages/extension-inject/package.json | 2 +- packages/extension-inject/src/packageInfo.ts | 2 +- packages/extension-koni-ui/package.json | 12 ++-- packages/extension-koni/package.json | 8 +-- packages/extension-koni/src/packageInfo.ts | 2 +- packages/extension-mocks/package.json | 2 +- packages/extension-web-ui/package.json | 12 ++-- packages/web-runner/package.json | 8 +-- packages/webapp/package.json | 8 +-- yarn.lock | 68 +++++++++---------- 20 files changed, 84 insertions(+), 84 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index b7cc7a4130e..2b6e191414d 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,6 +1,6 @@ - 2872 AnhMTV Release version 1.3.4 + 2879 AnhMTV Release version 1.3.4 2546 Nam Phạm [Issue 3747] chore: fix eslint - 2359 S2kael [Issue-3806] Update stable version for chain-list + 2363 S2kael [Issue-3815] Update stable version for chain-list 869 lw-cdm [MasterAccount] Update logic to reorder account on select account modal 568 nguyentiendung [Issue-3553] [Issue-3553] Refactor code and add recipient to swap history. 465 Jaco 0.42.5 (#969) @@ -17,10 +17,10 @@ 83 leewong 82 Thibaut Sardan Add account filtering feature (#832) 73 bluedot [Issue-3579] fix: update check fully migrate + 68 PDTnhah [Issue-3815] Update chainlist 63 Roman fix ui issues - 59 PDTnhah [Issue-3806] Fix UI bug 53 Dominhquangdev update Bridge code - 28 tunghp2002 [Chore] Change cache + 34 tunghp2002 26 S2kael 10 Trang Trịnh api get karura and acala nfts 9 Minh Le @@ -33,6 +33,7 @@ 4 Quangdm-cdm 3 Antoine Estienne Add eth test for extension signature (#909) 3 quangdm Update style for Auth Transaction Screen, Export Screen, Derive Screen + 3 tunghp2002 2 Axel Chalon Add typings to messages (#130) 2 Bartłomiej Rutkowski Allow account creation by derivation from existing one (#296) 2 carumusan Support ipfs and ipns urls (#667) @@ -40,7 +41,6 @@ 2 joe petrowski add plasm (#462) 2 Remon Nashid Prevent unauthorized apps from abusing pub(authorize.tab) request (#686) 2 Shawn Tabrizi Add configurable notifications (#767) - 2 tunghp2002 2 WoeOm add darwinia network (#493) 2 Yash Mittal Address comment 1 0_0./ diff --git a/package.json b/package.json index cd586f94bfb..d6511a936c7 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "url": "https://github.com/Koniverse/Subwallet-V2.git" }, "sideEffects": false, - "version": "1.3.4", + "version": "1.3.5-0", "workspaces": [ "packages/*" ], diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index 1f45fdace6f..48b6709c6df 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -17,7 +17,7 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.4-0", + "version": "1.3.5-0", "main": "index.js", "dependencies": { "@acala-network/api": "^5.0.2", @@ -56,10 +56,10 @@ "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", "@subwallet/chain-list": "0.2.92", - "@subwallet/extension-base": "^1.3.4-0", - "@subwallet/extension-chains": "^1.3.4-0", - "@subwallet/extension-dapp": "^1.3.4-0", - "@subwallet/extension-inject": "^1.3.4-0", + "@subwallet/extension-base": "^1.3.5-0", + "@subwallet/extension-chains": "^1.3.5-0", + "@subwallet/extension-dapp": "^1.3.5-0", + "@subwallet/extension-inject": "^1.3.5-0", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/ui-keyring": "^0.1.8-beta.0", "@ton/core": "^0.56.3", @@ -104,7 +104,7 @@ "web3-utils": "^1.10.0" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.3.4-0", + "@subwallet/extension-mocks": "^1.3.5-0", "@types/uuid": "^9.0.1" } } diff --git a/packages/extension-base/src/packageInfo.ts b/packages/extension-base/src/packageInfo.ts index 6fcaf598466..53304cea958 100644 --- a/packages/extension-base/src/packageInfo.ts +++ b/packages/extension-base/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-base', path: 'auto', type: 'auto', version: '1.3.4-0' }; +export const packageInfo = { name: '@subwallet/extension-base', path: 'auto', type: 'auto', version: '1.3.5-0' }; diff --git a/packages/extension-chains/package.json b/packages/extension-chains/package.json index 83b57f3fffb..06af994035e 100644 --- a/packages/extension-chains/package.json +++ b/packages/extension-chains/package.json @@ -17,14 +17,14 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.4-0", + "version": "1.3.5-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@polkadot/networks": "^12.6.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/extension-inject": "^1.3.4-0" + "@subwallet/extension-inject": "^1.3.5-0" }, "peerDependencies": { "@polkadot/api": "*", diff --git a/packages/extension-chains/src/packageInfo.ts b/packages/extension-chains/src/packageInfo.ts index 696e2c883a6..a30e1bd957c 100644 --- a/packages/extension-chains/src/packageInfo.ts +++ b/packages/extension-chains/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-chains', path: 'auto', type: 'auto', version: '1.3.4-0' }; +export const packageInfo = { name: '@subwallet/extension-chains', path: 'auto', type: 'auto', version: '1.3.5-0' }; diff --git a/packages/extension-compat-metamask/package.json b/packages/extension-compat-metamask/package.json index 6b149d1fd37..efdad89953a 100644 --- a/packages/extension-compat-metamask/package.json +++ b/packages/extension-compat-metamask/package.json @@ -17,14 +17,14 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.4-0", + "version": "1.3.5-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@metamask/detect-provider": "^1.2.0", "@polkadot/types": "^11.0.3", "@polkadot/util": "^12.6.2", - "@subwallet/extension-inject": "^1.3.4-0", + "@subwallet/extension-inject": "^1.3.5-0", "web3": "^1.10.0" }, "peerDependencies": { diff --git a/packages/extension-compat-metamask/src/packageInfo.ts b/packages/extension-compat-metamask/src/packageInfo.ts index d3333bec0f2..cbacec6c902 100644 --- a/packages/extension-compat-metamask/src/packageInfo.ts +++ b/packages/extension-compat-metamask/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-compat-metamask', path: 'auto', type: 'auto', version: '1.3.4-0' }; +export const packageInfo = { name: '@subwallet/extension-compat-metamask', path: 'auto', type: 'auto', version: '1.3.5-0' }; diff --git a/packages/extension-dapp/package.json b/packages/extension-dapp/package.json index 2962c2e4ea2..173ffb4e53c 100644 --- a/packages/extension-dapp/package.json +++ b/packages/extension-dapp/package.json @@ -17,13 +17,13 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.4-0", + "version": "1.3.5-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/extension-inject": "^1.3.4-0" + "@subwallet/extension-inject": "^1.3.5-0" }, "peerDependencies": { "@polkadot/api": "*", diff --git a/packages/extension-dapp/src/packageInfo.ts b/packages/extension-dapp/src/packageInfo.ts index fc65035c460..bc192a0fc1a 100644 --- a/packages/extension-dapp/src/packageInfo.ts +++ b/packages/extension-dapp/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-dapp', path: 'auto', type: 'auto', version: '1.3.4-0' }; +export const packageInfo = { name: '@subwallet/extension-dapp', path: 'auto', type: 'auto', version: '1.3.5-0' }; diff --git a/packages/extension-inject/package.json b/packages/extension-inject/package.json index 67e9f9610e9..82afc8ea149 100644 --- a/packages/extension-inject/package.json +++ b/packages/extension-inject/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.3.4-0", + "version": "1.3.5-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", diff --git a/packages/extension-inject/src/packageInfo.ts b/packages/extension-inject/src/packageInfo.ts index ace5cbebda1..b475621d052 100644 --- a/packages/extension-inject/src/packageInfo.ts +++ b/packages/extension-inject/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-inject', path: 'auto', type: 'auto', version: '1.3.4-0' }; +export const packageInfo = { name: '@subwallet/extension-inject', path: 'auto', type: 'auto', version: '1.3.5-0' }; diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index 824cf2d28b7..e1cc764aa3a 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.3.4-0", + "version": "1.3.5-0", "dependencies": { "@babel/runtime": "^7.20.6", "@coinbase/cbpay-js": "^1.7.0", @@ -35,10 +35,10 @@ "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", "@subwallet/chain-list": "0.2.92", - "@subwallet/extension-base": "^1.3.4-0", - "@subwallet/extension-chains": "^1.3.4-0", - "@subwallet/extension-dapp": "^1.3.4-0", - "@subwallet/extension-inject": "^1.3.4-0", + "@subwallet/extension-base": "^1.3.5-0", + "@subwallet/extension-chains": "^1.3.5-0", + "@subwallet/extension-dapp": "^1.3.5-0", + "@subwallet/extension-inject": "^1.3.5-0", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b77", "@subwallet/ui-keyring": "^0.1.8-beta.0", @@ -87,7 +87,7 @@ "usehooks-ts": "^2.9.1" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.3.4-0", + "@subwallet/extension-mocks": "^1.3.5-0", "@types/bn.js": "^5.1.1", "@types/enzyme": "^3.10.12", "@types/enzyme-adapter-react-16": "^1.0.6", diff --git a/packages/extension-koni/package.json b/packages/extension-koni/package.json index b83f82894f7..9ef33d0e6a5 100644 --- a/packages/extension-koni/package.json +++ b/packages/extension-koni/package.json @@ -14,12 +14,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.4-0", + "version": "1.3.5-0", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.3.4-0", - "@subwallet/extension-inject": "^1.3.4-0", - "@subwallet/extension-koni-ui": "^1.3.4-0" + "@subwallet/extension-base": "^1.3.5-0", + "@subwallet/extension-inject": "^1.3.5-0", + "@subwallet/extension-koni-ui": "^1.3.5-0" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/packages/extension-koni/src/packageInfo.ts b/packages/extension-koni/src/packageInfo.ts index 7d5239681ec..c05e9be9814 100644 --- a/packages/extension-koni/src/packageInfo.ts +++ b/packages/extension-koni/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-koni', path: 'auto', type: 'auto', version: '1.3.4-0' }; +export const packageInfo = { name: '@subwallet/extension-koni', path: 'auto', type: 'auto', version: '1.3.5-0' }; diff --git a/packages/extension-mocks/package.json b/packages/extension-mocks/package.json index 5294576c802..553a7378c1f 100644 --- a/packages/extension-mocks/package.json +++ b/packages/extension-mocks/package.json @@ -14,7 +14,7 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.4-0", + "version": "1.3.5-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index 4ec64413286..3622378b7c5 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.3.4-0", + "version": "1.3.5-0", "dependencies": { "@babel/runtime": "^7.20.6", "@coinbase/cbpay-js": "^1.7.0", @@ -36,10 +36,10 @@ "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", "@subwallet/chain-list": "0.2.92", - "@subwallet/extension-base": "^1.3.4-0", - "@subwallet/extension-chains": "^1.3.4-0", - "@subwallet/extension-dapp": "^1.3.4-0", - "@subwallet/extension-inject": "^1.3.4-0", + "@subwallet/extension-base": "^1.3.5-0", + "@subwallet/extension-chains": "^1.3.5-0", + "@subwallet/extension-dapp": "^1.3.5-0", + "@subwallet/extension-inject": "^1.3.5-0", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "^5.1.2-b77", "@subwallet/ui-keyring": "^0.1.8-beta.0", @@ -88,7 +88,7 @@ "usehooks-ts": "^2.9.1" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.3.4-0", + "@subwallet/extension-mocks": "^1.3.5-0", "@types/bn.js": "^5.1.1", "@types/enzyme": "^3.10.12", "@types/enzyme-adapter-react-16": "^1.0.6", diff --git a/packages/web-runner/package.json b/packages/web-runner/package.json index 7a145372329..ce3ee15182c 100644 --- a/packages/web-runner/package.json +++ b/packages/web-runner/package.json @@ -14,12 +14,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.4-0", + "version": "1.3.5-0", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.3.4-0", - "@subwallet/extension-inject": "^1.3.4-0", - "@subwallet/extension-koni-ui": "^1.3.4-0" + "@subwallet/extension-base": "^1.3.5-0", + "@subwallet/extension-inject": "^1.3.5-0", + "@subwallet/extension-koni-ui": "^1.3.5-0" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/packages/webapp/package.json b/packages/webapp/package.json index 0676d59adc3..ab6c6a0bacb 100644 --- a/packages/webapp/package.json +++ b/packages/webapp/package.json @@ -15,12 +15,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.4-0", + "version": "1.3.5-0", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.3.4-0", - "@subwallet/extension-inject": "^1.3.4-0", - "@subwallet/extension-web-ui": "^1.3.4-0" + "@subwallet/extension-base": "^1.3.5-0", + "@subwallet/extension-inject": "^1.3.5-0", + "@subwallet/extension-web-ui": "^1.3.5-0" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/yarn.lock b/yarn.lock index 9fb1740a757..9607b5d8b54 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6276,7 +6276,7 @@ __metadata: languageName: node linkType: hard -"@subwallet/extension-base@^1.3.4-0, @subwallet/extension-base@workspace:packages/extension-base": +"@subwallet/extension-base@^1.3.5-0, @subwallet/extension-base@workspace:packages/extension-base": version: 0.0.0-use.local resolution: "@subwallet/extension-base@workspace:packages/extension-base" dependencies: @@ -6316,11 +6316,11 @@ __metadata: "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 "@subwallet/chain-list": 0.2.92 - "@subwallet/extension-base": ^1.3.4-0 - "@subwallet/extension-chains": ^1.3.4-0 - "@subwallet/extension-dapp": ^1.3.4-0 - "@subwallet/extension-inject": ^1.3.4-0 - "@subwallet/extension-mocks": ^1.3.4-0 + "@subwallet/extension-base": ^1.3.5-0 + "@subwallet/extension-chains": ^1.3.5-0 + "@subwallet/extension-dapp": ^1.3.5-0 + "@subwallet/extension-inject": ^1.3.5-0 + "@subwallet/extension-mocks": ^1.3.5-0 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/ui-keyring": ^0.1.8-beta.0 "@ton/core": ^0.56.3 @@ -6367,7 +6367,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-chains@^1.3.4-0, @subwallet/extension-chains@workspace:packages/extension-chains": +"@subwallet/extension-chains@^1.3.5-0, @subwallet/extension-chains@workspace:packages/extension-chains": version: 0.0.0-use.local resolution: "@subwallet/extension-chains@workspace:packages/extension-chains" dependencies: @@ -6375,7 +6375,7 @@ __metadata: "@polkadot/networks": ^12.6.2 "@polkadot/util": ^12.6.2 "@polkadot/util-crypto": ^12.6.2 - "@subwallet/extension-inject": ^1.3.4-0 + "@subwallet/extension-inject": ^1.3.5-0 peerDependencies: "@polkadot/api": "*" "@polkadot/types": "*" @@ -6390,21 +6390,21 @@ __metadata: "@metamask/detect-provider": ^1.2.0 "@polkadot/types": ^11.0.3 "@polkadot/util": ^12.6.2 - "@subwallet/extension-inject": ^1.3.4-0 + "@subwallet/extension-inject": ^1.3.5-0 web3: ^1.10.0 peerDependencies: "@polkadot/util": "*" languageName: unknown linkType: soft -"@subwallet/extension-dapp@^1.3.4-0, @subwallet/extension-dapp@workspace:packages/extension-dapp": +"@subwallet/extension-dapp@^1.3.5-0, @subwallet/extension-dapp@workspace:packages/extension-dapp": version: 0.0.0-use.local resolution: "@subwallet/extension-dapp@workspace:packages/extension-dapp" dependencies: "@babel/runtime": ^7.20.6 "@polkadot/util": ^12.6.2 "@polkadot/util-crypto": ^12.6.2 - "@subwallet/extension-inject": ^1.3.4-0 + "@subwallet/extension-inject": ^1.3.5-0 peerDependencies: "@polkadot/api": "*" "@polkadot/util": "*" @@ -6412,7 +6412,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-inject@^1.3.4-0, @subwallet/extension-inject@workspace:packages/extension-inject": +"@subwallet/extension-inject@^1.3.5-0, @subwallet/extension-inject@workspace:packages/extension-inject": version: 0.0.0-use.local resolution: "@subwallet/extension-inject@workspace:packages/extension-inject" dependencies: @@ -6431,7 +6431,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-koni-ui@^1.3.4-0, @subwallet/extension-koni-ui@workspace:packages/extension-koni-ui": +"@subwallet/extension-koni-ui@^1.3.5-0, @subwallet/extension-koni-ui@workspace:packages/extension-koni-ui": version: 0.0.0-use.local resolution: "@subwallet/extension-koni-ui@workspace:packages/extension-koni-ui" dependencies: @@ -6454,11 +6454,11 @@ __metadata: "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 "@subwallet/chain-list": 0.2.92 - "@subwallet/extension-base": ^1.3.4-0 - "@subwallet/extension-chains": ^1.3.4-0 - "@subwallet/extension-dapp": ^1.3.4-0 - "@subwallet/extension-inject": ^1.3.4-0 - "@subwallet/extension-mocks": ^1.3.4-0 + "@subwallet/extension-base": ^1.3.5-0 + "@subwallet/extension-chains": ^1.3.5-0 + "@subwallet/extension-dapp": ^1.3.5-0 + "@subwallet/extension-inject": ^1.3.5-0 + "@subwallet/extension-mocks": ^1.3.5-0 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/react-ui": 5.1.2-b77 "@subwallet/ui-keyring": ^0.1.8-beta.0 @@ -6531,9 +6531,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.4-0 - "@subwallet/extension-inject": ^1.3.4-0 - "@subwallet/extension-koni-ui": ^1.3.4-0 + "@subwallet/extension-base": ^1.3.5-0 + "@subwallet/extension-inject": ^1.3.5-0 + "@subwallet/extension-koni-ui": ^1.3.5-0 "@types/chrome": ^0.0.254 "@types/serviceworker": ^0.0.80 assert: ^2.0.0 @@ -6561,7 +6561,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-mocks@^1.3.4-0, @subwallet/extension-mocks@workspace:packages/extension-mocks": +"@subwallet/extension-mocks@^1.3.5-0, @subwallet/extension-mocks@workspace:packages/extension-mocks": version: 0.0.0-use.local resolution: "@subwallet/extension-mocks@workspace:packages/extension-mocks" dependencies: @@ -6570,7 +6570,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-web-ui@^1.3.4-0, @subwallet/extension-web-ui@workspace:packages/extension-web-ui": +"@subwallet/extension-web-ui@^1.3.5-0, @subwallet/extension-web-ui@workspace:packages/extension-web-ui": version: 0.0.0-use.local resolution: "@subwallet/extension-web-ui@workspace:packages/extension-web-ui" dependencies: @@ -6594,11 +6594,11 @@ __metadata: "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 "@subwallet/chain-list": 0.2.92 - "@subwallet/extension-base": ^1.3.4-0 - "@subwallet/extension-chains": ^1.3.4-0 - "@subwallet/extension-dapp": ^1.3.4-0 - "@subwallet/extension-inject": ^1.3.4-0 - "@subwallet/extension-mocks": ^1.3.4-0 + "@subwallet/extension-base": ^1.3.5-0 + "@subwallet/extension-chains": ^1.3.5-0 + "@subwallet/extension-dapp": ^1.3.5-0 + "@subwallet/extension-inject": ^1.3.5-0 + "@subwallet/extension-mocks": ^1.3.5-0 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/react-ui": ^5.1.2-b77 "@subwallet/ui-keyring": ^0.1.8-beta.0 @@ -6790,9 +6790,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.4-0 - "@subwallet/extension-inject": ^1.3.4-0 - "@subwallet/extension-koni-ui": ^1.3.4-0 + "@subwallet/extension-base": ^1.3.5-0 + "@subwallet/extension-inject": ^1.3.5-0 + "@subwallet/extension-koni-ui": ^1.3.5-0 assert: ^2.0.0 babel-loader: ^9.1.3 browser-resolve: ^2.0.0 @@ -6823,9 +6823,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.4-0 - "@subwallet/extension-inject": ^1.3.4-0 - "@subwallet/extension-web-ui": ^1.3.4-0 + "@subwallet/extension-base": ^1.3.5-0 + "@subwallet/extension-inject": ^1.3.5-0 + "@subwallet/extension-web-ui": ^1.3.5-0 assert: ^2.0.0 babel-loader: ^9.1.3 browser-resolve: ^2.0.0 From 02e8b62517f0a2fcb37d519bd709b09b657d2f7c Mon Sep 17 00:00:00 2001 From: AnhMTV Date: Thu, 31 Oct 2024 11:52:11 +0700 Subject: [PATCH 029/204] Release version 1.3.5 --- CHANGELOG.md | 19 +++++++++++++++++++ package.json | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a27f57029fa..d908f5cdd60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,24 @@ # CHANGELOG +## 1.3.5 +Build date: Oct 31, 2024. + +Features & Update: +- Support ERC-1155 (#3726) +- Refactor logic parsing data from contract response (#3070) +- Re-check some old types from ExtrinsicType (#3654) +- Update chain-list (#3815) + - Add support for World Chain + - Add support for Mode Mainnet + - Add support for Lisk mainnet + - Add support for Zircuit mainnet + - Add support for Tangle Network mainnet + - Add support Story Odyssey Testnet + +Bug fixed: +- Fixed bug Do not show token (#3721) + + ## 1.3.4 Build date: Oct 28, 2024. diff --git a/package.json b/package.json index d6511a936c7..51a3ff67922 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "url": "https://github.com/Koniverse/Subwallet-V2.git" }, "sideEffects": false, - "version": "1.3.5-0", + "version": "1.3.5", "workspaces": [ "packages/*" ], From cd42bf080b945e684e29901c1afb6e6259b64d68 Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Thu, 31 Oct 2024 11:51:03 +0700 Subject: [PATCH 030/204] [Issue-3814] feat: get environment config --- .../src/koni/background/handlers/State.ts | 4 ++++ .../setting-service/SettingService.ts | 4 ++-- .../src/services/transaction-service/index.ts | 18 +++--------------- .../extension-base/src/utils/environment.ts | 5 +++++ packages/extension-koni/src/background.ts | 19 +++++++++++++++++++ packages/web-runner/src/webRunner.ts | 16 ++++++++++++++++ packages/webapp/src/webRunner.ts | 19 +++++++++++++++++++ 7 files changed, 68 insertions(+), 17 deletions(-) diff --git a/packages/extension-base/src/koni/background/handlers/State.ts b/packages/extension-base/src/koni/background/handlers/State.ts index d67a57068c5..cc9d2b8123e 100644 --- a/packages/extension-base/src/koni/background/handlers/State.ts +++ b/packages/extension-base/src/koni/background/handlers/State.ts @@ -1628,6 +1628,10 @@ export default class KoniState { }); } + public initEnvConfig (envConfig: EnvConfig): void { + this.settingService.setEnvironment(envConfig); + } + public async resetWallet (resetAll: boolean) { await this.keyringService.resetWallet(resetAll); await this.earningService.resetYieldPosition(); diff --git a/packages/extension-base/src/services/setting-service/SettingService.ts b/packages/extension-base/src/services/setting-service/SettingService.ts index 237f99b6148..67a5d9d477e 100644 --- a/packages/extension-base/src/services/setting-service/SettingService.ts +++ b/packages/extension-base/src/services/setting-service/SettingService.ts @@ -75,8 +75,8 @@ export default class SettingService { this.passPhishingStore.set('PassPhishing', data, callback); } - public getEnvironmentSubject (): Subject { - return this.environmentStore.subject; + public getEnvironmentSetting () { + return this.environmentStore.subject.value; } public getEnvironmentList (update: (value: EnvConfig) => void): void { diff --git a/packages/extension-base/src/services/transaction-service/index.ts b/packages/extension-base/src/services/transaction-service/index.ts index 9b8b647a566..b7a51e5b0a9 100644 --- a/packages/extension-base/src/services/transaction-service/index.ts +++ b/packages/extension-base/src/services/transaction-service/index.ts @@ -4,7 +4,7 @@ import { EvmProviderError } from '@subwallet/extension-base/background/errors/EvmProviderError'; import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError'; import { AmountData, ChainType, EvmProviderErrorType, EvmSendTransactionRequest, ExtrinsicStatus, ExtrinsicType, NotificationType, TransactionAdditionalInfo, TransactionDirection, TransactionHistoryItem } from '@subwallet/extension-base/background/KoniTypes'; -import { ALL_ACCOUNT_KEY, APP_ENV, APP_VER, fetchBlockedConfigObjects, fetchLastestBlockedActionsAndFeatures, getPassConfigId } from '@subwallet/extension-base/constants'; +import { ALL_ACCOUNT_KEY, fetchBlockedConfigObjects, fetchLastestBlockedActionsAndFeatures, getPassConfigId } from '@subwallet/extension-base/constants'; import { checkBalanceWithTransactionFee, checkSigningAccountForTransaction, checkSupportForAction, checkSupportForFeature, checkSupportForTransaction, estimateFeeForTransaction } from '@subwallet/extension-base/core/logic-validation/transfer'; import KoniState from '@subwallet/extension-base/koni/background/handlers/State'; import { cellToBase64Str, externalMessage, getTransferCellPromise } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/ton/utils'; @@ -101,20 +101,8 @@ export default class TransactionService { const chainInfo = this.state.chainService.getChainInfoByKey(chain); const blockedConfigObjects = await fetchBlockedConfigObjects(); - const currentConfig = { // todo: do something to get config - appConfig: { - environment: APP_ENV, - version: APP_VER - }, - browserConfig: { - type: 'chrome', - version: '1.0' - }, - osConfig: { - type: 'macOS', - version: '1.0' - } - }; + const currentConfig = this.state.settingService.getEnvironmentSetting(); + const passBlockedConfigId = getPassConfigId(currentConfig, blockedConfigObjects); const blockedActionsFeaturesMaps = await fetchLastestBlockedActionsAndFeatures(passBlockedConfigId); diff --git a/packages/extension-base/src/utils/environment.ts b/packages/extension-base/src/utils/environment.ts index 78374e8ae78..9b808649d62 100644 --- a/packages/extension-base/src/utils/environment.ts +++ b/packages/extension-base/src/utils/environment.ts @@ -66,8 +66,13 @@ export const RuntimeInfo: RuntimeEnvironmentInfo = detectRuntimeEnvironment(); // Todo: Support more in backend case export const BowserParser = Bowser.getParser(typeof navigator !== 'undefined' ? navigator?.userAgent + '' : ''); export const isFirefox = BowserParser.getBrowserName(true) === 'firefox'; +export const browserName = BowserParser.getBrowserName(true); +export const browserVersion = BowserParser.getBrowserVersion(); export const osName = BowserParser.getOSName(); +export const osVersion = BowserParser.getOSVersion(); export const isMobile = BowserParser.getPlatform().type === 'mobile'; +export const platformType = BowserParser.getPlatform().type; +export const platformModel = BowserParser.getPlatform().model; export const TARGET_ENV = (process.env.TARGET_ENV || 'extension') as TargetEnvironment; export const targetIsExtension = TARGET_ENV === 'extension'; diff --git a/packages/extension-koni/src/background.ts b/packages/extension-koni/src/background.ts index 08169ae09d2..fee6f6b1a23 100644 --- a/packages/extension-koni/src/background.ts +++ b/packages/extension-koni/src/background.ts @@ -4,9 +4,11 @@ // Runs in the extension background, handling all keyring access import '@subwallet/extension-inject/crossenv'; +import { APP_ENV, APP_VER, EnvConfig } from '@subwallet/extension-base/constants'; import { SWHandler } from '@subwallet/extension-base/koni/background/handlers'; import { AccountsStore } from '@subwallet/extension-base/stores'; import KeyringStore from '@subwallet/extension-base/stores/Keyring'; +import { browserName, browserVersion, osName, osVersion } from '@subwallet/extension-base/utils'; import { ActionHandler } from '@subwallet/extension-koni/helper/ActionHandler'; import keyring from '@subwallet/ui-keyring'; @@ -25,6 +27,23 @@ cryptoWaitReady() // setTimeout(() => koniState.onCheckToRemindUser(), 4000); + const envConfig: EnvConfig = { + appConfig: { + environment: APP_ENV, + version: APP_VER + }, + browserConfig: { + type: browserName, + version: browserVersion + }, + osConfig: { + type: osName, + version: osVersion + } + }; + + koniState.initEnvConfig(envConfig); + // load all the keyring data keyring.loadAll({ store: new AccountsStore(), type: 'sr25519', password_store: new KeyringStore() }); diff --git a/packages/web-runner/src/webRunner.ts b/packages/web-runner/src/webRunner.ts index ba12540aef2..7783089df6d 100644 --- a/packages/web-runner/src/webRunner.ts +++ b/packages/web-runner/src/webRunner.ts @@ -3,9 +3,11 @@ import '@subwallet/extension-inject/crossenv'; +import { APP_ENV, APP_VER, EnvConfig } from '@subwallet/extension-base/constants'; import { SWHandler } from '@subwallet/extension-base/koni/background/handlers'; import { AccountsStore } from '@subwallet/extension-base/stores'; import KeyringStore from '@subwallet/extension-base/stores/Keyring'; +import { platformModel, platformType } from '@subwallet/extension-base/utils'; import keyring from '@subwallet/ui-keyring'; import { cryptoWaitReady } from '@polkadot/util-crypto'; @@ -24,6 +26,20 @@ Promise.all([cryptoWaitReady(), checkRestore()]) .then((): void => { console.log('[Mobile] crypto initialized'); + const envConfig: EnvConfig = { + appConfig: { + environment: APP_ENV, + version: APP_VER + }, + browserConfig: undefined, + osConfig: { + type: platformType as string, + version: platformModel + } + }; + + koniState.initEnvConfig(envConfig); + // load all the keyring data keyring.loadAll({ store: new AccountsStore(), type: 'sr25519', password_store: new KeyringStore() }); diff --git a/packages/webapp/src/webRunner.ts b/packages/webapp/src/webRunner.ts index 6dd4229fd9d..ef1b146bdfe 100644 --- a/packages/webapp/src/webRunner.ts +++ b/packages/webapp/src/webRunner.ts @@ -3,9 +3,11 @@ import '@subwallet/extension-inject/crossenv'; +import { APP_ENV, APP_VER, EnvConfig } from '@subwallet/extension-base/constants'; import { SWHandler } from '@subwallet/extension-base/koni/background/handlers'; import { AccountsStore } from '@subwallet/extension-base/stores'; import KeyringStore from '@subwallet/extension-base/stores/Keyring'; +import { browserName, browserVersion, osName, osVersion } from '@subwallet/extension-base/utils'; import { ENABLE_INJECT } from '@subwallet/extension-web-ui/constants'; import keyring from '@subwallet/ui-keyring'; @@ -22,6 +24,23 @@ cryptoWaitReady() .then((): void => { console.log('[WebApp] crypto initialized'); + const envConfig: EnvConfig = { + appConfig: { + environment: APP_ENV, + version: APP_VER + }, + browserConfig: { + type: browserName, + version: browserVersion + }, + osConfig: { + type: osName, + version: osVersion + } + }; + + SWHandler.instance.state.initEnvConfig(envConfig); + // load all the keyring data keyring.loadAll({ store: new AccountsStore(), type: 'sr25519', password_store: new KeyringStore() }); From 6b2b19f7dded110b23510a7af993668fec3f8598 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 31 Oct 2024 05:03:33 +0000 Subject: [PATCH 031/204] [CI Skip] release/stable 1.3.5 skip-checks: true --- .123trigger | 3 ++- CONTRIBUTORS | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.123trigger b/.123trigger index 6edaa829c7e..d43310b28d6 100644 --- a/.123trigger +++ b/.123trigger @@ -169,4 +169,5 @@ 1.2.32 1.3.2 1.3.3 -1.3.4 \ No newline at end of file +1.3.4 +1.3.5 \ No newline at end of file diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 2b6e191414d..cd252ed2891 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,4 +1,4 @@ - 2879 AnhMTV Release version 1.3.4 + 2880 AnhMTV Release version 1.3.5 2546 Nam Phạm [Issue 3747] chore: fix eslint 2363 S2kael [Issue-3815] Update stable version for chain-list 869 lw-cdm [MasterAccount] Update logic to reorder account on select account modal From 9e4fd519f587eee8b3796b2beb886903fd31a11a Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Thu, 31 Oct 2024 16:50:58 +0700 Subject: [PATCH 032/204] [Issue-3762] Extension - Error when send NFT on Ethereum network --- .../transfer/smart-contract.ts | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts b/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts index 41c29fb3e90..0bc6521c977 100644 --- a/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts +++ b/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts @@ -11,6 +11,8 @@ import { _EvmApi, _SubstrateApi } from '@subwallet/extension-base/services/chain import { calculateGasFeeParams } from '@subwallet/extension-base/services/fee-service/utils'; import BigN from 'bignumber.js'; import { TransactionConfig } from 'web3-core'; +import { EvmFeeInfo } from "@subwallet/extension-base/types"; +import { t } from "i18next"; export async function getEVMTransactionObject ( chainInfo: _ChainInfo, @@ -122,11 +124,24 @@ export async function getERC721Transaction ( // eslint-disable-next-line @typescript-eslint/no-unsafe-argument const contract = new web3Api.api.eth.Contract(_ERC721_ABI, contractAddress); - const [gasLimit, priority] = await Promise.all([ - // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access - contract.methods.safeTransferFrom(senderAddress, recipientAddress, tokenId).estimateGas({ from: senderAddress }) as number, - calculateGasFeeParams(web3Api, chain) - ]); + let gasLimit: number; + let priority: EvmFeeInfo; + + try { + [gasLimit, priority] = await Promise.all([ + // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access + contract.methods.safeTransferFrom(senderAddress, recipientAddress, tokenId).estimateGas({ from: senderAddress }) as number, + calculateGasFeeParams(web3Api, chain) + ]); + } catch (e) { + const error = e as Error; + + if (error.message.includes('transfer to non ERC721Receiver implementer')) { + error.message = t('Recipent address cannot receive this NFT'); + } + + throw error; + } return { from: senderAddress, From 460ead0e9c682e6abc2bb5c05a03dea195d41b13 Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Thu, 31 Oct 2024 17:13:42 +0700 Subject: [PATCH 033/204] [Issue-3762] Fix eslint --- .../src/services/balance-service/transfer/smart-contract.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts b/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts index 0bc6521c977..fd2cbd1b421 100644 --- a/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts +++ b/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { _ChainInfo } from '@subwallet/chain-list/types'; +import { EvmFeeInfo } from '@subwallet/extension-base/types'; import { getERC20Contract } from '@subwallet/extension-base/koni/api/contract-handler/evm/web3'; import { _ERC721_ABI } from '@subwallet/extension-base/koni/api/contract-handler/utils'; import { getPSP34ContractPromise } from '@subwallet/extension-base/koni/api/contract-handler/wasm'; @@ -11,8 +12,7 @@ import { _EvmApi, _SubstrateApi } from '@subwallet/extension-base/services/chain import { calculateGasFeeParams } from '@subwallet/extension-base/services/fee-service/utils'; import BigN from 'bignumber.js'; import { TransactionConfig } from 'web3-core'; -import { EvmFeeInfo } from "@subwallet/extension-base/types"; -import { t } from "i18next"; +import { t } from 'i18next'; export async function getEVMTransactionObject ( chainInfo: _ChainInfo, From 3859c239de94d3e0424032361fc131cfc7c91792 Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Thu, 31 Oct 2024 18:22:27 +0700 Subject: [PATCH 034/204] [Issue-3762] Fix eslint --- .../src/services/balance-service/transfer/smart-contract.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts b/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts index fd2cbd1b421..526970ae9ce 100644 --- a/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts +++ b/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 import { _ChainInfo } from '@subwallet/chain-list/types'; -import { EvmFeeInfo } from '@subwallet/extension-base/types'; import { getERC20Contract } from '@subwallet/extension-base/koni/api/contract-handler/evm/web3'; import { _ERC721_ABI } from '@subwallet/extension-base/koni/api/contract-handler/utils'; import { getPSP34ContractPromise } from '@subwallet/extension-base/koni/api/contract-handler/wasm'; @@ -10,9 +9,10 @@ import { getWasmContractGasLimit } from '@subwallet/extension-base/koni/api/cont import { EVM_REFORMAT_DECIMALS } from '@subwallet/extension-base/services/chain-service/constants'; import { _EvmApi, _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types'; import { calculateGasFeeParams } from '@subwallet/extension-base/services/fee-service/utils'; +import { EvmFeeInfo } from '@subwallet/extension-base/types'; import BigN from 'bignumber.js'; -import { TransactionConfig } from 'web3-core'; import { t } from 'i18next'; +import { TransactionConfig } from 'web3-core'; export async function getEVMTransactionObject ( chainInfo: _ChainInfo, From 97d65debecaff0ded7a7573135126cf2ebdc92c8 Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Fri, 1 Nov 2024 16:51:50 +0700 Subject: [PATCH 035/204] [Issue-3762] Extension - Error when send NFT on Ethereum network --- .../src/services/balance-service/transfer/smart-contract.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts b/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts index 526970ae9ce..6cb0362bf9c 100644 --- a/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts +++ b/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts @@ -137,7 +137,7 @@ export async function getERC721Transaction ( const error = e as Error; if (error.message.includes('transfer to non ERC721Receiver implementer')) { - error.message = t('Recipent address cannot receive this NFT'); + error.message = t('Unable to send. NFT not supported on recipient address'); } throw error; From d72ddfd5e35e1882e25f5865bf4c2f7546435e1f Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Mon, 4 Nov 2024 09:57:04 +0700 Subject: [PATCH 036/204] [Issue-3132] feat: handle lastest chain, asset, multi-chain asset --- packages/extension-base/package.json | 1 + .../src/services/chain-service/index.ts | 246 ++++++++++++------ .../src/services/chain-service/utils/patch.ts | 17 +- yarn.lock | 8 + 4 files changed, 186 insertions(+), 86 deletions(-) diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index 48b6709c6df..24a6af4a639 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -93,6 +93,7 @@ "protobufjs": "^7.2.4", "rxjs": "^7.8.1", "sails-js": "^0.1.6", + "ts-md5": "^1.3.1", "tweetnacl": "^1.0.3", "uuid": "^9.0.0", "web3": "^1.10.0", diff --git a/packages/extension-base/src/services/chain-service/index.ts b/packages/extension-base/src/services/chain-service/index.ts index a2c8390c87a..629a96655cd 100644 --- a/packages/extension-base/src/services/chain-service/index.ts +++ b/packages/extension-base/src/services/chain-service/index.ts @@ -11,13 +11,14 @@ import { SubstrateChainHandler } from '@subwallet/extension-base/services/chain- import { TonChainHandler } from '@subwallet/extension-base/services/chain-service/handler/TonChainHandler'; import { _CHAIN_VALIDATION_ERROR } from '@subwallet/extension-base/services/chain-service/handler/types'; import { _ChainApiStatus, _ChainConnectionStatus, _ChainState, _CUSTOM_PREFIX, _DataMap, _EvmApi, _NetworkUpsertParams, _NFT_CONTRACT_STANDARDS, _SMART_CONTRACT_STANDARDS, _SmartContractTokenInfo, _SubstrateApi, _ValidateCustomAssetRequest, _ValidateCustomAssetResponse } from '@subwallet/extension-base/services/chain-service/types'; -import { _isAssetAutoEnable, _isAssetCanPayTxFee, _isAssetFungibleToken, _isChainEnabled, _isCustomAsset, _isCustomChain, _isCustomProvider, _isEqualContractAddress, _isEqualSmartContractAsset, _isLocalToken, _isMantaZkAsset, _isPureEvmChain, _isPureSubstrateChain, _parseAssetRefKey, fetchPatchData, randomizeProvider, updateLatestChainInfo } from '@subwallet/extension-base/services/chain-service/utils'; +import { _isAssetAutoEnable, _isAssetCanPayTxFee, _isAssetFungibleToken, _isChainEnabled, _isCustomAsset, _isCustomChain, _isCustomProvider, _isEqualContractAddress, _isEqualSmartContractAsset, _isLocalToken, _isMantaZkAsset, _isPureEvmChain, _isPureSubstrateChain, _parseAssetRefKey, fetchPatchData, PatchInfo, randomizeProvider, updateLatestChainInfo } from '@subwallet/extension-base/services/chain-service/utils'; import { EventService } from '@subwallet/extension-base/services/event-service'; import { IChain, IMetadataItem } from '@subwallet/extension-base/services/storage-service/databases'; import DatabaseService from '@subwallet/extension-base/services/storage-service/DatabaseService'; import AssetSettingStore from '@subwallet/extension-base/stores/AssetSetting'; import { addLazy, calculateMetadataHash, fetchStaticData, filterAssetsByChainAndType, getShortMetadata, MODULE_SUPPORT } from '@subwallet/extension-base/utils'; import { BehaviorSubject, Subject } from 'rxjs'; +import { Md5 } from 'ts-md5'; import Web3 from 'web3'; import { logger as createLogger } from '@polkadot/util/logger'; @@ -108,8 +109,9 @@ export class ChainService { private assetLogoMapSubject = new BehaviorSubject>(AssetLogoMap); private chainLogoMapSubject = new BehaviorSubject>(ChainLogoMap); private ledgerGenericAllowChainsSubject = new BehaviorSubject([]); - private assetMapPatch: string = JSON.stringify({}); - private assetLogoPatch: string = JSON.stringify({}); + // private assetMapPatch: string = JSON.stringify({}); + // private assetLogoPatch: string = JSON.stringify({}); + private appliedPatchVersion = ''; // Todo: Update to new store indexed DB private store: AssetSettingStore = new AssetSettingStore(); @@ -698,73 +700,50 @@ export class ChainService { clearInterval(this.refreshLatestChainDataTimeOut); } - handleLatestChainData (latestChainInfo: _ChainInfo[]) { - try { - if (latestChainInfo && latestChainInfo.length > 0) { - const { needUpdateChainApiList, storedChainInfoList } = updateLatestChainInfo(this.dataMap, latestChainInfo); - - this.dbService.bulkUpdateChainStore(storedChainInfoList).catch(console.error); - this.updateChainSubscription(); + validatePatchWithHash (latestPatch: PatchInfo) { + const { ChainAsset, ChainAssetHashMap, ChainInfo, ChainInfoHashMap, MultiChainAsset, MultiChainAssetHashMap } = latestPatch; - needUpdateChainApiList.forEach((chainInfo) => { - console.log('Updating chain API for', chainInfo.slug); - this.initApiForChain(chainInfo).catch(console.error); - }); + for (const [chainSlug, chain] of Object.entries(ChainInfo)) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { chainStatus, providers, ...chainWithoutProvidersAndStatus } = chain; - this.logger.log('Finished updating latest RPC providers'); + if (Md5.hashStr(JSON.stringify(chainWithoutProvidersAndStatus)) !== ChainInfoHashMap[chainSlug]) { + return false; } - } catch (e) { - console.error('Error fetching latest chain data'); } - } - handleLatestAssetRef (latestBlockedAssetRefList: string[], latestAssetRefMap: Record | null) { - const updatedAssetRefMap: Record = { ...AssetRefMap }; - - if (latestAssetRefMap) { - for (const [assetRefKey, assetRef] of Object.entries(latestAssetRefMap)) { - updatedAssetRefMap[assetRefKey] = assetRef; + for (const [assetSlug, asset] of Object.entries(ChainAsset)) { + if (Md5.hashStr(JSON.stringify(asset)) !== ChainAssetHashMap[assetSlug]) { + return false; } } - latestBlockedAssetRefList.forEach((blockedAssetRef) => { - delete updatedAssetRefMap[blockedAssetRef]; - }); - - this.dataMap.assetRefMap = updatedAssetRefMap; - - this.xcmRefMapSubject.next(this.xcmRefMap); - this.swapRefMapSubject.next(this.swapRefMap); - this.logger.log('Finished updating latest asset ref'); - } - - handleLatestPriceId (latestPriceIds: Record) { - let isUpdated = false; - - Object.entries(latestPriceIds).forEach(([slug, priceId]) => { - if (this.dataMap.assetRegistry[slug] && this.dataMap.assetRegistry[slug].priceId !== priceId) { - isUpdated = true; - this.dataMap.assetRegistry[slug].priceId = priceId; + for (const [mAssetSlug, mAsset] of Object.entries(MultiChainAsset)) { + if (Md5.hashStr(JSON.stringify(mAsset)) !== MultiChainAssetHashMap[mAssetSlug]) { + return false; } - }); - - if (isUpdated) { - this.assetRegistrySubject.next(this.dataMap.assetRegistry); - this.eventService.emit('asset.updateState', ''); } - this.logger.log('Finished updating latest price IDs'); + return true; } - handleLatestAssetData (latestAssetInfo: Record | null, latestAssetLogoMap: Record | null) { + handleLatestPatch (latestPatch: PatchInfo) { try { - if (latestAssetInfo) { - const latestAssetPatch = JSON.stringify(latestAssetInfo); + const isSafePatch = this.validatePatchWithHash(latestPatch); + const { ChainAsset: latestAssetInfo, ChainInfo: latestChainInfo, MultiChainAsset: latestMultiChainAsset, appliedVersion } = latestPatch; + // todo: AssetLogoMap, ChainLogoMap + + if (isSafePatch && this.appliedPatchVersion !== appliedVersion) { + if (latestChainInfo && Object.keys(latestChainInfo).length > 0) { + const chainInfoMap = Object.assign({}, this.dataMap.chainInfoMap, latestChainInfo); + + this.dataMap.chainInfoMap = chainInfoMap; + this.chainInfoMapSubject.next(chainInfoMap); + } - if (this.assetMapPatch !== latestAssetPatch) { + if (latestAssetInfo && Object.keys(latestAssetInfo).length > 0) { const assetRegistry = filterAssetInfoMap(this.getChainInfoMap(), Object.assign({}, this.dataMap.assetRegistry, latestAssetInfo)); - this.assetMapPatch = latestAssetPatch; this.dataMap.assetRegistry = assetRegistry; this.assetRegistrySubject.next(assetRegistry); @@ -774,38 +753,121 @@ export class ChainService { }) .catch(console.error); } - } - - if (latestAssetLogoMap) { - const latestAssetLogoPatch = JSON.stringify(latestAssetLogoMap); - if (this.assetLogoPatch !== latestAssetLogoPatch) { - const logoMap = { ...AssetLogoMap, ...latestAssetLogoMap }; + if (latestMultiChainAsset && Object.keys(latestMultiChainAsset).length > 0) { + const multiChainAssetMap = { ...MultiChainAssetMap, ...latestMultiChainAsset }; - this.assetLogoPatch = latestAssetLogoPatch; - this.assetLogoMapSubject.next(logoMap); + this.multiChainAssetMapSubject.next(multiChainAssetMap); } + + this.appliedPatchVersion = appliedVersion; } + } catch (e) { + console.error('Error fetching latest patch data'); + } - if (latestAssetLogoMap) { - const latestAssetLogoPatch = JSON.stringify(latestAssetLogoMap); + this.eventService.emit('asset.online.ready', true); - if (this.assetLogoPatch !== latestAssetLogoPatch) { - const logoMap = { ...AssetLogoMap, ...latestAssetLogoMap }; + this.logger.log('Finished updating latest asset'); + } - this.assetLogoPatch = latestAssetLogoPatch; - this.assetLogoMapSubject.next(logoMap); - } + handleLatestChainData (latestChainInfo: _ChainInfo[]) { + try { + if (latestChainInfo && latestChainInfo.length > 0) { + const { needUpdateChainApiList, storedChainInfoList } = updateLatestChainInfo(this.dataMap, latestChainInfo); + + this.dbService.bulkUpdateChainStore(storedChainInfoList).catch(console.error); + this.updateChainSubscription(); + + needUpdateChainApiList.forEach((chainInfo) => { + console.log('Updating chain API for', chainInfo.slug); + this.initApiForChain(chainInfo).catch(console.error); + }); + + this.logger.log('Finished updating latest RPC providers'); } } catch (e) { - console.error('Error fetching latest asset data'); + console.error('Error fetching latest chain data'); } + } - this.eventService.emit('asset.online.ready', true); + // handleLatestAssetRef (latestBlockedAssetRefList: string[], latestAssetRefMap: Record | null) { + // const updatedAssetRefMap: Record = { ...AssetRefMap }; + // + // if (latestAssetRefMap) { + // for (const [assetRefKey, assetRef] of Object.entries(latestAssetRefMap)) { + // updatedAssetRefMap[assetRefKey] = assetRef; + // } + // } + // + // latestBlockedAssetRefList.forEach((blockedAssetRef) => { + // delete updatedAssetRefMap[blockedAssetRef]; + // }); + // + // this.dataMap.assetRefMap = updatedAssetRefMap; + // + // this.xcmRefMapSubject.next(this.xcmRefMap); + // this.swapRefMapSubject.next(this.swapRefMap); + // this.logger.log('Finished updating latest asset ref'); + // } - this.logger.log('Finished updating latest asset'); + handleLatestPriceId (latestPriceIds: Record) { + let isUpdated = false; + + Object.entries(latestPriceIds).forEach(([slug, priceId]) => { + if (this.dataMap.assetRegistry[slug] && this.dataMap.assetRegistry[slug].priceId !== priceId) { + isUpdated = true; + this.dataMap.assetRegistry[slug].priceId = priceId; + } + }); + + if (isUpdated) { + this.assetRegistrySubject.next(this.dataMap.assetRegistry); + this.eventService.emit('asset.updateState', ''); + } + + this.logger.log('Finished updating latest price IDs'); } + // handleLatestAssetData (latestAssetInfo: Record | null, latestAssetLogoMap: Record | null) { + // try { + // if (latestAssetInfo) { + // const latestAssetPatch = JSON.stringify(latestAssetInfo); + // + // if (this.assetMapPatch !== latestAssetPatch) { + // const assetRegistry = filterAssetInfoMap(this.getChainInfoMap(), Object.assign({}, this.dataMap.assetRegistry, latestAssetInfo)); + // + // this.assetMapPatch = latestAssetPatch; + // this.dataMap.assetRegistry = assetRegistry; + // this.assetRegistrySubject.next(assetRegistry); + // + // this.autoEnableTokens() + // .then(() => { + // this.eventService.emit('asset.updateState', ''); + // }) + // .catch(console.error); + // } + // } + // + // if (latestAssetLogoMap) { + // const latestAssetLogoPatch = JSON.stringify(latestAssetLogoMap); + // + // if (this.assetLogoPatch !== latestAssetLogoPatch) { + // const logoMap = { ...AssetLogoMap, ...latestAssetLogoMap }; + // + // this.assetLogoPatch = latestAssetLogoPatch; + // this.assetLogoMapSubject.next(logoMap); + // } + // } + // } catch (e) { + // console.error('Error fetching latest asset data'); + // } + // + // this.eventService.emit('asset.online.ready', true); + // + // this.logger.log('Finished updating latest asset'); + // } + async autoEnableTokens () { const autoEnableTokens = Object.values(this.dataMap.assetRegistry).filter((asset) => _isAssetAutoEnable(asset)); @@ -836,21 +898,31 @@ export class ChainService { } handleLatestData () { - this.fetchLatestAssetData().then(([latestAssetInfo, latestAssetLogoMap]) => { - this.eventService.waitAssetReady - .then(() => { - this.handleLatestAssetData(latestAssetInfo, latestAssetLogoMap); - }) - .catch(console.error); + // this.fetchLatestAssetData().then(([latestAssetInfo, latestAssetLogoMap]) => { + // this.eventService.waitAssetReady + // .then(() => { + // this.handleLatestAssetData(latestAssetInfo, latestAssetLogoMap); + // }) + // .catch(console.error); + // }).catch(console.error); + + this.fetchLatestPatchData().then((latestPatch) => { + if (latestPatch) { + this.eventService.waitAssetReady + .then(() => { + this.handleLatestPatch(latestPatch); + }) + .catch(console.error); + } }).catch(console.error); this.fetchLatestChainData().then((latestChainInfo) => { this.handleLatestChainData(latestChainInfo); }).catch(console.error); - this.fetchLatestAssetRef().then(([latestAssetRef, latestAssetRefMap]) => { - this.handleLatestAssetRef(latestAssetRef, latestAssetRefMap); - }).catch(console.error); + // this.fetchLatestAssetRef().then(([latestAssetRef, latestAssetRefMap]) => { + // this.handleLatestAssetRef(latestAssetRef, latestAssetRefMap); + // }).catch(console.error); this.fetchLatestPriceIdsData().then((latestPriceIds) => { this.handleLatestPriceId(latestPriceIds); @@ -1154,8 +1226,12 @@ export class ChainService { // } } - private async fetchLatestAssetData () { - return await Promise.all([fetchPatchData>('ChainAsset.json'), fetchPatchData>('AssetLogoMap.json')]); + // private async fetchLatestAssetData () { + // return await Promise.all([fetchPatchData>('ChainAsset.json'), fetchPatchData>('AssetLogoMap.json')]); // lastest logo also here. + // } + + private async fetchLatestPatchData () { + return await fetchPatchData('data.json'); } // @ts-ignore @@ -1163,9 +1239,9 @@ export class ChainService { return await fetchStaticData>('chain-assets/price-map'); } - private async fetchLatestAssetRef () { - return await Promise.all([fetchStaticData('chain-assets/disabled-xcm-channels'), fetchPatchData>('AssetRef.json')]); - } + // private async fetchLatestAssetRef () { + // return await Promise.all([fetchStaticData('chain-assets/disabled-xcm-channels'), fetchPatchData>('AssetRef.json')]); // + // } private async fetchLatestLedgerGenericAllowChains () { return await fetchStaticData('chains/ledger-generic-allow-chains') || []; diff --git a/packages/extension-base/src/services/chain-service/utils/patch.ts b/packages/extension-base/src/services/chain-service/utils/patch.ts index 9b83cd93de8..d1d84c42f91 100644 --- a/packages/extension-base/src/services/chain-service/utils/patch.ts +++ b/packages/extension-base/src/services/chain-service/utils/patch.ts @@ -1,11 +1,26 @@ // Copyright 2019-2022 @subwallet/extension-base // SPDX-License-Identifier: Apache-2.0 +import { _ChainAsset, _ChainInfo, _MultiChainAsset } from '@subwallet/chain-list/types'; + const PRODUCTION_BRANCHES = ['master', 'webapp', 'webapp-dev']; const branchName = process.env.BRANCH_NAME || 'subwallet-dev'; const fetchDomain = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'https://chain-list-assets.subwallet.app' : 'https://dev.sw-chain-list-assets.pages.dev'; -const ChainListVersion = '0.2.62'; +const ChainListVersion = '0.2.92'; + +// todo: move this interface to chainlist +export interface PatchInfo { + patchVersion: string, + appliedVersion: string, + fetchedDate: string, + ChainInfo: Record, + ChainInfoHashMap: Record, + ChainAsset: Record, + ChainAssetHashMap: Record, + MultiChainAsset: Record, + MultiChainAssetHashMap: Record +} export async function fetchPatchData (slug: string) { try { diff --git a/yarn.lock b/yarn.lock index 9607b5d8b54..2e5fcbdbfc9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6355,6 +6355,7 @@ __metadata: protobufjs: ^7.2.4 rxjs: ^7.8.1 sails-js: ^0.1.6 + ts-md5: ^1.3.1 tweetnacl: ^1.0.3 uuid: ^9.0.0 web3: ^1.10.0 @@ -27080,6 +27081,13 @@ __metadata: languageName: node linkType: hard +"ts-md5@npm:^1.3.1": + version: 1.3.1 + resolution: "ts-md5@npm:1.3.1" + checksum: 88fc4df837e17949fef92a8e71a0691b20e2f8b02a002876a162a102e7c9d364f1eb00cbd217f9578fec5fa07bb66ffa14ed054cdfe164486fab2173c8e9ea23 + languageName: node + linkType: hard + "tsconfig-paths@npm:^3.10.1, tsconfig-paths@npm:^3.14.1": version: 3.14.1 resolution: "tsconfig-paths@npm:3.14.1" From bf79b631d71d86ac5ae68d986a08927c6413951c Mon Sep 17 00:00:00 2001 From: S2kael Date: Mon, 4 Nov 2024 16:44:07 +0700 Subject: [PATCH 037/204] [Issue-3001] Fix reset pool target --- .../Field/Earning/EarningPoolSelector.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/extension-koni-ui/src/components/Field/Earning/EarningPoolSelector.tsx b/packages/extension-koni-ui/src/components/Field/Earning/EarningPoolSelector.tsx index ad67d7853bc..900c5a66ff8 100644 --- a/packages/extension-koni-ui/src/components/Field/Earning/EarningPoolSelector.tsx +++ b/packages/extension-koni-ui/src/components/Field/Earning/EarningPoolSelector.tsx @@ -50,7 +50,10 @@ const SORTING_MODAL_ID = 'pool-sorting-modal'; const FILTER_MODAL_ID = 'pool-filter-modal'; const Component = (props: Props, ref: ForwardedRef) => { - const { chain, className = '', defaultValue, disabled, + const { chain, + className = '', + defaultValue: cachedValue, + disabled, from, id = 'pool-selector', label, loading, onChange, @@ -213,6 +216,10 @@ const Component = (props: Props, ref: ForwardedRef) => { , [disabled, items.length, nominationPoolValueList.length] ); + const stakedPool = useMemo(() => nominationPoolValueList[0], [nominationPoolValueList]); + + const defaultPool = useMemo(() => (defaultSelectPool?.[0] || '').toString(), [defaultSelectPool]); + const _onSelectItem = useCallback((value: string) => { onChange && onChange({ target: { value } }); }, [onChange]); @@ -364,11 +371,11 @@ const Component = (props: Props, ref: ForwardedRef) => { }, []); useEffect(() => { - const defaultSelectedPool = defaultValue || nominationPoolValueList[0] || `${defaultSelectPool?.[0] || ''}`; + const defaultSelectedPool = stakedPool || value || cachedValue || defaultPool; onChange && onChange({ target: { value: defaultSelectedPool } }); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [nominationPoolValueList, items]); + }, [stakedPool, items]); useEffect(() => { if (!isActive) { From 929261d71a337dc12032966ec057b69b50a1751b Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Mon, 4 Nov 2024 18:10:30 +0700 Subject: [PATCH 038/204] [Issue-3828] Update chainlist --- package.json | 2 +- packages/extension-base/package.json | 2 +- .../src/services/transaction-service/utils.ts | 4 ++++ packages/extension-koni-ui/package.json | 2 +- packages/extension-web-ui/package.json | 2 +- yarn.lock | 14 +++++++------- 6 files changed, 15 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index d6511a936c7..5a8a277eab8 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@polkadot/types-support": "^12.0.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/chain-list": "0.2.92", + "@subwallet/chain-list": "0.2.93-beta.1", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b79", "@subwallet/ui-keyring": "0.1.8-beta.0", diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index 48b6709c6df..a4712083e98 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -55,7 +55,7 @@ "@reduxjs/toolkit": "^1.9.1", "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", - "@subwallet/chain-list": "0.2.92", + "@subwallet/chain-list": "0.2.93-beta.1", "@subwallet/extension-base": "^1.3.5-0", "@subwallet/extension-chains": "^1.3.5-0", "@subwallet/extension-dapp": "^1.3.5-0", diff --git a/packages/extension-base/src/services/transaction-service/utils.ts b/packages/extension-base/src/services/transaction-service/utils.ts index 953ab1431ea..c46a52ca164 100644 --- a/packages/extension-base/src/services/transaction-service/utils.ts +++ b/packages/extension-base/src/services/transaction-service/utils.ts @@ -39,6 +39,10 @@ function getBlockExplorerAccountRoute (explorerLink: string) { return '#/accounts'; } + if (explorerLink.includes('tangle.statescan.io')) { + return '#/accounts'; + } + if (explorerLink.includes('explorer.zkverify.io')) { return 'account'; } diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index e1cc764aa3a..2ebc4fde302 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -34,7 +34,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.92", + "@subwallet/chain-list": "0.2.93-beta.1", "@subwallet/extension-base": "^1.3.5-0", "@subwallet/extension-chains": "^1.3.5-0", "@subwallet/extension-dapp": "^1.3.5-0", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index 3622378b7c5..a89b33efe71 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -35,7 +35,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.92", + "@subwallet/chain-list": "0.2.93-beta.1", "@subwallet/extension-base": "^1.3.5-0", "@subwallet/extension-chains": "^1.3.5-0", "@subwallet/extension-dapp": "^1.3.5-0", diff --git a/yarn.lock b/yarn.lock index 9607b5d8b54..5343cf42465 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6265,14 +6265,14 @@ __metadata: languageName: node linkType: hard -"@subwallet/chain-list@npm:0.2.92": - version: 0.2.92 - resolution: "@subwallet/chain-list@npm:0.2.92" +"@subwallet/chain-list@npm:0.2.93-beta.1": + version: 0.2.93-beta.1 + resolution: "@subwallet/chain-list@npm:0.2.93-beta.1" dependencies: "@polkadot/dev": 0.67.167 "@polkadot/util": ^12.5.1 eventemitter3: ^5.0.1 - checksum: 358078ca2948031004ba5f62b1aa870e8ac5189f51beafafdfefa0091858e10b4c52a8987be49a5445b63fd969f13bb7b572f4fdfb43fa45076514b8f7fbdb18 + checksum: dd006f0162aa223069fb2841296d640b2bb2cfaebfb53ceae59aca28ffc578ed3f5e81be7d8a512ed55bfa20fcb1d5a1fcad4968218278e203ec69fac403b683 languageName: node linkType: hard @@ -6315,7 +6315,7 @@ __metadata: "@reduxjs/toolkit": ^1.9.1 "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 - "@subwallet/chain-list": 0.2.92 + "@subwallet/chain-list": 0.2.93-beta.1 "@subwallet/extension-base": ^1.3.5-0 "@subwallet/extension-chains": ^1.3.5-0 "@subwallet/extension-dapp": ^1.3.5-0 @@ -6453,7 +6453,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.92 + "@subwallet/chain-list": 0.2.93-beta.1 "@subwallet/extension-base": ^1.3.5-0 "@subwallet/extension-chains": ^1.3.5-0 "@subwallet/extension-dapp": ^1.3.5-0 @@ -6593,7 +6593,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.92 + "@subwallet/chain-list": 0.2.93-beta.1 "@subwallet/extension-base": ^1.3.5-0 "@subwallet/extension-chains": ^1.3.5-0 "@subwallet/extension-dapp": ^1.3.5-0 From b8087e03c871964c8116c4f6fccfc9951bdd345b Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Mon, 4 Nov 2024 19:23:44 +0700 Subject: [PATCH 039/204] [Issue-3132] temp --- .../src/koni/background/handlers/State.ts | 5 + .../services/chain-online-service/index.ts | 170 ++++++++++++++++++ .../src/services/chain-service/index.ts | 101 ++--------- 3 files changed, 185 insertions(+), 91 deletions(-) create mode 100644 packages/extension-base/src/services/chain-online-service/index.ts diff --git a/packages/extension-base/src/koni/background/handlers/State.ts b/packages/extension-base/src/koni/background/handlers/State.ts index b79a3f78710..5849323bfcf 100644 --- a/packages/extension-base/src/koni/background/handlers/State.ts +++ b/packages/extension-base/src/koni/background/handlers/State.ts @@ -14,6 +14,7 @@ import { BalanceService } from '@subwallet/extension-base/services/balance-servi import { ServiceStatus } from '@subwallet/extension-base/services/base/types'; import BuyService from '@subwallet/extension-base/services/buy-service'; import CampaignService from '@subwallet/extension-base/services/campaign-service'; +import { ChainOnlineService } from '@subwallet/extension-base/services/chain-online-service'; import { ChainService } from '@subwallet/extension-base/services/chain-service'; import { _DEFAULT_MANTA_ZK_CHAIN, _MANTA_ZK_CHAIN_GROUP, _PREDEFINED_SINGLE_MODES } from '@subwallet/extension-base/services/chain-service/constants'; import { _ChainState, _NetworkUpsertParams, _ValidateCustomAssetRequest } from '@subwallet/extension-base/services/chain-service/types'; @@ -132,6 +133,7 @@ export default class KoniState { readonly feeService: FeeService; readonly swapService: SwapService; readonly inappNotificationService: InappNotificationService; + readonly chainOnlineService: ChainOnlineService; // Handle the general status of the extension private generalStatus: ServiceStatus = ServiceStatus.INITIALIZING; @@ -165,6 +167,7 @@ export default class KoniState { this.feeService = new FeeService(this); this.swapService = new SwapService(this); this.inappNotificationService = new InappNotificationService(this.dbService, this.keyringService, this.eventService, this.chainService); + this.chainOnlineService = new ChainOnlineService(this.chainService, this.eventService); this.subscription = new KoniSubscription(this, this.dbService); this.cron = new KoniCron(this, this.subscription, this.dbService); @@ -303,6 +306,7 @@ export default class KoniState { await this.startSubscription(); this.chainService.checkLatestData(); + this.chainOnlineService.checkLatestData(); } public async initMantaPay (password: string) { @@ -1640,6 +1644,7 @@ export default class KoniState { this.afterChainServiceInit(); this.chainService.checkLatestData(); + this.chainOnlineService.checkLatestData(); } public async enableMantaPay (updateStore: boolean, address: string, password: string, seedPhrase?: string) { diff --git a/packages/extension-base/src/services/chain-online-service/index.ts b/packages/extension-base/src/services/chain-online-service/index.ts new file mode 100644 index 00000000000..709aa34fa1f --- /dev/null +++ b/packages/extension-base/src/services/chain-online-service/index.ts @@ -0,0 +1,170 @@ +// [object Object] +// SPDX-License-Identifier: Apache-2.0 + +import { MultiChainAssetMap } from '@subwallet/chain-list'; +import { _ChainAsset, _ChainInfo, _MultiChainAsset } from '@subwallet/chain-list/types'; +import { ChainService, filterAssetInfoMap } from '@subwallet/extension-base/services/chain-service'; +import { LATEST_CHAIN_DATA_FETCHING_INTERVAL } from '@subwallet/extension-base/services/chain-service/constants'; +import { fetchPatchData, PatchInfo } from '@subwallet/extension-base/services/chain-service/utils'; +import { EventService } from '@subwallet/extension-base/services/event-service'; +import { Md5 } from 'ts-md5'; + +export class ChainOnlineService { + private chainService: ChainService; + private eventService: EventService; + + refreshLatestChainDataTimeOut: NodeJS.Timer | undefined; + private patchVersion = ''; + + constructor (chainService: ChainService, eventService: EventService) { + this.chainService = chainService; + this.eventService = eventService; + } + + md5Hash (data: any) { + return Md5.hashStr(JSON.stringify(data)); + } + + validatePatchWithHash (latestPatch: PatchInfo) { + const { ChainAsset, ChainAssetHashMap, ChainInfo, ChainInfoHashMap, MultiChainAsset, MultiChainAssetHashMap } = latestPatch; + + for (const [chainSlug, chain] of Object.entries(ChainInfo)) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { chainStatus, providers, ...chainWithoutProvidersAndStatus } = chain; + + if (this.md5Hash(chainWithoutProvidersAndStatus) !== ChainInfoHashMap[chainSlug]) { + return false; + } + } + + for (const [assetSlug, asset] of Object.entries(ChainAsset)) { + if (this.md5Hash(asset) !== ChainAssetHashMap[assetSlug]) { + return false; + } + } + + for (const [mAssetSlug, mAsset] of Object.entries(MultiChainAsset)) { + if (this.md5Hash(mAsset) !== MultiChainAssetHashMap[mAssetSlug]) { + return false; + } + } + + return true; + } + + validatePatchBeforeStore (candidateChainInfoMap: Record, candidateAssetRegistry: Record, candidateMultiChainAssetMap: Record, latestPatch: PatchInfo) { + for (const [chainSlug, chainHash] of Object.entries(latestPatch.ChainInfoHashMap)) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { chainStatus, providers, ...chainWithoutProvidersAndStatus } = candidateChainInfoMap[chainSlug]; + + if (this.md5Hash(chainWithoutProvidersAndStatus) !== chainHash) { + return false; + } + } + + for (const [assetSlug, assetHash] of Object.entries(latestPatch.ChainAssetHashMap)) { + if (!candidateAssetRegistry[assetSlug]) { + if (latestPatch.) + } + + if (this.md5Hash(candidateAssetRegistry[assetSlug]) !== assetHash) { + return false; + } + } + + console.log('b'); + + for (const [mAssetSlug, mAssetHash] of Object.entries(latestPatch.MultiChainAssetHashMap)) { + if (this.md5Hash(candidateMultiChainAssetMap[mAssetSlug]) !== mAssetHash) { + return false; + } + } + + console.log('c'); + + return true; + } + + handleLatestPatch (latestPatch: PatchInfo) { + try { + // 1. validate fetch data with its hash + const isSafePatch = this.validatePatchWithHash(latestPatch); + const { ChainAsset: latestAssetInfo, ChainInfo: latestChainInfo, MultiChainAsset: latestMultiChainAsset, patchVersion } = latestPatch; + let chainInfoMap = {}; + let assetRegistry = {}; + let multiChainAssetMap = {}; + // todo: AssetLogoMap, ChainLogoMap + console.log('[i] isSafePatch', isSafePatch) + console.log('[i] latestPatch', latestPatch) + + if (isSafePatch && this.patchVersion !== patchVersion) { + // 2. merge data map + if (latestChainInfo && Object.keys(latestChainInfo).length > 0) { + chainInfoMap = Object.assign({}, this.chainService.getChainInfoMap(), latestChainInfo); + } + + console.log('[i] done chain') + + if (latestAssetInfo && Object.keys(latestAssetInfo).length > 0) { + assetRegistry = filterAssetInfoMap(this.chainService.getChainInfoMap(), Object.assign({}, this.chainService.getAssetRegistry(), latestAssetInfo)); + } + + console.log('[i] done asset') + + if (latestMultiChainAsset && Object.keys(latestMultiChainAsset).length > 0) { + multiChainAssetMap = { ...MultiChainAssetMap, ...latestMultiChainAsset }; + } + + console.log('[i] done multi asset') + + // 3. validate data before write + const isCorrectPatch = this.validatePatchBeforeStore(chainInfoMap, assetRegistry, multiChainAssetMap, latestPatch); + console.log('[i] isCorrectPatch', isCorrectPatch) + + // 4. write to subject + if (isCorrectPatch) { + this.chainService.setChainInfoMap(chainInfoMap); + this.chainService.subscribeChainInfoMap().next(chainInfoMap); + + this.chainService.setAssetRegistry(assetRegistry); + this.chainService.subscribeAssetRegistry().next(assetRegistry); + this.chainService.autoEnableTokens() + .then(() => { + this.eventService.emit('asset.updateState', ''); + }) + .catch(console.error); + + this.chainService.subscribeMultiChainAssetMap().next(multiChainAssetMap); + this.patchVersion = patchVersion; + } + } + } catch (e) { + console.error('Error fetching latest patch data'); + } + + this.eventService.emit('asset.online.ready', true); + } + + private async fetchLatestPatchData () { + return await fetchPatchData('data.json'); + } + + handleLatestData () { + this.fetchLatestPatchData().then((latestPatch) => { + if (latestPatch) { + this.eventService.waitAssetReady + .then(() => { + this.handleLatestPatch(latestPatch); + }) + .catch(console.error); + } + }).catch(console.error); + } + + checkLatestData () { + clearInterval(this.refreshLatestChainDataTimeOut); + this.handleLatestData(); + + this.refreshLatestChainDataTimeOut = setInterval(this.handleLatestData.bind(this), LATEST_CHAIN_DATA_FETCHING_INTERVAL); + } +} diff --git a/packages/extension-base/src/services/chain-service/index.ts b/packages/extension-base/src/services/chain-service/index.ts index 629a96655cd..2568fd371cc 100644 --- a/packages/extension-base/src/services/chain-service/index.ts +++ b/packages/extension-base/src/services/chain-service/index.ts @@ -11,14 +11,13 @@ import { SubstrateChainHandler } from '@subwallet/extension-base/services/chain- import { TonChainHandler } from '@subwallet/extension-base/services/chain-service/handler/TonChainHandler'; import { _CHAIN_VALIDATION_ERROR } from '@subwallet/extension-base/services/chain-service/handler/types'; import { _ChainApiStatus, _ChainConnectionStatus, _ChainState, _CUSTOM_PREFIX, _DataMap, _EvmApi, _NetworkUpsertParams, _NFT_CONTRACT_STANDARDS, _SMART_CONTRACT_STANDARDS, _SmartContractTokenInfo, _SubstrateApi, _ValidateCustomAssetRequest, _ValidateCustomAssetResponse } from '@subwallet/extension-base/services/chain-service/types'; -import { _isAssetAutoEnable, _isAssetCanPayTxFee, _isAssetFungibleToken, _isChainEnabled, _isCustomAsset, _isCustomChain, _isCustomProvider, _isEqualContractAddress, _isEqualSmartContractAsset, _isLocalToken, _isMantaZkAsset, _isPureEvmChain, _isPureSubstrateChain, _parseAssetRefKey, fetchPatchData, PatchInfo, randomizeProvider, updateLatestChainInfo } from '@subwallet/extension-base/services/chain-service/utils'; +import { _isAssetAutoEnable, _isAssetCanPayTxFee, _isAssetFungibleToken, _isChainEnabled, _isCustomAsset, _isCustomChain, _isCustomProvider, _isEqualContractAddress, _isEqualSmartContractAsset, _isLocalToken, _isMantaZkAsset, _isPureEvmChain, _isPureSubstrateChain, _parseAssetRefKey, randomizeProvider, updateLatestChainInfo } from '@subwallet/extension-base/services/chain-service/utils'; import { EventService } from '@subwallet/extension-base/services/event-service'; import { IChain, IMetadataItem } from '@subwallet/extension-base/services/storage-service/databases'; import DatabaseService from '@subwallet/extension-base/services/storage-service/DatabaseService'; import AssetSettingStore from '@subwallet/extension-base/stores/AssetSetting'; import { addLazy, calculateMetadataHash, fetchStaticData, filterAssetsByChainAndType, getShortMetadata, MODULE_SUPPORT } from '@subwallet/extension-base/utils'; import { BehaviorSubject, Subject } from 'rxjs'; -import { Md5 } from 'ts-md5'; import Web3 from 'web3'; import { logger as createLogger } from '@polkadot/util/logger'; @@ -51,7 +50,7 @@ const ignoredList = [ 'storyPartner_testnet' ]; -const filterAssetInfoMap = (chainInfo: Record, assets: Record): Record => { +export const filterAssetInfoMap = (chainInfo: Record, assets: Record): Record => { return Object.fromEntries( Object.entries(assets) .filter(([, info]) => chainInfo[info.originChain]) @@ -109,9 +108,6 @@ export class ChainService { private assetLogoMapSubject = new BehaviorSubject>(AssetLogoMap); private chainLogoMapSubject = new BehaviorSubject>(ChainLogoMap); private ledgerGenericAllowChainsSubject = new BehaviorSubject([]); - // private assetMapPatch: string = JSON.stringify({}); - // private assetLogoPatch: string = JSON.stringify({}); - private appliedPatchVersion = ''; // Todo: Update to new store indexed DB private store: AssetSettingStore = new AssetSettingStore(); @@ -253,6 +249,10 @@ export class ChainService { return this.dataMap.assetRegistry; } + public setAssetRegistry (assetRegistry: Record) { + this.dataMap.assetRegistry = assetRegistry; + } + public getMultiChainAssetMap () { return MultiChainAssetMap; } @@ -285,6 +285,10 @@ export class ChainService { return this.dataMap.chainInfoMap; } + public setChainInfoMap (chainInfoMap: Record) { + this.dataMap.chainInfoMap = chainInfoMap; + } + public getEvmChainInfoMap (): Record { const result: Record = {}; @@ -700,77 +704,6 @@ export class ChainService { clearInterval(this.refreshLatestChainDataTimeOut); } - validatePatchWithHash (latestPatch: PatchInfo) { - const { ChainAsset, ChainAssetHashMap, ChainInfo, ChainInfoHashMap, MultiChainAsset, MultiChainAssetHashMap } = latestPatch; - - for (const [chainSlug, chain] of Object.entries(ChainInfo)) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { chainStatus, providers, ...chainWithoutProvidersAndStatus } = chain; - - if (Md5.hashStr(JSON.stringify(chainWithoutProvidersAndStatus)) !== ChainInfoHashMap[chainSlug]) { - return false; - } - } - - for (const [assetSlug, asset] of Object.entries(ChainAsset)) { - if (Md5.hashStr(JSON.stringify(asset)) !== ChainAssetHashMap[assetSlug]) { - return false; - } - } - - for (const [mAssetSlug, mAsset] of Object.entries(MultiChainAsset)) { - if (Md5.hashStr(JSON.stringify(mAsset)) !== MultiChainAssetHashMap[mAssetSlug]) { - return false; - } - } - - return true; - } - - handleLatestPatch (latestPatch: PatchInfo) { - try { - const isSafePatch = this.validatePatchWithHash(latestPatch); - const { ChainAsset: latestAssetInfo, ChainInfo: latestChainInfo, MultiChainAsset: latestMultiChainAsset, appliedVersion } = latestPatch; - // todo: AssetLogoMap, ChainLogoMap - - if (isSafePatch && this.appliedPatchVersion !== appliedVersion) { - if (latestChainInfo && Object.keys(latestChainInfo).length > 0) { - const chainInfoMap = Object.assign({}, this.dataMap.chainInfoMap, latestChainInfo); - - this.dataMap.chainInfoMap = chainInfoMap; - this.chainInfoMapSubject.next(chainInfoMap); - } - - if (latestAssetInfo && Object.keys(latestAssetInfo).length > 0) { - const assetRegistry = filterAssetInfoMap(this.getChainInfoMap(), Object.assign({}, this.dataMap.assetRegistry, latestAssetInfo)); - - this.dataMap.assetRegistry = assetRegistry; - this.assetRegistrySubject.next(assetRegistry); - - this.autoEnableTokens() - .then(() => { - this.eventService.emit('asset.updateState', ''); - }) - .catch(console.error); - } - - if (latestMultiChainAsset && Object.keys(latestMultiChainAsset).length > 0) { - const multiChainAssetMap = { ...MultiChainAssetMap, ...latestMultiChainAsset }; - - this.multiChainAssetMapSubject.next(multiChainAssetMap); - } - - this.appliedPatchVersion = appliedVersion; - } - } catch (e) { - console.error('Error fetching latest patch data'); - } - - this.eventService.emit('asset.online.ready', true); - - this.logger.log('Finished updating latest asset'); - } - handleLatestChainData (latestChainInfo: _ChainInfo[]) { try { if (latestChainInfo && latestChainInfo.length > 0) { @@ -906,16 +839,6 @@ export class ChainService { // .catch(console.error); // }).catch(console.error); - this.fetchLatestPatchData().then((latestPatch) => { - if (latestPatch) { - this.eventService.waitAssetReady - .then(() => { - this.handleLatestPatch(latestPatch); - }) - .catch(console.error); - } - }).catch(console.error); - this.fetchLatestChainData().then((latestChainInfo) => { this.handleLatestChainData(latestChainInfo); }).catch(console.error); @@ -1230,10 +1153,6 @@ export class ChainService { // return await Promise.all([fetchPatchData>('ChainAsset.json'), fetchPatchData>('AssetLogoMap.json')]); // lastest logo also here. // } - private async fetchLatestPatchData () { - return await fetchPatchData('data.json'); - } - // @ts-ignore private async fetchLatestPriceIdsData () { return await fetchStaticData>('chain-assets/price-map'); From a47c54d8b0b720234787cc9c68dd329bd268399f Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Tue, 5 Nov 2024 09:17:48 +0700 Subject: [PATCH 040/204] [Issue-3132] fix: fix validate deleted assets --- .../src/koni/background/handlers/State.ts | 2 ++ .../services/chain-online-service/index.ts | 21 ++++++------------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/packages/extension-base/src/koni/background/handlers/State.ts b/packages/extension-base/src/koni/background/handlers/State.ts index 5849323bfcf..dc42442bc47 100644 --- a/packages/extension-base/src/koni/background/handlers/State.ts +++ b/packages/extension-base/src/koni/background/handlers/State.ts @@ -1006,6 +1006,8 @@ export default class KoniState { } async resumeAllNetworks () { + this.chainOnlineService.checkLatestData(); + return this.chainService.resumeAllChainApis(); } diff --git a/packages/extension-base/src/services/chain-online-service/index.ts b/packages/extension-base/src/services/chain-online-service/index.ts index 709aa34fa1f..5fb9a532a3d 100644 --- a/packages/extension-base/src/services/chain-online-service/index.ts +++ b/packages/extension-base/src/services/chain-online-service/index.ts @@ -1,4 +1,4 @@ -// [object Object] +// Copyright 2019-2022 @subwallet/extension-koni authors & contributors // SPDX-License-Identifier: Apache-2.0 import { MultiChainAssetMap } from '@subwallet/chain-list'; @@ -64,7 +64,11 @@ export class ChainOnlineService { for (const [assetSlug, assetHash] of Object.entries(latestPatch.ChainAssetHashMap)) { if (!candidateAssetRegistry[assetSlug]) { - if (latestPatch.) + if (!latestPatch.ChainInfo[assetSlug]) { // assets are not existed in case chain is removed + continue; + } + + return false; } if (this.md5Hash(candidateAssetRegistry[assetSlug]) !== assetHash) { @@ -72,16 +76,12 @@ export class ChainOnlineService { } } - console.log('b'); - for (const [mAssetSlug, mAssetHash] of Object.entries(latestPatch.MultiChainAssetHashMap)) { if (this.md5Hash(candidateMultiChainAssetMap[mAssetSlug]) !== mAssetHash) { return false; } } - console.log('c'); - return true; } @@ -94,8 +94,6 @@ export class ChainOnlineService { let assetRegistry = {}; let multiChainAssetMap = {}; // todo: AssetLogoMap, ChainLogoMap - console.log('[i] isSafePatch', isSafePatch) - console.log('[i] latestPatch', latestPatch) if (isSafePatch && this.patchVersion !== patchVersion) { // 2. merge data map @@ -103,23 +101,16 @@ export class ChainOnlineService { chainInfoMap = Object.assign({}, this.chainService.getChainInfoMap(), latestChainInfo); } - console.log('[i] done chain') - if (latestAssetInfo && Object.keys(latestAssetInfo).length > 0) { assetRegistry = filterAssetInfoMap(this.chainService.getChainInfoMap(), Object.assign({}, this.chainService.getAssetRegistry(), latestAssetInfo)); } - console.log('[i] done asset') - if (latestMultiChainAsset && Object.keys(latestMultiChainAsset).length > 0) { multiChainAssetMap = { ...MultiChainAssetMap, ...latestMultiChainAsset }; } - console.log('[i] done multi asset') - // 3. validate data before write const isCorrectPatch = this.validatePatchBeforeStore(chainInfoMap, assetRegistry, multiChainAssetMap, latestPatch); - console.log('[i] isCorrectPatch', isCorrectPatch) // 4. write to subject if (isCorrectPatch) { From 469b70dcfa3c7c0f4062397080f51a657b35aa02 Mon Sep 17 00:00:00 2001 From: S2kael Date: Tue, 5 Nov 2024 11:41:16 +0700 Subject: [PATCH 041/204] [Issue-3001] Update hook dependancies --- .../Field/Earning/EarningPoolSelector.tsx | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/packages/extension-koni-ui/src/components/Field/Earning/EarningPoolSelector.tsx b/packages/extension-koni-ui/src/components/Field/Earning/EarningPoolSelector.tsx index 900c5a66ff8..a6b492a7ff7 100644 --- a/packages/extension-koni-ui/src/components/Field/Earning/EarningPoolSelector.tsx +++ b/packages/extension-koni-ui/src/components/Field/Earning/EarningPoolSelector.tsx @@ -130,7 +130,17 @@ const Component = (props: Props, ref: ForwardedRef) => { return compound?.nominations.map((item) => item.validatorAddress) || []; }, [compound?.nominations]); - const defaultSelectPool = defaultPoolMap?.[chain]; + const stakedPool = useMemo(() => nominationPoolValueList[0], [nominationPoolValueList]); + + const recommendPool = useMemo(() => { + const recommendPools: number[] = defaultPoolMap?.[chain] || []; + + if (recommendPools.length) { + return recommendPools[0].toString(); + } else { + return ''; + } + }, [defaultPoolMap, chain]); const resultList = useMemo((): NominationPoolDataType[] => { const recommendedSessionHeader: NominationPoolDataType = { address: '', bondedAmount: '', decimals: 0, id: -1, idStr: '-1', isProfitable: false, memberCounter: 0, roles: { bouncer: '', depositor: '', nominator: '', root: '' }, state: 'Open', symbol: '', name: 'Recommended', isSessionHeader: true, disabled: true }; @@ -216,10 +226,6 @@ const Component = (props: Props, ref: ForwardedRef) => { , [disabled, items.length, nominationPoolValueList.length] ); - const stakedPool = useMemo(() => nominationPoolValueList[0], [nominationPoolValueList]); - - const defaultPool = useMemo(() => (defaultSelectPool?.[0] || '').toString(), [defaultSelectPool]); - const _onSelectItem = useCallback((value: string) => { onChange && onChange({ target: { value } }); }, [onChange]); @@ -371,11 +377,11 @@ const Component = (props: Props, ref: ForwardedRef) => { }, []); useEffect(() => { - const defaultSelectedPool = stakedPool || value || cachedValue || defaultPool; + const defaultSelectedPool = stakedPool || value || cachedValue || recommendPool; onChange && onChange({ target: { value: defaultSelectedPool } }); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [stakedPool, items]); + }, [stakedPool, recommendPool, items]); useEffect(() => { if (!isActive) { From 93c093952ecded544ed319a49a911e52ec3aca02 Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Tue, 5 Nov 2024 14:12:11 +0700 Subject: [PATCH 042/204] [Issue-3132] fix: apply chain state for new chain --- .../src/koni/background/handlers/State.ts | 4 +-- .../services/chain-online-service/index.ts | 31 ++++++++++++++++--- .../src/services/chain-service/index.ts | 8 +++-- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/packages/extension-base/src/koni/background/handlers/State.ts b/packages/extension-base/src/koni/background/handlers/State.ts index dc42442bc47..652d97b83c4 100644 --- a/packages/extension-base/src/koni/background/handlers/State.ts +++ b/packages/extension-base/src/koni/background/handlers/State.ts @@ -305,8 +305,8 @@ export default class KoniState { await this.startSubscription(); - this.chainService.checkLatestData(); this.chainOnlineService.checkLatestData(); + this.chainService.checkLatestData(); } public async initMantaPay (password: string) { @@ -1645,8 +1645,8 @@ export default class KoniState { await this.chainService.init(); this.afterChainServiceInit(); - this.chainService.checkLatestData(); this.chainOnlineService.checkLatestData(); + this.chainService.checkLatestData(); } public async enableMantaPay (updateStore: boolean, address: string, password: string, seedPhrase?: string) { diff --git a/packages/extension-base/src/services/chain-online-service/index.ts b/packages/extension-base/src/services/chain-online-service/index.ts index 5fb9a532a3d..7be334ef51c 100644 --- a/packages/extension-base/src/services/chain-online-service/index.ts +++ b/packages/extension-base/src/services/chain-online-service/index.ts @@ -5,6 +5,7 @@ import { MultiChainAssetMap } from '@subwallet/chain-list'; import { _ChainAsset, _ChainInfo, _MultiChainAsset } from '@subwallet/chain-list/types'; import { ChainService, filterAssetInfoMap } from '@subwallet/extension-base/services/chain-service'; import { LATEST_CHAIN_DATA_FETCHING_INTERVAL } from '@subwallet/extension-base/services/chain-service/constants'; +import { _ChainState } from '@subwallet/extension-base/services/chain-service/types'; import { fetchPatchData, PatchInfo } from '@subwallet/extension-base/services/chain-service/utils'; import { EventService } from '@subwallet/extension-base/services/event-service'; import { Md5 } from 'ts-md5'; @@ -90,19 +91,37 @@ export class ChainOnlineService { // 1. validate fetch data with its hash const isSafePatch = this.validatePatchWithHash(latestPatch); const { ChainAsset: latestAssetInfo, ChainInfo: latestChainInfo, MultiChainAsset: latestMultiChainAsset, patchVersion } = latestPatch; - let chainInfoMap = {}; - let assetRegistry = {}; - let multiChainAssetMap = {}; + let chainInfoMap: Record = {}; + let assetRegistry: Record = {}; + let multiChainAssetMap: Record = {}; + let currentChainState: Record = {}; + + let addedChain: string[] = []; // todo: AssetLogoMap, ChainLogoMap if (isSafePatch && this.patchVersion !== patchVersion) { // 2. merge data map if (latestChainInfo && Object.keys(latestChainInfo).length > 0) { chainInfoMap = Object.assign({}, this.chainService.getChainInfoMap(), latestChainInfo); + + currentChainState = this.chainService.getChainStateMap(); + const currentChainStateKey = Object.keys(currentChainState); + const newChainStateKey = Object.keys(chainInfoMap); + + addedChain = newChainStateKey.filter((chain) => !currentChainStateKey.includes(chain)); + + addedChain.forEach((key) => { + currentChainState[key] = { + active: false, + currentProvider: Object.keys(chainInfoMap[key].providers)[0], + manualTurnOff: false, + slug: key + }; + }); } if (latestAssetInfo && Object.keys(latestAssetInfo).length > 0) { - assetRegistry = filterAssetInfoMap(this.chainService.getChainInfoMap(), Object.assign({}, this.chainService.getAssetRegistry(), latestAssetInfo)); + assetRegistry = filterAssetInfoMap(this.chainService.getChainInfoMap(), Object.assign({}, this.chainService.getAssetRegistry(), latestAssetInfo), addedChain); } if (latestMultiChainAsset && Object.keys(latestMultiChainAsset).length > 0) { @@ -126,6 +145,10 @@ export class ChainOnlineService { .catch(console.error); this.chainService.subscribeMultiChainAssetMap().next(multiChainAssetMap); + + this.chainService.setChainStateMap(currentChainState); + this.chainService.subscribeChainStateMap().next(currentChainState); + this.patchVersion = patchVersion; } } diff --git a/packages/extension-base/src/services/chain-service/index.ts b/packages/extension-base/src/services/chain-service/index.ts index 2568fd371cc..2be9e053b29 100644 --- a/packages/extension-base/src/services/chain-service/index.ts +++ b/packages/extension-base/src/services/chain-service/index.ts @@ -50,10 +50,10 @@ const ignoredList = [ 'storyPartner_testnet' ]; -export const filterAssetInfoMap = (chainInfo: Record, assets: Record): Record => { +export const filterAssetInfoMap = (chainInfo: Record, assets: Record, addedChains?: string[]): Record => { return Object.fromEntries( Object.entries(assets) - .filter(([, info]) => chainInfo[info.originChain]) + .filter(([, info]) => chainInfo[info.originChain] || addedChains?.includes(info.originChain)) ); }; @@ -359,6 +359,10 @@ export class ChainService { return this.dataMap.chainStateMap; } + public setChainStateMap (chainStateMap: Record) { + this.dataMap.chainStateMap = chainStateMap; + } + public getChainStateByKey (key: string) { return this.dataMap.chainStateMap[key]; } From 9534058db128a7e03a7643588e2c55a51273b6f8 Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Tue, 5 Nov 2024 14:53:25 +0700 Subject: [PATCH 043/204] [Issue-3132] feat: store patch version in local storage --- .../src/koni/background/handlers/State.ts | 2 +- .../services/chain-online-service/Chainlist.ts | 17 +++++++++++++++++ .../src/services/chain-online-service/index.ts | 14 +++++++++----- .../services/setting-service/SettingService.ts | 11 +++++++++++ .../extension-base/src/stores/ChainlistStore.ts | 15 +++++++++++++++ 5 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 packages/extension-base/src/services/chain-online-service/Chainlist.ts create mode 100644 packages/extension-base/src/stores/ChainlistStore.ts diff --git a/packages/extension-base/src/koni/background/handlers/State.ts b/packages/extension-base/src/koni/background/handlers/State.ts index 652d97b83c4..4ab4b3176c3 100644 --- a/packages/extension-base/src/koni/background/handlers/State.ts +++ b/packages/extension-base/src/koni/background/handlers/State.ts @@ -167,7 +167,7 @@ export default class KoniState { this.feeService = new FeeService(this); this.swapService = new SwapService(this); this.inappNotificationService = new InappNotificationService(this.dbService, this.keyringService, this.eventService, this.chainService); - this.chainOnlineService = new ChainOnlineService(this.chainService, this.eventService); + this.chainOnlineService = new ChainOnlineService(this.chainService, this.settingService, this.eventService); this.subscription = new KoniSubscription(this, this.dbService); this.cron = new KoniCron(this, this.subscription, this.dbService); diff --git a/packages/extension-base/src/services/chain-online-service/Chainlist.ts b/packages/extension-base/src/services/chain-online-service/Chainlist.ts new file mode 100644 index 00000000000..34d2f5cc160 --- /dev/null +++ b/packages/extension-base/src/services/chain-online-service/Chainlist.ts @@ -0,0 +1,17 @@ +// Copyright 2019-2022 @subwallet/extension-base +// SPDX-License-Identifier: Apache-2.0 + +import { StoreSubject } from '@subwallet/extension-base/services/keyring-service/context/stores/Base'; +import ChainlistStore from '@subwallet/extension-base/stores/ChainlistStore'; +import { BehaviorSubject } from 'rxjs'; + +interface ChainlistConfig { + patchVersion: string +} + +export class ChainlistStoreSubject extends StoreSubject { + store = new ChainlistStore(); + subject = new BehaviorSubject({ patchVersion: '' }); + key = 'Chainlist'; + defaultValue = { patchVersion: '' }; +} diff --git a/packages/extension-base/src/services/chain-online-service/index.ts b/packages/extension-base/src/services/chain-online-service/index.ts index 7be334ef51c..d490025eeb1 100644 --- a/packages/extension-base/src/services/chain-online-service/index.ts +++ b/packages/extension-base/src/services/chain-online-service/index.ts @@ -8,17 +8,19 @@ import { LATEST_CHAIN_DATA_FETCHING_INTERVAL } from '@subwallet/extension-base/s import { _ChainState } from '@subwallet/extension-base/services/chain-service/types'; import { fetchPatchData, PatchInfo } from '@subwallet/extension-base/services/chain-service/utils'; import { EventService } from '@subwallet/extension-base/services/event-service'; +import SettingService from '@subwallet/extension-base/services/setting-service/SettingService'; import { Md5 } from 'ts-md5'; export class ChainOnlineService { private chainService: ChainService; + private settingService: SettingService; private eventService: EventService; refreshLatestChainDataTimeOut: NodeJS.Timer | undefined; - private patchVersion = ''; - constructor (chainService: ChainService, eventService: EventService) { + constructor (chainService: ChainService, settingService: SettingService, eventService: EventService) { this.chainService = chainService; + this.settingService = settingService; this.eventService = eventService; } @@ -90,7 +92,9 @@ export class ChainOnlineService { try { // 1. validate fetch data with its hash const isSafePatch = this.validatePatchWithHash(latestPatch); - const { ChainAsset: latestAssetInfo, ChainInfo: latestChainInfo, MultiChainAsset: latestMultiChainAsset, patchVersion } = latestPatch; + const { ChainAsset: latestAssetInfo, ChainInfo: latestChainInfo, MultiChainAsset: latestMultiChainAsset, patchVersion: latestPatchVersion } = latestPatch; + const currentPatchVersion = this.settingService.getChainlistInfo().patchVersion; + let chainInfoMap: Record = {}; let assetRegistry: Record = {}; let multiChainAssetMap: Record = {}; @@ -99,7 +103,7 @@ export class ChainOnlineService { let addedChain: string[] = []; // todo: AssetLogoMap, ChainLogoMap - if (isSafePatch && this.patchVersion !== patchVersion) { + if (isSafePatch && currentPatchVersion !== latestPatchVersion) { // 2. merge data map if (latestChainInfo && Object.keys(latestChainInfo).length > 0) { chainInfoMap = Object.assign({}, this.chainService.getChainInfoMap(), latestChainInfo); @@ -149,7 +153,7 @@ export class ChainOnlineService { this.chainService.setChainStateMap(currentChainState); this.chainService.subscribeChainStateMap().next(currentChainState); - this.patchVersion = patchVersion; + this.settingService.setChainlist({ patchVersion: latestPatchVersion }); } } } catch (e) { diff --git a/packages/extension-base/src/services/setting-service/SettingService.ts b/packages/extension-base/src/services/setting-service/SettingService.ts index 91e757b7b9d..fb523a026d3 100644 --- a/packages/extension-base/src/services/setting-service/SettingService.ts +++ b/packages/extension-base/src/services/setting-service/SettingService.ts @@ -3,7 +3,9 @@ import { LanguageType, PassPhishing, RequestSettingsType, UiSettings } from '@subwallet/extension-base/background/KoniTypes'; import { LANGUAGE } from '@subwallet/extension-base/constants'; +import { ChainlistStoreSubject } from '@subwallet/extension-base/services/chain-online-service/Chainlist'; import { SWStorage } from '@subwallet/extension-base/storage'; +import { ChainlistConfig } from '@subwallet/extension-base/stores/ChainlistStore'; import PassPhishingStore from '@subwallet/extension-base/stores/PassPhishingStore'; import SettingsStore from '@subwallet/extension-base/stores/Settings'; import { Subject } from 'rxjs'; @@ -14,6 +16,7 @@ import { DEFAULT_SETTING } from './constants'; export default class SettingService { private readonly settingsStore = new SettingsStore(); private readonly passPhishingStore = new PassPhishingStore(); + private readonly chainlistStore = new ChainlistStoreSubject(); constructor () { this.initSetting().catch(console.error); @@ -73,6 +76,14 @@ export default class SettingService { this.passPhishingStore.set('PassPhishing', data, callback); } + public getChainlistInfo (): ChainlistConfig { + return this.chainlistStore.subject.value; + } + + public setChainlist (data: ChainlistConfig): void { + this.chainlistStore.upsertData(data); + } + // Use for mobile only public get isAlwaysRequired (): Promise { return new Promise((resolve) => { diff --git a/packages/extension-base/src/stores/ChainlistStore.ts b/packages/extension-base/src/stores/ChainlistStore.ts new file mode 100644 index 00000000000..2b8b3379660 --- /dev/null +++ b/packages/extension-base/src/stores/ChainlistStore.ts @@ -0,0 +1,15 @@ +// Copyright 2019-2022 @subwallet/extension-base +// SPDX-License-Identifier: Apache-2.0 + +import { EXTENSION_PREFIX } from '@subwallet/extension-base/defaults'; +import SubscribableStore from '@subwallet/extension-base/stores/SubscribableStore'; + +export interface ChainlistConfig { + patchVersion: string +} + +export default class ChainlistStore extends SubscribableStore { + constructor () { + super(EXTENSION_PREFIX ? `${EXTENSION_PREFIX}chainlist` : null); + } +} From 3755883e8e2c25c5af553f1cfe9943c279fb367c Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Tue, 5 Nov 2024 15:17:45 +0700 Subject: [PATCH 044/204] [Issue-3828] Update chainlist --- package.json | 2 +- packages/extension-base/package.json | 2 +- packages/extension-koni-ui/package.json | 2 +- packages/extension-web-ui/package.json | 2 +- yarn.lock | 14 +++++++------- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 5a8a277eab8..15dad95b50e 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@polkadot/types-support": "^12.0.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/chain-list": "0.2.93-beta.1", + "@subwallet/chain-list": "0.2.93-beta.2", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b79", "@subwallet/ui-keyring": "0.1.8-beta.0", diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index a4712083e98..4658ceb926e 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -55,7 +55,7 @@ "@reduxjs/toolkit": "^1.9.1", "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", - "@subwallet/chain-list": "0.2.93-beta.1", + "@subwallet/chain-list": "0.2.93-beta.2", "@subwallet/extension-base": "^1.3.5-0", "@subwallet/extension-chains": "^1.3.5-0", "@subwallet/extension-dapp": "^1.3.5-0", diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index 2ebc4fde302..df3e7314b95 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -34,7 +34,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.93-beta.1", + "@subwallet/chain-list": "0.2.93-beta.2", "@subwallet/extension-base": "^1.3.5-0", "@subwallet/extension-chains": "^1.3.5-0", "@subwallet/extension-dapp": "^1.3.5-0", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index a89b33efe71..fa595f2b676 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -35,7 +35,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.93-beta.1", + "@subwallet/chain-list": "0.2.93-beta.2", "@subwallet/extension-base": "^1.3.5-0", "@subwallet/extension-chains": "^1.3.5-0", "@subwallet/extension-dapp": "^1.3.5-0", diff --git a/yarn.lock b/yarn.lock index 5343cf42465..c7d75417950 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6265,14 +6265,14 @@ __metadata: languageName: node linkType: hard -"@subwallet/chain-list@npm:0.2.93-beta.1": - version: 0.2.93-beta.1 - resolution: "@subwallet/chain-list@npm:0.2.93-beta.1" +"@subwallet/chain-list@npm:0.2.93-beta.2": + version: 0.2.93-beta.2 + resolution: "@subwallet/chain-list@npm:0.2.93-beta.2" dependencies: "@polkadot/dev": 0.67.167 "@polkadot/util": ^12.5.1 eventemitter3: ^5.0.1 - checksum: dd006f0162aa223069fb2841296d640b2bb2cfaebfb53ceae59aca28ffc578ed3f5e81be7d8a512ed55bfa20fcb1d5a1fcad4968218278e203ec69fac403b683 + checksum: f340c632e346d18d96f8027fc6417716d23c86f6da29b9978a938528bedec96968bc19d27c055c0162b8603e9a91e37551efe2447e19eba44bd3f2f59fdeb8e8 languageName: node linkType: hard @@ -6315,7 +6315,7 @@ __metadata: "@reduxjs/toolkit": ^1.9.1 "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 - "@subwallet/chain-list": 0.2.93-beta.1 + "@subwallet/chain-list": 0.2.93-beta.2 "@subwallet/extension-base": ^1.3.5-0 "@subwallet/extension-chains": ^1.3.5-0 "@subwallet/extension-dapp": ^1.3.5-0 @@ -6453,7 +6453,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.93-beta.1 + "@subwallet/chain-list": 0.2.93-beta.2 "@subwallet/extension-base": ^1.3.5-0 "@subwallet/extension-chains": ^1.3.5-0 "@subwallet/extension-dapp": ^1.3.5-0 @@ -6593,7 +6593,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.93-beta.1 + "@subwallet/chain-list": 0.2.93-beta.2 "@subwallet/extension-base": ^1.3.5-0 "@subwallet/extension-chains": ^1.3.5-0 "@subwallet/extension-dapp": ^1.3.5-0 From 4ebb53e9328418e829034fb457113a91af44a8fd Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Tue, 5 Nov 2024 18:15:31 +0700 Subject: [PATCH 045/204] [Issue-3132] feat: update chain logo & asset logo map --- .../services/chain-online-service/index.ts | 22 +++++++++++++++++-- .../src/services/chain-service/utils/patch.ts | 5 ++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/packages/extension-base/src/services/chain-online-service/index.ts b/packages/extension-base/src/services/chain-online-service/index.ts index d490025eeb1..12665b612cb 100644 --- a/packages/extension-base/src/services/chain-online-service/index.ts +++ b/packages/extension-base/src/services/chain-online-service/index.ts @@ -1,7 +1,7 @@ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { MultiChainAssetMap } from '@subwallet/chain-list'; +import { AssetLogoMap, ChainLogoMap, MultiChainAssetMap } from '@subwallet/chain-list'; import { _ChainAsset, _ChainInfo, _MultiChainAsset } from '@subwallet/chain-list/types'; import { ChainService, filterAssetInfoMap } from '@subwallet/extension-base/services/chain-service'; import { LATEST_CHAIN_DATA_FETCHING_INTERVAL } from '@subwallet/extension-base/services/chain-service/constants'; @@ -92,7 +92,13 @@ export class ChainOnlineService { try { // 1. validate fetch data with its hash const isSafePatch = this.validatePatchWithHash(latestPatch); - const { ChainAsset: latestAssetInfo, ChainInfo: latestChainInfo, MultiChainAsset: latestMultiChainAsset, patchVersion: latestPatchVersion } = latestPatch; + const { AssetLogoMap: latestAssetLogoMap, + ChainAsset: latestAssetInfo, + ChainInfo: latestChainInfo, + ChainLogoMap: latestChainLogoMap, + MultiChainAsset: latestMultiChainAsset, + mAssetLogoMap: lastestMAssetLogoMap, + patchVersion: latestPatchVersion } = latestPatch; const currentPatchVersion = this.settingService.getChainlistInfo().patchVersion; let chainInfoMap: Record = {}; @@ -153,6 +159,18 @@ export class ChainOnlineService { this.chainService.setChainStateMap(currentChainState); this.chainService.subscribeChainStateMap().next(currentChainState); + if (latestChainLogoMap) { + const logoMap = Object.assign({}, ChainLogoMap, latestChainLogoMap); + + this.chainService.subscribeChainLogoMap().next(logoMap); + } + + if (latestAssetLogoMap) { + const logoMap = Object.assign({}, AssetLogoMap, latestAssetLogoMap, lastestMAssetLogoMap); + + this.chainService.subscribeAssetLogoMap().next(logoMap); + } + this.settingService.setChainlist({ patchVersion: latestPatchVersion }); } } diff --git a/packages/extension-base/src/services/chain-service/utils/patch.ts b/packages/extension-base/src/services/chain-service/utils/patch.ts index d1d84c42f91..cc55261defc 100644 --- a/packages/extension-base/src/services/chain-service/utils/patch.ts +++ b/packages/extension-base/src/services/chain-service/utils/patch.ts @@ -19,7 +19,10 @@ export interface PatchInfo { ChainAsset: Record, ChainAssetHashMap: Record, MultiChainAsset: Record, - MultiChainAssetHashMap: Record + MultiChainAssetHashMap: Record, + ChainLogoMap: Record, + AssetLogoMap: Record, + mAssetLogoMap: Record } export async function fetchPatchData (slug: string) { From 59dadb78b7d3dffdaf9113c553631673067abdef Mon Sep 17 00:00:00 2001 From: S2kael Date: Tue, 5 Nov 2024 20:40:22 +0700 Subject: [PATCH 046/204] [Issue-3826] Init Polygon bridge --- package.json | 2 +- packages/extension-base/package.json | 2 +- .../src/core/substrate/xcm-parser.ts | 13 +- .../koni/api/contract-handler/utils/index.ts | 16 + .../utils/polygon_bridge_abi.json | 1004 +++++++++++++++++ .../src/koni/background/handlers/Extension.ts | 10 +- .../balance-service/transfer/xcm/index.ts | 34 +- .../transfer/xcm/polygonBridge.ts | 63 ++ .../inapp-notification-service/consts.ts | 10 +- .../inapp-notification-service/index.ts | 23 + .../inapp-notification-service/interfaces.ts | 6 +- .../inapp-notification-service/utils/avail.ts | 118 ++ .../{utils.ts => utils/common.ts} | 113 -- .../inapp-notification-service/utils/index.ts | 6 + .../utils/polygon.ts | 122 ++ .../src/services/transaction-service/index.ts | 10 + packages/extension-koni-ui/package.json | 2 +- .../Settings/Notifications/Notification.tsx | 6 +- .../Settings/Tokens/FungibleTokenImport.tsx | 2 +- packages/extension-web-ui/package.json | 2 +- yarn.lock | 14 +- 21 files changed, 1440 insertions(+), 138 deletions(-) create mode 100644 packages/extension-base/src/koni/api/contract-handler/utils/polygon_bridge_abi.json create mode 100644 packages/extension-base/src/services/balance-service/transfer/xcm/polygonBridge.ts create mode 100644 packages/extension-base/src/services/inapp-notification-service/utils/avail.ts rename packages/extension-base/src/services/inapp-notification-service/{utils.ts => utils/common.ts} (56%) create mode 100644 packages/extension-base/src/services/inapp-notification-service/utils/index.ts create mode 100644 packages/extension-base/src/services/inapp-notification-service/utils/polygon.ts diff --git a/package.json b/package.json index d6511a936c7..5c9845fb374 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@polkadot/types-support": "^12.0.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/chain-list": "0.2.92", + "@subwallet/chain-list": "0.2.93-beta.3", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b79", "@subwallet/ui-keyring": "0.1.8-beta.0", diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index 48b6709c6df..7cc4208fc0a 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -55,7 +55,7 @@ "@reduxjs/toolkit": "^1.9.1", "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", - "@subwallet/chain-list": "0.2.92", + "@subwallet/chain-list": "0.2.93-beta.3", "@subwallet/extension-base": "^1.3.5-0", "@subwallet/extension-chains": "^1.3.5-0", "@subwallet/extension-dapp": "^1.3.5-0", diff --git a/packages/extension-base/src/core/substrate/xcm-parser.ts b/packages/extension-base/src/core/substrate/xcm-parser.ts index 0b066121520..dd521916e43 100644 --- a/packages/extension-base/src/core/substrate/xcm-parser.ts +++ b/packages/extension-base/src/core/substrate/xcm-parser.ts @@ -5,6 +5,7 @@ import { COMMON_CHAIN_SLUGS } from '@subwallet/chain-list'; import { _ChainAsset, _ChainInfo } from '@subwallet/chain-list/types'; import { _Address } from '@subwallet/extension-base/background/KoniTypes'; import { isAvailChainBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge'; +import { _isPolygonChainBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge'; import { _getChainSubstrateAddressPrefix, _getEvmChainId, _getSubstrateParaId, _getSubstrateRelayParent, _getXcmAssetMultilocation, _isChainEvmCompatible, _isPureEvmChain, _isSubstrateParaChain } from '@subwallet/extension-base/services/chain-service/utils'; import { decodeAddress, evmToAddress } from '@polkadot/util-crypto'; @@ -95,8 +96,14 @@ function getAvailBridgeWarning (): string { return 'Cross-chain transfer of this token may take up to 90 minutes, and you’ll need to manually claim the funds on the destination network to complete the transfer. Do you still want to continue?'; } +function getPolygonBridgeWarning (): string { + return 'Cross-chain transfer of this token may take up to 90 minutes, and you’ll need to manually claim the funds on the destination network to complete the transfer. Do you still want to continue?'; +} + export function _getXcmUnstableWarning (originChainInfo: _ChainInfo, destChainInfo: _ChainInfo, assetSlug: string): string { - if (_isAvailBridgeXcm(originChainInfo, destChainInfo)) { + if (_isPolygonBridgeXcm(originChainInfo, destChainInfo)) { + return getPolygonBridgeWarning(); + } else if (_isAvailBridgeXcm(originChainInfo, destChainInfo)) { return getAvailBridgeWarning(); } else if (_isSnowBridgeXcm(originChainInfo, destChainInfo)) { return getSnowBridgeUnstableWarning(originChainInfo); @@ -126,6 +133,10 @@ export function _isMythosFromHydrationToMythos (originChainInfo: _ChainInfo, des return originChainInfo.slug === 'hydradx_main' && destChainInfo.slug === 'mythos' && assetSlug === 'hydradx_main-LOCAL-MYTH'; } +export function _isPolygonBridgeXcm (originChainInfo: _ChainInfo, destChainInfo: _ChainInfo): boolean { + return _isPolygonChainBridge(originChainInfo.slug, destChainInfo.slug); +} + // --------------------------------------------------------------------------------------------------------------------- function _getMultiLocationParent (originChainInfo: _ChainInfo, isWithinSameConsensus: boolean): number { 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 ef1066b1415..abee42140eb 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 @@ -27,6 +27,8 @@ export const _SNOWBRIDGE_GATEWAY_ABI: Record = require('./snowbridg export const _AVAIL_BRIDGE_GATEWAY_ABI: Record = require('./avail_bridge_abi.json'); // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-assignment export const _AVAIL_TEST_BRIDGE_GATEWAY_ABI: Record = require('./avail_test_bridge_abi.json'); +// eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-assignment +export const _POLYGON_BRIDGE_ABI: Record = require('./polygon_bridge_abi.json'); const SNOWBRIDGE_GATEWAY_ETHEREUM_CONTRACT_ADDRESS = '0x27ca963C279c93801941e1eB8799c23f407d68e7'; const SNOWBRIDGE_GATEWAY_SEPOLIA_CONTRACT_ADDRESS = '0x5B4909cE6Ca82d2CE23BD46738953c7959E710Cd'; @@ -57,3 +59,17 @@ export function getAvailBridgeGatewayContract (chain: string) { export function isAvailBridgeGatewayContract (contractAddress: _Address) { return [AVAILBRIDGE_GATEWAY_ETHEREUM_CONTRACT_ADDRESS, AVAILBRIDGE_GATEWAY_SEPOLIA_CONTRACT_ADDRESS].includes(contractAddress); } + +export function getPolygonBridgeContract (chain: string): string { + if (chain === 'polygonzkEvm_cardona') { + return '0x528e26b25a34a4A5d0dbDa1d57D318153d2ED582'; + } else if (chain === 'sepolia_ethereum') { + return '0x528e26b25a34a4A5d0dbDa1d57D318153d2ED582'; + } else if (chain === 'polygonZkEvm') { + return '0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe'; + } else if (chain === 'ethereum') { + return '0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe'; + } + + throw new Error('Invalid chain'); +} diff --git a/packages/extension-base/src/koni/api/contract-handler/utils/polygon_bridge_abi.json b/packages/extension-base/src/koni/api/contract-handler/utils/polygon_bridge_abi.json new file mode 100644 index 00000000000..05ad1e6c6c7 --- /dev/null +++ b/packages/extension-base/src/koni/api/contract-handler/utils/polygon_bridge_abi.json @@ -0,0 +1,1004 @@ +[ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AlreadyClaimed", + "type": "error" + }, + { + "inputs": [], + "name": "AmountDoesNotMatchMsgValue", + "type": "error" + }, + { + "inputs": [], + "name": "DestinationNetworkInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "EtherTransferFailed", + "type": "error" + }, + { + "inputs": [], + "name": "FailedTokenWrappedDeployment", + "type": "error" + }, + { + "inputs": [], + "name": "GasTokenNetworkMustBeZeroOnEther", + "type": "error" + }, + { + "inputs": [], + "name": "GlobalExitRootInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSmtProof", + "type": "error" + }, + { + "inputs": [], + "name": "MerkleTreeFull", + "type": "error" + }, + { + "inputs": [], + "name": "MessageFailed", + "type": "error" + }, + { + "inputs": [], + "name": "MsgValueNotZero", + "type": "error" + }, + { + "inputs": [], + "name": "NativeTokenIsEther", + "type": "error" + }, + { + "inputs": [], + "name": "NoValueInMessagesOnGasTokenNetworks", + "type": "error" + }, + { + "inputs": [], + "name": "NotValidAmount", + "type": "error" + }, + { + "inputs": [], + "name": "NotValidOwner", + "type": "error" + }, + { + "inputs": [], + "name": "NotValidSignature", + "type": "error" + }, + { + "inputs": [], + "name": "NotValidSpender", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyNotEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyRollupManager", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "leafType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "originAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "depositCount", + "type": "uint32" + } + ], + "name": "BridgeEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "globalIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "originAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ClaimEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EmergencyStateActivated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EmergencyStateDeactivated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "address", + "name": "originTokenAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "wrappedTokenAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "NewWrappedToken", + "type": "event" + }, + { + "inputs": [], + "name": "BASE_INIT_BYTECODE_WRAPPED_TOKEN", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WETHToken", + "outputs": [ + { + "internalType": "contract TokenWrapped", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "activateEmergencyState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "bool", + "name": "forceUpdateGlobalExitRoot", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "permitData", + "type": "bytes" + } + ], + "name": "bridgeAsset", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "internalType": "bool", + "name": "forceUpdateGlobalExitRoot", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "bridgeMessage", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amountWETH", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "forceUpdateGlobalExitRoot", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "bridgeMessageWETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "leafHash", + "type": "bytes32" + }, + { + "internalType": "bytes32[32]", + "name": "smtProof", + "type": "bytes32[32]" + }, + { + "internalType": "uint32", + "name": "index", + "type": "uint32" + } + ], + "name": "calculateRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originTokenAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "calculateTokenWrapperAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[32]", + "name": "smtProofLocalExitRoot", + "type": "bytes32[32]" + }, + { + "internalType": "bytes32[32]", + "name": "smtProofRollupExitRoot", + "type": "bytes32[32]" + }, + { + "internalType": "uint256", + "name": "globalIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "mainnetExitRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "rollupExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originTokenAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "claimAsset", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[32]", + "name": "smtProofLocalExitRoot", + "type": "bytes32[32]" + }, + { + "internalType": "bytes32[32]", + "name": "smtProofRollupExitRoot", + "type": "bytes32[32]" + }, + { + "internalType": "uint256", + "name": "globalIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "mainnetExitRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "rollupExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "claimMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "claimedBitMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deactivateEmergencyState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "depositCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "gasTokenAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "gasTokenMetadata", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "gasTokenNetwork", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "leafType", + "type": "uint8" + }, + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "destinationNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "destinationAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "metadataHash", + "type": "bytes32" + } + ], + "name": "getLeafValue", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "getTokenMetadata", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originTokenAddress", + "type": "address" + } + ], + "name": "getTokenWrappedAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalExitRootManager", + "outputs": [ + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_networkID", + "type": "uint32" + }, + { + "internalType": "address", + "name": "_gasTokenAddress", + "type": "address" + }, + { + "internalType": "uint32", + "name": "_gasTokenNetwork", + "type": "uint32" + }, + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "address", + "name": "_polygonRollupManager", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_gasTokenMetadata", + "type": "bytes" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "leafIndex", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "sourceBridgeNetwork", + "type": "uint32" + } + ], + "name": "isClaimed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isEmergencyState", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastUpdatedDepositCount", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "networkID", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "polygonRollupManager", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originTokenAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint8", + "name": "decimals", + "type": "uint8" + } + ], + "name": "precalculatedWrapperAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "tokenInfoToWrappedToken", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "updateGlobalExitRoot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "leafHash", + "type": "bytes32" + }, + { + "internalType": "bytes32[32]", + "name": "smtProof", + "type": "bytes32[32]" + }, + { + "internalType": "uint32", + "name": "index", + "type": "uint32" + }, + { + "internalType": "bytes32", + "name": "root", + "type": "bytes32" + } + ], + "name": "verifyMerkleProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "wrappedTokenToTokenInfo", + "outputs": [ + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originTokenAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/packages/extension-base/src/koni/background/handlers/Extension.ts b/packages/extension-base/src/koni/background/handlers/Extension.ts index 0c5dd069529..18776c15fc7 100644 --- a/packages/extension-base/src/koni/background/handlers/Extension.ts +++ b/packages/extension-base/src/koni/background/handlers/Extension.ts @@ -30,8 +30,9 @@ import { isBounceableAddress } from '@subwallet/extension-base/services/balance- import { getERC20TransactionObject, getERC721Transaction, getEVMTransactionObject, getPSP34TransferExtrinsic } from '@subwallet/extension-base/services/balance-service/transfer/smart-contract'; import { createTransferExtrinsic, getTransferMockTxFee } from '@subwallet/extension-base/services/balance-service/transfer/token'; import { createTonTransaction } from '@subwallet/extension-base/services/balance-service/transfer/ton-transfer'; -import { createAvailBridgeExtrinsicFromAvail, createAvailBridgeTxFromEth, createSnowBridgeExtrinsic, createXcmExtrinsic, CreateXcmExtrinsicProps, FunctionCreateXcmExtrinsic, getXcmMockTxFee } from '@subwallet/extension-base/services/balance-service/transfer/xcm'; +import { createAvailBridgeExtrinsicFromAvail, createAvailBridgeTxFromEth, createPolygonBridgeExtrinsic, createSnowBridgeExtrinsic, createXcmExtrinsic, CreateXcmExtrinsicProps, FunctionCreateXcmExtrinsic, getXcmMockTxFee } from '@subwallet/extension-base/services/balance-service/transfer/xcm'; import { getClaimTxOnAvail, getClaimTxOnEthereum, isAvailChainBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge'; +import { _isPolygonChainBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge'; import { _API_OPTIONS_CHAIN_GROUP, _DEFAULT_MANTA_ZK_CHAIN, _MANTA_ZK_CHAIN_GROUP, _ZK_ASSET_PREFIX } from '@subwallet/extension-base/services/chain-service/constants'; import { _ChainApiStatus, _ChainConnectionStatus, _ChainState, _NetworkUpsertParams, _ValidateCustomAssetRequest, _ValidateCustomAssetResponse, EnableChainParams, EnableMultiChainParams } from '@subwallet/extension-base/services/chain-service/types'; import { _getAssetDecimals, _getAssetSymbol, _getChainNativeTokenBasicInfo, _getContractAddressOfToken, _getEvmChainId, _isAssetSmartContractNft, _isChainEvmCompatible, _isChainTonCompatible, _isCustomAsset, _isLocalToken, _isMantaZkAsset, _isNativeToken, _isPureEvmChain, _isTokenEvmSmartContract, _isTokenTransferredByEvm, _isTokenTransferredByTon } from '@subwallet/extension-base/services/chain-service/utils'; @@ -1450,6 +1451,7 @@ export default class KoniExtension { const isAvailBridgeFromEvm = _isPureEvmChain(chainInfoMap[originNetworkKey]) && isAvailChainBridge(destinationNetworkKey); const isAvailBridgeFromAvail = isAvailChainBridge(originNetworkKey) && _isPureEvmChain(chainInfoMap[destinationNetworkKey]); const isSnowBridgeEvmTransfer = _isPureEvmChain(chainInfoMap[originNetworkKey]) && _isSnowBridgeXcm(chainInfoMap[originNetworkKey], chainInfoMap[destinationNetworkKey]) && !isAvailBridgeFromEvm; + const isPolygonBridgeTransfer = _isPolygonChainBridge(originNetworkKey, destinationNetworkKey); let additionalValidator: undefined | ((inputTransaction: SWTransactionResponse) => Promise); let eventsHandler: undefined | ((eventEmitter: TransactionEmitter) => void); @@ -1470,7 +1472,9 @@ export default class KoniExtension { let funcCreateExtrinsic: FunctionCreateXcmExtrinsic; - if (isSnowBridgeEvmTransfer) { + if (isPolygonBridgeTransfer) { + funcCreateExtrinsic = createPolygonBridgeExtrinsic; + } else if (isSnowBridgeEvmTransfer) { funcCreateExtrinsic = createSnowBridgeExtrinsic; } else if (isAvailBridgeFromEvm) { funcCreateExtrinsic = createAvailBridgeTxFromEth; @@ -1534,7 +1538,7 @@ export default class KoniExtension { transaction: extrinsic, data: inputData, extrinsicType: ExtrinsicType.TRANSFER_XCM, - chainType: !isSnowBridgeEvmTransfer && !isAvailBridgeFromEvm ? ChainType.SUBSTRATE : ChainType.EVM, + chainType: !isSnowBridgeEvmTransfer && !isAvailBridgeFromEvm && !isPolygonBridgeTransfer ? ChainType.SUBSTRATE : ChainType.EVM, transferNativeAmount: _isNativeToken(originTokenInfo) ? value : '0', ignoreWarnings, isTransferAll: transferAll, 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 fa78fc0dcf9..77243cf2d98 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 @@ -2,9 +2,10 @@ // SPDX-License-Identifier: Apache-2.0 import { _ChainAsset, _ChainInfo } from '@subwallet/chain-list/types'; -import { _isSnowBridgeXcm } from '@subwallet/extension-base/core/substrate/xcm-parser'; +import { _isPolygonBridgeXcm, _isSnowBridgeXcm } from '@subwallet/extension-base/core/substrate/xcm-parser'; import { getAvailBridgeExtrinsicFromAvail, getAvailBridgeTxFromEth } from '@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge'; import { getExtrinsicByPolkadotXcmPallet } from '@subwallet/extension-base/services/balance-service/transfer/xcm/polkadotXcm'; +import { _createPolygonBridgeL1toL2Extrinsic } from '@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge'; import { getSnowBridgeEvmTransfer } from '@subwallet/extension-base/services/balance-service/transfer/xcm/snowBridge'; import { getExtrinsicByXcmPalletPallet } from '@subwallet/extension-base/services/balance-service/transfer/xcm/xcmPallet'; import { getExtrinsicByXtokensPallet } from '@subwallet/extension-base/services/balance-service/transfer/xcm/xTokens'; @@ -112,6 +113,37 @@ export const createAvailBridgeExtrinsicFromAvail = async ({ recipient, sendingVa return await getAvailBridgeExtrinsicFromAvail(recipient, sendingValue, substrateApi); }; +export const createPolygonBridgeExtrinsic = async ({ chainInfoMap, + destinationTokenInfo, + evmApi, + originTokenInfo, + recipient, + sender, + sendingValue }: CreateXcmExtrinsicProps): Promise => { + const originChainInfo = chainInfoMap[originTokenInfo.originChain]; + const destinationChainInfo = chainInfoMap[destinationTokenInfo.originChain]; + + if (!_isPolygonBridgeXcm(originChainInfo, destinationChainInfo)) { + throw new Error('This is not a valid SnowBridge transfer'); + } + + if (!evmApi) { + throw Error('Evm API is not available'); + } + + if (!sender) { + throw Error('Sender is required'); + } + + const sourceChain = originChainInfo.slug; + + if (sourceChain === 'polygonzkEvm_cardona' || sourceChain === 'polygonZkEvm') { + throw new Error('Currently, only support bridge from L1 to L2'); + } + + return _createPolygonBridgeL1toL2Extrinsic(originTokenInfo, originChainInfo, sender, recipient, sendingValue, evmApi); +}; + export const getXcmMockTxFee = async (substrateApi: _SubstrateApi, chainInfoMap: Record, originTokenInfo: _ChainAsset, destinationTokenInfo: _ChainAsset): Promise => { try { const destChainInfo = chainInfoMap[destinationTokenInfo.originChain]; 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 new file mode 100644 index 00000000000..ce734341655 --- /dev/null +++ b/packages/extension-base/src/services/balance-service/transfer/xcm/polygonBridge.ts @@ -0,0 +1,63 @@ +// Copyright 2019-2022 @subwallet/extension-base +// SPDX-License-Identifier: Apache-2.0 + +import { _ChainAsset, _ChainInfo } from '@subwallet/chain-list/types'; +import { getWeb3Contract } from '@subwallet/extension-base/koni/api/contract-handler/evm/web3'; +import { _POLYGON_BRIDGE_ABI, getPolygonBridgeContract } from '@subwallet/extension-base/koni/api/contract-handler/utils'; +import { _EvmApi } from '@subwallet/extension-base/services/chain-service/types'; +import { _getContractAddressOfToken } from '@subwallet/extension-base/services/chain-service/utils'; +import { calculateGasFeeParams } from '@subwallet/extension-base/services/fee-service/utils'; +import { TransactionConfig } from 'web3-core'; +import { ContractSendMethod } from 'web3-eth-contract'; + +export async function _createPolygonBridgeL1toL2Extrinsic (tokenInfo: _ChainAsset, originChainInfo: _ChainInfo, sender: string, recipientAddress: string, value: string, evmApi: _EvmApi): Promise { + const polygonBridgeContractAddress = getPolygonBridgeContract(originChainInfo.slug); + const polygonBridgeContract = getWeb3Contract(polygonBridgeContractAddress, evmApi, _POLYGON_BRIDGE_ABI); + const tokenContract = _getContractAddressOfToken(tokenInfo) || '0x0000000000000000000000000000000000000000'; // FOR Ethereum: use null address + const destinationNetwork = 1; + + if (tokenContract !== '0x0000000000000000000000000000000000000000') { + throw new Error('Only native token transfer is supported'); + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment + const transferCall: ContractSendMethod = polygonBridgeContract.methods.bridgeAsset(destinationNetwork, recipientAddress, value, tokenContract, true, '0x'); + const transferEncodedCall = transferCall.encodeABI(); + const priority = await calculateGasFeeParams(evmApi, evmApi.chainSlug); + + const transactionConfig = { + from: sender, + to: polygonBridgeContractAddress, + value: value, + data: transferEncodedCall, + gasPrice: priority.gasPrice, + maxFeePerGas: priority.maxFeePerGas?.toString(), + maxPriorityFeePerGas: priority.maxPriorityFeePerGas?.toString() + } as TransactionConfig; + + let gasLimit; + + try { + gasLimit = await evmApi.api.eth.estimateGas(transactionConfig); + } catch (e) { + gasLimit = 200000; // todo: handle this better + } + + transactionConfig.gas = gasLimit; + + return transactionConfig; +} + +export function _isPolygonChainBridge (srcChain: string, destChain: string): boolean { + if (srcChain === 'polygonzkEvm_cardona' && destChain === 'sepolia_ethereum') { + return true; + } else if (srcChain === 'sepolia_ethereum' && destChain === 'polygonzkEvm_cardona') { + return true; + } else if (srcChain === 'polygonZkEvm' && destChain === 'ethereum') { + return true; + } else if (srcChain === 'ethereum' && destChain === 'polygonZkEvm') { + return true; + } + + return false; +} diff --git a/packages/extension-base/src/services/inapp-notification-service/consts.ts b/packages/extension-base/src/services/inapp-notification-service/consts.ts index 025d6dceee9..4202c840db1 100644 --- a/packages/extension-base/src/services/inapp-notification-service/consts.ts +++ b/packages/extension-base/src/services/inapp-notification-service/consts.ts @@ -1,8 +1,8 @@ // Copyright 2019-2022 @subwallet/extension-base authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { NotificationActionType } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; -import { getAvailBridgeClaimDescription, getClaimDescription, getReceiveDescription, getSendDescription, getWithdrawDescription } from '@subwallet/extension-base/services/inapp-notification-service/utils'; +import { NotificationActionType } from './interfaces'; +import { getAvailBridgeClaimDescription, getClaimDescription, getReceiveDescription, getSendDescription, getWaitPolygonBridgeDescription, getWithdrawDescription } from './utils'; export const NotificationTitleMap = { [NotificationActionType.WITHDRAW]: '[{{accountName}}] WITHDRAW {{tokenSymbol}}', @@ -10,7 +10,8 @@ export const NotificationTitleMap = { [NotificationActionType.SEND]: '[{{accountName}}] SEND {{tokenSymbol}}', [NotificationActionType.RECEIVE]: '[{{accountName}}] RECEIVE {{tokenSymbol}}', [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_AVAIL]: '[{{accountName}}] CLAIM {{tokenSymbol}}', - [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_ETHEREUM]: '[{{accountName}}] CLAIM {{tokenSymbol}}' + [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_ETHEREUM]: '[{{accountName}}] CLAIM {{tokenSymbol}}', + [NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE]: '[{{accountName}}] BRIDGE {{tokenSymbol}}' }; export const NotificationDescriptionMap = { @@ -19,7 +20,8 @@ export const NotificationDescriptionMap = { [NotificationActionType.SEND]: getSendDescription, [NotificationActionType.RECEIVE]: getReceiveDescription, [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_AVAIL]: getAvailBridgeClaimDescription, - [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_ETHEREUM]: getAvailBridgeClaimDescription + [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_ETHEREUM]: getAvailBridgeClaimDescription, + [NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE]: getWaitPolygonBridgeDescription }; export const ONE_DAY_MILLISECOND = 1000 * 24 * 60 * 60; diff --git a/packages/extension-base/src/services/inapp-notification-service/index.ts b/packages/extension-base/src/services/inapp-notification-service/index.ts index 9bd568cc889..9b191aa85e6 100644 --- a/packages/extension-base/src/services/inapp-notification-service/index.ts +++ b/packages/extension-base/src/services/inapp-notification-service/index.ts @@ -13,6 +13,7 @@ import { _BaseNotificationInfo, _NotificationInfo, ClaimAvailBridgeNotificationM import { AvailBridgeSourceChain, AvailBridgeTransaction, fetchAllAvailBridgeClaimable, hrsToMillisecond } from '@subwallet/extension-base/services/inapp-notification-service/utils'; import { KeyringService } from '@subwallet/extension-base/services/keyring-service'; import DatabaseService from '@subwallet/extension-base/services/storage-service/DatabaseService'; +import { RequestCrossChainTransfer } from '@subwallet/extension-base/types'; import { GetNotificationParams, RequestSwitchStatusParams } from '@subwallet/extension-base/types/notification'; import { categoryAddresses, formatNumber } from '@subwallet/extension-base/utils'; import { isSubstrateAddress } from '@subwallet/keyring'; @@ -262,6 +263,28 @@ export class InappNotificationService implements CronServiceInterface { await this.validateAndWriteNotificationsToDB(notifications, address); } + public async writeWaitPolygonBridge (request: RequestCrossChainTransfer, transactionHash: string) { + const { from: address, tokenSlug, value: amount } = request; + const actionType = NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE; + const timestamp = Date.now(); + const token = this.chainService.getAssetBySlug(tokenSlug); + const symbol = token.symbol; + const decimals = token.decimals ?? 0; + const notification: _BaseNotificationInfo = { + id: `${actionType}___${transactionHash}___${timestamp}`, + address: address, // address is senderAddress + title: NotificationTitleMap[actionType].replace('{{tokenSymbol}}', symbol), + description: NotificationDescriptionMap[actionType](formatNumber(amount, decimals), symbol), + time: timestamp, + extrinsicType: ExtrinsicType.TRANSFER_XCM, + isRead: false, + actionType, + metadata: undefined + }; + + await this.validateAndWriteNotificationsToDB([notification], address); + } + async start (): Promise { if (this.status === ServiceStatus.STARTED) { return; diff --git a/packages/extension-base/src/services/inapp-notification-service/interfaces.ts b/packages/extension-base/src/services/inapp-notification-service/interfaces.ts index 161ec1fce0b..5fe84a087d7 100644 --- a/packages/extension-base/src/services/inapp-notification-service/interfaces.ts +++ b/packages/extension-base/src/services/inapp-notification-service/interfaces.ts @@ -27,7 +27,8 @@ export interface ActionTypeToMetadataMap { [NotificationActionType.WITHDRAW]: WithdrawClaimNotificationMetadata, [NotificationActionType.CLAIM]: WithdrawClaimNotificationMetadata, [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_AVAIL]: ClaimAvailBridgeNotificationMetadata, - [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_ETHEREUM]: ClaimAvailBridgeNotificationMetadata + [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_ETHEREUM]: ClaimAvailBridgeNotificationMetadata, + [NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE]: unknown, } export interface SendReceiveNotificationMetadata { @@ -70,7 +71,8 @@ export enum NotificationActionType { WITHDRAW = 'WITHDRAW', CLAIM = 'CLAIM', // Claim reward CLAIM_AVAIL_BRIDGE_ON_AVAIL = 'CLAIM_AVAIL_BRIDGE_ON_AVAIL', - CLAIM_AVAIL_BRIDGE_ON_ETHEREUM = 'CLAIM_AVAIL_BRIDGE_ON_ETHEREUM' + CLAIM_AVAIL_BRIDGE_ON_ETHEREUM = 'CLAIM_AVAIL_BRIDGE_ON_ETHEREUM', + HAVE_TO_WAIT_POLYGON_BRIDGE = 'HAVE_TO_WAIT_POLYGON_BRIDGE' } export enum NotificationTab { diff --git a/packages/extension-base/src/services/inapp-notification-service/utils/avail.ts b/packages/extension-base/src/services/inapp-notification-service/utils/avail.ts new file mode 100644 index 00000000000..3f4621824e8 --- /dev/null +++ b/packages/extension-base/src/services/inapp-notification-service/utils/avail.ts @@ -0,0 +1,118 @@ +// Copyright 2019-2022 @subwallet/extension-base authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +/* Description */ +export function getAvailBridgeClaimDescription (amount: string, symbol: string) { + return `${amount} ${symbol} ready to claim from ${symbol} cross-chain transfer. Click to claim now!`; +} +/* Description */ + +// todo: can refactor utils and const of avail bridge to a new file. Also check in /transfer/xcm/availBridge.ts file + +export const AVAIL_BRIDGE_INDEXER = { + AVAIL_MAINNET: 'https://bridge-indexer.avail.so', + AVAIL_TESTNET: 'https://turing-bridge-indexer.fra.avail.so' +}; + +export const AVAIL_BRIDGE_API = { + AVAIL_MAINNET: 'https://bridge-api.avail.so', + AVAIL_TESTNET: 'https://turing-bridge-api.fra.avail.so' +}; + +interface AvailBridgeTransactionsResponse { + data: { + paginationData: { + hasNextPage: boolean, + page: number, + pageSize: number, + totalCount: number + }, + result: AvailBridgeTransaction[] + } +} + +export interface AvailBridgeTransaction { + messageId: string, + sourceChain: AvailBridgeSourceChain, + sourceTransactionHash: string, + depositorAddress: string, + receiverAddress: string, + amount: string, + sourceBlockHash: string, + sourceTransactionIndex: string, + status: AvailBridgeTransactionStatus +} + +export enum AvailBridgeTransactionStatus { + READY_TO_CLAIM = 'READY_TO_CLAIM', + CLAIMED = 'CLAIMED', + BRIDGED = 'BRIDGED' +} + +export enum AvailBridgeSourceChain { + AVAIL = 'AVAIL', + ETHEREUM = 'ETHEREUM', +} + +export async function fetchAllAvailBridgeClaimable (address: string, sourceChain: AvailBridgeSourceChain, isTestnet: boolean) { + const transactions: AvailBridgeTransaction[] = []; + let isContinue = true; + let page = 0; + const pageSize = 100; + + while (isContinue) { + const response = await fetchAvailBridgeTransactions(address, sourceChain, AvailBridgeTransactionStatus.READY_TO_CLAIM, pageSize, page, isTestnet); + + if (!response) { + break; + } + + transactions.push(...filterClaimableOfAddress(address, response.data.result)); + + isContinue = response.data.paginationData.hasNextPage; + page = page + 1; + } + + return transactions; +} + +export async function fetchAvailBridgeTransactions (userAddress: string, sourceChain: AvailBridgeSourceChain, status: AvailBridgeTransactionStatus, pageSize = 100, page = 0, isTestnet: boolean) { + const params = new URLSearchParams({ + userAddress, + sourceChain, + status, + pageSize: pageSize.toString(), + page: page.toString() + }); + + try { + const api = isTestnet ? AVAIL_BRIDGE_INDEXER.AVAIL_TESTNET : AVAIL_BRIDGE_INDEXER.AVAIL_MAINNET; + const rawResponse = await fetch( + `${api}/transactions?${params.toString()}`, + { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*' + }, + credentials: 'omit' + } + ); + + if (!rawResponse.ok) { + console.error('Error fetching claimable bridge transactions'); + + return undefined; + } + + return await rawResponse.json() as AvailBridgeTransactionsResponse; + } catch (e) { + console.error(e); + + return undefined; + } +} + +export function filterClaimableOfAddress (address: string, transactions: AvailBridgeTransaction[]) { + return transactions.filter((transaction) => transaction.receiverAddress.toLowerCase() === address.toLowerCase()); +} diff --git a/packages/extension-base/src/services/inapp-notification-service/utils.ts b/packages/extension-base/src/services/inapp-notification-service/utils/common.ts similarity index 56% rename from packages/extension-base/src/services/inapp-notification-service/utils.ts rename to packages/extension-base/src/services/inapp-notification-service/utils/common.ts index e2e9800a564..86d217392ca 100644 --- a/packages/extension-base/src/services/inapp-notification-service/utils.ts +++ b/packages/extension-base/src/services/inapp-notification-service/utils/common.ts @@ -30,9 +30,6 @@ export function getReceiveDescription (amount: string, symbol: string) { return `You have just received ${amount} ${symbol}`; } -export function getAvailBridgeClaimDescription (amount: string, symbol: string) { - return `${amount} ${symbol} ready to claim from ${symbol} cross-chain transfer. Click to claim now!`; -} /* Description */ export function getIsTabRead (notificationTab: NotificationTab) { @@ -114,116 +111,6 @@ export function createClaimNotification (claimItemInfo: EarningRewardItem, token }; } -// todo: can refactor utils and const of avail bridge to a new file. Also check in /transfer/xcm/availBridge.ts file - -export const AVAIL_BRIDGE_INDEXER = { - AVAIL_MAINNET: 'https://bridge-indexer.avail.so', - AVAIL_TESTNET: 'https://turing-bridge-indexer.fra.avail.so' -}; - -export const AVAIL_BRIDGE_API = { - AVAIL_MAINNET: 'https://bridge-api.avail.so', - AVAIL_TESTNET: 'https://turing-bridge-api.fra.avail.so' -}; - -interface AvailBridgeTransactionsResponse { - data: { - paginationData: { - hasNextPage: boolean, - page: number, - pageSize: number, - totalCount: number - }, - result: AvailBridgeTransaction[] - } -} - -export interface AvailBridgeTransaction { - messageId: string, - sourceChain: AvailBridgeSourceChain, - sourceTransactionHash: string, - depositorAddress: string, - receiverAddress: string, - amount: string, - sourceBlockHash: string, - sourceTransactionIndex: string, - status: AvailBridgeTransactionStatus -} - -export enum AvailBridgeTransactionStatus { - READY_TO_CLAIM = 'READY_TO_CLAIM', - CLAIMED = 'CLAIMED', - BRIDGED = 'BRIDGED' -} - -export enum AvailBridgeSourceChain { - AVAIL = 'AVAIL', - ETHEREUM = 'ETHEREUM', -} - -export async function fetchAllAvailBridgeClaimable (address: string, sourceChain: AvailBridgeSourceChain, isTestnet: boolean) { - const transactions: AvailBridgeTransaction[] = []; - let isContinue = true; - let page = 0; - const pageSize = 100; - - while (isContinue) { - const response = await fetchAvailBridgeTransactions(address, sourceChain, AvailBridgeTransactionStatus.READY_TO_CLAIM, pageSize, page, isTestnet); - - if (!response) { - break; - } - - transactions.push(...filterClaimableOfAddress(address, response.data.result)); - - isContinue = response.data.paginationData.hasNextPage; - page = page + 1; - } - - return transactions; -} - -export async function fetchAvailBridgeTransactions (userAddress: string, sourceChain: AvailBridgeSourceChain, status: AvailBridgeTransactionStatus, pageSize = 100, page = 0, isTestnet: boolean) { - const params = new URLSearchParams({ - userAddress, - sourceChain, - status, - pageSize: pageSize.toString(), - page: page.toString() - }); - - try { - const api = isTestnet ? AVAIL_BRIDGE_INDEXER.AVAIL_TESTNET : AVAIL_BRIDGE_INDEXER.AVAIL_MAINNET; - const rawResponse = await fetch( - `${api}/transactions?${params.toString()}`, - { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - 'Access-Control-Allow-Origin': '*' - }, - credentials: 'omit' - } - ); - - if (!rawResponse.ok) { - console.error('Error fetching claimable bridge transactions'); - - return undefined; - } - - return await rawResponse.json() as AvailBridgeTransactionsResponse; - } catch (e) { - console.error(e); - - return undefined; - } -} - -export function filterClaimableOfAddress (address: string, transactions: AvailBridgeTransaction[]) { - return transactions.filter((transaction) => transaction.receiverAddress.toLowerCase() === address.toLowerCase()); -} - export function hrsToMillisecond (hours: number) { return hours * 60 * 60 * 1000; } diff --git a/packages/extension-base/src/services/inapp-notification-service/utils/index.ts b/packages/extension-base/src/services/inapp-notification-service/utils/index.ts new file mode 100644 index 00000000000..46a55d95229 --- /dev/null +++ b/packages/extension-base/src/services/inapp-notification-service/utils/index.ts @@ -0,0 +1,6 @@ +// Copyright 2019-2022 @subwallet/extension-base authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +export * from './avail'; +export * from './common'; +export * from './polygon'; 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 new file mode 100644 index 00000000000..725ad0b1d1b --- /dev/null +++ b/packages/extension-base/src/services/inapp-notification-service/utils/polygon.ts @@ -0,0 +1,122 @@ +// Copyright 2019-2022 @subwallet/extension-base authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +export const POLYGON_BRIDGE_INDEXER = { + MAINNET: 'https://api-gateway.polygon.technology/api/v3/transactions/mainnet', + TESTNET: 'https://api-gateway.polygon.technology/api/v3/transactions/testnet' +}; + +interface PolygonTransaction { + _id: string; + transactionIndex?: number; + sourceNetwork: number; + destinationNetwork: number; + blockNumber: number; + amounts: string[]; + bridgeType: string; + dataType: string; + isDecoded?: boolean; + status: string; + timestamp: string; + tokenIds: any[]; + transactionHash: string; + userAddress: string; + wrappedTokenAddress?: string; + wrappedTokenNetwork?: number; + counter?: number; + bridgeContractAddress?: string; + eventInitiatorAddress?: string; + globalExitRootManager?: string; + leaf?: string; + mainnetExitRoot?: string; + metadata?: string; + originTokenAddress?: string; + originTokenNetwork?: number; + receiver?: string; // empty when not claimed + refuel?: boolean; + rollUpExitRoot?: string; + nonce?: any; + rootTunnelAddress?: string; + claimContractAddress?: string; + claimTransactionBlockNumber?: number; + claimTransactionHash?: string; + claimTransactionTimestamp?: string; + transactionInitiator?: string; +} + +interface PaginationData { + hasNextPage: boolean; + page: number; + pageSize: number; + totalCount: number; +} + +interface LastCheckpoint { + _id: string; + proposer: string; + checkpointNumber: number; + reward: number; + start: number; + end: number; + root: string; + transactionHash: string; + timestamp: number; + __v: number; +} + +interface PolygonTransactionResponse { + success: boolean; + result: PolygonTransaction[]; + paginationData: PaginationData; + posWithdrawInterval: number; + lastCheckpoint: LastCheckpoint; +} + +/* Description */ +export function getWaitPolygonBridgeDescription (amount: string, symbol: string) { + return `${amount} ${symbol} will arrive in 30 minutes from Polygon Unified Bridge!`; +} +/* Description */ + +export async function fetchPolygonBridgeTransactions (userAddress: string, pageSize = 500, page = 0, isTestnet = true) { + const params = new URLSearchParams({ + userAddress, + pageSize: pageSize.toString(), + page: page.toString() + }); + + const networkIds = [0, 1]; + + networkIds.forEach((networkId) => { + params.append('destinationNetworkIds', networkId.toString()); + params.append('sourceNetworkIds', networkId.toString()); + }); + + try { + const domain = isTestnet ? POLYGON_BRIDGE_INDEXER.TESTNET : POLYGON_BRIDGE_INDEXER.MAINNET; + const rawResponse = await fetch( + `${domain}?${params.toString()}`, + { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + 'x-api-key': 'polygonag_4RFN-g_wt2o12GmK9WWOWrGf-4Hamhtd' + }, + credentials: 'omit' + } + ); + + if (!rawResponse.ok) { + console.error('Error fetching claimable bridge transactions'); + + return undefined; + } + + return await rawResponse.json() as PolygonTransactionResponse; + } catch (e) { + console.error(e); + + return undefined; + } +} diff --git a/packages/extension-base/src/services/transaction-service/index.ts b/packages/extension-base/src/services/transaction-service/index.ts index 00881fc998d..b6d9a978205 100644 --- a/packages/extension-base/src/services/transaction-service/index.ts +++ b/packages/extension-base/src/services/transaction-service/index.ts @@ -9,6 +9,7 @@ import { checkBalanceWithTransactionFee, checkSigningAccountForTransaction, chec import KoniState from '@subwallet/extension-base/koni/background/handlers/State'; import { cellToBase64Str, externalMessage, getTransferCellPromise } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/ton/utils'; import { TonTransactionConfig } from '@subwallet/extension-base/services/balance-service/transfer/ton-transfer'; +import { _isPolygonChainBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge'; import { ChainService } from '@subwallet/extension-base/services/chain-service'; import { _getAssetDecimals, _getAssetSymbol, _getChainNativeTokenBasicInfo, _getEvmChainId, _isChainEvmCompatible } from '@subwallet/extension-base/services/chain-service/utils'; import { EventService } from '@subwallet/extension-base/services/event-service'; @@ -738,6 +739,15 @@ export default class TransactionService { // todo: consider async this.state.chainService.updateAssetSetting(toAssetSlug, { visible: true }, true).catch(console.error); + } else if (transaction.extrinsicType === ExtrinsicType.TRANSFER_XCM) { + const inputData = parseTransactionData(transaction.data); + const isPolygonBridge = _isPolygonChainBridge(inputData.originNetworkKey, inputData.destinationNetworkKey); + const extrinsicHash = transaction.extrinsicHash; + + if (isPolygonBridge) { + this.state.inappNotificationService.writeWaitPolygonBridge(inputData, extrinsicHash) + .catch(console.error); + } } } diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index e1cc764aa3a..bad6f943082 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -34,7 +34,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.92", + "@subwallet/chain-list": "0.2.93-beta.3", "@subwallet/extension-base": "^1.3.5-0", "@subwallet/extension-chains": "^1.3.5-0", "@subwallet/extension-dapp": "^1.3.5-0", 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 6fc11e16294..810448df86f 100644 --- a/packages/extension-koni-ui/src/Popup/Settings/Notifications/Notification.tsx +++ b/packages/extension-koni-ui/src/Popup/Settings/Notifications/Notification.tsx @@ -45,7 +45,8 @@ export enum NotificationIconBackgroundColorMap { WITHDRAW = 'blue-8', CLAIM = 'yellow-7', CLAIM_AVAIL_BRIDGE_ON_AVAIL = 'yellow-7', // temporary set - CLAIM_AVAIL_BRIDGE_ON_ETHEREUM = 'yellow-7' + CLAIM_AVAIL_BRIDGE_ON_ETHEREUM = 'yellow-7', + HAVE_TO_WAIT_POLYGON_BRIDGE = 'blue-8' } export const NotificationIconMap = { @@ -54,7 +55,8 @@ export const NotificationIconMap = { WITHDRAW: DownloadSimple, CLAIM: Gift, CLAIM_AVAIL_BRIDGE_ON_AVAIL: Coins, // temporary set - CLAIM_AVAIL_BRIDGE_ON_ETHEREUM: Coins + CLAIM_AVAIL_BRIDGE_ON_ETHEREUM: Coins, + HAVE_TO_WAIT_POLYGON_BRIDGE: Coins }; const alertModalId = 'notification-alert-modal'; diff --git a/packages/extension-koni-ui/src/Popup/Settings/Tokens/FungibleTokenImport.tsx b/packages/extension-koni-ui/src/Popup/Settings/Tokens/FungibleTokenImport.tsx index 0fb6fe01088..a27ae3c24e5 100644 --- a/packages/extension-koni-ui/src/Popup/Settings/Tokens/FungibleTokenImport.tsx +++ b/packages/extension-koni-ui/src/Popup/Settings/Tokens/FungibleTokenImport.tsx @@ -425,8 +425,8 @@ function Component ({ className = '' }: Props): React.ReactElement { > diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index 3622378b7c5..c6c9dde17b6 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -35,7 +35,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.92", + "@subwallet/chain-list": "0.2.93-beta.3", "@subwallet/extension-base": "^1.3.5-0", "@subwallet/extension-chains": "^1.3.5-0", "@subwallet/extension-dapp": "^1.3.5-0", diff --git a/yarn.lock b/yarn.lock index 9607b5d8b54..b43a0e10a08 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6265,14 +6265,14 @@ __metadata: languageName: node linkType: hard -"@subwallet/chain-list@npm:0.2.92": - version: 0.2.92 - resolution: "@subwallet/chain-list@npm:0.2.92" +"@subwallet/chain-list@npm:0.2.93-beta.3": + version: 0.2.93-beta.3 + resolution: "@subwallet/chain-list@npm:0.2.93-beta.3" dependencies: "@polkadot/dev": 0.67.167 "@polkadot/util": ^12.5.1 eventemitter3: ^5.0.1 - checksum: 358078ca2948031004ba5f62b1aa870e8ac5189f51beafafdfefa0091858e10b4c52a8987be49a5445b63fd969f13bb7b572f4fdfb43fa45076514b8f7fbdb18 + checksum: 3fc0f61424a967691ec737273823b0d7622d17a5ddfc5eabe38f99a8cb7696c5e1fb4721e985486d9a1db0b231475b96db8f37a0a84caa6de7c8f15ada7964d5 languageName: node linkType: hard @@ -6315,7 +6315,7 @@ __metadata: "@reduxjs/toolkit": ^1.9.1 "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 - "@subwallet/chain-list": 0.2.92 + "@subwallet/chain-list": 0.2.93-beta.3 "@subwallet/extension-base": ^1.3.5-0 "@subwallet/extension-chains": ^1.3.5-0 "@subwallet/extension-dapp": ^1.3.5-0 @@ -6453,7 +6453,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.92 + "@subwallet/chain-list": 0.2.93-beta.3 "@subwallet/extension-base": ^1.3.5-0 "@subwallet/extension-chains": ^1.3.5-0 "@subwallet/extension-dapp": ^1.3.5-0 @@ -6593,7 +6593,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.92 + "@subwallet/chain-list": 0.2.93-beta.3 "@subwallet/extension-base": ^1.3.5-0 "@subwallet/extension-chains": ^1.3.5-0 "@subwallet/extension-dapp": ^1.3.5-0 From d830808868985305790d73d654945c5974d32ccf Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Tue, 5 Nov 2024 19:03:54 +0700 Subject: [PATCH 047/204] [Issue-3132] fix: fix chain list store --- .../src/koni/background/handlers/State.ts | 2 - .../chain-online-service/Chainlist.ts | 17 ---- .../services/chain-online-service/index.ts | 15 +-- .../src/services/chain-service/index.ts | 98 +------------------ .../setting-service/SettingService.ts | 13 ++- 5 files changed, 15 insertions(+), 130 deletions(-) delete mode 100644 packages/extension-base/src/services/chain-online-service/Chainlist.ts diff --git a/packages/extension-base/src/koni/background/handlers/State.ts b/packages/extension-base/src/koni/background/handlers/State.ts index 4ab4b3176c3..42b7e85b1ad 100644 --- a/packages/extension-base/src/koni/background/handlers/State.ts +++ b/packages/extension-base/src/koni/background/handlers/State.ts @@ -306,7 +306,6 @@ export default class KoniState { await this.startSubscription(); this.chainOnlineService.checkLatestData(); - this.chainService.checkLatestData(); } public async initMantaPay (password: string) { @@ -1646,7 +1645,6 @@ export default class KoniState { this.afterChainServiceInit(); this.chainOnlineService.checkLatestData(); - this.chainService.checkLatestData(); } public async enableMantaPay (updateStore: boolean, address: string, password: string, seedPhrase?: string) { diff --git a/packages/extension-base/src/services/chain-online-service/Chainlist.ts b/packages/extension-base/src/services/chain-online-service/Chainlist.ts deleted file mode 100644 index 34d2f5cc160..00000000000 --- a/packages/extension-base/src/services/chain-online-service/Chainlist.ts +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2019-2022 @subwallet/extension-base -// SPDX-License-Identifier: Apache-2.0 - -import { StoreSubject } from '@subwallet/extension-base/services/keyring-service/context/stores/Base'; -import ChainlistStore from '@subwallet/extension-base/stores/ChainlistStore'; -import { BehaviorSubject } from 'rxjs'; - -interface ChainlistConfig { - patchVersion: string -} - -export class ChainlistStoreSubject extends StoreSubject { - store = new ChainlistStore(); - subject = new BehaviorSubject({ patchVersion: '' }); - key = 'Chainlist'; - defaultValue = { patchVersion: '' }; -} diff --git a/packages/extension-base/src/services/chain-online-service/index.ts b/packages/extension-base/src/services/chain-online-service/index.ts index 12665b612cb..36b78101ca4 100644 --- a/packages/extension-base/src/services/chain-online-service/index.ts +++ b/packages/extension-base/src/services/chain-online-service/index.ts @@ -88,7 +88,7 @@ export class ChainOnlineService { return true; } - handleLatestPatch (latestPatch: PatchInfo) { + async handleLatestPatch (latestPatch: PatchInfo) { try { // 1. validate fetch data with its hash const isSafePatch = this.validatePatchWithHash(latestPatch); @@ -99,13 +99,12 @@ export class ChainOnlineService { MultiChainAsset: latestMultiChainAsset, mAssetLogoMap: lastestMAssetLogoMap, patchVersion: latestPatchVersion } = latestPatch; - const currentPatchVersion = this.settingService.getChainlistInfo().patchVersion; + const currentPatchVersion = (await this.settingService.getChainlistSetting())?.patchVersion || ''; let chainInfoMap: Record = {}; let assetRegistry: Record = {}; let multiChainAssetMap: Record = {}; let currentChainState: Record = {}; - let addedChain: string[] = []; // todo: AssetLogoMap, ChainLogoMap @@ -185,12 +184,13 @@ export class ChainOnlineService { return await fetchPatchData('data.json'); } - handleLatestData () { + handleLatestPatchData () { this.fetchLatestPatchData().then((latestPatch) => { if (latestPatch) { this.eventService.waitAssetReady .then(() => { - this.handleLatestPatch(latestPatch); + this.handleLatestPatch(latestPatch) + .catch(console.error); }) .catch(console.error); } @@ -199,8 +199,9 @@ export class ChainOnlineService { checkLatestData () { clearInterval(this.refreshLatestChainDataTimeOut); - this.handleLatestData(); + this.handleLatestPatchData(); + this.chainService.handleLatestData(); - this.refreshLatestChainDataTimeOut = setInterval(this.handleLatestData.bind(this), LATEST_CHAIN_DATA_FETCHING_INTERVAL); + this.refreshLatestChainDataTimeOut = setInterval(this.handleLatestPatchData.bind(this), LATEST_CHAIN_DATA_FETCHING_INTERVAL); } } diff --git a/packages/extension-base/src/services/chain-service/index.ts b/packages/extension-base/src/services/chain-service/index.ts index 2be9e053b29..e66c63e1bbf 100644 --- a/packages/extension-base/src/services/chain-service/index.ts +++ b/packages/extension-base/src/services/chain-service/index.ts @@ -4,7 +4,7 @@ import { AssetLogoMap, AssetRefMap, ChainAssetMap, ChainInfoMap, ChainLogoMap, MultiChainAssetMap } from '@subwallet/chain-list'; import { _AssetRef, _AssetRefPath, _AssetType, _ChainAsset, _ChainInfo, _ChainStatus, _EvmInfo, _MultiChainAsset, _SubstrateChainType, _SubstrateInfo, _TonInfo } from '@subwallet/chain-list/types'; import { AssetSetting, ValidateNetworkResponse } from '@subwallet/extension-base/background/KoniTypes'; -import { _DEFAULT_ACTIVE_CHAINS, _ZK_ASSET_PREFIX, LATEST_CHAIN_DATA_FETCHING_INTERVAL } from '@subwallet/extension-base/services/chain-service/constants'; +import { _DEFAULT_ACTIVE_CHAINS, _ZK_ASSET_PREFIX } from '@subwallet/extension-base/services/chain-service/constants'; import { EvmChainHandler } from '@subwallet/extension-base/services/chain-service/handler/EvmChainHandler'; import { MantaPrivateHandler } from '@subwallet/extension-base/services/chain-service/handler/manta/MantaPrivateHandler'; import { SubstrateChainHandler } from '@subwallet/extension-base/services/chain-service/handler/SubstrateChainHandler'; @@ -57,22 +57,6 @@ export const filterAssetInfoMap = (chainInfo: Record, assets ); }; -// const rawAssetRefMap = (assetRefMap: Record) => { -// const result: Record = {}; -// -// Object.entries(assetRefMap).forEach(([key, assetRef]) => { -// const originChainInfo = ChainInfoMap[assetRef.srcChain]; -// const destChainInfo = ChainInfoMap[assetRef.destChain]; -// const isSnowBridgeXcm = assetRef.path === _AssetRefPath.XCM && _isSnowBridgeXcm(originChainInfo, destChainInfo); -// -// if (!isSnowBridgeXcm) { -// result[key] = assetRef; -// } -// }); -// -// return result; -// }; - export class ChainService { private dataMap: _DataMap = { chainInfoMap: {}, @@ -697,13 +681,6 @@ export class ChainService { this.dataMap.assetRefMap = AssetRefMap; } - checkLatestData () { - clearInterval(this.refreshLatestChainDataTimeOut); - this.handleLatestData(); - - this.refreshLatestChainDataTimeOut = setInterval(this.handleLatestData.bind(this), LATEST_CHAIN_DATA_FETCHING_INTERVAL); - } - stopCheckLatestChainData () { clearInterval(this.refreshLatestChainDataTimeOut); } @@ -728,26 +705,6 @@ export class ChainService { } } - // handleLatestAssetRef (latestBlockedAssetRefList: string[], latestAssetRefMap: Record | null) { - // const updatedAssetRefMap: Record = { ...AssetRefMap }; - // - // if (latestAssetRefMap) { - // for (const [assetRefKey, assetRef] of Object.entries(latestAssetRefMap)) { - // updatedAssetRefMap[assetRefKey] = assetRef; - // } - // } - // - // latestBlockedAssetRefList.forEach((blockedAssetRef) => { - // delete updatedAssetRefMap[blockedAssetRef]; - // }); - // - // this.dataMap.assetRefMap = updatedAssetRefMap; - // - // this.xcmRefMapSubject.next(this.xcmRefMap); - // this.swapRefMapSubject.next(this.swapRefMap); - // this.logger.log('Finished updating latest asset ref'); - // } - handleLatestPriceId (latestPriceIds: Record) { let isUpdated = false; @@ -766,45 +723,6 @@ export class ChainService { this.logger.log('Finished updating latest price IDs'); } - // handleLatestAssetData (latestAssetInfo: Record | null, latestAssetLogoMap: Record | null) { - // try { - // if (latestAssetInfo) { - // const latestAssetPatch = JSON.stringify(latestAssetInfo); - // - // if (this.assetMapPatch !== latestAssetPatch) { - // const assetRegistry = filterAssetInfoMap(this.getChainInfoMap(), Object.assign({}, this.dataMap.assetRegistry, latestAssetInfo)); - // - // this.assetMapPatch = latestAssetPatch; - // this.dataMap.assetRegistry = assetRegistry; - // this.assetRegistrySubject.next(assetRegistry); - // - // this.autoEnableTokens() - // .then(() => { - // this.eventService.emit('asset.updateState', ''); - // }) - // .catch(console.error); - // } - // } - // - // if (latestAssetLogoMap) { - // const latestAssetLogoPatch = JSON.stringify(latestAssetLogoMap); - // - // if (this.assetLogoPatch !== latestAssetLogoPatch) { - // const logoMap = { ...AssetLogoMap, ...latestAssetLogoMap }; - // - // this.assetLogoPatch = latestAssetLogoPatch; - // this.assetLogoMapSubject.next(logoMap); - // } - // } - // } catch (e) { - // console.error('Error fetching latest asset data'); - // } - // - // this.eventService.emit('asset.online.ready', true); - // - // this.logger.log('Finished updating latest asset'); - // } - async autoEnableTokens () { const autoEnableTokens = Object.values(this.dataMap.assetRegistry).filter((asset) => _isAssetAutoEnable(asset)); @@ -835,22 +753,10 @@ export class ChainService { } handleLatestData () { - // this.fetchLatestAssetData().then(([latestAssetInfo, latestAssetLogoMap]) => { - // this.eventService.waitAssetReady - // .then(() => { - // this.handleLatestAssetData(latestAssetInfo, latestAssetLogoMap); - // }) - // .catch(console.error); - // }).catch(console.error); - this.fetchLatestChainData().then((latestChainInfo) => { this.handleLatestChainData(latestChainInfo); }).catch(console.error); - // this.fetchLatestAssetRef().then(([latestAssetRef, latestAssetRefMap]) => { - // this.handleLatestAssetRef(latestAssetRef, latestAssetRefMap); - // }).catch(console.error); - this.fetchLatestPriceIdsData().then((latestPriceIds) => { this.handleLatestPriceId(latestPriceIds); }).catch(console.error); @@ -1925,8 +1831,6 @@ export class ChainService { this.evmChainHandler.wakeUp(), this.tonChainHandler.wakeUp() ]); - - this.checkLatestData(); } public async initAssetSettings () { diff --git a/packages/extension-base/src/services/setting-service/SettingService.ts b/packages/extension-base/src/services/setting-service/SettingService.ts index fb523a026d3..d4824cf9515 100644 --- a/packages/extension-base/src/services/setting-service/SettingService.ts +++ b/packages/extension-base/src/services/setting-service/SettingService.ts @@ -3,9 +3,8 @@ import { LanguageType, PassPhishing, RequestSettingsType, UiSettings } from '@subwallet/extension-base/background/KoniTypes'; import { LANGUAGE } from '@subwallet/extension-base/constants'; -import { ChainlistStoreSubject } from '@subwallet/extension-base/services/chain-online-service/Chainlist'; import { SWStorage } from '@subwallet/extension-base/storage'; -import { ChainlistConfig } from '@subwallet/extension-base/stores/ChainlistStore'; +import ChainlistStore, { ChainlistConfig } from '@subwallet/extension-base/stores/ChainlistStore'; import PassPhishingStore from '@subwallet/extension-base/stores/PassPhishingStore'; import SettingsStore from '@subwallet/extension-base/stores/Settings'; import { Subject } from 'rxjs'; @@ -16,7 +15,7 @@ import { DEFAULT_SETTING } from './constants'; export default class SettingService { private readonly settingsStore = new SettingsStore(); private readonly passPhishingStore = new PassPhishingStore(); - private readonly chainlistStore = new ChainlistStoreSubject(); + private readonly chainlistStore = new ChainlistStore(); constructor () { this.initSetting().catch(console.error); @@ -76,12 +75,12 @@ export default class SettingService { this.passPhishingStore.set('PassPhishing', data, callback); } - public getChainlistInfo (): ChainlistConfig { - return this.chainlistStore.subject.value; + public getChainlistSetting () { + return this.chainlistStore.asyncGet('Chainlist'); } - public setChainlist (data: ChainlistConfig): void { - this.chainlistStore.upsertData(data); + public setChainlist (data: ChainlistConfig, callback?: () => void): void { + this.chainlistStore.set('Chainlist', data, callback); } // Use for mobile only From 514c1e3e7f0747b73f1eb967492274cb753c9fea Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Wed, 6 Nov 2024 12:11:16 +0700 Subject: [PATCH 048/204] [Issue-3132] fix: fix chain list store --- .../services/chain-online-service/index.ts | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/packages/extension-base/src/services/chain-online-service/index.ts b/packages/extension-base/src/services/chain-online-service/index.ts index 36b78101ca4..d1c1dcec742 100644 --- a/packages/extension-base/src/services/chain-online-service/index.ts +++ b/packages/extension-base/src/services/chain-online-service/index.ts @@ -5,7 +5,7 @@ import { AssetLogoMap, ChainLogoMap, MultiChainAssetMap } from '@subwallet/chain import { _ChainAsset, _ChainInfo, _MultiChainAsset } from '@subwallet/chain-list/types'; import { ChainService, filterAssetInfoMap } from '@subwallet/extension-base/services/chain-service'; import { LATEST_CHAIN_DATA_FETCHING_INTERVAL } from '@subwallet/extension-base/services/chain-service/constants'; -import { _ChainState } from '@subwallet/extension-base/services/chain-service/types'; +import { _ChainApiStatus, _ChainConnectionStatus, _ChainState } from '@subwallet/extension-base/services/chain-service/types'; import { fetchPatchData, PatchInfo } from '@subwallet/extension-base/services/chain-service/utils'; import { EventService } from '@subwallet/extension-base/services/event-service'; import SettingService from '@subwallet/extension-base/services/setting-service/SettingService'; @@ -104,7 +104,8 @@ export class ChainOnlineService { let chainInfoMap: Record = {}; let assetRegistry: Record = {}; let multiChainAssetMap: Record = {}; - let currentChainState: Record = {}; + let currentChainStateMap: Record = {}; + let currentChainStatusMap: Record = {}; let addedChain: string[] = []; // todo: AssetLogoMap, ChainLogoMap @@ -113,19 +114,25 @@ export class ChainOnlineService { if (latestChainInfo && Object.keys(latestChainInfo).length > 0) { chainInfoMap = Object.assign({}, this.chainService.getChainInfoMap(), latestChainInfo); - currentChainState = this.chainService.getChainStateMap(); - const currentChainStateKey = Object.keys(currentChainState); - const newChainStateKey = Object.keys(chainInfoMap); + [currentChainStateMap, currentChainStatusMap] = [this.chainService.getChainStateMap(), this.chainService.getChainStatusMap()]; - addedChain = newChainStateKey.filter((chain) => !currentChainStateKey.includes(chain)); + const [currentChainStateKey, newChainKey] = [Object.keys(currentChainStateMap), Object.keys(chainInfoMap)]; + + addedChain = newChainKey.filter((chain) => !currentChainStateKey.includes(chain)); addedChain.forEach((key) => { - currentChainState[key] = { + currentChainStateMap[key] = { active: false, currentProvider: Object.keys(chainInfoMap[key].providers)[0], manualTurnOff: false, slug: key }; + + currentChainStatusMap[key] = { + slug: key, + connectionStatus: _ChainConnectionStatus.DISCONNECTED, + lastUpdated: Date.now() + }; }); } @@ -155,8 +162,8 @@ export class ChainOnlineService { this.chainService.subscribeMultiChainAssetMap().next(multiChainAssetMap); - this.chainService.setChainStateMap(currentChainState); - this.chainService.subscribeChainStateMap().next(currentChainState); + this.chainService.setChainStateMap(currentChainStateMap); + this.chainService.subscribeChainStateMap().next(currentChainStateMap); if (latestChainLogoMap) { const logoMap = Object.assign({}, ChainLogoMap, latestChainLogoMap); From 07899705e1e572bd2ed01ff30996e10fb95a0eea Mon Sep 17 00:00:00 2001 From: S2kael Date: Wed, 6 Nov 2024 14:24:44 +0700 Subject: [PATCH 049/204] [Issue-3828] Update stable version for chain-list --- package.json | 2 +- packages/extension-base/package.json | 2 +- packages/extension-koni-ui/package.json | 2 +- packages/extension-web-ui/package.json | 2 +- yarn.lock | 14 +++++++------- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 15dad95b50e..02fbbb6a080 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@polkadot/types-support": "^12.0.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/chain-list": "0.2.93-beta.2", + "@subwallet/chain-list": "0.2.93", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b79", "@subwallet/ui-keyring": "0.1.8-beta.0", diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index 4658ceb926e..393df62542d 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -55,7 +55,7 @@ "@reduxjs/toolkit": "^1.9.1", "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", - "@subwallet/chain-list": "0.2.93-beta.2", + "@subwallet/chain-list": "0.2.93", "@subwallet/extension-base": "^1.3.5-0", "@subwallet/extension-chains": "^1.3.5-0", "@subwallet/extension-dapp": "^1.3.5-0", diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index df3e7314b95..957a686ad2c 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -34,7 +34,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.93-beta.2", + "@subwallet/chain-list": "0.2.93", "@subwallet/extension-base": "^1.3.5-0", "@subwallet/extension-chains": "^1.3.5-0", "@subwallet/extension-dapp": "^1.3.5-0", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index fa595f2b676..cc39beecd90 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -35,7 +35,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.93-beta.2", + "@subwallet/chain-list": "0.2.93", "@subwallet/extension-base": "^1.3.5-0", "@subwallet/extension-chains": "^1.3.5-0", "@subwallet/extension-dapp": "^1.3.5-0", diff --git a/yarn.lock b/yarn.lock index c7d75417950..3d4d5fe935b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6265,14 +6265,14 @@ __metadata: languageName: node linkType: hard -"@subwallet/chain-list@npm:0.2.93-beta.2": - version: 0.2.93-beta.2 - resolution: "@subwallet/chain-list@npm:0.2.93-beta.2" +"@subwallet/chain-list@npm:0.2.93": + version: 0.2.93 + resolution: "@subwallet/chain-list@npm:0.2.93" dependencies: "@polkadot/dev": 0.67.167 "@polkadot/util": ^12.5.1 eventemitter3: ^5.0.1 - checksum: f340c632e346d18d96f8027fc6417716d23c86f6da29b9978a938528bedec96968bc19d27c055c0162b8603e9a91e37551efe2447e19eba44bd3f2f59fdeb8e8 + checksum: e618b88b667858336291f487747a4cfd8c718af3b6dda369c316f511d18e2e64297441aed7a1f48b3eb2381685898471109519a7bc6916ef2179500805dfe588 languageName: node linkType: hard @@ -6315,7 +6315,7 @@ __metadata: "@reduxjs/toolkit": ^1.9.1 "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 - "@subwallet/chain-list": 0.2.93-beta.2 + "@subwallet/chain-list": 0.2.93 "@subwallet/extension-base": ^1.3.5-0 "@subwallet/extension-chains": ^1.3.5-0 "@subwallet/extension-dapp": ^1.3.5-0 @@ -6453,7 +6453,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.93-beta.2 + "@subwallet/chain-list": 0.2.93 "@subwallet/extension-base": ^1.3.5-0 "@subwallet/extension-chains": ^1.3.5-0 "@subwallet/extension-dapp": ^1.3.5-0 @@ -6593,7 +6593,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.93-beta.2 + "@subwallet/chain-list": 0.2.93 "@subwallet/extension-base": ^1.3.5-0 "@subwallet/extension-chains": ^1.3.5-0 "@subwallet/extension-dapp": ^1.3.5-0 From 4c8a02850810909c1ebf883a89238ae0e5a84004 Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Wed, 6 Nov 2024 17:14:14 +0700 Subject: [PATCH 050/204] [Issue-3132] feat: update flow running latest patch and latest chain rpc --- .../src/koni/background/handlers/State.ts | 4 +- .../chain-online-service/constants.ts | 4 ++ .../services/chain-online-service/index.ts | 36 +++++++--- .../src/services/chain-service/index.ts | 66 +++++++++++++++---- 4 files changed, 88 insertions(+), 22 deletions(-) create mode 100644 packages/extension-base/src/services/chain-online-service/constants.ts diff --git a/packages/extension-base/src/koni/background/handlers/State.ts b/packages/extension-base/src/koni/background/handlers/State.ts index 42b7e85b1ad..19812c237aa 100644 --- a/packages/extension-base/src/koni/background/handlers/State.ts +++ b/packages/extension-base/src/koni/background/handlers/State.ts @@ -167,7 +167,7 @@ export default class KoniState { this.feeService = new FeeService(this); this.swapService = new SwapService(this); this.inappNotificationService = new InappNotificationService(this.dbService, this.keyringService, this.eventService, this.chainService); - this.chainOnlineService = new ChainOnlineService(this.chainService, this.settingService, this.eventService); + this.chainOnlineService = new ChainOnlineService(this.chainService, this.settingService, this.eventService, this.dbService); this.subscription = new KoniSubscription(this, this.dbService); this.cron = new KoniCron(this, this.subscription, this.dbService); @@ -306,6 +306,7 @@ export default class KoniState { await this.startSubscription(); this.chainOnlineService.checkLatestData(); + this.chainService.checkLatestData(); } public async initMantaPay (password: string) { @@ -1645,6 +1646,7 @@ export default class KoniState { this.afterChainServiceInit(); this.chainOnlineService.checkLatestData(); + this.chainService.checkLatestData(); } public async enableMantaPay (updateStore: boolean, address: string, password: string, seedPhrase?: string) { diff --git a/packages/extension-base/src/services/chain-online-service/constants.ts b/packages/extension-base/src/services/chain-online-service/constants.ts new file mode 100644 index 00000000000..c99749eb0a5 --- /dev/null +++ b/packages/extension-base/src/services/chain-online-service/constants.ts @@ -0,0 +1,4 @@ +// Copyright 2019-2022 @subwallet/extension-koni authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +export const LATEST_CHAIN_PATCH_FETCHING_INTERVAL = 180000; diff --git a/packages/extension-base/src/services/chain-online-service/index.ts b/packages/extension-base/src/services/chain-online-service/index.ts index d1c1dcec742..bc02f3277cd 100644 --- a/packages/extension-base/src/services/chain-online-service/index.ts +++ b/packages/extension-base/src/services/chain-online-service/index.ts @@ -3,25 +3,29 @@ import { AssetLogoMap, ChainLogoMap, MultiChainAssetMap } from '@subwallet/chain-list'; import { _ChainAsset, _ChainInfo, _MultiChainAsset } from '@subwallet/chain-list/types'; +import { LATEST_CHAIN_PATCH_FETCHING_INTERVAL } from '@subwallet/extension-base/services/chain-online-service/constants'; import { ChainService, filterAssetInfoMap } from '@subwallet/extension-base/services/chain-service'; -import { LATEST_CHAIN_DATA_FETCHING_INTERVAL } from '@subwallet/extension-base/services/chain-service/constants'; import { _ChainApiStatus, _ChainConnectionStatus, _ChainState } from '@subwallet/extension-base/services/chain-service/types'; -import { fetchPatchData, PatchInfo } from '@subwallet/extension-base/services/chain-service/utils'; +import { fetchPatchData, PatchInfo, randomizeProvider } from '@subwallet/extension-base/services/chain-service/utils'; import { EventService } from '@subwallet/extension-base/services/event-service'; import SettingService from '@subwallet/extension-base/services/setting-service/SettingService'; +import { IChain } from '@subwallet/extension-base/services/storage-service/databases'; +import DatabaseService from '@subwallet/extension-base/services/storage-service/DatabaseService'; import { Md5 } from 'ts-md5'; export class ChainOnlineService { private chainService: ChainService; private settingService: SettingService; private eventService: EventService; + private dbService: DatabaseService; refreshLatestChainDataTimeOut: NodeJS.Timer | undefined; - constructor (chainService: ChainService, settingService: SettingService, eventService: EventService) { + constructor (chainService: ChainService, settingService: SettingService, eventService: EventService, dbService: DatabaseService) { this.chainService = chainService; this.settingService = settingService; this.eventService = eventService; + this.dbService = dbService; } md5Hash (data: any) { @@ -107,7 +111,6 @@ export class ChainOnlineService { let currentChainStateMap: Record = {}; let currentChainStatusMap: Record = {}; let addedChain: string[] = []; - // todo: AssetLogoMap, ChainLogoMap if (isSafePatch && currentPatchVersion !== latestPatchVersion) { // 2. merge data map @@ -123,7 +126,7 @@ export class ChainOnlineService { addedChain.forEach((key) => { currentChainStateMap[key] = { active: false, - currentProvider: Object.keys(chainInfoMap[key].providers)[0], + currentProvider: randomizeProvider(chainInfoMap[key].providers).providerKey, manualTurnOff: false, slug: key }; @@ -165,6 +168,17 @@ export class ChainOnlineService { this.chainService.setChainStateMap(currentChainStateMap); this.chainService.subscribeChainStateMap().next(currentChainStateMap); + this.chainService.subscribeChainStatusMap().next(currentChainStatusMap); + + const storedChainInfoList: IChain[] = Object.keys(chainInfoMap).map((chainSlug) => { + return { + ...chainInfoMap[chainSlug], + ...currentChainStateMap[chainSlug] + }; + }); + + await this.dbService.bulkUpdateChainStore(storedChainInfoList); + if (latestChainLogoMap) { const logoMap = Object.assign({}, ChainLogoMap, latestChainLogoMap); @@ -193,11 +207,16 @@ export class ChainOnlineService { handleLatestPatchData () { this.fetchLatestPatchData().then((latestPatch) => { - if (latestPatch) { + if (latestPatch && !this.chainService.getlockChainInfoMap()) { this.eventService.waitAssetReady .then(() => { + this.chainService.setLockChainInfoMap(true); this.handleLatestPatch(latestPatch) - .catch(console.error); + .then(() => this.chainService.setLockChainInfoMap(false)) + .catch((e) => { + this.chainService.setLockChainInfoMap(false); + console.error('Error update latest patch', e); + }); }) .catch(console.error); } @@ -207,8 +226,7 @@ export class ChainOnlineService { checkLatestData () { clearInterval(this.refreshLatestChainDataTimeOut); this.handleLatestPatchData(); - this.chainService.handleLatestData(); - this.refreshLatestChainDataTimeOut = setInterval(this.handleLatestPatchData.bind(this), LATEST_CHAIN_DATA_FETCHING_INTERVAL); + this.refreshLatestChainDataTimeOut = setInterval(this.handleLatestPatchData.bind(this), LATEST_CHAIN_PATCH_FETCHING_INTERVAL); } } diff --git a/packages/extension-base/src/services/chain-service/index.ts b/packages/extension-base/src/services/chain-service/index.ts index e66c63e1bbf..9f62f647302 100644 --- a/packages/extension-base/src/services/chain-service/index.ts +++ b/packages/extension-base/src/services/chain-service/index.ts @@ -4,7 +4,7 @@ import { AssetLogoMap, AssetRefMap, ChainAssetMap, ChainInfoMap, ChainLogoMap, MultiChainAssetMap } from '@subwallet/chain-list'; import { _AssetRef, _AssetRefPath, _AssetType, _ChainAsset, _ChainInfo, _ChainStatus, _EvmInfo, _MultiChainAsset, _SubstrateChainType, _SubstrateInfo, _TonInfo } from '@subwallet/chain-list/types'; import { AssetSetting, ValidateNetworkResponse } from '@subwallet/extension-base/background/KoniTypes'; -import { _DEFAULT_ACTIVE_CHAINS, _ZK_ASSET_PREFIX } from '@subwallet/extension-base/services/chain-service/constants'; +import { _DEFAULT_ACTIVE_CHAINS, _ZK_ASSET_PREFIX, LATEST_CHAIN_DATA_FETCHING_INTERVAL } from '@subwallet/extension-base/services/chain-service/constants'; import { EvmChainHandler } from '@subwallet/extension-base/services/chain-service/handler/EvmChainHandler'; import { MantaPrivateHandler } from '@subwallet/extension-base/services/chain-service/handler/manta/MantaPrivateHandler'; import { SubstrateChainHandler } from '@subwallet/extension-base/services/chain-service/handler/SubstrateChainHandler'; @@ -170,6 +170,14 @@ export class ChainService { return result; } + public getlockChainInfoMap () { + return this.lockChainInfoMap; + } + + public setLockChainInfoMap (isLock: boolean) { + this.lockChainInfoMap = isLock; + } + public getEvmApi (slug: string) { return this.evmChainHandler.getEvmApiByChain(slug); } @@ -681,6 +689,13 @@ export class ChainService { this.dataMap.assetRefMap = AssetRefMap; } + checkLatestData () { + clearInterval(this.refreshLatestChainDataTimeOut); + this.handleLatestData(); + + this.refreshLatestChainDataTimeOut = setInterval(this.handleLatestData.bind(this), LATEST_CHAIN_DATA_FETCHING_INTERVAL); + } + stopCheckLatestChainData () { clearInterval(this.refreshLatestChainDataTimeOut); } @@ -754,8 +769,13 @@ export class ChainService { handleLatestData () { this.fetchLatestChainData().then((latestChainInfo) => { + this.lockChainInfoMap = true; // do not need to check current lockChainInfoMap because all remains action is fast enough and don't affect this feature. this.handleLatestChainData(latestChainInfo); - }).catch(console.error); + this.lockChainInfoMap = false; + }).catch((e) => { + this.lockChainInfoMap = false; + console.error('Error update latest chain data', e); + }); this.fetchLatestPriceIdsData().then((latestPriceIds) => { this.handleLatestPriceId(latestPriceIds); @@ -1059,19 +1079,11 @@ export class ChainService { // } } - // private async fetchLatestAssetData () { - // return await Promise.all([fetchPatchData>('ChainAsset.json'), fetchPatchData>('AssetLogoMap.json')]); // lastest logo also here. - // } - // @ts-ignore private async fetchLatestPriceIdsData () { return await fetchStaticData>('chain-assets/price-map'); } - // private async fetchLatestAssetRef () { - // return await Promise.all([fetchStaticData('chain-assets/disabled-xcm-channels'), fetchPatchData>('AssetRef.json')]); // - // } - private async fetchLatestLedgerGenericAllowChains () { return await fetchStaticData('chains/ledger-generic-allow-chains') || []; } @@ -1226,8 +1238,36 @@ export class ChainService { manualTurnOff }); } - } else { - // Todo: Remove chain from storage + } else { // added chain from patch + this.dataMap.chainStateMap[storedSlug] = { + currentProvider: storedChainInfo.currentProvider, + slug: storedSlug, + active: storedChainInfo.active, + manualTurnOff + }; + + this.updateChainConnectionStatus(storedSlug, _ChainConnectionStatus.DISCONNECTED); + + newStorageData.push({ + ...storedChainSettingMap[storedSlug], + active: storedChainInfo.active, + currentProvider: storedChainInfo.currentProvider, + manualTurnOff + }); + + mergedChainInfoMap[storedSlug] = { + slug: storedSlug, + name: storedChainInfo.name, + providers: storedChainInfo.providers, + evmInfo: storedChainInfo.evmInfo, + substrateInfo: storedChainInfo.substrateInfo, + bitcoinInfo: storedChainInfo.bitcoinInfo ?? null, + tonInfo: storedChainInfo.tonInfo, + isTestnet: storedChainInfo.isTestnet, + chainStatus: storedChainInfo.chainStatus, + icon: storedChainInfo.icon, + extraInfo: storedChainInfo.extraInfo + }; } } @@ -1831,6 +1871,8 @@ export class ChainService { this.evmChainHandler.wakeUp(), this.tonChainHandler.wakeUp() ]); + + this.checkLatestData(); } public async initAssetSettings () { From 39bb242d3c24c80875ecee30a0ad43d66d9d59ba Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 6 Nov 2024 11:20:01 +0000 Subject: [PATCH 051/204] [CI Skip] release/beta 1.3.6-0 skip-checks: true --- CONTRIBUTORS | 6 +- package.json | 2 +- packages/extension-base/package.json | 12 ++-- packages/extension-base/src/packageInfo.ts | 2 +- packages/extension-chains/package.json | 4 +- packages/extension-chains/src/packageInfo.ts | 2 +- .../extension-compat-metamask/package.json | 4 +- .../src/packageInfo.ts | 2 +- packages/extension-dapp/package.json | 4 +- packages/extension-dapp/src/packageInfo.ts | 2 +- packages/extension-inject/package.json | 2 +- packages/extension-inject/src/packageInfo.ts | 2 +- packages/extension-koni-ui/package.json | 12 ++-- packages/extension-koni/package.json | 8 +-- packages/extension-koni/src/packageInfo.ts | 2 +- packages/extension-mocks/package.json | 2 +- packages/extension-web-ui/package.json | 12 ++-- packages/web-runner/package.json | 8 +-- packages/webapp/package.json | 8 +-- yarn.lock | 68 +++++++++---------- 20 files changed, 82 insertions(+), 82 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index cd252ed2891..0fa17b18946 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,6 +1,6 @@ - 2880 AnhMTV Release version 1.3.5 + 2883 AnhMTV 2546 Nam Phạm [Issue 3747] chore: fix eslint - 2363 S2kael [Issue-3815] Update stable version for chain-list + 2366 S2kael [Issue-3828] Update stable version for chain-list 869 lw-cdm [MasterAccount] Update logic to reorder account on select account modal 568 nguyentiendung [Issue-3553] [Issue-3553] Refactor code and add recipient to swap history. 465 Jaco 0.42.5 (#969) @@ -17,7 +17,7 @@ 83 leewong 82 Thibaut Sardan Add account filtering feature (#832) 73 bluedot [Issue-3579] fix: update check fully migrate - 68 PDTnhah [Issue-3815] Update chainlist + 70 PDTnhah [Issue-3828] Update chainlist 63 Roman fix ui issues 53 Dominhquangdev update Bridge code 34 tunghp2002 diff --git a/package.json b/package.json index 0318d210c74..ca7ff0dd08a 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "url": "https://github.com/Koniverse/Subwallet-V2.git" }, "sideEffects": false, - "version": "1.3.5", + "version": "1.3.6-0", "workspaces": [ "packages/*" ], diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index 393df62542d..de450a1c590 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -17,7 +17,7 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.5-0", + "version": "1.3.6-0", "main": "index.js", "dependencies": { "@acala-network/api": "^5.0.2", @@ -56,10 +56,10 @@ "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", "@subwallet/chain-list": "0.2.93", - "@subwallet/extension-base": "^1.3.5-0", - "@subwallet/extension-chains": "^1.3.5-0", - "@subwallet/extension-dapp": "^1.3.5-0", - "@subwallet/extension-inject": "^1.3.5-0", + "@subwallet/extension-base": "^1.3.6-0", + "@subwallet/extension-chains": "^1.3.6-0", + "@subwallet/extension-dapp": "^1.3.6-0", + "@subwallet/extension-inject": "^1.3.6-0", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/ui-keyring": "^0.1.8-beta.0", "@ton/core": "^0.56.3", @@ -104,7 +104,7 @@ "web3-utils": "^1.10.0" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.3.5-0", + "@subwallet/extension-mocks": "^1.3.6-0", "@types/uuid": "^9.0.1" } } diff --git a/packages/extension-base/src/packageInfo.ts b/packages/extension-base/src/packageInfo.ts index 53304cea958..6fe59c560ae 100644 --- a/packages/extension-base/src/packageInfo.ts +++ b/packages/extension-base/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-base', path: 'auto', type: 'auto', version: '1.3.5-0' }; +export const packageInfo = { name: '@subwallet/extension-base', path: 'auto', type: 'auto', version: '1.3.6-0' }; diff --git a/packages/extension-chains/package.json b/packages/extension-chains/package.json index 06af994035e..5dbad6378cd 100644 --- a/packages/extension-chains/package.json +++ b/packages/extension-chains/package.json @@ -17,14 +17,14 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.5-0", + "version": "1.3.6-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@polkadot/networks": "^12.6.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/extension-inject": "^1.3.5-0" + "@subwallet/extension-inject": "^1.3.6-0" }, "peerDependencies": { "@polkadot/api": "*", diff --git a/packages/extension-chains/src/packageInfo.ts b/packages/extension-chains/src/packageInfo.ts index a30e1bd957c..b6087ed11af 100644 --- a/packages/extension-chains/src/packageInfo.ts +++ b/packages/extension-chains/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-chains', path: 'auto', type: 'auto', version: '1.3.5-0' }; +export const packageInfo = { name: '@subwallet/extension-chains', path: 'auto', type: 'auto', version: '1.3.6-0' }; diff --git a/packages/extension-compat-metamask/package.json b/packages/extension-compat-metamask/package.json index efdad89953a..abb3d56a311 100644 --- a/packages/extension-compat-metamask/package.json +++ b/packages/extension-compat-metamask/package.json @@ -17,14 +17,14 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.5-0", + "version": "1.3.6-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@metamask/detect-provider": "^1.2.0", "@polkadot/types": "^11.0.3", "@polkadot/util": "^12.6.2", - "@subwallet/extension-inject": "^1.3.5-0", + "@subwallet/extension-inject": "^1.3.6-0", "web3": "^1.10.0" }, "peerDependencies": { diff --git a/packages/extension-compat-metamask/src/packageInfo.ts b/packages/extension-compat-metamask/src/packageInfo.ts index cbacec6c902..f49cc55e6fc 100644 --- a/packages/extension-compat-metamask/src/packageInfo.ts +++ b/packages/extension-compat-metamask/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-compat-metamask', path: 'auto', type: 'auto', version: '1.3.5-0' }; +export const packageInfo = { name: '@subwallet/extension-compat-metamask', path: 'auto', type: 'auto', version: '1.3.6-0' }; diff --git a/packages/extension-dapp/package.json b/packages/extension-dapp/package.json index 173ffb4e53c..00665e930e8 100644 --- a/packages/extension-dapp/package.json +++ b/packages/extension-dapp/package.json @@ -17,13 +17,13 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.5-0", + "version": "1.3.6-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/extension-inject": "^1.3.5-0" + "@subwallet/extension-inject": "^1.3.6-0" }, "peerDependencies": { "@polkadot/api": "*", diff --git a/packages/extension-dapp/src/packageInfo.ts b/packages/extension-dapp/src/packageInfo.ts index bc192a0fc1a..d0c176a8e05 100644 --- a/packages/extension-dapp/src/packageInfo.ts +++ b/packages/extension-dapp/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-dapp', path: 'auto', type: 'auto', version: '1.3.5-0' }; +export const packageInfo = { name: '@subwallet/extension-dapp', path: 'auto', type: 'auto', version: '1.3.6-0' }; diff --git a/packages/extension-inject/package.json b/packages/extension-inject/package.json index 82afc8ea149..838c2764f28 100644 --- a/packages/extension-inject/package.json +++ b/packages/extension-inject/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.3.5-0", + "version": "1.3.6-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", diff --git a/packages/extension-inject/src/packageInfo.ts b/packages/extension-inject/src/packageInfo.ts index b475621d052..99e0feffc60 100644 --- a/packages/extension-inject/src/packageInfo.ts +++ b/packages/extension-inject/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-inject', path: 'auto', type: 'auto', version: '1.3.5-0' }; +export const packageInfo = { name: '@subwallet/extension-inject', path: 'auto', type: 'auto', version: '1.3.6-0' }; diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index 957a686ad2c..39102215ee8 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.3.5-0", + "version": "1.3.6-0", "dependencies": { "@babel/runtime": "^7.20.6", "@coinbase/cbpay-js": "^1.7.0", @@ -35,10 +35,10 @@ "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", "@subwallet/chain-list": "0.2.93", - "@subwallet/extension-base": "^1.3.5-0", - "@subwallet/extension-chains": "^1.3.5-0", - "@subwallet/extension-dapp": "^1.3.5-0", - "@subwallet/extension-inject": "^1.3.5-0", + "@subwallet/extension-base": "^1.3.6-0", + "@subwallet/extension-chains": "^1.3.6-0", + "@subwallet/extension-dapp": "^1.3.6-0", + "@subwallet/extension-inject": "^1.3.6-0", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b77", "@subwallet/ui-keyring": "^0.1.8-beta.0", @@ -87,7 +87,7 @@ "usehooks-ts": "^2.9.1" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.3.5-0", + "@subwallet/extension-mocks": "^1.3.6-0", "@types/bn.js": "^5.1.1", "@types/enzyme": "^3.10.12", "@types/enzyme-adapter-react-16": "^1.0.6", diff --git a/packages/extension-koni/package.json b/packages/extension-koni/package.json index 9ef33d0e6a5..0c2d54fb4a5 100644 --- a/packages/extension-koni/package.json +++ b/packages/extension-koni/package.json @@ -14,12 +14,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.5-0", + "version": "1.3.6-0", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.3.5-0", - "@subwallet/extension-inject": "^1.3.5-0", - "@subwallet/extension-koni-ui": "^1.3.5-0" + "@subwallet/extension-base": "^1.3.6-0", + "@subwallet/extension-inject": "^1.3.6-0", + "@subwallet/extension-koni-ui": "^1.3.6-0" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/packages/extension-koni/src/packageInfo.ts b/packages/extension-koni/src/packageInfo.ts index c05e9be9814..66cd4db0043 100644 --- a/packages/extension-koni/src/packageInfo.ts +++ b/packages/extension-koni/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-koni', path: 'auto', type: 'auto', version: '1.3.5-0' }; +export const packageInfo = { name: '@subwallet/extension-koni', path: 'auto', type: 'auto', version: '1.3.6-0' }; diff --git a/packages/extension-mocks/package.json b/packages/extension-mocks/package.json index 553a7378c1f..b8c1a6d8dea 100644 --- a/packages/extension-mocks/package.json +++ b/packages/extension-mocks/package.json @@ -14,7 +14,7 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.5-0", + "version": "1.3.6-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index cc39beecd90..c179209e105 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.3.5-0", + "version": "1.3.6-0", "dependencies": { "@babel/runtime": "^7.20.6", "@coinbase/cbpay-js": "^1.7.0", @@ -36,10 +36,10 @@ "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", "@subwallet/chain-list": "0.2.93", - "@subwallet/extension-base": "^1.3.5-0", - "@subwallet/extension-chains": "^1.3.5-0", - "@subwallet/extension-dapp": "^1.3.5-0", - "@subwallet/extension-inject": "^1.3.5-0", + "@subwallet/extension-base": "^1.3.6-0", + "@subwallet/extension-chains": "^1.3.6-0", + "@subwallet/extension-dapp": "^1.3.6-0", + "@subwallet/extension-inject": "^1.3.6-0", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "^5.1.2-b77", "@subwallet/ui-keyring": "^0.1.8-beta.0", @@ -88,7 +88,7 @@ "usehooks-ts": "^2.9.1" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.3.5-0", + "@subwallet/extension-mocks": "^1.3.6-0", "@types/bn.js": "^5.1.1", "@types/enzyme": "^3.10.12", "@types/enzyme-adapter-react-16": "^1.0.6", diff --git a/packages/web-runner/package.json b/packages/web-runner/package.json index ce3ee15182c..8eaa2a5d2ba 100644 --- a/packages/web-runner/package.json +++ b/packages/web-runner/package.json @@ -14,12 +14,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.5-0", + "version": "1.3.6-0", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.3.5-0", - "@subwallet/extension-inject": "^1.3.5-0", - "@subwallet/extension-koni-ui": "^1.3.5-0" + "@subwallet/extension-base": "^1.3.6-0", + "@subwallet/extension-inject": "^1.3.6-0", + "@subwallet/extension-koni-ui": "^1.3.6-0" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/packages/webapp/package.json b/packages/webapp/package.json index ab6c6a0bacb..003c4f719eb 100644 --- a/packages/webapp/package.json +++ b/packages/webapp/package.json @@ -15,12 +15,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.5-0", + "version": "1.3.6-0", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.3.5-0", - "@subwallet/extension-inject": "^1.3.5-0", - "@subwallet/extension-web-ui": "^1.3.5-0" + "@subwallet/extension-base": "^1.3.6-0", + "@subwallet/extension-inject": "^1.3.6-0", + "@subwallet/extension-web-ui": "^1.3.6-0" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/yarn.lock b/yarn.lock index 3d4d5fe935b..79d5319ecd6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6276,7 +6276,7 @@ __metadata: languageName: node linkType: hard -"@subwallet/extension-base@^1.3.5-0, @subwallet/extension-base@workspace:packages/extension-base": +"@subwallet/extension-base@^1.3.6-0, @subwallet/extension-base@workspace:packages/extension-base": version: 0.0.0-use.local resolution: "@subwallet/extension-base@workspace:packages/extension-base" dependencies: @@ -6316,11 +6316,11 @@ __metadata: "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 "@subwallet/chain-list": 0.2.93 - "@subwallet/extension-base": ^1.3.5-0 - "@subwallet/extension-chains": ^1.3.5-0 - "@subwallet/extension-dapp": ^1.3.5-0 - "@subwallet/extension-inject": ^1.3.5-0 - "@subwallet/extension-mocks": ^1.3.5-0 + "@subwallet/extension-base": ^1.3.6-0 + "@subwallet/extension-chains": ^1.3.6-0 + "@subwallet/extension-dapp": ^1.3.6-0 + "@subwallet/extension-inject": ^1.3.6-0 + "@subwallet/extension-mocks": ^1.3.6-0 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/ui-keyring": ^0.1.8-beta.0 "@ton/core": ^0.56.3 @@ -6367,7 +6367,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-chains@^1.3.5-0, @subwallet/extension-chains@workspace:packages/extension-chains": +"@subwallet/extension-chains@^1.3.6-0, @subwallet/extension-chains@workspace:packages/extension-chains": version: 0.0.0-use.local resolution: "@subwallet/extension-chains@workspace:packages/extension-chains" dependencies: @@ -6375,7 +6375,7 @@ __metadata: "@polkadot/networks": ^12.6.2 "@polkadot/util": ^12.6.2 "@polkadot/util-crypto": ^12.6.2 - "@subwallet/extension-inject": ^1.3.5-0 + "@subwallet/extension-inject": ^1.3.6-0 peerDependencies: "@polkadot/api": "*" "@polkadot/types": "*" @@ -6390,21 +6390,21 @@ __metadata: "@metamask/detect-provider": ^1.2.0 "@polkadot/types": ^11.0.3 "@polkadot/util": ^12.6.2 - "@subwallet/extension-inject": ^1.3.5-0 + "@subwallet/extension-inject": ^1.3.6-0 web3: ^1.10.0 peerDependencies: "@polkadot/util": "*" languageName: unknown linkType: soft -"@subwallet/extension-dapp@^1.3.5-0, @subwallet/extension-dapp@workspace:packages/extension-dapp": +"@subwallet/extension-dapp@^1.3.6-0, @subwallet/extension-dapp@workspace:packages/extension-dapp": version: 0.0.0-use.local resolution: "@subwallet/extension-dapp@workspace:packages/extension-dapp" dependencies: "@babel/runtime": ^7.20.6 "@polkadot/util": ^12.6.2 "@polkadot/util-crypto": ^12.6.2 - "@subwallet/extension-inject": ^1.3.5-0 + "@subwallet/extension-inject": ^1.3.6-0 peerDependencies: "@polkadot/api": "*" "@polkadot/util": "*" @@ -6412,7 +6412,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-inject@^1.3.5-0, @subwallet/extension-inject@workspace:packages/extension-inject": +"@subwallet/extension-inject@^1.3.6-0, @subwallet/extension-inject@workspace:packages/extension-inject": version: 0.0.0-use.local resolution: "@subwallet/extension-inject@workspace:packages/extension-inject" dependencies: @@ -6431,7 +6431,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-koni-ui@^1.3.5-0, @subwallet/extension-koni-ui@workspace:packages/extension-koni-ui": +"@subwallet/extension-koni-ui@^1.3.6-0, @subwallet/extension-koni-ui@workspace:packages/extension-koni-ui": version: 0.0.0-use.local resolution: "@subwallet/extension-koni-ui@workspace:packages/extension-koni-ui" dependencies: @@ -6454,11 +6454,11 @@ __metadata: "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 "@subwallet/chain-list": 0.2.93 - "@subwallet/extension-base": ^1.3.5-0 - "@subwallet/extension-chains": ^1.3.5-0 - "@subwallet/extension-dapp": ^1.3.5-0 - "@subwallet/extension-inject": ^1.3.5-0 - "@subwallet/extension-mocks": ^1.3.5-0 + "@subwallet/extension-base": ^1.3.6-0 + "@subwallet/extension-chains": ^1.3.6-0 + "@subwallet/extension-dapp": ^1.3.6-0 + "@subwallet/extension-inject": ^1.3.6-0 + "@subwallet/extension-mocks": ^1.3.6-0 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/react-ui": 5.1.2-b77 "@subwallet/ui-keyring": ^0.1.8-beta.0 @@ -6531,9 +6531,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.5-0 - "@subwallet/extension-inject": ^1.3.5-0 - "@subwallet/extension-koni-ui": ^1.3.5-0 + "@subwallet/extension-base": ^1.3.6-0 + "@subwallet/extension-inject": ^1.3.6-0 + "@subwallet/extension-koni-ui": ^1.3.6-0 "@types/chrome": ^0.0.254 "@types/serviceworker": ^0.0.80 assert: ^2.0.0 @@ -6561,7 +6561,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-mocks@^1.3.5-0, @subwallet/extension-mocks@workspace:packages/extension-mocks": +"@subwallet/extension-mocks@^1.3.6-0, @subwallet/extension-mocks@workspace:packages/extension-mocks": version: 0.0.0-use.local resolution: "@subwallet/extension-mocks@workspace:packages/extension-mocks" dependencies: @@ -6570,7 +6570,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-web-ui@^1.3.5-0, @subwallet/extension-web-ui@workspace:packages/extension-web-ui": +"@subwallet/extension-web-ui@^1.3.6-0, @subwallet/extension-web-ui@workspace:packages/extension-web-ui": version: 0.0.0-use.local resolution: "@subwallet/extension-web-ui@workspace:packages/extension-web-ui" dependencies: @@ -6594,11 +6594,11 @@ __metadata: "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 "@subwallet/chain-list": 0.2.93 - "@subwallet/extension-base": ^1.3.5-0 - "@subwallet/extension-chains": ^1.3.5-0 - "@subwallet/extension-dapp": ^1.3.5-0 - "@subwallet/extension-inject": ^1.3.5-0 - "@subwallet/extension-mocks": ^1.3.5-0 + "@subwallet/extension-base": ^1.3.6-0 + "@subwallet/extension-chains": ^1.3.6-0 + "@subwallet/extension-dapp": ^1.3.6-0 + "@subwallet/extension-inject": ^1.3.6-0 + "@subwallet/extension-mocks": ^1.3.6-0 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/react-ui": ^5.1.2-b77 "@subwallet/ui-keyring": ^0.1.8-beta.0 @@ -6790,9 +6790,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.5-0 - "@subwallet/extension-inject": ^1.3.5-0 - "@subwallet/extension-koni-ui": ^1.3.5-0 + "@subwallet/extension-base": ^1.3.6-0 + "@subwallet/extension-inject": ^1.3.6-0 + "@subwallet/extension-koni-ui": ^1.3.6-0 assert: ^2.0.0 babel-loader: ^9.1.3 browser-resolve: ^2.0.0 @@ -6823,9 +6823,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.5-0 - "@subwallet/extension-inject": ^1.3.5-0 - "@subwallet/extension-web-ui": ^1.3.5-0 + "@subwallet/extension-base": ^1.3.6-0 + "@subwallet/extension-inject": ^1.3.6-0 + "@subwallet/extension-web-ui": ^1.3.6-0 assert: ^2.0.0 babel-loader: ^9.1.3 browser-resolve: ^2.0.0 From 16f8185d70b38819d43f70fb7c88c4d4ea1ad484 Mon Sep 17 00:00:00 2001 From: S2kael Date: Wed, 6 Nov 2024 18:40:02 +0700 Subject: [PATCH 052/204] [Issue-3826] Update chain-list --- package.json | 2 +- packages/extension-base/package.json | 2 +- packages/extension-koni-ui/package.json | 2 +- packages/extension-web-ui/package.json | 2 +- yarn.lock | 14 +++++++------- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 5c9845fb374..89d99423333 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@polkadot/types-support": "^12.0.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/chain-list": "0.2.93-beta.3", + "@subwallet/chain-list": "0.2.94-beta.0", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b79", "@subwallet/ui-keyring": "0.1.8-beta.0", diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index 7cc4208fc0a..e2d6433179b 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -55,7 +55,7 @@ "@reduxjs/toolkit": "^1.9.1", "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", - "@subwallet/chain-list": "0.2.93-beta.3", + "@subwallet/chain-list": "0.2.94-beta.0", "@subwallet/extension-base": "^1.3.5-0", "@subwallet/extension-chains": "^1.3.5-0", "@subwallet/extension-dapp": "^1.3.5-0", diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index bad6f943082..a4b9e175ca6 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -34,7 +34,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.93-beta.3", + "@subwallet/chain-list": "0.2.94-beta.0", "@subwallet/extension-base": "^1.3.5-0", "@subwallet/extension-chains": "^1.3.5-0", "@subwallet/extension-dapp": "^1.3.5-0", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index c6c9dde17b6..946b999fee4 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -35,7 +35,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.93-beta.3", + "@subwallet/chain-list": "0.2.94-beta.0", "@subwallet/extension-base": "^1.3.5-0", "@subwallet/extension-chains": "^1.3.5-0", "@subwallet/extension-dapp": "^1.3.5-0", diff --git a/yarn.lock b/yarn.lock index b43a0e10a08..8f8e881c6dc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6265,14 +6265,14 @@ __metadata: languageName: node linkType: hard -"@subwallet/chain-list@npm:0.2.93-beta.3": - version: 0.2.93-beta.3 - resolution: "@subwallet/chain-list@npm:0.2.93-beta.3" +"@subwallet/chain-list@npm:0.2.94-beta.0": + version: 0.2.94-beta.0 + resolution: "@subwallet/chain-list@npm:0.2.94-beta.0" dependencies: "@polkadot/dev": 0.67.167 "@polkadot/util": ^12.5.1 eventemitter3: ^5.0.1 - checksum: 3fc0f61424a967691ec737273823b0d7622d17a5ddfc5eabe38f99a8cb7696c5e1fb4721e985486d9a1db0b231475b96db8f37a0a84caa6de7c8f15ada7964d5 + checksum: d8cc4bcca4f3140d73ad189380ad0fc1df334be25ed58f0aef4f31d100059cbddaa5201d20f27a2be99500d3def7f669619c304558647f019053e60f8516553e languageName: node linkType: hard @@ -6315,7 +6315,7 @@ __metadata: "@reduxjs/toolkit": ^1.9.1 "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 - "@subwallet/chain-list": 0.2.93-beta.3 + "@subwallet/chain-list": 0.2.94-beta.0 "@subwallet/extension-base": ^1.3.5-0 "@subwallet/extension-chains": ^1.3.5-0 "@subwallet/extension-dapp": ^1.3.5-0 @@ -6453,7 +6453,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.93-beta.3 + "@subwallet/chain-list": 0.2.94-beta.0 "@subwallet/extension-base": ^1.3.5-0 "@subwallet/extension-chains": ^1.3.5-0 "@subwallet/extension-dapp": ^1.3.5-0 @@ -6593,7 +6593,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.93-beta.3 + "@subwallet/chain-list": 0.2.94-beta.0 "@subwallet/extension-base": ^1.3.5-0 "@subwallet/extension-chains": ^1.3.5-0 "@subwallet/extension-dapp": ^1.3.5-0 From 13c4dfd2c630a2dbf0b77a1d85167debf1374cd9 Mon Sep 17 00:00:00 2001 From: AnhMTV Date: Thu, 7 Nov 2024 09:41:24 +0700 Subject: [PATCH 053/204] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d6081c4d630..b1dfc44fd03 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ All data requests must be called and processed in the background. Extension Page ## Add an API - API is define in folder `packages/extension-koni-base/src/api` - - Add new file depend on types of API + - Add new file depend on types of API. - Simple API can be defined in function, more complicated API should define in Object. ## Add a store From 13bfd056ee66c7ce0bb54df7b8752a91c1ebf16d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 7 Nov 2024 02:52:36 +0000 Subject: [PATCH 054/204] [CI Skip] release/beta 1.3.6-1 skip-checks: true --- CONTRIBUTORS | 2 +- package.json | 2 +- packages/extension-base/package.json | 12 ++-- packages/extension-base/src/packageInfo.ts | 2 +- packages/extension-chains/package.json | 4 +- packages/extension-chains/src/packageInfo.ts | 2 +- .../extension-compat-metamask/package.json | 4 +- .../src/packageInfo.ts | 2 +- packages/extension-dapp/package.json | 4 +- packages/extension-dapp/src/packageInfo.ts | 2 +- packages/extension-inject/package.json | 2 +- packages/extension-inject/src/packageInfo.ts | 2 +- packages/extension-koni-ui/package.json | 12 ++-- packages/extension-koni/package.json | 8 +-- packages/extension-koni/src/packageInfo.ts | 2 +- packages/extension-mocks/package.json | 2 +- packages/extension-web-ui/package.json | 12 ++-- packages/web-runner/package.json | 8 +-- packages/webapp/package.json | 8 +-- yarn.lock | 68 +++++++++---------- 20 files changed, 80 insertions(+), 80 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 0fa17b18946..f8d155bce04 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,4 +1,4 @@ - 2883 AnhMTV + 2884 AnhMTV Update README.md 2546 Nam Phạm [Issue 3747] chore: fix eslint 2366 S2kael [Issue-3828] Update stable version for chain-list 869 lw-cdm [MasterAccount] Update logic to reorder account on select account modal diff --git a/package.json b/package.json index ca7ff0dd08a..22da960c2a3 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "url": "https://github.com/Koniverse/Subwallet-V2.git" }, "sideEffects": false, - "version": "1.3.6-0", + "version": "1.3.6-1", "workspaces": [ "packages/*" ], diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index de450a1c590..b51f360daec 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -17,7 +17,7 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.6-0", + "version": "1.3.6-1", "main": "index.js", "dependencies": { "@acala-network/api": "^5.0.2", @@ -56,10 +56,10 @@ "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", "@subwallet/chain-list": "0.2.93", - "@subwallet/extension-base": "^1.3.6-0", - "@subwallet/extension-chains": "^1.3.6-0", - "@subwallet/extension-dapp": "^1.3.6-0", - "@subwallet/extension-inject": "^1.3.6-0", + "@subwallet/extension-base": "^1.3.6-1", + "@subwallet/extension-chains": "^1.3.6-1", + "@subwallet/extension-dapp": "^1.3.6-1", + "@subwallet/extension-inject": "^1.3.6-1", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/ui-keyring": "^0.1.8-beta.0", "@ton/core": "^0.56.3", @@ -104,7 +104,7 @@ "web3-utils": "^1.10.0" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.3.6-0", + "@subwallet/extension-mocks": "^1.3.6-1", "@types/uuid": "^9.0.1" } } diff --git a/packages/extension-base/src/packageInfo.ts b/packages/extension-base/src/packageInfo.ts index 6fe59c560ae..b8e75b8316c 100644 --- a/packages/extension-base/src/packageInfo.ts +++ b/packages/extension-base/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-base', path: 'auto', type: 'auto', version: '1.3.6-0' }; +export const packageInfo = { name: '@subwallet/extension-base', path: 'auto', type: 'auto', version: '1.3.6-1' }; diff --git a/packages/extension-chains/package.json b/packages/extension-chains/package.json index 5dbad6378cd..2dfbef667bd 100644 --- a/packages/extension-chains/package.json +++ b/packages/extension-chains/package.json @@ -17,14 +17,14 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.6-0", + "version": "1.3.6-1", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@polkadot/networks": "^12.6.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/extension-inject": "^1.3.6-0" + "@subwallet/extension-inject": "^1.3.6-1" }, "peerDependencies": { "@polkadot/api": "*", diff --git a/packages/extension-chains/src/packageInfo.ts b/packages/extension-chains/src/packageInfo.ts index b6087ed11af..25dbd7f4729 100644 --- a/packages/extension-chains/src/packageInfo.ts +++ b/packages/extension-chains/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-chains', path: 'auto', type: 'auto', version: '1.3.6-0' }; +export const packageInfo = { name: '@subwallet/extension-chains', path: 'auto', type: 'auto', version: '1.3.6-1' }; diff --git a/packages/extension-compat-metamask/package.json b/packages/extension-compat-metamask/package.json index abb3d56a311..bffb9362b84 100644 --- a/packages/extension-compat-metamask/package.json +++ b/packages/extension-compat-metamask/package.json @@ -17,14 +17,14 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.6-0", + "version": "1.3.6-1", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@metamask/detect-provider": "^1.2.0", "@polkadot/types": "^11.0.3", "@polkadot/util": "^12.6.2", - "@subwallet/extension-inject": "^1.3.6-0", + "@subwallet/extension-inject": "^1.3.6-1", "web3": "^1.10.0" }, "peerDependencies": { diff --git a/packages/extension-compat-metamask/src/packageInfo.ts b/packages/extension-compat-metamask/src/packageInfo.ts index f49cc55e6fc..cc09eca6762 100644 --- a/packages/extension-compat-metamask/src/packageInfo.ts +++ b/packages/extension-compat-metamask/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-compat-metamask', path: 'auto', type: 'auto', version: '1.3.6-0' }; +export const packageInfo = { name: '@subwallet/extension-compat-metamask', path: 'auto', type: 'auto', version: '1.3.6-1' }; diff --git a/packages/extension-dapp/package.json b/packages/extension-dapp/package.json index 00665e930e8..0c700b446cd 100644 --- a/packages/extension-dapp/package.json +++ b/packages/extension-dapp/package.json @@ -17,13 +17,13 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.6-0", + "version": "1.3.6-1", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/extension-inject": "^1.3.6-0" + "@subwallet/extension-inject": "^1.3.6-1" }, "peerDependencies": { "@polkadot/api": "*", diff --git a/packages/extension-dapp/src/packageInfo.ts b/packages/extension-dapp/src/packageInfo.ts index d0c176a8e05..68cf40bf36f 100644 --- a/packages/extension-dapp/src/packageInfo.ts +++ b/packages/extension-dapp/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-dapp', path: 'auto', type: 'auto', version: '1.3.6-0' }; +export const packageInfo = { name: '@subwallet/extension-dapp', path: 'auto', type: 'auto', version: '1.3.6-1' }; diff --git a/packages/extension-inject/package.json b/packages/extension-inject/package.json index 838c2764f28..17ed342fe17 100644 --- a/packages/extension-inject/package.json +++ b/packages/extension-inject/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.3.6-0", + "version": "1.3.6-1", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", diff --git a/packages/extension-inject/src/packageInfo.ts b/packages/extension-inject/src/packageInfo.ts index 99e0feffc60..bb96cf18aa2 100644 --- a/packages/extension-inject/src/packageInfo.ts +++ b/packages/extension-inject/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-inject', path: 'auto', type: 'auto', version: '1.3.6-0' }; +export const packageInfo = { name: '@subwallet/extension-inject', path: 'auto', type: 'auto', version: '1.3.6-1' }; diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index 39102215ee8..d43470fe387 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.3.6-0", + "version": "1.3.6-1", "dependencies": { "@babel/runtime": "^7.20.6", "@coinbase/cbpay-js": "^1.7.0", @@ -35,10 +35,10 @@ "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", "@subwallet/chain-list": "0.2.93", - "@subwallet/extension-base": "^1.3.6-0", - "@subwallet/extension-chains": "^1.3.6-0", - "@subwallet/extension-dapp": "^1.3.6-0", - "@subwallet/extension-inject": "^1.3.6-0", + "@subwallet/extension-base": "^1.3.6-1", + "@subwallet/extension-chains": "^1.3.6-1", + "@subwallet/extension-dapp": "^1.3.6-1", + "@subwallet/extension-inject": "^1.3.6-1", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b77", "@subwallet/ui-keyring": "^0.1.8-beta.0", @@ -87,7 +87,7 @@ "usehooks-ts": "^2.9.1" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.3.6-0", + "@subwallet/extension-mocks": "^1.3.6-1", "@types/bn.js": "^5.1.1", "@types/enzyme": "^3.10.12", "@types/enzyme-adapter-react-16": "^1.0.6", diff --git a/packages/extension-koni/package.json b/packages/extension-koni/package.json index 0c2d54fb4a5..91dd6274c4c 100644 --- a/packages/extension-koni/package.json +++ b/packages/extension-koni/package.json @@ -14,12 +14,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.6-0", + "version": "1.3.6-1", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.3.6-0", - "@subwallet/extension-inject": "^1.3.6-0", - "@subwallet/extension-koni-ui": "^1.3.6-0" + "@subwallet/extension-base": "^1.3.6-1", + "@subwallet/extension-inject": "^1.3.6-1", + "@subwallet/extension-koni-ui": "^1.3.6-1" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/packages/extension-koni/src/packageInfo.ts b/packages/extension-koni/src/packageInfo.ts index 66cd4db0043..a5dc2675307 100644 --- a/packages/extension-koni/src/packageInfo.ts +++ b/packages/extension-koni/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-koni', path: 'auto', type: 'auto', version: '1.3.6-0' }; +export const packageInfo = { name: '@subwallet/extension-koni', path: 'auto', type: 'auto', version: '1.3.6-1' }; diff --git a/packages/extension-mocks/package.json b/packages/extension-mocks/package.json index b8c1a6d8dea..3ead41b403d 100644 --- a/packages/extension-mocks/package.json +++ b/packages/extension-mocks/package.json @@ -14,7 +14,7 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.6-0", + "version": "1.3.6-1", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index c179209e105..eac8ce0aaca 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.3.6-0", + "version": "1.3.6-1", "dependencies": { "@babel/runtime": "^7.20.6", "@coinbase/cbpay-js": "^1.7.0", @@ -36,10 +36,10 @@ "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", "@subwallet/chain-list": "0.2.93", - "@subwallet/extension-base": "^1.3.6-0", - "@subwallet/extension-chains": "^1.3.6-0", - "@subwallet/extension-dapp": "^1.3.6-0", - "@subwallet/extension-inject": "^1.3.6-0", + "@subwallet/extension-base": "^1.3.6-1", + "@subwallet/extension-chains": "^1.3.6-1", + "@subwallet/extension-dapp": "^1.3.6-1", + "@subwallet/extension-inject": "^1.3.6-1", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "^5.1.2-b77", "@subwallet/ui-keyring": "^0.1.8-beta.0", @@ -88,7 +88,7 @@ "usehooks-ts": "^2.9.1" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.3.6-0", + "@subwallet/extension-mocks": "^1.3.6-1", "@types/bn.js": "^5.1.1", "@types/enzyme": "^3.10.12", "@types/enzyme-adapter-react-16": "^1.0.6", diff --git a/packages/web-runner/package.json b/packages/web-runner/package.json index 8eaa2a5d2ba..c153842d26f 100644 --- a/packages/web-runner/package.json +++ b/packages/web-runner/package.json @@ -14,12 +14,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.6-0", + "version": "1.3.6-1", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.3.6-0", - "@subwallet/extension-inject": "^1.3.6-0", - "@subwallet/extension-koni-ui": "^1.3.6-0" + "@subwallet/extension-base": "^1.3.6-1", + "@subwallet/extension-inject": "^1.3.6-1", + "@subwallet/extension-koni-ui": "^1.3.6-1" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/packages/webapp/package.json b/packages/webapp/package.json index 003c4f719eb..85b1ee0bc5a 100644 --- a/packages/webapp/package.json +++ b/packages/webapp/package.json @@ -15,12 +15,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.6-0", + "version": "1.3.6-1", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.3.6-0", - "@subwallet/extension-inject": "^1.3.6-0", - "@subwallet/extension-web-ui": "^1.3.6-0" + "@subwallet/extension-base": "^1.3.6-1", + "@subwallet/extension-inject": "^1.3.6-1", + "@subwallet/extension-web-ui": "^1.3.6-1" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/yarn.lock b/yarn.lock index 79d5319ecd6..18143d0414e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6276,7 +6276,7 @@ __metadata: languageName: node linkType: hard -"@subwallet/extension-base@^1.3.6-0, @subwallet/extension-base@workspace:packages/extension-base": +"@subwallet/extension-base@^1.3.6-1, @subwallet/extension-base@workspace:packages/extension-base": version: 0.0.0-use.local resolution: "@subwallet/extension-base@workspace:packages/extension-base" dependencies: @@ -6316,11 +6316,11 @@ __metadata: "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 "@subwallet/chain-list": 0.2.93 - "@subwallet/extension-base": ^1.3.6-0 - "@subwallet/extension-chains": ^1.3.6-0 - "@subwallet/extension-dapp": ^1.3.6-0 - "@subwallet/extension-inject": ^1.3.6-0 - "@subwallet/extension-mocks": ^1.3.6-0 + "@subwallet/extension-base": ^1.3.6-1 + "@subwallet/extension-chains": ^1.3.6-1 + "@subwallet/extension-dapp": ^1.3.6-1 + "@subwallet/extension-inject": ^1.3.6-1 + "@subwallet/extension-mocks": ^1.3.6-1 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/ui-keyring": ^0.1.8-beta.0 "@ton/core": ^0.56.3 @@ -6367,7 +6367,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-chains@^1.3.6-0, @subwallet/extension-chains@workspace:packages/extension-chains": +"@subwallet/extension-chains@^1.3.6-1, @subwallet/extension-chains@workspace:packages/extension-chains": version: 0.0.0-use.local resolution: "@subwallet/extension-chains@workspace:packages/extension-chains" dependencies: @@ -6375,7 +6375,7 @@ __metadata: "@polkadot/networks": ^12.6.2 "@polkadot/util": ^12.6.2 "@polkadot/util-crypto": ^12.6.2 - "@subwallet/extension-inject": ^1.3.6-0 + "@subwallet/extension-inject": ^1.3.6-1 peerDependencies: "@polkadot/api": "*" "@polkadot/types": "*" @@ -6390,21 +6390,21 @@ __metadata: "@metamask/detect-provider": ^1.2.0 "@polkadot/types": ^11.0.3 "@polkadot/util": ^12.6.2 - "@subwallet/extension-inject": ^1.3.6-0 + "@subwallet/extension-inject": ^1.3.6-1 web3: ^1.10.0 peerDependencies: "@polkadot/util": "*" languageName: unknown linkType: soft -"@subwallet/extension-dapp@^1.3.6-0, @subwallet/extension-dapp@workspace:packages/extension-dapp": +"@subwallet/extension-dapp@^1.3.6-1, @subwallet/extension-dapp@workspace:packages/extension-dapp": version: 0.0.0-use.local resolution: "@subwallet/extension-dapp@workspace:packages/extension-dapp" dependencies: "@babel/runtime": ^7.20.6 "@polkadot/util": ^12.6.2 "@polkadot/util-crypto": ^12.6.2 - "@subwallet/extension-inject": ^1.3.6-0 + "@subwallet/extension-inject": ^1.3.6-1 peerDependencies: "@polkadot/api": "*" "@polkadot/util": "*" @@ -6412,7 +6412,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-inject@^1.3.6-0, @subwallet/extension-inject@workspace:packages/extension-inject": +"@subwallet/extension-inject@^1.3.6-1, @subwallet/extension-inject@workspace:packages/extension-inject": version: 0.0.0-use.local resolution: "@subwallet/extension-inject@workspace:packages/extension-inject" dependencies: @@ -6431,7 +6431,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-koni-ui@^1.3.6-0, @subwallet/extension-koni-ui@workspace:packages/extension-koni-ui": +"@subwallet/extension-koni-ui@^1.3.6-1, @subwallet/extension-koni-ui@workspace:packages/extension-koni-ui": version: 0.0.0-use.local resolution: "@subwallet/extension-koni-ui@workspace:packages/extension-koni-ui" dependencies: @@ -6454,11 +6454,11 @@ __metadata: "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 "@subwallet/chain-list": 0.2.93 - "@subwallet/extension-base": ^1.3.6-0 - "@subwallet/extension-chains": ^1.3.6-0 - "@subwallet/extension-dapp": ^1.3.6-0 - "@subwallet/extension-inject": ^1.3.6-0 - "@subwallet/extension-mocks": ^1.3.6-0 + "@subwallet/extension-base": ^1.3.6-1 + "@subwallet/extension-chains": ^1.3.6-1 + "@subwallet/extension-dapp": ^1.3.6-1 + "@subwallet/extension-inject": ^1.3.6-1 + "@subwallet/extension-mocks": ^1.3.6-1 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/react-ui": 5.1.2-b77 "@subwallet/ui-keyring": ^0.1.8-beta.0 @@ -6531,9 +6531,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.6-0 - "@subwallet/extension-inject": ^1.3.6-0 - "@subwallet/extension-koni-ui": ^1.3.6-0 + "@subwallet/extension-base": ^1.3.6-1 + "@subwallet/extension-inject": ^1.3.6-1 + "@subwallet/extension-koni-ui": ^1.3.6-1 "@types/chrome": ^0.0.254 "@types/serviceworker": ^0.0.80 assert: ^2.0.0 @@ -6561,7 +6561,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-mocks@^1.3.6-0, @subwallet/extension-mocks@workspace:packages/extension-mocks": +"@subwallet/extension-mocks@^1.3.6-1, @subwallet/extension-mocks@workspace:packages/extension-mocks": version: 0.0.0-use.local resolution: "@subwallet/extension-mocks@workspace:packages/extension-mocks" dependencies: @@ -6570,7 +6570,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-web-ui@^1.3.6-0, @subwallet/extension-web-ui@workspace:packages/extension-web-ui": +"@subwallet/extension-web-ui@^1.3.6-1, @subwallet/extension-web-ui@workspace:packages/extension-web-ui": version: 0.0.0-use.local resolution: "@subwallet/extension-web-ui@workspace:packages/extension-web-ui" dependencies: @@ -6594,11 +6594,11 @@ __metadata: "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 "@subwallet/chain-list": 0.2.93 - "@subwallet/extension-base": ^1.3.6-0 - "@subwallet/extension-chains": ^1.3.6-0 - "@subwallet/extension-dapp": ^1.3.6-0 - "@subwallet/extension-inject": ^1.3.6-0 - "@subwallet/extension-mocks": ^1.3.6-0 + "@subwallet/extension-base": ^1.3.6-1 + "@subwallet/extension-chains": ^1.3.6-1 + "@subwallet/extension-dapp": ^1.3.6-1 + "@subwallet/extension-inject": ^1.3.6-1 + "@subwallet/extension-mocks": ^1.3.6-1 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/react-ui": ^5.1.2-b77 "@subwallet/ui-keyring": ^0.1.8-beta.0 @@ -6790,9 +6790,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.6-0 - "@subwallet/extension-inject": ^1.3.6-0 - "@subwallet/extension-koni-ui": ^1.3.6-0 + "@subwallet/extension-base": ^1.3.6-1 + "@subwallet/extension-inject": ^1.3.6-1 + "@subwallet/extension-koni-ui": ^1.3.6-1 assert: ^2.0.0 babel-loader: ^9.1.3 browser-resolve: ^2.0.0 @@ -6823,9 +6823,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.6-0 - "@subwallet/extension-inject": ^1.3.6-0 - "@subwallet/extension-web-ui": ^1.3.6-0 + "@subwallet/extension-base": ^1.3.6-1 + "@subwallet/extension-inject": ^1.3.6-1 + "@subwallet/extension-web-ui": ^1.3.6-1 assert: ^2.0.0 babel-loader: ^9.1.3 browser-resolve: ^2.0.0 From db097c3a5aa1aa2aac589ff1103ec26605245e2e Mon Sep 17 00:00:00 2001 From: AnhMTV Date: Thu, 7 Nov 2024 15:14:22 +0700 Subject: [PATCH 055/204] Release version 1.3.6 --- CHANGELOG.md | 14 ++++++++++++++ package.json | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d908f5cdd60..f809e7fd6c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # CHANGELOG +## 1.3.6 +Build date: Nov 07, 2024. + +Features & Update: +- Update chain-list (#3828) + - Add Polygon Amoy testnet + - Add Polygon zkEVM Cardona testnet + - Add WETH, POL, USDC (Amoy) + - Add ETH, MATIC, POL (Cardona) + - Update explorer for Tangle network + +Bug fixed: +- Fixed error auto reset data on Pool field (#3001) + ## 1.3.5 Build date: Oct 31, 2024. diff --git a/package.json b/package.json index 22da960c2a3..280955a8a32 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "url": "https://github.com/Koniverse/Subwallet-V2.git" }, "sideEffects": false, - "version": "1.3.6-1", + "version": "1.3.6", "workspaces": [ "packages/*" ], From 4b5d2b28274076df1def6d996a4205af9159ca81 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 7 Nov 2024 08:25:42 +0000 Subject: [PATCH 056/204] [CI Skip] release/stable 1.3.6 skip-checks: true --- .123trigger | 3 ++- CONTRIBUTORS | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.123trigger b/.123trigger index d43310b28d6..5810dc0245f 100644 --- a/.123trigger +++ b/.123trigger @@ -170,4 +170,5 @@ 1.3.2 1.3.3 1.3.4 -1.3.5 \ No newline at end of file +1.3.5 +1.3.6 \ No newline at end of file diff --git a/CONTRIBUTORS b/CONTRIBUTORS index f8d155bce04..02ae7a29146 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,4 +1,4 @@ - 2884 AnhMTV Update README.md + 2885 AnhMTV Release version 1.3.6 2546 Nam Phạm [Issue 3747] chore: fix eslint 2366 S2kael [Issue-3828] Update stable version for chain-list 869 lw-cdm [MasterAccount] Update logic to reorder account on select account modal From 62ec5eb2d4e0d5412ffad1e994d797589279623f Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Wed, 6 Nov 2024 18:44:21 +0700 Subject: [PATCH 057/204] [Issue-3132] feat: restored patched assets --- .../src/services/chain-online-service/index.ts | 10 ++++++++++ .../extension-base/src/services/chain-service/index.ts | 2 ++ .../src/services/storage-service/DatabaseService.ts | 4 ++++ 3 files changed, 16 insertions(+) diff --git a/packages/extension-base/src/services/chain-online-service/index.ts b/packages/extension-base/src/services/chain-online-service/index.ts index bc02f3277cd..5c88a365561 100644 --- a/packages/extension-base/src/services/chain-online-service/index.ts +++ b/packages/extension-base/src/services/chain-online-service/index.ts @@ -179,6 +179,16 @@ export class ChainOnlineService { await this.dbService.bulkUpdateChainStore(storedChainInfoList); + const addedAssets: _ChainAsset[] = []; + + Object.entries(assetRegistry).forEach(([slug, asset]) => { + if (addedChain.includes(asset.originChain)) { + addedAssets.push(asset); + } + }); + + await this.dbService.bulkUpdateAssetsStore(addedAssets); + if (latestChainLogoMap) { const logoMap = Object.assign({}, ChainLogoMap, latestChainLogoMap); diff --git a/packages/extension-base/src/services/chain-service/index.ts b/packages/extension-base/src/services/chain-service/index.ts index 9f62f647302..c6ddabe9170 100644 --- a/packages/extension-base/src/services/chain-service/index.ts +++ b/packages/extension-base/src/services/chain-service/index.ts @@ -1268,6 +1268,8 @@ export class ChainService { icon: storedChainInfo.icon, extraInfo: storedChainInfo.extraInfo }; + + deprecatedChainMap[storedSlug] = storedSlug; // todo: set a better name } } diff --git a/packages/extension-base/src/services/storage-service/DatabaseService.ts b/packages/extension-base/src/services/storage-service/DatabaseService.ts index 16572b0aae0..b0db514b1f7 100644 --- a/packages/extension-base/src/services/storage-service/DatabaseService.ts +++ b/packages/extension-base/src/services/storage-service/DatabaseService.ts @@ -406,6 +406,10 @@ export default class DatabaseService { return this.stores.asset.upsert(item); } + async bulkUpdateAssetsStore (items: _ChainAsset[]) { + return this.stores.asset.bulkUpsert(items); + } + async getAllAssetStore () { return this.stores.asset.getAll(); } From 2aab0f3c04b2f7f5e90e697500fb92710749f8d7 Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Mon, 11 Nov 2024 15:46:49 +0700 Subject: [PATCH 058/204] [Issue-3132] fix: fix emit event after run handlelatestpatch --- .../src/services/chain-online-service/index.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/extension-base/src/services/chain-online-service/index.ts b/packages/extension-base/src/services/chain-online-service/index.ts index 5c88a365561..81fc83e8218 100644 --- a/packages/extension-base/src/services/chain-online-service/index.ts +++ b/packages/extension-base/src/services/chain-online-service/index.ts @@ -207,8 +207,6 @@ export class ChainOnlineService { } catch (e) { console.error('Error fetching latest patch data'); } - - this.eventService.emit('asset.online.ready', true); } private async fetchLatestPatchData () { @@ -228,9 +226,15 @@ export class ChainOnlineService { console.error('Error update latest patch', e); }); }) - .catch(console.error); + .catch((e) => { + console.error('Asset fail to ready', e); + }); } - }).catch(console.error); + }).catch((e) => { + console.error('Error get latest patch or data map is locking', e); + }); + + this.eventService.emit('asset.online.ready', true); } checkLatestData () { From 84e93f652d637b95596ceace4008c926829f91ce Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Wed, 13 Nov 2024 16:02:35 +0700 Subject: [PATCH 059/204] [Issue-3846] Update chainlist --- package.json | 2 +- packages/extension-base/package.json | 2 +- packages/extension-koni-ui/package.json | 2 +- packages/extension-web-ui/package.json | 2 +- yarn.lock | 14 +++++++------- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 280955a8a32..8c63efd47b6 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@polkadot/types-support": "^12.0.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/chain-list": "0.2.93", + "@subwallet/chain-list": "0.2.94-beta.5", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b79", "@subwallet/ui-keyring": "0.1.8-beta.0", diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index b51f360daec..6a3c33082fd 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -55,7 +55,7 @@ "@reduxjs/toolkit": "^1.9.1", "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", - "@subwallet/chain-list": "0.2.93", + "@subwallet/chain-list": "0.2.94-beta.5", "@subwallet/extension-base": "^1.3.6-1", "@subwallet/extension-chains": "^1.3.6-1", "@subwallet/extension-dapp": "^1.3.6-1", diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index d43470fe387..5d43de04b3c 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -34,7 +34,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.93", + "@subwallet/chain-list": "0.2.94-beta.5", "@subwallet/extension-base": "^1.3.6-1", "@subwallet/extension-chains": "^1.3.6-1", "@subwallet/extension-dapp": "^1.3.6-1", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index eac8ce0aaca..c0b15e5e440 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -35,7 +35,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.93", + "@subwallet/chain-list": "0.2.94-beta.5", "@subwallet/extension-base": "^1.3.6-1", "@subwallet/extension-chains": "^1.3.6-1", "@subwallet/extension-dapp": "^1.3.6-1", diff --git a/yarn.lock b/yarn.lock index 18143d0414e..db5e8ac20e0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6265,14 +6265,14 @@ __metadata: languageName: node linkType: hard -"@subwallet/chain-list@npm:0.2.93": - version: 0.2.93 - resolution: "@subwallet/chain-list@npm:0.2.93" +"@subwallet/chain-list@npm:0.2.94-beta.5": + version: 0.2.94-beta.5 + resolution: "@subwallet/chain-list@npm:0.2.94-beta.5" dependencies: "@polkadot/dev": 0.67.167 "@polkadot/util": ^12.5.1 eventemitter3: ^5.0.1 - checksum: e618b88b667858336291f487747a4cfd8c718af3b6dda369c316f511d18e2e64297441aed7a1f48b3eb2381685898471109519a7bc6916ef2179500805dfe588 + checksum: c7c334523dd8e7891bd9f17e084531a3510ef1660440cdd4a28b16836c060302f5abff0e9d85d9d6954193a22bcf9476f697caec387a2b504c0d5cc0f9c19f4d languageName: node linkType: hard @@ -6315,7 +6315,7 @@ __metadata: "@reduxjs/toolkit": ^1.9.1 "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 - "@subwallet/chain-list": 0.2.93 + "@subwallet/chain-list": 0.2.94-beta.5 "@subwallet/extension-base": ^1.3.6-1 "@subwallet/extension-chains": ^1.3.6-1 "@subwallet/extension-dapp": ^1.3.6-1 @@ -6453,7 +6453,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.93 + "@subwallet/chain-list": 0.2.94-beta.5 "@subwallet/extension-base": ^1.3.6-1 "@subwallet/extension-chains": ^1.3.6-1 "@subwallet/extension-dapp": ^1.3.6-1 @@ -6593,7 +6593,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.93 + "@subwallet/chain-list": 0.2.94-beta.5 "@subwallet/extension-base": ^1.3.6-1 "@subwallet/extension-chains": ^1.3.6-1 "@subwallet/extension-dapp": ^1.3.6-1 From 345f683deded42481c1b3b8d28c23151bc37dd17 Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Thu, 14 Nov 2024 15:16:27 +0700 Subject: [PATCH 060/204] [Issue-3846] Update explorer for Autonomys --- package.json | 2 +- packages/extension-base/package.json | 2 +- .../src/services/transaction-service/utils.ts | 4 ++++ packages/extension-koni-ui/package.json | 2 +- packages/extension-web-ui/package.json | 2 +- yarn.lock | 14 +++++++------- 6 files changed, 15 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 8c63efd47b6..898f20e1a18 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@polkadot/types-support": "^12.0.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/chain-list": "0.2.94-beta.5", + "@subwallet/chain-list": "0.2.94-beta.6", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b79", "@subwallet/ui-keyring": "0.1.8-beta.0", diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index 6a3c33082fd..042b1ef1052 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -55,7 +55,7 @@ "@reduxjs/toolkit": "^1.9.1", "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", - "@subwallet/chain-list": "0.2.94-beta.5", + "@subwallet/chain-list": "0.2.94-beta.6", "@subwallet/extension-base": "^1.3.6-1", "@subwallet/extension-chains": "^1.3.6-1", "@subwallet/extension-dapp": "^1.3.6-1", diff --git a/packages/extension-base/src/services/transaction-service/utils.ts b/packages/extension-base/src/services/transaction-service/utils.ts index c46a52ca164..72a5dcfa169 100644 --- a/packages/extension-base/src/services/transaction-service/utils.ts +++ b/packages/extension-base/src/services/transaction-service/utils.ts @@ -47,6 +47,10 @@ function getBlockExplorerAccountRoute (explorerLink: string) { return 'account'; } + if (explorerLink.includes('astral.autonomys')) { + return 'accounts'; + } + return 'address'; } diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index 5d43de04b3c..a6cf004985c 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -34,7 +34,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.94-beta.5", + "@subwallet/chain-list": "0.2.94-beta.6", "@subwallet/extension-base": "^1.3.6-1", "@subwallet/extension-chains": "^1.3.6-1", "@subwallet/extension-dapp": "^1.3.6-1", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index c0b15e5e440..1129add905a 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -35,7 +35,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.94-beta.5", + "@subwallet/chain-list": "0.2.94-beta.6", "@subwallet/extension-base": "^1.3.6-1", "@subwallet/extension-chains": "^1.3.6-1", "@subwallet/extension-dapp": "^1.3.6-1", diff --git a/yarn.lock b/yarn.lock index db5e8ac20e0..0f175e219a6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6265,14 +6265,14 @@ __metadata: languageName: node linkType: hard -"@subwallet/chain-list@npm:0.2.94-beta.5": - version: 0.2.94-beta.5 - resolution: "@subwallet/chain-list@npm:0.2.94-beta.5" +"@subwallet/chain-list@npm:0.2.94-beta.6": + version: 0.2.94-beta.6 + resolution: "@subwallet/chain-list@npm:0.2.94-beta.6" dependencies: "@polkadot/dev": 0.67.167 "@polkadot/util": ^12.5.1 eventemitter3: ^5.0.1 - checksum: c7c334523dd8e7891bd9f17e084531a3510ef1660440cdd4a28b16836c060302f5abff0e9d85d9d6954193a22bcf9476f697caec387a2b504c0d5cc0f9c19f4d + checksum: 78bf3eeff3b05a5b7ff56c2413309ef7e934715ea97c11124015499c9811f65466e549e323bab718f0db2e309a6d99dcf3415176f40b8ae024ca9e8b8e89e279 languageName: node linkType: hard @@ -6315,7 +6315,7 @@ __metadata: "@reduxjs/toolkit": ^1.9.1 "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 - "@subwallet/chain-list": 0.2.94-beta.5 + "@subwallet/chain-list": 0.2.94-beta.6 "@subwallet/extension-base": ^1.3.6-1 "@subwallet/extension-chains": ^1.3.6-1 "@subwallet/extension-dapp": ^1.3.6-1 @@ -6453,7 +6453,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.94-beta.5 + "@subwallet/chain-list": 0.2.94-beta.6 "@subwallet/extension-base": ^1.3.6-1 "@subwallet/extension-chains": ^1.3.6-1 "@subwallet/extension-dapp": ^1.3.6-1 @@ -6593,7 +6593,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.94-beta.5 + "@subwallet/chain-list": 0.2.94-beta.6 "@subwallet/extension-base": ^1.3.6-1 "@subwallet/extension-chains": ^1.3.6-1 "@subwallet/extension-dapp": ^1.3.6-1 From 59f136a7df37070715c3790e6017c50a53bdee9f Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Fri, 15 Nov 2024 11:13:44 +0700 Subject: [PATCH 061/204] [Issue-3814] fix: hotfix check browser brave --- packages/extension-base/src/utils/environment.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/extension-base/src/utils/environment.ts b/packages/extension-base/src/utils/environment.ts index 9b808649d62..9d1aace4e35 100644 --- a/packages/extension-base/src/utils/environment.ts +++ b/packages/extension-base/src/utils/environment.ts @@ -65,8 +65,11 @@ export const RuntimeInfo: RuntimeEnvironmentInfo = detectRuntimeEnvironment(); // Todo: Support more in backend case export const BowserParser = Bowser.getParser(typeof navigator !== 'undefined' ? navigator?.userAgent + '' : ''); +// @ts-ignore +// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access +export const isBrave = navigator.brave !== undefined && navigator.brave.isBrave.name === 'isBrave'; export const isFirefox = BowserParser.getBrowserName(true) === 'firefox'; -export const browserName = BowserParser.getBrowserName(true); +export const browserName = isBrave ? 'brave' : BowserParser.getBrowserName(true); export const browserVersion = BowserParser.getBrowserVersion(); export const osName = BowserParser.getOSName(); export const osVersion = BowserParser.getOSVersion(); From c3cc607fc315c4d2fd271c4bcf39c3bf02e1f5bf Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Fri, 15 Nov 2024 15:04:24 +0700 Subject: [PATCH 062/204] [Issue-3846] Update chainlist --- package.json | 2 +- packages/extension-base/package.json | 2 +- packages/extension-koni-ui/package.json | 2 +- packages/extension-web-ui/package.json | 2 +- yarn.lock | 14 +++++++------- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 898f20e1a18..6b6f9e5ccdf 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@polkadot/types-support": "^12.0.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/chain-list": "0.2.94-beta.6", + "@subwallet/chain-list": "0.2.94-beta.7", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b79", "@subwallet/ui-keyring": "0.1.8-beta.0", diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index 042b1ef1052..d564ec5d8c0 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -55,7 +55,7 @@ "@reduxjs/toolkit": "^1.9.1", "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", - "@subwallet/chain-list": "0.2.94-beta.6", + "@subwallet/chain-list": "0.2.94-beta.7", "@subwallet/extension-base": "^1.3.6-1", "@subwallet/extension-chains": "^1.3.6-1", "@subwallet/extension-dapp": "^1.3.6-1", diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index a6cf004985c..bf95fdce3d0 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -34,7 +34,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.94-beta.6", + "@subwallet/chain-list": "0.2.94-beta.7", "@subwallet/extension-base": "^1.3.6-1", "@subwallet/extension-chains": "^1.3.6-1", "@subwallet/extension-dapp": "^1.3.6-1", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index 1129add905a..a69d5f2c5a0 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -35,7 +35,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.94-beta.6", + "@subwallet/chain-list": "0.2.94-beta.7", "@subwallet/extension-base": "^1.3.6-1", "@subwallet/extension-chains": "^1.3.6-1", "@subwallet/extension-dapp": "^1.3.6-1", diff --git a/yarn.lock b/yarn.lock index 0f175e219a6..67e2322e5b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6265,14 +6265,14 @@ __metadata: languageName: node linkType: hard -"@subwallet/chain-list@npm:0.2.94-beta.6": - version: 0.2.94-beta.6 - resolution: "@subwallet/chain-list@npm:0.2.94-beta.6" +"@subwallet/chain-list@npm:0.2.94-beta.7": + version: 0.2.94-beta.7 + resolution: "@subwallet/chain-list@npm:0.2.94-beta.7" dependencies: "@polkadot/dev": 0.67.167 "@polkadot/util": ^12.5.1 eventemitter3: ^5.0.1 - checksum: 78bf3eeff3b05a5b7ff56c2413309ef7e934715ea97c11124015499c9811f65466e549e323bab718f0db2e309a6d99dcf3415176f40b8ae024ca9e8b8e89e279 + checksum: 9a6953f3f5d64483bc0bc2cfcac78603bc6872ecccc73dd7cbfafaa96cfec32d2bab46fe8a6ae4e35543ee58b5700f52288c4b2c16986f07536bbf8b6d2facc0 languageName: node linkType: hard @@ -6315,7 +6315,7 @@ __metadata: "@reduxjs/toolkit": ^1.9.1 "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 - "@subwallet/chain-list": 0.2.94-beta.6 + "@subwallet/chain-list": 0.2.94-beta.7 "@subwallet/extension-base": ^1.3.6-1 "@subwallet/extension-chains": ^1.3.6-1 "@subwallet/extension-dapp": ^1.3.6-1 @@ -6453,7 +6453,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.94-beta.6 + "@subwallet/chain-list": 0.2.94-beta.7 "@subwallet/extension-base": ^1.3.6-1 "@subwallet/extension-chains": ^1.3.6-1 "@subwallet/extension-dapp": ^1.3.6-1 @@ -6593,7 +6593,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.94-beta.6 + "@subwallet/chain-list": 0.2.94-beta.7 "@subwallet/extension-base": ^1.3.6-1 "@subwallet/extension-chains": ^1.3.6-1 "@subwallet/extension-dapp": ^1.3.6-1 From 11df7733a2bb1a5860a2f38a538b7bb84601096e Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Fri, 15 Nov 2024 12:10:48 +0700 Subject: [PATCH 063/204] [Issue-3814] fix: handle exceptions --- packages/extension-base/src/constants/blocked-actions.ts | 9 +++++++-- .../src/utils/staticData/blockedActions.json | 1 + packages/extension-base/src/utils/staticData/index.ts | 9 +++++++-- 3 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 packages/extension-base/src/utils/staticData/blockedActions.json diff --git a/packages/extension-base/src/constants/blocked-actions.ts b/packages/extension-base/src/constants/blocked-actions.ts index b9ce085c6f3..188e42f4c5f 100644 --- a/packages/extension-base/src/constants/blocked-actions.ts +++ b/packages/extension-base/src/constants/blocked-actions.ts @@ -4,8 +4,9 @@ import { packageInfo } from '@subwallet/extension-base'; import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes'; import { fetchStaticData } from '@subwallet/extension-base/utils'; +import { staticData, StaticKey } from '@subwallet/extension-base/utils/staticData'; -interface BlockedActionsFeaturesMap { +export interface BlockedActionsFeaturesMap { blockedActionsMap: Record, blockedFeaturesList: string[] } @@ -42,7 +43,7 @@ export interface OSConfig { type BlockedConfigObjects = Record -export async function fetchBlockedConfigObjects (): Promise { // todo: recheck default return +export async function fetchBlockedConfigObjects (): Promise { const targetFile = `${targetFolder}/envConfig.json`; return await fetchStaticData('blocked-actions', targetFile); @@ -143,6 +144,10 @@ function isPassVersion (versionStr: string, versionCondition?: string) { // todo } export async function fetchLastestBlockedActionsAndFeatures (ids: string[]) { + if (ids.length === 0) { + return [staticData[StaticKey.BLOCKED_ACTIONS_FEATURES]]; + } + const targetFiles = ids.map((id) => `${targetFolder}/${id}.json`); return await Promise.all(targetFiles.map((targetFile) => fetchStaticData('blocked-actions', targetFile))); diff --git a/packages/extension-base/src/utils/staticData/blockedActions.json b/packages/extension-base/src/utils/staticData/blockedActions.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/packages/extension-base/src/utils/staticData/blockedActions.json @@ -0,0 +1 @@ +{} diff --git a/packages/extension-base/src/utils/staticData/index.ts b/packages/extension-base/src/utils/staticData/index.ts index 920d21650b5..134d041582a 100644 --- a/packages/extension-base/src/utils/staticData/index.ts +++ b/packages/extension-base/src/utils/staticData/index.ts @@ -3,6 +3,7 @@ // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-assignment import { ChainInfoMap } from '@subwallet/chain-list'; +import { BlockedActionsFeaturesMap, EnvConfig } from '@subwallet/extension-base/constants'; import { NotificationActionType } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-var-requires @@ -18,9 +19,11 @@ export const termAndCondition: Record = require('./termAndCondi // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-assignment export const currencySymbol: Record = require('./currencySymbol.json'); // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-assignment -export const blockedActionsFeatures: Record = require('./blockedActionsFeatures.json'); +export const blockedActionsFeatures: BlockedActionsFeaturesMap = require('./blockedActionsFeatures.json'); // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-assignment export const remindNotificationTime: Record = require('./remindNotificationTime.json'); +// eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-assignment +export const blockedActions: Record = require('./blockedActions.json'); export enum StaticKey { BUY_SERVICE_INFOS = 'buy-service-infos', @@ -32,6 +35,7 @@ export enum StaticKey { BUY_TOKEN_CONFIGS = 'buy-token-configs', BLOCKED_ACTIONS_FEATURES = 'blocked-actions-features', REMIND_NOTIFICATION_TIME = 'remind-notification-time', + BLOCKED_ACTIONS = 'blocked-actions', } export const staticData = { @@ -43,5 +47,6 @@ export const staticData = { [StaticKey.TERM_AND_CONDITION]: termAndCondition.default, [StaticKey.BUY_TOKEN_CONFIGS]: buyTokenConfigs, [StaticKey.BLOCKED_ACTIONS_FEATURES]: blockedActionsFeatures, - [StaticKey.REMIND_NOTIFICATION_TIME]: remindNotificationTime + [StaticKey.REMIND_NOTIFICATION_TIME]: remindNotificationTime, + [StaticKey.BLOCKED_ACTIONS]: blockedActions }; From 7ab992ac917f92a84b356023a9d3efa61dff4968 Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Fri, 15 Nov 2024 17:31:57 +0700 Subject: [PATCH 064/204] [Issue-3814] fix: handle default data map --- .../src/services/chain-online-service/index.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/extension-base/src/services/chain-online-service/index.ts b/packages/extension-base/src/services/chain-online-service/index.ts index 81fc83e8218..136c55889a9 100644 --- a/packages/extension-base/src/services/chain-online-service/index.ts +++ b/packages/extension-base/src/services/chain-online-service/index.ts @@ -105,11 +105,11 @@ export class ChainOnlineService { patchVersion: latestPatchVersion } = latestPatch; const currentPatchVersion = (await this.settingService.getChainlistSetting())?.patchVersion || ''; - let chainInfoMap: Record = {}; - let assetRegistry: Record = {}; - let multiChainAssetMap: Record = {}; - let currentChainStateMap: Record = {}; - let currentChainStatusMap: Record = {}; + let chainInfoMap: Record = this.chainService.getChainInfoMap(); + let assetRegistry: Record = this.chainService.getAssetRegistry(); + let multiChainAssetMap: Record = MultiChainAssetMap; + let currentChainStateMap: Record = this.chainService.getChainStateMap(); + let currentChainStatusMap: Record = this.chainService.getChainStatusMap(); let addedChain: string[] = []; if (isSafePatch && currentPatchVersion !== latestPatchVersion) { @@ -143,7 +143,7 @@ export class ChainOnlineService { assetRegistry = filterAssetInfoMap(this.chainService.getChainInfoMap(), Object.assign({}, this.chainService.getAssetRegistry(), latestAssetInfo), addedChain); } - if (latestMultiChainAsset && Object.keys(latestMultiChainAsset).length > 0) { + if (latestMultiChainAsset && Object.keys(latestMultiChainAsset).length > 0) { // todo: currently not support update latest multichain-asset multiChainAssetMap = { ...MultiChainAssetMap, ...latestMultiChainAsset }; } From 3ca90dc8743772f0cbfee59bd9d82ce7b5fcf53f Mon Sep 17 00:00:00 2001 From: S2kael Date: Mon, 18 Nov 2024 14:31:48 +0700 Subject: [PATCH 065/204] [Issue-3846] Update stable version for chain-list --- package.json | 2 +- packages/extension-base/package.json | 2 +- packages/extension-koni-ui/package.json | 2 +- packages/extension-web-ui/package.json | 2 +- yarn.lock | 14 +++++++------- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 6b6f9e5ccdf..34e7a3175f5 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@polkadot/types-support": "^12.0.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/chain-list": "0.2.94-beta.7", + "@subwallet/chain-list": "0.2.94", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b79", "@subwallet/ui-keyring": "0.1.8-beta.0", diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index d564ec5d8c0..9d2d29dfef1 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -55,7 +55,7 @@ "@reduxjs/toolkit": "^1.9.1", "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", - "@subwallet/chain-list": "0.2.94-beta.7", + "@subwallet/chain-list": "0.2.94", "@subwallet/extension-base": "^1.3.6-1", "@subwallet/extension-chains": "^1.3.6-1", "@subwallet/extension-dapp": "^1.3.6-1", diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index bf95fdce3d0..95e39b951b5 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -34,7 +34,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.94-beta.7", + "@subwallet/chain-list": "0.2.94", "@subwallet/extension-base": "^1.3.6-1", "@subwallet/extension-chains": "^1.3.6-1", "@subwallet/extension-dapp": "^1.3.6-1", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index a69d5f2c5a0..f6388c3515d 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -35,7 +35,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.94-beta.7", + "@subwallet/chain-list": "0.2.94", "@subwallet/extension-base": "^1.3.6-1", "@subwallet/extension-chains": "^1.3.6-1", "@subwallet/extension-dapp": "^1.3.6-1", diff --git a/yarn.lock b/yarn.lock index 67e2322e5b6..65e003f1ce5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6265,14 +6265,14 @@ __metadata: languageName: node linkType: hard -"@subwallet/chain-list@npm:0.2.94-beta.7": - version: 0.2.94-beta.7 - resolution: "@subwallet/chain-list@npm:0.2.94-beta.7" +"@subwallet/chain-list@npm:0.2.94": + version: 0.2.94 + resolution: "@subwallet/chain-list@npm:0.2.94" dependencies: "@polkadot/dev": 0.67.167 "@polkadot/util": ^12.5.1 eventemitter3: ^5.0.1 - checksum: 9a6953f3f5d64483bc0bc2cfcac78603bc6872ecccc73dd7cbfafaa96cfec32d2bab46fe8a6ae4e35543ee58b5700f52288c4b2c16986f07536bbf8b6d2facc0 + checksum: cf285d30673bf98dc577baccffbaac96e49d5c5d718bb8c9fd9fe116318e753b16940907e143bfc1c212e5f3185713d82509fba85d42cbdd33a7177628e3bae4 languageName: node linkType: hard @@ -6315,7 +6315,7 @@ __metadata: "@reduxjs/toolkit": ^1.9.1 "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 - "@subwallet/chain-list": 0.2.94-beta.7 + "@subwallet/chain-list": 0.2.94 "@subwallet/extension-base": ^1.3.6-1 "@subwallet/extension-chains": ^1.3.6-1 "@subwallet/extension-dapp": ^1.3.6-1 @@ -6453,7 +6453,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.94-beta.7 + "@subwallet/chain-list": 0.2.94 "@subwallet/extension-base": ^1.3.6-1 "@subwallet/extension-chains": ^1.3.6-1 "@subwallet/extension-dapp": ^1.3.6-1 @@ -6593,7 +6593,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.94-beta.7 + "@subwallet/chain-list": 0.2.94 "@subwallet/extension-base": ^1.3.6-1 "@subwallet/extension-chains": ^1.3.6-1 "@subwallet/extension-dapp": ^1.3.6-1 From e52aa23acaafe66509f5da0858c92d20d20e9c22 Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Mon, 18 Nov 2024 16:55:16 +0700 Subject: [PATCH 066/204] [Add] Extension - Intergrate XCM Polygon to ETH --- .../src/background/KoniTypes.ts | 11 +- .../koni/api/contract-handler/utils/index.ts | 15 ++- .../src/koni/background/handlers/Extension.ts | 37 +++++- .../transfer/smart-contract.ts | 1 - .../balance-service/transfer/xcm/index.ts | 10 +- .../transfer/xcm/polygonBridge.ts | 105 +++++++++++++++--- .../inapp-notification-service/consts.ts | 10 +- .../inapp-notification-service/index.ts | 97 ++++++++++++++-- .../inapp-notification-service/interfaces.ts | 24 +++- .../utils/polygon.ts | 14 ++- .../src/services/transaction-service/index.ts | 10 +- .../src/types/avail-bridge/index.ts | 2 +- .../variants/Transaction/index.tsx | 4 +- .../{ClaimAvailBridge.tsx => ClaimBridge.tsx} | 35 ++++-- .../variants/Transaction/variants/index.tsx | 2 +- .../Settings/Notifications/Notification.tsx | 15 ++- .../Notifications/NotificationSetting.tsx | 6 +- .../src/Popup/Transaction/Transaction.tsx | 2 +- .../{ClaimAvailBridge.tsx => ClaimBridge.tsx} | 58 ++++++---- .../extension-koni-ui/src/Popup/router.tsx | 4 +- .../src/constants/localStorage.ts | 2 +- .../src/constants/transaction.ts | 4 +- .../{avail-bridge.ts => bridge.ts} | 8 +- .../src/types/transaction.ts | 2 +- 24 files changed, 376 insertions(+), 102 deletions(-) rename packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/{ClaimAvailBridge.tsx => ClaimBridge.tsx} (60%) rename packages/extension-koni-ui/src/Popup/Transaction/variants/{ClaimAvailBridge.tsx => ClaimBridge.tsx} (77%) rename packages/extension-koni-ui/src/messaging/transaction/{avail-bridge.ts => bridge.ts} (57%) diff --git a/packages/extension-base/src/background/KoniTypes.ts b/packages/extension-base/src/background/KoniTypes.ts index 456f09af57e..84213f28110 100644 --- a/packages/extension-base/src/background/KoniTypes.ts +++ b/packages/extension-base/src/background/KoniTypes.ts @@ -16,7 +16,7 @@ import { CrowdloanContributionsResponse } from '@subwallet/extension-base/servic import { SWTransactionResponse, SWTransactionResult } from '@subwallet/extension-base/services/transaction-service/types'; import { WalletConnectNotSupportRequest, WalletConnectSessionRequest } from '@subwallet/extension-base/services/wallet-connect-service/types'; import { AccountJson, AccountsWithCurrentAddress, AddressJson, BalanceJson, BaseRequestSign, BuyServiceInfo, BuyTokenInfo, CommonOptimalPath, CurrentAccountInfo, EarningRewardHistoryItem, EarningRewardJson, EarningStatus, HandleYieldStepParams, InternalRequestSign, LeavePoolAdditionalData, NominationPoolInfo, OptimalYieldPath, OptimalYieldPathParams, RequestAccountBatchExportV2, RequestAccountCreateSuriV2, RequestAccountNameValidate, RequestAccountProxyEdit, RequestAccountProxyForget, RequestBatchJsonGetAccountInfo, RequestBatchRestoreV2, RequestBounceableValidate, RequestChangeTonWalletContractVersion, RequestCheckCrossChainTransfer, RequestCheckPublicAndSecretKey, RequestCheckTransfer, RequestCrossChainTransfer, RequestDeriveCreateMultiple, RequestDeriveCreateV3, RequestDeriveValidateV2, RequestEarlyValidateYield, RequestExportAccountProxyMnemonic, RequestGetAllTonWalletContractVersion, RequestGetDeriveAccounts, RequestGetDeriveSuggestion, RequestGetYieldPoolTargets, RequestInputAccountSubscribe, RequestJsonGetAccountInfo, RequestJsonRestoreV2, RequestMetadataHash, RequestMnemonicCreateV2, RequestMnemonicValidateV2, RequestPrivateKeyValidateV2, RequestShortenMetadata, RequestStakeCancelWithdrawal, RequestStakeClaimReward, RequestTransfer, RequestUnlockDotCheckCanMint, RequestUnlockDotSubscribeMintedData, RequestYieldLeave, RequestYieldStepSubmit, RequestYieldWithdrawal, ResponseAccountBatchExportV2, ResponseAccountCreateSuriV2, ResponseAccountNameValidate, ResponseBatchJsonGetAccountInfo, ResponseCheckPublicAndSecretKey, ResponseDeriveValidateV2, ResponseEarlyValidateYield, ResponseExportAccountProxyMnemonic, ResponseGetAllTonWalletContractVersion, ResponseGetDeriveAccounts, ResponseGetDeriveSuggestion, ResponseGetYieldPoolTargets, ResponseInputAccountSubscribe, ResponseJsonGetAccountInfo, ResponseMetadataHash, ResponseMnemonicCreateV2, ResponseMnemonicValidateV2, ResponsePrivateKeyValidateV2, ResponseShortenMetadata, StorageDataInterface, SubmitYieldStepData, SwapPair, SwapQuoteResponse, SwapRequest, SwapRequestResult, SwapSubmitParams, SwapTxData, TokenSpendingApprovalParams, UnlockDotTransactionNft, UnstakingStatus, ValidateSwapProcessParams, ValidateYieldProcessParams, YieldPoolInfo, YieldPositionInfo } from '@subwallet/extension-base/types'; -import { RequestClaimAvailBridge } from '@subwallet/extension-base/types/avail-bridge'; +import { RequestClaimBridge } from '@subwallet/extension-base/types/avail-bridge'; import { GetNotificationParams, RequestSwitchStatusParams } from '@subwallet/extension-base/types/notification'; import { InjectedAccount, InjectedAccountWithMeta, MetadataDefBase } from '@subwallet/extension-inject/types'; import { KeyringPair$Meta } from '@subwallet/keyring/types'; @@ -564,7 +564,7 @@ export interface ExtrinsicDataTypeMap { [ExtrinsicType.TOKEN_SPENDING_APPROVAL]: TokenSpendingApprovalParams, - [ExtrinsicType.CLAIM_AVAIL_BRIDGE]: RequestClaimAvailBridge + [ExtrinsicType.CLAIM_AVAIL_BRIDGE]: RequestClaimBridge [ExtrinsicType.EVM_EXECUTE]: TransactionConfig, [ExtrinsicType.CROWDLOAN]: any, @@ -2267,9 +2267,14 @@ export interface KoniRequestSignatures { /* Notification Service */ /* Avail Bridge */ - 'pri(availBridge.submitClaimAvailBridgeOnAvail)': [RequestClaimAvailBridge, SWTransactionResponse] + 'pri(availBridge.submitClaimAvailBridgeOnAvail)': [RequestClaimBridge, SWTransactionResponse] /* Avail Bridge */ + /* Polygon Bridge */ + 'pri(polygonBridge.submitClaimPolygonBridge)': [RequestClaimBridge, SWTransactionResponse] + /* Polygon Bridge */ + + /* Ledger */ 'pri(ledger.generic.allow)': [null, string[], string[]]; } 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 abee42140eb..82ded2a1de4 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 @@ -60,15 +60,14 @@ 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') { - return '0x528e26b25a34a4A5d0dbDa1d57D318153d2ED582'; - } else if (chain === 'sepolia_ethereum') { - return '0x528e26b25a34a4A5d0dbDa1d57D318153d2ED582'; - } else if (chain === 'polygonZkEvm') { - return '0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe'; - } else if (chain === 'ethereum') { - return '0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe'; + if (chain === 'polygonzkEvm_cardona' || chain === 'sepolia_ethereum') { + return POLYGONBRIDGE_GATEWAY_SEPOLIA_CONTRACT_ADDRESS; + } else if (chain === 'polygonZkEvm' || chain === '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 18776c15fc7..e26662e686a 100644 --- a/packages/extension-base/src/koni/background/handlers/Extension.ts +++ b/packages/extension-base/src/koni/background/handlers/Extension.ts @@ -32,7 +32,7 @@ import { createTransferExtrinsic, getTransferMockTxFee } from '@subwallet/extens import { createTonTransaction } from '@subwallet/extension-base/services/balance-service/transfer/ton-transfer'; import { createAvailBridgeExtrinsicFromAvail, createAvailBridgeTxFromEth, createPolygonBridgeExtrinsic, createSnowBridgeExtrinsic, createXcmExtrinsic, CreateXcmExtrinsicProps, FunctionCreateXcmExtrinsic, getXcmMockTxFee } from '@subwallet/extension-base/services/balance-service/transfer/xcm'; import { getClaimTxOnAvail, getClaimTxOnEthereum, isAvailChainBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge'; -import { _isPolygonChainBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge'; +import { _isPolygonChainBridge, getClaimPolygonBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge'; import { _API_OPTIONS_CHAIN_GROUP, _DEFAULT_MANTA_ZK_CHAIN, _MANTA_ZK_CHAIN_GROUP, _ZK_ASSET_PREFIX } from '@subwallet/extension-base/services/chain-service/constants'; import { _ChainApiStatus, _ChainConnectionStatus, _ChainState, _NetworkUpsertParams, _ValidateCustomAssetRequest, _ValidateCustomAssetResponse, EnableChainParams, EnableMultiChainParams } from '@subwallet/extension-base/services/chain-service/types'; import { _getAssetDecimals, _getAssetSymbol, _getChainNativeTokenBasicInfo, _getContractAddressOfToken, _getEvmChainId, _isAssetSmartContractNft, _isChainEvmCompatible, _isChainTonCompatible, _isCustomAsset, _isLocalToken, _isMantaZkAsset, _isNativeToken, _isPureEvmChain, _isTokenEvmSmartContract, _isTokenTransferredByEvm, _isTokenTransferredByTon } from '@subwallet/extension-base/services/chain-service/utils'; @@ -49,7 +49,7 @@ import { SWStorage } from '@subwallet/extension-base/storage'; import { AccountsStore } from '@subwallet/extension-base/stores'; import { AccountJson, AccountProxyMap, AccountsWithCurrentAddress, BalanceJson, BasicTxErrorType, BasicTxWarningCode, BuyServiceInfo, BuyTokenInfo, EarningRewardJson, NominationPoolInfo, OptimalYieldPathParams, RequestAccountBatchExportV2, RequestAccountCreateSuriV2, RequestAccountNameValidate, RequestBatchJsonGetAccountInfo, RequestBatchRestoreV2, RequestBounceableValidate, RequestChangeTonWalletContractVersion, RequestCheckPublicAndSecretKey, RequestCrossChainTransfer, RequestDeriveCreateMultiple, RequestDeriveCreateV3, RequestDeriveValidateV2, RequestEarlyValidateYield, RequestExportAccountProxyMnemonic, RequestGetAllTonWalletContractVersion, RequestGetDeriveAccounts, RequestGetDeriveSuggestion, RequestGetYieldPoolTargets, RequestInputAccountSubscribe, RequestJsonGetAccountInfo, RequestJsonRestoreV2, RequestMetadataHash, RequestMnemonicCreateV2, RequestMnemonicValidateV2, RequestPrivateKeyValidateV2, RequestShortenMetadata, RequestStakeCancelWithdrawal, RequestStakeClaimReward, RequestTransfer, RequestUnlockDotCheckCanMint, RequestUnlockDotSubscribeMintedData, RequestYieldLeave, RequestYieldStepSubmit, RequestYieldWithdrawal, ResponseAccountBatchExportV2, ResponseAccountCreateSuriV2, ResponseAccountNameValidate, ResponseBatchJsonGetAccountInfo, ResponseCheckPublicAndSecretKey, ResponseDeriveValidateV2, ResponseExportAccountProxyMnemonic, ResponseGetAllTonWalletContractVersion, ResponseGetDeriveAccounts, ResponseGetDeriveSuggestion, ResponseGetYieldPoolTargets, ResponseInputAccountSubscribe, ResponseJsonGetAccountInfo, ResponseMetadataHash, ResponseMnemonicCreateV2, ResponseMnemonicValidateV2, ResponsePrivateKeyValidateV2, ResponseShortenMetadata, StakingTxErrorType, StorageDataInterface, TokenSpendingApprovalParams, ValidateYieldProcessParams, YieldPoolType } from '@subwallet/extension-base/types'; import { RequestAccountProxyEdit, RequestAccountProxyForget } from '@subwallet/extension-base/types/account/action/edit'; -import { RequestClaimAvailBridge } from '@subwallet/extension-base/types/avail-bridge'; +import { RequestClaimBridge } from '@subwallet/extension-base/types/avail-bridge'; import { GetNotificationParams, RequestSwitchStatusParams } from '@subwallet/extension-base/types/notification'; import { CommonOptimalPath } from '@subwallet/extension-base/types/service-base'; import { SwapPair, SwapQuoteResponse, SwapRequest, SwapRequestResult, SwapSubmitParams, ValidateSwapProcessParams } from '@subwallet/extension-base/types/swap'; @@ -3798,7 +3798,7 @@ export default class KoniExtension { } /* Notification service */ - private async submitClaimAvailBridge (data: RequestClaimAvailBridge) { + private async submitClaimAvailBridge (data: RequestClaimBridge) { const { address, chain, notification } = data; const extrinsicType = ExtrinsicType.CLAIM_AVAIL_BRIDGE; @@ -3827,6 +3827,28 @@ export default class KoniExtension { }); } + private async submitClaimPolygonBridge (data: RequestClaimBridge) { + const { address, chain, notification } = data; + const extrinsicType = ExtrinsicType.CLAIM_AVAIL_BRIDGE; + + let transaction: SubmittableExtrinsic<'promise'> | TransactionConfig | null = null; + let chainType: ChainType; + + const evmApi = this.#koniState.getEvmApi(chain); + + transaction = await getClaimPolygonBridge(chain, notification, evmApi); + chainType = ChainType.EVM; + + return await this.#koniState.transactionService.handleTransaction({ + address, + chain, + transaction, + data, + extrinsicType, + chainType + }); + } + /* Ledger */ private async subscribeLedgerGenericAllowChains (id: string, port: chrome.runtime.Port): Promise { @@ -4433,9 +4455,16 @@ export default class KoniExtension { /* Avail Bridge */ case 'pri(availBridge.submitClaimAvailBridgeOnAvail)': - return this.submitClaimAvailBridge(request as RequestClaimAvailBridge); + return this.submitClaimAvailBridge(request as RequestClaimBridge); /* Avail Bridge */ + /* Polygon Bridge */ + + case 'pri(polygonBridge.submitClaimPolygonBridge)': + return this.submitClaimPolygonBridge(request as RequestClaimBridge); + + /* Polygon Bridge */ + /* Ledger */ case 'pri(ledger.generic.allow)': return this.subscribeLedgerGenericAllowChains(id, port); diff --git a/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts b/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts index 41c29fb3e90..44b4c656ba6 100644 --- a/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts +++ b/packages/extension-base/src/services/balance-service/transfer/smart-contract.ts @@ -69,7 +69,6 @@ export async function getERC20TransactionObject ( ): Promise<[TransactionConfig, string]> { const networkKey = chainInfo.slug; const erc20Contract = getERC20Contract(assetAddress, evmApi); - let freeAmount = new BigN(0); let transferValue = value; 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 77243cf2d98..3f8af260c5d 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 @@ -5,7 +5,7 @@ import { _ChainAsset, _ChainInfo } from '@subwallet/chain-list/types'; import { _isPolygonBridgeXcm, _isSnowBridgeXcm } from '@subwallet/extension-base/core/substrate/xcm-parser'; import { getAvailBridgeExtrinsicFromAvail, getAvailBridgeTxFromEth } from '@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge'; import { getExtrinsicByPolkadotXcmPallet } from '@subwallet/extension-base/services/balance-service/transfer/xcm/polkadotXcm'; -import { _createPolygonBridgeL1toL2Extrinsic } from '@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge'; +import { _createPolygonBridgeL1toL2Extrinsic, _createPolygonBridgeL2toL1Extrinsic } from '@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge'; import { getSnowBridgeEvmTransfer } from '@subwallet/extension-base/services/balance-service/transfer/xcm/snowBridge'; import { getExtrinsicByXcmPalletPallet } from '@subwallet/extension-base/services/balance-service/transfer/xcm/xcmPallet'; import { getExtrinsicByXtokensPallet } from '@subwallet/extension-base/services/balance-service/transfer/xcm/xTokens'; @@ -124,7 +124,7 @@ export const createPolygonBridgeExtrinsic = async ({ chainInfoMap, const destinationChainInfo = chainInfoMap[destinationTokenInfo.originChain]; if (!_isPolygonBridgeXcm(originChainInfo, destinationChainInfo)) { - throw new Error('This is not a valid SnowBridge transfer'); + throw new Error('This is not a valid PolygonBridge transfer'); } if (!evmApi) { @@ -138,10 +138,10 @@ export const createPolygonBridgeExtrinsic = async ({ chainInfoMap, const sourceChain = originChainInfo.slug; if (sourceChain === 'polygonzkEvm_cardona' || sourceChain === 'polygonZkEvm') { - throw new Error('Currently, only support bridge from L1 to L2'); + return _createPolygonBridgeL2toL1Extrinsic(originTokenInfo, originChainInfo, sender, recipient, sendingValue, evmApi); + } else { + return _createPolygonBridgeL1toL2Extrinsic(originTokenInfo, originChainInfo, sender, recipient, sendingValue, evmApi); } - - return _createPolygonBridgeL1toL2Extrinsic(originTokenInfo, originChainInfo, sender, recipient, sendingValue, evmApi); }; export const getXcmMockTxFee = async (substrateApi: _SubstrateApi, chainInfoMap: Record, originTokenInfo: _ChainAsset, destinationTokenInfo: _ChainAsset): Promise => { 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 ce734341655..cc27e4e020d 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 @@ -7,43 +7,122 @@ import { _POLYGON_BRIDGE_ABI, getPolygonBridgeContract } from '@subwallet/extens import { _EvmApi } from '@subwallet/extension-base/services/chain-service/types'; import { _getContractAddressOfToken } from '@subwallet/extension-base/services/chain-service/utils'; import { calculateGasFeeParams } from '@subwallet/extension-base/services/fee-service/utils'; +import { _NotificationInfo, ClaimPolygonBridgeNotificationMetadata } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; import { TransactionConfig } from 'web3-core'; import { ContractSendMethod } from 'web3-eth-contract'; -export async function _createPolygonBridgeL1toL2Extrinsic (tokenInfo: _ChainAsset, originChainInfo: _ChainInfo, sender: string, recipientAddress: string, value: string, evmApi: _EvmApi): Promise { +interface gasStation{ + safeLow: number; + standard: number; + fastLow: number; +} + +interface Proof { + main_exit_root: string[]; + merkle_proof: string[]; + rollup_exit_root: string; + rollup_merkle_proof: string; +} + +interface ClaimNotification { + proof: Proof; +} + +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' +}; + +async function createPolygonBridgeTransaction (tokenInfo: _ChainAsset, originChainInfo: _ChainInfo, sender: string, recipientAddress: string, value: string, destinationNetwork: number, evmApi: _EvmApi, isTestnet?: boolean): Promise { const polygonBridgeContractAddress = getPolygonBridgeContract(originChainInfo.slug); const polygonBridgeContract = getWeb3Contract(polygonBridgeContractAddress, evmApi, _POLYGON_BRIDGE_ABI); const tokenContract = _getContractAddressOfToken(tokenInfo) || '0x0000000000000000000000000000000000000000'; // FOR Ethereum: use null address - const destinationNetwork = 1; if (tokenContract !== '0x0000000000000000000000000000000000000000') { throw new Error('Only native token transfer is supported'); } // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment - const transferCall: ContractSendMethod = polygonBridgeContract.methods.bridgeAsset(destinationNetwork, recipientAddress, value, tokenContract, true, '0x'); + const transferCall: ContractSendMethod = polygonBridgeContract.methods.bridgeAsset( + destinationNetwork, + recipientAddress, + value, + tokenContract, + true, + '0x' + ); const transferEncodedCall = transferCall.encodeABI(); - const priority = await calculateGasFeeParams(evmApi, evmApi.chainSlug); - const transactionConfig = { + const gasDomain = isTestnet ? POLYGON_GAS_INDEXER.TESTNET : POLYGON_GAS_INDEXER.MAINNET; + const gasResponse = isTestnet + ? await fetch(`${gasDomain}`).then((res) => res.json()) as gasStation + : undefined; + + const gasPriceInWei = gasResponse ? (gasResponse.standard * 1e9 + 200000) : undefined; + const priority = !gasResponse ? await calculateGasFeeParams(evmApi, evmApi.chainSlug) : undefined; + + const transactionConfig: TransactionConfig = { from: sender, to: polygonBridgeContractAddress, value: value, data: transferEncodedCall, + gasPrice: gasPriceInWei || priority?.gasPrice, + maxFeePerGas: priority?.maxFeePerGas?.toString(), + maxPriorityFeePerGas: priority?.maxPriorityFeePerGas?.toString() + }; + + const gasLimit = await evmApi.api.eth.estimateGas(transactionConfig).catch(() => 200000); + + transactionConfig.gas = gasLimit.toString(); + + return transactionConfig; +} + +export async function _createPolygonBridgeL1toL2Extrinsic (tokenInfo: _ChainAsset, originChainInfo: _ChainInfo, sender: string, recipientAddress: string, value: string, evmApi: _EvmApi): Promise { + return createPolygonBridgeTransaction(tokenInfo, originChainInfo, sender, recipientAddress, value, 1, evmApi, false); +} + +export async function _createPolygonBridgeL2toL1Extrinsic (tokenInfo: _ChainAsset, originChainInfo: _ChainInfo, sender: string, recipientAddress: string, value: string, evmApi: _EvmApi): Promise { + const isTestnet = originChainInfo.slug === 'polygonzkEvm_cardona'; + + return createPolygonBridgeTransaction(tokenInfo, originChainInfo, sender, recipientAddress, value, 0, evmApi, isTestnet); +} + +export async function getClaimPolygonBridge (chainSlug: string, notification: _NotificationInfo, evmApi: _EvmApi) { + const polygonBridgeContractAddress = getPolygonBridgeContract(chainSlug); + const polygonBridgeContract = getWeb3Contract(polygonBridgeContractAddress, evmApi, _POLYGON_BRIDGE_ABI); + const metadata = notification.metadata as ClaimPolygonBridgeNotificationMetadata; + + const isTestnet = chainSlug === 'sepolia_ethereum'; + const proofDomain = isTestnet ? POLYGON_PROOF_INDEXER.TESTNET : POLYGON_PROOF_INDEXER.MAINNET; + const proofResponse = await fetch(`${proofDomain}?networkId=${metadata.sourceNetwork}&depositCount=${metadata.counter}`) + .then((res) => res.json()) as ClaimNotification; + const proof = proofResponse.proof; + + // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment + const transferCall: ContractSendMethod = polygonBridgeContract.methods.claimAsset(proof.merkle_proof, proof.rollup_merkle_proof, metadata.counter, proof.main_exit_root, proof.rollup_exit_root, metadata.originTokenNetwork, metadata.originTokenAddress, metadata.destinationNetwork, metadata.receiver, metadata.amounts[0], '0x'); + const transferEncodedCall = transferCall.encodeABI(); + + const priority = await calculateGasFeeParams(evmApi, evmApi.chainSlug); + + const transactionConfig = { + from: metadata.userAddress, + to: polygonBridgeContractAddress, + value: '0', + data: transferEncodedCall, gasPrice: priority.gasPrice, maxFeePerGas: priority.maxFeePerGas?.toString(), maxPriorityFeePerGas: priority.maxPriorityFeePerGas?.toString() } as TransactionConfig; - let gasLimit; - - try { - gasLimit = await evmApi.api.eth.estimateGas(transactionConfig); - } catch (e) { - gasLimit = 200000; // todo: handle this better - } + const gasLimit = await evmApi.api.eth.estimateGas(transactionConfig).catch(() => 200000); - transactionConfig.gas = gasLimit; + transactionConfig.gas = gasLimit.toString(); return transactionConfig; } diff --git a/packages/extension-base/src/services/inapp-notification-service/consts.ts b/packages/extension-base/src/services/inapp-notification-service/consts.ts index 4202c840db1..56a2b57ef14 100644 --- a/packages/extension-base/src/services/inapp-notification-service/consts.ts +++ b/packages/extension-base/src/services/inapp-notification-service/consts.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { NotificationActionType } from './interfaces'; -import { getAvailBridgeClaimDescription, getClaimDescription, getReceiveDescription, getSendDescription, getWaitPolygonBridgeDescription, getWithdrawDescription } from './utils'; +import { getAvailBridgeClaimDescription, getClaimDescription, getPolygonBridgeClaimDescription, getReceiveDescription, getSendDescription, getWaitPolygonBridgeDescription, getWaitPolygonBridgeL2toL1Description, getWithdrawDescription } from './utils'; export const NotificationTitleMap = { [NotificationActionType.WITHDRAW]: '[{{accountName}}] WITHDRAW {{tokenSymbol}}', @@ -11,7 +11,9 @@ export const NotificationTitleMap = { [NotificationActionType.RECEIVE]: '[{{accountName}}] RECEIVE {{tokenSymbol}}', [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_AVAIL]: '[{{accountName}}] CLAIM {{tokenSymbol}}', [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_ETHEREUM]: '[{{accountName}}] CLAIM {{tokenSymbol}}', - [NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE]: '[{{accountName}}] BRIDGE {{tokenSymbol}}' + [NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE]: '[{{accountName}}] BRIDGE {{tokenSymbol}}', + [NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE_L2_TO_L1]: '[{{accountName}}] BRIDGE {{tokenSymbol}}', + [NotificationActionType.CLAIM_POLYGON_BRIDGE]: '[{{accountName}}] CLAIM {{tokenSymbol}}', }; export const NotificationDescriptionMap = { @@ -21,7 +23,9 @@ export const NotificationDescriptionMap = { [NotificationActionType.RECEIVE]: getReceiveDescription, [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_AVAIL]: getAvailBridgeClaimDescription, [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_ETHEREUM]: getAvailBridgeClaimDescription, - [NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE]: getWaitPolygonBridgeDescription + [NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE]: getWaitPolygonBridgeDescription, + [NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE_L2_TO_L1]: getWaitPolygonBridgeL2toL1Description, + [NotificationActionType.CLAIM_POLYGON_BRIDGE]: getPolygonBridgeClaimDescription }; export const ONE_DAY_MILLISECOND = 1000 * 24 * 60 * 60; diff --git a/packages/extension-base/src/services/inapp-notification-service/index.ts b/packages/extension-base/src/services/inapp-notification-service/index.ts index 9b191aa85e6..82f9dadb835 100644 --- a/packages/extension-base/src/services/inapp-notification-service/index.ts +++ b/packages/extension-base/src/services/inapp-notification-service/index.ts @@ -9,8 +9,8 @@ import { CronServiceInterface, ServiceStatus } from '@subwallet/extension-base/s import { ChainService } from '@subwallet/extension-base/services/chain-service'; import { EventService } from '@subwallet/extension-base/services/event-service'; import { NotificationDescriptionMap, NotificationTitleMap, ONE_DAY_MILLISECOND } from '@subwallet/extension-base/services/inapp-notification-service/consts'; -import { _BaseNotificationInfo, _NotificationInfo, ClaimAvailBridgeNotificationMetadata, NotificationActionType, NotificationTab, WithdrawClaimNotificationMetadata } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; -import { AvailBridgeSourceChain, AvailBridgeTransaction, fetchAllAvailBridgeClaimable, hrsToMillisecond } from '@subwallet/extension-base/services/inapp-notification-service/utils'; +import { _BaseNotificationInfo, _NotificationInfo, ClaimAvailBridgeNotificationMetadata, ClaimPolygonBridgeNotificationMetadata, NotificationActionType, NotificationTab, WithdrawClaimNotificationMetadata } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; +import { AvailBridgeSourceChain, AvailBridgeTransaction, fetchAllAvailBridgeClaimable, fetchPolygonBridgeTransactions, hrsToMillisecond, PolygonTransaction } from '@subwallet/extension-base/services/inapp-notification-service/utils'; import { KeyringService } from '@subwallet/extension-base/services/keyring-service'; import DatabaseService from '@subwallet/extension-base/services/storage-service/DatabaseService'; import { RequestCrossChainTransfer } from '@subwallet/extension-base/types'; @@ -162,17 +162,24 @@ export class InappNotificationService implements CronServiceInterface { await this.dbService.upsertNotifications(passNotifications); } - cronCreateAvailBridgeClaimNotification () { + cronCreateBridgeClaimNotification () { clearTimeout(this.refeshAvailBridgeClaimTimeOut); this.createAvailBridgeClaimNotification(); - this.refeshAvailBridgeClaimTimeOut = setTimeout(this.cronCreateAvailBridgeClaimNotification.bind(this), CRON_LISTEN_AVAIL_BRIDGE_CLAIM); + this.createPolygonClaimableTransactions(); + + this.refeshAvailBridgeClaimTimeOut = setTimeout(this.cronCreateBridgeClaimNotification.bind(this), CRON_LISTEN_AVAIL_BRIDGE_CLAIM); } - createAvailBridgeClaimNotification () { + getCategorizedAddresses () { const addresses = this.keyringService.context.getAllAddresses(); - const { evm: evmAddresses, substrate: substrateAddresses } = categoryAddresses(addresses); + + return categoryAddresses(addresses); + } + + createAvailBridgeClaimNotification () { + const { evm: evmAddresses, substrate: substrateAddresses } = this.getCategorizedAddresses(); const chainAssets = this.chainService.getAssetRegistry(); @@ -263,9 +270,77 @@ export class InappNotificationService implements CronServiceInterface { await this.validateAndWriteNotificationsToDB(notifications, address); } - public async writeWaitPolygonBridge (request: RequestCrossChainTransfer, transactionHash: string) { + // Polygon Claimable Handle + + async createPolygonClaimableTransactions () { + const { evm: evmAddresses } = this.getCategorizedAddresses(); + const polygonAsset = Object.values(this.chainService.getAssetRegistry()).find( + (asset) => asset.originChain === 'sepolia_ethereum' + ); + + const isTestnet = polygonAsset?.originChain === 'sepolia_ethereum'; + + if (evmAddresses.length === 0) { + return; + } + + for (const address of evmAddresses) { + const response = await fetchPolygonBridgeTransactions(address, isTestnet); + + if (response && response.success) { + const claimableTransactions = response.result.filter( + (transaction) => transaction.status === 'READY_TO_CLAIM' && transaction.userAddress === transaction.receiver + ); + + if (claimableTransactions.length > 0 && polygonAsset) { + await this.processPolygonClaimNotification(address, claimableTransactions, polygonAsset); + } + } + } + } + + async processPolygonClaimNotification (address: string, transactions: PolygonTransaction[], token: _ChainAsset) { + const actionType = NotificationActionType.CLAIM_POLYGON_BRIDGE; + const timestamp = Date.now(); + const symbol = token.symbol; + const decimals = token.decimals ?? 0; + const notifications: _BaseNotificationInfo[] = transactions.map((transaction) => { + const { _id, amounts, counter, destinationNetwork, originTokenAddress, originTokenNetwork, receiver, sourceNetwork, status, transactionHash, transactionInitiator, userAddress } = transaction; + const metadata: ClaimPolygonBridgeNotificationMetadata = { + chainSlug: token.originChain, + tokenSlug: token.slug, + _id, + amounts, + counter, + destinationNetwork, + originTokenAddress, + originTokenNetwork, + receiver, + sourceNetwork, + status, + transactionHash, + transactionInitiator, + userAddress + }; + + return { + id: `${actionType}___${_id}___${timestamp}`, + address: address, + title: NotificationTitleMap[actionType].replace('{{tokenSymbol}}', symbol), + description: NotificationDescriptionMap[actionType](formatNumber(amounts[0], decimals), symbol), + time: timestamp, + extrinsicType: ExtrinsicType.CLAIM_AVAIL_BRIDGE, + isRead: false, + actionType, + metadata + }; + }); + + await this.validateAndWriteNotificationsToDB(notifications, address); + } + + public async writeWaitPolygonBridge (request: RequestCrossChainTransfer, transactionHash: string, actionType: NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE | NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE_L2_TO_L1) { const { from: address, tokenSlug, value: amount } = request; - const actionType = NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE; const timestamp = Date.now(); const token = this.chainService.getAssetBySlug(tokenSlug); const symbol = token.symbol; @@ -285,6 +360,8 @@ export class InappNotificationService implements CronServiceInterface { await this.validateAndWriteNotificationsToDB([notification], address); } + // Polygon Claimable Handle + async start (): Promise { if (this.status === ServiceStatus.STARTED) { return; @@ -302,8 +379,8 @@ export class InappNotificationService implements CronServiceInterface { async startCron (): Promise { this.cleanUpOldNotifications() .catch(console.error); - - this.cronCreateAvailBridgeClaimNotification(); + console.log('Crondding'); + this.cronCreateBridgeClaimNotification(); return Promise.resolve(); } diff --git a/packages/extension-base/src/services/inapp-notification-service/interfaces.ts b/packages/extension-base/src/services/inapp-notification-service/interfaces.ts index 5fe84a087d7..dbb156b2f5c 100644 --- a/packages/extension-base/src/services/inapp-notification-service/interfaces.ts +++ b/packages/extension-base/src/services/inapp-notification-service/interfaces.ts @@ -29,6 +29,8 @@ export interface ActionTypeToMetadataMap { [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_AVAIL]: ClaimAvailBridgeNotificationMetadata, [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_ETHEREUM]: ClaimAvailBridgeNotificationMetadata, [NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE]: unknown, + [NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE_L2_TO_L1]: unknown, + [NotificationActionType.CLAIM_POLYGON_BRIDGE]: ClaimPolygonBridgeNotificationMetadata } export interface SendReceiveNotificationMetadata { @@ -59,6 +61,23 @@ export interface ClaimAvailBridgeNotificationMetadata { status: AvailBridgeTransactionStatus; } +export interface ClaimPolygonBridgeNotificationMetadata { + chainSlug: string; + tokenSlug: string; + _id: string; + amounts: string[]; + counter: number; + destinationNetwork: number; + originTokenAddress?: string; + originTokenNetwork?: number; + receiver?: string; + sourceNetwork: number; + status: string; + transactionHash: string; + transactionInitiator?: string; + userAddress: string; +} + export enum NotificationTimePeriod { TODAY = 'TODAY', THIS_WEEK = 'THIS_WEEK', @@ -72,7 +91,9 @@ export enum NotificationActionType { CLAIM = 'CLAIM', // Claim reward CLAIM_AVAIL_BRIDGE_ON_AVAIL = 'CLAIM_AVAIL_BRIDGE_ON_AVAIL', CLAIM_AVAIL_BRIDGE_ON_ETHEREUM = 'CLAIM_AVAIL_BRIDGE_ON_ETHEREUM', - HAVE_TO_WAIT_POLYGON_BRIDGE = 'HAVE_TO_WAIT_POLYGON_BRIDGE' + HAVE_TO_WAIT_POLYGON_BRIDGE = 'HAVE_TO_WAIT_POLYGON_BRIDGE', + HAVE_TO_WAIT_POLYGON_BRIDGE_L2_TO_L1 = 'HAVE_TO_WAIT_POLYGON_BRIDGE_L2_TO_L1', + CLAIM_POLYGON_BRIDGE = 'CLAIM_POLYGON_BRIDGE' } export enum NotificationTab { @@ -87,6 +108,7 @@ export interface ShowNotificationPayload { earningClaim: boolean, // notice when an account has an earning reward to claim earningWithdraw: boolean, // notice when an account has an earning unstake to withdraw availBridgeClaim: boolean, // notice when an account has an avail bridge to claim + polygonBridgeClaim: boolean, // notice when an account has an avail bridge to claim // marketing: boolean, // notice when wallet has a marketing announcement // marketing: boolean, // notice when wallet has a marketing announcement // announcement: boolean // notice when wallet has an announcement 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 725ad0b1d1b..e815676ed9d 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 @@ -6,7 +6,7 @@ export const POLYGON_BRIDGE_INDEXER = { TESTNET: 'https://api-gateway.polygon.technology/api/v3/transactions/testnet' }; -interface PolygonTransaction { +export interface PolygonTransaction { _id: string; transactionIndex?: number; sourceNetwork: number; @@ -23,7 +23,7 @@ interface PolygonTransaction { userAddress: string; wrappedTokenAddress?: string; wrappedTokenNetwork?: number; - counter?: number; + counter: number; bridgeContractAddress?: string; eventInitiatorAddress?: string; globalExitRootManager?: string; @@ -76,9 +76,17 @@ interface PolygonTransactionResponse { export function getWaitPolygonBridgeDescription (amount: string, symbol: string) { return `${amount} ${symbol} will arrive in 30 minutes from Polygon Unified Bridge!`; } + +export function getWaitPolygonBridgeL2toL1Description (amount: string, symbol: string) { + return `${amount} ${symbol} will arrive in 180 minutes from Polygon Unified Bridge!`; +} + +export function getPolygonBridgeClaimDescription (amount: string, symbol: string) { + return `${amount} ${symbol} ready to claim from ${symbol} cross-chain transfer. Click to claim now!`; +} /* Description */ -export async function fetchPolygonBridgeTransactions (userAddress: string, pageSize = 500, page = 0, isTestnet = true) { +export async function fetchPolygonBridgeTransactions (userAddress: string, isTestnet: boolean, pageSize = 500, page = 0) { const params = new URLSearchParams({ userAddress, pageSize: pageSize.toString(), diff --git a/packages/extension-base/src/services/transaction-service/index.ts b/packages/extension-base/src/services/transaction-service/index.ts index b6d9a978205..6eab04ea840 100644 --- a/packages/extension-base/src/services/transaction-service/index.ts +++ b/packages/extension-base/src/services/transaction-service/index.ts @@ -14,7 +14,7 @@ import { ChainService } from '@subwallet/extension-base/services/chain-service'; import { _getAssetDecimals, _getAssetSymbol, _getChainNativeTokenBasicInfo, _getEvmChainId, _isChainEvmCompatible } from '@subwallet/extension-base/services/chain-service/utils'; import { EventService } from '@subwallet/extension-base/services/event-service'; import { HistoryService } from '@subwallet/extension-base/services/history-service'; -import { ClaimAvailBridgeNotificationMetadata } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; +import { ClaimAvailBridgeNotificationMetadata, NotificationActionType } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; import { EXTENSION_REQUEST_URL } from '@subwallet/extension-base/services/request-service/constants'; import { TRANSACTION_TIMEOUT } from '@subwallet/extension-base/services/transaction-service/constants'; import { parseLiquidStakingEvents, parseLiquidStakingFastUnstakeEvents, parseTransferEventLogs, parseXcmEventLogs } from '@subwallet/extension-base/services/transaction-service/event-parser'; @@ -745,7 +745,11 @@ export default class TransactionService { const extrinsicHash = transaction.extrinsicHash; if (isPolygonBridge) { - this.state.inappNotificationService.writeWaitPolygonBridge(inputData, extrinsicHash) + const actionType = (inputData.originNetworkKey === 'polygonzkEvm_cardona' || inputData.originNetworkKey === 'polygonZkEvm') + ? NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE_L2_TO_L1 + : NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE; + + this.state.inappNotificationService.writeWaitPolygonBridge(inputData, extrinsicHash, actionType) .catch(console.error); } } @@ -971,7 +975,7 @@ export default class TransactionService { eventData.startBlock = await web3Api.eth.getBlockNumber() - 3; // Add start info emitter.emit('send', eventData); // This event is needed after sending transaction with queue - + const txHash = payload; eventData.extrinsicHash = txHash; diff --git a/packages/extension-base/src/types/avail-bridge/index.ts b/packages/extension-base/src/types/avail-bridge/index.ts index 09e6888dbea..2f67a999da6 100644 --- a/packages/extension-base/src/types/avail-bridge/index.ts +++ b/packages/extension-base/src/types/avail-bridge/index.ts @@ -3,7 +3,7 @@ import { _NotificationInfo } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; -export interface RequestClaimAvailBridge { +export interface RequestClaimBridge { address: string, chain: string, notification: _NotificationInfo diff --git a/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/index.tsx b/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/index.tsx index 390b25896d8..eab50c70a46 100644 --- a/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/index.tsx +++ b/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/index.tsx @@ -17,7 +17,7 @@ import { useSelector } from 'react-redux'; import styled from 'styled-components'; import { EvmSignArea, SubstrateSignArea } from '../../parts/Sign'; -import { BaseTransactionConfirmation, BondTransactionConfirmation, CancelUnstakeTransactionConfirmation, ClaimAvailBridgeTransactionConfirmation, ClaimRewardTransactionConfirmation, DefaultWithdrawTransactionConfirmation, FastWithdrawTransactionConfirmation, JoinPoolTransactionConfirmation, JoinYieldPoolConfirmation, LeavePoolTransactionConfirmation, SendNftTransactionConfirmation, SwapTransactionConfirmation, TokenApproveConfirmation, TransferBlock, UnbondTransactionConfirmation, WithdrawTransactionConfirmation } from './variants'; +import { BaseTransactionConfirmation, BondTransactionConfirmation, CancelUnstakeTransactionConfirmation, ClaimBridgeTransactionConfirmation, ClaimRewardTransactionConfirmation, DefaultWithdrawTransactionConfirmation, FastWithdrawTransactionConfirmation, JoinPoolTransactionConfirmation, JoinYieldPoolConfirmation, LeavePoolTransactionConfirmation, SendNftTransactionConfirmation, SwapTransactionConfirmation, TokenApproveConfirmation, TransferBlock, UnbondTransactionConfirmation, WithdrawTransactionConfirmation } from './variants'; interface Props extends ThemeProps { confirmation: ConfirmationQueueItem; @@ -75,7 +75,7 @@ const getTransactionComponent = (extrinsicType: ExtrinsicType): typeof BaseTrans case ExtrinsicType.SWAP: return SwapTransactionConfirmation; case ExtrinsicType.CLAIM_AVAIL_BRIDGE: - return ClaimAvailBridgeTransactionConfirmation; + return ClaimBridgeTransactionConfirmation; case ExtrinsicType.CROWDLOAN: case ExtrinsicType.STAKING_CANCEL_COMPOUNDING: case ExtrinsicType.STAKING_COMPOUNDING: diff --git a/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/ClaimAvailBridge.tsx b/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/ClaimBridge.tsx similarity index 60% rename from packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/ClaimAvailBridge.tsx rename to packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/ClaimBridge.tsx index 12c53e33b66..65325f8ee33 100644 --- a/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/ClaimAvailBridge.tsx +++ b/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/ClaimBridge.tsx @@ -1,14 +1,14 @@ // Copyright 2019-2022 @subwallet/extension-koni-ui authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { ClaimAvailBridgeNotificationMetadata } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; +import { ClaimAvailBridgeNotificationMetadata, ClaimPolygonBridgeNotificationMetadata } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; import { SWTransactionResult } from '@subwallet/extension-base/services/transaction-service/types'; -import { RequestClaimAvailBridge } from '@subwallet/extension-base/types/avail-bridge'; +import { RequestClaimBridge } from '@subwallet/extension-base/types/avail-bridge'; import { CommonTransactionInfo, MetaInfo } from '@subwallet/extension-koni-ui/components'; import { useGetChainAssetInfo, useGetNativeTokenBasicInfo, useTranslation } from '@subwallet/extension-koni-ui/hooks'; import { AlertDialogProps, ThemeProps } from '@subwallet/extension-koni-ui/types'; import CN from 'classnames'; -import React from 'react'; +import React, { useMemo } from 'react'; import styled from 'styled-components'; export interface BaseTransactionConfirmationProps extends ThemeProps { @@ -19,8 +19,27 @@ export interface BaseTransactionConfirmationProps extends ThemeProps { const Component: React.FC = (props: BaseTransactionConfirmationProps) => { const { className, transaction } = props; - const data = transaction.data as RequestClaimAvailBridge; - const metadata = data.notification.metadata as ClaimAvailBridgeNotificationMetadata; + const data = transaction.data as RequestClaimBridge; + + console.log('Data', data); + + const isPolygonBridge = (data.notification?.actionType === 'CLAIM_POLYGON_BRIDGE'); + + const metadata = useMemo(() => { + if (isPolygonBridge) { + return data?.notification?.metadata as ClaimPolygonBridgeNotificationMetadata; + } + + return data?.notification?.metadata as ClaimAvailBridgeNotificationMetadata; + }, [isPolygonBridge, data.notification.metadata]); + + const amountValue = useMemo(() => { + if (!isPolygonBridge && 'amount' in metadata) { + return metadata.amount; + } + + return '0'; + }, [isPolygonBridge, metadata]); const { t } = useTranslation(); @@ -43,7 +62,7 @@ const Component: React.FC = (props: BaseTransa decimals={claimToken.decimals || 0} label={t('Amount')} suffix={claimToken.symbol} - value={metadata.amount} + value={amountValue} /> ) } @@ -58,8 +77,8 @@ const Component: React.FC = (props: BaseTransa ); }; -const ClaimAvailBridgeTransactionConfirmation = styled(Component)(({ theme: { token } }: BaseTransactionConfirmationProps) => { +const ClaimBridgeTransactionConfirmation = styled(Component)(({ theme: { token } }: BaseTransactionConfirmationProps) => { return {}; }); -export default ClaimAvailBridgeTransactionConfirmation; +export default ClaimBridgeTransactionConfirmation; diff --git a/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/index.tsx b/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/index.tsx index fa60bbe0633..5cf1ca4278e 100644 --- a/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/index.tsx +++ b/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/index.tsx @@ -4,7 +4,7 @@ export type { BaseTransactionConfirmationProps } from './Base'; export { default as BaseTransactionConfirmation } from './Base'; export { default as BondTransactionConfirmation } from './Bond'; -export { default as ClaimAvailBridgeTransactionConfirmation } from './ClaimAvailBridge'; +export { default as ClaimBridgeTransactionConfirmation } from './ClaimBridge'; export { default as CancelUnstakeTransactionConfirmation } from './CancelUnstake'; export { default as ClaimRewardTransactionConfirmation } from './ClaimReward'; export { default as JoinPoolTransactionConfirmation } from './JoinPool'; 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 810448df86f..663a551fad7 100644 --- a/packages/extension-koni-ui/src/Popup/Settings/Notifications/Notification.tsx +++ b/packages/extension-koni-ui/src/Popup/Settings/Notifications/Notification.tsx @@ -46,7 +46,9 @@ export enum NotificationIconBackgroundColorMap { CLAIM = 'yellow-7', CLAIM_AVAIL_BRIDGE_ON_AVAIL = 'yellow-7', // temporary set CLAIM_AVAIL_BRIDGE_ON_ETHEREUM = 'yellow-7', - HAVE_TO_WAIT_POLYGON_BRIDGE = 'blue-8' + HAVE_TO_WAIT_POLYGON_BRIDGE = 'blue-8', + HAVE_TO_WAIT_POLYGON_BRIDGE_L2_TO_L1 = 'blue-8', + CLAIM_POLYGON_BRIDGE = 'yellow-7' } export const NotificationIconMap = { @@ -56,7 +58,9 @@ export const NotificationIconMap = { CLAIM: Gift, CLAIM_AVAIL_BRIDGE_ON_AVAIL: Coins, // temporary set CLAIM_AVAIL_BRIDGE_ON_ETHEREUM: Coins, - HAVE_TO_WAIT_POLYGON_BRIDGE: Coins + HAVE_TO_WAIT_POLYGON_BRIDGE: Coins, + HAVE_TO_WAIT_POLYGON_BRIDGE_L2_TO_L1: Coins, + CLAIM_POLYGON_BRIDGE: Coins }; const alertModalId = 'notification-alert-modal'; @@ -343,9 +347,8 @@ function Component ({ className = '' }: Props): React.ReactElement { } case NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_ETHEREUM: - - // eslint-disable-next-line no-fallthrough - case NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_AVAIL: { + case NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_AVAIL: + case NotificationActionType.CLAIM_POLYGON_BRIDGE: { const metadata = item.metadata as ClaimAvailBridgeNotificationMetadata; if (metadata.status === AvailBridgeTransactionStatus.READY_TO_CLAIM) { @@ -357,7 +360,7 @@ function Component ({ className = '' }: Props): React.ReactElement { from: item.address }); switchReadNotificationStatus(switchStatusParams).then(() => { - navigate('/transaction/claim-avail-bridge'); + navigate('/transaction/claim-bridge'); }).catch(console.error); } else { showWarningModal('claimed'); diff --git a/packages/extension-koni-ui/src/Popup/Settings/Notifications/NotificationSetting.tsx b/packages/extension-koni-ui/src/Popup/Settings/Notifications/NotificationSetting.tsx index 9983b940b41..0a06c7e6618 100644 --- a/packages/extension-koni-ui/src/Popup/Settings/Notifications/NotificationSetting.tsx +++ b/packages/extension-koni-ui/src/Popup/Settings/Notifications/NotificationSetting.tsx @@ -28,7 +28,7 @@ interface ShowNoticeOption { value: keyof NotificationSetup['showNotice']; } -const CAN_NOT_CHANGE_SETTING: Array = ['earningClaim', 'earningWithdraw', 'availBridgeClaim']; +const CAN_NOT_CHANGE_SETTING: Array = ['earningClaim', 'earningWithdraw', 'availBridgeClaim', 'polygonBridgeClaim']; const Component = ({ className = '' }: Props): React.ReactElement => { const { token } = useTheme() as Theme; @@ -51,6 +51,10 @@ const Component = ({ className = '' }: Props): React.ReactElement => { { label: t('Claim AVAIL bridge'), value: 'availBridgeClaim' + }, + { + label: t('Claim POLYGON bridge'), + value: 'polygonBridgeClaim' } ]; }, [t]); diff --git a/packages/extension-koni-ui/src/Popup/Transaction/Transaction.tsx b/packages/extension-koni-ui/src/Popup/Transaction/Transaction.tsx index 375493da578..492c0562d70 100644 --- a/packages/extension-koni-ui/src/Popup/Transaction/Transaction.tsx +++ b/packages/extension-koni-ui/src/Popup/Transaction/Transaction.tsx @@ -56,7 +56,7 @@ function Component ({ className }: Props) { return ExtrinsicType.SEND_NFT; case 'swap': return ExtrinsicType.SWAP; - case 'claim-avail-bridge': + case 'claim-bridge': return ExtrinsicType.CLAIM_AVAIL_BRIDGE; case 'send-fund': default: diff --git a/packages/extension-koni-ui/src/Popup/Transaction/variants/ClaimAvailBridge.tsx b/packages/extension-koni-ui/src/Popup/Transaction/variants/ClaimBridge.tsx similarity index 77% rename from packages/extension-koni-ui/src/Popup/Transaction/variants/ClaimAvailBridge.tsx rename to packages/extension-koni-ui/src/Popup/Transaction/variants/ClaimBridge.tsx index e993f3d1e95..57f1879c875 100644 --- a/packages/extension-koni-ui/src/Popup/Transaction/variants/ClaimAvailBridge.tsx +++ b/packages/extension-koni-ui/src/Popup/Transaction/variants/ClaimBridge.tsx @@ -3,12 +3,12 @@ import { _ChainAsset } from '@subwallet/chain-list/types'; import { AmountData, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes'; -import { _NotificationInfo, ClaimAvailBridgeNotificationMetadata } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; +import { _NotificationInfo, ClaimAvailBridgeNotificationMetadata, ClaimPolygonBridgeNotificationMetadata } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; import { AccountSelector, HiddenInput, MetaInfo, PageWrapper } from '@subwallet/extension-koni-ui/components'; import { useGetChainAssetInfo, useGetChainPrefixBySlug, useHandleSubmitTransaction, useInitValidateTransaction, usePreCheckAction, useRestoreTransaction, useSelector, useTransactionContext, useWatchTransaction } from '@subwallet/extension-koni-ui/hooks'; -import { submitClaimAvailBridge } from '@subwallet/extension-koni-ui/messaging/transaction/avail-bridge'; +import { submitClaimAvailBridge, submitClaimPolygonBridge } from '@subwallet/extension-koni-ui/messaging/transaction/bridge'; import { getInappNotification } from '@subwallet/extension-koni-ui/messaging/transaction/notification'; -import { ClaimAvailBridgeParams, FormCallbacks, FormFieldData, ThemeProps } from '@subwallet/extension-koni-ui/types'; +import { ClaimBridgeParams, FormCallbacks, FormFieldData, ThemeProps } from '@subwallet/extension-koni-ui/types'; import { convertFieldToObject, simpleCheckForm } from '@subwallet/extension-koni-ui/utils'; import { Button, Form, Icon } from '@subwallet/react-ui'; import CN from 'classnames'; @@ -25,22 +25,38 @@ interface ComponentProps { notification: _NotificationInfo; } -const hideFields: Array = ['chain', 'notificationId', 'asset']; -const validateFields: Array = ['from']; +const hideFields: Array = ['chain', 'notificationId', 'asset']; +const validateFields: Array = ['from']; const Component: React.FC = (props: ComponentProps) => { const navigate = useNavigate(); const { notification } = props; - const { defaultData, persistData } = useTransactionContext(); + const { defaultData, persistData } = useTransactionContext(); - const [form] = Form.useForm(); - const formDefault = useMemo((): ClaimAvailBridgeParams => ({ ...defaultData }), [defaultData]); + const [form] = Form.useForm(); + const formDefault = useMemo((): ClaimBridgeParams => ({ ...defaultData }), [defaultData]); const { accounts } = useSelector((state) => state.accountState); const { chainInfoMap } = useSelector((state) => state.chainStore); - const metadata = notification?.metadata as ClaimAvailBridgeNotificationMetadata; + const isPolygonBridge = (notification?.actionType === 'CLAIM_POLYGON_BRIDGE'); + + const metadata = useMemo(() => { + if (isPolygonBridge) { + return notification?.metadata as ClaimPolygonBridgeNotificationMetadata; + } + + return notification?.metadata as ClaimAvailBridgeNotificationMetadata; + }, [isPolygonBridge, notification]); + + const amountValue = useMemo(() => { + if (!isPolygonBridge && 'amount' in metadata) { + return metadata.amount; + } + + return '0'; + }, [isPolygonBridge, metadata]); const fromValue = useWatchTransaction('from', form, defaultData); const chainValue = useWatchTransaction('chain', form, defaultData); @@ -68,11 +84,11 @@ const Component: React.FC = (props: ComponentProps) => { navigate('/home/tokens'); }, [navigate]); - const onFieldsChange: FormCallbacks['onFieldsChange'] = useCallback((changedFields: FormFieldData[], allFields: FormFieldData[]) => { + const onFieldsChange: FormCallbacks['onFieldsChange'] = useCallback((changedFields: FormFieldData[], allFields: FormFieldData[]) => { // TODO: field change const { empty, error } = simpleCheckForm(allFields, ['--asset']); - const allMap = convertFieldToObject(allFields); + const allMap = convertFieldToObject(allFields); setIsDisable(error || empty); persistData(allMap); @@ -80,13 +96,15 @@ const Component: React.FC = (props: ComponentProps) => { const { t } = useTranslation(); - const onSubmit: FormCallbacks['onFinish'] = useCallback((values: ClaimAvailBridgeParams) => { + const onSubmit: FormCallbacks['onFinish'] = useCallback((values: ClaimBridgeParams) => { setLoading(true); const { chain, from } = values; + const submitClaim = isPolygonBridge ? submitClaimPolygonBridge : submitClaimAvailBridge; + setTimeout(() => { - submitClaimAvailBridge({ + submitClaim({ address: from, chain: chain, notification @@ -97,7 +115,7 @@ const Component: React.FC = (props: ComponentProps) => { setLoading(false); }); }, 300); - }, [notification, onError, onSuccess]); + }, [isPolygonBridge, notification, onError, onSuccess]); const checkAction = usePreCheckAction(fromValue); @@ -137,7 +155,7 @@ const Component: React.FC = (props: ComponentProps) => { /> = (props: ComponentProps) => { decimals={decimals} label={t('Amount')} suffix={symbol} - value={metadata.amount} + value={ amountValue } /> ) } @@ -196,7 +214,7 @@ const Wrapper: React.FC = (props: Props) => { const navigate = useNavigate(); - const { defaultData } = useTransactionContext(); + const { defaultData } = useTransactionContext(); const { notificationId } = defaultData; const [notification, setNotification] = useState<_NotificationInfo>(); @@ -228,7 +246,7 @@ const Wrapper: React.FC = (props: Props) => { ); }; -const ClaimAvailBridge = styled(Wrapper)(({ theme: { token } }: Props) => { +const ClaimBridge = styled(Wrapper)(({ theme: { token } }: Props) => { return { '&.page-wrapper': { height: 'auto', @@ -246,10 +264,10 @@ const ClaimAvailBridge = styled(Wrapper)(({ theme: { token } }: Props) => marginTop: token.paddingSM }, - '.claim-avail-bridge-meta-info': { + '.claim-bridge-meta-info': { marginTop: token.marginXXS } }; }); -export default ClaimAvailBridge; +export default ClaimBridge; diff --git a/packages/extension-koni-ui/src/Popup/router.tsx b/packages/extension-koni-ui/src/Popup/router.tsx index 04d7fb2a2f5..d5555ef1596 100644 --- a/packages/extension-koni-ui/src/Popup/router.tsx +++ b/packages/extension-koni-ui/src/Popup/router.tsx @@ -121,7 +121,7 @@ const Unstake = new LazyLoader('Unstake', () => import('@subwallet/extension-kon const CancelUnstake = new LazyLoader('CancelUnstake', () => import('@subwallet/extension-koni-ui/Popup/Transaction/variants/CancelUnstake')); const ClaimReward = new LazyLoader('ClaimReward', () => import('@subwallet/extension-koni-ui/Popup/Transaction/variants/ClaimReward')); const Withdraw = new LazyLoader('Withdraw', () => import('@subwallet/extension-koni-ui/Popup/Transaction/variants/Withdraw')); -const ClaimAvailBridge = new LazyLoader('ClaimAvailBridge', () => import('@subwallet/extension-koni-ui/Popup/Transaction/variants/ClaimAvailBridge')); +const ClaimBridge = new LazyLoader('ClaimBridge', () => import('@subwallet/extension-koni-ui/Popup/Transaction/variants/ClaimBridge')); // Earning @@ -208,7 +208,7 @@ export const router = createHashRouter([ CancelUnstake.generateRouterObject('cancel-unstake'), ClaimReward.generateRouterObject('claim-reward'), Withdraw.generateRouterObject('withdraw'), - ClaimAvailBridge.generateRouterObject('claim-avail-bridge'), + ClaimBridge.generateRouterObject('claim-bridge'), { path: 'compound', element: diff --git a/packages/extension-koni-ui/src/constants/localStorage.ts b/packages/extension-koni-ui/src/constants/localStorage.ts index 658b2f6affe..ec0231d4b49 100644 --- a/packages/extension-koni-ui/src/constants/localStorage.ts +++ b/packages/extension-koni-ui/src/constants/localStorage.ts @@ -18,7 +18,7 @@ export const UN_STAKE_TRANSACTION = 'transaction.un-stake'; export const CANCEL_UN_STAKE_TRANSACTION = 'transaction.cancel-un-stake'; export const WITHDRAW_TRANSACTION = 'transaction.withdraw'; export const CLAIM_REWARD_TRANSACTION = 'transaction.claim-reward'; -export const CLAIM_AVAIL_BRIDGE_TRANSACTION = 'transaction.claim-avail-bridge'; +export const CLAIM_AVAIL_BRIDGE_TRANSACTION = 'transaction.claim-bridge'; export const TRANSACTION_STORAGES = [TRANSFER_TRANSACTION, NFT_TRANSACTION, EARN_TRANSACTION, UN_STAKE_TRANSACTION, CANCEL_UN_STAKE_TRANSACTION, WITHDRAW_TRANSACTION, CLAIM_REWARD_TRANSACTION, SWAP_TRANSACTION]; diff --git a/packages/extension-koni-ui/src/constants/transaction.ts b/packages/extension-koni-ui/src/constants/transaction.ts index 4741abee2dc..3287866c477 100644 --- a/packages/extension-koni-ui/src/constants/transaction.ts +++ b/packages/extension-koni-ui/src/constants/transaction.ts @@ -3,7 +3,7 @@ import { ExtrinsicType, StakingType } from '@subwallet/extension-base/background/KoniTypes'; import { detectTranslate } from '@subwallet/extension-base/utils'; -import { CancelUnStakeParams, ClaimAvailBridgeParams, ClaimRewardParams, EarnParams, SendNftParams, StakeParams, SwapParams, TransactionFormBaseProps, TransferParams, UnStakeParams, WithdrawParams } from '@subwallet/extension-koni-ui/types'; +import { CancelUnStakeParams, ClaimBridgeParams, ClaimRewardParams, EarnParams, SendNftParams, StakeParams, SwapParams, TransactionFormBaseProps, TransferParams, UnStakeParams, WithdrawParams } from '@subwallet/extension-koni-ui/types'; import { ALL_KEY } from './common'; @@ -143,7 +143,7 @@ export const DEFAULT_SWAP_PARAMS: SwapParams = { defaultSlug: '' }; -export const DEFAULT_CLAIM_AVAIL_BRIDGE_PARAMS: ClaimAvailBridgeParams = { +export const DEFAULT_CLAIM_AVAIL_BRIDGE_PARAMS: ClaimBridgeParams = { ...DEFAULT_TRANSACTION_PARAMS, notificationId: '' }; diff --git a/packages/extension-koni-ui/src/messaging/transaction/avail-bridge.ts b/packages/extension-koni-ui/src/messaging/transaction/bridge.ts similarity index 57% rename from packages/extension-koni-ui/src/messaging/transaction/avail-bridge.ts rename to packages/extension-koni-ui/src/messaging/transaction/bridge.ts index 69f76ef58bc..c1b8c10bc6d 100644 --- a/packages/extension-koni-ui/src/messaging/transaction/avail-bridge.ts +++ b/packages/extension-koni-ui/src/messaging/transaction/bridge.ts @@ -1,9 +1,13 @@ // Copyright 2019-2022 @subwallet/extension-koni-ui authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { RequestClaimAvailBridge } from '@subwallet/extension-base/types/avail-bridge'; +import { RequestClaimBridge } from '@subwallet/extension-base/types/avail-bridge'; import { sendMessage } from '@subwallet/extension-koni-ui/messaging'; -export async function submitClaimAvailBridge (data: RequestClaimAvailBridge) { +export async function submitClaimAvailBridge (data: RequestClaimBridge) { return sendMessage('pri(availBridge.submitClaimAvailBridgeOnAvail)', data); } + +export async function submitClaimPolygonBridge (data: RequestClaimBridge) { + return sendMessage('pri(polygonBridge.submitClaimPolygonBridge)', data); +} diff --git a/packages/extension-koni-ui/src/types/transaction.ts b/packages/extension-koni-ui/src/types/transaction.ts index ed4017e8d30..992442495c3 100644 --- a/packages/extension-koni-ui/src/types/transaction.ts +++ b/packages/extension-koni-ui/src/types/transaction.ts @@ -67,6 +67,6 @@ export interface SwapParams extends TransactionFormBaseProps { defaultSlug: string; } -export interface ClaimAvailBridgeParams extends TransactionFormBaseProps { +export interface ClaimBridgeParams extends TransactionFormBaseProps { notificationId: string; } From 542355524c194c9f3f50bdceb55e7d462d5be4bf Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Mon, 18 Nov 2024 18:52:34 +0700 Subject: [PATCH 067/204] [Chore] Fix lint --- packages/extension-base/src/background/KoniTypes.ts | 1 - .../extension-base/src/koni/background/handlers/Extension.ts | 3 +-- .../src/services/inapp-notification-service/consts.ts | 2 +- .../src/services/inapp-notification-service/index.ts | 4 +++- .../extension-base/src/services/transaction-service/index.ts | 2 +- .../variants/Transaction/variants/ClaimBridge.tsx | 2 -- .../src/Popup/Settings/Notifications/Notification.tsx | 4 +++- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/extension-base/src/background/KoniTypes.ts b/packages/extension-base/src/background/KoniTypes.ts index 84213f28110..f2e865c1866 100644 --- a/packages/extension-base/src/background/KoniTypes.ts +++ b/packages/extension-base/src/background/KoniTypes.ts @@ -2274,7 +2274,6 @@ export interface KoniRequestSignatures { 'pri(polygonBridge.submitClaimPolygonBridge)': [RequestClaimBridge, SWTransactionResponse] /* Polygon Bridge */ - /* Ledger */ 'pri(ledger.generic.allow)': [null, string[], string[]]; } diff --git a/packages/extension-base/src/koni/background/handlers/Extension.ts b/packages/extension-base/src/koni/background/handlers/Extension.ts index e26662e686a..1b0e114f46e 100644 --- a/packages/extension-base/src/koni/background/handlers/Extension.ts +++ b/packages/extension-base/src/koni/background/handlers/Extension.ts @@ -3832,12 +3832,11 @@ export default class KoniExtension { const extrinsicType = ExtrinsicType.CLAIM_AVAIL_BRIDGE; let transaction: SubmittableExtrinsic<'promise'> | TransactionConfig | null = null; - let chainType: ChainType; const evmApi = this.#koniState.getEvmApi(chain); transaction = await getClaimPolygonBridge(chain, notification, evmApi); - chainType = ChainType.EVM; + const chainType: ChainType = ChainType.EVM; return await this.#koniState.transactionService.handleTransaction({ address, diff --git a/packages/extension-base/src/services/inapp-notification-service/consts.ts b/packages/extension-base/src/services/inapp-notification-service/consts.ts index 56a2b57ef14..18cfacc00de 100644 --- a/packages/extension-base/src/services/inapp-notification-service/consts.ts +++ b/packages/extension-base/src/services/inapp-notification-service/consts.ts @@ -13,7 +13,7 @@ export const NotificationTitleMap = { [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_ETHEREUM]: '[{{accountName}}] CLAIM {{tokenSymbol}}', [NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE]: '[{{accountName}}] BRIDGE {{tokenSymbol}}', [NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE_L2_TO_L1]: '[{{accountName}}] BRIDGE {{tokenSymbol}}', - [NotificationActionType.CLAIM_POLYGON_BRIDGE]: '[{{accountName}}] CLAIM {{tokenSymbol}}', + [NotificationActionType.CLAIM_POLYGON_BRIDGE]: '[{{accountName}}] CLAIM {{tokenSymbol}}' }; export const NotificationDescriptionMap = { diff --git a/packages/extension-base/src/services/inapp-notification-service/index.ts b/packages/extension-base/src/services/inapp-notification-service/index.ts index 82f9dadb835..d7462ff72b2 100644 --- a/packages/extension-base/src/services/inapp-notification-service/index.ts +++ b/packages/extension-base/src/services/inapp-notification-service/index.ts @@ -167,7 +167,9 @@ export class InappNotificationService implements CronServiceInterface { this.createAvailBridgeClaimNotification(); - this.createPolygonClaimableTransactions(); + this.createPolygonClaimableTransactions().catch((err) => { + console.error('Error:', err); + }); this.refeshAvailBridgeClaimTimeOut = setTimeout(this.cronCreateBridgeClaimNotification.bind(this), CRON_LISTEN_AVAIL_BRIDGE_CLAIM); } diff --git a/packages/extension-base/src/services/transaction-service/index.ts b/packages/extension-base/src/services/transaction-service/index.ts index 6eab04ea840..10468110014 100644 --- a/packages/extension-base/src/services/transaction-service/index.ts +++ b/packages/extension-base/src/services/transaction-service/index.ts @@ -975,7 +975,7 @@ export default class TransactionService { eventData.startBlock = await web3Api.eth.getBlockNumber() - 3; // Add start info emitter.emit('send', eventData); // This event is needed after sending transaction with queue - + const txHash = payload; eventData.extrinsicHash = txHash; diff --git a/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/ClaimBridge.tsx b/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/ClaimBridge.tsx index 65325f8ee33..dfde68abb42 100644 --- a/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/ClaimBridge.tsx +++ b/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/ClaimBridge.tsx @@ -21,8 +21,6 @@ const Component: React.FC = (props: BaseTransa const { className, transaction } = props; const data = transaction.data as RequestClaimBridge; - console.log('Data', data); - const isPolygonBridge = (data.notification?.actionType === 'CLAIM_POLYGON_BRIDGE'); const metadata = useMemo(() => { 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 663a551fad7..e11d2e33a09 100644 --- a/packages/extension-koni-ui/src/Popup/Settings/Notifications/Notification.tsx +++ b/packages/extension-koni-ui/src/Popup/Settings/Notifications/Notification.tsx @@ -347,7 +347,9 @@ function Component ({ className = '' }: Props): React.ReactElement { } case NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_ETHEREUM: - case NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_AVAIL: + case NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_AVAIL: + + // eslint-disable-next-line no-fallthrough case NotificationActionType.CLAIM_POLYGON_BRIDGE: { const metadata = item.metadata as ClaimAvailBridgeNotificationMetadata; From 0e5a12663fa1df1406381de41e299dadecdf8727 Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Wed, 20 Nov 2024 10:35:13 +0700 Subject: [PATCH 068/204] [Add] Extension - Handle Polygon Bridge Noti --- .../src/background/KoniTypes.ts | 7 ++- .../src/core/substrate/xcm-parser.ts | 12 ++-- .../src/koni/background/handlers/Extension.ts | 18 ++++-- .../transfer/xcm/polygonBridge.ts | 20 ++++-- .../inapp-notification-service/index.ts | 62 +++++++++++++------ .../inapp-notification-service/interfaces.ts | 20 +++--- .../inapp-notification-service/utils/avail.ts | 14 ++--- .../utils/polygon.ts | 25 ++++++-- .../src/services/setting-service/constants.ts | 3 +- .../src/services/transaction-service/index.ts | 4 +- .../src/types/notification/index.ts | 6 ++ .../src/utils/account/transform.ts | 2 +- .../src/Popup/Confirmations/index.tsx | 2 +- .../variants/Transaction/index.tsx | 2 +- .../Transaction/variants/ClaimBridge.tsx | 4 +- .../src/Popup/Home/History/index.tsx | 4 +- .../Settings/Notifications/Notification.tsx | 46 +++++++++++--- .../src/Popup/Transaction/Transaction.tsx | 2 +- .../Transaction/variants/ClaimBridge.tsx | 6 +- .../Modal/NotificationDetailModal.tsx | 2 +- .../src/constants/history.ts | 2 +- .../src/constants/localStorage.ts | 2 +- .../src/constants/transaction.ts | 2 +- .../src/messaging/transaction/notification.ts | 6 +- .../src/utils/transaction/persist.ts | 6 +- 25 files changed, 194 insertions(+), 85 deletions(-) diff --git a/packages/extension-base/src/background/KoniTypes.ts b/packages/extension-base/src/background/KoniTypes.ts index f2e865c1866..79af791bf46 100644 --- a/packages/extension-base/src/background/KoniTypes.ts +++ b/packages/extension-base/src/background/KoniTypes.ts @@ -17,7 +17,7 @@ import { SWTransactionResponse, SWTransactionResult } from '@subwallet/extension import { WalletConnectNotSupportRequest, WalletConnectSessionRequest } from '@subwallet/extension-base/services/wallet-connect-service/types'; import { AccountJson, AccountsWithCurrentAddress, AddressJson, BalanceJson, BaseRequestSign, BuyServiceInfo, BuyTokenInfo, CommonOptimalPath, CurrentAccountInfo, EarningRewardHistoryItem, EarningRewardJson, EarningStatus, HandleYieldStepParams, InternalRequestSign, LeavePoolAdditionalData, NominationPoolInfo, OptimalYieldPath, OptimalYieldPathParams, RequestAccountBatchExportV2, RequestAccountCreateSuriV2, RequestAccountNameValidate, RequestAccountProxyEdit, RequestAccountProxyForget, RequestBatchJsonGetAccountInfo, RequestBatchRestoreV2, RequestBounceableValidate, RequestChangeTonWalletContractVersion, RequestCheckCrossChainTransfer, RequestCheckPublicAndSecretKey, RequestCheckTransfer, RequestCrossChainTransfer, RequestDeriveCreateMultiple, RequestDeriveCreateV3, RequestDeriveValidateV2, RequestEarlyValidateYield, RequestExportAccountProxyMnemonic, RequestGetAllTonWalletContractVersion, RequestGetDeriveAccounts, RequestGetDeriveSuggestion, RequestGetYieldPoolTargets, RequestInputAccountSubscribe, RequestJsonGetAccountInfo, RequestJsonRestoreV2, RequestMetadataHash, RequestMnemonicCreateV2, RequestMnemonicValidateV2, RequestPrivateKeyValidateV2, RequestShortenMetadata, RequestStakeCancelWithdrawal, RequestStakeClaimReward, RequestTransfer, RequestUnlockDotCheckCanMint, RequestUnlockDotSubscribeMintedData, RequestYieldLeave, RequestYieldStepSubmit, RequestYieldWithdrawal, ResponseAccountBatchExportV2, ResponseAccountCreateSuriV2, ResponseAccountNameValidate, ResponseBatchJsonGetAccountInfo, ResponseCheckPublicAndSecretKey, ResponseDeriveValidateV2, ResponseEarlyValidateYield, ResponseExportAccountProxyMnemonic, ResponseGetAllTonWalletContractVersion, ResponseGetDeriveAccounts, ResponseGetDeriveSuggestion, ResponseGetYieldPoolTargets, ResponseInputAccountSubscribe, ResponseJsonGetAccountInfo, ResponseMetadataHash, ResponseMnemonicCreateV2, ResponseMnemonicValidateV2, ResponsePrivateKeyValidateV2, ResponseShortenMetadata, StorageDataInterface, SubmitYieldStepData, SwapPair, SwapQuoteResponse, SwapRequest, SwapRequestResult, SwapSubmitParams, SwapTxData, TokenSpendingApprovalParams, UnlockDotTransactionNft, UnstakingStatus, ValidateSwapProcessParams, ValidateYieldProcessParams, YieldPoolInfo, YieldPositionInfo } from '@subwallet/extension-base/types'; import { RequestClaimBridge } from '@subwallet/extension-base/types/avail-bridge'; -import { GetNotificationParams, RequestSwitchStatusParams } from '@subwallet/extension-base/types/notification'; +import { GetNotificationParams, RequestIsClaimedPolygonBridge, RequestSwitchStatusParams } from '@subwallet/extension-base/types/notification'; import { InjectedAccount, InjectedAccountWithMeta, MetadataDefBase } from '@subwallet/extension-inject/types'; import { KeyringPair$Meta } from '@subwallet/keyring/types'; import { KeyringOptions } from '@subwallet/ui-keyring/options/types'; @@ -509,7 +509,7 @@ export enum ExtrinsicType { SWAP = 'swap', - CLAIM_AVAIL_BRIDGE = 'claim.claim_avail_bridge', + CLAIM_BRIDGE = 'claim.claim_bridge', // SET_FEE_TOKEN = 'set_fee-token', @@ -564,7 +564,7 @@ export interface ExtrinsicDataTypeMap { [ExtrinsicType.TOKEN_SPENDING_APPROVAL]: TokenSpendingApprovalParams, - [ExtrinsicType.CLAIM_AVAIL_BRIDGE]: RequestClaimBridge + [ExtrinsicType.CLAIM_BRIDGE]: RequestClaimBridge [ExtrinsicType.EVM_EXECUTE]: TransactionConfig, [ExtrinsicType.CROWDLOAN]: any, @@ -2264,6 +2264,7 @@ export interface KoniRequestSignatures { 'pri(inappNotification.switchReadNotificationStatus)': [RequestSwitchStatusParams, null]; 'pri(inappNotification.fetch)': [GetNotificationParams, _NotificationInfo[]]; 'pri(inappNotification.get)': [string, _NotificationInfo]; + 'pri(inappNotification.isClaimedPolygonBridge)': [RequestIsClaimedPolygonBridge, boolean] /* Notification Service */ /* Avail Bridge */ diff --git a/packages/extension-base/src/core/substrate/xcm-parser.ts b/packages/extension-base/src/core/substrate/xcm-parser.ts index dd521916e43..6b419886a1e 100644 --- a/packages/extension-base/src/core/substrate/xcm-parser.ts +++ b/packages/extension-base/src/core/substrate/xcm-parser.ts @@ -63,7 +63,7 @@ export function _getXcmMultiLocation (originChainInfo: _ChainInfo, destChainInfo } export function _isXcmTransferUnstable (originChainInfo: _ChainInfo, destChainInfo: _ChainInfo, assetSlug: string): boolean { - return !_isXcmWithinSameConsensus(originChainInfo, destChainInfo) || _isMythosFromHydrationToMythos(originChainInfo, destChainInfo, assetSlug); + return !_isXcmWithinSameConsensus(originChainInfo, destChainInfo) || _isMythosFromHydrationToMythos(originChainInfo, destChainInfo, assetSlug) || _isPolygonBridgeXcm(originChainInfo, destChainInfo); } function getAssetHubBridgeUnstableWarning (originChainInfo: _ChainInfo): string { @@ -96,13 +96,17 @@ function getAvailBridgeWarning (): string { return 'Cross-chain transfer of this token may take up to 90 minutes, and you’ll need to manually claim the funds on the destination network to complete the transfer. Do you still want to continue?'; } -function getPolygonBridgeWarning (): string { - return 'Cross-chain transfer of this token may take up to 90 minutes, and you’ll need to manually claim the funds on the destination network to complete the transfer. Do you still want to continue?'; +function getPolygonBridgeWarning (originChainInfo: _ChainInfo): string { + if (originChainInfo.slug === COMMON_CHAIN_SLUGS.ETHEREUM || originChainInfo.slug === COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA) { + return 'Cross-chain transfer of this token may take up to 30 minutes, and you’ll need to manually claim the funds on the destination network to complete the transfer. Do you still want to continue?'; + } else { + return 'Cross-chain transfer of this token may take up to 180 minutes, and you’ll need to manually claim the funds on the destination network to complete the transfer. Do you still want to continue?'; + } } export function _getXcmUnstableWarning (originChainInfo: _ChainInfo, destChainInfo: _ChainInfo, assetSlug: string): string { if (_isPolygonBridgeXcm(originChainInfo, destChainInfo)) { - return getPolygonBridgeWarning(); + return getPolygonBridgeWarning(originChainInfo); } else if (_isAvailBridgeXcm(originChainInfo, destChainInfo)) { return getAvailBridgeWarning(); } else if (_isSnowBridgeXcm(originChainInfo, destChainInfo)) { diff --git a/packages/extension-base/src/koni/background/handlers/Extension.ts b/packages/extension-base/src/koni/background/handlers/Extension.ts index 1b0e114f46e..6d55932e720 100644 --- a/packages/extension-base/src/koni/background/handlers/Extension.ts +++ b/packages/extension-base/src/koni/background/handlers/Extension.ts @@ -32,7 +32,7 @@ import { createTransferExtrinsic, getTransferMockTxFee } from '@subwallet/extens import { createTonTransaction } from '@subwallet/extension-base/services/balance-service/transfer/ton-transfer'; import { createAvailBridgeExtrinsicFromAvail, createAvailBridgeTxFromEth, createPolygonBridgeExtrinsic, createSnowBridgeExtrinsic, createXcmExtrinsic, CreateXcmExtrinsicProps, FunctionCreateXcmExtrinsic, getXcmMockTxFee } from '@subwallet/extension-base/services/balance-service/transfer/xcm'; import { getClaimTxOnAvail, getClaimTxOnEthereum, isAvailChainBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge'; -import { _isPolygonChainBridge, getClaimPolygonBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge'; +import { _isPolygonChainBridge, getClaimPolygonBridge, isClaimedPolygonBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge'; import { _API_OPTIONS_CHAIN_GROUP, _DEFAULT_MANTA_ZK_CHAIN, _MANTA_ZK_CHAIN_GROUP, _ZK_ASSET_PREFIX } from '@subwallet/extension-base/services/chain-service/constants'; import { _ChainApiStatus, _ChainConnectionStatus, _ChainState, _NetworkUpsertParams, _ValidateCustomAssetRequest, _ValidateCustomAssetResponse, EnableChainParams, EnableMultiChainParams } from '@subwallet/extension-base/services/chain-service/types'; import { _getAssetDecimals, _getAssetSymbol, _getChainNativeTokenBasicInfo, _getContractAddressOfToken, _getEvmChainId, _isAssetSmartContractNft, _isChainEvmCompatible, _isChainTonCompatible, _isCustomAsset, _isLocalToken, _isMantaZkAsset, _isNativeToken, _isPureEvmChain, _isTokenEvmSmartContract, _isTokenTransferredByEvm, _isTokenTransferredByTon } from '@subwallet/extension-base/services/chain-service/utils'; @@ -50,7 +50,7 @@ import { AccountsStore } from '@subwallet/extension-base/stores'; import { AccountJson, AccountProxyMap, AccountsWithCurrentAddress, BalanceJson, BasicTxErrorType, BasicTxWarningCode, BuyServiceInfo, BuyTokenInfo, EarningRewardJson, NominationPoolInfo, OptimalYieldPathParams, RequestAccountBatchExportV2, RequestAccountCreateSuriV2, RequestAccountNameValidate, RequestBatchJsonGetAccountInfo, RequestBatchRestoreV2, RequestBounceableValidate, RequestChangeTonWalletContractVersion, RequestCheckPublicAndSecretKey, RequestCrossChainTransfer, RequestDeriveCreateMultiple, RequestDeriveCreateV3, RequestDeriveValidateV2, RequestEarlyValidateYield, RequestExportAccountProxyMnemonic, RequestGetAllTonWalletContractVersion, RequestGetDeriveAccounts, RequestGetDeriveSuggestion, RequestGetYieldPoolTargets, RequestInputAccountSubscribe, RequestJsonGetAccountInfo, RequestJsonRestoreV2, RequestMetadataHash, RequestMnemonicCreateV2, RequestMnemonicValidateV2, RequestPrivateKeyValidateV2, RequestShortenMetadata, RequestStakeCancelWithdrawal, RequestStakeClaimReward, RequestTransfer, RequestUnlockDotCheckCanMint, RequestUnlockDotSubscribeMintedData, RequestYieldLeave, RequestYieldStepSubmit, RequestYieldWithdrawal, ResponseAccountBatchExportV2, ResponseAccountCreateSuriV2, ResponseAccountNameValidate, ResponseBatchJsonGetAccountInfo, ResponseCheckPublicAndSecretKey, ResponseDeriveValidateV2, ResponseExportAccountProxyMnemonic, ResponseGetAllTonWalletContractVersion, ResponseGetDeriveAccounts, ResponseGetDeriveSuggestion, ResponseGetYieldPoolTargets, ResponseInputAccountSubscribe, ResponseJsonGetAccountInfo, ResponseMetadataHash, ResponseMnemonicCreateV2, ResponseMnemonicValidateV2, ResponsePrivateKeyValidateV2, ResponseShortenMetadata, StakingTxErrorType, StorageDataInterface, TokenSpendingApprovalParams, ValidateYieldProcessParams, YieldPoolType } from '@subwallet/extension-base/types'; import { RequestAccountProxyEdit, RequestAccountProxyForget } from '@subwallet/extension-base/types/account/action/edit'; import { RequestClaimBridge } from '@subwallet/extension-base/types/avail-bridge'; -import { GetNotificationParams, RequestSwitchStatusParams } from '@subwallet/extension-base/types/notification'; +import { GetNotificationParams, RequestIsClaimedPolygonBridge, RequestSwitchStatusParams } from '@subwallet/extension-base/types/notification'; import { CommonOptimalPath } from '@subwallet/extension-base/types/service-base'; import { SwapPair, SwapQuoteResponse, SwapRequest, SwapRequestResult, SwapSubmitParams, ValidateSwapProcessParams } from '@subwallet/extension-base/types/swap'; import { _analyzeAddress, BN_ZERO, combineAllAccountProxy, createTransactionFromRLP, isSameAddress, MODULE_SUPPORT, reformatAddress, signatureToHex, Transaction as QrTransaction, transformAccounts, transformAddresses, uniqueStringArray } from '@subwallet/extension-base/utils'; @@ -3800,7 +3800,7 @@ export default class KoniExtension { private async submitClaimAvailBridge (data: RequestClaimBridge) { const { address, chain, notification } = data; - const extrinsicType = ExtrinsicType.CLAIM_AVAIL_BRIDGE; + const extrinsicType = ExtrinsicType.CLAIM_BRIDGE; let transaction: SubmittableExtrinsic<'promise'> | TransactionConfig | null = null; let chainType: ChainType; @@ -3827,9 +3827,17 @@ export default class KoniExtension { }); } + private async getIsClaimedPolygonBridge (data: RequestIsClaimedPolygonBridge) { + 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); + + return isClaimed; + } + private async submitClaimPolygonBridge (data: RequestClaimBridge) { const { address, chain, notification } = data; - const extrinsicType = ExtrinsicType.CLAIM_AVAIL_BRIDGE; + const extrinsicType = ExtrinsicType.CLAIM_BRIDGE; let transaction: SubmittableExtrinsic<'promise'> | TransactionConfig | null = null; @@ -4450,6 +4458,8 @@ export default class KoniExtension { return this.fetchInappNotifications(request as GetNotificationParams); case 'pri(inappNotification.get)': return this.getInappNotification(request as string); + case 'pri(inappNotification.isClaimedPolygonBridge)': + return this.getIsClaimedPolygonBridge(request as RequestIsClaimedPolygonBridge); /* Notification service */ /* Avail Bridge */ 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 cc27e4e020d..c97eef8d76c 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 @@ -1,6 +1,7 @@ // Copyright 2019-2022 @subwallet/extension-base // SPDX-License-Identifier: Apache-2.0 +import { COMMON_CHAIN_SLUGS } from '@subwallet/chain-list'; import { _ChainAsset, _ChainInfo } from '@subwallet/chain-list/types'; import { getWeb3Contract } from '@subwallet/extension-base/koni/api/contract-handler/evm/web3'; import { _POLYGON_BRIDGE_ABI, getPolygonBridgeContract } from '@subwallet/extension-base/koni/api/contract-handler/utils'; @@ -98,8 +99,9 @@ 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 === 'sepolia_ethereum'; + const isTestnet = chainSlug === COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA; const proofDomain = isTestnet ? POLYGON_PROOF_INDEXER.TESTNET : POLYGON_PROOF_INDEXER.MAINNET; + const proofResponse = await fetch(`${proofDomain}?networkId=${metadata.sourceNetwork}&depositCount=${metadata.counter}`) .then((res) => res.json()) as ClaimNotification; const proof = proofResponse.proof; @@ -127,14 +129,22 @@ export async function getClaimPolygonBridge (chainSlug: string, notification: _N return transactionConfig; } +export async function isClaimedPolygonBridge (chainSlug: string, counter: number, sourceNetwork: number, evmApi: _EvmApi) { + const polygonBridgeContractAddress = getPolygonBridgeContract(chainSlug); + const polygonBridgeContract = getWeb3Contract(polygonBridgeContractAddress, evmApi, _POLYGON_BRIDGE_ABI); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-member-access + return await polygonBridgeContract.methods.isClaimed(counter, sourceNetwork).call(); +} + export function _isPolygonChainBridge (srcChain: string, destChain: string): boolean { - if (srcChain === 'polygonzkEvm_cardona' && destChain === 'sepolia_ethereum') { + if (srcChain === 'polygonzkEvm_cardona' && destChain === COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA) { return true; - } else if (srcChain === 'sepolia_ethereum' && destChain === 'polygonzkEvm_cardona') { + } else if (srcChain === COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA && destChain === 'polygonzkEvm_cardona') { return true; - } else if (srcChain === 'polygonZkEvm' && destChain === 'ethereum') { + } else if (srcChain === 'polygonZkEvm' && destChain === COMMON_CHAIN_SLUGS.ETHEREUM) { return true; - } else if (srcChain === 'ethereum' && destChain === 'polygonZkEvm') { + } else if (srcChain === COMMON_CHAIN_SLUGS.ETHEREUM && destChain === 'polygonZkEvm') { return true; } diff --git a/packages/extension-base/src/services/inapp-notification-service/index.ts b/packages/extension-base/src/services/inapp-notification-service/index.ts index d7462ff72b2..80cb10432a9 100644 --- a/packages/extension-base/src/services/inapp-notification-service/index.ts +++ b/packages/extension-base/src/services/inapp-notification-service/index.ts @@ -1,6 +1,7 @@ // Copyright 2019-2022 @subwallet/extension-base authors & contributors // SPDX-License-Identifier: Apache-2.0 +import { COMMON_ASSETS, COMMON_CHAIN_SLUGS } from '@subwallet/chain-list'; import { _ChainAsset } from '@subwallet/chain-list/types'; import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes'; import { CRON_LISTEN_AVAIL_BRIDGE_CLAIM } from '@subwallet/extension-base/constants'; @@ -135,6 +136,32 @@ export class InappNotificationService implements CronServiceInterface { } } + if ([NotificationActionType.CLAIM_POLYGON_BRIDGE].includes(candidateNotification.actionType)) { + const { address, metadata, time } = candidateNotification; + const candidateMetadata = metadata as ClaimPolygonBridgeNotificationMetadata; + const remindTime = hrsToMillisecond(remindTimeConfigInHrs[candidateNotification.actionType]); + + for (const notification of comparedNotifications) { + if (notification.address !== address) { + continue; + } + + if (time - notification.time >= remindTime) { + continue; + } + + const comparedMetadata = notification.metadata as ClaimPolygonBridgeNotificationMetadata; + const sameNotification = + candidateMetadata._id === comparedMetadata._id && + candidateMetadata.transactionHash === comparedMetadata.transactionHash && + candidateMetadata.counter === comparedMetadata.counter; + + if (sameNotification) { + return false; + } + } + } + return true; } @@ -142,7 +169,6 @@ export class InappNotificationService implements CronServiceInterface { const proxyId = this.keyringService.context.belongUnifiedAccount(address) || address; const accountName = this.keyringService.context.getCurrentAccountProxyName(proxyId); const passNotifications: _NotificationInfo[] = []; - const [comparedNotifications, remindTimeConfig] = await Promise.all([ this.fetchNotificationsByParams({ notificationTab: NotificationTab.ALL, proxyId }), await fetchLastestRemindNotificationTime() @@ -262,7 +288,7 @@ export class InappNotificationService implements CronServiceInterface { title: NotificationTitleMap[actionType].replace('{{tokenSymbol}}', symbol), description: NotificationDescriptionMap[actionType](formatNumber(amount, decimals), symbol), time: timestamp, - extrinsicType: ExtrinsicType.CLAIM_AVAIL_BRIDGE, + extrinsicType: ExtrinsicType.CLAIM_BRIDGE, isRead: false, actionType, metadata @@ -274,28 +300,27 @@ export class InappNotificationService implements CronServiceInterface { // Polygon Claimable Handle + // @ts-ignore async createPolygonClaimableTransactions () { const { evm: evmAddresses } = this.getCategorizedAddresses(); - const polygonAsset = Object.values(this.chainService.getAssetRegistry()).find( - (asset) => asset.originChain === 'sepolia_ethereum' - ); + const etherChains = [COMMON_ASSETS.ETH, COMMON_ASSETS.ETH_SEPOLIA]; - const isTestnet = polygonAsset?.originChain === 'sepolia_ethereum'; + const polygonAssets = Object.values(this.chainService.getAssetRegistry()).filter( + (asset) => etherChains.includes(asset.slug as COMMON_ASSETS) + ); - if (evmAddresses.length === 0) { - return; - } + for (const polygonAsset of polygonAssets) { + const isTestnet = polygonAsset?.originChain === COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA; - for (const address of evmAddresses) { - const response = await fetchPolygonBridgeTransactions(address, isTestnet); + if (evmAddresses.length === 0) { + return; + } - if (response && response.success) { - const claimableTransactions = response.result.filter( - (transaction) => transaction.status === 'READY_TO_CLAIM' && transaction.userAddress === transaction.receiver - ); + for (const address of evmAddresses) { + const response = await fetchPolygonBridgeTransactions(address, isTestnet); - if (claimableTransactions.length > 0 && polygonAsset) { - await this.processPolygonClaimNotification(address, claimableTransactions, polygonAsset); + if (response && response.success) { + await this.processPolygonClaimNotification(address, response.result, polygonAsset); } } } @@ -331,7 +356,7 @@ export class InappNotificationService implements CronServiceInterface { title: NotificationTitleMap[actionType].replace('{{tokenSymbol}}', symbol), description: NotificationDescriptionMap[actionType](formatNumber(amounts[0], decimals), symbol), time: timestamp, - extrinsicType: ExtrinsicType.CLAIM_AVAIL_BRIDGE, + extrinsicType: ExtrinsicType.CLAIM_BRIDGE, isRead: false, actionType, metadata @@ -381,7 +406,6 @@ export class InappNotificationService implements CronServiceInterface { async startCron (): Promise { this.cleanUpOldNotifications() .catch(console.error); - console.log('Crondding'); this.cronCreateBridgeClaimNotification(); return Promise.resolve(); diff --git a/packages/extension-base/src/services/inapp-notification-service/interfaces.ts b/packages/extension-base/src/services/inapp-notification-service/interfaces.ts index dbb156b2f5c..d2d67fa97f7 100644 --- a/packages/extension-base/src/services/inapp-notification-service/interfaces.ts +++ b/packages/extension-base/src/services/inapp-notification-service/interfaces.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes'; -import { AvailBridgeSourceChain, AvailBridgeTransactionStatus } from '@subwallet/extension-base/services/inapp-notification-service/utils'; +import { AvailBridgeSourceChain } from '@subwallet/extension-base/services/inapp-notification-service/utils'; import { YieldPoolType } from '@subwallet/extension-base/types'; export interface _BaseNotificationInfo { @@ -21,6 +21,12 @@ export interface _NotificationInfo extends _BaseNotificationInfo { proxyId: string } +export enum BridgeTransactionStatus { + READY_TO_CLAIM = 'READY_TO_CLAIM', + CLAIMED = 'CLAIMED', + BRIDGED = 'BRIDGED' +} + export interface ActionTypeToMetadataMap { [NotificationActionType.SEND]: SendReceiveNotificationMetadata, [NotificationActionType.RECEIVE]: SendReceiveNotificationMetadata @@ -58,7 +64,7 @@ export interface ClaimAvailBridgeNotificationMetadata { amount: string; sourceBlockHash: string; sourceTransactionIndex: string; - status: AvailBridgeTransactionStatus; + status: BridgeTransactionStatus; } export interface ClaimPolygonBridgeNotificationMetadata { @@ -68,13 +74,13 @@ export interface ClaimPolygonBridgeNotificationMetadata { amounts: string[]; counter: number; destinationNetwork: number; - originTokenAddress?: string; - originTokenNetwork?: number; - receiver?: string; + originTokenAddress: string; + originTokenNetwork: number; + receiver: string; sourceNetwork: number; - status: string; + status: BridgeTransactionStatus; transactionHash: string; - transactionInitiator?: string; + transactionInitiator: string; userAddress: string; } diff --git a/packages/extension-base/src/services/inapp-notification-service/utils/avail.ts b/packages/extension-base/src/services/inapp-notification-service/utils/avail.ts index 3f4621824e8..1c04b9a67ef 100644 --- a/packages/extension-base/src/services/inapp-notification-service/utils/avail.ts +++ b/packages/extension-base/src/services/inapp-notification-service/utils/avail.ts @@ -1,6 +1,8 @@ // Copyright 2019-2022 @subwallet/extension-base authors & contributors // SPDX-License-Identifier: Apache-2.0 +import { BridgeTransactionStatus } from '../interfaces'; + /* Description */ export function getAvailBridgeClaimDescription (amount: string, symbol: string) { return `${amount} ${symbol} ready to claim from ${symbol} cross-chain transfer. Click to claim now!`; @@ -40,13 +42,7 @@ export interface AvailBridgeTransaction { amount: string, sourceBlockHash: string, sourceTransactionIndex: string, - status: AvailBridgeTransactionStatus -} - -export enum AvailBridgeTransactionStatus { - READY_TO_CLAIM = 'READY_TO_CLAIM', - CLAIMED = 'CLAIMED', - BRIDGED = 'BRIDGED' + status: BridgeTransactionStatus } export enum AvailBridgeSourceChain { @@ -61,7 +57,7 @@ export async function fetchAllAvailBridgeClaimable (address: string, sourceChain const pageSize = 100; while (isContinue) { - const response = await fetchAvailBridgeTransactions(address, sourceChain, AvailBridgeTransactionStatus.READY_TO_CLAIM, pageSize, page, isTestnet); + const response = await fetchAvailBridgeTransactions(address, sourceChain, BridgeTransactionStatus.READY_TO_CLAIM, pageSize, page, isTestnet); if (!response) { break; @@ -76,7 +72,7 @@ export async function fetchAllAvailBridgeClaimable (address: string, sourceChain return transactions; } -export async function fetchAvailBridgeTransactions (userAddress: string, sourceChain: AvailBridgeSourceChain, status: AvailBridgeTransactionStatus, pageSize = 100, page = 0, isTestnet: boolean) { +export async function fetchAvailBridgeTransactions (userAddress: string, sourceChain: AvailBridgeSourceChain, status: BridgeTransactionStatus, pageSize = 100, page = 0, isTestnet: boolean) { const params = new URLSearchParams({ userAddress, sourceChain, 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 e815676ed9d..1407ac4ba47 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 @@ -1,6 +1,8 @@ // Copyright 2019-2022 @subwallet/extension-base authors & contributors // SPDX-License-Identifier: Apache-2.0 +import { BridgeTransactionStatus } from '../interfaces'; + export const POLYGON_BRIDGE_INDEXER = { MAINNET: 'https://api-gateway.polygon.technology/api/v3/transactions/mainnet', TESTNET: 'https://api-gateway.polygon.technology/api/v3/transactions/testnet' @@ -16,7 +18,7 @@ export interface PolygonTransaction { bridgeType: string; dataType: string; isDecoded?: boolean; - status: string; + status: BridgeTransactionStatus; timestamp: string; tokenIds: any[]; transactionHash: string; @@ -30,10 +32,10 @@ export interface PolygonTransaction { leaf?: string; mainnetExitRoot?: string; metadata?: string; - originTokenAddress?: string; - originTokenNetwork?: number; - receiver?: string; // empty when not claimed - refuel?: boolean; + originTokenAddress: string; + originTokenNetwork: number; + receiver: string; // empty when not claimed + refuel: boolean; rollUpExitRoot?: string; nonce?: any; rootTunnelAddress?: string; @@ -41,7 +43,7 @@ export interface PolygonTransaction { claimTransactionBlockNumber?: number; claimTransactionHash?: string; claimTransactionTimestamp?: string; - transactionInitiator?: string; + transactionInitiator: string; } interface PaginationData { @@ -98,6 +100,7 @@ export async function fetchPolygonBridgeTransactions (userAddress: string, isTes networkIds.forEach((networkId) => { params.append('destinationNetworkIds', networkId.toString()); params.append('sourceNetworkIds', networkId.toString()); + params.append('status', BridgeTransactionStatus.READY_TO_CLAIM); }); try { @@ -128,3 +131,13 @@ export async function fetchPolygonBridgeTransactions (userAddress: string, isTes return undefined; } } + +export async function fetchAndFilterPolygonTransactionById (transactionId: string, userAddress: string, isTestnet: boolean) { + const response = await fetchPolygonBridgeTransactions(userAddress, isTestnet); + + if (!response || !response.success) { + return undefined; + } + + return response.result.find((tx) => tx._id === transactionId); +} diff --git a/packages/extension-base/src/services/setting-service/constants.ts b/packages/extension-base/src/services/setting-service/constants.ts index 9c4314053c5..fd0ea463768 100644 --- a/packages/extension-base/src/services/setting-service/constants.ts +++ b/packages/extension-base/src/services/setting-service/constants.ts @@ -23,7 +23,8 @@ export const DEFAULT_NOTIFICATION_SETUP: NotificationSetup = { // receive: true, earningClaim: true, earningWithdraw: true, - availBridgeClaim: true + availBridgeClaim: true, + polygonBridgeClaim: true // isHideWithdraw: false, // todo: just for test, remove later // isHideMarketing: false, // isHideAnnouncement: false diff --git a/packages/extension-base/src/services/transaction-service/index.ts b/packages/extension-base/src/services/transaction-service/index.ts index 10468110014..7dc8925aed3 100644 --- a/packages/extension-base/src/services/transaction-service/index.ts +++ b/packages/extension-base/src/services/transaction-service/index.ts @@ -616,8 +616,8 @@ export default class TransactionService { break; } - case ExtrinsicType.CLAIM_AVAIL_BRIDGE: { - const data = parseTransactionData(transaction.data); // TODO: switch by provider + case ExtrinsicType.CLAIM_BRIDGE: { + const data = parseTransactionData(transaction.data); // TODO: switch by provider const metadata = data.notification.metadata as ClaimAvailBridgeNotificationMetadata; const claimAsset = this.state.chainService.getAssetBySlug(metadata.tokenSlug); diff --git a/packages/extension-base/src/types/notification/index.ts b/packages/extension-base/src/types/notification/index.ts index a1bf73f2d00..32235fb5953 100644 --- a/packages/extension-base/src/types/notification/index.ts +++ b/packages/extension-base/src/types/notification/index.ts @@ -12,3 +12,9 @@ export interface RequestSwitchStatusParams { id: string, isRead: boolean } + +export interface RequestIsClaimedPolygonBridge { + chainslug: string, + counter: number, + sourceNetwork: number +} diff --git a/packages/extension-base/src/utils/account/transform.ts b/packages/extension-base/src/utils/account/transform.ts index 301ffcfcb64..d26f22c7977 100644 --- a/packages/extension-base/src/utils/account/transform.ts +++ b/packages/extension-base/src/utils/account/transform.ts @@ -213,7 +213,7 @@ const EVM_ACTIONS: ExtrinsicType[] = [ ]; const CLAIM_AVAIL_BRIDGE: ExtrinsicType[] = [ - ExtrinsicType.CLAIM_AVAIL_BRIDGE + ExtrinsicType.CLAIM_BRIDGE ]; const OTHER_ACTIONS: ExtrinsicType[] = [ diff --git a/packages/extension-koni-ui/src/Popup/Confirmations/index.tsx b/packages/extension-koni-ui/src/Popup/Confirmations/index.tsx index b958f260b53..1178fdfd820 100644 --- a/packages/extension-koni-ui/src/Popup/Confirmations/index.tsx +++ b/packages/extension-koni-ui/src/Popup/Confirmations/index.tsx @@ -254,7 +254,7 @@ const Component = function ({ className }: Props) { return t('Token approve'); case ExtrinsicType.SWAP: return t('Swap confirmation'); - case ExtrinsicType.CLAIM_AVAIL_BRIDGE: + case ExtrinsicType.CLAIM_BRIDGE: return t('Claim confirmation'); case ExtrinsicType.CROWDLOAN: case ExtrinsicType.EVM_EXECUTE: diff --git a/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/index.tsx b/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/index.tsx index eab50c70a46..b9ca17b77da 100644 --- a/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/index.tsx +++ b/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/index.tsx @@ -74,7 +74,7 @@ const getTransactionComponent = (extrinsicType: ExtrinsicType): typeof BaseTrans return TokenApproveConfirmation; case ExtrinsicType.SWAP: return SwapTransactionConfirmation; - case ExtrinsicType.CLAIM_AVAIL_BRIDGE: + case ExtrinsicType.CLAIM_BRIDGE: return ClaimBridgeTransactionConfirmation; case ExtrinsicType.CROWDLOAN: case ExtrinsicType.STAKING_CANCEL_COMPOUNDING: diff --git a/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/ClaimBridge.tsx b/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/ClaimBridge.tsx index dfde68abb42..6f9f6f0e740 100644 --- a/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/ClaimBridge.tsx +++ b/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/ClaimBridge.tsx @@ -34,9 +34,11 @@ const Component: React.FC = (props: BaseTransa const amountValue = useMemo(() => { if (!isPolygonBridge && 'amount' in metadata) { return metadata.amount; + } else if ('amounts' in metadata) { + return metadata.amounts[0]; } - return '0'; + return 0; }, [isPolygonBridge, metadata]); const { t } = useTranslation(); diff --git a/packages/extension-koni-ui/src/Popup/Home/History/index.tsx b/packages/extension-koni-ui/src/Popup/Home/History/index.tsx index becf6a9c5ef..f039e513896 100644 --- a/packages/extension-koni-ui/src/Popup/Home/History/index.tsx +++ b/packages/extension-koni-ui/src/Popup/Home/History/index.tsx @@ -316,7 +316,7 @@ function Component ({ className = '' }: Props): React.ReactElement { [ExtrinsicType.UNSTAKE_STDOT]: t('Unstake stDOT'), [ExtrinsicType.TOKEN_SPENDING_APPROVAL]: t('Token approve'), [ExtrinsicType.SWAP]: t('Swap'), - [ExtrinsicType.CLAIM_AVAIL_BRIDGE]: t('Claim token'), + [ExtrinsicType.CLAIM_BRIDGE]: t('Claim token'), [ExtrinsicType.UNKNOWN]: t('Unknown') }), [t]); @@ -361,7 +361,7 @@ function Component ({ className = '' }: Props): React.ReactElement { [ExtrinsicType.UNSTAKE_STDOT]: t('Unstake stDOT tranasction'), [ExtrinsicType.TOKEN_SPENDING_APPROVAL]: t('Token approve transaction'), [ExtrinsicType.SWAP]: t('Swap transaction'), - [ExtrinsicType.CLAIM_AVAIL_BRIDGE]: t('Claim token transaction'), + [ExtrinsicType.CLAIM_BRIDGE]: t('Claim token transaction'), [ExtrinsicType.UNKNOWN]: t('Unknown transaction') }), [t]); 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 e11d2e33a09..e27d7c0d8b2 100644 --- a/packages/extension-koni-ui/src/Popup/Settings/Notifications/Notification.tsx +++ b/packages/extension-koni-ui/src/Popup/Settings/Notifications/Notification.tsx @@ -3,20 +3,20 @@ import { NotificationType } from '@subwallet/extension-base/background/KoniTypes'; import { ALL_ACCOUNT_KEY } from '@subwallet/extension-base/constants'; -import { _NotificationInfo, ClaimAvailBridgeNotificationMetadata, NotificationActionType, NotificationSetup, NotificationTab, WithdrawClaimNotificationMetadata } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; -import { AvailBridgeTransactionStatus } from '@subwallet/extension-base/services/inapp-notification-service/utils'; +import { _POLYGON_BRIDGE_ABI } from '@subwallet/extension-base/koni/api/contract-handler/utils'; +import { _NotificationInfo, BridgeTransactionStatus, ClaimAvailBridgeNotificationMetadata, ClaimPolygonBridgeNotificationMetadata, NotificationActionType, NotificationSetup, NotificationTab, WithdrawClaimNotificationMetadata } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; import { GetNotificationParams, RequestSwitchStatusParams } from '@subwallet/extension-base/types/notification'; import { detectTranslate } from '@subwallet/extension-base/utils'; import { AlertModal, EmptyList, PageWrapper } from '@subwallet/extension-koni-ui/components'; import { FilterTabItemType, FilterTabs } from '@subwallet/extension-koni-ui/components/FilterTabs'; import NotificationDetailModal from '@subwallet/extension-koni-ui/components/Modal/NotificationDetailModal'; import Search from '@subwallet/extension-koni-ui/components/Search'; -import { BN_ZERO, CLAIM_AVAIL_BRIDGE_TRANSACTION, CLAIM_REWARD_TRANSACTION, DEFAULT_CLAIM_AVAIL_BRIDGE_PARAMS, DEFAULT_CLAIM_REWARD_PARAMS, DEFAULT_UN_STAKE_PARAMS, DEFAULT_WITHDRAW_PARAMS, NOTIFICATION_DETAIL_MODAL, WITHDRAW_TRANSACTION } from '@subwallet/extension-koni-ui/constants'; +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, NOTIFICATION_DETAIL_MODAL, WITHDRAW_TRANSACTION } from '@subwallet/extension-koni-ui/constants'; import { DataContext } from '@subwallet/extension-koni-ui/contexts/DataContext'; import { useAlert, useDefaultNavigate, useGetChainSlugsByAccount, 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, markAllReadNotification, switchReadNotificationStatus } from '@subwallet/extension-koni-ui/messaging/transaction/notification'; +import { fetchInappNotifications, getIsClaimNotificationStatus, markAllReadNotification, switchReadNotificationStatus } from '@subwallet/extension-koni-ui/messaging/transaction/notification'; import NotificationItem from '@subwallet/extension-koni-ui/Popup/Settings/Notifications/NotificationItem'; import { RootState } from '@subwallet/extension-koni-ui/stores'; import { Theme, ThemeProps } from '@subwallet/extension-koni-ui/types'; @@ -77,7 +77,7 @@ function Component ({ className = '' }: Props): React.ReactElement { const [, setClaimRewardStorage] = useLocalStorage(CLAIM_REWARD_TRANSACTION, DEFAULT_CLAIM_REWARD_PARAMS); const [, setWithdrawStorage] = useLocalStorage(WITHDRAW_TRANSACTION, DEFAULT_WITHDRAW_PARAMS); - const [, setClaimAvailBridgeStorage] = useLocalStorage(CLAIM_AVAIL_BRIDGE_TRANSACTION, DEFAULT_CLAIM_AVAIL_BRIDGE_PARAMS); + const [, setClaimAvailBridgeStorage] = useLocalStorage(CLAIM_BRIDGE_TRANSACTION, DEFAULT_CLAIM_AVAIL_BRIDGE_PARAMS); const { notificationSetup } = useSelector((state: RootState) => state.settings); const { accounts, currentAccountProxy, isAllAccount } = useSelector((state: RootState) => state.accountState); @@ -346,14 +346,44 @@ function Component ({ className = '' }: Props): React.ReactElement { break; } + case NotificationActionType.CLAIM_POLYGON_BRIDGE: { + const handleClaimPolygonBridge = async () => { + try { + const metadata = item.metadata as ClaimPolygonBridgeNotificationMetadata; + const isClaimed = await getIsClaimNotificationStatus({ chainslug: metadata.chainSlug, counter: metadata.counter, sourceNetwork: metadata.sourceNetwork }); + + if (!isClaimed) { + setClaimAvailBridgeStorage({ + chain: metadata.chainSlug, + asset: metadata.tokenSlug, + notificationId: item.id, + fromAccountProxy: item.proxyId, + from: item.address + }); + + await switchReadNotificationStatus(switchStatusParams); + navigate('/transaction/claim-bridge'); + } else { + showWarningModal('claimed'); + } + } catch (error) { + console.error(error); + } + }; + + handleClaimPolygonBridge().catch((err) => { + console.error('Error:', err); + }); + break; + } + case NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_ETHEREUM: - case NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_AVAIL: // eslint-disable-next-line no-fallthrough - case NotificationActionType.CLAIM_POLYGON_BRIDGE: { + case NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_AVAIL: { const metadata = item.metadata as ClaimAvailBridgeNotificationMetadata; - if (metadata.status === AvailBridgeTransactionStatus.READY_TO_CLAIM) { + if (metadata.status === BridgeTransactionStatus.READY_TO_CLAIM) { setClaimAvailBridgeStorage({ chain: metadata.chainSlug, asset: metadata.tokenSlug, diff --git a/packages/extension-koni-ui/src/Popup/Transaction/Transaction.tsx b/packages/extension-koni-ui/src/Popup/Transaction/Transaction.tsx index 492c0562d70..c994190041c 100644 --- a/packages/extension-koni-ui/src/Popup/Transaction/Transaction.tsx +++ b/packages/extension-koni-ui/src/Popup/Transaction/Transaction.tsx @@ -57,7 +57,7 @@ function Component ({ className }: Props) { case 'swap': return ExtrinsicType.SWAP; case 'claim-bridge': - return ExtrinsicType.CLAIM_AVAIL_BRIDGE; + return ExtrinsicType.CLAIM_BRIDGE; case 'send-fund': default: return ExtrinsicType.TRANSFER_BALANCE; diff --git a/packages/extension-koni-ui/src/Popup/Transaction/variants/ClaimBridge.tsx b/packages/extension-koni-ui/src/Popup/Transaction/variants/ClaimBridge.tsx index 57f1879c875..adce41b0fd6 100644 --- a/packages/extension-koni-ui/src/Popup/Transaction/variants/ClaimBridge.tsx +++ b/packages/extension-koni-ui/src/Popup/Transaction/variants/ClaimBridge.tsx @@ -53,9 +53,11 @@ const Component: React.FC = (props: ComponentProps) => { const amountValue = useMemo(() => { if (!isPolygonBridge && 'amount' in metadata) { return metadata.amount; + } else if ('amounts' in metadata) { + return metadata.amounts[0]; } - return '0'; + return 0; }, [isPolygonBridge, metadata]); const fromValue = useWatchTransaction('from', form, defaultData); @@ -200,7 +202,7 @@ const Component: React.FC = (props: ComponentProps) => { /> )} loading={loading} - onClick={checkAction(form.submit, ExtrinsicType.CLAIM_AVAIL_BRIDGE)} + onClick={checkAction(form.submit, ExtrinsicType.CLAIM_BRIDGE)} > {t('Continue')} diff --git a/packages/extension-koni-ui/src/components/Modal/NotificationDetailModal.tsx b/packages/extension-koni-ui/src/components/Modal/NotificationDetailModal.tsx index 3fc8e7be3d5..e029d604901 100644 --- a/packages/extension-koni-ui/src/components/Modal/NotificationDetailModal.tsx +++ b/packages/extension-koni-ui/src/components/Modal/NotificationDetailModal.tsx @@ -61,7 +61,7 @@ function Component (props: Props): React.ReactElement { title: 'Claim tokens', icon: Gift }; - case ExtrinsicType.CLAIM_AVAIL_BRIDGE: + case ExtrinsicType.CLAIM_BRIDGE: return { title: 'Claim tokens', icon: Coins diff --git a/packages/extension-koni-ui/src/constants/history.ts b/packages/extension-koni-ui/src/constants/history.ts index 18bfa394bc7..27735735fdf 100644 --- a/packages/extension-koni-ui/src/constants/history.ts +++ b/packages/extension-koni-ui/src/constants/history.ts @@ -44,7 +44,7 @@ export const TxTypeNameMap: Record = { [ExtrinsicType.EVM_EXECUTE]: detectTranslate('EVM Execute'), [ExtrinsicType.TOKEN_SPENDING_APPROVAL]: detectTranslate('Token approve'), [ExtrinsicType.SWAP]: detectTranslate('Swap'), - [ExtrinsicType.CLAIM_AVAIL_BRIDGE]: detectTranslate('Claim token'), + [ExtrinsicType.CLAIM_BRIDGE]: detectTranslate('Claim token'), [ExtrinsicType.UNKNOWN]: detectTranslate('Unknown') }; diff --git a/packages/extension-koni-ui/src/constants/localStorage.ts b/packages/extension-koni-ui/src/constants/localStorage.ts index ec0231d4b49..a67b12722a9 100644 --- a/packages/extension-koni-ui/src/constants/localStorage.ts +++ b/packages/extension-koni-ui/src/constants/localStorage.ts @@ -18,7 +18,7 @@ export const UN_STAKE_TRANSACTION = 'transaction.un-stake'; export const CANCEL_UN_STAKE_TRANSACTION = 'transaction.cancel-un-stake'; export const WITHDRAW_TRANSACTION = 'transaction.withdraw'; export const CLAIM_REWARD_TRANSACTION = 'transaction.claim-reward'; -export const CLAIM_AVAIL_BRIDGE_TRANSACTION = 'transaction.claim-bridge'; +export const CLAIM_BRIDGE_TRANSACTION = 'transaction.claim-bridge'; export const TRANSACTION_STORAGES = [TRANSFER_TRANSACTION, NFT_TRANSACTION, EARN_TRANSACTION, UN_STAKE_TRANSACTION, CANCEL_UN_STAKE_TRANSACTION, WITHDRAW_TRANSACTION, CLAIM_REWARD_TRANSACTION, SWAP_TRANSACTION]; diff --git a/packages/extension-koni-ui/src/constants/transaction.ts b/packages/extension-koni-ui/src/constants/transaction.ts index 3287866c477..3d96b7c1b3f 100644 --- a/packages/extension-koni-ui/src/constants/transaction.ts +++ b/packages/extension-koni-ui/src/constants/transaction.ts @@ -51,7 +51,7 @@ export const TRANSACTION_TITLE_MAP: Record = { [ExtrinsicType.UNSTAKE_QDOT]: detectTranslate('Unstake qDOT'), [ExtrinsicType.UNSTAKE_VMANTA]: detectTranslate('Unstake vMANTA'), - [ExtrinsicType.CLAIM_AVAIL_BRIDGE]: detectTranslate('Claim tokens'), + [ExtrinsicType.CLAIM_BRIDGE]: detectTranslate('Claim tokens'), [ExtrinsicType.TOKEN_SPENDING_APPROVAL]: detectTranslate('Token approve'), [ExtrinsicType.SWAP]: detectTranslate('Swap') diff --git a/packages/extension-koni-ui/src/messaging/transaction/notification.ts b/packages/extension-koni-ui/src/messaging/transaction/notification.ts index 9b1d86aea80..f27fa4158d0 100644 --- a/packages/extension-koni-ui/src/messaging/transaction/notification.ts +++ b/packages/extension-koni-ui/src/messaging/transaction/notification.ts @@ -1,7 +1,7 @@ // Copyright 2019-2022 @subwallet/extension-koni-ui authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { GetNotificationParams, RequestSwitchStatusParams } from '@subwallet/extension-base/types/notification'; +import { GetNotificationParams, RequestIsClaimedPolygonBridge, RequestSwitchStatusParams } from '@subwallet/extension-base/types/notification'; import { sendMessage } from '@subwallet/extension-koni-ui/messaging'; export async function markAllReadNotification (request: string) { @@ -19,3 +19,7 @@ export async function fetchInappNotifications (request: GetNotificationParams) { export async function getInappNotification (notificationId: string) { return sendMessage('pri(inappNotification.get)', notificationId); } + +export async function getIsClaimNotificationStatus (request: RequestIsClaimedPolygonBridge) { + return sendMessage('pri(inappNotification.isClaimedPolygonBridge)', request); +} diff --git a/packages/extension-koni-ui/src/utils/transaction/persist.ts b/packages/extension-koni-ui/src/utils/transaction/persist.ts index 6bcc32fbbd2..cf5e44ea994 100644 --- a/packages/extension-koni-ui/src/utils/transaction/persist.ts +++ b/packages/extension-koni-ui/src/utils/transaction/persist.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes'; -import { CANCEL_UN_STAKE_TRANSACTION, CLAIM_AVAIL_BRIDGE_TRANSACTION, CLAIM_REWARD_TRANSACTION, CURRENT_PAGE, EARN_TRANSACTION, NFT_TRANSACTION, STAKE_TRANSACTION, SWAP_TRANSACTION, TRANSFER_TRANSACTION, UN_STAKE_TRANSACTION, WITHDRAW_TRANSACTION } from '@subwallet/extension-koni-ui/constants'; +import { CANCEL_UN_STAKE_TRANSACTION, CLAIM_BRIDGE_TRANSACTION, CLAIM_REWARD_TRANSACTION, CURRENT_PAGE, EARN_TRANSACTION, NFT_TRANSACTION, STAKE_TRANSACTION, SWAP_TRANSACTION, TRANSFER_TRANSACTION, UN_STAKE_TRANSACTION, WITHDRAW_TRANSACTION } from '@subwallet/extension-koni-ui/constants'; import { removeStorage } from '../common'; @@ -31,8 +31,8 @@ export const detectTransactionPersistKey = (type?: ExtrinsicType): string => { return CLAIM_REWARD_TRANSACTION; case ExtrinsicType.SWAP: return SWAP_TRANSACTION; - case ExtrinsicType.CLAIM_AVAIL_BRIDGE: - return CLAIM_AVAIL_BRIDGE_TRANSACTION; + case ExtrinsicType.CLAIM_BRIDGE: + return CLAIM_BRIDGE_TRANSACTION; default: return ''; } From 0efd27d5ba5bedabe425d4f638e24d67057b7c52 Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Wed, 20 Nov 2024 18:11:07 +0700 Subject: [PATCH 069/204] [Issue-3814] fix: fix subscanSlug --- .../src/koni/background/handlers/State.ts | 10 +++-- .../services/chain-online-service/index.ts | 45 +++++++++++-------- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/packages/extension-base/src/koni/background/handlers/State.ts b/packages/extension-base/src/koni/background/handlers/State.ts index 19812c237aa..606de89fc09 100644 --- a/packages/extension-base/src/koni/background/handlers/State.ts +++ b/packages/extension-base/src/koni/background/handlers/State.ts @@ -285,7 +285,6 @@ export default class KoniState { public async init () { await this.eventService.waitCryptoReady; await this.chainService.init(); - this.afterChainServiceInit(); await this.migrationService.run(); this.campaignService.init(); this.mktCampaignService.init(); @@ -304,9 +303,11 @@ export default class KoniState { await this.dbService.stores.crowdloan.removeEndedCrowdloans(); await this.startSubscription(); - this.chainOnlineService.checkLatestData(); this.chainService.checkLatestData(); + this.chainService.subscribeChainInfoMap().subscribe(() => { + this.afterChainServiceInit(); + }); } public async initMantaPay (password: string) { @@ -1643,10 +1644,11 @@ export default class KoniState { await this.walletConnectService.resetWallet(resetAll); await this.chainService.init(); - this.afterChainServiceInit(); - this.chainOnlineService.checkLatestData(); this.chainService.checkLatestData(); + this.chainService.subscribeChainInfoMap().subscribe(() => { + this.afterChainServiceInit(); + }); } public async enableMantaPay (updateStore: boolean, address: string, password: string, seedPhrase?: string) { diff --git a/packages/extension-base/src/services/chain-online-service/index.ts b/packages/extension-base/src/services/chain-online-service/index.ts index 136c55889a9..eab7849b1f0 100644 --- a/packages/extension-base/src/services/chain-online-service/index.ts +++ b/packages/extension-base/src/services/chain-online-service/index.ts @@ -214,27 +214,34 @@ export class ChainOnlineService { } handleLatestPatchData () { - this.fetchLatestPatchData().then((latestPatch) => { - if (latestPatch && !this.chainService.getlockChainInfoMap()) { - this.eventService.waitAssetReady - .then(() => { - this.chainService.setLockChainInfoMap(true); - this.handleLatestPatch(latestPatch) - .then(() => this.chainService.setLockChainInfoMap(false)) + this.fetchLatestPatchData() + .then((latestPatch) => { + return new Promise((resolve) => { + if (latestPatch && !this.chainService.getlockChainInfoMap()) { + this.eventService.waitAssetReady + .then(() => { + this.chainService.setLockChainInfoMap(true); + this.handleLatestPatch(latestPatch) + .then(() => this.chainService.setLockChainInfoMap(false)) + .catch((e) => { + this.chainService.setLockChainInfoMap(false); + console.error('Error update latest patch', e); + }) + .finally(resolve); + }) .catch((e) => { - this.chainService.setLockChainInfoMap(false); - console.error('Error update latest patch', e); + console.error('Asset fail to ready', e); + resolve(); }); - }) - .catch((e) => { - console.error('Asset fail to ready', e); - }); - } - }).catch((e) => { - console.error('Error get latest patch or data map is locking', e); - }); - - this.eventService.emit('asset.online.ready', true); + } else { + resolve(); + } + }); + }).catch((e) => { + console.error('Error get latest patch or data map is locking', e); + }).finally(() => { + this.eventService.emit('asset.online.ready', true); + }); } checkLatestData () { From f405285929b74c3bd307f9d210a6d5db167b22e1 Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Thu, 21 Nov 2024 11:17:50 +0700 Subject: [PATCH 070/204] [Add] Extension - Support display Story Odyssey NFT --- .../extension-base/src/koni/api/nft/config.ts | 4 +- .../extension-base/src/koni/api/nft/index.ts | 11 + .../koni/api/nft/story_odyssey_nft/index.ts | 197 ++++++++++++++++++ .../src/services/chain-service/constants.ts | 3 +- 4 files changed, 213 insertions(+), 2 deletions(-) create mode 100644 packages/extension-base/src/koni/api/nft/story_odyssey_nft/index.ts diff --git a/packages/extension-base/src/koni/api/nft/config.ts b/packages/extension-base/src/koni/api/nft/config.ts index 7358f096e02..dc0cd30fd97 100644 --- a/packages/extension-base/src/koni/api/nft/config.ts +++ b/packages/extension-base/src/koni/api/nft/config.ts @@ -31,7 +31,7 @@ export const BIT_COUNTRY_THUMBNAIL_RESOLVER = 'https://res.cloudinary.com/ddftct export const CF_IPFS_GATEWAY = 'https://cf-ipfs.com/ipfs/'; // XOrigin -export const PINATA_IPFS_GATEWAY = 'https://gateway.pinata.cloud/ipfs/'; +export const ODYSSEY_ENDPOINT = 'https://indexer-v2.dev.aurascan.io/api/v2/graphql'; // deprecated // export const UNIQUE_SCAN_ENDPOINT = 'https://explorer-api.unique.network/v1/graphql'; @@ -70,6 +70,8 @@ export const TERNOA_ALPHANET_CLIENT_NFT = 'https://indexer-alphanet.ternoa.dev'; export const TERNOA_MAINNET_GATEWAY = 'https://ipfs-mainnet.trnnfr.com/ipfs/'; export const TERNOA_ALPHANET_GATEWAY = 'https://ipfs-dev.trnnfr.com/ipfs/'; +// XOrigin + export const IPFS_GATEWAY_4EVERLAND = 'https://4everland.io/ipfs/'; export const IPFS_FLEEK = 'https://ipfs.fleek.co/ipfs/'; diff --git a/packages/extension-base/src/koni/api/nft/index.ts b/packages/extension-base/src/koni/api/nft/index.ts index f3337406c3b..e6e03a0f1af 100644 --- a/packages/extension-base/src/koni/api/nft/index.ts +++ b/packages/extension-base/src/koni/api/nft/index.ts @@ -23,6 +23,7 @@ import { categoryAddresses, targetIsWeb } from '@subwallet/extension-base/utils' import AssetHubNftsPalletApi from './assethub_nft'; import { RariNftApi } from './rari'; +import { OdysseyNftApi } from './story_odyssey_nft'; import { TernoaNftApi } from './ternoa_nft'; function createSubstrateNftApi (chain: string, substrateApi: _SubstrateApi | null, addresses: string[]): BaseNftApi[] | null { @@ -52,6 +53,8 @@ function createSubstrateNftApi (chain: string, substrateApi: _SubstrateApi | nul return [new TernoaNftApi(substrateApi, substrateAddresses, chain)]; } else if (_NFT_CHAIN_GROUP.rari.includes(chain)) { return [new RariNftApi(chain, evmAddresses)]; + } else if (_NFT_CHAIN_GROUP.story_odyssey.includes(chain)) { + return [new OdysseyNftApi(chain, evmAddresses)]; } return null; @@ -184,6 +187,14 @@ export class NftHandler { } } + if (chain === 'storyOdyssey_testnet') { + const handlers = createSubstrateNftApi(chain, null, evmAddresses); + + if (handlers && !!handlers.length) { + this.handlers.push(...handlers); + } + } + if (_isChainSupportWasmNft(chainInfo)) { if (this.substrateApiMap[chain]) { const handler = createWasmNftApi(chain, this.substrateApiMap[chain], substrateAddresses); diff --git a/packages/extension-base/src/koni/api/nft/story_odyssey_nft/index.ts b/packages/extension-base/src/koni/api/nft/story_odyssey_nft/index.ts new file mode 100644 index 00000000000..1af814a68a2 --- /dev/null +++ b/packages/extension-base/src/koni/api/nft/story_odyssey_nft/index.ts @@ -0,0 +1,197 @@ +// Copyright 2019-2022 @subwallet/extension-koni authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import { NftCollection, NftItem } from '@subwallet/extension-base/background/KoniTypes'; + +import { ODYSSEY_ENDPOINT } from '../config'; +import { BaseNftApi, HandleNftParams } from '../nft'; + +interface OdysseyTokenMetadata { + name: string; + image: string; + description: string; +} + +interface OdysseyNftInfo { + onchain: { + metadata: OdysseyTokenMetadata; + token_uri: string; + }; + offchain: { + image: { + url: string; + content_type: string; + }; + animation?: object; + }; +} + +interface OdysseyToken { + owner: string; + token_id: string; + media_info: OdysseyNftInfo; + erc721_contract_address: string; +} + +interface OdysseyResponse { + data: { + odyssey: { + erc721_token: OdysseyToken[]; + }; + }; +} + +interface UrlMetadata { + name?: string; + image?: string; + description?: string; + media?: [{ + url?: string; + }]; + title?: string; +} +export class OdysseyNftApi extends BaseNftApi { + constructor (chain: string, addresses: string[]) { + super(chain, undefined, addresses); + } + + endpoint = ODYSSEY_ENDPOINT; + + private static parseNftRequest (address: string): string { + const lowerCaseAddress = address.toLowerCase(); + + return ` + query MyQuery { + odyssey { + erc721_token( + where: {owner: {_eq: "${lowerCaseAddress}"}} + ) { + media_info + owner + token_id + erc721_contract_address + } + } + } + `; + } + + private async fetchNftData (query: string): Promise { + try { + const response = await fetch(this.endpoint, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + operationName: 'MyQuery', + variables: {}, + query + }) + }); + + const result = (await response.json()) as OdysseyResponse; + + return result.data.odyssey.erc721_token; + } catch (err) { + console.error('Error:', err); + + return null; + } + } + + private async fetchUrlMetadata (url: string): Promise { + try { + const response = await fetch(url); + + return (await response.json()) as UrlMetadata; + } catch (err) { + console.error('Error:', err); + + return null; + } + } + + private parseUrlIfIpfs (url: string) { + if (url.startsWith('ipfs://')) { + return this.parseUrl(url); + } + + if (url.includes('github.com')) { + return `${url}?raw=true`; + } + + return url; + } + + private parseNftItem (nft: OdysseyToken, metadata: UrlMetadata | null, address: string): NftItem { + const urlMetadataImage = this.parseUrlIfIpfs(metadata?.image || ''); + + return { + id: nft.token_id, + name: metadata?.name || metadata?.title, + description: metadata?.description, + image: urlMetadataImage || metadata?.media?.[0]?.url, + collectionId: nft.erc721_contract_address, + chain: this.chain, + owner: address + }; + } + + private parseNftCollection (nft: OdysseyToken): NftCollection { + const image = this.parseUrlIfIpfs(nft.media_info.onchain.metadata.image || ''); + + return { + collectionId: nft.erc721_contract_address, + chain: this.chain, + collectionName: nft.media_info.onchain.metadata.name, + image: image || undefined + }; + } + + private async processNftItem (nft: OdysseyToken, address: string, params: HandleNftParams) { + const tokenUri = this.parseUrlIfIpfs(nft.media_info.onchain.token_uri) || ''; + + const urlMetadata = await this.fetchUrlMetadata(tokenUri); + + const parsedNft = this.parseNftItem(nft, urlMetadata, address); + + params.updateItem(this.chain, parsedNft, address); + + const parsedCollection = this.parseNftCollection(nft); + + params.updateCollection(this.chain, parsedCollection); + } + + public async handleNfts (params: HandleNftParams) { + await Promise.all( + this.addresses.map(async (address) => { + const nftDetails = await this.fetchNftsWithDetail(address); + + if (!nftDetails || nftDetails.length === 0) { + return; + } + + await Promise.all( + nftDetails.map(async (nft) => { + await this.processNftItem(nft, address, params); + }) + ); + }) + ); + } + + public async fetchNftsWithDetail (address: string) { + const query = OdysseyNftApi.parseNftRequest(address); + + return await this.fetchNftData(query); + } + + public async fetchNfts (params: HandleNftParams) { + try { + await this.handleNfts(params); + } catch (e) { + return 0; + } + + return 1; + } +} diff --git a/packages/extension-base/src/services/chain-service/constants.ts b/packages/extension-base/src/services/chain-service/constants.ts index 04b580d5365..c855dda98a6 100644 --- a/packages/extension-base/src/services/chain-service/constants.ts +++ b/packages/extension-base/src/services/chain-service/constants.ts @@ -57,7 +57,8 @@ export const _NFT_CHAIN_GROUP = { vara: ['vara_network'], avail: ['avail_mainnet'], ternoa: ['ternoa', 'ternoa_alphanet'], - rari: ['rari'] + rari: ['rari'], + story_odyssey: ['storyOdyssey', 'storyOdyssey_testnet', 'storyPublic_testnet'] }; // Staking-------------------------------------------------------------------------------------------------------------- From 76b72aae6290cdbb24ba1d4b6ee12aec2fa0b84d Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Thu, 21 Nov 2024 11:31:42 +0700 Subject: [PATCH 071/204] Remove unsupported network --- packages/extension-base/src/services/chain-service/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/extension-base/src/services/chain-service/constants.ts b/packages/extension-base/src/services/chain-service/constants.ts index c855dda98a6..fafcfa66089 100644 --- a/packages/extension-base/src/services/chain-service/constants.ts +++ b/packages/extension-base/src/services/chain-service/constants.ts @@ -58,7 +58,7 @@ export const _NFT_CHAIN_GROUP = { avail: ['avail_mainnet'], ternoa: ['ternoa', 'ternoa_alphanet'], rari: ['rari'], - story_odyssey: ['storyOdyssey', 'storyOdyssey_testnet', 'storyPublic_testnet'] + story_odyssey: ['storyOdyssey', 'storyOdyssey_testnet'] }; // Staking-------------------------------------------------------------------------------------------------------------- From b085296bc1904d7b55db60178ba4fa69b5697266 Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Thu, 21 Nov 2024 17:32:45 +0700 Subject: [PATCH 072/204] [Update] Fix UI --- packages/extension-base/src/koni/api/nft/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/extension-base/src/koni/api/nft/config.ts b/packages/extension-base/src/koni/api/nft/config.ts index dc0cd30fd97..3ae15590b0d 100644 --- a/packages/extension-base/src/koni/api/nft/config.ts +++ b/packages/extension-base/src/koni/api/nft/config.ts @@ -115,7 +115,7 @@ export const SUPPORTED_TRANSFER_EVM_CHAIN = [ SUPPORTED_TRANSFER_EVM_CHAIN_NAME.shibuya as string ]; -export const UNSUPPORTED_TRANSFER_EVM_CHAIN_NAME = ['unique_evm', 'rari']; +export const UNSUPPORTED_TRANSFER_EVM_CHAIN_NAME = ['unique_evm', 'rari', 'storyOdyssey_testnet']; export const TRANSFER_CHAIN_ID = { [SUPPORTED_TRANSFER_EVM_CHAIN_NAME.moonbase as string]: 1287, From 19d6c3a138f7f944cc384b95cd817389366c3708 Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Thu, 21 Nov 2024 17:52:11 +0700 Subject: [PATCH 073/204] [Issue - 3713] Extension - Fix bug validating recipient balance when sending Substrate token --- .../src/background/KoniTypes.ts | 5 ++ .../src/core/logic-validation/transfer.ts | 53 ++++++++++++------- .../src/koni/background/handlers/Extension.ts | 28 ++++++++-- .../src/services/chain-service/constants.ts | 1 + 4 files changed, 64 insertions(+), 23 deletions(-) diff --git a/packages/extension-base/src/background/KoniTypes.ts b/packages/extension-base/src/background/KoniTypes.ts index 87e0bb4acb4..9f857e77a42 100644 --- a/packages/extension-base/src/background/KoniTypes.ts +++ b/packages/extension-base/src/background/KoniTypes.ts @@ -616,6 +616,11 @@ export interface BasicTokenInfo { symbol: string; } +export interface SufficientMetadata { + isSufficient: boolean, + minBalance: number +} + export interface AmountData extends BasicTokenInfo { value: string; metadata?: unknown; diff --git a/packages/extension-base/src/core/logic-validation/transfer.ts b/packages/extension-base/src/core/logic-validation/transfer.ts index 0e15a3a43d7..56bfa13d479 100644 --- a/packages/extension-base/src/core/logic-validation/transfer.ts +++ b/packages/extension-base/src/core/logic-validation/transfer.ts @@ -1,7 +1,7 @@ // Copyright 2019-2022 @subwallet/extension-base authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { _ChainAsset, _ChainInfo } from '@subwallet/chain-list/types'; +import { _AssetType, _ChainAsset, _ChainInfo } from '@subwallet/chain-list/types'; import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError'; import { _Address, AmountData, ExtrinsicDataTypeMap, ExtrinsicType, FeeData } from '@subwallet/extension-base/background/KoniTypes'; import { TransactionWarning } from '@subwallet/extension-base/background/warnings/TransactionWarning'; @@ -56,35 +56,50 @@ export function validateTransferRequest (tokenInfo: _ChainAsset, from: _Address, return [errors, keypair, transferValue]; } -export function additionalValidateTransfer (tokenInfo: _ChainAsset, nativeTokenInfo: _ChainAsset, extrinsicType: ExtrinsicType, receiverTransferTokenTotalBalance: string, transferAmount: string, senderTransferTokenTransferable?: string, _receiverNativeTotal?: string, isReceiverActive?: unknown): [TransactionWarning[], TransactionError[]] { +export function additionalValidateTransfer (tokenInfo: _ChainAsset, nativeTokenInfo: _ChainAsset, extrinsicType: ExtrinsicType, receiverTransferTokenTotalBalance: string, transferAmount: string, senderTransferTokenTransferable?: string, _receiverNativeTotal?: string, isReceiverActive?: unknown, isSufficient?: boolean): [TransactionWarning[], TransactionError[]] { const minAmount = _getTokenMinAmount(tokenInfo); const nativeMinAmount = _getTokenMinAmount(nativeTokenInfo); const warnings: TransactionWarning[] = []; const errors: TransactionError[] = []; - // Check ed of not native token for sender after sending - if (extrinsicType === ExtrinsicType.TRANSFER_TOKEN && senderTransferTokenTransferable) { - if (new BigN(senderTransferTokenTransferable).minus(transferAmount).lt(minAmount)) { - const warning = new TransactionWarning(BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT); + if (tokenInfo.assetType !== _AssetType.NATIVE) { + // Check ed of not native token for sender after sending + if (extrinsicType === ExtrinsicType.TRANSFER_TOKEN && senderTransferTokenTransferable) { + if (new BigN(senderTransferTokenTransferable).minus(transferAmount).lt(minAmount)) { + const warning = new TransactionWarning(BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT); - warnings.push(warning); + warnings.push(warning); + } } - } - // Check ed for receiver before sending - if (extrinsicType === ExtrinsicType.TRANSFER_TOKEN && _receiverNativeTotal) { - if (new BigN(_receiverNativeTotal).lt(nativeMinAmount) && new BigN(nativeMinAmount).gt(0)) { - const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, t('The recipient account has {{amount}} {{nativeSymbol}} which can lead to your {{localSymbol}} being lost. Change recipient account and try again', { replace: { amount: _receiverNativeTotal, nativeSymbol: nativeTokenInfo.symbol, localSymbol: tokenInfo.symbol } })); + if (!isSufficient && new BigN(nativeMinAmount).gt(0)) { + // Check ed for receiver before sending + // if (extrinsicType === ExtrinsicType.TRANSFER_TOKEN && _receiverNativeTotal) { + // if (new BigN(_receiverNativeTotal).lt(nativeMinAmount)) { + // const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, t('The recipient account has {{amount}} {{nativeSymbol}} which can lead to your {{localSymbol}} being lost. Change recipient account and try again', { replace: { amount: _receiverNativeTotal, nativeSymbol: nativeTokenInfo.symbol, localSymbol: tokenInfo.symbol } })); + // + // errors.push(error); + // } + // } + + // Check if receiver's account is active + if (isReceiverActive && _isAccountActive(isReceiverActive as FrameSystemAccountInfo)) { + const error = new TransactionError(TransferTxErrorType.RECEIVER_ACCOUNT_INACTIVE, t('The recipient account may be inactive. Change recipient account and try again')); + + errors.push(error); + } - errors.push(error); - } - } + // Check ed for receiver after sending + if (new BigN(receiverTransferTokenTotalBalance).plus(transferAmount).lt(minAmount)) { + const atLeast = new BigN(minAmount).minus(receiverTransferTokenTotalBalance).plus((tokenInfo.decimals || 0) === 0 ? 0 : 1); - // Check if receiver's account is active - if (isReceiverActive && _isAccountActive(isReceiverActive as FrameSystemAccountInfo)) { - const error = new TransactionError(TransferTxErrorType.RECEIVER_ACCOUNT_INACTIVE, t('The recipient account may be inactive. Change recipient account and try again')); + const atLeastStr = formatNumber(atLeast, tokenInfo.decimals || 0, balanceFormatter, { maxNumberFormat: tokenInfo.decimals || 6 }); - errors.push(error); + const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, t('You must transfer at least {{amount}} {{symbol}} to keep the destination account alive', { replace: { amount: atLeastStr, symbol: tokenInfo.symbol } })); + + errors.push(error); + } + } } // Check ed for receiver after sending diff --git a/packages/extension-base/src/koni/background/handlers/Extension.ts b/packages/extension-base/src/koni/background/handlers/Extension.ts index b0ed2bd0122..dc76ff4569d 100644 --- a/packages/extension-base/src/koni/background/handlers/Extension.ts +++ b/packages/extension-base/src/koni/background/handlers/Extension.ts @@ -7,7 +7,7 @@ import { _AssetRef, _AssetType, _ChainAsset, _ChainInfo, _MultiChainAsset } from import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError'; import { withErrorLog } from '@subwallet/extension-base/background/handlers/helpers'; import { createSubscription } from '@subwallet/extension-base/background/handlers/subscriptions'; -import { AccountExternalError, AddressBookInfo, AmountData, AmountDataWithId, AssetSetting, AssetSettingUpdateReq, BondingOptionParams, BrowserConfirmationType, CampaignBanner, CampaignData, CampaignDataType, ChainType, CronReloadRequest, CrowdloanJson, ExternalRequestPromiseStatus, ExtrinsicType, KeyringState, MantaPayEnableMessage, MantaPayEnableParams, MantaPayEnableResponse, MantaPaySyncState, MetadataItem, NftCollection, NftJson, NftTransactionRequest, NftTransactionResponse, PriceJson, RequestAccountCreateExternalV2, RequestAccountCreateHardwareMultiple, RequestAccountCreateHardwareV2, RequestAccountCreateWithSecretKey, RequestAccountExportPrivateKey, RequestAddInjectedAccounts, RequestApproveConnectWalletSession, RequestApproveWalletConnectNotSupport, RequestAuthorization, RequestAuthorizationBlock, RequestAuthorizationPerAccount, RequestAuthorizationPerSite, RequestAuthorizeApproveV2, RequestBondingSubmit, RequestCameraSettings, RequestCampaignBannerComplete, RequestChangeEnableChainPatrol, RequestChangeLanguage, RequestChangeMasterPassword, RequestChangePriceCurrency, RequestChangeShowBalance, RequestChangeShowZeroBalance, RequestChangeTimeAutoLock, RequestConfirmationComplete, RequestConfirmationCompleteTon, RequestConnectWalletConnect, RequestCrowdloanContributions, RequestDeleteContactAccount, RequestDisconnectWalletConnectSession, RequestEditContactAccount, RequestFindRawMetadata, RequestForgetSite, RequestFreeBalance, RequestGetTransaction, RequestKeyringExportMnemonic, RequestMaxTransferable, RequestMigratePassword, RequestParseEvmContractInput, RequestParseTransactionSubstrate, RequestPassPhishingPage, RequestQrParseRLP, RequestQrSignEvm, RequestQrSignSubstrate, RequestRejectConnectWalletSession, RequestRejectExternalRequest, RequestRejectWalletConnectNotSupport, RequestRemoveInjectedAccounts, RequestResetWallet, RequestResolveExternalRequest, RequestSaveAppConfig, RequestSaveBrowserConfig, RequestSaveOSConfig, RequestSaveRecentAccount, RequestSettingsType, RequestSigningApprovePasswordV2, RequestStakePoolingBonding, RequestStakePoolingUnbonding, RequestSubscribeHistory, RequestSubstrateNftSubmitTransaction, RequestTuringCancelStakeCompound, RequestTuringStakeCompound, RequestUnbondingSubmit, RequestUnlockKeyring, RequestUnlockType, ResolveAddressToDomainRequest, ResolveDomainRequest, ResponseAccountCreateWithSecretKey, ResponseAccountExportPrivateKey, ResponseChangeMasterPassword, ResponseFindRawMetadata, ResponseKeyringExportMnemonic, ResponseMigratePassword, ResponseNftImport, ResponseParseEvmContractInput, ResponseParseTransactionSubstrate, ResponseQrParseRLP, ResponseQrSignEvm, ResponseQrSignSubstrate, ResponseRejectExternalRequest, ResponseResetWallet, ResponseResolveExternalRequest, ResponseSubscribeHistory, ResponseUnlockKeyring, ShowCampaignPopupRequest, StakingJson, StakingRewardJson, StakingType, ThemeNames, TransactionHistoryItem, TransactionResponse, ValidateNetworkRequest, ValidateNetworkResponse, ValidatorInfo } from '@subwallet/extension-base/background/KoniTypes'; +import { AccountExternalError, AddressBookInfo, AmountData, AmountDataWithId, AssetSetting, AssetSettingUpdateReq, BondingOptionParams, BrowserConfirmationType, CampaignBanner, CampaignData, CampaignDataType, ChainType, CronReloadRequest, CrowdloanJson, ExternalRequestPromiseStatus, ExtrinsicType, KeyringState, MantaPayEnableMessage, MantaPayEnableParams, MantaPayEnableResponse, MantaPaySyncState, MetadataItem, NftCollection, NftJson, NftTransactionRequest, NftTransactionResponse, PriceJson, RequestAccountCreateExternalV2, RequestAccountCreateHardwareMultiple, RequestAccountCreateHardwareV2, RequestAccountCreateWithSecretKey, RequestAccountExportPrivateKey, RequestAddInjectedAccounts, RequestApproveConnectWalletSession, RequestApproveWalletConnectNotSupport, RequestAuthorization, RequestAuthorizationBlock, RequestAuthorizationPerAccount, RequestAuthorizationPerSite, RequestAuthorizeApproveV2, RequestBondingSubmit, RequestCameraSettings, RequestCampaignBannerComplete, RequestChangeEnableChainPatrol, RequestChangeLanguage, RequestChangeMasterPassword, RequestChangePriceCurrency, RequestChangeShowBalance, RequestChangeShowZeroBalance, RequestChangeTimeAutoLock, RequestConfirmationComplete, RequestConfirmationCompleteTon, RequestConnectWalletConnect, RequestCrowdloanContributions, RequestDeleteContactAccount, RequestDisconnectWalletConnectSession, RequestEditContactAccount, RequestFindRawMetadata, RequestForgetSite, RequestFreeBalance, RequestGetTransaction, RequestKeyringExportMnemonic, RequestMaxTransferable, RequestMigratePassword, RequestParseEvmContractInput, RequestParseTransactionSubstrate, RequestPassPhishingPage, RequestQrParseRLP, RequestQrSignEvm, RequestQrSignSubstrate, RequestRejectConnectWalletSession, RequestRejectExternalRequest, RequestRejectWalletConnectNotSupport, RequestRemoveInjectedAccounts, RequestResetWallet, RequestResolveExternalRequest, RequestSaveAppConfig, RequestSaveBrowserConfig, RequestSaveOSConfig, RequestSaveRecentAccount, RequestSettingsType, RequestSigningApprovePasswordV2, RequestStakePoolingBonding, RequestStakePoolingUnbonding, RequestSubscribeHistory, RequestSubstrateNftSubmitTransaction, RequestTuringCancelStakeCompound, RequestTuringStakeCompound, RequestUnbondingSubmit, RequestUnlockKeyring, RequestUnlockType, ResolveAddressToDomainRequest, ResolveDomainRequest, ResponseAccountCreateWithSecretKey, ResponseAccountExportPrivateKey, ResponseChangeMasterPassword, ResponseFindRawMetadata, ResponseKeyringExportMnemonic, ResponseMigratePassword, ResponseNftImport, ResponseParseEvmContractInput, ResponseParseTransactionSubstrate, ResponseQrParseRLP, ResponseQrSignEvm, ResponseQrSignSubstrate, ResponseRejectExternalRequest, ResponseResetWallet, ResponseResolveExternalRequest, ResponseSubscribeHistory, ResponseUnlockKeyring, ShowCampaignPopupRequest, StakingJson, StakingRewardJson, StakingType, SufficientMetadata, ThemeNames, TransactionHistoryItem, TransactionResponse, ValidateNetworkRequest, ValidateNetworkResponse, ValidatorInfo } from '@subwallet/extension-base/background/KoniTypes'; import { AccountAuthType, AuthorizeRequest, MessageTypes, MetadataRequest, RequestAccountExport, RequestAuthorizeCancel, RequestAuthorizeReject, RequestCurrentAccountAddress, RequestMetadataApprove, RequestMetadataReject, RequestSigningApproveSignature, RequestSigningCancel, RequestTypes, ResponseAccountExport, ResponseAuthorizeList, ResponseType, SigningRequest, WindowOpenParams } from '@subwallet/extension-base/background/types'; import { TransactionWarning } from '@subwallet/extension-base/background/warnings/TransactionWarning'; import { ALL_ACCOUNT_KEY, LATEST_SESSION, XCM_FEE_RATIO } from '@subwallet/extension-base/constants'; @@ -32,7 +32,7 @@ import { createTransferExtrinsic, getTransferMockTxFee } from '@subwallet/extens import { createTonTransaction } from '@subwallet/extension-base/services/balance-service/transfer/ton-transfer'; import { createAvailBridgeExtrinsicFromAvail, createAvailBridgeTxFromEth, createSnowBridgeExtrinsic, createXcmExtrinsic, CreateXcmExtrinsicProps, FunctionCreateXcmExtrinsic, getXcmMockTxFee } from '@subwallet/extension-base/services/balance-service/transfer/xcm'; import { getClaimTxOnAvail, getClaimTxOnEthereum, isAvailChainBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge'; -import { _API_OPTIONS_CHAIN_GROUP, _DEFAULT_MANTA_ZK_CHAIN, _MANTA_ZK_CHAIN_GROUP, _ZK_ASSET_PREFIX } from '@subwallet/extension-base/services/chain-service/constants'; +import { _API_OPTIONS_CHAIN_GROUP, _DEFAULT_MANTA_ZK_CHAIN, _MANTA_ZK_CHAIN_GROUP, _ZK_ASSET_PREFIX, SUFFICIENT_CHAIN } from '@subwallet/extension-base/services/chain-service/constants'; import { _ChainApiStatus, _ChainConnectionStatus, _ChainState, _NetworkUpsertParams, _ValidateCustomAssetRequest, _ValidateCustomAssetResponse, EnableChainParams, EnableMultiChainParams } from '@subwallet/extension-base/services/chain-service/types'; import { _getAssetDecimals, _getAssetSymbol, _getChainNativeTokenBasicInfo, _getContractAddressOfToken, _getEvmChainId, _isAssetSmartContractNft, _isChainEvmCompatible, _isChainTonCompatible, _isCustomAsset, _isLocalToken, _isMantaZkAsset, _isNativeToken, _isPureEvmChain, _isTokenEvmSmartContract, _isTokenTransferredByEvm, _isTokenTransferredByTon } from '@subwallet/extension-base/services/chain-service/utils'; import { _NotificationInfo, NotificationSetup } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; @@ -69,6 +69,7 @@ import { t } from 'i18next'; import { combineLatest, Subject } from 'rxjs'; import { TransactionConfig } from 'web3-core'; +import { ApiPromise } from '@polkadot/api'; import { SubmittableExtrinsic } from '@polkadot/api/types'; import { Metadata, TypeRegistry } from '@polkadot/types'; import { ChainProperties } from '@polkadot/types/interfaces'; @@ -1401,9 +1402,12 @@ export default class KoniExtension { isReceiverActive = _receiverNativeTotal.metadata; } - const { value: receiverTransferTokenTransferable } = await this.getAddressTotalBalance({ address: to, networkKey, token: tokenSlug, extrinsicType }); // todo: shouldn't be just transferable, locked also counts + const { value: receiverTransferTokenTotalBalance } = await this.getAddressTotalBalance({ address: to, networkKey, token: tokenSlug, extrinsicType }); // todo: shouldn't be just transferable, locked also counts - const [warnings, errors] = additionalValidateTransfer(transferTokenInfo, nativeTokenInfo, extrinsicType, receiverTransferTokenTransferable, transferAmount.value, senderTransferTokenTransferable, receiverNativeTotal, isReceiverActive); + const substrateApi = this.#koniState.getSubstrateApi(networkKey).api; + const isSufficient = await this.isSufficientToken(transferTokenInfo, substrateApi); + + const [warnings, errors] = additionalValidateTransfer(transferTokenInfo, nativeTokenInfo, extrinsicType, receiverTransferTokenTotalBalance, transferAmount.value, senderTransferTokenTransferable, receiverNativeTotal, isReceiverActive, isSufficient); warnings.length && inputTransaction.warnings.push(...warnings); errors.length && inputTransaction.errors.push(...errors); @@ -1674,6 +1678,22 @@ export default class KoniExtension { } } + private async isSufficientToken (tokenInfo: _ChainAsset, api: ApiPromise): Promise { + let metadata: SufficientMetadata; + + if (SUFFICIENT_CHAIN.includes(tokenInfo.originChain) && tokenInfo.assetType !== _AssetType.NATIVE) { + const assetId = tokenInfo?.metadata?.assetId; + + const _metadata = await api.query.assets.asset(assetId); + + metadata = _metadata.toPrimitive() as unknown as SufficientMetadata; + } else { + return false; + } + + return metadata.isSufficient; + } + private async deleteCustomAsset (assetSlug: string) { const assetInfo = this.#koniState.getAssetBySlug(assetSlug); diff --git a/packages/extension-base/src/services/chain-service/constants.ts b/packages/extension-base/src/services/chain-service/constants.ts index 04b580d5365..db98a68865a 100644 --- a/packages/extension-base/src/services/chain-service/constants.ts +++ b/packages/extension-base/src/services/chain-service/constants.ts @@ -258,6 +258,7 @@ export const _XCM_CHAIN_GROUP = { xcmPallet: ['polkadot', 'kusama', 'rococo'] // default is xTokens pallet }; +export const SUFFICIENT_CHAIN = ['astar', 'calamari', 'parallel', 'darwinia2', 'crabParachain', 'pangolin', 'statemint', 'moonriver', 'shiden', 'moonbeam', 'statemine', 'liberland', 'dentnet', 'phala', 'crust', 'dbcchain', 'rococo_assethub']; export const _XCM_TYPE = { RP: `${_SubstrateChainType.RELAYCHAIN}-${_SubstrateChainType.PARACHAIN}`, // DMP From 09933d03f582eb72d8d07eacfedc784f3f09438f Mon Sep 17 00:00:00 2001 From: S2kael Date: Thu, 21 Nov 2024 18:48:43 +0700 Subject: [PATCH 074/204] [Issue-3852] Fix some error with foreign asset on asset hub --- packages/extension-base/src/core/substrate/xcm-parser.ts | 7 ++++--- .../balance-service/helpers/subscribe/substrate/index.ts | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/extension-base/src/core/substrate/xcm-parser.ts b/packages/extension-base/src/core/substrate/xcm-parser.ts index 0b066121520..9b14fc6bef3 100644 --- a/packages/extension-base/src/core/substrate/xcm-parser.ts +++ b/packages/extension-base/src/core/substrate/xcm-parser.ts @@ -241,18 +241,19 @@ function _getAssetIdentifier (tokenInfo: _ChainAsset, version: number) { const assetIdentifier = ['statemint-LOCAL-KSM', 'statemine-LOCAL-DOT'].includes(tokenInfo.slug) // todo: hotfix for ksm statemint recheck all chain ? _assetIdentifier - : _adaptX1Interior(structuredClone(_assetIdentifier), version); + : _adaptX1Interior(_assetIdentifier, version); return version >= 4 // from V4, Concrete is removed ? assetIdentifier : { Concrete: assetIdentifier }; } -export function _adaptX1Interior (assetIdentifier: Record, version: number): Record { +export function _adaptX1Interior (_assetIdentifier: Record, version: number): Record { + const assetIdentifier = structuredClone(_assetIdentifier); const interior = assetIdentifier.interior as Record; const isInteriorObj = typeof interior === 'object' && interior !== null; const isX1 = isInteriorObj && 'X1' in interior; - const needModifyX1 = version <= 4 && Array.isArray(interior.X1); + const needModifyX1 = version < 4 && Array.isArray(interior.X1); if (isInteriorObj && isX1 && needModifyX1) { // X1 is an object for version < 4. From V4, it's an array // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access diff --git a/packages/extension-base/src/services/balance-service/helpers/subscribe/substrate/index.ts b/packages/extension-base/src/services/balance-service/helpers/subscribe/substrate/index.ts index a4f077cfe44..f9c5c91950b 100644 --- a/packages/extension-base/src/services/balance-service/helpers/subscribe/substrate/index.ts +++ b/packages/extension-base/src/services/balance-service/helpers/subscribe/substrate/index.ts @@ -225,12 +225,13 @@ const subscribeForeignAssetBalance = async ({ addresses, assetMap, callback, cha const unsubList = await Promise.all(Object.values(tokenMap).map((tokenInfo) => { try { if (_isBridgedToken(tokenInfo)) { + const version: number = ['statemint', 'statemine'].includes(chainInfo.slug) ? 4 : 3; const params: _SubstrateAdapterSubscriptionArgs[] = [ { section: 'query', module: foreignAssetsAccountKey.split('_')[1], method: foreignAssetsAccountKey.split('_')[2], - args: addresses.map((address) => [_getTokenOnChainInfo(tokenInfo) || _adaptX1Interior(_getXcmAssetMultilocation(tokenInfo), 3), address]) + args: addresses.map((address) => [_getTokenOnChainInfo(tokenInfo) || _adaptX1Interior(_getXcmAssetMultilocation(tokenInfo), version), address]) } ]; From ba1121abfc0b6439ee0306549ff69e9faddea61b Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Thu, 21 Nov 2024 19:03:19 +0700 Subject: [PATCH 075/204] [Update] - Migrate Data --- .../src/background/KoniTypes.ts | 3 +- .../src/core/substrate/xcm-parser.ts | 4 +-- .../koni/api/contract-handler/utils/index.ts | 4 +-- .../src/koni/background/handlers/Extension.ts | 2 +- .../transfer/xcm/polygonBridge.ts | 21 ++++-------- .../src/services/fee-service/utils/index.ts | 18 ++++++++++ .../inapp-notification-service/interfaces.ts | 2 +- .../MigrateTransactionHistoryBridge.ts | 34 +++++++++++++++++++ .../migration-service/scripts/index.ts | 4 ++- .../src/services/transaction-service/index.ts | 13 ------- .../types/{avail-bridge => bridge}/index.ts | 0 packages/extension-base/src/types/index.ts | 1 + .../Transaction/variants/ClaimBridge.tsx | 6 ++-- .../Settings/Notifications/Notification.tsx | 4 --- .../Transaction/variants/ClaimBridge.tsx | 4 ++- .../src/messaging/transaction/bridge.ts | 2 +- 16 files changed, 78 insertions(+), 44 deletions(-) create mode 100644 packages/extension-base/src/services/migration-service/scripts/MigrateTransactionHistoryBridge.ts rename packages/extension-base/src/types/{avail-bridge => bridge}/index.ts (100%) diff --git a/packages/extension-base/src/background/KoniTypes.ts b/packages/extension-base/src/background/KoniTypes.ts index 0f7c9252d4a..74acf35b399 100644 --- a/packages/extension-base/src/background/KoniTypes.ts +++ b/packages/extension-base/src/background/KoniTypes.ts @@ -17,7 +17,7 @@ import { CrowdloanContributionsResponse } from '@subwallet/extension-base/servic import { SWTransactionResponse, SWTransactionResult } from '@subwallet/extension-base/services/transaction-service/types'; import { WalletConnectNotSupportRequest, WalletConnectSessionRequest } from '@subwallet/extension-base/services/wallet-connect-service/types'; import { AccountJson, AccountsWithCurrentAddress, AddressJson, BalanceJson, BaseRequestSign, BuyServiceInfo, BuyTokenInfo, CommonOptimalPath, CurrentAccountInfo, EarningRewardHistoryItem, EarningRewardJson, EarningStatus, HandleYieldStepParams, InternalRequestSign, LeavePoolAdditionalData, NominationPoolInfo, OptimalYieldPath, OptimalYieldPathParams, RequestAccountBatchExportV2, RequestAccountCreateSuriV2, RequestAccountNameValidate, RequestAccountProxyEdit, RequestAccountProxyForget, RequestBatchJsonGetAccountInfo, RequestBatchRestoreV2, RequestBounceableValidate, RequestChangeTonWalletContractVersion, RequestCheckCrossChainTransfer, RequestCheckPublicAndSecretKey, RequestCheckTransfer, RequestCrossChainTransfer, RequestDeriveCreateMultiple, RequestDeriveCreateV3, RequestDeriveValidateV2, RequestEarlyValidateYield, RequestExportAccountProxyMnemonic, RequestGetAllTonWalletContractVersion, RequestGetDeriveAccounts, RequestGetDeriveSuggestion, RequestGetYieldPoolTargets, RequestInputAccountSubscribe, RequestJsonGetAccountInfo, RequestJsonRestoreV2, RequestMetadataHash, RequestMnemonicCreateV2, RequestMnemonicValidateV2, RequestPrivateKeyValidateV2, RequestShortenMetadata, RequestStakeCancelWithdrawal, RequestStakeClaimReward, RequestTransfer, RequestUnlockDotCheckCanMint, RequestUnlockDotSubscribeMintedData, RequestYieldLeave, RequestYieldStepSubmit, RequestYieldWithdrawal, ResponseAccountBatchExportV2, ResponseAccountCreateSuriV2, ResponseAccountNameValidate, ResponseBatchJsonGetAccountInfo, ResponseCheckPublicAndSecretKey, ResponseDeriveValidateV2, ResponseEarlyValidateYield, ResponseExportAccountProxyMnemonic, ResponseGetAllTonWalletContractVersion, ResponseGetDeriveAccounts, ResponseGetDeriveSuggestion, ResponseGetYieldPoolTargets, ResponseInputAccountSubscribe, ResponseJsonGetAccountInfo, ResponseMetadataHash, ResponseMnemonicCreateV2, ResponseMnemonicValidateV2, ResponsePrivateKeyValidateV2, ResponseShortenMetadata, StorageDataInterface, SubmitYieldStepData, SwapPair, SwapQuoteResponse, SwapRequest, SwapRequestResult, SwapSubmitParams, SwapTxData, TokenSpendingApprovalParams, UnlockDotTransactionNft, UnstakingStatus, ValidateSwapProcessParams, ValidateYieldProcessParams, YieldPoolInfo, YieldPositionInfo } from '@subwallet/extension-base/types'; -import { RequestClaimBridge } from '@subwallet/extension-base/types/avail-bridge'; +import { RequestClaimBridge } from '@subwallet/extension-base/types/bridge'; import { GetNotificationParams, RequestIsClaimedPolygonBridge, RequestSwitchStatusParams } from '@subwallet/extension-base/types/notification'; import { InjectedAccount, InjectedAccountWithMeta, MetadataDefBase } from '@subwallet/extension-inject/types'; import { KeyringPair$Meta } from '@subwallet/keyring/types'; @@ -516,6 +516,7 @@ export enum ExtrinsicType { SWAP = 'swap', + CLAIM_AVAIL_BRIDGE = 'claim.claim_avail_bridge', // Migrate Claim Bridge CLAIM_BRIDGE = 'claim.claim_bridge', // SET_FEE_TOKEN = 'set_fee-token', diff --git a/packages/extension-base/src/core/substrate/xcm-parser.ts b/packages/extension-base/src/core/substrate/xcm-parser.ts index 6b419886a1e..deb25236a8e 100644 --- a/packages/extension-base/src/core/substrate/xcm-parser.ts +++ b/packages/extension-base/src/core/substrate/xcm-parser.ts @@ -98,9 +98,9 @@ function getAvailBridgeWarning (): string { function getPolygonBridgeWarning (originChainInfo: _ChainInfo): string { if (originChainInfo.slug === COMMON_CHAIN_SLUGS.ETHEREUM || originChainInfo.slug === COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA) { - return 'Cross-chain transfer of this token may take up to 30 minutes, and you’ll need to manually claim the funds on the destination network to complete the transfer. Do you still want to continue?'; + 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 180 minutes, and you’ll need to manually claim the funds on the destination network to complete the transfer. Do you still want to continue?'; + 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 82ded2a1de4..b4c24fbac17 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,9 +64,9 @@ const POLYGONBRIDGE_GATEWAY_ETHEREUM_CONTRACT_ADDRESS = '0x2a3DD3EB832aF982ec716 const POLYGONBRIDGE_GATEWAY_SEPOLIA_CONTRACT_ADDRESS = '0x528e26b25a34a4A5d0dbDa1d57D318153d2ED582'; export function getPolygonBridgeContract (chain: string): string { - if (chain === 'polygonzkEvm_cardona' || chain === 'sepolia_ethereum') { + if (chain === 'polygonzkEvm_cardona' || chain === COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA) { return POLYGONBRIDGE_GATEWAY_SEPOLIA_CONTRACT_ADDRESS; - } else if (chain === 'polygonZkEvm' || chain === 'ethereum') { + } else if (chain === 'polygonZkEvm' || chain === COMMON_CHAIN_SLUGS.ETHEREUM) { return POLYGONBRIDGE_GATEWAY_ETHEREUM_CONTRACT_ADDRESS; } diff --git a/packages/extension-base/src/koni/background/handlers/Extension.ts b/packages/extension-base/src/koni/background/handlers/Extension.ts index cbbc5bc5a42..5f986c235f1 100644 --- a/packages/extension-base/src/koni/background/handlers/Extension.ts +++ b/packages/extension-base/src/koni/background/handlers/Extension.ts @@ -49,7 +49,7 @@ import { SWStorage } from '@subwallet/extension-base/storage'; import { AccountsStore } from '@subwallet/extension-base/stores'; import { AccountJson, AccountProxyMap, AccountsWithCurrentAddress, BalanceJson, BasicTxErrorType, BasicTxWarningCode, BuyServiceInfo, BuyTokenInfo, EarningRewardJson, NominationPoolInfo, OptimalYieldPathParams, RequestAccountBatchExportV2, RequestAccountCreateSuriV2, RequestAccountNameValidate, RequestBatchJsonGetAccountInfo, RequestBatchRestoreV2, RequestBounceableValidate, RequestChangeTonWalletContractVersion, RequestCheckPublicAndSecretKey, RequestCrossChainTransfer, RequestDeriveCreateMultiple, RequestDeriveCreateV3, RequestDeriveValidateV2, RequestEarlyValidateYield, RequestExportAccountProxyMnemonic, RequestGetAllTonWalletContractVersion, RequestGetDeriveAccounts, RequestGetDeriveSuggestion, RequestGetYieldPoolTargets, RequestInputAccountSubscribe, RequestJsonGetAccountInfo, RequestJsonRestoreV2, RequestMetadataHash, RequestMnemonicCreateV2, RequestMnemonicValidateV2, RequestPrivateKeyValidateV2, RequestShortenMetadata, RequestStakeCancelWithdrawal, RequestStakeClaimReward, RequestTransfer, RequestUnlockDotCheckCanMint, RequestUnlockDotSubscribeMintedData, RequestYieldLeave, RequestYieldStepSubmit, RequestYieldWithdrawal, ResponseAccountBatchExportV2, ResponseAccountCreateSuriV2, ResponseAccountNameValidate, ResponseBatchJsonGetAccountInfo, ResponseCheckPublicAndSecretKey, ResponseDeriveValidateV2, ResponseExportAccountProxyMnemonic, ResponseGetAllTonWalletContractVersion, ResponseGetDeriveAccounts, ResponseGetDeriveSuggestion, ResponseGetYieldPoolTargets, ResponseInputAccountSubscribe, ResponseJsonGetAccountInfo, ResponseMetadataHash, ResponseMnemonicCreateV2, ResponseMnemonicValidateV2, ResponsePrivateKeyValidateV2, ResponseShortenMetadata, StakingTxErrorType, StorageDataInterface, TokenSpendingApprovalParams, ValidateYieldProcessParams, YieldPoolType } from '@subwallet/extension-base/types'; import { RequestAccountProxyEdit, RequestAccountProxyForget } from '@subwallet/extension-base/types/account/action/edit'; -import { RequestClaimBridge } from '@subwallet/extension-base/types/avail-bridge'; +import { RequestClaimBridge } from '@subwallet/extension-base/types/bridge'; import { GetNotificationParams, RequestIsClaimedPolygonBridge, RequestSwitchStatusParams } from '@subwallet/extension-base/types/notification'; import { CommonOptimalPath } from '@subwallet/extension-base/types/service-base'; import { SwapPair, SwapQuoteResponse, SwapRequest, SwapRequestResult, SwapSubmitParams, ValidateSwapProcessParams } from '@subwallet/extension-base/types/swap'; 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 c97eef8d76c..7cd5b30c5ab 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 @@ -12,7 +12,7 @@ import { _NotificationInfo, ClaimPolygonBridgeNotificationMetadata } from '@subw import { TransactionConfig } from 'web3-core'; import { ContractSendMethod } from 'web3-eth-contract'; -interface gasStation{ +export interface gasStation{ safeLow: number; standard: number; fastLow: number; @@ -39,7 +39,7 @@ export const POLYGON_GAS_INDEXER = { TESTNET: 'https://gasstation.polygon.technology/zkevm/cardona' }; -async function createPolygonBridgeTransaction (tokenInfo: _ChainAsset, originChainInfo: _ChainInfo, sender: string, recipientAddress: string, value: string, destinationNetwork: number, evmApi: _EvmApi, isTestnet?: boolean): Promise { +async function createPolygonBridgeTransaction (tokenInfo: _ChainAsset, originChainInfo: _ChainInfo, sender: string, recipientAddress: string, value: string, destinationNetwork: number, evmApi: _EvmApi): Promise { const polygonBridgeContractAddress = getPolygonBridgeContract(originChainInfo.slug); const polygonBridgeContract = getWeb3Contract(polygonBridgeContractAddress, evmApi, _POLYGON_BRIDGE_ABI); const tokenContract = _getContractAddressOfToken(tokenInfo) || '0x0000000000000000000000000000000000000000'; // FOR Ethereum: use null address @@ -58,21 +58,14 @@ async function createPolygonBridgeTransaction (tokenInfo: _ChainAsset, originCha '0x' ); const transferEncodedCall = transferCall.encodeABI(); - - const gasDomain = isTestnet ? POLYGON_GAS_INDEXER.TESTNET : POLYGON_GAS_INDEXER.MAINNET; - const gasResponse = isTestnet - ? await fetch(`${gasDomain}`).then((res) => res.json()) as gasStation - : undefined; - - const gasPriceInWei = gasResponse ? (gasResponse.standard * 1e9 + 200000) : undefined; - const priority = !gasResponse ? await calculateGasFeeParams(evmApi, evmApi.chainSlug) : undefined; + const priority = await calculateGasFeeParams(evmApi, evmApi.chainSlug); const transactionConfig: TransactionConfig = { from: sender, to: polygonBridgeContractAddress, value: value, data: transferEncodedCall, - gasPrice: gasPriceInWei || priority?.gasPrice, + gasPrice: priority.gasPrice, maxFeePerGas: priority?.maxFeePerGas?.toString(), maxPriorityFeePerGas: priority?.maxPriorityFeePerGas?.toString() }; @@ -85,13 +78,11 @@ async function createPolygonBridgeTransaction (tokenInfo: _ChainAsset, originCha } export async function _createPolygonBridgeL1toL2Extrinsic (tokenInfo: _ChainAsset, originChainInfo: _ChainInfo, sender: string, recipientAddress: string, value: string, evmApi: _EvmApi): Promise { - return createPolygonBridgeTransaction(tokenInfo, originChainInfo, sender, recipientAddress, value, 1, evmApi, false); + return createPolygonBridgeTransaction(tokenInfo, originChainInfo, sender, recipientAddress, value, 1, evmApi); } export async function _createPolygonBridgeL2toL1Extrinsic (tokenInfo: _ChainAsset, originChainInfo: _ChainInfo, sender: string, recipientAddress: string, value: string, evmApi: _EvmApi): Promise { - const isTestnet = originChainInfo.slug === 'polygonzkEvm_cardona'; - - return createPolygonBridgeTransaction(tokenInfo, originChainInfo, sender, recipientAddress, value, 0, evmApi, isTestnet); + return createPolygonBridgeTransaction(tokenInfo, originChainInfo, sender, recipientAddress, value, 0, evmApi); } export async function getClaimPolygonBridge (chainSlug: string, notification: _NotificationInfo, evmApi: _EvmApi) { 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 840fd9af228..2a6ee46bbcf 100644 --- a/packages/extension-base/src/services/fee-service/utils/index.ts +++ b/packages/extension-base/src/services/fee-service/utils/index.ts @@ -1,12 +1,15 @@ // Copyright 2019-2022 @subwallet/extension-base // SPDX-License-Identifier: Apache-2.0 +import { COMMON_CHAIN_SLUGS } from '@subwallet/chain-list'; import { GAS_PRICE_RATIO, NETWORK_MULTI_GAS_FEE } from '@subwallet/extension-base/constants'; import { _EvmApi } from '@subwallet/extension-base/services/chain-service/types'; import { EvmFeeInfo, EvmFeeInfoCache, InfuraFeeInfo } from '@subwallet/extension-base/types'; import { BN_WEI, BN_ZERO } from '@subwallet/extension-base/utils'; import BigN from 'bignumber.js'; +import { gasStation, POLYGON_GAS_INDEXER } from '../../balance-service/transfer/xcm/polygonBridge'; + const INFURA_API_KEY = process.env.INFURA_API_KEY || ''; const INFURA_API_KEY_SECRET = process.env.INFURA_API_KEY_SECRET || ''; const INFURA_AUTH = 'Basic ' + Buffer.from(INFURA_API_KEY + ':' + INFURA_API_KEY_SECRET).toString('base64'); @@ -216,6 +219,21 @@ export const calculateGasFeeParams = async (web3: _EvmApi, networkKey: string, u }; } + 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; + const gasPriceInWei = gasResponse.standard * 1e9 + 200000; + + return { + gasPrice: gasPriceInWei.toString(), + maxFeePerGas: undefined, + maxPriorityFeePerGas: undefined, + baseGasFee: undefined, + busyNetwork: false + }; + } + /* Max gas = (base + priority) * 1.5 (if not busy or 2 when busy); */ const maxFeePerGas = baseGasFee.plus(maxPriorityFeePerGas).multipliedBy(busyNetwork ? 2 : 1.5).decimalPlaces(0); diff --git a/packages/extension-base/src/services/inapp-notification-service/interfaces.ts b/packages/extension-base/src/services/inapp-notification-service/interfaces.ts index d2d67fa97f7..ee762eba8a1 100644 --- a/packages/extension-base/src/services/inapp-notification-service/interfaces.ts +++ b/packages/extension-base/src/services/inapp-notification-service/interfaces.ts @@ -114,7 +114,7 @@ export interface ShowNotificationPayload { earningClaim: boolean, // notice when an account has an earning reward to claim earningWithdraw: boolean, // notice when an account has an earning unstake to withdraw availBridgeClaim: boolean, // notice when an account has an avail bridge to claim - polygonBridgeClaim: boolean, // notice when an account has an avail bridge to claim + polygonBridgeClaim: boolean, // notice when an account has an polygon bridge to claim // marketing: boolean, // notice when wallet has a marketing announcement // marketing: boolean, // notice when wallet has a marketing announcement // announcement: boolean // notice when wallet has an announcement diff --git a/packages/extension-base/src/services/migration-service/scripts/MigrateTransactionHistoryBridge.ts b/packages/extension-base/src/services/migration-service/scripts/MigrateTransactionHistoryBridge.ts new file mode 100644 index 00000000000..d819a676bfa --- /dev/null +++ b/packages/extension-base/src/services/migration-service/scripts/MigrateTransactionHistoryBridge.ts @@ -0,0 +1,34 @@ +// Copyright 2019-2022 @subwallet/extension-koni authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import { ExtrinsicType, TransactionHistoryItem } from '@subwallet/extension-base/background/KoniTypes'; +import BaseMigrationJob from '@subwallet/extension-base/services/migration-service/Base'; +import Dexie from 'dexie'; + +export default class MigrateTransactionHistoryBridge extends BaseMigrationJob { + public override async run (): Promise { + const state = this.state; + + try { + const db = new Dexie('SubWalletDB_v2'); + const dexieDB = await db.open(); + const transactionTable = dexieDB.table('transactions'); + + const oldTransactionData = (await transactionTable.toArray()) as TransactionHistoryItem[]; + + const claimAvailBridgeTransactions = oldTransactionData.filter((item) => item.type === ExtrinsicType.CLAIM_AVAIL_BRIDGE); + + console.log('Hmm', claimAvailBridgeTransactions); + await Promise.all(claimAvailBridgeTransactions.map(async (item) => { + const newItem: TransactionHistoryItem = { + ...item, + type: ExtrinsicType.CLAIM_BRIDGE + }; + + await state.historyService.updateHistoryByExtrinsicHash(newItem.extrinsicHash, newItem); + })); + } catch (e) { + this.logger.error(e); + } + } +} diff --git a/packages/extension-base/src/services/migration-service/scripts/index.ts b/packages/extension-base/src/services/migration-service/scripts/index.ts index 5f54bf6af8c..acd55c887f7 100644 --- a/packages/extension-base/src/services/migration-service/scripts/index.ts +++ b/packages/extension-base/src/services/migration-service/scripts/index.ts @@ -28,6 +28,7 @@ import MigrateNetworkSettings from './MigrateNetworkSettings'; import MigrateSettings from './MigrateSettings'; import MigrateTokenDecimals from './MigrateTokenDecimals'; import MigrateTransactionHistory from './MigrateTransactionHistory'; +import MigrateTransactionHistoryBridge from './MigrateTransactionHistoryBridge'; import MigrateTransactionHistoryBySymbol from './MigrateTransactionHistoryBySymbol'; import MigrateWalletReference from './MigrateWalletReference'; @@ -62,7 +63,8 @@ export default >{ '1.2.69-01': MigrateRemoveGenesisHash, '1.2.13-01': ReloadMetadata, '1.2.14-01': ClearMetadataDatabase, - '1.2.32-01': MigratePairData + '1.2.32-01': MigratePairData, + '1.3.6-07': MigrateTransactionHistoryBridge // [`${EVERYTIME}-1.1.42-02`]: MigrateTransactionHistoryBySymbol // [`${EVERYTIME}-1`]: AutoEnableChainsTokens }; diff --git a/packages/extension-base/src/services/transaction-service/index.ts b/packages/extension-base/src/services/transaction-service/index.ts index 6b3f6132b26..0524780c0c5 100644 --- a/packages/extension-base/src/services/transaction-service/index.ts +++ b/packages/extension-base/src/services/transaction-service/index.ts @@ -748,19 +748,6 @@ export default class TransactionService { // todo: consider async this.state.chainService.updateAssetSetting(toAssetSlug, { visible: true }, true).catch(console.error); - } else if (transaction.extrinsicType === ExtrinsicType.TRANSFER_XCM) { - const inputData = parseTransactionData(transaction.data); - const isPolygonBridge = _isPolygonChainBridge(inputData.originNetworkKey, inputData.destinationNetworkKey); - const extrinsicHash = transaction.extrinsicHash; - - if (isPolygonBridge) { - const actionType = (inputData.originNetworkKey === 'polygonzkEvm_cardona' || inputData.originNetworkKey === 'polygonZkEvm') - ? NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE_L2_TO_L1 - : NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE; - - this.state.inappNotificationService.writeWaitPolygonBridge(inputData, extrinsicHash, actionType) - .catch(console.error); - } } } diff --git a/packages/extension-base/src/types/avail-bridge/index.ts b/packages/extension-base/src/types/bridge/index.ts similarity index 100% rename from packages/extension-base/src/types/avail-bridge/index.ts rename to packages/extension-base/src/types/bridge/index.ts diff --git a/packages/extension-base/src/types/index.ts b/packages/extension-base/src/types/index.ts index e69192e1dbc..9989a6e439d 100644 --- a/packages/extension-base/src/types/index.ts +++ b/packages/extension-base/src/types/index.ts @@ -14,6 +14,7 @@ export interface Message extends MessageEvent { export * from './account'; export * from './balance'; +export * from './bridge'; export * from './buy'; export * from './campaigns'; export * from './common'; diff --git a/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/ClaimBridge.tsx b/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/ClaimBridge.tsx index 6f9f6f0e740..e8d0aa725eb 100644 --- a/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/ClaimBridge.tsx +++ b/packages/extension-koni-ui/src/Popup/Confirmations/variants/Transaction/variants/ClaimBridge.tsx @@ -3,7 +3,7 @@ import { ClaimAvailBridgeNotificationMetadata, ClaimPolygonBridgeNotificationMetadata } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; import { SWTransactionResult } from '@subwallet/extension-base/services/transaction-service/types'; -import { RequestClaimBridge } from '@subwallet/extension-base/types/avail-bridge'; +import { RequestClaimBridge } from '@subwallet/extension-base/types/bridge'; import { CommonTransactionInfo, MetaInfo } from '@subwallet/extension-koni-ui/components'; import { useGetChainAssetInfo, useGetNativeTokenBasicInfo, useTranslation } from '@subwallet/extension-koni-ui/hooks'; import { AlertDialogProps, ThemeProps } from '@subwallet/extension-koni-ui/types'; @@ -21,7 +21,9 @@ const Component: React.FC = (props: BaseTransa const { className, transaction } = props; const data = transaction.data as RequestClaimBridge; - const isPolygonBridge = (data.notification?.actionType === 'CLAIM_POLYGON_BRIDGE'); + const isPolygonBridge = useMemo(() => { + return data.notification?.actionType === 'CLAIM_POLYGON_BRIDGE'; + }, [data.notification?.actionType]); const metadata = useMemo(() => { if (isPolygonBridge) { 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 e27d7c0d8b2..ca2b8d198e7 100644 --- a/packages/extension-koni-ui/src/Popup/Settings/Notifications/Notification.tsx +++ b/packages/extension-koni-ui/src/Popup/Settings/Notifications/Notification.tsx @@ -46,8 +46,6 @@ export enum NotificationIconBackgroundColorMap { CLAIM = 'yellow-7', CLAIM_AVAIL_BRIDGE_ON_AVAIL = 'yellow-7', // temporary set CLAIM_AVAIL_BRIDGE_ON_ETHEREUM = 'yellow-7', - HAVE_TO_WAIT_POLYGON_BRIDGE = 'blue-8', - HAVE_TO_WAIT_POLYGON_BRIDGE_L2_TO_L1 = 'blue-8', CLAIM_POLYGON_BRIDGE = 'yellow-7' } @@ -58,8 +56,6 @@ export const NotificationIconMap = { CLAIM: Gift, CLAIM_AVAIL_BRIDGE_ON_AVAIL: Coins, // temporary set CLAIM_AVAIL_BRIDGE_ON_ETHEREUM: Coins, - HAVE_TO_WAIT_POLYGON_BRIDGE: Coins, - HAVE_TO_WAIT_POLYGON_BRIDGE_L2_TO_L1: Coins, CLAIM_POLYGON_BRIDGE: Coins }; diff --git a/packages/extension-koni-ui/src/Popup/Transaction/variants/ClaimBridge.tsx b/packages/extension-koni-ui/src/Popup/Transaction/variants/ClaimBridge.tsx index adce41b0fd6..a4653c62ac7 100644 --- a/packages/extension-koni-ui/src/Popup/Transaction/variants/ClaimBridge.tsx +++ b/packages/extension-koni-ui/src/Popup/Transaction/variants/ClaimBridge.tsx @@ -40,7 +40,9 @@ const Component: React.FC = (props: ComponentProps) => { const { accounts } = useSelector((state) => state.accountState); const { chainInfoMap } = useSelector((state) => state.chainStore); - const isPolygonBridge = (notification?.actionType === 'CLAIM_POLYGON_BRIDGE'); + const isPolygonBridge = useMemo(() => { + return notification?.actionType === 'CLAIM_POLYGON_BRIDGE'; + }, [notification?.actionType]); const metadata = useMemo(() => { if (isPolygonBridge) { diff --git a/packages/extension-koni-ui/src/messaging/transaction/bridge.ts b/packages/extension-koni-ui/src/messaging/transaction/bridge.ts index c1b8c10bc6d..efe9a48cbfd 100644 --- a/packages/extension-koni-ui/src/messaging/transaction/bridge.ts +++ b/packages/extension-koni-ui/src/messaging/transaction/bridge.ts @@ -1,7 +1,7 @@ // Copyright 2019-2022 @subwallet/extension-koni-ui authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { RequestClaimBridge } from '@subwallet/extension-base/types/avail-bridge'; +import { RequestClaimBridge } from '@subwallet/extension-base/types/bridge'; import { sendMessage } from '@subwallet/extension-koni-ui/messaging'; export async function submitClaimAvailBridge (data: RequestClaimBridge) { From 222a14dc1a8585fe1c9e330ba82ed230d08d591e Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Fri, 22 Nov 2024 09:30:28 +0700 Subject: [PATCH 076/204] [Issue-3814] minor update --- .../src/services/chain-online-service/index.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/extension-base/src/services/chain-online-service/index.ts b/packages/extension-base/src/services/chain-online-service/index.ts index eab7849b1f0..f9236c81f6e 100644 --- a/packages/extension-base/src/services/chain-online-service/index.ts +++ b/packages/extension-base/src/services/chain-online-service/index.ts @@ -105,11 +105,11 @@ export class ChainOnlineService { patchVersion: latestPatchVersion } = latestPatch; const currentPatchVersion = (await this.settingService.getChainlistSetting())?.patchVersion || ''; - let chainInfoMap: Record = this.chainService.getChainInfoMap(); - let assetRegistry: Record = this.chainService.getAssetRegistry(); - let multiChainAssetMap: Record = MultiChainAssetMap; - let currentChainStateMap: Record = this.chainService.getChainStateMap(); - let currentChainStatusMap: Record = this.chainService.getChainStatusMap(); + let chainInfoMap: Record = structuredClone(this.chainService.getChainInfoMap()); + let assetRegistry: Record = structuredClone(this.chainService.getAssetRegistry()); + let multiChainAssetMap: Record = structuredClone(MultiChainAssetMap); + let currentChainStateMap: Record = structuredClone(this.chainService.getChainStateMap()); + let currentChainStatusMap: Record = structuredClone(this.chainService.getChainStatusMap()); let addedChain: string[] = []; if (isSafePatch && currentPatchVersion !== latestPatchVersion) { @@ -117,7 +117,7 @@ export class ChainOnlineService { if (latestChainInfo && Object.keys(latestChainInfo).length > 0) { chainInfoMap = Object.assign({}, this.chainService.getChainInfoMap(), latestChainInfo); - [currentChainStateMap, currentChainStatusMap] = [this.chainService.getChainStateMap(), this.chainService.getChainStatusMap()]; + [currentChainStateMap, currentChainStatusMap] = [structuredClone(this.chainService.getChainStateMap()), structuredClone(this.chainService.getChainStatusMap())]; const [currentChainStateKey, newChainKey] = [Object.keys(currentChainStateMap), Object.keys(chainInfoMap)]; From 6b52a61b32362bb6c195668d897dd80205e4bebe Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Fri, 22 Nov 2024 10:29:20 +0700 Subject: [PATCH 077/204] [Update] Fix migrate code --- .../src/background/KoniTypes.ts | 1 - .../src/services/fee-service/utils/index.ts | 31 +++++++++---------- .../inapp-notification-service/consts.ts | 6 +--- .../inapp-notification-service/index.ts | 24 -------------- .../inapp-notification-service/interfaces.ts | 4 --- .../utils/polygon.ts | 8 ----- .../MigrateTransactionHistoryBridge.ts | 12 ++++--- .../migration-service/scripts/index.ts | 2 +- .../src/services/transaction-service/index.ts | 2 +- 9 files changed, 25 insertions(+), 65 deletions(-) diff --git a/packages/extension-base/src/background/KoniTypes.ts b/packages/extension-base/src/background/KoniTypes.ts index 74acf35b399..e8d7419fc5b 100644 --- a/packages/extension-base/src/background/KoniTypes.ts +++ b/packages/extension-base/src/background/KoniTypes.ts @@ -516,7 +516,6 @@ export enum ExtrinsicType { SWAP = 'swap', - CLAIM_AVAIL_BRIDGE = 'claim.claim_avail_bridge', // Migrate Claim Bridge CLAIM_BRIDGE = 'claim.claim_bridge', // SET_FEE_TOKEN = 'set_fee-token', 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 2a6ee46bbcf..d22dccea378 100644 --- a/packages/extension-base/src/services/fee-service/utils/index.ts +++ b/packages/extension-base/src/services/fee-service/utils/index.ts @@ -1,7 +1,6 @@ // Copyright 2019-2022 @subwallet/extension-base // SPDX-License-Identifier: Apache-2.0 -import { COMMON_CHAIN_SLUGS } from '@subwallet/chain-list'; import { GAS_PRICE_RATIO, NETWORK_MULTI_GAS_FEE } from '@subwallet/extension-base/constants'; import { _EvmApi } from '@subwallet/extension-base/services/chain-service/types'; import { EvmFeeInfo, EvmFeeInfoCache, InfuraFeeInfo } from '@subwallet/extension-base/types'; @@ -122,6 +121,21 @@ 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; + const gasPriceInWei = gasResponse.standard * 1e9 + 200000; + + return { + gasPrice: gasPriceInWei.toString(), + maxFeePerGas: undefined, + maxPriorityFeePerGas: undefined, + baseGasFee: undefined, + busyNetwork: false + }; + } + const numBlock = 20; const rewardPercent: number[] = []; @@ -219,21 +233,6 @@ export const calculateGasFeeParams = async (web3: _EvmApi, networkKey: string, u }; } - 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; - const gasPriceInWei = gasResponse.standard * 1e9 + 200000; - - return { - gasPrice: gasPriceInWei.toString(), - maxFeePerGas: undefined, - maxPriorityFeePerGas: undefined, - baseGasFee: undefined, - busyNetwork: false - }; - } - /* Max gas = (base + priority) * 1.5 (if not busy or 2 when busy); */ const maxFeePerGas = baseGasFee.plus(maxPriorityFeePerGas).multipliedBy(busyNetwork ? 2 : 1.5).decimalPlaces(0); diff --git a/packages/extension-base/src/services/inapp-notification-service/consts.ts b/packages/extension-base/src/services/inapp-notification-service/consts.ts index 18cfacc00de..e2d3971e895 100644 --- a/packages/extension-base/src/services/inapp-notification-service/consts.ts +++ b/packages/extension-base/src/services/inapp-notification-service/consts.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { NotificationActionType } from './interfaces'; -import { getAvailBridgeClaimDescription, getClaimDescription, getPolygonBridgeClaimDescription, getReceiveDescription, getSendDescription, getWaitPolygonBridgeDescription, getWaitPolygonBridgeL2toL1Description, getWithdrawDescription } from './utils'; +import { getAvailBridgeClaimDescription, getClaimDescription, getPolygonBridgeClaimDescription, getReceiveDescription, getSendDescription, getWithdrawDescription } from './utils'; export const NotificationTitleMap = { [NotificationActionType.WITHDRAW]: '[{{accountName}}] WITHDRAW {{tokenSymbol}}', @@ -11,8 +11,6 @@ export const NotificationTitleMap = { [NotificationActionType.RECEIVE]: '[{{accountName}}] RECEIVE {{tokenSymbol}}', [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_AVAIL]: '[{{accountName}}] CLAIM {{tokenSymbol}}', [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_ETHEREUM]: '[{{accountName}}] CLAIM {{tokenSymbol}}', - [NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE]: '[{{accountName}}] BRIDGE {{tokenSymbol}}', - [NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE_L2_TO_L1]: '[{{accountName}}] BRIDGE {{tokenSymbol}}', [NotificationActionType.CLAIM_POLYGON_BRIDGE]: '[{{accountName}}] CLAIM {{tokenSymbol}}' }; @@ -23,8 +21,6 @@ export const NotificationDescriptionMap = { [NotificationActionType.RECEIVE]: getReceiveDescription, [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_AVAIL]: getAvailBridgeClaimDescription, [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_ETHEREUM]: getAvailBridgeClaimDescription, - [NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE]: getWaitPolygonBridgeDescription, - [NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE_L2_TO_L1]: getWaitPolygonBridgeL2toL1Description, [NotificationActionType.CLAIM_POLYGON_BRIDGE]: getPolygonBridgeClaimDescription }; diff --git a/packages/extension-base/src/services/inapp-notification-service/index.ts b/packages/extension-base/src/services/inapp-notification-service/index.ts index 80cb10432a9..cbe795c37ea 100644 --- a/packages/extension-base/src/services/inapp-notification-service/index.ts +++ b/packages/extension-base/src/services/inapp-notification-service/index.ts @@ -14,7 +14,6 @@ import { _BaseNotificationInfo, _NotificationInfo, ClaimAvailBridgeNotificationM import { AvailBridgeSourceChain, AvailBridgeTransaction, fetchAllAvailBridgeClaimable, fetchPolygonBridgeTransactions, hrsToMillisecond, PolygonTransaction } from '@subwallet/extension-base/services/inapp-notification-service/utils'; import { KeyringService } from '@subwallet/extension-base/services/keyring-service'; import DatabaseService from '@subwallet/extension-base/services/storage-service/DatabaseService'; -import { RequestCrossChainTransfer } from '@subwallet/extension-base/types'; import { GetNotificationParams, RequestSwitchStatusParams } from '@subwallet/extension-base/types/notification'; import { categoryAddresses, formatNumber } from '@subwallet/extension-base/utils'; import { isSubstrateAddress } from '@subwallet/keyring'; @@ -299,8 +298,6 @@ export class InappNotificationService implements CronServiceInterface { } // Polygon Claimable Handle - - // @ts-ignore async createPolygonClaimableTransactions () { const { evm: evmAddresses } = this.getCategorizedAddresses(); const etherChains = [COMMON_ASSETS.ETH, COMMON_ASSETS.ETH_SEPOLIA]; @@ -366,27 +363,6 @@ export class InappNotificationService implements CronServiceInterface { await this.validateAndWriteNotificationsToDB(notifications, address); } - public async writeWaitPolygonBridge (request: RequestCrossChainTransfer, transactionHash: string, actionType: NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE | NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE_L2_TO_L1) { - const { from: address, tokenSlug, value: amount } = request; - const timestamp = Date.now(); - const token = this.chainService.getAssetBySlug(tokenSlug); - const symbol = token.symbol; - const decimals = token.decimals ?? 0; - const notification: _BaseNotificationInfo = { - id: `${actionType}___${transactionHash}___${timestamp}`, - address: address, // address is senderAddress - title: NotificationTitleMap[actionType].replace('{{tokenSymbol}}', symbol), - description: NotificationDescriptionMap[actionType](formatNumber(amount, decimals), symbol), - time: timestamp, - extrinsicType: ExtrinsicType.TRANSFER_XCM, - isRead: false, - actionType, - metadata: undefined - }; - - await this.validateAndWriteNotificationsToDB([notification], address); - } - // Polygon Claimable Handle async start (): Promise { diff --git a/packages/extension-base/src/services/inapp-notification-service/interfaces.ts b/packages/extension-base/src/services/inapp-notification-service/interfaces.ts index ee762eba8a1..e6fcc523890 100644 --- a/packages/extension-base/src/services/inapp-notification-service/interfaces.ts +++ b/packages/extension-base/src/services/inapp-notification-service/interfaces.ts @@ -34,8 +34,6 @@ export interface ActionTypeToMetadataMap { [NotificationActionType.CLAIM]: WithdrawClaimNotificationMetadata, [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_AVAIL]: ClaimAvailBridgeNotificationMetadata, [NotificationActionType.CLAIM_AVAIL_BRIDGE_ON_ETHEREUM]: ClaimAvailBridgeNotificationMetadata, - [NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE]: unknown, - [NotificationActionType.HAVE_TO_WAIT_POLYGON_BRIDGE_L2_TO_L1]: unknown, [NotificationActionType.CLAIM_POLYGON_BRIDGE]: ClaimPolygonBridgeNotificationMetadata } @@ -97,8 +95,6 @@ export enum NotificationActionType { CLAIM = 'CLAIM', // Claim reward CLAIM_AVAIL_BRIDGE_ON_AVAIL = 'CLAIM_AVAIL_BRIDGE_ON_AVAIL', CLAIM_AVAIL_BRIDGE_ON_ETHEREUM = 'CLAIM_AVAIL_BRIDGE_ON_ETHEREUM', - HAVE_TO_WAIT_POLYGON_BRIDGE = 'HAVE_TO_WAIT_POLYGON_BRIDGE', - HAVE_TO_WAIT_POLYGON_BRIDGE_L2_TO_L1 = 'HAVE_TO_WAIT_POLYGON_BRIDGE_L2_TO_L1', CLAIM_POLYGON_BRIDGE = 'CLAIM_POLYGON_BRIDGE' } 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 1407ac4ba47..5bdc1476db9 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 @@ -75,14 +75,6 @@ interface PolygonTransactionResponse { } /* Description */ -export function getWaitPolygonBridgeDescription (amount: string, symbol: string) { - return `${amount} ${symbol} will arrive in 30 minutes from Polygon Unified Bridge!`; -} - -export function getWaitPolygonBridgeL2toL1Description (amount: string, symbol: string) { - return `${amount} ${symbol} will arrive in 180 minutes from Polygon Unified Bridge!`; -} - export function getPolygonBridgeClaimDescription (amount: string, symbol: string) { return `${amount} ${symbol} ready to claim from ${symbol} cross-chain transfer. Click to claim now!`; } diff --git a/packages/extension-base/src/services/migration-service/scripts/MigrateTransactionHistoryBridge.ts b/packages/extension-base/src/services/migration-service/scripts/MigrateTransactionHistoryBridge.ts index d819a676bfa..4d5b79c7e67 100644 --- a/packages/extension-base/src/services/migration-service/scripts/MigrateTransactionHistoryBridge.ts +++ b/packages/extension-base/src/services/migration-service/scripts/MigrateTransactionHistoryBridge.ts @@ -8,6 +8,7 @@ import Dexie from 'dexie'; export default class MigrateTransactionHistoryBridge extends BaseMigrationJob { public override async run (): Promise { const state = this.state; + const newTransactionItems: TransactionHistoryItem[] = []; try { const db = new Dexie('SubWalletDB_v2'); @@ -16,17 +17,18 @@ export default class MigrateTransactionHistoryBridge extends BaseMigrationJob { const oldTransactionData = (await transactionTable.toArray()) as TransactionHistoryItem[]; - const claimAvailBridgeTransactions = oldTransactionData.filter((item) => item.type === ExtrinsicType.CLAIM_AVAIL_BRIDGE); + const claimAvailBridgeTransactions = oldTransactionData.filter((item) => item.type as string === 'claim.claim_avail_bridge'); - console.log('Hmm', claimAvailBridgeTransactions); - await Promise.all(claimAvailBridgeTransactions.map(async (item) => { + claimAvailBridgeTransactions.forEach((item) => { const newItem: TransactionHistoryItem = { ...item, type: ExtrinsicType.CLAIM_BRIDGE }; - await state.historyService.updateHistoryByExtrinsicHash(newItem.extrinsicHash, newItem); - })); + newTransactionItems.push(newItem); + }); + + await state.dbService.upsertHistory(newTransactionItems); } catch (e) { this.logger.error(e); } diff --git a/packages/extension-base/src/services/migration-service/scripts/index.ts b/packages/extension-base/src/services/migration-service/scripts/index.ts index acd55c887f7..03be614d842 100644 --- a/packages/extension-base/src/services/migration-service/scripts/index.ts +++ b/packages/extension-base/src/services/migration-service/scripts/index.ts @@ -64,7 +64,7 @@ export default >{ '1.2.13-01': ReloadMetadata, '1.2.14-01': ClearMetadataDatabase, '1.2.32-01': MigratePairData, - '1.3.6-07': MigrateTransactionHistoryBridge + '1.3.6-01': MigrateTransactionHistoryBridge // [`${EVERYTIME}-1.1.42-02`]: MigrateTransactionHistoryBySymbol // [`${EVERYTIME}-1`]: AutoEnableChainsTokens }; diff --git a/packages/extension-base/src/services/transaction-service/index.ts b/packages/extension-base/src/services/transaction-service/index.ts index 0524780c0c5..ab0935133ad 100644 --- a/packages/extension-base/src/services/transaction-service/index.ts +++ b/packages/extension-base/src/services/transaction-service/index.ts @@ -14,7 +14,7 @@ import { ChainService } from '@subwallet/extension-base/services/chain-service'; import { _getAssetDecimals, _getAssetSymbol, _getChainNativeTokenBasicInfo, _getEvmChainId, _isChainEvmCompatible } from '@subwallet/extension-base/services/chain-service/utils'; import { EventService } from '@subwallet/extension-base/services/event-service'; import { HistoryService } from '@subwallet/extension-base/services/history-service'; -import { ClaimAvailBridgeNotificationMetadata, NotificationActionType } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; +import { ClaimAvailBridgeNotificationMetadata } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; import { EXTENSION_REQUEST_URL } from '@subwallet/extension-base/services/request-service/constants'; import { TRANSACTION_TIMEOUT } from '@subwallet/extension-base/services/transaction-service/constants'; import { parseLiquidStakingEvents, parseLiquidStakingFastUnstakeEvents, parseTransferEventLogs, parseXcmEventLogs } from '@subwallet/extension-base/services/transaction-service/event-parser'; From 4b381db3041f8aa1313c6063284ffb768f0a5699 Mon Sep 17 00:00:00 2001 From: S2kael Date: Fri, 22 Nov 2024 11:19:14 +0700 Subject: [PATCH 078/204] [Issue-3852] Update metadata for case KSM and DOT --- package.json | 2 +- packages/extension-base/package.json | 2 +- packages/extension-koni-ui/package.json | 2 +- packages/extension-web-ui/package.json | 2 +- yarn.lock | 14 +++++++------- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 34e7a3175f5..2f2373782b3 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@polkadot/types-support": "^12.0.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/chain-list": "0.2.94", + "@subwallet/chain-list": "0.2.95-beta.0", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b79", "@subwallet/ui-keyring": "0.1.8-beta.0", diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index 9d2d29dfef1..1c8285c7a44 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -55,7 +55,7 @@ "@reduxjs/toolkit": "^1.9.1", "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", - "@subwallet/chain-list": "0.2.94", + "@subwallet/chain-list": "0.2.95-beta.0", "@subwallet/extension-base": "^1.3.6-1", "@subwallet/extension-chains": "^1.3.6-1", "@subwallet/extension-dapp": "^1.3.6-1", diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index 95e39b951b5..ddb46ecbabb 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -34,7 +34,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.94", + "@subwallet/chain-list": "0.2.95-beta.0", "@subwallet/extension-base": "^1.3.6-1", "@subwallet/extension-chains": "^1.3.6-1", "@subwallet/extension-dapp": "^1.3.6-1", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index f6388c3515d..67b50a586d7 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -35,7 +35,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.94", + "@subwallet/chain-list": "0.2.95-beta.0", "@subwallet/extension-base": "^1.3.6-1", "@subwallet/extension-chains": "^1.3.6-1", "@subwallet/extension-dapp": "^1.3.6-1", diff --git a/yarn.lock b/yarn.lock index 65e003f1ce5..082ac522da1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6265,14 +6265,14 @@ __metadata: languageName: node linkType: hard -"@subwallet/chain-list@npm:0.2.94": - version: 0.2.94 - resolution: "@subwallet/chain-list@npm:0.2.94" +"@subwallet/chain-list@npm:0.2.95-beta.0": + version: 0.2.95-beta.0 + resolution: "@subwallet/chain-list@npm:0.2.95-beta.0" dependencies: "@polkadot/dev": 0.67.167 "@polkadot/util": ^12.5.1 eventemitter3: ^5.0.1 - checksum: cf285d30673bf98dc577baccffbaac96e49d5c5d718bb8c9fd9fe116318e753b16940907e143bfc1c212e5f3185713d82509fba85d42cbdd33a7177628e3bae4 + checksum: 23710027b2df62ff33eb5cbfe38fe82b254354d2cf67dc5a284233dfc2269e0691c357cd47a2fc7c2ff5bb4d8d1f8a8b7d492b9ac30344f5b594f4bc53335847 languageName: node linkType: hard @@ -6315,7 +6315,7 @@ __metadata: "@reduxjs/toolkit": ^1.9.1 "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 - "@subwallet/chain-list": 0.2.94 + "@subwallet/chain-list": 0.2.95-beta.0 "@subwallet/extension-base": ^1.3.6-1 "@subwallet/extension-chains": ^1.3.6-1 "@subwallet/extension-dapp": ^1.3.6-1 @@ -6453,7 +6453,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.94 + "@subwallet/chain-list": 0.2.95-beta.0 "@subwallet/extension-base": ^1.3.6-1 "@subwallet/extension-chains": ^1.3.6-1 "@subwallet/extension-dapp": ^1.3.6-1 @@ -6593,7 +6593,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.94 + "@subwallet/chain-list": 0.2.95-beta.0 "@subwallet/extension-base": ^1.3.6-1 "@subwallet/extension-chains": ^1.3.6-1 "@subwallet/extension-dapp": ^1.3.6-1 From d807137e1dc45835044a8eb8eaa663bff33f5a97 Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Fri, 22 Nov 2024 14:17:42 +0700 Subject: [PATCH 079/204] Update Chainlist --- package.json | 2 +- packages/extension-base/package.json | 2 +- packages/extension-koni-ui/package.json | 2 +- packages/extension-web-ui/package.json | 2 +- yarn.lock | 14 +++++++------- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 1e1f309f86f..e3e17a0c20e 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@polkadot/types-support": "^12.0.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/chain-list": "0.2.94-beta.0", + "@subwallet/chain-list": "0.2.95-beta.1", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b79", "@subwallet/ui-keyring": "0.1.8-beta.0", diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index bf1b7efd655..9d2e6c273c7 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -55,7 +55,7 @@ "@reduxjs/toolkit": "^1.9.1", "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", - "@subwallet/chain-list": "0.2.94-beta.0", + "@subwallet/chain-list": "0.2.95-beta.1", "@subwallet/extension-base": "^1.3.6-1", "@subwallet/extension-chains": "^1.3.6-1", "@subwallet/extension-dapp": "^1.3.6-1", diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index a0a1151e1b6..24e5681ecf7 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -34,7 +34,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.94-beta.0", + "@subwallet/chain-list": "0.2.95-beta.1", "@subwallet/extension-base": "^1.3.6-1", "@subwallet/extension-chains": "^1.3.6-1", "@subwallet/extension-dapp": "^1.3.6-1", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index 3c408e2ba09..97fac709393 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -35,7 +35,7 @@ "@polkadot/util-crypto": "^12.6.2", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.94-beta.0", + "@subwallet/chain-list": "0.2.95-beta.1", "@subwallet/extension-base": "^1.3.6-1", "@subwallet/extension-chains": "^1.3.6-1", "@subwallet/extension-dapp": "^1.3.6-1", diff --git a/yarn.lock b/yarn.lock index caf2a3bbaf1..16fdb812399 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6265,14 +6265,14 @@ __metadata: languageName: node linkType: hard -"@subwallet/chain-list@npm:0.2.94-beta.0": - version: 0.2.94-beta.0 - resolution: "@subwallet/chain-list@npm:0.2.94-beta.0" +"@subwallet/chain-list@npm:0.2.95-beta.1": + version: 0.2.95-beta.1 + resolution: "@subwallet/chain-list@npm:0.2.95-beta.1" dependencies: "@polkadot/dev": 0.67.167 "@polkadot/util": ^12.5.1 eventemitter3: ^5.0.1 - checksum: d8cc4bcca4f3140d73ad189380ad0fc1df334be25ed58f0aef4f31d100059cbddaa5201d20f27a2be99500d3def7f669619c304558647f019053e60f8516553e + checksum: 3300d2e078128431b6c4ea254dc21f4dadd956f2a6cc8c154a3dd2c8a163d4de647414931172cbeaab102617c9f8c0802aa7f07019449e96be0b239e1646014d languageName: node linkType: hard @@ -6315,7 +6315,7 @@ __metadata: "@reduxjs/toolkit": ^1.9.1 "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 - "@subwallet/chain-list": 0.2.94-beta.0 + "@subwallet/chain-list": 0.2.95-beta.1 "@subwallet/extension-base": ^1.3.6-1 "@subwallet/extension-chains": ^1.3.6-1 "@subwallet/extension-dapp": ^1.3.6-1 @@ -6453,7 +6453,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.94-beta.0 + "@subwallet/chain-list": 0.2.95-beta.1 "@subwallet/extension-base": ^1.3.6-1 "@subwallet/extension-chains": ^1.3.6-1 "@subwallet/extension-dapp": ^1.3.6-1 @@ -6593,7 +6593,7 @@ __metadata: "@polkadot/util-crypto": ^12.6.2 "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 - "@subwallet/chain-list": 0.2.94-beta.0 + "@subwallet/chain-list": 0.2.95-beta.1 "@subwallet/extension-base": ^1.3.6-1 "@subwallet/extension-chains": ^1.3.6-1 "@subwallet/extension-dapp": ^1.3.6-1 From 842699a73bdddb638e4da47dee2f231f6f0d647a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 23 Nov 2024 03:07:45 +0000 Subject: [PATCH 080/204] [CI Skip] release/beta 1.3.7-0 skip-checks: true --- CONTRIBUTORS | 10 +-- package.json | 2 +- packages/extension-base/package.json | 12 ++-- packages/extension-base/src/packageInfo.ts | 2 +- packages/extension-chains/package.json | 4 +- packages/extension-chains/src/packageInfo.ts | 2 +- .../extension-compat-metamask/package.json | 4 +- .../src/packageInfo.ts | 2 +- packages/extension-dapp/package.json | 4 +- packages/extension-dapp/src/packageInfo.ts | 2 +- packages/extension-inject/package.json | 2 +- packages/extension-inject/src/packageInfo.ts | 2 +- packages/extension-koni-ui/package.json | 12 ++-- packages/extension-koni/package.json | 8 +-- packages/extension-koni/src/packageInfo.ts | 2 +- packages/extension-mocks/package.json | 2 +- packages/extension-web-ui/package.json | 12 ++-- packages/web-runner/package.json | 8 +-- packages/webapp/package.json | 8 +-- yarn.lock | 68 +++++++++---------- 20 files changed, 84 insertions(+), 84 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 02ae7a29146..1eae1afd842 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,10 +1,10 @@ - 2885 AnhMTV Release version 1.3.6 + 2890 AnhMTV 2546 Nam Phạm [Issue 3747] chore: fix eslint - 2366 S2kael [Issue-3828] Update stable version for chain-list + 2369 S2kael [Issue-3852] Update metadata for case KSM and DOT 869 lw-cdm [MasterAccount] Update logic to reorder account on select account modal 568 nguyentiendung [Issue-3553] [Issue-3553] Refactor code and add recipient to swap history. 465 Jaco 0.42.5 (#969) - 458 bluezdot [Issue-3515] fix: minor fix + 463 bluezdot [Issue-3814] fix: handle exceptions 354 Thiendekaco [Issue-3707] [fix] Unified account - fix dApp ui bug #4 186 dominhquang [Issue-3507] Fix UI bug for Notification 185 quangdo @@ -17,10 +17,10 @@ 83 leewong 82 Thibaut Sardan Add account filtering feature (#832) 73 bluedot [Issue-3579] fix: update check fully migrate - 70 PDTnhah [Issue-3828] Update chainlist + 73 PDTnhah [Issue-3846] Update chainlist 63 Roman fix ui issues 53 Dominhquangdev update Bridge code - 34 tunghp2002 + 43 tunghp2002 [Update] Fix UI 26 S2kael 10 Trang Trịnh api get karura and acala nfts 9 Minh Le diff --git a/package.json b/package.json index 2f2373782b3..a3ebc73cfb4 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "url": "https://github.com/Koniverse/Subwallet-V2.git" }, "sideEffects": false, - "version": "1.3.6", + "version": "1.3.7-0", "workspaces": [ "packages/*" ], diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index 1c8285c7a44..4aed709aed7 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -17,7 +17,7 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.6-1", + "version": "1.3.7-0", "main": "index.js", "dependencies": { "@acala-network/api": "^5.0.2", @@ -56,10 +56,10 @@ "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", "@subwallet/chain-list": "0.2.95-beta.0", - "@subwallet/extension-base": "^1.3.6-1", - "@subwallet/extension-chains": "^1.3.6-1", - "@subwallet/extension-dapp": "^1.3.6-1", - "@subwallet/extension-inject": "^1.3.6-1", + "@subwallet/extension-base": "^1.3.7-0", + "@subwallet/extension-chains": "^1.3.7-0", + "@subwallet/extension-dapp": "^1.3.7-0", + "@subwallet/extension-inject": "^1.3.7-0", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/ui-keyring": "^0.1.8-beta.0", "@ton/core": "^0.56.3", @@ -104,7 +104,7 @@ "web3-utils": "^1.10.0" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.3.6-1", + "@subwallet/extension-mocks": "^1.3.7-0", "@types/uuid": "^9.0.1" } } diff --git a/packages/extension-base/src/packageInfo.ts b/packages/extension-base/src/packageInfo.ts index b8e75b8316c..26743555cfd 100644 --- a/packages/extension-base/src/packageInfo.ts +++ b/packages/extension-base/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-base', path: 'auto', type: 'auto', version: '1.3.6-1' }; +export const packageInfo = { name: '@subwallet/extension-base', path: 'auto', type: 'auto', version: '1.3.7-0' }; diff --git a/packages/extension-chains/package.json b/packages/extension-chains/package.json index 2dfbef667bd..a2684016cce 100644 --- a/packages/extension-chains/package.json +++ b/packages/extension-chains/package.json @@ -17,14 +17,14 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.6-1", + "version": "1.3.7-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@polkadot/networks": "^12.6.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/extension-inject": "^1.3.6-1" + "@subwallet/extension-inject": "^1.3.7-0" }, "peerDependencies": { "@polkadot/api": "*", diff --git a/packages/extension-chains/src/packageInfo.ts b/packages/extension-chains/src/packageInfo.ts index 25dbd7f4729..12feb6eb367 100644 --- a/packages/extension-chains/src/packageInfo.ts +++ b/packages/extension-chains/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-chains', path: 'auto', type: 'auto', version: '1.3.6-1' }; +export const packageInfo = { name: '@subwallet/extension-chains', path: 'auto', type: 'auto', version: '1.3.7-0' }; diff --git a/packages/extension-compat-metamask/package.json b/packages/extension-compat-metamask/package.json index bffb9362b84..332dbb50cac 100644 --- a/packages/extension-compat-metamask/package.json +++ b/packages/extension-compat-metamask/package.json @@ -17,14 +17,14 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.6-1", + "version": "1.3.7-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@metamask/detect-provider": "^1.2.0", "@polkadot/types": "^11.0.3", "@polkadot/util": "^12.6.2", - "@subwallet/extension-inject": "^1.3.6-1", + "@subwallet/extension-inject": "^1.3.7-0", "web3": "^1.10.0" }, "peerDependencies": { diff --git a/packages/extension-compat-metamask/src/packageInfo.ts b/packages/extension-compat-metamask/src/packageInfo.ts index cc09eca6762..8706e6a9e05 100644 --- a/packages/extension-compat-metamask/src/packageInfo.ts +++ b/packages/extension-compat-metamask/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-compat-metamask', path: 'auto', type: 'auto', version: '1.3.6-1' }; +export const packageInfo = { name: '@subwallet/extension-compat-metamask', path: 'auto', type: 'auto', version: '1.3.7-0' }; diff --git a/packages/extension-dapp/package.json b/packages/extension-dapp/package.json index 0c700b446cd..2f1866ec58c 100644 --- a/packages/extension-dapp/package.json +++ b/packages/extension-dapp/package.json @@ -17,13 +17,13 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.3.6-1", + "version": "1.3.7-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/extension-inject": "^1.3.6-1" + "@subwallet/extension-inject": "^1.3.7-0" }, "peerDependencies": { "@polkadot/api": "*", diff --git a/packages/extension-dapp/src/packageInfo.ts b/packages/extension-dapp/src/packageInfo.ts index 68cf40bf36f..f035d0e1d81 100644 --- a/packages/extension-dapp/src/packageInfo.ts +++ b/packages/extension-dapp/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-dapp', path: 'auto', type: 'auto', version: '1.3.6-1' }; +export const packageInfo = { name: '@subwallet/extension-dapp', path: 'auto', type: 'auto', version: '1.3.7-0' }; diff --git a/packages/extension-inject/package.json b/packages/extension-inject/package.json index 17ed342fe17..af574f79d1b 100644 --- a/packages/extension-inject/package.json +++ b/packages/extension-inject/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.3.6-1", + "version": "1.3.7-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", diff --git a/packages/extension-inject/src/packageInfo.ts b/packages/extension-inject/src/packageInfo.ts index bb96cf18aa2..8583f27ac45 100644 --- a/packages/extension-inject/src/packageInfo.ts +++ b/packages/extension-inject/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-inject', path: 'auto', type: 'auto', version: '1.3.6-1' }; +export const packageInfo = { name: '@subwallet/extension-inject', path: 'auto', type: 'auto', version: '1.3.7-0' }; diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index ddb46ecbabb..b47a2324dec 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.3.6-1", + "version": "1.3.7-0", "dependencies": { "@babel/runtime": "^7.20.6", "@coinbase/cbpay-js": "^1.7.0", @@ -35,10 +35,10 @@ "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", "@subwallet/chain-list": "0.2.95-beta.0", - "@subwallet/extension-base": "^1.3.6-1", - "@subwallet/extension-chains": "^1.3.6-1", - "@subwallet/extension-dapp": "^1.3.6-1", - "@subwallet/extension-inject": "^1.3.6-1", + "@subwallet/extension-base": "^1.3.7-0", + "@subwallet/extension-chains": "^1.3.7-0", + "@subwallet/extension-dapp": "^1.3.7-0", + "@subwallet/extension-inject": "^1.3.7-0", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b77", "@subwallet/ui-keyring": "^0.1.8-beta.0", @@ -87,7 +87,7 @@ "usehooks-ts": "^2.9.1" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.3.6-1", + "@subwallet/extension-mocks": "^1.3.7-0", "@types/bn.js": "^5.1.1", "@types/enzyme": "^3.10.12", "@types/enzyme-adapter-react-16": "^1.0.6", diff --git a/packages/extension-koni/package.json b/packages/extension-koni/package.json index 91dd6274c4c..3f2a22d5fb6 100644 --- a/packages/extension-koni/package.json +++ b/packages/extension-koni/package.json @@ -14,12 +14,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.6-1", + "version": "1.3.7-0", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.3.6-1", - "@subwallet/extension-inject": "^1.3.6-1", - "@subwallet/extension-koni-ui": "^1.3.6-1" + "@subwallet/extension-base": "^1.3.7-0", + "@subwallet/extension-inject": "^1.3.7-0", + "@subwallet/extension-koni-ui": "^1.3.7-0" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/packages/extension-koni/src/packageInfo.ts b/packages/extension-koni/src/packageInfo.ts index a5dc2675307..70d24ca9570 100644 --- a/packages/extension-koni/src/packageInfo.ts +++ b/packages/extension-koni/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-koni', path: 'auto', type: 'auto', version: '1.3.6-1' }; +export const packageInfo = { name: '@subwallet/extension-koni', path: 'auto', type: 'auto', version: '1.3.7-0' }; diff --git a/packages/extension-mocks/package.json b/packages/extension-mocks/package.json index 3ead41b403d..a0a7f0e655a 100644 --- a/packages/extension-mocks/package.json +++ b/packages/extension-mocks/package.json @@ -14,7 +14,7 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.6-1", + "version": "1.3.7-0", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index 67b50a586d7..5432a384ee1 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.3.6-1", + "version": "1.3.7-0", "dependencies": { "@babel/runtime": "^7.20.6", "@coinbase/cbpay-js": "^1.7.0", @@ -36,10 +36,10 @@ "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", "@subwallet/chain-list": "0.2.95-beta.0", - "@subwallet/extension-base": "^1.3.6-1", - "@subwallet/extension-chains": "^1.3.6-1", - "@subwallet/extension-dapp": "^1.3.6-1", - "@subwallet/extension-inject": "^1.3.6-1", + "@subwallet/extension-base": "^1.3.7-0", + "@subwallet/extension-chains": "^1.3.7-0", + "@subwallet/extension-dapp": "^1.3.7-0", + "@subwallet/extension-inject": "^1.3.7-0", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "^5.1.2-b77", "@subwallet/ui-keyring": "^0.1.8-beta.0", @@ -88,7 +88,7 @@ "usehooks-ts": "^2.9.1" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.3.6-1", + "@subwallet/extension-mocks": "^1.3.7-0", "@types/bn.js": "^5.1.1", "@types/enzyme": "^3.10.12", "@types/enzyme-adapter-react-16": "^1.0.6", diff --git a/packages/web-runner/package.json b/packages/web-runner/package.json index c153842d26f..f033f2ac6c6 100644 --- a/packages/web-runner/package.json +++ b/packages/web-runner/package.json @@ -14,12 +14,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.6-1", + "version": "1.3.7-0", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.3.6-1", - "@subwallet/extension-inject": "^1.3.6-1", - "@subwallet/extension-koni-ui": "^1.3.6-1" + "@subwallet/extension-base": "^1.3.7-0", + "@subwallet/extension-inject": "^1.3.7-0", + "@subwallet/extension-koni-ui": "^1.3.7-0" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/packages/webapp/package.json b/packages/webapp/package.json index 85b1ee0bc5a..13bb8d207ba 100644 --- a/packages/webapp/package.json +++ b/packages/webapp/package.json @@ -15,12 +15,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.3.6-1", + "version": "1.3.7-0", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.3.6-1", - "@subwallet/extension-inject": "^1.3.6-1", - "@subwallet/extension-web-ui": "^1.3.6-1" + "@subwallet/extension-base": "^1.3.7-0", + "@subwallet/extension-inject": "^1.3.7-0", + "@subwallet/extension-web-ui": "^1.3.7-0" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/yarn.lock b/yarn.lock index 082ac522da1..40f75f7ab9e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6276,7 +6276,7 @@ __metadata: languageName: node linkType: hard -"@subwallet/extension-base@^1.3.6-1, @subwallet/extension-base@workspace:packages/extension-base": +"@subwallet/extension-base@^1.3.7-0, @subwallet/extension-base@workspace:packages/extension-base": version: 0.0.0-use.local resolution: "@subwallet/extension-base@workspace:packages/extension-base" dependencies: @@ -6316,11 +6316,11 @@ __metadata: "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 "@subwallet/chain-list": 0.2.95-beta.0 - "@subwallet/extension-base": ^1.3.6-1 - "@subwallet/extension-chains": ^1.3.6-1 - "@subwallet/extension-dapp": ^1.3.6-1 - "@subwallet/extension-inject": ^1.3.6-1 - "@subwallet/extension-mocks": ^1.3.6-1 + "@subwallet/extension-base": ^1.3.7-0 + "@subwallet/extension-chains": ^1.3.7-0 + "@subwallet/extension-dapp": ^1.3.7-0 + "@subwallet/extension-inject": ^1.3.7-0 + "@subwallet/extension-mocks": ^1.3.7-0 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/ui-keyring": ^0.1.8-beta.0 "@ton/core": ^0.56.3 @@ -6367,7 +6367,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-chains@^1.3.6-1, @subwallet/extension-chains@workspace:packages/extension-chains": +"@subwallet/extension-chains@^1.3.7-0, @subwallet/extension-chains@workspace:packages/extension-chains": version: 0.0.0-use.local resolution: "@subwallet/extension-chains@workspace:packages/extension-chains" dependencies: @@ -6375,7 +6375,7 @@ __metadata: "@polkadot/networks": ^12.6.2 "@polkadot/util": ^12.6.2 "@polkadot/util-crypto": ^12.6.2 - "@subwallet/extension-inject": ^1.3.6-1 + "@subwallet/extension-inject": ^1.3.7-0 peerDependencies: "@polkadot/api": "*" "@polkadot/types": "*" @@ -6390,21 +6390,21 @@ __metadata: "@metamask/detect-provider": ^1.2.0 "@polkadot/types": ^11.0.3 "@polkadot/util": ^12.6.2 - "@subwallet/extension-inject": ^1.3.6-1 + "@subwallet/extension-inject": ^1.3.7-0 web3: ^1.10.0 peerDependencies: "@polkadot/util": "*" languageName: unknown linkType: soft -"@subwallet/extension-dapp@^1.3.6-1, @subwallet/extension-dapp@workspace:packages/extension-dapp": +"@subwallet/extension-dapp@^1.3.7-0, @subwallet/extension-dapp@workspace:packages/extension-dapp": version: 0.0.0-use.local resolution: "@subwallet/extension-dapp@workspace:packages/extension-dapp" dependencies: "@babel/runtime": ^7.20.6 "@polkadot/util": ^12.6.2 "@polkadot/util-crypto": ^12.6.2 - "@subwallet/extension-inject": ^1.3.6-1 + "@subwallet/extension-inject": ^1.3.7-0 peerDependencies: "@polkadot/api": "*" "@polkadot/util": "*" @@ -6412,7 +6412,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-inject@^1.3.6-1, @subwallet/extension-inject@workspace:packages/extension-inject": +"@subwallet/extension-inject@^1.3.7-0, @subwallet/extension-inject@workspace:packages/extension-inject": version: 0.0.0-use.local resolution: "@subwallet/extension-inject@workspace:packages/extension-inject" dependencies: @@ -6431,7 +6431,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-koni-ui@^1.3.6-1, @subwallet/extension-koni-ui@workspace:packages/extension-koni-ui": +"@subwallet/extension-koni-ui@^1.3.7-0, @subwallet/extension-koni-ui@workspace:packages/extension-koni-ui": version: 0.0.0-use.local resolution: "@subwallet/extension-koni-ui@workspace:packages/extension-koni-ui" dependencies: @@ -6454,11 +6454,11 @@ __metadata: "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 "@subwallet/chain-list": 0.2.95-beta.0 - "@subwallet/extension-base": ^1.3.6-1 - "@subwallet/extension-chains": ^1.3.6-1 - "@subwallet/extension-dapp": ^1.3.6-1 - "@subwallet/extension-inject": ^1.3.6-1 - "@subwallet/extension-mocks": ^1.3.6-1 + "@subwallet/extension-base": ^1.3.7-0 + "@subwallet/extension-chains": ^1.3.7-0 + "@subwallet/extension-dapp": ^1.3.7-0 + "@subwallet/extension-inject": ^1.3.7-0 + "@subwallet/extension-mocks": ^1.3.7-0 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/react-ui": 5.1.2-b77 "@subwallet/ui-keyring": ^0.1.8-beta.0 @@ -6531,9 +6531,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.6-1 - "@subwallet/extension-inject": ^1.3.6-1 - "@subwallet/extension-koni-ui": ^1.3.6-1 + "@subwallet/extension-base": ^1.3.7-0 + "@subwallet/extension-inject": ^1.3.7-0 + "@subwallet/extension-koni-ui": ^1.3.7-0 "@types/chrome": ^0.0.254 "@types/serviceworker": ^0.0.80 assert: ^2.0.0 @@ -6561,7 +6561,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-mocks@^1.3.6-1, @subwallet/extension-mocks@workspace:packages/extension-mocks": +"@subwallet/extension-mocks@^1.3.7-0, @subwallet/extension-mocks@workspace:packages/extension-mocks": version: 0.0.0-use.local resolution: "@subwallet/extension-mocks@workspace:packages/extension-mocks" dependencies: @@ -6570,7 +6570,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-web-ui@^1.3.6-1, @subwallet/extension-web-ui@workspace:packages/extension-web-ui": +"@subwallet/extension-web-ui@^1.3.7-0, @subwallet/extension-web-ui@workspace:packages/extension-web-ui": version: 0.0.0-use.local resolution: "@subwallet/extension-web-ui@workspace:packages/extension-web-ui" dependencies: @@ -6594,11 +6594,11 @@ __metadata: "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 "@subwallet/chain-list": 0.2.95-beta.0 - "@subwallet/extension-base": ^1.3.6-1 - "@subwallet/extension-chains": ^1.3.6-1 - "@subwallet/extension-dapp": ^1.3.6-1 - "@subwallet/extension-inject": ^1.3.6-1 - "@subwallet/extension-mocks": ^1.3.6-1 + "@subwallet/extension-base": ^1.3.7-0 + "@subwallet/extension-chains": ^1.3.7-0 + "@subwallet/extension-dapp": ^1.3.7-0 + "@subwallet/extension-inject": ^1.3.7-0 + "@subwallet/extension-mocks": ^1.3.7-0 "@subwallet/keyring": ^0.1.8-beta.0 "@subwallet/react-ui": ^5.1.2-b77 "@subwallet/ui-keyring": ^0.1.8-beta.0 @@ -6790,9 +6790,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.6-1 - "@subwallet/extension-inject": ^1.3.6-1 - "@subwallet/extension-koni-ui": ^1.3.6-1 + "@subwallet/extension-base": ^1.3.7-0 + "@subwallet/extension-inject": ^1.3.7-0 + "@subwallet/extension-koni-ui": ^1.3.7-0 assert: ^2.0.0 babel-loader: ^9.1.3 browser-resolve: ^2.0.0 @@ -6823,9 +6823,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.3.6-1 - "@subwallet/extension-inject": ^1.3.6-1 - "@subwallet/extension-web-ui": ^1.3.6-1 + "@subwallet/extension-base": ^1.3.7-0 + "@subwallet/extension-inject": ^1.3.7-0 + "@subwallet/extension-web-ui": ^1.3.7-0 assert: ^2.0.0 babel-loader: ^9.1.3 browser-resolve: ^2.0.0 From ac4ff7463cc1071b1df70c681fa657cd32abf905 Mon Sep 17 00:00:00 2001 From: AnhMTV Date: Sat, 23 Nov 2024 12:25:33 +0700 Subject: [PATCH 081/204] Release version 1.3.7 --- CHANGELOG.md | 16 ++++++++++++++++ package.json | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f809e7fd6c4..ab3abf0873f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # CHANGELOG +## 1.3.7 +Build date: Nov 23, 2024. + +Features & Update: +- Update chain-list (#3846) + - Add support for Gnosis + - Add support for Autonomys Mainnet + - Add support for KMA (Manta Pacific), USDC (Base Mainnet) + - Update information for some chains and tokens: add explorer, price-id, logo & name +- Improve display collators list (#2751) +- Improve block action online by environment (#3814) +- Integration NFT for Story Protocol (#3854) + +Bug fixed: +- Re-check transaction on Polkadot Asset Hub (#3852) + ## 1.3.6 Build date: Nov 07, 2024. diff --git a/package.json b/package.json index a3ebc73cfb4..2bcd2acfa4a 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "url": "https://github.com/Koniverse/Subwallet-V2.git" }, "sideEffects": false, - "version": "1.3.7-0", + "version": "1.3.7", "workspaces": [ "packages/*" ], From 90a7fc15e8a371c17fc8389fa24b5a1979112f7a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 23 Nov 2024 05:37:43 +0000 Subject: [PATCH 082/204] [CI Skip] release/stable 1.3.7 skip-checks: true --- .123trigger | 3 ++- CONTRIBUTORS | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.123trigger b/.123trigger index 5810dc0245f..73c14c6eae0 100644 --- a/.123trigger +++ b/.123trigger @@ -171,4 +171,5 @@ 1.3.3 1.3.4 1.3.5 -1.3.6 \ No newline at end of file +1.3.6 +1.3.7 \ No newline at end of file diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 1eae1afd842..edd66c486aa 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,4 +1,4 @@ - 2890 AnhMTV + 2891 AnhMTV Release version 1.3.7 2546 Nam Phạm [Issue 3747] chore: fix eslint 2369 S2kael [Issue-3852] Update metadata for case KSM and DOT 869 lw-cdm [MasterAccount] Update logic to reorder account on select account modal From 5d0021dae8cede8010de0a3b9c5f7349454fd5a2 Mon Sep 17 00:00:00 2001 From: nampc Date: Sat, 23 Nov 2024 12:42:34 +0700 Subject: [PATCH 083/204] [Issue 3713] fix: update validating token transfer --- .../src/core/logic-validation/transfer.ts | 208 ++++++++++++------ .../src/koni/background/handlers/Extension.ts | 4 +- 2 files changed, 147 insertions(+), 65 deletions(-) diff --git a/packages/extension-base/src/core/logic-validation/transfer.ts b/packages/extension-base/src/core/logic-validation/transfer.ts index 56bfa13d479..77f52b7c17c 100644 --- a/packages/extension-base/src/core/logic-validation/transfer.ts +++ b/packages/extension-base/src/core/logic-validation/transfer.ts @@ -1,29 +1,58 @@ // Copyright 2019-2022 @subwallet/extension-base authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { _AssetType, _ChainAsset, _ChainInfo } from '@subwallet/chain-list/types'; -import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError'; -import { _Address, AmountData, ExtrinsicDataTypeMap, ExtrinsicType, FeeData } from '@subwallet/extension-base/background/KoniTypes'; -import { TransactionWarning } from '@subwallet/extension-base/background/warnings/TransactionWarning'; -import { LEDGER_SIGNING_COMPATIBLE_MAP, SIGNING_COMPATIBLE_MAP, XCM_MIN_AMOUNT_RATIO } from '@subwallet/extension-base/constants'; -import { _canAccountBeReaped, _isAccountActive } from '@subwallet/extension-base/core/substrate/system-pallet'; -import { FrameSystemAccountInfo } from '@subwallet/extension-base/core/substrate/types'; -import { isBounceableAddress } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/ton/utils'; -import { _TRANSFER_CHAIN_GROUP } from '@subwallet/extension-base/services/chain-service/constants'; -import { _EvmApi, _TonApi } from '@subwallet/extension-base/services/chain-service/types'; -import { _getChainExistentialDeposit, _getChainNativeTokenBasicInfo, _getContractAddressOfToken, _getTokenMinAmount, _isNativeToken, _isTokenEvmSmartContract, _isTokenTonSmartContract } from '@subwallet/extension-base/services/chain-service/utils'; -import { calculateGasFeeParams } from '@subwallet/extension-base/services/fee-service/utils'; -import { isSubstrateTransaction, isTonTransaction } from '@subwallet/extension-base/services/transaction-service/helpers'; -import { OptionalSWTransaction, SWTransactionInput, SWTransactionResponse } from '@subwallet/extension-base/services/transaction-service/types'; -import { AccountSignMode, BasicTxErrorType, BasicTxWarningCode, TransferTxErrorType } from '@subwallet/extension-base/types'; -import { balanceFormatter, formatNumber, pairToAccount } from '@subwallet/extension-base/utils'; -import { isTonAddress } from '@subwallet/keyring'; -import { KeyringPair } from '@subwallet/keyring/types'; -import { keyring } from '@subwallet/ui-keyring'; +import {_ChainAsset, _ChainInfo} from '@subwallet/chain-list/types'; +import {TransactionError} from '@subwallet/extension-base/background/errors/TransactionError'; +import { + _Address, + AmountData, + ExtrinsicDataTypeMap, + ExtrinsicType, + FeeData +} from '@subwallet/extension-base/background/KoniTypes'; +import {TransactionWarning} from '@subwallet/extension-base/background/warnings/TransactionWarning'; +import { + LEDGER_SIGNING_COMPATIBLE_MAP, + SIGNING_COMPATIBLE_MAP, + XCM_MIN_AMOUNT_RATIO +} from '@subwallet/extension-base/constants'; +import {_canAccountBeReaped, _isAccountActive} from '@subwallet/extension-base/core/substrate/system-pallet'; +import {FrameSystemAccountInfo} from '@subwallet/extension-base/core/substrate/types'; +import {isBounceableAddress} from '@subwallet/extension-base/services/balance-service/helpers/subscribe/ton/utils'; +import {_TRANSFER_CHAIN_GROUP} from '@subwallet/extension-base/services/chain-service/constants'; +import {_EvmApi, _TonApi} from '@subwallet/extension-base/services/chain-service/types'; +import { + _getAssetDecimals, + _getAssetSymbol, + _getChainExistentialDeposit, + _getChainNativeTokenBasicInfo, + _getContractAddressOfToken, + _getTokenMinAmount, + _isNativeToken, + _isTokenEvmSmartContract, + _isTokenTonSmartContract +} from '@subwallet/extension-base/services/chain-service/utils'; +import {calculateGasFeeParams} from '@subwallet/extension-base/services/fee-service/utils'; +import {isSubstrateTransaction, isTonTransaction} from '@subwallet/extension-base/services/transaction-service/helpers'; +import { + OptionalSWTransaction, + SWTransactionInput, + SWTransactionResponse +} from '@subwallet/extension-base/services/transaction-service/types'; +import { + AccountSignMode, + BasicTxErrorType, + BasicTxWarningCode, + TransferTxErrorType +} from '@subwallet/extension-base/types'; +import {balanceFormatter, formatNumber, pairToAccount} from '@subwallet/extension-base/utils'; +import {isTonAddress} from '@subwallet/keyring'; +import {KeyringPair} from '@subwallet/keyring/types'; +import {keyring} from '@subwallet/ui-keyring'; import BigN from 'bignumber.js'; -import { t } from 'i18next'; +import {t} from 'i18next'; -import { isEthereumAddress } from '@polkadot/util-crypto'; +import {isEthereumAddress} from '@polkadot/util-crypto'; // normal transfer export function validateTransferRequest (tokenInfo: _ChainAsset, from: _Address, to: _Address, value: string | undefined, transferAll: boolean | undefined): [TransactionError[], KeyringPair | undefined, BigN | undefined] { @@ -56,62 +85,115 @@ export function validateTransferRequest (tokenInfo: _ChainAsset, from: _Address, return [errors, keypair, transferValue]; } -export function additionalValidateTransfer (tokenInfo: _ChainAsset, nativeTokenInfo: _ChainAsset, extrinsicType: ExtrinsicType, receiverTransferTokenTotalBalance: string, transferAmount: string, senderTransferTokenTransferable?: string, _receiverNativeTotal?: string, isReceiverActive?: unknown, isSufficient?: boolean): [TransactionWarning[], TransactionError[]] { - const minAmount = _getTokenMinAmount(tokenInfo); - const nativeMinAmount = _getTokenMinAmount(nativeTokenInfo); +export function additionalValidateTransferForRecipient (sendingTokenInfo: _ChainAsset, nativeTokenInfo: _ChainAsset, extrinsicType: ExtrinsicType, receiverSendingTokenKeepAliveBalance: bigint, transferAmount: bigint, senderSendingTokenTransferable: bigint, _receiverNativeTotal?: string, isReceiverActive?: unknown, isSufficient?: boolean): [TransactionWarning[], TransactionError[]] { + const sendingTokenMinAmount = BigInt(_getTokenMinAmount(sendingTokenInfo)); + const nativeTokenMinAmount = _getTokenMinAmount(nativeTokenInfo); + const warnings: TransactionWarning[] = []; const errors: TransactionError[] = []; - if (tokenInfo.assetType !== _AssetType.NATIVE) { - // Check ed of not native token for sender after sending - if (extrinsicType === ExtrinsicType.TRANSFER_TOKEN && senderTransferTokenTransferable) { - if (new BigN(senderTransferTokenTransferable).minus(transferAmount).lt(minAmount)) { - const warning = new TransactionWarning(BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT); + const remainingSendingTokenOfSenderEnoughED = senderSendingTokenTransferable - transferAmount >= sendingTokenMinAmount; + const isReceiverAliveByNativeToken = isReceiverActive && _isAccountActive(isReceiverActive as FrameSystemAccountInfo); + const isReceivingAmountPassED = receiverSendingTokenKeepAliveBalance + transferAmount >= sendingTokenMinAmount; + const isReceiverAliveAfterSending = isSufficient ? isReceivingAmountPassED : isReceiverAliveByNativeToken; - warnings.push(warning); - } - } + if (extrinsicType === ExtrinsicType.TRANSFER_TOKEN) { + if (!remainingSendingTokenOfSenderEnoughED) { + const warning = new TransactionWarning(BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT); - if (!isSufficient && new BigN(nativeMinAmount).gt(0)) { - // Check ed for receiver before sending - // if (extrinsicType === ExtrinsicType.TRANSFER_TOKEN && _receiverNativeTotal) { - // if (new BigN(_receiverNativeTotal).lt(nativeMinAmount)) { - // const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, t('The recipient account has {{amount}} {{nativeSymbol}} which can lead to your {{localSymbol}} being lost. Change recipient account and try again', { replace: { amount: _receiverNativeTotal, nativeSymbol: nativeTokenInfo.symbol, localSymbol: tokenInfo.symbol } })); - // - // errors.push(error); - // } - // } - - // Check if receiver's account is active - if (isReceiverActive && _isAccountActive(isReceiverActive as FrameSystemAccountInfo)) { - const error = new TransactionError(TransferTxErrorType.RECEIVER_ACCOUNT_INACTIVE, t('The recipient account may be inactive. Change recipient account and try again')); - - errors.push(error); - } + warnings.push(warning); + } - // Check ed for receiver after sending - if (new BigN(receiverTransferTokenTotalBalance).plus(transferAmount).lt(minAmount)) { - const atLeast = new BigN(minAmount).minus(receiverTransferTokenTotalBalance).plus((tokenInfo.decimals || 0) === 0 ? 0 : 1); + if (!isReceiverAliveAfterSending) { + const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, + t('The recipient account has {{amount}} {{nativeSymbol}} which can lead to your {{localSymbol}} being lost. Change recipient account and try again', { replace: { amount: _receiverNativeTotal, nativeSymbol: nativeTokenInfo.symbol, localSymbol: tokenInfo.symbol } }) + ); - const atLeastStr = formatNumber(atLeast, tokenInfo.decimals || 0, balanceFormatter, { maxNumberFormat: tokenInfo.decimals || 6 }); + errors.push(error); + } + } - const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, t('You must transfer at least {{amount}} {{symbol}} to keep the destination account alive', { replace: { amount: atLeastStr, symbol: tokenInfo.symbol } })); + if (!isReceivingAmountPassED) { + const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, + t('The recipient account has {{amount}} {{nativeSymbol}} which can lead to your {{localSymbol}} being lost. Change recipient account and try again', { replace: { amount: _receiverNativeTotal, nativeSymbol: nativeTokenInfo.symbol, localSymbol: tokenInfo.symbol } }) + ); - errors.push(error); - } - } + errors.push(error); } - // Check ed for receiver after sending - if (new BigN(receiverTransferTokenTotalBalance).plus(transferAmount).lt(minAmount)) { - const atLeast = new BigN(minAmount).minus(receiverTransferTokenTotalBalance).plus((tokenInfo.decimals || 0) === 0 ? 0 : 1); - const atLeastStr = formatNumber(atLeast, tokenInfo.decimals || 0, balanceFormatter, { maxNumberFormat: tokenInfo.decimals || 6 }); - const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, t('You must transfer at least {{amount}} {{symbol}} to keep the destination account alive', { replace: { amount: atLeastStr, symbol: tokenInfo.symbol } })); - errors.push(error); - } + + + + + + + + + + + // if (transferAmount + receiverSendingTokenKeepAliveBalance < sendingTokenMinAmount) { + // const atLeast = sendingTokenMinAmount - receiverSendingTokenKeepAliveBalance; + // + // const atLeastStr = formatNumber(atLeast.toString(), _getAssetDecimals(sendingTokenInfo), balanceFormatter, { maxNumberFormat: _getAssetDecimals(sendingTokenInfo) || 6 }); + // + // const error = new TransactionError( + // TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, + // t('You must transfer at least {{amount}} {{symbol}} to keep the destination account alive', { replace: { amount: atLeastStr, symbol: _getAssetSymbol(sendingTokenInfo) } }) + // ); + // + // errors.push(error); + // } + + // if (extrinsicType === ExtrinsicType.TRANSFER_TOKEN) { + // // if (senderSendingTokenTransferable - transferAmount < sendingTokenMinAmount) { + // // const warning = new TransactionWarning(BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT); + // // + // // warnings.push(warning); + // // } + // + // if (!isSufficient && new BigN(nativeTokenMinAmount).gt(0)) { + // // Check ed for receiver before sending + // // if (extrinsicType === ExtrinsicType.TRANSFER_TOKEN && _receiverNativeTotal) { + // // if (new BigN(_receiverNativeTotal).lt(nativeMinAmount)) { + // // const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, t('The recipient account has {{amount}} {{nativeSymbol}} which can lead to your {{localSymbol}} being lost. Change recipient account and try again', { replace: { amount: _receiverNativeTotal, nativeSymbol: nativeTokenInfo.symbol, localSymbol: tokenInfo.symbol } })); + // // + // // errors.push(error); + // // } + // // } + // + // // Check if receiver's account is active + // if () { + // const error = new TransactionError(TransferTxErrorType.RECEIVER_ACCOUNT_INACTIVE, t('The recipient account may be inactive. Change recipient account and try again')); + // + // errors.push(error); + // } + // + // // Check ed for receiver after sending + // if (new BigN(receiverSendingTokenKeepAliveBalance).plus(transferAmount).lt(sendingTokenMinAmount)) { + // const atLeast = new BigN(sendingTokenMinAmount).minus(receiverSendingTokenKeepAliveBalance).plus((sendingTokenInfo.decimals || 0) === 0 ? 0 : 1); + // + // const atLeastStr = formatNumber(atLeast, sendingTokenInfo.decimals || 0, balanceFormatter, { maxNumberFormat: sendingTokenInfo.decimals || 6 }); + // + // const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, t('You must transfer at least {{amount}} {{symbol}} to keep the destination account alive', { replace: { amount: atLeastStr, symbol: sendingTokenInfo.symbol } })); + // + // errors.push(error); + // } + // } + // } + // + // // Check ed for receiver after sending + // if (new BigN(receiverSendingTokenKeepAliveBalance).plus(transferAmount).lt(sendingTokenMinAmount)) { + // const atLeast = new BigN(sendingTokenMinAmount).minus(receiverSendingTokenKeepAliveBalance).plus((sendingTokenInfo.decimals || 0) === 0 ? 0 : 1); + // + // const atLeastStr = formatNumber(atLeast, sendingTokenInfo.decimals || 0, balanceFormatter, { maxNumberFormat: sendingTokenInfo.decimals || 6 }); + // + // const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, t('You must transfer at least {{amount}} {{symbol}} to keep the destination account alive', { replace: { amount: atLeastStr, symbol: sendingTokenInfo.symbol } })); + // + // errors.push(error); + // } return [warnings, errors]; } diff --git a/packages/extension-base/src/koni/background/handlers/Extension.ts b/packages/extension-base/src/koni/background/handlers/Extension.ts index dc76ff4569d..534eae632d5 100644 --- a/packages/extension-base/src/koni/background/handlers/Extension.ts +++ b/packages/extension-base/src/koni/background/handlers/Extension.ts @@ -11,7 +11,7 @@ import { AccountExternalError, AddressBookInfo, AmountData, AmountDataWithId, As import { AccountAuthType, AuthorizeRequest, MessageTypes, MetadataRequest, RequestAccountExport, RequestAuthorizeCancel, RequestAuthorizeReject, RequestCurrentAccountAddress, RequestMetadataApprove, RequestMetadataReject, RequestSigningApproveSignature, RequestSigningCancel, RequestTypes, ResponseAccountExport, ResponseAuthorizeList, ResponseType, SigningRequest, WindowOpenParams } from '@subwallet/extension-base/background/types'; import { TransactionWarning } from '@subwallet/extension-base/background/warnings/TransactionWarning'; import { ALL_ACCOUNT_KEY, LATEST_SESSION, XCM_FEE_RATIO } from '@subwallet/extension-base/constants'; -import { additionalValidateTransfer, additionalValidateXcmTransfer, validateTransferRequest, validateXcmTransferRequest } from '@subwallet/extension-base/core/logic-validation/transfer'; +import { additionalValidateTransferForRecipient, additionalValidateXcmTransfer, validateTransferRequest, validateXcmTransferRequest } from '@subwallet/extension-base/core/logic-validation/transfer'; import { _isSnowBridgeXcm } from '@subwallet/extension-base/core/substrate/xcm-parser'; import { ALLOWED_PATH } from '@subwallet/extension-base/defaults'; import { getERC20SpendingApprovalTx } from '@subwallet/extension-base/koni/api/contract-handler/evm/web3'; @@ -1407,7 +1407,7 @@ export default class KoniExtension { const substrateApi = this.#koniState.getSubstrateApi(networkKey).api; const isSufficient = await this.isSufficientToken(transferTokenInfo, substrateApi); - const [warnings, errors] = additionalValidateTransfer(transferTokenInfo, nativeTokenInfo, extrinsicType, receiverTransferTokenTotalBalance, transferAmount.value, senderTransferTokenTransferable, receiverNativeTotal, isReceiverActive, isSufficient); + const [warnings, errors] = additionalValidateTransferForRecipient(transferTokenInfo, nativeTokenInfo, extrinsicType, receiverTransferTokenTotalBalance, transferAmount.value, senderTransferTokenTransferable, receiverNativeTotal, isReceiverActive, isSufficient); warnings.length && inputTransaction.warnings.push(...warnings); errors.length && inputTransaction.errors.push(...errors); From 8dbd6026fbe2bf8f696ed9c4ea468011f3514275 Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Sat, 23 Nov 2024 17:39:19 +0700 Subject: [PATCH 084/204] [Issue-3132] feat: ignore logo when hash --- .../src/services/chain-online-service/index.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/extension-base/src/services/chain-online-service/index.ts b/packages/extension-base/src/services/chain-online-service/index.ts index f9236c81f6e..9fdcbc98ff3 100644 --- a/packages/extension-base/src/services/chain-online-service/index.ts +++ b/packages/extension-base/src/services/chain-online-service/index.ts @@ -62,9 +62,9 @@ export class ChainOnlineService { validatePatchBeforeStore (candidateChainInfoMap: Record, candidateAssetRegistry: Record, candidateMultiChainAssetMap: Record, latestPatch: PatchInfo) { for (const [chainSlug, chainHash] of Object.entries(latestPatch.ChainInfoHashMap)) { // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { chainStatus, providers, ...chainWithoutProvidersAndStatus } = candidateChainInfoMap[chainSlug]; + const { chainStatus, icon, providers, ...chainBaseInfo } = candidateChainInfoMap[chainSlug]; - if (this.md5Hash(chainWithoutProvidersAndStatus) !== chainHash) { + if (this.md5Hash(chainBaseInfo) !== chainHash) { return false; } } @@ -78,7 +78,10 @@ export class ChainOnlineService { return false; } - if (this.md5Hash(candidateAssetRegistry[assetSlug]) !== assetHash) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { icon, ...assetBaseInfo } = candidateAssetRegistry[assetSlug]; + + if (this.md5Hash(assetBaseInfo) !== assetHash) { return false; } } From 801412da9d3919b9b347f7ec07a4bfc007465b0e Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Sat, 23 Nov 2024 17:41:03 +0700 Subject: [PATCH 085/204] [Issue-3132] fix: re-order init xcm ref map --- packages/extension-base/src/services/chain-service/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/extension-base/src/services/chain-service/index.ts b/packages/extension-base/src/services/chain-service/index.ts index c6ddabe9170..0e96db62871 100644 --- a/packages/extension-base/src/services/chain-service/index.ts +++ b/packages/extension-base/src/services/chain-service/index.ts @@ -677,11 +677,11 @@ export class ChainService { await this.initChains(); this.chainInfoMapSubject.next(this.getChainInfoMap()); this.assetRegistrySubject.next(this.getAssetRegistry()); + this.initAssetRefMap(); this.xcmRefMapSubject.next(this.xcmRefMap); await this.initApis(); await this.initAssetSettings(); - this.initAssetRefMap(); await this.autoEnableTokens(); } From d8f993c8ba62b75d8002d899c8b2b89a6478ead5 Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Mon, 25 Nov 2024 12:13:34 +0700 Subject: [PATCH 086/204] [Issue-3132] chores: use util function from chainlist --- package.json | 2 +- packages/extension-base/package.json | 1 - .../services/chain-online-service/index.ts | 57 ++++--------------- .../src/services/chain-service/utils/patch.ts | 5 +- yarn.lock | 10 ++-- 5 files changed, 20 insertions(+), 55 deletions(-) diff --git a/package.json b/package.json index 34e7a3175f5..43f900f7db6 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@polkadot/types-support": "^12.0.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/chain-list": "0.2.94", + "@subwallet/chain-list": "0.2.96-beta.0", "@subwallet/keyring": "^0.1.8-beta.0", "@subwallet/react-ui": "5.1.2-b79", "@subwallet/ui-keyring": "0.1.8-beta.0", diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index cb11bbaab54..9d2d29dfef1 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -93,7 +93,6 @@ "protobufjs": "^7.2.4", "rxjs": "^7.8.1", "sails-js": "^0.1.6", - "ts-md5": "^1.3.1", "tweetnacl": "^1.0.3", "uuid": "^9.0.0", "web3": "^1.10.0", diff --git a/packages/extension-base/src/services/chain-online-service/index.ts b/packages/extension-base/src/services/chain-online-service/index.ts index 9fdcbc98ff3..9e6b8aa24d7 100644 --- a/packages/extension-base/src/services/chain-online-service/index.ts +++ b/packages/extension-base/src/services/chain-online-service/index.ts @@ -1,8 +1,8 @@ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { AssetLogoMap, ChainLogoMap, MultiChainAssetMap } from '@subwallet/chain-list'; -import { _ChainAsset, _ChainInfo, _MultiChainAsset } from '@subwallet/chain-list/types'; +import { AssetLogoMap, ChainLogoMap, md5HashChainAsset, md5HashChainInfo } from '@subwallet/chain-list'; +import { _ChainAsset, _ChainInfo } from '@subwallet/chain-list/types'; import { LATEST_CHAIN_PATCH_FETCHING_INTERVAL } from '@subwallet/extension-base/services/chain-online-service/constants'; import { ChainService, filterAssetInfoMap } from '@subwallet/extension-base/services/chain-service'; import { _ChainApiStatus, _ChainConnectionStatus, _ChainState } from '@subwallet/extension-base/services/chain-service/types'; @@ -11,7 +11,6 @@ import { EventService } from '@subwallet/extension-base/services/event-service'; import SettingService from '@subwallet/extension-base/services/setting-service/SettingService'; import { IChain } from '@subwallet/extension-base/services/storage-service/databases'; import DatabaseService from '@subwallet/extension-base/services/storage-service/DatabaseService'; -import { Md5 } from 'ts-md5'; export class ChainOnlineService { private chainService: ChainService; @@ -28,30 +27,17 @@ export class ChainOnlineService { this.dbService = dbService; } - md5Hash (data: any) { - return Md5.hashStr(JSON.stringify(data)); - } - validatePatchWithHash (latestPatch: PatchInfo) { - const { ChainAsset, ChainAssetHashMap, ChainInfo, ChainInfoHashMap, MultiChainAsset, MultiChainAssetHashMap } = latestPatch; + const { ChainAsset, ChainAssetHashMap, ChainInfo, ChainInfoHashMap } = latestPatch; for (const [chainSlug, chain] of Object.entries(ChainInfo)) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { chainStatus, providers, ...chainWithoutProvidersAndStatus } = chain; - - if (this.md5Hash(chainWithoutProvidersAndStatus) !== ChainInfoHashMap[chainSlug]) { + if (md5HashChainInfo(chain) !== ChainInfoHashMap[chainSlug]) { return false; } } for (const [assetSlug, asset] of Object.entries(ChainAsset)) { - if (this.md5Hash(asset) !== ChainAssetHashMap[assetSlug]) { - return false; - } - } - - for (const [mAssetSlug, mAsset] of Object.entries(MultiChainAsset)) { - if (this.md5Hash(mAsset) !== MultiChainAssetHashMap[mAssetSlug]) { + if (md5HashChainAsset(asset) !== ChainAssetHashMap[assetSlug]) { return false; } } @@ -59,12 +45,9 @@ export class ChainOnlineService { return true; } - validatePatchBeforeStore (candidateChainInfoMap: Record, candidateAssetRegistry: Record, candidateMultiChainAssetMap: Record, latestPatch: PatchInfo) { + validatePatchBeforeStore (candidateChainInfoMap: Record, candidateAssetRegistry: Record, latestPatch: PatchInfo) { for (const [chainSlug, chainHash] of Object.entries(latestPatch.ChainInfoHashMap)) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { chainStatus, icon, providers, ...chainBaseInfo } = candidateChainInfoMap[chainSlug]; - - if (this.md5Hash(chainBaseInfo) !== chainHash) { + if (md5HashChainInfo(candidateChainInfoMap[chainSlug]) !== chainHash) { return false; } } @@ -78,16 +61,7 @@ export class ChainOnlineService { return false; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { icon, ...assetBaseInfo } = candidateAssetRegistry[assetSlug]; - - if (this.md5Hash(assetBaseInfo) !== assetHash) { - return false; - } - } - - for (const [mAssetSlug, mAssetHash] of Object.entries(latestPatch.MultiChainAssetHashMap)) { - if (this.md5Hash(candidateMultiChainAssetMap[mAssetSlug]) !== mAssetHash) { + if (md5HashChainAsset(candidateAssetRegistry[assetSlug]) !== assetHash) { return false; } } @@ -103,14 +77,11 @@ export class ChainOnlineService { ChainAsset: latestAssetInfo, ChainInfo: latestChainInfo, ChainLogoMap: latestChainLogoMap, - MultiChainAsset: latestMultiChainAsset, - mAssetLogoMap: lastestMAssetLogoMap, patchVersion: latestPatchVersion } = latestPatch; const currentPatchVersion = (await this.settingService.getChainlistSetting())?.patchVersion || ''; let chainInfoMap: Record = structuredClone(this.chainService.getChainInfoMap()); let assetRegistry: Record = structuredClone(this.chainService.getAssetRegistry()); - let multiChainAssetMap: Record = structuredClone(MultiChainAssetMap); let currentChainStateMap: Record = structuredClone(this.chainService.getChainStateMap()); let currentChainStatusMap: Record = structuredClone(this.chainService.getChainStatusMap()); let addedChain: string[] = []; @@ -146,12 +117,8 @@ export class ChainOnlineService { assetRegistry = filterAssetInfoMap(this.chainService.getChainInfoMap(), Object.assign({}, this.chainService.getAssetRegistry(), latestAssetInfo), addedChain); } - if (latestMultiChainAsset && Object.keys(latestMultiChainAsset).length > 0) { // todo: currently not support update latest multichain-asset - multiChainAssetMap = { ...MultiChainAssetMap, ...latestMultiChainAsset }; - } - // 3. validate data before write - const isCorrectPatch = this.validatePatchBeforeStore(chainInfoMap, assetRegistry, multiChainAssetMap, latestPatch); + const isCorrectPatch = this.validatePatchBeforeStore(chainInfoMap, assetRegistry, latestPatch); // 4. write to subject if (isCorrectPatch) { @@ -166,8 +133,6 @@ export class ChainOnlineService { }) .catch(console.error); - this.chainService.subscribeMultiChainAssetMap().next(multiChainAssetMap); - this.chainService.setChainStateMap(currentChainStateMap); this.chainService.subscribeChainStateMap().next(currentChainStateMap); @@ -199,7 +164,7 @@ export class ChainOnlineService { } if (latestAssetLogoMap) { - const logoMap = Object.assign({}, AssetLogoMap, latestAssetLogoMap, lastestMAssetLogoMap); + const logoMap = Object.assign({}, AssetLogoMap, latestAssetLogoMap); this.chainService.subscribeAssetLogoMap().next(logoMap); } @@ -213,7 +178,7 @@ export class ChainOnlineService { } private async fetchLatestPatchData () { - return await fetchPatchData('data.json'); + return await fetchPatchData(); } handleLatestPatchData () { diff --git a/packages/extension-base/src/services/chain-service/utils/patch.ts b/packages/extension-base/src/services/chain-service/utils/patch.ts index c08cc26b3b7..9b540b77882 100644 --- a/packages/extension-base/src/services/chain-service/utils/patch.ts +++ b/packages/extension-base/src/services/chain-service/utils/patch.ts @@ -6,6 +6,7 @@ import { _ChainAsset, _ChainInfo, _MultiChainAsset } from '@subwallet/chain-list const PRODUCTION_BRANCHES = ['master', 'webapp', 'webapp-dev']; const branchName = process.env.BRANCH_NAME || 'subwallet-dev'; const fetchDomain = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'https://chain-list-assets.subwallet.app' : 'https://dev.sw-chain-list-assets.pages.dev'; +const fetchFile = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'list.json' : 'preview.json'; const ChainListVersion = '0.2.93'; @@ -25,9 +26,9 @@ export interface PatchInfo { mAssetLogoMap: Record } -export async function fetchPatchData (slug: string) { +export async function fetchPatchData () { try { - const fetchPromise = fetch(`${fetchDomain}/patch/${ChainListVersion}/${slug}`); + const fetchPromise = fetch(`${fetchDomain}/patch/${ChainListVersion}/${fetchFile}`); const timeout = new Promise((resolve) => { const id = setTimeout(() => { clearTimeout(id); diff --git a/yarn.lock b/yarn.lock index f9699836fb2..a8011202664 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6265,14 +6265,15 @@ __metadata: languageName: node linkType: hard -"@subwallet/chain-list@npm:0.2.94": - version: 0.2.94 - resolution: "@subwallet/chain-list@npm:0.2.94" +"@subwallet/chain-list@npm:0.2.96-beta.0": + version: 0.2.96-beta.0 + resolution: "@subwallet/chain-list@npm:0.2.96-beta.0" dependencies: "@polkadot/dev": 0.67.167 "@polkadot/util": ^12.5.1 eventemitter3: ^5.0.1 - checksum: cf285d30673bf98dc577baccffbaac96e49d5c5d718bb8c9fd9fe116318e753b16940907e143bfc1c212e5f3185713d82509fba85d42cbdd33a7177628e3bae4 + ts-md5: ^1.3.1 + checksum: 20136e9406f23bcc5e6a7b9403d61a03be48693c5aa7a17eae13c8c157497085a05e43058b31a9162450ea8da54f9b99f42cb6a1873ad0e4b390a51eeb81a2ea languageName: node linkType: hard @@ -6355,7 +6356,6 @@ __metadata: protobufjs: ^7.2.4 rxjs: ^7.8.1 sails-js: ^0.1.6 - ts-md5: ^1.3.1 tweetnacl: ^1.0.3 uuid: ^9.0.0 web3: ^1.10.0 From 56556579bb716c2f163d2c233e2c4b6aeccef406 Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Mon, 25 Nov 2024 12:32:11 +0700 Subject: [PATCH 087/204] [Issue-3132] add comment --- .../extension-base/src/services/chain-service/utils/patch.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/extension-base/src/services/chain-service/utils/patch.ts b/packages/extension-base/src/services/chain-service/utils/patch.ts index 9b540b77882..0a3d84bccba 100644 --- a/packages/extension-base/src/services/chain-service/utils/patch.ts +++ b/packages/extension-base/src/services/chain-service/utils/patch.ts @@ -8,7 +8,7 @@ const branchName = process.env.BRANCH_NAME || 'subwallet-dev'; const fetchDomain = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'https://chain-list-assets.subwallet.app' : 'https://dev.sw-chain-list-assets.pages.dev'; const fetchFile = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'list.json' : 'preview.json'; -const ChainListVersion = '0.2.93'; +const ChainListVersion = '0.2.95'; // update this when build chainlist // todo: move this interface to chainlist export interface PatchInfo { From 11a86c2abf2e4ba803b2f935e544410a010a9e4a Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Tue, 26 Nov 2024 08:59:51 +0700 Subject: [PATCH 088/204] [Chore] Update UI --- .../src/Popup/Transaction/variants/SendFund.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/extension-koni-ui/src/Popup/Transaction/variants/SendFund.tsx b/packages/extension-koni-ui/src/Popup/Transaction/variants/SendFund.tsx index f1de2e44dee..dc93a064597 100644 --- a/packages/extension-koni-ui/src/Popup/Transaction/variants/SendFund.tsx +++ b/packages/extension-koni-ui/src/Popup/Transaction/variants/SendFund.tsx @@ -550,8 +550,6 @@ const Component = ({ className = '', isAllAccount, targetAccountProxy }: Compone let checkTransferAll = false; const _doSubmit = async () => { - setLoading(true); - if (values.chain !== values.destChain) { const originChainInfo = chainInfoMap[values.chain]; const destChainInfo = chainInfoMap[values.destChain]; From ca09cba852e23c9cb89e6736ec5eef469cd222d1 Mon Sep 17 00:00:00 2001 From: bluezdot <72647326+bluezdot@users.noreply.github.com> Date: Tue, 26 Nov 2024 14:36:48 +0700 Subject: [PATCH 089/204] [Issue-3816] fix: rm update chain status on update rpc online --- .../extension-base/src/services/chain-service/utils/index.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/extension-base/src/services/chain-service/utils/index.ts b/packages/extension-base/src/services/chain-service/utils/index.ts index f5009d04aa4..5aeb6637a8f 100644 --- a/packages/extension-base/src/services/chain-service/utils/index.ts +++ b/packages/extension-base/src/services/chain-service/utils/index.ts @@ -616,8 +616,6 @@ export function updateLatestChainInfo (currentDataMap: _DataMap, latestChainInfo if (currentChainInfo) { needUpdate = true; - currentChainInfo.extraInfo = latestChainInfo.extraInfo; - currentChainInfo.chainStatus = latestChainInfo.chainStatus; if (Object.keys(currentChainInfo.providers).length === 0) { currentChainInfo.chainStatus = _ChainStatus.INACTIVE; From 87d953eaaf87257d5f21516f023b9655a29901e6 Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Tue, 26 Nov 2024 15:36:05 +0700 Subject: [PATCH 090/204] Update - Change Amount History Display --- .../Popup/Home/History/Detail/parts/Amount.tsx | 16 +++++++++++++++- .../src/components/History/HistoryItem.tsx | 18 ++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/packages/extension-koni-ui/src/Popup/Home/History/Detail/parts/Amount.tsx b/packages/extension-koni-ui/src/Popup/Home/History/Detail/parts/Amount.tsx index d3f1bee06bf..c76e92b074a 100644 --- a/packages/extension-koni-ui/src/Popup/Home/History/Detail/parts/Amount.tsx +++ b/packages/extension-koni-ui/src/Popup/Home/History/Detail/parts/Amount.tsx @@ -2,6 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 import { ExtrinsicType, TransactionAdditionalInfo } from '@subwallet/extension-base/background/KoniTypes'; +import { ClaimPolygonBridgeNotificationMetadata, NotificationActionType } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; +import { RequestClaimBridge } from '@subwallet/extension-base/types/bridge'; import { BN_TEN } from '@subwallet/extension-base/utils'; import { MetaInfo } from '@subwallet/extension-koni-ui/components'; import { useSelector } from '@subwallet/extension-koni-ui/hooks'; @@ -86,6 +88,18 @@ const Component: React.FC = (props: Props) => { return ; } + let amountValue = amount?.value; + + if (data.type === ExtrinsicType.CLAIM_BRIDGE) { + const additionalInfo = data.additionalInfo as RequestClaimBridge; + + if (additionalInfo.notification.actionType === NotificationActionType.CLAIM_POLYGON_BRIDGE) { + const metadata = additionalInfo.notification.metadata as ClaimPolygonBridgeNotificationMetadata; + + amountValue = metadata.amounts[0]; + } + } + return ( <> { @@ -95,7 +109,7 @@ const Component: React.FC = (props: Props) => { decimals={amount?.decimals || undefined} label={amountLabel} suffix={amount?.symbol || undefined} - value={amount?.value || '0'} + value={amountValue || '0'} /> ) } diff --git a/packages/extension-koni-ui/src/components/History/HistoryItem.tsx b/packages/extension-koni-ui/src/components/History/HistoryItem.tsx index c4fb11a2c35..83cab56fda7 100644 --- a/packages/extension-koni-ui/src/components/History/HistoryItem.tsx +++ b/packages/extension-koni-ui/src/components/History/HistoryItem.tsx @@ -1,7 +1,9 @@ // Copyright 2019-2022 @subwallet/extension-koni-ui authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { TransactionDirection } from '@subwallet/extension-base/background/KoniTypes'; +import { ExtrinsicType, TransactionDirection } from '@subwallet/extension-base/background/KoniTypes'; +import { ClaimPolygonBridgeNotificationMetadata, NotificationActionType } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; +import { RequestClaimBridge } from '@subwallet/extension-base/types'; import { useSelector } from '@subwallet/extension-koni-ui/hooks'; import { ThemeProps, TransactionHistoryDisplayItem } from '@subwallet/extension-koni-ui/types'; import { isAbleToShowFee } from '@subwallet/extension-koni-ui/utils'; @@ -21,6 +23,18 @@ function Component ( const displayData = item.displayData; const { isShowBalance } = useSelector((state) => state.settings); + let amountValue = item?.amount?.value; + + if (item.type === ExtrinsicType.CLAIM_BRIDGE) { + const additionalInfo = item.additionalInfo as RequestClaimBridge; + + if (additionalInfo.notification.actionType === NotificationActionType.CLAIM_POLYGON_BRIDGE) { + const metadata = additionalInfo.notification.metadata as ClaimPolygonBridgeNotificationMetadata; + + amountValue = metadata.amounts[0]; + } + } + return ( Date: Tue, 26 Nov 2024 15:51:30 +0700 Subject: [PATCH 091/204] [Issue-3816] feat: remove logic update priceId by rpc online --- .../src/services/chain-service/index.ts | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/extension-base/src/services/chain-service/index.ts b/packages/extension-base/src/services/chain-service/index.ts index 0e96db62871..5d5e3f75621 100644 --- a/packages/extension-base/src/services/chain-service/index.ts +++ b/packages/extension-base/src/services/chain-service/index.ts @@ -720,23 +720,23 @@ export class ChainService { } } - handleLatestPriceId (latestPriceIds: Record) { - let isUpdated = false; - - Object.entries(latestPriceIds).forEach(([slug, priceId]) => { - if (this.dataMap.assetRegistry[slug] && this.dataMap.assetRegistry[slug].priceId !== priceId) { - isUpdated = true; - this.dataMap.assetRegistry[slug].priceId = priceId; - } - }); - - if (isUpdated) { - this.assetRegistrySubject.next(this.dataMap.assetRegistry); - this.eventService.emit('asset.updateState', ''); - } - - this.logger.log('Finished updating latest price IDs'); - } + // handleLatestPriceId (latestPriceIds: Record) { + // let isUpdated = false; + // + // Object.entries(latestPriceIds).forEach(([slug, priceId]) => { + // if (this.dataMap.assetRegistry[slug] && this.dataMap.assetRegistry[slug].priceId !== priceId) { + // isUpdated = true; + // this.dataMap.assetRegistry[slug].priceId = priceId; + // } + // }); + // + // if (isUpdated) { + // this.assetRegistrySubject.next(this.dataMap.assetRegistry); + // this.eventService.emit('asset.updateState', ''); + // } + // + // this.logger.log('Finished updating latest price IDs'); + // } async autoEnableTokens () { const autoEnableTokens = Object.values(this.dataMap.assetRegistry).filter((asset) => _isAssetAutoEnable(asset)); @@ -777,9 +777,9 @@ export class ChainService { console.error('Error update latest chain data', e); }); - this.fetchLatestPriceIdsData().then((latestPriceIds) => { - this.handleLatestPriceId(latestPriceIds); - }).catch(console.error); + // this.fetchLatestPriceIdsData().then((latestPriceIds) => { + // this.handleLatestPriceId(latestPriceIds); + // }).catch(console.error); this.fetchLatestLedgerGenericAllowChains() .then((latestledgerGenericAllowChains) => { From c31383e9a79b5dd494e4332f04a9f4efc69ee8f5 Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Tue, 26 Nov 2024 18:15:27 +0700 Subject: [PATCH 092/204] [Issue-3713] Refactor: validation logic for transfer --- .../src/core/logic-validation/transfer.ts | 116 +++++++----------- .../src/koni/background/handlers/Extension.ts | 13 +- 2 files changed, 51 insertions(+), 78 deletions(-) diff --git a/packages/extension-base/src/core/logic-validation/transfer.ts b/packages/extension-base/src/core/logic-validation/transfer.ts index 77f52b7c17c..7d842ac50ab 100644 --- a/packages/extension-base/src/core/logic-validation/transfer.ts +++ b/packages/extension-base/src/core/logic-validation/transfer.ts @@ -1,58 +1,29 @@ // Copyright 2019-2022 @subwallet/extension-base authors & contributors // SPDX-License-Identifier: Apache-2.0 -import {_ChainAsset, _ChainInfo} from '@subwallet/chain-list/types'; -import {TransactionError} from '@subwallet/extension-base/background/errors/TransactionError'; -import { - _Address, - AmountData, - ExtrinsicDataTypeMap, - ExtrinsicType, - FeeData -} from '@subwallet/extension-base/background/KoniTypes'; -import {TransactionWarning} from '@subwallet/extension-base/background/warnings/TransactionWarning'; -import { - LEDGER_SIGNING_COMPATIBLE_MAP, - SIGNING_COMPATIBLE_MAP, - XCM_MIN_AMOUNT_RATIO -} from '@subwallet/extension-base/constants'; -import {_canAccountBeReaped, _isAccountActive} from '@subwallet/extension-base/core/substrate/system-pallet'; -import {FrameSystemAccountInfo} from '@subwallet/extension-base/core/substrate/types'; -import {isBounceableAddress} from '@subwallet/extension-base/services/balance-service/helpers/subscribe/ton/utils'; -import {_TRANSFER_CHAIN_GROUP} from '@subwallet/extension-base/services/chain-service/constants'; -import {_EvmApi, _TonApi} from '@subwallet/extension-base/services/chain-service/types'; -import { - _getAssetDecimals, - _getAssetSymbol, - _getChainExistentialDeposit, - _getChainNativeTokenBasicInfo, - _getContractAddressOfToken, - _getTokenMinAmount, - _isNativeToken, - _isTokenEvmSmartContract, - _isTokenTonSmartContract -} from '@subwallet/extension-base/services/chain-service/utils'; -import {calculateGasFeeParams} from '@subwallet/extension-base/services/fee-service/utils'; -import {isSubstrateTransaction, isTonTransaction} from '@subwallet/extension-base/services/transaction-service/helpers'; -import { - OptionalSWTransaction, - SWTransactionInput, - SWTransactionResponse -} from '@subwallet/extension-base/services/transaction-service/types'; -import { - AccountSignMode, - BasicTxErrorType, - BasicTxWarningCode, - TransferTxErrorType -} from '@subwallet/extension-base/types'; -import {balanceFormatter, formatNumber, pairToAccount} from '@subwallet/extension-base/utils'; -import {isTonAddress} from '@subwallet/keyring'; -import {KeyringPair} from '@subwallet/keyring/types'; -import {keyring} from '@subwallet/ui-keyring'; +import { _ChainAsset, _ChainInfo } from '@subwallet/chain-list/types'; +import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError'; +import { _Address, AmountData, ExtrinsicDataTypeMap, ExtrinsicType, FeeData } from '@subwallet/extension-base/background/KoniTypes'; +import { TransactionWarning } from '@subwallet/extension-base/background/warnings/TransactionWarning'; +import { LEDGER_SIGNING_COMPATIBLE_MAP, SIGNING_COMPATIBLE_MAP, XCM_MIN_AMOUNT_RATIO } from '@subwallet/extension-base/constants'; +import { _canAccountBeReaped, _isAccountActive } from '@subwallet/extension-base/core/substrate/system-pallet'; +import { FrameSystemAccountInfo } from '@subwallet/extension-base/core/substrate/types'; +import { isBounceableAddress } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/ton/utils'; +import { _TRANSFER_CHAIN_GROUP } from '@subwallet/extension-base/services/chain-service/constants'; +import { _EvmApi, _TonApi } from '@subwallet/extension-base/services/chain-service/types'; +import { _getAssetDecimals, _getChainExistentialDeposit, _getChainNativeTokenBasicInfo, _getContractAddressOfToken, _getTokenMinAmount, _isNativeToken, _isTokenEvmSmartContract, _isTokenTonSmartContract } from '@subwallet/extension-base/services/chain-service/utils'; +import { calculateGasFeeParams } from '@subwallet/extension-base/services/fee-service/utils'; +import { isSubstrateTransaction, isTonTransaction } from '@subwallet/extension-base/services/transaction-service/helpers'; +import { OptionalSWTransaction, SWTransactionInput, SWTransactionResponse } from '@subwallet/extension-base/services/transaction-service/types'; +import { AccountSignMode, BasicTxErrorType, BasicTxWarningCode, TransferTxErrorType } from '@subwallet/extension-base/types'; +import { balanceFormatter, formatNumber, pairToAccount } from '@subwallet/extension-base/utils'; +import { isTonAddress } from '@subwallet/keyring'; +import { KeyringPair } from '@subwallet/keyring/types'; +import { keyring } from '@subwallet/ui-keyring'; import BigN from 'bignumber.js'; -import {t} from 'i18next'; +import { t } from 'i18next'; -import {isEthereumAddress} from '@polkadot/util-crypto'; +import { isEthereumAddress } from '@polkadot/util-crypto'; // normal transfer export function validateTransferRequest (tokenInfo: _ChainAsset, from: _Address, to: _Address, value: string | undefined, transferAll: boolean | undefined): [TransactionError[], KeyringPair | undefined, BigN | undefined] { @@ -85,17 +56,17 @@ export function validateTransferRequest (tokenInfo: _ChainAsset, from: _Address, return [errors, keypair, transferValue]; } -export function additionalValidateTransferForRecipient (sendingTokenInfo: _ChainAsset, nativeTokenInfo: _ChainAsset, extrinsicType: ExtrinsicType, receiverSendingTokenKeepAliveBalance: bigint, transferAmount: bigint, senderSendingTokenTransferable: bigint, _receiverNativeTotal?: string, isReceiverActive?: unknown, isSufficient?: boolean): [TransactionWarning[], TransactionError[]] { +export function additionalValidateTransferForRecipient (sendingTokenInfo: _ChainAsset, nativeTokenInfo: _ChainAsset, extrinsicType: ExtrinsicType, receiverSendingTokenKeepAliveBalance: bigint, transferAmount: bigint, senderSendingTokenTransferable?: bigint, _receiverNativeTotal?: string, isReceiverActive?: unknown, isSufficient?: boolean): [TransactionWarning[], TransactionError[]] { const sendingTokenMinAmount = BigInt(_getTokenMinAmount(sendingTokenInfo)); - const nativeTokenMinAmount = _getTokenMinAmount(nativeTokenInfo); + // const nativeTokenMinAmount = _getTokenMinAmount(nativeTokenInfo); const warnings: TransactionWarning[] = []; const errors: TransactionError[] = []; - const remainingSendingTokenOfSenderEnoughED = senderSendingTokenTransferable - transferAmount >= sendingTokenMinAmount; - const isReceiverAliveByNativeToken = isReceiverActive && _isAccountActive(isReceiverActive as FrameSystemAccountInfo); + const remainingSendingTokenOfSenderEnoughED = senderSendingTokenTransferable && senderSendingTokenTransferable - transferAmount >= sendingTokenMinAmount; + const isReceiverAliveByNativeToken = isReceiverActive && !_isAccountActive(isReceiverActive as FrameSystemAccountInfo); const isReceivingAmountPassED = receiverSendingTokenKeepAliveBalance + transferAmount >= sendingTokenMinAmount; - const isReceiverAliveAfterSending = isSufficient ? isReceivingAmountPassED : isReceiverAliveByNativeToken; + // const isReceiverAliveAfterSending = isSufficient ? isReceivingAmountPassED : isReceiverAliveByNativeToken; if (extrinsicType === ExtrinsicType.TRANSFER_TOKEN) { if (!remainingSendingTokenOfSenderEnoughED) { @@ -104,35 +75,34 @@ export function additionalValidateTransferForRecipient (sendingTokenInfo: _Chain warnings.push(warning); } - if (!isReceiverAliveAfterSending) { + if (!isReceiverAliveByNativeToken && !isSufficient) { const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, - t('The recipient account has {{amount}} {{nativeSymbol}} which can lead to your {{localSymbol}} being lost. Change recipient account and try again', { replace: { amount: _receiverNativeTotal, nativeSymbol: nativeTokenInfo.symbol, localSymbol: tokenInfo.symbol } }) + t('The recipient account has {{amount}} {{nativeSymbol}} which can lead to your {{localSymbol}} being lost. Change recipient account and try again', { replace: { amount: _receiverNativeTotal, nativeSymbol: nativeTokenInfo.symbol, localSymbol: sendingTokenInfo.symbol } }) ); errors.push(error); } + // else if (!isReceivingAmountPassED && isSufficient) { + // const atLeast = sendingTokenMinAmount - receiverSendingTokenKeepAliveBalance; + // + // const atLeastStr = formatNumber(atLeast.toString(), _getAssetDecimals(sendingTokenInfo), balanceFormatter, { maxNumberFormat: _getAssetDecimals(sendingTokenInfo) || 6 }); + // + // const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, t('You must transfer at least {{amount}} {{symbol}} to keep the destination account alive', { replace: { amount: atLeastStr, symbol: sendingTokenInfo.symbol } })); + // + // errors.push(error); + // } } if (!isReceivingAmountPassED) { - const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, - t('The recipient account has {{amount}} {{nativeSymbol}} which can lead to your {{localSymbol}} being lost. Change recipient account and try again', { replace: { amount: _receiverNativeTotal, nativeSymbol: nativeTokenInfo.symbol, localSymbol: tokenInfo.symbol } }) - ); - - errors.push(error); - } - - - - - - - - - - + console.log('type', typeof (receiverSendingTokenKeepAliveBalance)); + const atLeast = sendingTokenMinAmount - receiverSendingTokenKeepAliveBalance; + const atLeastStr = formatNumber(atLeast.toString(), _getAssetDecimals(sendingTokenInfo), balanceFormatter, { maxNumberFormat: _getAssetDecimals(sendingTokenInfo) || 6 }); + const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, t('You must transfer at least {{amount}} {{symbol}} to keep the destination account alive', { replace: { amount: atLeastStr, symbol: sendingTokenInfo.symbol } })); + errors.push(error); + } // if (transferAmount + receiverSendingTokenKeepAliveBalance < sendingTokenMinAmount) { // const atLeast = sendingTokenMinAmount - receiverSendingTokenKeepAliveBalance; diff --git a/packages/extension-base/src/koni/background/handlers/Extension.ts b/packages/extension-base/src/koni/background/handlers/Extension.ts index 534eae632d5..c142f9390da 100644 --- a/packages/extension-base/src/koni/background/handlers/Extension.ts +++ b/packages/extension-base/src/koni/background/handlers/Extension.ts @@ -1386,28 +1386,31 @@ export default class KoniExtension { const transferNativeAmount = isTransferNativeToken ? transferAmount.value : '0'; const additionalValidator = async (inputTransaction: SWTransactionResponse): Promise => { - let senderTransferTokenTransferable: string | undefined; + let senderSendingTokenTransferable: bigint | undefined; let receiverNativeTotal: string | undefined; let isReceiverActive: unknown; // Check ed for sender if (!isTransferNativeToken) { - const [_senderTransferTokenTransferable, _receiverNativeTotal] = await Promise.all([ + const [_senderSendingTokenTransferable, _receiverNativeTotal] = await Promise.all([ this.getAddressTransferableBalance({ address: from, networkKey, token: tokenSlug, extrinsicType }), this.getAddressTotalBalance({ address: to, networkKey, token: nativeTokenSlug, extrinsicType: ExtrinsicType.TRANSFER_BALANCE }) ]); - senderTransferTokenTransferable = _senderTransferTokenTransferable.value; + senderSendingTokenTransferable = BigInt(_senderSendingTokenTransferable.value); receiverNativeTotal = _receiverNativeTotal.value; isReceiverActive = _receiverNativeTotal.metadata; } - const { value: receiverTransferTokenTotalBalance } = await this.getAddressTotalBalance({ address: to, networkKey, token: tokenSlug, extrinsicType }); // todo: shouldn't be just transferable, locked also counts + const { value: _receiverSendingTokenKeepAliveBalance } = await this.getAddressTotalBalance({ address: to, networkKey, token: tokenSlug, extrinsicType }); // todo: shouldn't be just transferable, locked also counts + const receiverSendingTokenKeepAliveBalance = BigInt(_receiverSendingTokenKeepAliveBalance); + + const amount = BigInt(transferAmount.value); const substrateApi = this.#koniState.getSubstrateApi(networkKey).api; const isSufficient = await this.isSufficientToken(transferTokenInfo, substrateApi); - const [warnings, errors] = additionalValidateTransferForRecipient(transferTokenInfo, nativeTokenInfo, extrinsicType, receiverTransferTokenTotalBalance, transferAmount.value, senderTransferTokenTransferable, receiverNativeTotal, isReceiverActive, isSufficient); + const [warnings, errors] = additionalValidateTransferForRecipient(transferTokenInfo, nativeTokenInfo, extrinsicType, receiverSendingTokenKeepAliveBalance, amount, senderSendingTokenTransferable, receiverNativeTotal, isReceiverActive, isSufficient); warnings.length && inputTransaction.warnings.push(...warnings); errors.length && inputTransaction.errors.push(...errors); From 70036882547ccbbe9408ca817b1e1310ce5bee4a Mon Sep 17 00:00:00 2001 From: PDTnhah Date: Tue, 26 Nov 2024 18:17:49 +0700 Subject: [PATCH 093/204] [Issue-3713] Refactor: validation logic for transfer --- .../src/core/logic-validation/transfer.ts | 73 ------------------- 1 file changed, 73 deletions(-) diff --git a/packages/extension-base/src/core/logic-validation/transfer.ts b/packages/extension-base/src/core/logic-validation/transfer.ts index 7d842ac50ab..1a4d827b9cb 100644 --- a/packages/extension-base/src/core/logic-validation/transfer.ts +++ b/packages/extension-base/src/core/logic-validation/transfer.ts @@ -58,7 +58,6 @@ export function validateTransferRequest (tokenInfo: _ChainAsset, from: _Address, export function additionalValidateTransferForRecipient (sendingTokenInfo: _ChainAsset, nativeTokenInfo: _ChainAsset, extrinsicType: ExtrinsicType, receiverSendingTokenKeepAliveBalance: bigint, transferAmount: bigint, senderSendingTokenTransferable?: bigint, _receiverNativeTotal?: string, isReceiverActive?: unknown, isSufficient?: boolean): [TransactionWarning[], TransactionError[]] { const sendingTokenMinAmount = BigInt(_getTokenMinAmount(sendingTokenInfo)); - // const nativeTokenMinAmount = _getTokenMinAmount(nativeTokenInfo); const warnings: TransactionWarning[] = []; const errors: TransactionError[] = []; @@ -66,7 +65,6 @@ export function additionalValidateTransferForRecipient (sendingTokenInfo: _Chain const remainingSendingTokenOfSenderEnoughED = senderSendingTokenTransferable && senderSendingTokenTransferable - transferAmount >= sendingTokenMinAmount; const isReceiverAliveByNativeToken = isReceiverActive && !_isAccountActive(isReceiverActive as FrameSystemAccountInfo); const isReceivingAmountPassED = receiverSendingTokenKeepAliveBalance + transferAmount >= sendingTokenMinAmount; - // const isReceiverAliveAfterSending = isSufficient ? isReceivingAmountPassED : isReceiverAliveByNativeToken; if (extrinsicType === ExtrinsicType.TRANSFER_TOKEN) { if (!remainingSendingTokenOfSenderEnoughED) { @@ -82,19 +80,9 @@ export function additionalValidateTransferForRecipient (sendingTokenInfo: _Chain errors.push(error); } - // else if (!isReceivingAmountPassED && isSufficient) { - // const atLeast = sendingTokenMinAmount - receiverSendingTokenKeepAliveBalance; - // - // const atLeastStr = formatNumber(atLeast.toString(), _getAssetDecimals(sendingTokenInfo), balanceFormatter, { maxNumberFormat: _getAssetDecimals(sendingTokenInfo) || 6 }); - // - // const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, t('You must transfer at least {{amount}} {{symbol}} to keep the destination account alive', { replace: { amount: atLeastStr, symbol: sendingTokenInfo.symbol } })); - // - // errors.push(error); - // } } if (!isReceivingAmountPassED) { - console.log('type', typeof (receiverSendingTokenKeepAliveBalance)); const atLeast = sendingTokenMinAmount - receiverSendingTokenKeepAliveBalance; const atLeastStr = formatNumber(atLeast.toString(), _getAssetDecimals(sendingTokenInfo), balanceFormatter, { maxNumberFormat: _getAssetDecimals(sendingTokenInfo) || 6 }); @@ -104,67 +92,6 @@ export function additionalValidateTransferForRecipient (sendingTokenInfo: _Chain errors.push(error); } - // if (transferAmount + receiverSendingTokenKeepAliveBalance < sendingTokenMinAmount) { - // const atLeast = sendingTokenMinAmount - receiverSendingTokenKeepAliveBalance; - // - // const atLeastStr = formatNumber(atLeast.toString(), _getAssetDecimals(sendingTokenInfo), balanceFormatter, { maxNumberFormat: _getAssetDecimals(sendingTokenInfo) || 6 }); - // - // const error = new TransactionError( - // TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, - // t('You must transfer at least {{amount}} {{symbol}} to keep the destination account alive', { replace: { amount: atLeastStr, symbol: _getAssetSymbol(sendingTokenInfo) } }) - // ); - // - // errors.push(error); - // } - - // if (extrinsicType === ExtrinsicType.TRANSFER_TOKEN) { - // // if (senderSendingTokenTransferable - transferAmount < sendingTokenMinAmount) { - // // const warning = new TransactionWarning(BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT); - // // - // // warnings.push(warning); - // // } - // - // if (!isSufficient && new BigN(nativeTokenMinAmount).gt(0)) { - // // Check ed for receiver before sending - // // if (extrinsicType === ExtrinsicType.TRANSFER_TOKEN && _receiverNativeTotal) { - // // if (new BigN(_receiverNativeTotal).lt(nativeMinAmount)) { - // // const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, t('The recipient account has {{amount}} {{nativeSymbol}} which can lead to your {{localSymbol}} being lost. Change recipient account and try again', { replace: { amount: _receiverNativeTotal, nativeSymbol: nativeTokenInfo.symbol, localSymbol: tokenInfo.symbol } })); - // // - // // errors.push(error); - // // } - // // } - // - // // Check if receiver's account is active - // if () { - // const error = new TransactionError(TransferTxErrorType.RECEIVER_ACCOUNT_INACTIVE, t('The recipient account may be inactive. Change recipient account and try again')); - // - // errors.push(error); - // } - // - // // Check ed for receiver after sending - // if (new BigN(receiverSendingTokenKeepAliveBalance).plus(transferAmount).lt(sendingTokenMinAmount)) { - // const atLeast = new BigN(sendingTokenMinAmount).minus(receiverSendingTokenKeepAliveBalance).plus((sendingTokenInfo.decimals || 0) === 0 ? 0 : 1); - // - // const atLeastStr = formatNumber(atLeast, sendingTokenInfo.decimals || 0, balanceFormatter, { maxNumberFormat: sendingTokenInfo.decimals || 6 }); - // - // const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, t('You must transfer at least {{amount}} {{symbol}} to keep the destination account alive', { replace: { amount: atLeastStr, symbol: sendingTokenInfo.symbol } })); - // - // errors.push(error); - // } - // } - // } - // - // // Check ed for receiver after sending - // if (new BigN(receiverSendingTokenKeepAliveBalance).plus(transferAmount).lt(sendingTokenMinAmount)) { - // const atLeast = new BigN(sendingTokenMinAmount).minus(receiverSendingTokenKeepAliveBalance).plus((sendingTokenInfo.decimals || 0) === 0 ? 0 : 1); - // - // const atLeastStr = formatNumber(atLeast, sendingTokenInfo.decimals || 0, balanceFormatter, { maxNumberFormat: sendingTokenInfo.decimals || 6 }); - // - // const error = new TransactionError(TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, t('You must transfer at least {{amount}} {{symbol}} to keep the destination account alive', { replace: { amount: atLeastStr, symbol: sendingTokenInfo.symbol } })); - // - // errors.push(error); - // } - return [warnings, errors]; } From a7098b4200b010a7ea92ad275bca46f03ba1e737 Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Tue, 26 Nov 2024 18:32:18 +0700 Subject: [PATCH 094/204] [Add] Extension - Intergrate Simple Swap] --- .env.example | 1 + .github/workflows/push-koni-dev.yml | 1 + .github/workflows/push-master.yml | 1 + .github/workflows/push-web-runner.yml | 1 + .github/workflows/push-webapp.yml | 1 + .../src/core/logic-validation/swap.ts | 29 +- .../handler/simpleswap-handler.ts | 411 ++++++++++++++++++ .../src/services/swap-service/index.ts | 13 +- .../src/services/swap-service/utils.ts | 10 +- .../src/services/transaction-service/utils.ts | 10 +- .../extension-base/src/types/swap/index.ts | 16 +- .../src/Popup/Home/History/Detail/index.tsx | 13 +- .../src/Popup/Home/History/Detail/index.tsx | 8 +- packages/web-runner/webpack.config.cjs | 3 +- packages/webapp/webpack.config.cjs | 3 +- 15 files changed, 508 insertions(+), 13 deletions(-) create mode 100644 packages/extension-base/src/services/swap-service/handler/simpleswap-handler.ts diff --git a/.env.example b/.env.example index 0d84f2a1e62..cdb6bb39587 100644 --- a/.env.example +++ b/.env.example @@ -9,3 +9,4 @@ BITTENSOR_API_KEY_3=abafdbad3 BITTENSOR_API_KEY_4=abafdbad4 BITTENSOR_API_KEY_5=abafdbad5 BITTENSOR_API_KEY_6=abafdbad6 +SIMPLE_SWAP_API_KEY=abacasdf diff --git a/.github/workflows/push-koni-dev.yml b/.github/workflows/push-koni-dev.yml index 1b32aefbf3c..b0bf8f2f20f 100644 --- a/.github/workflows/push-koni-dev.yml +++ b/.github/workflows/push-koni-dev.yml @@ -53,6 +53,7 @@ jobs: BITTENSOR_API_KEY_4: ${{ secrets.BITTENSOR_API_KEY_4 }} BITTENSOR_API_KEY_5: ${{ secrets.BITTENSOR_API_KEY_5 }} BITTENSOR_API_KEY_6: ${{ secrets.BITTENSOR_API_KEY_6 }} + SIMPLE_SWAP_API_KEY: ${{ secrets.SIMPLE_SWAP_API_KEY }} GH_RELEASE_FILES: master-build.zip,master-src.zip COMMIT_MESSAGE: ${{ github.event.head_commit.message }} REF_NAME: ${{ github.ref_name }} diff --git a/.github/workflows/push-master.yml b/.github/workflows/push-master.yml index ae535ffbeb9..ffd13e7259c 100644 --- a/.github/workflows/push-master.yml +++ b/.github/workflows/push-master.yml @@ -34,6 +34,7 @@ jobs: BITTENSOR_API_KEY_4: ${{ secrets.BITTENSOR_API_KEY_4 }} BITTENSOR_API_KEY_5: ${{ secrets.BITTENSOR_API_KEY_5 }} BITTENSOR_API_KEY_6: ${{ secrets.BITTENSOR_API_KEY_6 }} + SIMPLE_SWAP_API_KEY: ${{ secrets.SIMPLE_SWAP_API_KEY }} BRANCH_NAME: ${{ github.ref_name }} run: | yarn install --immutable | grep -v 'YN0013' diff --git a/.github/workflows/push-web-runner.yml b/.github/workflows/push-web-runner.yml index 63f94267440..cbb151ab596 100644 --- a/.github/workflows/push-web-runner.yml +++ b/.github/workflows/push-web-runner.yml @@ -38,6 +38,7 @@ jobs: BITTENSOR_API_KEY_4: ${{ secrets.BITTENSOR_API_KEY_4 }} BITTENSOR_API_KEY_5: ${{ secrets.BITTENSOR_API_KEY_5 }} BITTENSOR_API_KEY_6: ${{ secrets.BITTENSOR_API_KEY_6 }} + SIMPLE_SWAP_API_KEY: ${{ secrets.SIMPLE_SWAP_API_KEY }} BRANCH_NAME: master run: | yarn install --immutable | grep -v 'YN0013' diff --git a/.github/workflows/push-webapp.yml b/.github/workflows/push-webapp.yml index 01dd6f4460f..9827f97c0e0 100644 --- a/.github/workflows/push-webapp.yml +++ b/.github/workflows/push-webapp.yml @@ -34,6 +34,7 @@ jobs: CHAINFLIP_BROKER_API: ${{ secrets.CHAINFLIP_BROKER_API }} BITTENSOR_API_KEY_1: ${{ secrets.BITTENSOR_API_KEY_1 }} BITTENSOR_API_KEY_2: ${{ secrets.BITTENSOR_API_KEY_2 }} + SIMPLE_SWAP_API_KEY: ${{ secrets.SIMPLE_SWAP_API_KEY }} BRANCH_NAME: ${{ github.ref_name }} run: | yarn install --immutable | grep -v 'YN0013' diff --git a/packages/extension-base/src/core/logic-validation/swap.ts b/packages/extension-base/src/core/logic-validation/swap.ts index a9af3f63598..a749f5710f5 100644 --- a/packages/extension-base/src/core/logic-validation/swap.ts +++ b/packages/extension-base/src/core/logic-validation/swap.ts @@ -6,7 +6,7 @@ import { SwapError } from '@subwallet/extension-base/background/errors/SwapError import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError'; import { _getAssetDecimals, _getTokenMinAmount, _isChainEvmCompatible, _isNativeToken } from '@subwallet/extension-base/services/chain-service/utils'; import { BasicTxErrorType } from '@subwallet/extension-base/types'; -import { AssetHubPreValidationMetadata, ChainflipPreValidationMetadata, HydradxPreValidationMetadata, SwapErrorType } from '@subwallet/extension-base/types/swap'; +import { AssetHubPreValidationMetadata, ChainflipPreValidationMetadata, HydradxPreValidationMetadata, SimpleSwapValidationMetadata, SwapErrorType } from '@subwallet/extension-base/types/swap'; import { formatNumber } from '@subwallet/extension-base/utils'; import BigN from 'bignumber.js'; @@ -163,3 +163,30 @@ export function _getEarlyAssetHubValidationError (error: SwapErrorType, metadata return new SwapError(error); } } + +export function _getSimpleSwapEarlyValidationError (error: SwapErrorType, metadata: SimpleSwapValidationMetadata): SwapError { // todo: support more providers + switch (error) { + case SwapErrorType.NOT_MEET_MIN_SWAP: { + const message = `Amount too low. Increase your amount above ${metadata.minSwap.value} ${metadata.minSwap.symbol} and try again`; + + return new SwapError(error, message); + } + + case SwapErrorType.SWAP_EXCEED_ALLOWANCE: { + if (metadata.maxSwap) { + return new SwapError(error, `Amount too high. Lower your amount below ${metadata.maxSwap.value} ${metadata.maxSwap.symbol} and try again`); + } else { + return new SwapError(error, 'Amount too high. Lower your amount and try again'); + } + } + + case SwapErrorType.ASSET_NOT_SUPPORTED: + return new SwapError(error, 'This swap pair is not supported'); + case SwapErrorType.UNKNOWN: + return new SwapError(error, `Undefined error. Check your Internet and ${metadata.chain.slug} connection or contact support`); + case SwapErrorType.ERROR_FETCHING_QUOTE: + return new SwapError(error, 'No swap quote found. Adjust your amount or try again later.'); + default: + return new SwapError(error); + } +} diff --git a/packages/extension-base/src/services/swap-service/handler/simpleswap-handler.ts b/packages/extension-base/src/services/swap-service/handler/simpleswap-handler.ts new file mode 100644 index 00000000000..a994ca4ada2 --- /dev/null +++ b/packages/extension-base/src/services/swap-service/handler/simpleswap-handler.ts @@ -0,0 +1,411 @@ +// Copyright 2019-2022 @subwallet/extension-base +// SPDX-License-Identifier: Apache-2.0 + +import { _ChainAsset } from '@subwallet/chain-list/types'; +import { SwapError } from '@subwallet/extension-base/background/errors/SwapError'; +import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError'; +import { ChainType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes'; +import { _getSimpleSwapEarlyValidationError } from '@subwallet/extension-base/core/logic-validation/swap'; +import { _getAssetSymbol, _getChainNativeTokenSlug, _getContractAddressOfToken, _isChainSubstrateCompatible, _isNativeToken, _isSmartContractToken } from '@subwallet/extension-base/services/chain-service/utils'; +import { BaseStepDetail, BasicTxErrorType, CommonFeeComponent, CommonOptimalPath, CommonStepFeeInfo, CommonStepType, OptimalSwapPathParams, SimpleSwapTxData, SimpleSwapValidationMetadata, SwapEarlyValidation, SwapErrorType, SwapFeeType, SwapProviderId, SwapQuote, SwapRequest, SwapStepType, SwapSubmitParams, SwapSubmitStepData, TransactionData, ValidateSwapProcessParams } from '@subwallet/extension-base/types'; +import { formatNumber, toBNString } from '@subwallet/extension-base/utils'; +import BigNumber from 'bignumber.js'; + +import { SubmittableExtrinsic } from '@polkadot/api/types'; + +import { BalanceService } from '../../balance-service'; +import { getERC20TransactionObject, getEVMTransactionObject } from '../../balance-service/transfer/smart-contract'; +import { createTransferExtrinsic } from '../../balance-service/transfer/token'; +import { ChainService } from '../../chain-service'; +import { calculateSwapRate, SIMPLE_SWAP_SUPPORTED_TESTNET_ASSET_MAPPING, SWAP_QUOTE_TIMEOUT_MAP } from '../utils'; +import { SwapBaseHandler, SwapBaseInterface } from './base-handler'; + +interface SwapRange { + min: string; + max: string; +} + +interface ExchangeSimpleSwapData{ + id: string; + trace_id: string; + address_from: string; +} + +const apiUrl = 'https://api.simpleswap.io'; + +export const simpleSwapApiKey = process.env.SIMPLE_SWAP_API_KEY || ''; + +export class SimpleSwapHandler implements SwapBaseInterface { + private swapBaseHandler: SwapBaseHandler; + providerSlug: SwapProviderId; + + constructor (chainService: ChainService, balanceService: BalanceService) { + this.swapBaseHandler = new SwapBaseHandler({ + chainService, + balanceService, + providerName: 'SimpleSwap', + providerSlug: SwapProviderId.SIMPLE_SWAP + }); + this.providerSlug = SwapProviderId.SIMPLE_SWAP; + } + + public validateSwapProcess (params: ValidateSwapProcessParams): Promise { + const amount = params.selectedQuote.fromAmount; + const bnAmount = new BigNumber(amount); + + if (bnAmount.lte(0)) { + return Promise.resolve([new TransactionError(BasicTxErrorType.INVALID_PARAMS, 'Amount must be greater than 0')]); + } + + return Promise.resolve([]); + } + + get chainService () { + return this.swapBaseHandler.chainService; + } + + get balanceService () { + return this.swapBaseHandler.balanceService; + } + + get providerInfo () { + return this.swapBaseHandler.providerInfo; + } + + get name () { + return this.swapBaseHandler.name; + } + + get slug () { + return this.swapBaseHandler.slug; + } + + public async getSwapQuote (request: SwapRequest): Promise { + try { + const fromAsset = this.chainService.getAssetBySlug(request.pair.from); + const toAsset = this.chainService.getAssetBySlug(request.pair.to); + const fromSymbol = SIMPLE_SWAP_SUPPORTED_TESTNET_ASSET_MAPPING[fromAsset.slug]; + const toSymbol = SIMPLE_SWAP_SUPPORTED_TESTNET_ASSET_MAPPING[toAsset.slug]; + + if (!fromAsset || !toAsset) { + return new SwapError(SwapErrorType.UNKNOWN); + } + + const earlyValidation = await this.validateSwapRequest(request); + + const metadata = earlyValidation.metadata as SimpleSwapValidationMetadata; + + if (earlyValidation.error) { + return _getSimpleSwapEarlyValidationError(earlyValidation.error, metadata); + } + + const params = new URLSearchParams({ + api_key: `${simpleSwapApiKey}`, + fixed: 'false', + currency_from: fromSymbol, + currency_to: toSymbol, + amount: formatNumber(request.fromAmount, fromAsset.decimals || 0) + }); + + const response = await fetch(`${apiUrl}/get_estimated?${params.toString()}`, { + headers: { accept: 'application/json' } + }); + + if (!response.ok) { + return new SwapError(SwapErrorType.ERROR_FETCHING_QUOTE); + } + + const resToAmount = await response.json() as string; + const toAmount = toBNString(resToAmount, toAsset.decimals || 0); + + const rate = calculateSwapRate(request.fromAmount, toAmount, fromAsset, toAsset); + + const fromChain = this.chainService.getChainInfoByKey(fromAsset.originChain); + const fromChainNativeTokenSlug = _getChainNativeTokenSlug(fromChain); + const defaultFeeToken = _isNativeToken(fromAsset) ? fromAsset.slug : fromChainNativeTokenSlug; + + const feeComponent: CommonFeeComponent[] = [ + { + tokenSlug: fromAsset.slug, + amount: '0', + feeType: SwapFeeType.NETWORK_FEE + } + ]; + + return { + pair: request.pair, + fromAmount: request.fromAmount, + toAmount, + rate, + provider: this.providerInfo, + aliveUntil: +Date.now() + (SWAP_QUOTE_TIMEOUT_MAP[this.slug] || SWAP_QUOTE_TIMEOUT_MAP.default), + minSwap: toBNString(metadata.minSwap.value, fromAsset.decimals || 0), + maxSwap: metadata.maxSwap?.value, + estimatedArrivalTime: 0, + isLowLiquidity: false, + feeInfo: { + feeComponent, + defaultFeeToken, + feeOptions: [defaultFeeToken] + }, + route: { + path: [fromAsset.slug, toAsset.slug] + } + } as SwapQuote; + } catch (e) { + return new SwapError(SwapErrorType.UNKNOWN); + } + } + + generateOptimalProcess (params: OptimalSwapPathParams): Promise { + return this.swapBaseHandler.generateOptimalProcess(params, [ + this.getSubmitStep + ]); + } + + async getSubmitStep (params: OptimalSwapPathParams): Promise<[BaseStepDetail, CommonStepFeeInfo] | undefined> { + if (params.selectedQuote) { + const submitStep = { + name: 'Swap', + type: SwapStepType.SWAP + }; + + return Promise.resolve([submitStep, params.selectedQuote.feeInfo]); + } + + return Promise.resolve(undefined); + } + + public async validateSwapRequest (request: SwapRequest): Promise { + try { + const fromAsset = this.chainService.getAssetBySlug(request.pair.from); + const toAsset = this.chainService.getAssetBySlug(request.pair.to); + + if (!fromAsset || !toAsset) { + return { error: SwapErrorType.ASSET_NOT_SUPPORTED }; + } + + const fromSymbol = SIMPLE_SWAP_SUPPORTED_TESTNET_ASSET_MAPPING[fromAsset.slug]; + const toSymbol = SIMPLE_SWAP_SUPPORTED_TESTNET_ASSET_MAPPING[toAsset.slug]; + + if (!fromSymbol || !toSymbol) { + return { error: SwapErrorType.ASSET_NOT_SUPPORTED }; + } + + console.log('Hmm', simpleSwapApiKey); + const swapListParams = new URLSearchParams({ + api_key: `${simpleSwapApiKey}`, + fixed: 'false', + symbol: fromSymbol + }); + + const swapListResponse = await fetch(`${apiUrl}/get_pairs?${swapListParams.toString()}`, { + headers: { accept: 'application/json' } + }); + + if (!swapListResponse.ok) { + return { error: SwapErrorType.UNKNOWN }; + } + + const swapList = await swapListResponse.json() as string[]; + + console.log('Hmm', swapList); + + if (!swapList.includes(toAsset.symbol.toLowerCase())) { + return { error: SwapErrorType.ASSET_NOT_SUPPORTED }; + } + + const rangesParams = new URLSearchParams({ + api_key: `${simpleSwapApiKey}`, + fixed: 'false', + currency_from: fromSymbol, + currency_to: toSymbol + }); + + const rangesResponse = await fetch(`${apiUrl}/get_ranges?${rangesParams.toString()}`, { + headers: { accept: 'application/json' } + }); + + if (!rangesResponse.ok) { + return { error: SwapErrorType.UNKNOWN }; + } + + const ranges = await rangesResponse.json() as SwapRange; + const { max, min } = ranges; + + const bnAmount = new BigNumber(request.fromAmount); + const parsedbnAmount = formatNumber(bnAmount.toString(), fromAsset.decimals || 0); + + if (parsedbnAmount < min) { + return { + error: SwapErrorType.NOT_MEET_MIN_SWAP, + metadata: { + minSwap: { + value: min, + symbol: fromAsset.symbol + }, + maxSwap: max + ? { + value: max, + symbol: fromAsset.symbol + } + : undefined, + chain: this.chainService.getChainInfoByKey(fromAsset.originChain) + } as SimpleSwapValidationMetadata + }; + } + + if (max && parsedbnAmount > max) { + return { + error: SwapErrorType.SWAP_EXCEED_ALLOWANCE, + metadata: { + minSwap: { + value: min, + symbol: fromAsset.symbol + }, + maxSwap: { + value: max, + symbol: fromAsset.symbol + }, + chain: this.chainService.getChainInfoByKey(fromAsset.originChain) + } as SimpleSwapValidationMetadata + }; + } + + return { + metadata: { + minSwap: { + value: min, + symbol: fromAsset.symbol + }, + maxSwap: max + ? { + value: max, + symbol: fromAsset.symbol + } + : undefined, + chain: this.chainService.getChainInfoByKey(fromAsset.originChain) + } as SimpleSwapValidationMetadata + }; + } catch (e) { + return { error: SwapErrorType.UNKNOWN }; + } + } + + public async handleSwapProcess (params: SwapSubmitParams): Promise { + const { currentStep, process } = params; + const type = process.steps[currentStep].type; + + switch (type) { + case CommonStepType.DEFAULT: + return Promise.reject(new TransactionError(BasicTxErrorType.UNSUPPORTED)); + case SwapStepType.SWAP: + return this.handleSubmitStep(params); + default: + return this.handleSubmitStep(params); + } + } + + public async handleSubmitStep (params: SwapSubmitParams): Promise { + const { address, quote, recipient } = params; + + const pair = quote.pair; + + const fromAsset = this.chainService.getAssetBySlug(pair.from); + const toAsset = this.chainService.getAssetBySlug(pair.to); + const chainInfo = this.chainService.getChainInfoByKey(fromAsset.originChain); + const chainType = _isChainSubstrateCompatible(chainInfo) ? ChainType.SUBSTRATE : ChainType.EVM; + const receiver = recipient ?? address; + + const fromSymbol = SIMPLE_SWAP_SUPPORTED_TESTNET_ASSET_MAPPING[fromAsset.slug]; + const toSymbol = SIMPLE_SWAP_SUPPORTED_TESTNET_ASSET_MAPPING[toAsset.slug]; + + const requestBody = { + fixed: false, + currency_from: fromSymbol, + currency_to: toSymbol, + amount: quote.fromAmount, + address_to: receiver, + extra_id_to: '', + user_refund_address: address, + user_refund_extra_id: '' + }; + + const response = await fetch( + `${apiUrl}/create_exchange?api_key=${simpleSwapApiKey}`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json' + }, + body: JSON.stringify(requestBody) + } + ); + + const depositAddressResponse = await response.json() as ExchangeSimpleSwapData; + + const txData: SimpleSwapTxData = { + id: depositAddressResponse.id, + address, + provider: this.providerInfo, + quote: params.quote, + slippage: params.slippage, + recipient, + process: params.process + }; + + let extrinsic: TransactionData; + + if (chainType === ChainType.SUBSTRATE) { + const chainApi = this.chainService.getSubstrateApi(chainInfo.slug); + const substrateApi = await chainApi.isReady; + + const [submittableExtrinsic] = await createTransferExtrinsic({ + from: address, + networkKey: chainInfo.slug, + substrateApi, + to: depositAddressResponse.address_from, + tokenInfo: fromAsset, + transferAll: false, + value: quote.fromAmount + }); + + extrinsic = submittableExtrinsic as SubmittableExtrinsic<'promise'>; + } else { + if (_isNativeToken(fromAsset)) { + const [transactionConfig] = await getEVMTransactionObject( + chainInfo, + address, + depositAddressResponse.address_from, + quote.fromAmount, + false, + this.chainService.getEvmApi(chainInfo.slug) + ); + + extrinsic = transactionConfig; + } else { + const [transactionConfig] = await getERC20TransactionObject( + _getContractAddressOfToken(fromAsset), + chainInfo, + address, + depositAddressResponse.address_from, + quote.fromAmount, + false, + this.chainService.getEvmApi(chainInfo.slug) + ); + + extrinsic = transactionConfig; + } + } + + return { + txChain: fromAsset.originChain, + txData, + extrinsic, + transferNativeAmount: _isNativeToken(fromAsset) ? quote.fromAmount : '0', + extrinsicType: ExtrinsicType.SWAP, + chainType + } as SwapSubmitStepData; + } +} diff --git a/packages/extension-base/src/services/swap-service/index.ts b/packages/extension-base/src/services/swap-service/index.ts index b7da4e3e6f9..541b3f288a5 100644 --- a/packages/extension-base/src/services/swap-service/index.ts +++ b/packages/extension-base/src/services/swap-service/index.ts @@ -18,6 +18,14 @@ import { _SUPPORTED_SWAP_PROVIDERS, OptimalSwapPathParams, QuoteAskResponse, Swa import { createPromiseHandler, PromiseHandler } from '@subwallet/extension-base/utils'; import { BehaviorSubject } from 'rxjs'; +import { SimpleSwapHandler } from './handler/simpleswap-handler'; + +export const _isChainSupportedByProvider = (providerSlug: SwapProviderId, chain: string) => { + const supportedChains = _PROVIDER_TO_SUPPORTED_PAIR_MAP[providerSlug]; + + return supportedChains ? supportedChains.includes(chain) : false; +}; + export class SwapService implements ServiceWithProcessInterface, StoppableServiceInterface { protected readonly state: KoniState; private eventService: EventService; @@ -41,7 +49,7 @@ export class SwapService implements ServiceWithProcessInterface, StoppableServic await Promise.all(Object.values(this.handlers).map(async (handler) => { // temporary solution to reduce number of requests to providers, will work as long as there's only 1 provider for 1 chain - if (!_PROVIDER_TO_SUPPORTED_PAIR_MAP[handler.providerSlug].includes(swappingSrcChain)) { + if (!_isChainSupportedByProvider(handler.providerSlug, swappingSrcChain)) { return; } @@ -182,6 +190,9 @@ export class SwapService implements ServiceWithProcessInterface, StoppableServic case SwapProviderId.ROCOCO_ASSET_HUB: this.handlers[providerId] = new AssetHubSwapHandler(this.chainService, this.state.balanceService, 'rococo_assethub'); break; + case SwapProviderId.SIMPLE_SWAP: + this.handlers[providerId] = new SimpleSwapHandler(this.chainService, this.state.balanceService); + break; default: throw new Error('Unsupported provider'); diff --git a/packages/extension-base/src/services/swap-service/utils.ts b/packages/extension-base/src/services/swap-service/utils.ts index 6dd416ab0fe..903fb3d8c3f 100644 --- a/packages/extension-base/src/services/swap-service/utils.ts +++ b/packages/extension-base/src/services/swap-service/utils.ts @@ -12,6 +12,8 @@ import BigN from 'bignumber.js'; export const CHAIN_FLIP_TESTNET_EXPLORER = 'https://blocks-perseverance.chainflip.io'; export const CHAIN_FLIP_MAINNET_EXPLORER = 'https://scan.chainflip.io'; +export const SIMPLE_SWAP_EXPLORER = 'https://simpleswap.io'; + export const CHAIN_FLIP_SUPPORTED_MAINNET_MAPPING: Record = { [COMMON_CHAIN_SLUGS.POLKADOT]: Chains.Polkadot, [COMMON_CHAIN_SLUGS.ETHEREUM]: Chains.Ethereum, @@ -36,6 +38,11 @@ export const CHAIN_FLIP_SUPPORTED_TESTNET_ASSET_MAPPING: Record = [COMMON_ASSETS.USDC_SEPOLIA]: Assets.USDC }; +export const SIMPLE_SWAP_SUPPORTED_TESTNET_ASSET_MAPPING: Record = { + 'bittensor-NATIVE-TAO': 'tao', + [COMMON_ASSETS.ETH]: 'eth' +}; + export const SWAP_QUOTE_TIMEOUT_MAP: Record = { // in milliseconds default: 30000, [SwapProviderId.CHAIN_FLIP_TESTNET]: 30000, @@ -49,7 +56,8 @@ export const _PROVIDER_TO_SUPPORTED_PAIR_MAP: Record = { [SwapProviderId.CHAIN_FLIP_TESTNET]: [COMMON_CHAIN_SLUGS.CHAINFLIP_POLKADOT, COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA], [SwapProviderId.POLKADOT_ASSET_HUB]: [COMMON_CHAIN_SLUGS.POLKADOT_ASSET_HUB], [SwapProviderId.KUSAMA_ASSET_HUB]: [COMMON_CHAIN_SLUGS.KUSAMA_ASSET_HUB], - [SwapProviderId.ROCOCO_ASSET_HUB]: [COMMON_CHAIN_SLUGS.ROCOCO_ASSET_HUB] + [SwapProviderId.ROCOCO_ASSET_HUB]: [COMMON_CHAIN_SLUGS.ROCOCO_ASSET_HUB], + [SwapProviderId.SIMPLE_SWAP]: ['bittensor', 'bittensor_testnet', COMMON_CHAIN_SLUGS.ETHEREUM] }; export function getSwapAlternativeAsset (swapPair: SwapPair): string | undefined { diff --git a/packages/extension-base/src/services/transaction-service/utils.ts b/packages/extension-base/src/services/transaction-service/utils.ts index 72a5dcfa169..4b7b42a32f2 100644 --- a/packages/extension-base/src/services/transaction-service/utils.ts +++ b/packages/extension-base/src/services/transaction-service/utils.ts @@ -4,8 +4,8 @@ import { _ChainInfo } from '@subwallet/chain-list/types'; import { ExtrinsicDataTypeMap, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes'; import { _getBlockExplorerFromChain, _isChainTestNet, _isPureEvmChain } from '@subwallet/extension-base/services/chain-service/utils'; -import { CHAIN_FLIP_MAINNET_EXPLORER, CHAIN_FLIP_TESTNET_EXPLORER } from '@subwallet/extension-base/services/swap-service/utils'; -import { ChainflipSwapTxData } from '@subwallet/extension-base/types/swap'; +import { CHAIN_FLIP_MAINNET_EXPLORER, CHAIN_FLIP_TESTNET_EXPLORER, SIMPLE_SWAP_EXPLORER } from '@subwallet/extension-base/services/swap-service/utils'; +import { ChainflipSwapTxData, SimpleSwapTxData } from '@subwallet/extension-base/types/swap'; // @ts-ignore export function parseTransactionData (data: unknown): ExtrinsicDataTypeMap[T] { @@ -97,3 +97,9 @@ export function getChainflipExplorerLink (data: ChainflipSwapTxData, chainInfo: return `${chainflipDomain}/channels/${data.depositChannelId}`; } + +export function getSimpleSwapExplorerLink (data: SimpleSwapTxData) { + const simpleswapDomain = SIMPLE_SWAP_EXPLORER; + + return `${simpleswapDomain}/exchange?id=${data.id}`; +} diff --git a/packages/extension-base/src/types/swap/index.ts b/packages/extension-base/src/types/swap/index.ts index 129dc7c6f5a..9122cfa7c2f 100644 --- a/packages/extension-base/src/types/swap/index.ts +++ b/packages/extension-base/src/types/swap/index.ts @@ -67,6 +67,7 @@ export enum SwapProviderId { POLKADOT_ASSET_HUB = 'POLKADOT_ASSET_HUB', KUSAMA_ASSET_HUB = 'KUSAMA_ASSET_HUB', ROCOCO_ASSET_HUB = 'ROCOCO_ASSET_HUB', + SIMPLE_SWAP = 'SIMPLE_SWAP' } export const _SUPPORTED_SWAP_PROVIDERS: SwapProviderId[] = [ @@ -76,7 +77,8 @@ export const _SUPPORTED_SWAP_PROVIDERS: SwapProviderId[] = [ SwapProviderId.HYDRADX_TESTNET, SwapProviderId.POLKADOT_ASSET_HUB, SwapProviderId.KUSAMA_ASSET_HUB, - SwapProviderId.ROCOCO_ASSET_HUB + SwapProviderId.ROCOCO_ASSET_HUB, + SwapProviderId.SIMPLE_SWAP ]; export interface SwapProvider { @@ -93,7 +95,7 @@ export enum SwapFeeType { WALLET_FEE = 'WALLET_FEE' } -export type SwapTxData = ChainflipSwapTxData | HydradxSwapTxData; // todo: will be more +export type SwapTxData = ChainflipSwapTxData | HydradxSwapTxData | SimpleSwapTxData; // todo: will be more export interface SwapBaseTxData { provider: SwapProvider; @@ -110,6 +112,10 @@ export interface ChainflipSwapTxData extends SwapBaseTxData { estimatedDepositChannelExpiryTime?: number; } +export interface SimpleSwapTxData extends SwapBaseTxData { + id: string; +} + export interface HydradxSwapTxData extends SwapBaseTxData { txHex: string; } @@ -135,6 +141,12 @@ export interface AssetHubPreValidationMetadata { priceImpactPct?: string; } +export interface SimpleSwapValidationMetadata{ + minSwap: AmountData; + maxSwap: AmountData; + chain: _ChainInfo; +} + export interface QuoteAskResponse { quote?: SwapQuote; error?: SwapError; diff --git a/packages/extension-koni-ui/src/Popup/Home/History/Detail/index.tsx b/packages/extension-koni-ui/src/Popup/Home/History/Detail/index.tsx index b47ff9b18f0..a9ffe309948 100644 --- a/packages/extension-koni-ui/src/Popup/Home/History/Detail/index.tsx +++ b/packages/extension-koni-ui/src/Popup/Home/History/Detail/index.tsx @@ -2,7 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 import { ExtrinsicType, TransactionAdditionalInfo } from '@subwallet/extension-base/background/KoniTypes'; -import { getExplorerLink } from '@subwallet/extension-base/services/transaction-service/utils'; +import { getExplorerLink, getSimpleSwapExplorerLink } from '@subwallet/extension-base/services/transaction-service/utils'; +import { SimpleSwapTxData, SwapProviderId, SwapTxData } from '@subwallet/extension-base/types'; import { InfoItemBase } from '@subwallet/extension-koni-ui/components'; import { HISTORY_DETAIL_MODAL } from '@subwallet/extension-koni-ui/constants'; import { RootState } from '@subwallet/extension-koni-ui/stores'; @@ -55,7 +56,15 @@ function Component ({ className = '', data, onCancel }: Props): React.ReactEleme originChainInfo = chainInfoMap[additionalInfo.originalChain] || chainInfo; } - const link = (data.extrinsicHash && data.extrinsicHash !== '') && getExplorerLink(originChainInfo, data.extrinsicHash, 'tx'); + let link = (data.extrinsicHash && data.extrinsicHash !== '') && getExplorerLink(originChainInfo, data.extrinsicHash, 'tx'); + + if (extrinsicType === ExtrinsicType.SWAP) { + const additionalInfo = data.additionalInfo as SwapTxData; + + if ([SwapProviderId.SIMPLE_SWAP].includes(additionalInfo.provider.id)) { + link = getSimpleSwapExplorerLink(additionalInfo as SimpleSwapTxData); + } + } return (