From b7c7f4cbafecbfebc8e64c38f8f5608f49745080 Mon Sep 17 00:00:00 2001 From: Ludovic Levalleux Date: Wed, 28 Aug 2024 17:30:59 +0100 Subject: [PATCH] feat: improve opensea wrapper --- packages/core-sdk/src/index.ts | 1 + packages/core-sdk/src/marketplaces/index.ts | 1 + packages/core-sdk/src/marketplaces/opensea.ts | 36 ++++++++++++++++--- packages/core-sdk/src/marketplaces/types.ts | 21 ++++++++++- 4 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 packages/core-sdk/src/marketplaces/index.ts diff --git a/packages/core-sdk/src/index.ts b/packages/core-sdk/src/index.ts index 0cb9dc2c8..53795b072 100644 --- a/packages/core-sdk/src/index.ts +++ b/packages/core-sdk/src/index.ts @@ -14,6 +14,7 @@ export * as groups from "./groups"; export * as forwarder from "./forwarder"; export * as voucher from "./voucher"; export * as seaport from "./seaport"; +export * as marketplaces from "./marketplaces"; export { envConfigs, diff --git a/packages/core-sdk/src/marketplaces/index.ts b/packages/core-sdk/src/marketplaces/index.ts new file mode 100644 index 000000000..eea524d65 --- /dev/null +++ b/packages/core-sdk/src/marketplaces/index.ts @@ -0,0 +1 @@ +export * from "./types"; diff --git a/packages/core-sdk/src/marketplaces/opensea.ts b/packages/core-sdk/src/marketplaces/opensea.ts index 4a58e9ff3..6897a9c1f 100644 --- a/packages/core-sdk/src/marketplaces/opensea.ts +++ b/packages/core-sdk/src/marketplaces/opensea.ts @@ -4,7 +4,6 @@ import { FulfillmentDataResponse, GetNFTResponse, OrderAPIOptions, - OrderSide, OrderV2, OrdersQueryOptions, ProtocolData @@ -18,6 +17,8 @@ import { Marketplace, MarketplaceType, Order, + OrderFilterOptions, + OrderSide, SignedOrder, Wrapper } from "./types"; @@ -68,6 +69,9 @@ export type OpenSeaSDKHandler = { api: { apiBaseUrl: string; getOrder(order: Omit): Promise; + getOrders( + order: Omit + ): Promise<{ orders: OrderV2[] }>; generateFulfillmentData( fulfillerAddress: string, orderHash: string, @@ -270,13 +274,15 @@ export class OpenSeaMarketplace extends Marketplace { contract: string; tokenId: string; }, + filter: OrderFilterOptions = {}, withWrapper = false ): Promise { - // Asumption: we're fulfilling a Bid Order (don't know if it makes sense with an Ask order) + // Assumption: we're fulfilling a Bid Order (don't know if it makes sense with an Ask order) const osOrder = await this._handler.api.getOrder({ assetContractAddress: asset.contract, tokenId: asset.tokenId, - side: OrderSide.BID + side: OrderSide.BID, + ...filter }); const fulfillerAddress = withWrapper ? asset.contract // If the token is wrapped, the fulfiller is the wrapper contract itself @@ -589,12 +595,14 @@ export class OpenSeaMarketplace extends Marketplace { contract: string; tokenId: string; }, + filter: OrderFilterOptions = {}, side: Side ): Promise { const osOrder = await this._handler.api.getOrder({ assetContractAddress: asset.contract, tokenId: asset.tokenId, - side: side === Side.Ask ? OrderSide.ASK : OrderSide.BID + side: side === Side.Ask ? OrderSide.ASK : OrderSide.BID, + ...filter }); return osOrder ? { @@ -603,4 +611,24 @@ export class OpenSeaMarketplace extends Marketplace { } : undefined; } + + public async getOrders( + asset: { + contract: string; + tokenIds: string[]; + }, + filter: OrderFilterOptions = {}, + side: Side + ): Promise { + const { orders } = await this._handler.api.getOrders({ + assetContractAddress: asset.contract, + tokenIds: asset.tokenIds, + side: side === Side.Ask ? OrderSide.ASK : OrderSide.BID, + ...filter + }); + return orders.map((osOrder) => ({ + ...this.convertOsOrder(osOrder), + signature: osOrder.protocolData?.signature + })); + } } diff --git a/packages/core-sdk/src/marketplaces/types.ts b/packages/core-sdk/src/marketplaces/types.ts index 0972559a2..2f8ef29fd 100644 --- a/packages/core-sdk/src/marketplaces/types.ts +++ b/packages/core-sdk/src/marketplaces/types.ts @@ -16,7 +16,10 @@ export enum MarketplaceType { OPENSEA } -export enum OrderSide {} +export enum OrderSide { + ASK = "ask", + BID = "bid" +} export type MarketplaceHandler = OpenSeaSDKHandler | DefaultHandler; @@ -64,6 +67,12 @@ export abstract class Wrapper { public abstract get address(): string; } +export type OrderFilterOptions = { + maker?: string; + listedAfter?: number | string; + listedBefore?: number | string; +}; + export abstract class Marketplace { constructor(protected _type: MarketplaceType) {} public abstract createListing(listing: Listing): Promise; @@ -73,8 +82,17 @@ export abstract class Marketplace { contract: string; tokenId: string; }, + filter: OrderFilterOptions, side: Side ): Promise; + public abstract getOrders( + asset: { + contract: string; + tokenIds: string[]; + }, + filter: OrderFilterOptions, + side: Side + ): Promise; public abstract generateFulfilmentData( asset: { contract: string; @@ -87,6 +105,7 @@ export abstract class Marketplace { contract: string; tokenId: string; }, + filter: OrderFilterOptions, withWrapper?: boolean ): Promise; public abstract wrapVouchers(