diff --git a/package.json b/package.json index 2d23e1afb56..3aadf8bd42a 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "@polkadot/types-codec": "10.10.1", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/chain-list": "0.2.70-beta.6", + "@subwallet/chain-list": "0.2.71-beta.0", "@subwallet/keyring": "file:./local-libs/keyring", "@subwallet/ui-keyring": "file:./local-libs/ui-keyring", "babel-core": "^7.0.0-bridge.0", diff --git a/packages/extension-base/src/services/chain-service/index.ts b/packages/extension-base/src/services/chain-service/index.ts index 29a02104ef5..6f11831d6c7 100644 --- a/packages/extension-base/src/services/chain-service/index.ts +++ b/packages/extension-base/src/services/chain-service/index.ts @@ -57,7 +57,8 @@ const openbitChainInfoMap = (() => { 'botanixEvmTest', 'bounceBitEvm', 'bounceBitEvmTest', - 'layerEdge_testnet' + 'layerEdge_testnet', + 'bevm_testnet' ]; const enableList = nativeList.concat(bitcoinL2List); @@ -1926,9 +1927,7 @@ export class ChainService { let existedToken: _ChainAsset | undefined; for (const token of Object.values(assetRegistry)) { - const ticker = token?.slug; - - if (ticker === data.ticker && token.assetType === data.type && token.originChain === data.originChain) { + if (token?.symbol === data.ticker && token?.assetType === data.type && token?.originChain === data.originChain) { existedToken = token; break; } diff --git a/packages/extension-base/src/services/hiro-service/utils/index.ts b/packages/extension-base/src/services/hiro-service/utils/index.ts index a296e28f0b1..ec24aebb45d 100644 --- a/packages/extension-base/src/services/hiro-service/utils/index.ts +++ b/packages/extension-base/src/services/hiro-service/utils/index.ts @@ -71,3 +71,17 @@ export function getPreviewUrl (inscriptionId: string) { throw error; } } + +export function isValidBrc20Ticker (ticker: string) { + const bytesLength = getByteLength(ticker); + + return bytesLength === 4 || bytesLength === 5; +} + +function getByteLength (str: string): number { + const encoder = new TextEncoder(); + const encodedStr = encoder.encode(str); + + // Return the length of the encoded array, which represents the number of bytes + return encodedStr.length; +} diff --git a/packages/extension-base/src/services/rune-service/utils/index.ts b/packages/extension-base/src/services/rune-service/utils/index.ts index ad2995eed85..78657ad4f1c 100644 --- a/packages/extension-base/src/services/rune-service/utils/index.ts +++ b/packages/extension-base/src/services/rune-service/utils/index.ts @@ -42,13 +42,17 @@ export async function getAllCollectionRunes (isTestnet = false) { } } -export async function getRuneMetadata (runeid: string, isTestnet = false) { +export async function getRuneMetadata (runeId: string, isTestnet = false) { const runeService = RunesService.getInstance(isTestnet); try { - return await runeService.getRuneMetadata(runeid); + return await runeService.getRuneMetadata(runeId); } catch (error) { - console.error(`Failed to get rune ${runeid} metadata`, error); + console.error(`Failed to get rune ${runeId} metadata`, error); throw error; } } + +export function isValidRuneId (runeId: string) { + return runeId.includes(':'); +} 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 4006e059e1d..f958bee9f10 100644 --- a/packages/extension-koni-ui/src/Popup/Settings/Tokens/FungibleTokenImport.tsx +++ b/packages/extension-koni-ui/src/Popup/Settings/Tokens/FungibleTokenImport.tsx @@ -3,6 +3,8 @@ import { _AssetType, _ChainInfo } from '@subwallet/chain-list/types'; import { _getTokenTypesSupportedByChain, _isChainTestNet, _parseMetadataForBrc20Asset, _parseMetadataForRuneAsset, _parseMetadataForSmartContractAsset } from '@subwallet/extension-base/services/chain-service/utils'; +import { isValidBrc20Ticker } from '@subwallet/extension-base/services/hiro-service/utils'; +import { isValidRuneId } from '@subwallet/extension-base/services/rune-service/utils'; import { isValidSubstrateAddress } from '@subwallet/extension-base/utils'; import { AddressInput, ChainSelector, Layout, PageWrapper, TokenTypeSelector } from '@subwallet/extension-koni-ui/components'; import { DataContext } from '@subwallet/extension-koni-ui/contexts/DataContext'; @@ -10,7 +12,6 @@ import { useChainChecker, useDefaultNavigate, useGetChainPrefixBySlug, useGetFun import { upsertCustomToken, validateCustomBrc20, validateCustomRune, validateCustomToken } from '@subwallet/extension-koni-ui/messaging'; import { FormCallbacks, FormRule, Theme, ThemeProps } from '@subwallet/extension-koni-ui/types'; import { convertFieldToError, convertFieldToObject, reformatAddress, simpleCheckForm } from '@subwallet/extension-koni-ui/utils'; -import { isBitcoinAddress } from '@subwallet/keyring'; import { Col, Field, Form, Icon, Input, Row } from '@subwallet/react-ui'; import SwAvatar from '@subwallet/react-ui/es/sw-avatar'; import { PlusCircle } from 'phosphor-react'; @@ -114,11 +115,12 @@ function Component ({ className = '' }: Props): React.ReactElement { const selectedTokenType = getFieldValue('type') as _AssetType; const isValidEvmContract = [_AssetType.ERC20].includes(selectedTokenType) && isEthereumAddress(inputMetadata); const isValidWasmContract = [_AssetType.PSP22].includes(selectedTokenType) && isValidSubstrateAddress(inputMetadata); - const isValidRune = [_AssetType.RUNE].includes(selectedTokenType) && isBitcoinAddress(inputMetadata); - const isValidBrc20 = [_AssetType.BRC20].includes(selectedTokenType) && isBitcoinAddress(inputMetadata); - const reformattedContractAddress = reformatAddress(inputMetadata, chainNetworkPrefix); + const isValidRune = [_AssetType.RUNE].includes(selectedTokenType) && isValidRuneId(inputMetadata); + const isValidBrc20 = [_AssetType.BRC20].includes(selectedTokenType) && isValidBrc20Ticker(inputMetadata); if (isValidEvmContract || isValidWasmContract) { + const reformattedContractAddress = reformatAddress(inputMetadata, chainNetworkPrefix); + setLoading(true); validateCustomToken({ contractAddress: reformattedContractAddress, @@ -158,7 +160,6 @@ function Component ({ className = '' }: Props): React.ReactElement { type: selectedTokenType }) .then((validationResult) => { - console.log('validationResult'); setLoading(false); if (validationResult.isExist) { diff --git a/yarn.lock b/yarn.lock index 111477e1890..ba98124ed6d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6241,14 +6241,14 @@ __metadata: languageName: node linkType: hard -"@subwallet/chain-list@npm:0.2.70-beta.6": - version: 0.2.70-beta.6 - resolution: "@subwallet/chain-list@npm:0.2.70-beta.6" +"@subwallet/chain-list@npm:0.2.71-beta.0": + version: 0.2.71-beta.0 + resolution: "@subwallet/chain-list@npm:0.2.71-beta.0" dependencies: "@polkadot/dev": 0.67.167 "@polkadot/util": ^12.5.1 eventemitter3: ^5.0.1 - checksum: d4e5085eb6501555202879233cdbc23c37e4926fb0488ab3691c7b5e0354e763f6e34c3029918944346cc3f1eaa3e201a3e9eec78f01d1332c41a8d10c2331e2 + checksum: 811e36c63651b798ccb260bf29bbf4847900bafc9c2cce2ad547ab85123a41756fcb4bb276d98f7d59548771ad00b72e56b0b0ba4c3fbd610ae28cbb9e112fb9 languageName: node linkType: hard