From 267568591ac2fe759961c99c9f15ae4050c2db1e Mon Sep 17 00:00:00 2001 From: lelenei Date: Mon, 11 Jul 2022 10:59:35 +0800 Subject: [PATCH 1/3] fix: tokenId at alchemy --- packages/web3-providers/src/alchemy/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/web3-providers/src/alchemy/index.ts b/packages/web3-providers/src/alchemy/index.ts index fd8a9599c3a6..14750c115cbf 100644 --- a/packages/web3-providers/src/alchemy/index.ts +++ b/packages/web3-providers/src/alchemy/index.ts @@ -146,7 +146,7 @@ function createNftToken_EVM( asset: AlchemyNFT_EVM, ): NonFungibleAsset { const contractAddress = asset.contract?.address - const tokenId = Number.parseInt(asset.id?.tokenId, 16).toString() + const tokenId = asset.id?.tokenId return { id: `${contractAddress}_${tokenId}`, @@ -257,7 +257,7 @@ function createNftToken_FLOW( chainId, type: TokenType.NonFungible, schema: SchemaType_FLOW.NonFungible, - tokenId: Number.parseInt(asset.id?.tokenId, 16).toString(), + tokenId: asset.id?.tokenId, address: asset.contract?.address, metadata: { chainId, @@ -300,7 +300,7 @@ function createNFTAsset_FLOW( chainId, type: TokenType.NonFungible, schema: SchemaType_FLOW.NonFungible, - tokenId: Number.parseInt(metaDataResponse.id?.tokenId, 16).toString(), + tokenId: metaDataResponse.id?.tokenId, address: metaDataResponse.contract?.address, metadata: { chainId, From 920dcf2006a76057f0e8e97b8a00756e74743356 Mon Sep 17 00:00:00 2001 From: lelenei Date: Mon, 11 Jul 2022 18:31:24 +0800 Subject: [PATCH 2/3] fix: long long number to string --- packages/web3-providers/src/alchemy/index.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/web3-providers/src/alchemy/index.ts b/packages/web3-providers/src/alchemy/index.ts index 14750c115cbf..4a4e23fa447f 100644 --- a/packages/web3-providers/src/alchemy/index.ts +++ b/packages/web3-providers/src/alchemy/index.ts @@ -15,6 +15,7 @@ import { SchemaType as SchemaType_EVM, } from '@masknet/web3-shared-evm' import { ChainId as ChainId_FLOW, SchemaType as SchemaType_FLOW } from '@masknet/web3-shared-flow' +import BigNumber from 'bignumber.js' import { first } from 'lodash-unified' import urlcat from 'urlcat' import type { NonFungibleTokenAPI } from '..' @@ -141,13 +142,21 @@ function resolveCollectionName(asset: AlchemyNFT_EVM) { return '' } +function numberToString(tokenId: string) { + const data = new BigNumber(tokenId).toString() + const matches = data.match(/^(\d\.\d*)e\+(\d*)$/) + if (!matches) return data + const length = Number(matches[2]) + const id = matches[1].replace('.', '') + return id.padEnd(length + 1, '0') +} + function createNftToken_EVM( chainId: ChainId_EVM, asset: AlchemyNFT_EVM, ): NonFungibleAsset { const contractAddress = asset.contract?.address - const tokenId = asset.id?.tokenId - + const tokenId = numberToString(asset.id.tokenId) return { id: `${contractAddress}_${tokenId}`, chainId, @@ -206,7 +215,7 @@ function createNFTAsset_EVM( metaDataResponse?.id?.tokenMetadata?.tokenType === 'ERC721' ? SchemaType_EVM.ERC721 : SchemaType_EVM.ERC1155, - tokenId: metaDataResponse.id?.tokenId, + tokenId: numberToString(metaDataResponse.id.tokenId), address: metaDataResponse.contract?.address, metadata: { chainId, @@ -257,7 +266,7 @@ function createNftToken_FLOW( chainId, type: TokenType.NonFungible, schema: SchemaType_FLOW.NonFungible, - tokenId: asset.id?.tokenId, + tokenId: numberToString(asset.id.tokenId), address: asset.contract?.address, metadata: { chainId, From 06b518d3f0c7c4e314462043d1b225460236f1c1 Mon Sep 17 00:00:00 2001 From: lelenei Date: Tue, 12 Jul 2022 15:34:39 +0800 Subject: [PATCH 3/3] fix: use web3.utils.hexToNumberString --- packages/web3-providers/src/alchemy/index.ts | 34 ++++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/packages/web3-providers/src/alchemy/index.ts b/packages/web3-providers/src/alchemy/index.ts index 3550df215f5b..ad132d316f34 100644 --- a/packages/web3-providers/src/alchemy/index.ts +++ b/packages/web3-providers/src/alchemy/index.ts @@ -15,9 +15,9 @@ import { SchemaType as SchemaType_EVM, } from '@masknet/web3-shared-evm' import { ChainId as ChainId_FLOW, SchemaType as SchemaType_FLOW } from '@masknet/web3-shared-flow' -import BigNumber from 'bignumber.js' import { first } from 'lodash-unified' import urlcat from 'urlcat' +import { hexToNumberString, isHex } from 'web3-utils' import type { NonFungibleTokenAPI } from '..' import { fetchJSON } from '../helpers' import { Alchemy_EVM_NetworkMap, Alchemy_FLOW_NetworkMap, FILTER_WORDS } from './constants' @@ -142,21 +142,15 @@ function resolveCollectionName(asset: AlchemyNFT_EVM) { return '' } -function numberToString(tokenId: string) { - const data = new BigNumber(tokenId).toString() - const matches = data.match(/^(\d\.\d*)e\+(\d*)$/) - if (!matches) return data - const length = Number(matches[2]) - const id = matches[1].replace('.', '') - return id.padEnd(length + 1, '0') -} - function createNftToken_EVM( chainId: ChainId_EVM, asset: AlchemyNFT_EVM, ): NonFungibleAsset { const contractAddress = asset.contract?.address - const tokenId = numberToString(asset.id.tokenId) + let tokenId = asset.id.tokenId + if (isHex(asset.id.tokenId)) { + tokenId = hexToNumberString(asset.id.tokenId) + } return { id: `${contractAddress}_${tokenId}`, chainId, @@ -207,6 +201,10 @@ function createNFTAsset_EVM( contractMetadataResponse?: AlchemyResponse_EVM_Contact_Metadata, ownersResponse?: AlchemyResponse_EVM_Owners, ): NonFungibleAsset { + let tokenId = metaDataResponse.id.tokenId + if (isHex(metaDataResponse.id.tokenId)) { + tokenId = hexToNumberString(metaDataResponse.id.tokenId) + } return { id: metaDataResponse.contract?.address, chainId, @@ -215,7 +213,7 @@ function createNFTAsset_EVM( metaDataResponse?.id?.tokenMetadata?.tokenType === 'ERC721' ? SchemaType_EVM.ERC721 : SchemaType_EVM.ERC1155, - tokenId: numberToString(metaDataResponse.id.tokenId), + tokenId, address: metaDataResponse.contract?.address, metadata: { chainId, @@ -261,12 +259,16 @@ function createNftToken_FLOW( chainId: ChainId_FLOW, asset: AlchemyNFT_FLOW, ): NonFungibleAsset { + let tokenId = asset.id.tokenId + if (isHex(asset.id.tokenId)) { + tokenId = hexToNumberString(asset.id.tokenId) + } return { id: asset.contract?.address, chainId, type: TokenType.NonFungible, schema: SchemaType_FLOW.NonFungible, - tokenId: numberToString(asset.id.tokenId), + tokenId, address: asset.contract?.address, metadata: { chainId, @@ -304,12 +306,16 @@ function createNFTAsset_FLOW( ownerAddress: string, metaDataResponse: AlchemyResponse_FLOW_Metadata, ): NonFungibleAsset { + let tokenId = metaDataResponse.id.tokenId + if (isHex(metaDataResponse.id.tokenId)) { + tokenId = hexToNumberString(metaDataResponse.id.tokenId) + } return { id: metaDataResponse.contract?.address, chainId, type: TokenType.NonFungible, schema: SchemaType_FLOW.NonFungible, - tokenId: numberToString(metaDataResponse.id.tokenId), + tokenId, address: metaDataResponse.contract?.address, metadata: { chainId,