From 064df2a005d640b2041870534fb720617066fd7e Mon Sep 17 00:00:00 2001 From: Lantt Date: Tue, 28 Dec 2021 14:54:29 +0800 Subject: [PATCH] feat: web3 provider api support page size in response --- .../src/plugins/EVM/services/Asset/index.ts | 9 +++++++-- .../src/plugins/EVM/services/NFT/index.ts | 1 + .../src/plugins/Wallet/services/assets.ts | 15 ++++++++------ packages/web3-providers/src/NFTScan/index.ts | 16 ++++++++++++--- packages/web3-providers/src/opensea/index.ts | 15 ++++++++++---- packages/web3-providers/src/rarible/index.ts | 20 +++++++++++++++---- packages/web3-providers/src/types.ts | 11 ++++++++-- 7 files changed, 66 insertions(+), 21 deletions(-) diff --git a/packages/mask/src/plugins/EVM/services/Asset/index.ts b/packages/mask/src/plugins/EVM/services/Asset/index.ts index 04c0316b3a76..272066f1ba89 100644 --- a/packages/mask/src/plugins/EVM/services/Asset/index.ts +++ b/packages/mask/src/plugins/EVM/services/Asset/index.ts @@ -43,6 +43,11 @@ export interface CollectionOption { size: number } +const defaultPageableData = { + data: [], + hasNextPage: false, +} + export async function getAsset(options: AssetOption) { switch (options.provider) { case NonFungibleAssetProvider.OPENSEA: @@ -108,9 +113,9 @@ export async function getCollections(options: CollectionOption) { case NonFungibleAssetProvider.OPENSEA: return OpenSea.getCollections(address, { chainId, page, size }) case NonFungibleAssetProvider.RARIBLE: - return [] + return defaultPageableData case NonFungibleAssetProvider.NFTSCAN: - return [] + return defaultPageableData default: unreachable(provider) } diff --git a/packages/mask/src/plugins/EVM/services/NFT/index.ts b/packages/mask/src/plugins/EVM/services/NFT/index.ts index 29502742b4f9..2a06abde91ed 100644 --- a/packages/mask/src/plugins/EVM/services/NFT/index.ts +++ b/packages/mask/src/plugins/EVM/services/NFT/index.ts @@ -27,6 +27,7 @@ export interface NFTsByPaginationOption { provider: NonFungibleAssetProvider page: number size: number + pageInfo?: { [key in string]: unknown } } export async function getNFT(options: NFTOption) { diff --git a/packages/mask/src/plugins/Wallet/services/assets.ts b/packages/mask/src/plugins/Wallet/services/assets.ts index 9355ecc69789..2efdb815ab87 100644 --- a/packages/mask/src/plugins/Wallet/services/assets.ts +++ b/packages/mask/src/plugins/Wallet/services/assets.ts @@ -43,7 +43,7 @@ export async function getCollectionsNFT( size?: number, ): Promise<{ collections: ERC721TokenCollectionInfo[]; hasNextPage: boolean }> { if (provider === NonFungibleAssetProvider.OPENSEA) { - const collections = await EVM_RPC.getCollections({ + const { data, hasNextPage } = await EVM_RPC.getCollections({ address, chainId, provider, @@ -52,8 +52,8 @@ export async function getCollectionsNFT( }) return { - collections, - hasNextPage: collections.length === size, + collections: data, + hasNextPage, } } @@ -70,22 +70,25 @@ export async function getAssetsListNFT( page?: number, size?: number, collection?: string, + continuation?: string, ): Promise<{ assets: ERC721TokenDetailed[]; hasNextPage: boolean }> { if (!EthereumAddress.isValid(address)) return { assets: [], hasNextPage: false, } - const tokens = await EVM_RPC.getNFTsByPagination({ + const pageInfo = continuation ? { continuation } : undefined + const { data, hasNextPage } = await EVM_RPC.getNFTsByPagination({ from: address, chainId, provider, page: page ?? 0, size: size ?? 50, + pageInfo, }) return { - assets: tokens, - hasNextPage: tokens.length === size, + assets: data, + hasNextPage: hasNextPage, } } diff --git a/packages/web3-providers/src/NFTScan/index.ts b/packages/web3-providers/src/NFTScan/index.ts index 04a1bd175994..61bc6df20b38 100644 --- a/packages/web3-providers/src/NFTScan/index.ts +++ b/packages/web3-providers/src/NFTScan/index.ts @@ -96,11 +96,21 @@ export class NFTScanAPI implements NonFungibleTokenAPI.Provider { total: number }>('getAllNftByUserAddress', { page_size: size, - page_index: page, + // page is start from 1 in NFTScan + page_index: page + 1, use_address: from, erc: 'erc721', }) - if (!response) return [] - return response.data.content.map(createERC721TokenAsset) + if (!response) + return { + data: [], + hasNextPage: false, + } + const data = response.data.content.map(createERC721TokenAsset) + const total = response.data.total + return { + data, + hasNextPage: total - (page + 1) * size > 0, + } } } diff --git a/packages/web3-providers/src/opensea/index.ts b/packages/web3-providers/src/opensea/index.ts index 68af985ecfe7..ce5b2e492742 100644 --- a/packages/web3-providers/src/opensea/index.ts +++ b/packages/web3-providers/src/opensea/index.ts @@ -260,7 +260,7 @@ export class OpenSeaAPI implements NonFungibleTokenAPI.Provider { limit: size, }) const response = await fetchFromOpenSea<{ assets: OpenSeaResponse[] }>(requestPath, chainId) - return ( + const assets = response?.assets .filter( (x: OpenSeaResponse) => @@ -268,7 +268,10 @@ export class OpenSeaAPI implements NonFungibleTokenAPI.Provider { ['ERC721', 'ERC1155'].includes(x.asset_contract.schema_name), ) .map((asset: OpenSeaResponse) => createERC721TokenFromAsset(from, asset.token_id, chainId, asset)) ?? [] - ) + return { + data: assets, + hasNextPage: assets.length === size, + } } async getHistory( @@ -316,12 +319,16 @@ export class OpenSeaAPI implements NonFungibleTokenAPI.Provider { const response = await fetchFromOpenSea<{ collections: OpenSeaCollection[] }>(requestPath, chainId) - return ( + const collections = response?.collections.map((x) => ({ name: x.name, image: x.image_url || undefined, slug: x.slug, })) ?? [] - ) + + return { + data: collections, + hasNextPage: collections.length === size, + } } } diff --git a/packages/web3-providers/src/rarible/index.ts b/packages/web3-providers/src/rarible/index.ts index 7704f76847d3..4bb49ef7e416 100644 --- a/packages/web3-providers/src/rarible/index.ts +++ b/packages/web3-providers/src/rarible/index.ts @@ -153,16 +153,28 @@ export class RaribleAPI implements NonFungibleTokenAPI.Provider { return createERC721TokenFromAsset(tokenAddress, tokenId, asset) } - async getTokens(from: string, opts: NonFungibleTokenAPI.Options): Promise { - const requestPath = urlcat('/ethereum/nft/items/byOwner', { owner: from, size: opts.size }) + async getTokens(from: string, opts: NonFungibleTokenAPI.Options) { + const requestPath = urlcat('/ethereum/nft/items/byOwner', { owner: from, size: opts.size, ...opts.pageInfo }) interface Payload { total: number continuation: string items: RaribleNFTItemMapResponse[] } const asset = await fetchFromRarible(RaribleMainnetAPI_URL, requestPath) - if (!asset) return [] - return asset.items.map((asset) => createERC721TokenFromAsset(asset.contract, asset.tokenId, asset)) + if (!asset) + return { + data: [], + hasNextPage: false, + } + + const data = asset.items.map((asset) => createERC721TokenFromAsset(asset.contract, asset.tokenId, asset)) + return { + data, + hasNextPage: !!asset.continuation, + nextPageInfo: { + continuation: asset.continuation, + }, + } } async getOffers( diff --git a/packages/web3-providers/src/types.ts b/packages/web3-providers/src/types.ts index 9d61ba87748a..41ac47990655 100644 --- a/packages/web3-providers/src/types.ts +++ b/packages/web3-providers/src/types.ts @@ -177,6 +177,13 @@ export namespace NonFungibleTokenAPI { chainId?: ChainId page?: number size?: number + pageInfo?: { [key in string]: unknown } + } + + interface ProviderPageable { + data: T[] + hasNextPage: boolean + nextPageInfo?: { [key in string]: unknown } } export interface Provider { @@ -184,7 +191,7 @@ export namespace NonFungibleTokenAPI { getContractBalance?: (address: string) => Promise getAsset?: (address: string, tokenId: string, opts?: { chainId?: ChainId }) => Promise getToken?: (address: string, tokenId: string, chainId: ChainId) => Promise - getTokens?: (from: string, opts: Options) => Promise + getTokens?: (from: string, opts: Options) => Promise> getHistory?: (address: string, tokenId: string, opts?: Options) => Promise getListings?: (address: string, tokenId: string, opts?: Options) => Promise getOffers?: (address: string, tokenId: string, opts?: Options) => Promise @@ -194,6 +201,6 @@ export namespace NonFungibleTokenAPI { side: NonFungibleTokenAPI.OrderSide, opts?: Options, ) => Promise - getCollections?: (address: string, opts?: Options) => Promise + getCollections?: (address: string, opts?: Options) => Promise> } }