Skip to content

Commit

Permalink
feat: add alchemy nft api (#6421)
Browse files Browse the repository at this point in the history
* feat: add alchemy nft assets api

* feat: add alchemy solana and flow api

* fix: typo

* refactor: code style

* feat: add getAsset api

* fix: build error

* fix: add alchemy api into resolver source name list

* fix: build error

* fix: build error

* fix: build error

* fix: build error

* fix: api_key spell error

* feat: delete pageKey in options

* fix: getNonFungibleAssets type error

Co-authored-by: Randolph <840094513@qq.com>
Co-authored-by: guanbinrui <guanbinrui@dimension.im>
  • Loading branch information
3 people authored Jun 11, 2022
1 parent 688bf3d commit 614bac0
Show file tree
Hide file tree
Showing 20 changed files with 562 additions and 39 deletions.
1 change: 1 addition & 0 deletions cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@
"multicall",
"multihop",
"newsfeed",
"nftapi",
"nftavatar",
"nftrss",
"nftscan",
Expand Down
1 change: 1 addition & 0 deletions packages/plugins/EVM/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"@masknet/plugin-infra": "workspace:*",
"@masknet/shared": "workspace:*",
"@masknet/shared-base": "workspace:*",
"@masknet/web3-shared-flow":"workspace:*",
"@masknet/theme": "workspace:*",
"@masknet/web3-constants": "workspace:*",
"@masknet/web3-contracts": "workspace:*",
Expand Down
39 changes: 30 additions & 9 deletions packages/plugins/EVM/src/state/Hub/hub.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import {
Alchemy_EVM,
CoinGecko,
DeBank,
EthereumWeb3,
MetaSwap,
NFTScan,
OpenSea,
NFTScan,
Rarible,
TokenList,
Zerion,
Expand Down Expand Up @@ -34,8 +35,8 @@ import {
getTokenAssetBaseURLConstants,
getTokenConstants,
getTokenListConstants,
isNativeTokenAddress,
SchemaType,
isNativeTokenAddress,
} from '@masknet/web3-shared-evm'
import SPECIAL_ICON_LIST from './TokenIconSpecialIconList.json'
import type { EVM_Hub } from './types'
Expand Down Expand Up @@ -103,6 +104,8 @@ class Hub implements EVM_Hub {
): Promise<NonFungibleAsset<ChainId, SchemaType> | undefined> {
const provider = options?.sourceType
switch (provider) {
case SourceType.Alchemy_EVM:
return Alchemy_EVM.getAsset(address, tokenId, options)
case SourceType.OpenSea:
return OpenSea.getAsset(address, tokenId)
case SourceType.Rarible:
Expand All @@ -116,18 +119,17 @@ class Hub implements EVM_Hub {
getNonFungibleAssets(
account: string,
options?: HubOptions<ChainId> | undefined,
): Promise<Pageable<NonFungibleAsset<ChainId, SchemaType>>> {
try {
return OpenSea.getTokens(account, { chainId: this.chainId, ...options })
} catch {
return NFTScan.getTokens(account, { chainId: this.chainId, ...options })
): Promise<Pageable<NonFungibleAsset<ChainId, SchemaType>, string | number>> {
if (options?.sourceType === SourceType.Alchemy_EVM) {
return Alchemy_EVM.getTokens(account, options as HubOptions<ChainId, string>)
}
return OpenSea.getTokens(account, options as HubOptions<ChainId, number>)
}
getNonFungibleCollections(
account: string,
options?: HubOptions<ChainId> | undefined,
): Promise<Pageable<NonFungibleTokenCollection<ChainId>>> {
return OpenSea.getCollections(account, options)
return OpenSea.getCollections(account, options as HubOptions<ChainId, number>)
}
getFungibleTokenPrice(
chainId: ChainId,
Expand Down Expand Up @@ -201,7 +203,26 @@ class Hub implements EVM_Hub {
}
}

async *getAllNonFungibleAssets(address: string): AsyncIterableIterator<NonFungibleAsset<ChainId, SchemaType>> {
async *getAllNonFungibleAssets(
address: string,
options?: HubOptions<ChainId> | undefined,
): AsyncIterableIterator<NonFungibleAsset<ChainId, SchemaType>> {
if (options?.sourceType === SourceType.Alchemy_EVM) {
let api_keys = ''
while (1) {
const pageable = await this.getNonFungibleAssets(address, {
indicator: api_keys,
chainId: options?.chainId,
sourceType: options?.sourceType,
})
api_keys = (pageable.nextIndicator as string) ?? ''

yield* pageable.data

if (pageable.data.length === 0 || !api_keys) return
}
return
}
for (let i = 0; i < this.maxPageSize; i += 1) {
const pageable = await this.getNonFungibleAssets(address, {
indicator: i,
Expand Down
7 changes: 5 additions & 2 deletions packages/plugins/Flow/src/state/Hub/hub.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Alchemy_FLOW } from '@masknet/web3-providers'
import type {
FungibleToken,
NonFungibleToken,
Expand Down Expand Up @@ -87,14 +88,16 @@ class Hub implements FlowHub {
address: string,
tokenId: string,
options?: HubOptions<ChainId> | undefined,
ownerAddress?: string,
contractName?: string,
): Promise<NonFungibleAsset<ChainId, SchemaType> | undefined> {
throw new Error('Method not implemented.')
return Alchemy_FLOW.getAsset(address, tokenId, options, ownerAddress, contractName)
}
getNonFungibleAssets(
account: string,
options?: HubOptions<ChainId> | undefined,
): Promise<Pageable<NonFungibleAsset<ChainId, SchemaType>>> {
throw new Error('Method not implemented.')
return Alchemy_FLOW.getTokens(account, options)
}
getFungibleTokenPrice(
chainId: ChainId,
Expand Down
2 changes: 1 addition & 1 deletion packages/plugins/Solana/src/state/Hub/hub.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ class Hub implements SolanaHub {
}
getNonFungibleCollections(
account: string,
options?: HubOptions<ChainId> | undefined,
options?: HubOptions<ChainId, number> | undefined,
): Promise<Pageable<NonFungibleTokenCollection<ChainId>>> {
return MagicEden.getCollections(account, options)
}
Expand Down
1 change: 1 addition & 0 deletions packages/web3-providers/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
"@masknet/web3-contracts": "workspace:*",
"@masknet/web3-shared-base": "workspace:*",
"@masknet/web3-shared-evm": "workspace:*",
"@masknet/web3-shared-flow":"workspace:*",
"@masknet/web3-shared-solana": "workspace:*",
"@types/socket.io-client": "^1.4.36",
"bignumber.js": "9.0.2",
Expand Down
8 changes: 4 additions & 4 deletions packages/web3-providers/src/MagicEden/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ function createNFTCollection(collection: Collection): NonFungibleTokenContract<C
}
}

export class MagicEdenAPI implements NonFungibleTokenAPI.Provider<ChainId, SchemaType> {
export class MagicEdenAPI implements NonFungibleTokenAPI.Provider<ChainId, SchemaType, number> {
async getToken(address: string, tokenMint: string) {
const token = await fetchFromMagicEden<MagicEdenToken>(
urlcat('/v2/tokens/:mint_address', { mint_address: tokenMint }),
Expand Down Expand Up @@ -217,7 +217,7 @@ export class MagicEdenAPI implements NonFungibleTokenAPI.Provider<ChainId, Schem
}
}

async getHistory(address: string, tokenId: string, { indicator = 1, size = 50 }: HubOptions<ChainId> = {}) {
async getEvents(address: string, tokenId: string, { indicator = 1, size = 50 }: HubOptions<ChainId, number> = {}) {
const activities = await fetchFromMagicEden<TokenActivity[]>(
urlcat('/v2/tokens/:mint_address/activities', {
mint_address: tokenId,
Expand Down Expand Up @@ -251,7 +251,7 @@ export class MagicEdenAPI implements NonFungibleTokenAPI.Provider<ChainId, Schem
{ indicator = 1, size }: HubOptions<ChainId> = {},
) {
const limit = size || 20
const offset = indicator ? (Math.max(1, indicator) - 1) * limit : 0
const offset = indicator ? (Math.max(1, indicator as number) - 1) * limit : 0
const offers = await fetchFromMagicEden<WalletOffer[]>(
urlcat('/tokens/:mint_address/offer_received', {
mint_address: mintAddress,
Expand All @@ -271,7 +271,7 @@ export class MagicEdenAPI implements NonFungibleTokenAPI.Provider<ChainId, Schem
})
}

async getCollections(symbol: string, { indicator = 1, size }: HubOptions<ChainId> = {}) {
async getCollections(symbol: string, { indicator = 1, size }: HubOptions<ChainId, number> = {}) {
indicator = Math.max(indicator || 1, 1)
const limit = size || 20
const offset = (Math.max(1, indicator) - 1) * limit
Expand Down
16 changes: 13 additions & 3 deletions packages/web3-providers/src/NFTScan/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
import urlcat from 'urlcat'
import { createPageable, CurrencyType, HubOptions, TokenType } from '@masknet/web3-shared-base'
import {
createPageable,
CurrencyType,
HubOptions,
NonFungibleToken,
Pageable,
TokenType,
} from '@masknet/web3-shared-base'
import { ChainId, SchemaType } from '@masknet/web3-shared-evm'
import addSeconds from 'date-fns/addSeconds'
import isBefore from 'date-fns/isBefore'
Expand Down Expand Up @@ -105,7 +112,7 @@ function createERC721TokenAsset(asset: NFTScanAsset) {
}
}

export class NFTScanAPI implements NonFungibleTokenAPI.Provider<ChainId, SchemaType> {
export class NFTScanAPI implements NonFungibleTokenAPI.Provider<ChainId, SchemaType, number> {
async getToken(address: string, tokenId: string) {
const response = await fetchAsset<NFTScanAsset>('getSingleNft', {
nft_address: address,
Expand All @@ -115,7 +122,10 @@ export class NFTScanAPI implements NonFungibleTokenAPI.Provider<ChainId, SchemaT
return createERC721TokenAsset(response.data)
}

async getTokens(from: string, { chainId = ChainId.Mainnet, indicator = 0, size = 50 }: HubOptions<ChainId> = {}) {
async getTokens(
from: string,
{ chainId = ChainId.Mainnet, indicator = 0, size = 50 }: HubOptions<ChainId, number> = {},
): Promise<Pageable<NonFungibleToken<ChainId, SchemaType>, number>> {
const response = await fetchAsset<{
content: NFTScanAsset[]
page_index: number
Expand Down
34 changes: 34 additions & 0 deletions packages/web3-providers/src/alchemy/constants.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { NetworkPluginID } from '@masknet/web3-shared-base'
import { ChainId as ChainId_EVM } from '@masknet/web3-shared-evm'
import { ChainId as ChainId_FLOW } from '@masknet/web3-shared-flow'
export const Alchemy_EVM_NetworkMap = {
network: NetworkPluginID.PLUGIN_EVM,
chains: [
{
chainId: ChainId_EVM.Mainnet,
// cspell:disable-next-line
API_KEY: '3TJz6QYDHCj0ZhCdGvc5IC6EtMMMTKG1',
baseURL: 'https://eth-mainnet.alchemyapi.io/v2/',
},
{
chainId: ChainId_EVM.Matic,
// cspell:disable-next-line
API_KEY: 'PsJ3gMn6JrSE9FCzShjsjD91irkybmh_',
baseURL: 'https://polygon-mainnet.g.alchemy.com/v2/',
},
],
}

export const Alchemy_FLOW_NetworkMap = {
network: NetworkPluginID.PLUGIN_FLOW,
chains: [
{
chainId: ChainId_FLOW.Mainnet,
// cspell:disable-next-line
API_KEY: '5359fbk38tw2ggpgxutjjw5qf4jiocpw',
baseURL: 'https://flow-mainnet.g.alchemy.com/v2/',
},
],
}

export const FILTER_WORDS = ['description', 'id', 'title', 'number', 'img', 'uri']
Loading

0 comments on commit 614bac0

Please sign in to comment.