diff --git a/src/backends/opensea/OpenseaDataSource.ts b/src/backends/opensea/OpenseaDataSource.ts index 835d122..690bc83 100644 --- a/src/backends/opensea/OpenseaDataSource.ts +++ b/src/backends/opensea/OpenseaDataSource.ts @@ -36,7 +36,7 @@ export class OpenseaDataSource implements OpenseaInterface { } transformNFT(asset: OpenseaAsset, object: NFTObject) { object.nft = { - tokenId: asset.id.toString(), + tokenId: asset.token_id.toString(), contract: { address: asset.asset_contract.address, name: asset.asset_contract.name, @@ -47,7 +47,7 @@ export class OpenseaDataSource implements OpenseaInterface { metadataURI: asset.token_metadata, contentURI: asset.animation_original_url || asset.image_original_url, minted: { - minter: asset.creator.address, + minter: asset.creator?.address, }, }; object.metadata = { diff --git a/src/backends/zora-graph/GraphAuctionDataSource.ts b/src/backends/zora-graph/GraphAuctionDataSource.ts index 9f5b918..f645714 100644 --- a/src/backends/zora-graph/GraphAuctionDataSource.ts +++ b/src/backends/zora-graph/GraphAuctionDataSource.ts @@ -30,7 +30,6 @@ function priceToPretty(number: string, decimals?: number | null) { .toString(); } - export class GraphAuctionDataSource implements GraphAuctionInterface { // auctionInfoLoader fetches auction info for non-zora NFTs auctionInfoLoader: DataLoader; @@ -67,9 +66,6 @@ export class GraphAuctionDataSource implements GraphAuctionInterface { const currentObject: NFTObject = { rawData: {}, markets: [] }; const getStatus = () => { - if (!response.approved) { - return 'pending'; - } if ( response.finalizedAtTimestamp && (!response.previousBids || response.previousBids?.length === 0) && @@ -77,12 +73,20 @@ export class GraphAuctionDataSource implements GraphAuctionInterface { ) { return 'cancelled'; } + if ( + !response.approved || + (response.approved && + (!response.previousBids || response.previousBids?.length === 0) && + !response.currentBid) + ) { + return 'pending'; + } if (response.finalizedAtTimestamp) { return 'complete'; } if ( response.expectedEndTimestamp && - response.expectedEndTimestamp >= unixTimeNow() + response.expectedEndTimestamp <= unixTimeNow() ) { return 'complete'; } @@ -119,6 +123,12 @@ export class GraphAuctionDataSource implements GraphAuctionInterface { return addCurrencyInfo(response.currentBid.amount); } + // final bid + if (response.previousBids && response.previousBids.length) { + const finalBid = response.previousBids.find((bid) => bid.bidType === 'Final'); + return formatBid(finalBid).amount; + } + return addCurrencyInfo(response.reservePrice); }; @@ -139,7 +149,9 @@ export class GraphAuctionDataSource implements GraphAuctionInterface { return formatBid(response.currentBid); } if (response.previousBids && response.previousBids.length) { - const topBid = response.previousBids[response.previousBids.length - 1]; + const topBid = [...response.previousBids].sort( + (a, b) => parseInt(b.amount) - parseInt(a.amount) + )[0]; return formatBid(topBid); } return undefined; diff --git a/src/backends/zora-indexer-v1/ZoraIndexerV1DataSource.ts b/src/backends/zora-indexer-v1/ZoraIndexerV1DataSource.ts index 17a20ad..4e7d5f2 100644 --- a/src/backends/zora-indexer-v1/ZoraIndexerV1DataSource.ts +++ b/src/backends/zora-indexer-v1/ZoraIndexerV1DataSource.ts @@ -235,12 +235,12 @@ function extractAskEvents(askEvents: V3EventPartFragment[]): TokenMarketEvent[] function extractAuction(auction: IndexerAuctionPartFragment) { const getStatus = () => { - if (!auction.approved) { - return 'pending'; - } if (auction.canceledEvent) { return 'cancelled'; } + if (!auction.approved || (auction.approved && !auction.firstBidTime)) { + return 'pending'; + } if (auction.endedEvent) { return 'complete'; } @@ -322,7 +322,7 @@ function extractAuction(auction: IndexerAuctionPartFragment) { transactionHash: auction.endedEvent?.transactionHash ?? null, }, winner: highestBid?.sender, - duration: dateToUnix(auction.duration!)!, + duration: auction.duration ? parseInt(auction.duration) : 0, currentBid: highestBid ? formatBid(highestBid) : undefined, source: 'ZoraReserveV0', bids: [...auction.bidEvents.map((bid) => formatBid(bid))], @@ -330,7 +330,9 @@ function extractAuction(auction: IndexerAuctionPartFragment) { return resultAuction; } -function getTransferType(transferEvent: TokenTransferEventInfoFragment): TokenTransferEventType { +function getTransferType( + transferEvent: TokenTransferEventInfoFragment +): TokenTransferEventType { if (transferEvent.from === ZERO_ADDRESS) { return 'mint'; } @@ -340,7 +342,9 @@ function getTransferType(transferEvent: TokenTransferEventInfoFragment): TokenTr return 'transfer'; } -function extractTransferEvents(transferEvents: TokenTransferEventInfoFragment[]): TokenTransferEvent[] { +function extractTransferEvents( + transferEvents: TokenTransferEventInfoFragment[] +): TokenTransferEvent[] { return transferEvents.map((transferEvent) => ({ eventType: EventType.TokenTransferEvent, from: transferEvent.from, @@ -350,7 +354,7 @@ function extractTransferEvents(transferEvents: TokenTransferEventInfoFragment[]) blockNumber: transferEvent.blockNumber, transactionHash: transferEvent.transactionHash, }, - type: getTransferType(transferEvent) + type: getTransferType(transferEvent), })); } @@ -422,11 +426,14 @@ export class ZoraIndexerV1DataSource implements ZoraIndexerV1Interface { object.rawData = {}; } object.markets = extractMarketData(asset, object); - object.events = [] + object.events = []; // extract auction events? if ('v3Events' in asset) { const assetFull: IndexerTokenWithAuctionDetailFragment = asset; - object.events = [...extractAskEvents(assetFull.v3Events), ...extractTransferEvents(assetFull.transferEvents)]; + object.events = [ + ...extractAskEvents(assetFull.v3Events), + ...extractTransferEvents(assetFull.transferEvents), + ]; } if (!object.rawData) { object.rawData = {};