-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
added a new method, "fetchAssets" which allows you to pass a series of asset/tokenIds and return an array of assets - including metadata - from reservoir.
- Loading branch information
1 parent
167f578
commit f6f775a
Showing
6 changed files
with
113 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
const PREFIX_KEY = 'ncafa'; | ||
|
||
export const parseCursor = (cursor: string | undefined) => { | ||
if (cursor) { | ||
const [prefix, continuation] = cursor.split('__'); | ||
if (prefix === PREFIX_KEY && continuation) { | ||
return continuation; | ||
} | ||
} | ||
}; | ||
|
||
export const createCursor = (continuation: string | undefined) => { | ||
if (continuation) { | ||
return [PREFIX_KEY, continuation].join('__'); | ||
} | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
import config from '@nftx/config'; | ||
import { Address, Asset, Provider, TokenId, Vault } from '@nftx/types'; | ||
import fetchAssetsFromReservoir from './fetchAssetsFromReservoir'; | ||
|
||
const fetchAssets = async ({ | ||
network = config.network, | ||
cursor, | ||
provider, | ||
vaults, | ||
assets, | ||
}: { | ||
network?: number; | ||
cursor?: string; | ||
provider: Provider; | ||
vaults: Pick<Vault, 'asset' | 'features' | 'eligibilityModule' | 'vaultId'>[]; | ||
assets: Array<{ assetAddress: Address; tokenIds: TokenId[] }>; | ||
}): Promise<{ assets: Asset[]; cursor?: string }> => { | ||
if (!assets.length) { | ||
return { assets: [] }; | ||
} | ||
|
||
return fetchAssetsFromReservoir({ | ||
assets, | ||
cursor, | ||
network, | ||
provider, | ||
vaults, | ||
}); | ||
}; | ||
|
||
export default fetchAssets; |
63 changes: 63 additions & 0 deletions
63
packages/core/src/assets/fetchAssets/fetchAssetsFromReservoir.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
import { Address, Asset, Provider, TokenId, Vault } from '@nftx/types'; | ||
import { createCursor, parseCursor } from './cursor'; | ||
import { queryReservoir } from '@nftx/utils'; | ||
import { ReservoirResponse } from '../fetchUserAssets/fetchAssetsFromReservoir'; | ||
import getEligibleAssetVaultIds from '../fetchUserAssets/getEligibleAssetVaultIds'; | ||
import reservoirTokenToAsset from '../fetchUserAssets/reservoirTokenToAsset'; | ||
|
||
const fetchAssetsFromReservoir = async ({ | ||
network, | ||
cursor, | ||
assets: _assets, | ||
vaults, | ||
provider, | ||
}: { | ||
network: number; | ||
cursor: string | undefined; | ||
assets: Array<{ assetAddress: Address; tokenIds: TokenId[] }>; | ||
vaults: Pick<Vault, 'asset' | 'vaultId' | 'eligibilityModule' | 'features'>[]; | ||
provider: Provider; | ||
}) => { | ||
const assets: Asset[] = []; | ||
|
||
const continuation = parseCursor(cursor); | ||
const start = Number(continuation || '0'); | ||
|
||
const allTokens = _assets.flatMap(({ assetAddress, tokenIds }) => | ||
tokenIds.map((tokenId) => `${assetAddress}:${tokenId}`) | ||
); | ||
const offsetTokens = allTokens.slice(start); | ||
const tokens = offsetTokens.slice(0, 50); | ||
const newContinuation = | ||
offsetTokens.length === tokens.length ? undefined : String(start + 50); | ||
const newCursor = createCursor(newContinuation); | ||
|
||
const data = await queryReservoir<ReservoirResponse>({ | ||
network, | ||
path: `/tokens/v6`, | ||
query: { | ||
tokens, | ||
limit: 100, | ||
includeAttributes: true, | ||
}, | ||
}); | ||
|
||
await Promise.all( | ||
data.tokens.map(async ({ token }) => { | ||
const vaultIds = await getEligibleAssetVaultIds({ | ||
vaults, | ||
asset: { | ||
assetAddress: token.contract, | ||
tokenId: token.tokenId, | ||
}, | ||
provider, | ||
}); | ||
const asset = reservoirTokenToAsset({ token, vaultIds }); | ||
assets.push(asset); | ||
}) | ||
); | ||
|
||
return { assets, cursor: newCursor }; | ||
}; | ||
|
||
export default fetchAssetsFromReservoir; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
export { default } from './fetchAssets'; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
export { default as fetchUserAssets } from './fetchUserAssets'; | ||
export { default as fetchUserHoldings } from './fetchUserHoldings'; | ||
export { default as isAssetEligibleForVault } from './isAssetEligibleForVault'; | ||
export { default as fetchAssets } from './fetchAssets'; |