UNPKG

@lyncworld/fuel-marketplace

Version:

Marketplace NPM SDK on Fuel blockchain. Powered by LYNC, it allows anyone to create their own decentralized marketplace which includes listing and buying of Non-fungible tokens (NFTs) and Semi-fungible tokens (SFTs) in a few lines of code.

103 lines (88 loc) 3.17 kB
import { AllowedProviders, Networks } from '@/enums'; import { checkArguments, getFormattedPrice } from '@/utils'; import { SubgraphClient } from '../subgraph'; import { ListingMetadata, MarketplaceListings, SubgraphListingData } from '@/interfaces'; import { NftMetadataClient } from './metadata-client'; import { NFTStandardOutput } from '@/contracts/marketplace'; const SEARCH_MARKETPLACE_QUERY = ` query SearchMarketplace($searchString: String!, $limit: Int = 100) { Listing( where: { status: { _eq: "ACTIVE" } _or: [ { nftAddress: { _ilike: $searchString } } { tokenId: { _ilike: $searchString } } { asset_id: { _ilike: $searchString } } { seller: { _ilike: $searchString } } ] } order_by: { db_write_timestamp: desc } limit: $limit ) { id status nftAddress nftType tokenId asset_id quantity pricePerItem seller } } `; export const searchMarketplace = async (network: Networks, searchString: string, limit: number = 100) => { checkArguments([network, searchString], 'arguments'); const subgraphClient = new SubgraphClient(network); const response = await subgraphClient .setQueryString(SEARCH_MARKETPLACE_QUERY) .setVariables({ searchString: `%${searchString}%`, limit, }) .query<SubgraphListingData[]>('Listing'); if (!response.success || !response.data) return response; const searchData = response.data; const meteDataClient = new NftMetadataClient(network); const metaDataClientWithProvider = await meteDataClient.useProvider(AllowedProviders.FuelProvider); const formattedData = searchData.map( (d) => ({ listingId: Number(d.id), isActive: d.status === 'ACTIVE', nftAddress: d.nftAddress, tokenStandard: d.nftType, tokenId: d.tokenId, assetId: d.asset_id, tokenQuantity: parseInt(d.quantity), pricePerItem: getFormattedPrice(d.pricePerItem), sellerAddress: d.seller, tokenName: '', tokenImage: '', tokenAssetMedia: '', }) as MarketplaceListings ); const fetchMetadata = (d: MarketplaceListings) => { return metaDataClientWithProvider .setContract(d.nftAddress, d.tokenStandard as NFTStandardOutput) .getMetadata<ListingMetadata>(d.assetId); }; const searchMetadataPromises = await Promise.allSettled<{ success: boolean; data?: ListingMetadata; error?: unknown; }>(formattedData.map(fetchMetadata)); const searchResultsWithMetadata = searchMetadataPromises.map((p, i) => { const result = formattedData[i]; if (p.status === 'fulfilled') { const metadata = p.value; if (metadata.success) { result.tokenName = metadata.data?.name ?? ''; result.tokenImage = metadata.data?.image ?? ''; result.tokenAssetMedia = metadata.data?.assetMedia ?? ''; } } return result; }); return { success: true, data: searchResultsWithMetadata }; };