Skip to content

Commit

Permalink
feat: fetchAssets
Browse files Browse the repository at this point in the history
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
jackmellis committed Nov 26, 2023
1 parent 167f578 commit f6f775a
Show file tree
Hide file tree
Showing 6 changed files with 113 additions and 1 deletion.
16 changes: 16 additions & 0 deletions packages/core/src/assets/fetchAssets/cursor.ts
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('__');
}
};
31 changes: 31 additions & 0 deletions packages/core/src/assets/fetchAssets/fetchAssets.ts
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 packages/core/src/assets/fetchAssets/fetchAssetsFromReservoir.ts
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;
1 change: 1 addition & 0 deletions packages/core/src/assets/fetchAssets/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from './fetchAssets';
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { createCursor, parseCursor } from './cursor';
type QueryReservoir = typeof queryReservoir;
type GetEligibleAssetVaultIds = typeof getEligibleAssetVaultIds;

type ReservoirResponse = {
export type ReservoirResponse = {
tokens: Array<{
token: {
contract: Address;
Expand Down
1 change: 1 addition & 0 deletions packages/core/src/assets/index.ts
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';

0 comments on commit f6f775a

Please sign in to comment.