@opensea/cli 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +77 -240
- package/dist/cli.js +110 -38
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +8 -8
- package/dist/index.js +49 -11
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/client.ts","../src/commands/accounts.ts","../src/output.ts","../src/commands/collections.ts","../src/commands/events.ts","../src/commands/listings.ts","../src/commands/nfts.ts","../src/commands/offers.ts","../src/commands/search.ts","../src/queries.ts","../src/commands/swaps.ts","../src/commands/tokens.ts"],"sourcesContent":["import { Command } from \"commander\"\nimport { OpenSeaAPIError, OpenSeaClient } from \"./client.js\"\nimport {\n accountsCommand,\n collectionsCommand,\n eventsCommand,\n listingsCommand,\n nftsCommand,\n offersCommand,\n searchCommand,\n swapsCommand,\n tokensCommand,\n} from \"./commands/index.js\"\n\nconst BANNER = `\n ____ _____\n / __ \\\\ / ____|\n | | | |_ __ ___ _ _| (___ ___ __ _\n | | | | '_ \\\\ / _ \\\\ '_ \\\\___ \\\\ / _ \\\\/ _\\` |\n | |__| | |_) | __/ | | |___) | __/ (_| |\n \\\\____/| .__/ \\\\___|_| |_|____/ \\\\___|\\\\__,_|\n | |\n |_|\n`\n\nconst program = new Command()\n\nprogram\n .name(\"opensea\")\n .description(\"OpenSea CLI - Query the OpenSea API from the command line\")\n .version(process.env.npm_package_version ?? \"0.0.0\")\n .addHelpText(\"before\", BANNER)\n .option(\"--api-key <key>\", \"OpenSea API key (or set OPENSEA_API_KEY env var)\")\n .option(\"--chain <chain>\", \"Default chain\", \"ethereum\")\n .option(\"--format <format>\", \"Output format (json or table)\", \"json\")\n .option(\"--base-url <url>\", \"API base URL\")\n\nfunction getClient(): OpenSeaClient {\n const opts = program.opts<{\n apiKey?: string\n chain: string\n baseUrl?: string\n }>()\n\n const apiKey = opts.apiKey ?? process.env.OPENSEA_API_KEY\n if (!apiKey) {\n console.error(\n \"Error: API key required. Use --api-key or set OPENSEA_API_KEY environment variable.\",\n )\n process.exit(2)\n }\n\n return new OpenSeaClient({\n apiKey,\n chain: opts.chain,\n baseUrl: opts.baseUrl,\n })\n}\n\nfunction getFormat(): \"json\" | \"table\" {\n const opts = program.opts<{ format: string }>()\n return opts.format === \"table\" ? \"table\" : \"json\"\n}\n\nprogram.addCommand(collectionsCommand(getClient, getFormat))\nprogram.addCommand(nftsCommand(getClient, getFormat))\nprogram.addCommand(listingsCommand(getClient, getFormat))\nprogram.addCommand(offersCommand(getClient, getFormat))\nprogram.addCommand(eventsCommand(getClient, getFormat))\nprogram.addCommand(accountsCommand(getClient, getFormat))\nprogram.addCommand(tokensCommand(getClient, getFormat))\nprogram.addCommand(searchCommand(getClient, getFormat))\nprogram.addCommand(swapsCommand(getClient, getFormat))\n\nasync function main() {\n try {\n await program.parseAsync(process.argv)\n } catch (error) {\n if (error instanceof OpenSeaAPIError) {\n console.error(\n JSON.stringify(\n {\n error: \"API Error\",\n status: error.statusCode,\n path: error.path,\n message: error.responseBody,\n },\n null,\n 2,\n ),\n )\n process.exit(1)\n }\n throw error\n }\n}\n\nmain()\n","import type { OpenSeaClientConfig } from \"./types/index.js\"\n\nconst DEFAULT_BASE_URL = \"https://api.opensea.io\"\nconst DEFAULT_GRAPHQL_URL = \"https://gql.opensea.io/graphql\"\n\nexport class OpenSeaClient {\n private apiKey: string\n private baseUrl: string\n private graphqlUrl: string\n private defaultChain: string\n\n constructor(config: OpenSeaClientConfig) {\n this.apiKey = config.apiKey\n this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL\n this.graphqlUrl = config.graphqlUrl ?? DEFAULT_GRAPHQL_URL\n this.defaultChain = config.chain ?? \"ethereum\"\n }\n\n async get<T>(path: string, params?: Record<string, unknown>): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, path)\n }\n\n return response.json() as Promise<T>\n }\n\n async post<T>(path: string): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, path)\n }\n\n return response.json() as Promise<T>\n }\n\n async graphql<T>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<T> {\n const response = await fetch(this.graphqlUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n body: JSON.stringify({ query, variables }),\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, \"graphql\")\n }\n\n const json = (await response.json()) as {\n data?: T\n errors?: { message: string }[]\n }\n\n if (json.errors?.length) {\n throw new OpenSeaAPIError(\n 400,\n json.errors.map(e => e.message).join(\"; \"),\n \"graphql\",\n )\n }\n\n if (!json.data) {\n throw new OpenSeaAPIError(500, \"GraphQL response missing data\", \"graphql\")\n }\n\n return json.data\n }\n\n getDefaultChain(): string {\n return this.defaultChain\n }\n}\n\nexport class OpenSeaAPIError extends Error {\n constructor(\n public statusCode: number,\n public responseBody: string,\n public path: string,\n ) {\n super(`OpenSea API error ${statusCode} on ${path}: ${responseBody}`)\n this.name = \"OpenSeaAPIError\"\n }\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { Account } from \"../types/index.js\"\n\nexport function accountsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"accounts\").description(\"Query accounts\")\n\n cmd\n .command(\"get\")\n .description(\"Get an account by address\")\n .argument(\"<address>\", \"Wallet address\")\n .action(async (address: string) => {\n const client = getClient()\n const result = await client.get<Account>(`/api/v2/accounts/${address}`)\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n","export function formatOutput(data: unknown, format: \"json\" | \"table\"): string {\n if (format === \"table\") {\n return formatTable(data)\n }\n return JSON.stringify(data, null, 2)\n}\n\nfunction formatTable(data: unknown): string {\n if (Array.isArray(data)) {\n if (data.length === 0) return \"(empty)\"\n const keys = Object.keys(data[0] as Record<string, unknown>)\n const widths = keys.map(key =>\n Math.max(\n key.length,\n ...data.map(row => {\n const val = (row as Record<string, unknown>)[key]\n return String(val ?? \"\").length\n }),\n ),\n )\n\n const header = keys.map((key, i) => key.padEnd(widths[i])).join(\" \")\n const separator = widths.map(w => \"-\".repeat(w)).join(\" \")\n const rows = data.map(row =>\n keys\n .map((key, i) => {\n const val = (row as Record<string, unknown>)[key]\n return String(val ?? \"\").padEnd(widths[i])\n })\n .join(\" \"),\n )\n\n return [header, separator, ...rows].join(\"\\n\")\n }\n\n if (data && typeof data === \"object\") {\n const entries = Object.entries(data as Record<string, unknown>)\n const maxKeyLength = Math.max(...entries.map(([k]) => k.length))\n return entries\n .map(([key, value]) => {\n const displayValue =\n typeof value === \"object\" && value !== null\n ? JSON.stringify(value)\n : String(value ?? \"\")\n return `${key.padEnd(maxKeyLength)} ${displayValue}`\n })\n .join(\"\\n\")\n }\n\n return String(data)\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type {\n Chain,\n Collection,\n CollectionOrderBy,\n CollectionStats,\n GetTraitsResponse,\n} from \"../types/index.js\"\n\nexport function collectionsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"collections\").description(\n \"Manage and query NFT collections\",\n )\n\n cmd\n .command(\"get\")\n .description(\"Get a single collection by slug\")\n .argument(\"<slug>\", \"Collection slug\")\n .action(async (slug: string) => {\n const client = getClient()\n const result = await client.get<Collection>(`/api/v2/collections/${slug}`)\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"list\")\n .description(\"List collections\")\n .option(\"--chain <chain>\", \"Filter by chain\")\n .option(\n \"--order-by <orderBy>\",\n \"Order by field (created_date, one_day_change, seven_day_volume, seven_day_change, num_owners, market_cap)\",\n )\n .option(\"--creator <username>\", \"Filter by creator username\")\n .option(\"--include-hidden\", \"Include hidden collections\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (options: {\n chain?: string\n orderBy?: string\n creator?: string\n includeHidden?: boolean\n limit: string\n next?: string\n }) => {\n const client = getClient()\n const result = await client.get<{\n collections: Collection[]\n next?: string\n }>(\"/api/v2/collections\", {\n chain: options.chain as Chain | undefined,\n order_by: options.orderBy as CollectionOrderBy | undefined,\n creator_username: options.creator,\n include_hidden: options.includeHidden,\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"stats\")\n .description(\"Get collection stats\")\n .argument(\"<slug>\", \"Collection slug\")\n .action(async (slug: string) => {\n const client = getClient()\n const result = await client.get<CollectionStats>(\n `/api/v2/collections/${slug}/stats`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"traits\")\n .description(\"Get collection traits\")\n .argument(\"<slug>\", \"Collection slug\")\n .action(async (slug: string) => {\n const client = getClient()\n const result = await client.get<GetTraitsResponse>(\n `/api/v2/traits/${slug}`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { AssetEvent } from \"../types/index.js\"\n\nexport function eventsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"events\").description(\"Query marketplace events\")\n\n cmd\n .command(\"list\")\n .description(\"List events\")\n .option(\n \"--event-type <type>\",\n \"Event type (sale, transfer, mint, listing, offer, trait_offer, collection_offer)\",\n )\n .option(\"--after <timestamp>\", \"Filter events after this Unix timestamp\")\n .option(\"--before <timestamp>\", \"Filter events before this Unix timestamp\")\n .option(\"--chain <chain>\", \"Filter by chain\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (options: {\n eventType?: string\n after?: string\n before?: string\n chain?: string\n limit: string\n next?: string\n }) => {\n const client = getClient()\n const result = await client.get<{\n asset_events: AssetEvent[]\n next?: string\n }>(\"/api/v2/events\", {\n event_type: options.eventType,\n after: options.after ? Number.parseInt(options.after, 10) : undefined,\n before: options.before\n ? Number.parseInt(options.before, 10)\n : undefined,\n chain: options.chain,\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"by-account\")\n .description(\"Get events for an account\")\n .argument(\"<address>\", \"Account address\")\n .option(\"--event-type <type>\", \"Event type\")\n .option(\"--chain <chain>\", \"Filter by chain\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n address: string,\n options: {\n eventType?: string\n chain?: string\n limit: string\n next?: string\n },\n ) => {\n const client = getClient()\n const result = await client.get<{\n asset_events: AssetEvent[]\n next?: string\n }>(`/api/v2/events/accounts/${address}`, {\n event_type: options.eventType,\n chain: options.chain,\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"by-collection\")\n .description(\"Get events for a collection\")\n .argument(\"<slug>\", \"Collection slug\")\n .option(\"--event-type <type>\", \"Event type\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n slug: string,\n options: {\n eventType?: string\n limit: string\n next?: string\n },\n ) => {\n const client = getClient()\n const result = await client.get<{\n asset_events: AssetEvent[]\n next?: string\n }>(`/api/v2/events/collection/${slug}`, {\n event_type: options.eventType,\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"by-nft\")\n .description(\"Get events for a specific NFT\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<contract>\", \"Contract address\")\n .argument(\"<token-id>\", \"Token ID\")\n .option(\"--event-type <type>\", \"Event type\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n chain: string,\n contract: string,\n tokenId: string,\n options: {\n eventType?: string\n limit: string\n next?: string\n },\n ) => {\n const client = getClient()\n const result = await client.get<{\n asset_events: AssetEvent[]\n next?: string\n }>(\n `/api/v2/events/chain/${chain}/contract/${contract}/nfts/${tokenId}`,\n {\n event_type: options.eventType,\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { Listing } from \"../types/index.js\"\n\nexport function listingsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"listings\").description(\"Query NFT listings\")\n\n cmd\n .command(\"all\")\n .description(\"Get all listings for a collection\")\n .argument(\"<collection>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (collection: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{\n listings: Listing[]\n next?: string\n }>(`/api/v2/listings/collection/${collection}/all`, {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"best\")\n .description(\"Get best listings for a collection\")\n .argument(\"<collection>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (collection: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{\n listings: Listing[]\n next?: string\n }>(`/api/v2/listings/collection/${collection}/best`, {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"best-for-nft\")\n .description(\"Get best listing for a specific NFT\")\n .argument(\"<collection>\", \"Collection slug\")\n .argument(\"<token-id>\", \"Token ID\")\n .action(async (collection: string, tokenId: string) => {\n const client = getClient()\n const result = await client.get<Listing>(\n `/api/v2/listings/collection/${collection}/nfts/${tokenId}/best`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { Contract, NFT } from \"../types/index.js\"\n\nexport function nftsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"nfts\").description(\"Query NFTs\")\n\n cmd\n .command(\"get\")\n .description(\"Get a single NFT\")\n .argument(\"<chain>\", \"Chain (e.g. ethereum, base)\")\n .argument(\"<contract>\", \"Contract address\")\n .argument(\"<token-id>\", \"Token ID\")\n .action(async (chain: string, contract: string, tokenId: string) => {\n const client = getClient()\n const result = await client.get<{ nft: NFT }>(\n `/api/v2/chain/${chain}/contract/${contract}/nfts/${tokenId}`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"list-by-collection\")\n .description(\"List NFTs in a collection\")\n .argument(\"<slug>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(async (slug: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{ nfts: NFT[]; next?: string }>(\n `/api/v2/collection/${slug}/nfts`,\n {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n },\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"list-by-contract\")\n .description(\"List NFTs by contract address\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<contract>\", \"Contract address\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n chain: string,\n contract: string,\n options: { limit: string; next?: string },\n ) => {\n const client = getClient()\n const result = await client.get<{ nfts: NFT[]; next?: string }>(\n `/api/v2/chain/${chain}/contract/${contract}/nfts`,\n {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"list-by-account\")\n .description(\"List NFTs owned by an account\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<address>\", \"Account address\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n chain: string,\n address: string,\n options: { limit: string; next?: string },\n ) => {\n const client = getClient()\n const result = await client.get<{ nfts: NFT[]; next?: string }>(\n `/api/v2/chain/${chain}/account/${address}/nfts`,\n {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"refresh\")\n .description(\"Refresh NFT metadata\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<contract>\", \"Contract address\")\n .argument(\"<token-id>\", \"Token ID\")\n .action(async (chain: string, contract: string, tokenId: string) => {\n const client = getClient()\n await client.post(\n `/api/v2/chain/${chain}/contract/${contract}/nfts/${tokenId}/refresh`,\n )\n console.log(\n formatOutput(\n { status: \"ok\", message: \"Metadata refresh requested\" },\n getFormat(),\n ),\n )\n })\n\n cmd\n .command(\"contract\")\n .description(\"Get contract details\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<address>\", \"Contract address\")\n .action(async (chain: string, address: string) => {\n const client = getClient()\n const result = await client.get<Contract>(\n `/api/v2/chain/${chain}/contract/${address}`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { Offer } from \"../types/index.js\"\n\nexport function offersCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"offers\").description(\"Query NFT offers\")\n\n cmd\n .command(\"all\")\n .description(\"Get all offers for a collection\")\n .argument(\"<collection>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (collection: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{\n offers: Offer[]\n next?: string\n }>(`/api/v2/offers/collection/${collection}/all`, {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"collection\")\n .description(\"Get collection offers\")\n .argument(\"<collection>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (collection: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{\n offers: Offer[]\n next?: string\n }>(`/api/v2/offers/collection/${collection}`, {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"best-for-nft\")\n .description(\"Get best offer for a specific NFT\")\n .argument(\"<collection>\", \"Collection slug\")\n .argument(\"<token-id>\", \"Token ID\")\n .action(async (collection: string, tokenId: string) => {\n const client = getClient()\n const result = await client.get<Offer>(\n `/api/v2/offers/collection/${collection}/nfts/${tokenId}/best`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"traits\")\n .description(\"Get trait offers for a collection\")\n .argument(\"<collection>\", \"Collection slug\")\n .requiredOption(\"--type <type>\", \"Trait type (required)\")\n .requiredOption(\"--value <value>\", \"Trait value (required)\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n collection: string,\n options: {\n type: string\n value: string\n limit: string\n next?: string\n },\n ) => {\n const client = getClient()\n const result = await client.get<{\n offers: Offer[]\n next?: string\n }>(`/api/v2/offers/collection/${collection}/traits`, {\n type: options.type,\n value: options.value,\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport {\n SEARCH_ACCOUNTS_QUERY,\n SEARCH_COLLECTIONS_QUERY,\n SEARCH_NFTS_QUERY,\n SEARCH_TOKENS_QUERY,\n} from \"../queries.js\"\nimport type {\n SearchAccountResult,\n SearchCollectionResult,\n SearchNFTResult,\n SearchTokenResult,\n} from \"../types/index.js\"\n\nexport function searchCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"search\").description(\n \"Search for collections, NFTs, tokens, and accounts\",\n )\n\n cmd\n .command(\"collections\")\n .description(\"Search collections by name or slug\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--chains <chains>\", \"Filter by chains (comma-separated)\")\n .option(\"--limit <limit>\", \"Number of results\", \"10\")\n .action(\n async (query: string, options: { chains?: string; limit: string }) => {\n const client = getClient()\n const result = await client.graphql<{\n collectionsByQuery: SearchCollectionResult[]\n }>(SEARCH_COLLECTIONS_QUERY, {\n query,\n limit: Number.parseInt(options.limit, 10),\n chains: options.chains?.split(\",\"),\n })\n console.log(formatOutput(result.collectionsByQuery, getFormat()))\n },\n )\n\n cmd\n .command(\"nfts\")\n .description(\"Search NFTs by name\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--collection <slug>\", \"Filter by collection slug\")\n .option(\"--chains <chains>\", \"Filter by chains (comma-separated)\")\n .option(\"--limit <limit>\", \"Number of results\", \"10\")\n .action(\n async (\n query: string,\n options: { collection?: string; chains?: string; limit: string },\n ) => {\n const client = getClient()\n const result = await client.graphql<{\n itemsByQuery: SearchNFTResult[]\n }>(SEARCH_NFTS_QUERY, {\n query,\n collectionSlug: options.collection,\n limit: Number.parseInt(options.limit, 10),\n chains: options.chains?.split(\",\"),\n })\n console.log(formatOutput(result.itemsByQuery, getFormat()))\n },\n )\n\n cmd\n .command(\"tokens\")\n .description(\"Search tokens/currencies by name or symbol\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--chain <chain>\", \"Filter by chain\")\n .option(\"--limit <limit>\", \"Number of results\", \"10\")\n .action(\n async (query: string, options: { chain?: string; limit: string }) => {\n const client = getClient()\n const result = await client.graphql<{\n currenciesByQuery: SearchTokenResult[]\n }>(SEARCH_TOKENS_QUERY, {\n query,\n limit: Number.parseInt(options.limit, 10),\n chain: options.chain,\n })\n console.log(formatOutput(result.currenciesByQuery, getFormat()))\n },\n )\n\n cmd\n .command(\"accounts\")\n .description(\"Search accounts by username or address\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--limit <limit>\", \"Number of results\", \"10\")\n .action(async (query: string, options: { limit: string }) => {\n const client = getClient()\n const result = await client.graphql<{\n accountsByQuery: SearchAccountResult[]\n }>(SEARCH_ACCOUNTS_QUERY, {\n query,\n limit: Number.parseInt(options.limit, 10),\n })\n console.log(formatOutput(result.accountsByQuery, getFormat()))\n })\n\n return cmd\n}\n","export const SEARCH_COLLECTIONS_QUERY = `\nquery SearchCollections($query: String!, $limit: Int, $chains: [ChainIdentifier!]) {\n collectionsByQuery(query: $query, limit: $limit, chains: $chains) {\n slug\n name\n description\n imageUrl\n chain {\n identifier\n name\n }\n stats {\n totalSupply\n ownerCount\n volume {\n usd\n }\n sales\n }\n floorPrice {\n pricePerItem {\n usd\n native {\n unit\n symbol\n }\n }\n }\n }\n}`\n\nexport const SEARCH_NFTS_QUERY = `\nquery SearchItems($query: String!, $collectionSlug: String, $limit: Int, $chains: [ChainIdentifier!]) {\n itemsByQuery(query: $query, collectionSlug: $collectionSlug, limit: $limit, chains: $chains) {\n tokenId\n name\n description\n imageUrl\n contractAddress\n collection {\n slug\n name\n }\n chain {\n identifier\n name\n }\n bestListing {\n pricePerItem {\n usd\n native {\n unit\n symbol\n }\n }\n }\n owner {\n address\n displayName\n }\n }\n}`\n\nexport const SEARCH_TOKENS_QUERY = `\nquery SearchCurrencies($query: String!, $limit: Int, $chain: ChainIdentifier) {\n currenciesByQuery(query: $query, limit: $limit, chain: $chain, allowlistOnly: false) {\n name\n symbol\n imageUrl\n usdPrice\n contractAddress\n chain {\n identifier\n name\n }\n stats {\n marketCapUsd\n oneDay {\n priceChange\n volume\n }\n }\n }\n}`\n\nexport const SEARCH_ACCOUNTS_QUERY = `\nquery SearchAccounts($query: String!, $limit: Int) {\n accountsByQuery(query: $query, limit: $limit) {\n address\n username\n imageUrl\n isVerified\n }\n}`\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { SwapQuoteResponse } from \"../types/index.js\"\n\nexport function swapsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"swaps\").description(\n \"Get swap quotes for token trading\",\n )\n\n cmd\n .command(\"quote\")\n .description(\n \"Get a quote for swapping tokens, including price details and executable transaction data\",\n )\n .requiredOption(\"--from-chain <chain>\", \"Chain of the token to swap from\")\n .requiredOption(\n \"--from-address <address>\",\n \"Contract address of the token to swap from\",\n )\n .requiredOption(\"--to-chain <chain>\", \"Chain of the token to swap to\")\n .requiredOption(\n \"--to-address <address>\",\n \"Contract address of the token to swap to\",\n )\n .requiredOption(\"--quantity <quantity>\", \"Amount to swap (in token units)\")\n .requiredOption(\"--address <address>\", \"Wallet address executing the swap\")\n .option(\n \"--slippage <slippage>\",\n \"Slippage tolerance (0.0 to 0.5, default: 0.01)\",\n )\n .option(\n \"--recipient <recipient>\",\n \"Recipient address (defaults to sender address)\",\n )\n .action(\n async (options: {\n fromChain: string\n fromAddress: string\n toChain: string\n toAddress: string\n quantity: string\n address: string\n slippage?: string\n recipient?: string\n }) => {\n const client = getClient()\n const result = await client.get<SwapQuoteResponse>(\n \"/api/v2/swap/quote\",\n {\n from_chain: options.fromChain,\n from_address: options.fromAddress,\n to_chain: options.toChain,\n to_address: options.toAddress,\n quantity: options.quantity,\n address: options.address,\n slippage: options.slippage\n ? Number.parseFloat(options.slippage)\n : undefined,\n recipient: options.recipient,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { Chain, Token, TokenDetails } from \"../types/index.js\"\n\nexport function tokensCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"tokens\").description(\n \"Query trending tokens, top tokens, and token details\",\n )\n\n cmd\n .command(\"trending\")\n .description(\"Get trending tokens based on OpenSea's trending score\")\n .option(\"--chains <chains>\", \"Comma-separated list of chains to filter by\")\n .option(\"--limit <limit>\", \"Number of results (max 100)\", \"20\")\n .option(\"--cursor <cursor>\", \"Pagination cursor\")\n .action(\n async (options: { chains?: string; limit: string; cursor?: string }) => {\n const client = getClient()\n const result = await client.get<{ tokens: Token[]; next?: string }>(\n \"/api/v2/tokens/trending\",\n {\n chains: options.chains,\n limit: Number.parseInt(options.limit, 10),\n cursor: options.cursor,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"top\")\n .description(\"Get top tokens ranked by 24-hour trading volume\")\n .option(\"--chains <chains>\", \"Comma-separated list of chains to filter by\")\n .option(\"--limit <limit>\", \"Number of results (max 100)\", \"20\")\n .option(\"--cursor <cursor>\", \"Pagination cursor\")\n .action(\n async (options: { chains?: string; limit: string; cursor?: string }) => {\n const client = getClient()\n const result = await client.get<{ tokens: Token[]; next?: string }>(\n \"/api/v2/tokens/top\",\n {\n chains: options.chains,\n limit: Number.parseInt(options.limit, 10),\n cursor: options.cursor,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"get\")\n .description(\"Get detailed information about a specific token\")\n .argument(\"<chain>\", \"Blockchain chain\")\n .argument(\"<address>\", \"Token contract address\")\n .action(async (chain: string, address: string) => {\n const client = getClient()\n const result = await client.get<TokenDetails>(\n `/api/v2/chain/${chain as Chain}/token/${address}`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n"],"mappings":"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","names":["Command","getClient","getFormat","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/client.ts","../src/commands/accounts.ts","../src/output.ts","../src/commands/collections.ts","../src/parse.ts","../src/commands/events.ts","../src/commands/listings.ts","../src/commands/nfts.ts","../src/commands/offers.ts","../src/commands/search.ts","../src/queries.ts","../src/commands/swaps.ts","../src/commands/tokens.ts"],"sourcesContent":["import { Command } from \"commander\"\nimport { OpenSeaAPIError, OpenSeaClient } from \"./client.js\"\nimport {\n accountsCommand,\n collectionsCommand,\n eventsCommand,\n listingsCommand,\n nftsCommand,\n offersCommand,\n searchCommand,\n swapsCommand,\n tokensCommand,\n} from \"./commands/index.js\"\nimport { parseIntOption } from \"./parse.js\"\n\nconst BANNER = `\n ____ _____\n / __ \\\\ / ____|\n | | | |_ __ ___ _ _| (___ ___ __ _\n | | | | '_ \\\\ / _ \\\\ '_ \\\\___ \\\\ / _ \\\\/ _\\` |\n | |__| | |_) | __/ | | |___) | __/ (_| |\n \\\\____/| .__/ \\\\___|_| |_|____/ \\\\___|\\\\__,_|\n | |\n |_|\n`\n\nconst program = new Command()\n\nprogram\n .name(\"opensea\")\n .description(\"OpenSea CLI - Query the OpenSea API from the command line\")\n .version(process.env.npm_package_version ?? \"0.0.0\")\n .addHelpText(\"before\", BANNER)\n .option(\"--api-key <key>\", \"OpenSea API key (or set OPENSEA_API_KEY env var)\")\n .option(\"--chain <chain>\", \"Default chain\", \"ethereum\")\n .option(\"--format <format>\", \"Output format (json or table)\", \"json\")\n .option(\"--base-url <url>\", \"API base URL\")\n .option(\"--timeout <ms>\", \"Request timeout in milliseconds\", \"30000\")\n .option(\"--verbose\", \"Log request and response info to stderr\")\n\nfunction getClient(): OpenSeaClient {\n const opts = program.opts<{\n apiKey?: string\n chain: string\n baseUrl?: string\n timeout: string\n verbose?: boolean\n }>()\n\n const apiKey = opts.apiKey ?? process.env.OPENSEA_API_KEY\n if (!apiKey) {\n console.error(\n \"Error: API key required. Use --api-key or set OPENSEA_API_KEY environment variable.\",\n )\n process.exit(2)\n }\n\n return new OpenSeaClient({\n apiKey,\n chain: opts.chain,\n baseUrl: opts.baseUrl,\n timeout: parseIntOption(opts.timeout, \"--timeout\"),\n verbose: opts.verbose,\n })\n}\n\nfunction getFormat(): \"json\" | \"table\" {\n const opts = program.opts<{ format: string }>()\n return opts.format === \"table\" ? \"table\" : \"json\"\n}\n\nprogram.addCommand(collectionsCommand(getClient, getFormat))\nprogram.addCommand(nftsCommand(getClient, getFormat))\nprogram.addCommand(listingsCommand(getClient, getFormat))\nprogram.addCommand(offersCommand(getClient, getFormat))\nprogram.addCommand(eventsCommand(getClient, getFormat))\nprogram.addCommand(accountsCommand(getClient, getFormat))\nprogram.addCommand(tokensCommand(getClient, getFormat))\nprogram.addCommand(searchCommand(getClient, getFormat))\nprogram.addCommand(swapsCommand(getClient, getFormat))\n\nasync function main() {\n try {\n await program.parseAsync(process.argv)\n } catch (error) {\n if (error instanceof OpenSeaAPIError) {\n console.error(\n JSON.stringify(\n {\n error: \"API Error\",\n status: error.statusCode,\n path: error.path,\n message: error.responseBody,\n },\n null,\n 2,\n ),\n )\n process.exit(1)\n }\n const label =\n error instanceof TypeError ? \"Network Error\" : (error as Error).name\n console.error(\n JSON.stringify(\n {\n error: label,\n message: (error as Error).message,\n },\n null,\n 2,\n ),\n )\n process.exit(1)\n }\n}\n\nmain()\n","import type { OpenSeaClientConfig } from \"./types/index.js\"\n\nconst DEFAULT_BASE_URL = \"https://api.opensea.io\"\nconst DEFAULT_GRAPHQL_URL = \"https://gql.opensea.io/graphql\"\nconst DEFAULT_TIMEOUT_MS = 30_000\n\nexport class OpenSeaClient {\n private apiKey: string\n private baseUrl: string\n private graphqlUrl: string\n private defaultChain: string\n private timeoutMs: number\n private verbose: boolean\n\n constructor(config: OpenSeaClientConfig) {\n this.apiKey = config.apiKey\n this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL\n this.graphqlUrl = config.graphqlUrl ?? DEFAULT_GRAPHQL_URL\n this.defaultChain = config.chain ?? \"ethereum\"\n this.timeoutMs = config.timeout ?? DEFAULT_TIMEOUT_MS\n this.verbose = config.verbose ?? false\n }\n\n async get<T>(path: string, params?: Record<string, unknown>): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n if (this.verbose) {\n console.error(`[verbose] GET ${url.toString()}`)\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n signal: AbortSignal.timeout(this.timeoutMs),\n })\n\n if (this.verbose) {\n console.error(`[verbose] ${response.status} ${response.statusText}`)\n }\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, path)\n }\n\n return response.json() as Promise<T>\n }\n\n async post<T>(\n path: string,\n body?: Record<string, unknown>,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n }\n\n if (body) {\n headers[\"Content-Type\"] = \"application/json\"\n }\n\n if (this.verbose) {\n console.error(`[verbose] POST ${url.toString()}`)\n }\n\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(this.timeoutMs),\n })\n\n if (this.verbose) {\n console.error(`[verbose] ${response.status} ${response.statusText}`)\n }\n\n if (!response.ok) {\n const text = await response.text()\n throw new OpenSeaAPIError(response.status, text, path)\n }\n\n return response.json() as Promise<T>\n }\n\n async graphql<T>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<T> {\n if (this.verbose) {\n console.error(`[verbose] POST ${this.graphqlUrl}`)\n }\n\n const response = await fetch(this.graphqlUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n body: JSON.stringify({ query, variables }),\n signal: AbortSignal.timeout(this.timeoutMs),\n })\n\n if (this.verbose) {\n console.error(`[verbose] ${response.status} ${response.statusText}`)\n }\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, \"graphql\")\n }\n\n const json = (await response.json()) as {\n data?: T\n errors?: { message: string }[]\n }\n\n if (json.errors?.length) {\n throw new OpenSeaAPIError(\n 400,\n json.errors.map(e => e.message).join(\"; \"),\n \"graphql\",\n )\n }\n\n if (!json.data) {\n throw new OpenSeaAPIError(500, \"GraphQL response missing data\", \"graphql\")\n }\n\n return json.data\n }\n\n getDefaultChain(): string {\n return this.defaultChain\n }\n}\n\nexport class OpenSeaAPIError extends Error {\n constructor(\n public statusCode: number,\n public responseBody: string,\n public path: string,\n ) {\n super(`OpenSea API error ${statusCode} on ${path}: ${responseBody}`)\n this.name = \"OpenSeaAPIError\"\n }\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { Account } from \"../types/index.js\"\n\nexport function accountsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"accounts\").description(\"Query accounts\")\n\n cmd\n .command(\"get\")\n .description(\"Get an account by address\")\n .argument(\"<address>\", \"Wallet address\")\n .action(async (address: string) => {\n const client = getClient()\n const result = await client.get<Account>(`/api/v2/accounts/${address}`)\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n","export function formatOutput(data: unknown, format: \"json\" | \"table\"): string {\n if (format === \"table\") {\n return formatTable(data)\n }\n return JSON.stringify(data, null, 2)\n}\n\nfunction formatTable(data: unknown): string {\n if (Array.isArray(data)) {\n if (data.length === 0) return \"(empty)\"\n const keys = Object.keys(data[0] as Record<string, unknown>)\n const widths = keys.map(key =>\n Math.max(\n key.length,\n ...data.map(row => {\n const val = (row as Record<string, unknown>)[key]\n return String(val ?? \"\").length\n }),\n ),\n )\n\n const header = keys.map((key, i) => key.padEnd(widths[i])).join(\" \")\n const separator = widths.map(w => \"-\".repeat(w)).join(\" \")\n const rows = data.map(row =>\n keys\n .map((key, i) => {\n const val = (row as Record<string, unknown>)[key]\n return String(val ?? \"\").padEnd(widths[i])\n })\n .join(\" \"),\n )\n\n return [header, separator, ...rows].join(\"\\n\")\n }\n\n if (data && typeof data === \"object\") {\n const entries = Object.entries(data as Record<string, unknown>)\n if (entries.length === 0) return \"(empty)\"\n const maxKeyLength = Math.max(...entries.map(([k]) => k.length))\n return entries\n .map(([key, value]) => {\n const displayValue =\n typeof value === \"object\" && value !== null\n ? JSON.stringify(value)\n : String(value ?? \"\")\n return `${key.padEnd(maxKeyLength)} ${displayValue}`\n })\n .join(\"\\n\")\n }\n\n return String(data)\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport { parseIntOption } from \"../parse.js\"\nimport type {\n Chain,\n Collection,\n CollectionOrderBy,\n CollectionStats,\n GetTraitsResponse,\n} from \"../types/index.js\"\n\nexport function collectionsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"collections\").description(\n \"Manage and query NFT collections\",\n )\n\n cmd\n .command(\"get\")\n .description(\"Get a single collection by slug\")\n .argument(\"<slug>\", \"Collection slug\")\n .action(async (slug: string) => {\n const client = getClient()\n const result = await client.get<Collection>(`/api/v2/collections/${slug}`)\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"list\")\n .description(\"List collections\")\n .option(\"--chain <chain>\", \"Filter by chain\")\n .option(\n \"--order-by <orderBy>\",\n \"Order by field (created_date, one_day_change, seven_day_volume, seven_day_change, num_owners, market_cap)\",\n )\n .option(\"--creator <username>\", \"Filter by creator username\")\n .option(\"--include-hidden\", \"Include hidden collections\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (options: {\n chain?: string\n orderBy?: string\n creator?: string\n includeHidden?: boolean\n limit: string\n next?: string\n }) => {\n const client = getClient()\n const result = await client.get<{\n collections: Collection[]\n next?: string\n }>(\"/api/v2/collections\", {\n chain: options.chain as Chain | undefined,\n order_by: options.orderBy as CollectionOrderBy | undefined,\n creator_username: options.creator,\n include_hidden: options.includeHidden,\n limit: parseIntOption(options.limit, \"--limit\"),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"stats\")\n .description(\"Get collection stats\")\n .argument(\"<slug>\", \"Collection slug\")\n .action(async (slug: string) => {\n const client = getClient()\n const result = await client.get<CollectionStats>(\n `/api/v2/collections/${slug}/stats`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"traits\")\n .description(\"Get collection traits\")\n .argument(\"<slug>\", \"Collection slug\")\n .action(async (slug: string) => {\n const client = getClient()\n const result = await client.get<GetTraitsResponse>(\n `/api/v2/traits/${slug}`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n","export function parseIntOption(value: string, name: string): number {\n const parsed = Number.parseInt(value, 10)\n if (Number.isNaN(parsed)) {\n throw new Error(`Invalid value for ${name}: \"${value}\" is not an integer`)\n }\n return parsed\n}\n\nexport function parseFloatOption(value: string, name: string): number {\n const parsed = Number.parseFloat(value)\n if (Number.isNaN(parsed)) {\n throw new Error(`Invalid value for ${name}: \"${value}\" is not a number`)\n }\n return parsed\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport { parseIntOption } from \"../parse.js\"\nimport type { AssetEvent } from \"../types/index.js\"\n\nexport function eventsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"events\").description(\"Query marketplace events\")\n\n cmd\n .command(\"list\")\n .description(\"List events\")\n .option(\n \"--event-type <type>\",\n \"Event type (sale, transfer, mint, listing, offer, trait_offer, collection_offer)\",\n )\n .option(\"--after <timestamp>\", \"Filter events after this Unix timestamp\")\n .option(\"--before <timestamp>\", \"Filter events before this Unix timestamp\")\n .option(\"--chain <chain>\", \"Filter by chain\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (options: {\n eventType?: string\n after?: string\n before?: string\n chain?: string\n limit: string\n next?: string\n }) => {\n const client = getClient()\n const result = await client.get<{\n asset_events: AssetEvent[]\n next?: string\n }>(\"/api/v2/events\", {\n event_type: options.eventType,\n after: options.after\n ? parseIntOption(options.after, \"--after\")\n : undefined,\n before: options.before\n ? parseIntOption(options.before, \"--before\")\n : undefined,\n chain: options.chain,\n limit: parseIntOption(options.limit, \"--limit\"),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"by-account\")\n .description(\"Get events for an account\")\n .argument(\"<address>\", \"Account address\")\n .option(\"--event-type <type>\", \"Event type\")\n .option(\"--chain <chain>\", \"Filter by chain\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n address: string,\n options: {\n eventType?: string\n chain?: string\n limit: string\n next?: string\n },\n ) => {\n const client = getClient()\n const result = await client.get<{\n asset_events: AssetEvent[]\n next?: string\n }>(`/api/v2/events/accounts/${address}`, {\n event_type: options.eventType,\n chain: options.chain,\n limit: parseIntOption(options.limit, \"--limit\"),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"by-collection\")\n .description(\"Get events for a collection\")\n .argument(\"<slug>\", \"Collection slug\")\n .option(\"--event-type <type>\", \"Event type\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n slug: string,\n options: {\n eventType?: string\n limit: string\n next?: string\n },\n ) => {\n const client = getClient()\n const result = await client.get<{\n asset_events: AssetEvent[]\n next?: string\n }>(`/api/v2/events/collection/${slug}`, {\n event_type: options.eventType,\n limit: parseIntOption(options.limit, \"--limit\"),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"by-nft\")\n .description(\"Get events for a specific NFT\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<contract>\", \"Contract address\")\n .argument(\"<token-id>\", \"Token ID\")\n .option(\"--event-type <type>\", \"Event type\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n chain: string,\n contract: string,\n tokenId: string,\n options: {\n eventType?: string\n limit: string\n next?: string\n },\n ) => {\n const client = getClient()\n const result = await client.get<{\n asset_events: AssetEvent[]\n next?: string\n }>(\n `/api/v2/events/chain/${chain}/contract/${contract}/nfts/${tokenId}`,\n {\n event_type: options.eventType,\n limit: parseIntOption(options.limit, \"--limit\"),\n next: options.next,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport { parseIntOption } from \"../parse.js\"\nimport type { Listing } from \"../types/index.js\"\n\nexport function listingsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"listings\").description(\"Query NFT listings\")\n\n cmd\n .command(\"all\")\n .description(\"Get all listings for a collection\")\n .argument(\"<collection>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (collection: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{\n listings: Listing[]\n next?: string\n }>(`/api/v2/listings/collection/${collection}/all`, {\n limit: parseIntOption(options.limit, \"--limit\"),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"best\")\n .description(\"Get best listings for a collection\")\n .argument(\"<collection>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (collection: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{\n listings: Listing[]\n next?: string\n }>(`/api/v2/listings/collection/${collection}/best`, {\n limit: parseIntOption(options.limit, \"--limit\"),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"best-for-nft\")\n .description(\"Get best listing for a specific NFT\")\n .argument(\"<collection>\", \"Collection slug\")\n .argument(\"<token-id>\", \"Token ID\")\n .action(async (collection: string, tokenId: string) => {\n const client = getClient()\n const result = await client.get<Listing>(\n `/api/v2/listings/collection/${collection}/nfts/${tokenId}/best`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport { parseIntOption } from \"../parse.js\"\nimport type { Contract, NFT } from \"../types/index.js\"\n\nexport function nftsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"nfts\").description(\"Query NFTs\")\n\n cmd\n .command(\"get\")\n .description(\"Get a single NFT\")\n .argument(\"<chain>\", \"Chain (e.g. ethereum, base)\")\n .argument(\"<contract>\", \"Contract address\")\n .argument(\"<token-id>\", \"Token ID\")\n .action(async (chain: string, contract: string, tokenId: string) => {\n const client = getClient()\n const result = await client.get<{ nft: NFT }>(\n `/api/v2/chain/${chain}/contract/${contract}/nfts/${tokenId}`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"list-by-collection\")\n .description(\"List NFTs in a collection\")\n .argument(\"<slug>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(async (slug: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{ nfts: NFT[]; next?: string }>(\n `/api/v2/collection/${slug}/nfts`,\n {\n limit: parseIntOption(options.limit, \"--limit\"),\n next: options.next,\n },\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"list-by-contract\")\n .description(\"List NFTs by contract address\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<contract>\", \"Contract address\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n chain: string,\n contract: string,\n options: { limit: string; next?: string },\n ) => {\n const client = getClient()\n const result = await client.get<{ nfts: NFT[]; next?: string }>(\n `/api/v2/chain/${chain}/contract/${contract}/nfts`,\n {\n limit: parseIntOption(options.limit, \"--limit\"),\n next: options.next,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"list-by-account\")\n .description(\"List NFTs owned by an account\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<address>\", \"Account address\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n chain: string,\n address: string,\n options: { limit: string; next?: string },\n ) => {\n const client = getClient()\n const result = await client.get<{ nfts: NFT[]; next?: string }>(\n `/api/v2/chain/${chain}/account/${address}/nfts`,\n {\n limit: parseIntOption(options.limit, \"--limit\"),\n next: options.next,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"refresh\")\n .description(\"Refresh NFT metadata\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<contract>\", \"Contract address\")\n .argument(\"<token-id>\", \"Token ID\")\n .action(async (chain: string, contract: string, tokenId: string) => {\n const client = getClient()\n await client.post(\n `/api/v2/chain/${chain}/contract/${contract}/nfts/${tokenId}/refresh`,\n )\n console.log(\n formatOutput(\n { status: \"ok\", message: \"Metadata refresh requested\" },\n getFormat(),\n ),\n )\n })\n\n cmd\n .command(\"contract\")\n .description(\"Get contract details\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<address>\", \"Contract address\")\n .action(async (chain: string, address: string) => {\n const client = getClient()\n const result = await client.get<Contract>(\n `/api/v2/chain/${chain}/contract/${address}`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport { parseIntOption } from \"../parse.js\"\nimport type { Offer } from \"../types/index.js\"\n\nexport function offersCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"offers\").description(\"Query NFT offers\")\n\n cmd\n .command(\"all\")\n .description(\"Get all offers for a collection\")\n .argument(\"<collection>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (collection: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{\n offers: Offer[]\n next?: string\n }>(`/api/v2/offers/collection/${collection}/all`, {\n limit: parseIntOption(options.limit, \"--limit\"),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"collection\")\n .description(\"Get collection offers\")\n .argument(\"<collection>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (collection: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{\n offers: Offer[]\n next?: string\n }>(`/api/v2/offers/collection/${collection}`, {\n limit: parseIntOption(options.limit, \"--limit\"),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"best-for-nft\")\n .description(\"Get best offer for a specific NFT\")\n .argument(\"<collection>\", \"Collection slug\")\n .argument(\"<token-id>\", \"Token ID\")\n .action(async (collection: string, tokenId: string) => {\n const client = getClient()\n const result = await client.get<Offer>(\n `/api/v2/offers/collection/${collection}/nfts/${tokenId}/best`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"traits\")\n .description(\"Get trait offers for a collection\")\n .argument(\"<collection>\", \"Collection slug\")\n .requiredOption(\"--type <type>\", \"Trait type (required)\")\n .requiredOption(\"--value <value>\", \"Trait value (required)\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n collection: string,\n options: {\n type: string\n value: string\n limit: string\n next?: string\n },\n ) => {\n const client = getClient()\n const result = await client.get<{\n offers: Offer[]\n next?: string\n }>(`/api/v2/offers/collection/${collection}/traits`, {\n type: options.type,\n value: options.value,\n limit: parseIntOption(options.limit, \"--limit\"),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport { parseIntOption } from \"../parse.js\"\nimport {\n SEARCH_ACCOUNTS_QUERY,\n SEARCH_COLLECTIONS_QUERY,\n SEARCH_NFTS_QUERY,\n SEARCH_TOKENS_QUERY,\n} from \"../queries.js\"\nimport type {\n SearchAccountResult,\n SearchCollectionResult,\n SearchNFTResult,\n SearchTokenResult,\n} from \"../types/index.js\"\n\nexport function searchCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"search\").description(\n \"Search for collections, NFTs, tokens, and accounts\",\n )\n\n cmd\n .command(\"collections\")\n .description(\"Search collections by name or slug\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--chains <chains>\", \"Filter by chains (comma-separated)\")\n .option(\"--limit <limit>\", \"Number of results\", \"10\")\n .action(\n async (query: string, options: { chains?: string; limit: string }) => {\n const client = getClient()\n const result = await client.graphql<{\n collectionsByQuery: SearchCollectionResult[]\n }>(SEARCH_COLLECTIONS_QUERY, {\n query,\n limit: parseIntOption(options.limit, \"--limit\"),\n chains: options.chains?.split(\",\"),\n })\n console.log(formatOutput(result.collectionsByQuery, getFormat()))\n },\n )\n\n cmd\n .command(\"nfts\")\n .description(\"Search NFTs by name\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--collection <slug>\", \"Filter by collection slug\")\n .option(\"--chains <chains>\", \"Filter by chains (comma-separated)\")\n .option(\"--limit <limit>\", \"Number of results\", \"10\")\n .action(\n async (\n query: string,\n options: { collection?: string; chains?: string; limit: string },\n ) => {\n const client = getClient()\n const result = await client.graphql<{\n itemsByQuery: SearchNFTResult[]\n }>(SEARCH_NFTS_QUERY, {\n query,\n collectionSlug: options.collection,\n limit: parseIntOption(options.limit, \"--limit\"),\n chains: options.chains?.split(\",\"),\n })\n console.log(formatOutput(result.itemsByQuery, getFormat()))\n },\n )\n\n cmd\n .command(\"tokens\")\n .description(\"Search tokens/currencies by name or symbol\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--chain <chain>\", \"Filter by chain\")\n .option(\"--limit <limit>\", \"Number of results\", \"10\")\n .action(\n async (query: string, options: { chain?: string; limit: string }) => {\n const client = getClient()\n const result = await client.graphql<{\n currenciesByQuery: SearchTokenResult[]\n }>(SEARCH_TOKENS_QUERY, {\n query,\n limit: parseIntOption(options.limit, \"--limit\"),\n chain: options.chain,\n })\n console.log(formatOutput(result.currenciesByQuery, getFormat()))\n },\n )\n\n cmd\n .command(\"accounts\")\n .description(\"Search accounts by username or address\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--limit <limit>\", \"Number of results\", \"10\")\n .action(async (query: string, options: { limit: string }) => {\n const client = getClient()\n const result = await client.graphql<{\n accountsByQuery: SearchAccountResult[]\n }>(SEARCH_ACCOUNTS_QUERY, {\n query,\n limit: parseIntOption(options.limit, \"--limit\"),\n })\n console.log(formatOutput(result.accountsByQuery, getFormat()))\n })\n\n return cmd\n}\n","export const SEARCH_COLLECTIONS_QUERY = `\nquery SearchCollections($query: String!, $limit: Int, $chains: [ChainIdentifier!]) {\n collectionsByQuery(query: $query, limit: $limit, chains: $chains) {\n slug\n name\n description\n imageUrl\n chain {\n identifier\n name\n }\n stats {\n totalSupply\n ownerCount\n volume {\n usd\n }\n sales\n }\n floorPrice {\n pricePerItem {\n usd\n native {\n unit\n symbol\n }\n }\n }\n }\n}`\n\nexport const SEARCH_NFTS_QUERY = `\nquery SearchItems($query: String!, $collectionSlug: String, $limit: Int, $chains: [ChainIdentifier!]) {\n itemsByQuery(query: $query, collectionSlug: $collectionSlug, limit: $limit, chains: $chains) {\n tokenId\n name\n description\n imageUrl\n contractAddress\n collection {\n slug\n name\n }\n chain {\n identifier\n name\n }\n bestListing {\n pricePerItem {\n usd\n native {\n unit\n symbol\n }\n }\n }\n owner {\n address\n displayName\n }\n }\n}`\n\nexport const SEARCH_TOKENS_QUERY = `\nquery SearchCurrencies($query: String!, $limit: Int, $chain: ChainIdentifier) {\n currenciesByQuery(query: $query, limit: $limit, chain: $chain, allowlistOnly: false) {\n name\n symbol\n imageUrl\n usdPrice\n contractAddress\n chain {\n identifier\n name\n }\n stats {\n marketCapUsd\n oneDay {\n priceChange\n volume\n }\n }\n }\n}`\n\nexport const SEARCH_ACCOUNTS_QUERY = `\nquery SearchAccounts($query: String!, $limit: Int) {\n accountsByQuery(query: $query, limit: $limit) {\n address\n username\n imageUrl\n isVerified\n }\n}`\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport { parseFloatOption } from \"../parse.js\"\nimport type { SwapQuoteResponse } from \"../types/index.js\"\n\nexport function swapsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"swaps\").description(\n \"Get swap quotes for token trading\",\n )\n\n cmd\n .command(\"quote\")\n .description(\n \"Get a quote for swapping tokens, including price details and executable transaction data\",\n )\n .requiredOption(\"--from-chain <chain>\", \"Chain of the token to swap from\")\n .requiredOption(\n \"--from-address <address>\",\n \"Contract address of the token to swap from\",\n )\n .requiredOption(\"--to-chain <chain>\", \"Chain of the token to swap to\")\n .requiredOption(\n \"--to-address <address>\",\n \"Contract address of the token to swap to\",\n )\n .requiredOption(\"--quantity <quantity>\", \"Amount to swap (in token units)\")\n .requiredOption(\"--address <address>\", \"Wallet address executing the swap\")\n .option(\n \"--slippage <slippage>\",\n \"Slippage tolerance (0.0 to 0.5, default: 0.01)\",\n )\n .option(\n \"--recipient <recipient>\",\n \"Recipient address (defaults to sender address)\",\n )\n .action(\n async (options: {\n fromChain: string\n fromAddress: string\n toChain: string\n toAddress: string\n quantity: string\n address: string\n slippage?: string\n recipient?: string\n }) => {\n const client = getClient()\n const result = await client.get<SwapQuoteResponse>(\n \"/api/v2/swap/quote\",\n {\n from_chain: options.fromChain,\n from_address: options.fromAddress,\n to_chain: options.toChain,\n to_address: options.toAddress,\n quantity: options.quantity,\n address: options.address,\n slippage: options.slippage\n ? parseFloatOption(options.slippage, \"--slippage\")\n : undefined,\n recipient: options.recipient,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport { parseIntOption } from \"../parse.js\"\nimport type { Chain, Token, TokenDetails } from \"../types/index.js\"\n\nexport function tokensCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"tokens\").description(\n \"Query trending tokens, top tokens, and token details\",\n )\n\n cmd\n .command(\"trending\")\n .description(\"Get trending tokens based on OpenSea's trending score\")\n .option(\"--chains <chains>\", \"Comma-separated list of chains to filter by\")\n .option(\"--limit <limit>\", \"Number of results (max 100)\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (options: { chains?: string; limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{ tokens: Token[]; next?: string }>(\n \"/api/v2/tokens/trending\",\n {\n chains: options.chains,\n limit: parseIntOption(options.limit, \"--limit\"),\n // Tokens API uses \"cursor\" instead of \"next\" as the query param\n cursor: options.next,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"top\")\n .description(\"Get top tokens ranked by 24-hour trading volume\")\n .option(\"--chains <chains>\", \"Comma-separated list of chains to filter by\")\n .option(\"--limit <limit>\", \"Number of results (max 100)\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (options: { chains?: string; limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{ tokens: Token[]; next?: string }>(\n \"/api/v2/tokens/top\",\n {\n chains: options.chains,\n limit: parseIntOption(options.limit, \"--limit\"),\n // Tokens API uses \"cursor\" instead of \"next\" as the query param\n cursor: options.next,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"get\")\n .description(\"Get detailed information about a specific token\")\n .argument(\"<chain>\", \"Blockchain chain\")\n .argument(\"<address>\", \"Token contract address\")\n .action(async (chain: string, address: string) => {\n const client = getClient()\n const result = await client.get<TokenDetails>(\n `/api/v2/chain/${chain as Chain}/token/${address}`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n"],"mappings":"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","names":["Command","getClient","getFormat","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -209,10 +209,6 @@ interface GetTraitsResponse {
|
|
|
209
209
|
[traitType: string]: TraitCounts;
|
|
210
210
|
};
|
|
211
211
|
}
|
|
212
|
-
interface PaginatedResponse<T> {
|
|
213
|
-
next?: string;
|
|
214
|
-
results: T[];
|
|
215
|
-
}
|
|
216
212
|
interface Token {
|
|
217
213
|
address: string;
|
|
218
214
|
chain: string;
|
|
@@ -358,6 +354,8 @@ interface OpenSeaClientConfig {
|
|
|
358
354
|
baseUrl?: string;
|
|
359
355
|
graphqlUrl?: string;
|
|
360
356
|
chain?: string;
|
|
357
|
+
timeout?: number;
|
|
358
|
+
verbose?: boolean;
|
|
361
359
|
}
|
|
362
360
|
interface CommandOptions {
|
|
363
361
|
apiKey?: string;
|
|
@@ -371,9 +369,11 @@ declare class OpenSeaClient {
|
|
|
371
369
|
private baseUrl;
|
|
372
370
|
private graphqlUrl;
|
|
373
371
|
private defaultChain;
|
|
372
|
+
private timeoutMs;
|
|
373
|
+
private verbose;
|
|
374
374
|
constructor(config: OpenSeaClientConfig);
|
|
375
375
|
get<T>(path: string, params?: Record<string, unknown>): Promise<T>;
|
|
376
|
-
post<T>(path: string): Promise<T>;
|
|
376
|
+
post<T>(path: string, body?: Record<string, unknown>, params?: Record<string, unknown>): Promise<T>;
|
|
377
377
|
graphql<T>(query: string, variables?: Record<string, unknown>): Promise<T>;
|
|
378
378
|
getDefaultChain(): string;
|
|
379
379
|
}
|
|
@@ -543,7 +543,7 @@ declare class TokensAPI {
|
|
|
543
543
|
trending(options?: {
|
|
544
544
|
limit?: number;
|
|
545
545
|
chains?: string[];
|
|
546
|
-
|
|
546
|
+
next?: string;
|
|
547
547
|
}): Promise<{
|
|
548
548
|
tokens: Token[];
|
|
549
549
|
next?: string;
|
|
@@ -551,7 +551,7 @@ declare class TokensAPI {
|
|
|
551
551
|
top(options?: {
|
|
552
552
|
limit?: number;
|
|
553
553
|
chains?: string[];
|
|
554
|
-
|
|
554
|
+
next?: string;
|
|
555
555
|
}): Promise<{
|
|
556
556
|
tokens: Token[];
|
|
557
557
|
next?: string;
|
|
@@ -593,4 +593,4 @@ declare class SwapsAPI {
|
|
|
593
593
|
}): Promise<SwapQuoteResponse>;
|
|
594
594
|
}
|
|
595
595
|
|
|
596
|
-
export { type Account, type AssetEvent, type Chain, type Collection, type CollectionOrderBy, type CollectionStats, type CommandOptions, type Contract, type EventAsset, type EventPayment, type EventType, type Fee, type GetTraitsResponse, type Listing, type NFT, type Offer, OpenSeaAPIError, OpenSeaCLI, OpenSeaClient, type OpenSeaClientConfig, type Order, type OrderSide, type
|
|
596
|
+
export { type Account, type AssetEvent, type Chain, type Collection, type CollectionOrderBy, type CollectionStats, type CommandOptions, type Contract, type EventAsset, type EventPayment, type EventType, type Fee, type GetTraitsResponse, type Listing, type NFT, type Offer, OpenSeaAPIError, OpenSeaCLI, OpenSeaClient, type OpenSeaClientConfig, type Order, type OrderSide, type PaymentToken, type Price, type SafelistStatus, type SearchAccountResult, type SearchCollectionResult, type SearchNFTResult, type SearchTokenResult, type SwapQuote, type SwapQuoteResponse, type SwapTransaction, type Token, type TokenDetails, type TokenSocials, type TokenStats, type Trait, type TraitCategories, type TraitCounts };
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
// src/client.ts
|
|
2
2
|
var DEFAULT_BASE_URL = "https://api.opensea.io";
|
|
3
3
|
var DEFAULT_GRAPHQL_URL = "https://gql.opensea.io/graphql";
|
|
4
|
+
var DEFAULT_TIMEOUT_MS = 3e4;
|
|
4
5
|
var OpenSeaClient = class {
|
|
5
6
|
apiKey;
|
|
6
7
|
baseUrl;
|
|
7
8
|
graphqlUrl;
|
|
8
9
|
defaultChain;
|
|
10
|
+
timeoutMs;
|
|
11
|
+
verbose;
|
|
9
12
|
constructor(config) {
|
|
10
13
|
this.apiKey = config.apiKey;
|
|
11
14
|
this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
|
|
12
15
|
this.graphqlUrl = config.graphqlUrl ?? DEFAULT_GRAPHQL_URL;
|
|
13
16
|
this.defaultChain = config.chain ?? "ethereum";
|
|
17
|
+
this.timeoutMs = config.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
18
|
+
this.verbose = config.verbose ?? false;
|
|
14
19
|
}
|
|
15
20
|
async get(path, params) {
|
|
16
21
|
const url = new URL(`${this.baseUrl}${path}`);
|
|
@@ -21,35 +26,64 @@ var OpenSeaClient = class {
|
|
|
21
26
|
}
|
|
22
27
|
}
|
|
23
28
|
}
|
|
29
|
+
if (this.verbose) {
|
|
30
|
+
console.error(`[verbose] GET ${url.toString()}`);
|
|
31
|
+
}
|
|
24
32
|
const response = await fetch(url.toString(), {
|
|
25
33
|
method: "GET",
|
|
26
34
|
headers: {
|
|
27
35
|
Accept: "application/json",
|
|
28
36
|
"x-api-key": this.apiKey
|
|
29
|
-
}
|
|
37
|
+
},
|
|
38
|
+
signal: AbortSignal.timeout(this.timeoutMs)
|
|
30
39
|
});
|
|
40
|
+
if (this.verbose) {
|
|
41
|
+
console.error(`[verbose] ${response.status} ${response.statusText}`);
|
|
42
|
+
}
|
|
31
43
|
if (!response.ok) {
|
|
32
44
|
const body = await response.text();
|
|
33
45
|
throw new OpenSeaAPIError(response.status, body, path);
|
|
34
46
|
}
|
|
35
47
|
return response.json();
|
|
36
48
|
}
|
|
37
|
-
async post(path) {
|
|
49
|
+
async post(path, body, params) {
|
|
38
50
|
const url = new URL(`${this.baseUrl}${path}`);
|
|
51
|
+
if (params) {
|
|
52
|
+
for (const [key, value] of Object.entries(params)) {
|
|
53
|
+
if (value !== void 0 && value !== null) {
|
|
54
|
+
url.searchParams.set(key, String(value));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const headers = {
|
|
59
|
+
Accept: "application/json",
|
|
60
|
+
"x-api-key": this.apiKey
|
|
61
|
+
};
|
|
62
|
+
if (body) {
|
|
63
|
+
headers["Content-Type"] = "application/json";
|
|
64
|
+
}
|
|
65
|
+
if (this.verbose) {
|
|
66
|
+
console.error(`[verbose] POST ${url.toString()}`);
|
|
67
|
+
}
|
|
39
68
|
const response = await fetch(url.toString(), {
|
|
40
69
|
method: "POST",
|
|
41
|
-
headers
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
70
|
+
headers,
|
|
71
|
+
body: body ? JSON.stringify(body) : void 0,
|
|
72
|
+
signal: AbortSignal.timeout(this.timeoutMs)
|
|
45
73
|
});
|
|
74
|
+
if (this.verbose) {
|
|
75
|
+
console.error(`[verbose] ${response.status} ${response.statusText}`);
|
|
76
|
+
}
|
|
46
77
|
if (!response.ok) {
|
|
47
|
-
const
|
|
48
|
-
throw new OpenSeaAPIError(response.status,
|
|
78
|
+
const text = await response.text();
|
|
79
|
+
throw new OpenSeaAPIError(response.status, text, path);
|
|
49
80
|
}
|
|
50
81
|
return response.json();
|
|
51
82
|
}
|
|
52
83
|
async graphql(query, variables) {
|
|
84
|
+
if (this.verbose) {
|
|
85
|
+
console.error(`[verbose] POST ${this.graphqlUrl}`);
|
|
86
|
+
}
|
|
53
87
|
const response = await fetch(this.graphqlUrl, {
|
|
54
88
|
method: "POST",
|
|
55
89
|
headers: {
|
|
@@ -57,8 +91,12 @@ var OpenSeaClient = class {
|
|
|
57
91
|
Accept: "application/json",
|
|
58
92
|
"x-api-key": this.apiKey
|
|
59
93
|
},
|
|
60
|
-
body: JSON.stringify({ query, variables })
|
|
94
|
+
body: JSON.stringify({ query, variables }),
|
|
95
|
+
signal: AbortSignal.timeout(this.timeoutMs)
|
|
61
96
|
});
|
|
97
|
+
if (this.verbose) {
|
|
98
|
+
console.error(`[verbose] ${response.status} ${response.statusText}`);
|
|
99
|
+
}
|
|
62
100
|
if (!response.ok) {
|
|
63
101
|
const body = await response.text();
|
|
64
102
|
throw new OpenSeaAPIError(response.status, body, "graphql");
|
|
@@ -379,14 +417,14 @@ var TokensAPI = class {
|
|
|
379
417
|
return this.client.get("/api/v2/tokens/trending", {
|
|
380
418
|
limit: options?.limit,
|
|
381
419
|
chains: options?.chains?.join(","),
|
|
382
|
-
cursor: options?.
|
|
420
|
+
cursor: options?.next
|
|
383
421
|
});
|
|
384
422
|
}
|
|
385
423
|
async top(options) {
|
|
386
424
|
return this.client.get("/api/v2/tokens/top", {
|
|
387
425
|
limit: options?.limit,
|
|
388
426
|
chains: options?.chains?.join(","),
|
|
389
|
-
cursor: options?.
|
|
427
|
+
cursor: options?.next
|
|
390
428
|
});
|
|
391
429
|
}
|
|
392
430
|
async get(chain, address) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../src/queries.ts","../src/sdk.ts"],"sourcesContent":["import type { OpenSeaClientConfig } from \"./types/index.js\"\n\nconst DEFAULT_BASE_URL = \"https://api.opensea.io\"\nconst DEFAULT_GRAPHQL_URL = \"https://gql.opensea.io/graphql\"\n\nexport class OpenSeaClient {\n private apiKey: string\n private baseUrl: string\n private graphqlUrl: string\n private defaultChain: string\n\n constructor(config: OpenSeaClientConfig) {\n this.apiKey = config.apiKey\n this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL\n this.graphqlUrl = config.graphqlUrl ?? DEFAULT_GRAPHQL_URL\n this.defaultChain = config.chain ?? \"ethereum\"\n }\n\n async get<T>(path: string, params?: Record<string, unknown>): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, path)\n }\n\n return response.json() as Promise<T>\n }\n\n async post<T>(path: string): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, path)\n }\n\n return response.json() as Promise<T>\n }\n\n async graphql<T>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<T> {\n const response = await fetch(this.graphqlUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n body: JSON.stringify({ query, variables }),\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, \"graphql\")\n }\n\n const json = (await response.json()) as {\n data?: T\n errors?: { message: string }[]\n }\n\n if (json.errors?.length) {\n throw new OpenSeaAPIError(\n 400,\n json.errors.map(e => e.message).join(\"; \"),\n \"graphql\",\n )\n }\n\n if (!json.data) {\n throw new OpenSeaAPIError(500, \"GraphQL response missing data\", \"graphql\")\n }\n\n return json.data\n }\n\n getDefaultChain(): string {\n return this.defaultChain\n }\n}\n\nexport class OpenSeaAPIError extends Error {\n constructor(\n public statusCode: number,\n public responseBody: string,\n public path: string,\n ) {\n super(`OpenSea API error ${statusCode} on ${path}: ${responseBody}`)\n this.name = \"OpenSeaAPIError\"\n }\n}\n","export const SEARCH_COLLECTIONS_QUERY = `\nquery SearchCollections($query: String!, $limit: Int, $chains: [ChainIdentifier!]) {\n collectionsByQuery(query: $query, limit: $limit, chains: $chains) {\n slug\n name\n description\n imageUrl\n chain {\n identifier\n name\n }\n stats {\n totalSupply\n ownerCount\n volume {\n usd\n }\n sales\n }\n floorPrice {\n pricePerItem {\n usd\n native {\n unit\n symbol\n }\n }\n }\n }\n}`\n\nexport const SEARCH_NFTS_QUERY = `\nquery SearchItems($query: String!, $collectionSlug: String, $limit: Int, $chains: [ChainIdentifier!]) {\n itemsByQuery(query: $query, collectionSlug: $collectionSlug, limit: $limit, chains: $chains) {\n tokenId\n name\n description\n imageUrl\n contractAddress\n collection {\n slug\n name\n }\n chain {\n identifier\n name\n }\n bestListing {\n pricePerItem {\n usd\n native {\n unit\n symbol\n }\n }\n }\n owner {\n address\n displayName\n }\n }\n}`\n\nexport const SEARCH_TOKENS_QUERY = `\nquery SearchCurrencies($query: String!, $limit: Int, $chain: ChainIdentifier) {\n currenciesByQuery(query: $query, limit: $limit, chain: $chain, allowlistOnly: false) {\n name\n symbol\n imageUrl\n usdPrice\n contractAddress\n chain {\n identifier\n name\n }\n stats {\n marketCapUsd\n oneDay {\n priceChange\n volume\n }\n }\n }\n}`\n\nexport const SEARCH_ACCOUNTS_QUERY = `\nquery SearchAccounts($query: String!, $limit: Int) {\n accountsByQuery(query: $query, limit: $limit) {\n address\n username\n imageUrl\n isVerified\n }\n}`\n","import { OpenSeaClient } from \"./client.js\"\nimport {\n SEARCH_ACCOUNTS_QUERY,\n SEARCH_COLLECTIONS_QUERY,\n SEARCH_NFTS_QUERY,\n SEARCH_TOKENS_QUERY,\n} from \"./queries.js\"\nimport type {\n Account,\n AssetEvent,\n Chain,\n Collection,\n CollectionOrderBy,\n CollectionStats,\n Contract,\n EventType,\n GetTraitsResponse,\n Listing,\n NFT,\n Offer,\n OpenSeaClientConfig,\n SearchAccountResult,\n SearchCollectionResult,\n SearchNFTResult,\n SearchTokenResult,\n SwapQuoteResponse,\n Token,\n TokenDetails,\n} from \"./types/index.js\"\n\nexport class OpenSeaCLI {\n private client: OpenSeaClient\n\n readonly collections: CollectionsAPI\n readonly nfts: NFTsAPI\n readonly listings: ListingsAPI\n readonly offers: OffersAPI\n readonly events: EventsAPI\n readonly accounts: AccountsAPI\n readonly tokens: TokensAPI\n readonly search: SearchAPI\n readonly swaps: SwapsAPI\n\n constructor(config: OpenSeaClientConfig) {\n this.client = new OpenSeaClient(config)\n this.collections = new CollectionsAPI(this.client)\n this.nfts = new NFTsAPI(this.client)\n this.listings = new ListingsAPI(this.client)\n this.offers = new OffersAPI(this.client)\n this.events = new EventsAPI(this.client)\n this.accounts = new AccountsAPI(this.client)\n this.tokens = new TokensAPI(this.client)\n this.search = new SearchAPI(this.client)\n this.swaps = new SwapsAPI(this.client)\n }\n}\n\nclass CollectionsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(slug: string): Promise<Collection> {\n return this.client.get<Collection>(`/api/v2/collections/${slug}`)\n }\n\n async list(options?: {\n chain?: Chain\n limit?: number\n next?: string\n orderBy?: CollectionOrderBy\n creatorUsername?: string\n includeHidden?: boolean\n }): Promise<{ collections: Collection[]; next?: string }> {\n return this.client.get(\"/api/v2/collections\", {\n chain: options?.chain,\n limit: options?.limit,\n next: options?.next,\n order_by: options?.orderBy,\n creator_username: options?.creatorUsername,\n include_hidden: options?.includeHidden,\n })\n }\n\n async stats(slug: string): Promise<CollectionStats> {\n return this.client.get<CollectionStats>(`/api/v2/collections/${slug}/stats`)\n }\n\n async traits(slug: string): Promise<GetTraitsResponse> {\n return this.client.get<GetTraitsResponse>(`/api/v2/traits/${slug}`)\n }\n}\n\nclass NFTsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(\n chain: Chain,\n address: string,\n identifier: string,\n ): Promise<{ nft: NFT }> {\n return this.client.get(\n `/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}`,\n )\n }\n\n async listByCollection(\n slug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/collection/${slug}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async listByContract(\n chain: Chain,\n address: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/chain/${chain}/contract/${address}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async listByAccount(\n chain: Chain,\n address: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/chain/${chain}/account/${address}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async refresh(\n chain: Chain,\n address: string,\n identifier: string,\n ): Promise<void> {\n await this.client.post(\n `/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}/refresh`,\n )\n }\n\n async getContract(chain: Chain, address: string): Promise<Contract> {\n return this.client.get(`/api/v2/chain/${chain}/contract/${address}`)\n }\n}\n\nclass ListingsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async all(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ listings: Listing[]; next?: string }> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/all`,\n { limit: options?.limit, next: options?.next },\n )\n }\n\n async best(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ listings: Listing[]; next?: string }> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/best`,\n { limit: options?.limit, next: options?.next },\n )\n }\n\n async bestForNFT(collectionSlug: string, tokenId: string): Promise<Listing> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/nfts/${tokenId}/best`,\n )\n }\n}\n\nclass OffersAPI {\n constructor(private client: OpenSeaClient) {}\n\n async all(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(`/api/v2/offers/collection/${collectionSlug}/all`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async collection(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(`/api/v2/offers/collection/${collectionSlug}`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async bestForNFT(collectionSlug: string, tokenId: string): Promise<Offer> {\n return this.client.get(\n `/api/v2/offers/collection/${collectionSlug}/nfts/${tokenId}/best`,\n )\n }\n\n async traits(\n collectionSlug: string,\n options: {\n type: string\n value: string\n limit?: number\n next?: string\n },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(\n `/api/v2/offers/collection/${collectionSlug}/traits`,\n {\n type: options.type,\n value: options.value,\n limit: options.limit,\n next: options.next,\n },\n )\n }\n}\n\nclass EventsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async list(options?: {\n eventType?: EventType\n after?: number\n before?: number\n limit?: number\n next?: string\n chain?: Chain\n }): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(\"/api/v2/events\", {\n event_type: options?.eventType,\n after: options?.after,\n before: options?.before,\n limit: options?.limit,\n next: options?.next,\n chain: options?.chain,\n })\n }\n\n async byAccount(\n address: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n chain?: Chain\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(`/api/v2/events/accounts/${address}`, {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n chain: options?.chain,\n })\n }\n\n async byCollection(\n collectionSlug: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(`/api/v2/events/collection/${collectionSlug}`, {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async byNFT(\n chain: Chain,\n address: string,\n identifier: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(\n `/api/v2/events/chain/${chain}/contract/${address}/nfts/${identifier}`,\n {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n },\n )\n }\n}\n\nclass AccountsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(address: string): Promise<Account> {\n return this.client.get(`/api/v2/accounts/${address}`)\n }\n}\n\nclass TokensAPI {\n constructor(private client: OpenSeaClient) {}\n\n async trending(options?: {\n limit?: number\n chains?: string[]\n cursor?: string\n }): Promise<{ tokens: Token[]; next?: string }> {\n return this.client.get(\"/api/v2/tokens/trending\", {\n limit: options?.limit,\n chains: options?.chains?.join(\",\"),\n cursor: options?.cursor,\n })\n }\n\n async top(options?: {\n limit?: number\n chains?: string[]\n cursor?: string\n }): Promise<{ tokens: Token[]; next?: string }> {\n return this.client.get(\"/api/v2/tokens/top\", {\n limit: options?.limit,\n chains: options?.chains?.join(\",\"),\n cursor: options?.cursor,\n })\n }\n\n async get(chain: Chain, address: string): Promise<TokenDetails> {\n return this.client.get(`/api/v2/chain/${chain}/token/${address}`)\n }\n}\n\nclass SearchAPI {\n constructor(private client: OpenSeaClient) {}\n\n async collections(\n query: string,\n options?: { chains?: string[]; limit?: number },\n ): Promise<SearchCollectionResult[]> {\n const result = await this.client.graphql<{\n collectionsByQuery: SearchCollectionResult[]\n }>(SEARCH_COLLECTIONS_QUERY, {\n query,\n limit: options?.limit,\n chains: options?.chains,\n })\n return result.collectionsByQuery\n }\n\n async nfts(\n query: string,\n options?: { collection?: string; chains?: string[]; limit?: number },\n ): Promise<SearchNFTResult[]> {\n const result = await this.client.graphql<{\n itemsByQuery: SearchNFTResult[]\n }>(SEARCH_NFTS_QUERY, {\n query,\n collectionSlug: options?.collection,\n limit: options?.limit,\n chains: options?.chains,\n })\n return result.itemsByQuery\n }\n\n async tokens(\n query: string,\n options?: { chain?: string; limit?: number },\n ): Promise<SearchTokenResult[]> {\n const result = await this.client.graphql<{\n currenciesByQuery: SearchTokenResult[]\n }>(SEARCH_TOKENS_QUERY, {\n query,\n limit: options?.limit,\n chain: options?.chain,\n })\n return result.currenciesByQuery\n }\n\n async accounts(\n query: string,\n options?: { limit?: number },\n ): Promise<SearchAccountResult[]> {\n const result = await this.client.graphql<{\n accountsByQuery: SearchAccountResult[]\n }>(SEARCH_ACCOUNTS_QUERY, {\n query,\n limit: options?.limit,\n })\n return result.accountsByQuery\n }\n}\n\nclass SwapsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async quote(options: {\n fromChain: string\n fromAddress: string\n toChain: string\n toAddress: string\n quantity: string\n address: string\n slippage?: number\n recipient?: string\n }): Promise<SwapQuoteResponse> {\n return this.client.get(\"/api/v2/swap/quote\", {\n from_chain: options.fromChain,\n from_address: options.fromAddress,\n to_chain: options.toChain,\n to_address: options.toAddress,\n quantity: options.quantity,\n address: options.address,\n slippage: options.slippage,\n recipient: options.recipient,\n })\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/queries.ts","../src/sdk.ts"],"sourcesContent":["import type { OpenSeaClientConfig } from \"./types/index.js\"\n\nconst DEFAULT_BASE_URL = \"https://api.opensea.io\"\nconst DEFAULT_GRAPHQL_URL = \"https://gql.opensea.io/graphql\"\nconst DEFAULT_TIMEOUT_MS = 30_000\n\nexport class OpenSeaClient {\n private apiKey: string\n private baseUrl: string\n private graphqlUrl: string\n private defaultChain: string\n private timeoutMs: number\n private verbose: boolean\n\n constructor(config: OpenSeaClientConfig) {\n this.apiKey = config.apiKey\n this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL\n this.graphqlUrl = config.graphqlUrl ?? DEFAULT_GRAPHQL_URL\n this.defaultChain = config.chain ?? \"ethereum\"\n this.timeoutMs = config.timeout ?? DEFAULT_TIMEOUT_MS\n this.verbose = config.verbose ?? false\n }\n\n async get<T>(path: string, params?: Record<string, unknown>): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n if (this.verbose) {\n console.error(`[verbose] GET ${url.toString()}`)\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n signal: AbortSignal.timeout(this.timeoutMs),\n })\n\n if (this.verbose) {\n console.error(`[verbose] ${response.status} ${response.statusText}`)\n }\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, path)\n }\n\n return response.json() as Promise<T>\n }\n\n async post<T>(\n path: string,\n body?: Record<string, unknown>,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n }\n\n if (body) {\n headers[\"Content-Type\"] = \"application/json\"\n }\n\n if (this.verbose) {\n console.error(`[verbose] POST ${url.toString()}`)\n }\n\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(this.timeoutMs),\n })\n\n if (this.verbose) {\n console.error(`[verbose] ${response.status} ${response.statusText}`)\n }\n\n if (!response.ok) {\n const text = await response.text()\n throw new OpenSeaAPIError(response.status, text, path)\n }\n\n return response.json() as Promise<T>\n }\n\n async graphql<T>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<T> {\n if (this.verbose) {\n console.error(`[verbose] POST ${this.graphqlUrl}`)\n }\n\n const response = await fetch(this.graphqlUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n body: JSON.stringify({ query, variables }),\n signal: AbortSignal.timeout(this.timeoutMs),\n })\n\n if (this.verbose) {\n console.error(`[verbose] ${response.status} ${response.statusText}`)\n }\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, \"graphql\")\n }\n\n const json = (await response.json()) as {\n data?: T\n errors?: { message: string }[]\n }\n\n if (json.errors?.length) {\n throw new OpenSeaAPIError(\n 400,\n json.errors.map(e => e.message).join(\"; \"),\n \"graphql\",\n )\n }\n\n if (!json.data) {\n throw new OpenSeaAPIError(500, \"GraphQL response missing data\", \"graphql\")\n }\n\n return json.data\n }\n\n getDefaultChain(): string {\n return this.defaultChain\n }\n}\n\nexport class OpenSeaAPIError extends Error {\n constructor(\n public statusCode: number,\n public responseBody: string,\n public path: string,\n ) {\n super(`OpenSea API error ${statusCode} on ${path}: ${responseBody}`)\n this.name = \"OpenSeaAPIError\"\n }\n}\n","export const SEARCH_COLLECTIONS_QUERY = `\nquery SearchCollections($query: String!, $limit: Int, $chains: [ChainIdentifier!]) {\n collectionsByQuery(query: $query, limit: $limit, chains: $chains) {\n slug\n name\n description\n imageUrl\n chain {\n identifier\n name\n }\n stats {\n totalSupply\n ownerCount\n volume {\n usd\n }\n sales\n }\n floorPrice {\n pricePerItem {\n usd\n native {\n unit\n symbol\n }\n }\n }\n }\n}`\n\nexport const SEARCH_NFTS_QUERY = `\nquery SearchItems($query: String!, $collectionSlug: String, $limit: Int, $chains: [ChainIdentifier!]) {\n itemsByQuery(query: $query, collectionSlug: $collectionSlug, limit: $limit, chains: $chains) {\n tokenId\n name\n description\n imageUrl\n contractAddress\n collection {\n slug\n name\n }\n chain {\n identifier\n name\n }\n bestListing {\n pricePerItem {\n usd\n native {\n unit\n symbol\n }\n }\n }\n owner {\n address\n displayName\n }\n }\n}`\n\nexport const SEARCH_TOKENS_QUERY = `\nquery SearchCurrencies($query: String!, $limit: Int, $chain: ChainIdentifier) {\n currenciesByQuery(query: $query, limit: $limit, chain: $chain, allowlistOnly: false) {\n name\n symbol\n imageUrl\n usdPrice\n contractAddress\n chain {\n identifier\n name\n }\n stats {\n marketCapUsd\n oneDay {\n priceChange\n volume\n }\n }\n }\n}`\n\nexport const SEARCH_ACCOUNTS_QUERY = `\nquery SearchAccounts($query: String!, $limit: Int) {\n accountsByQuery(query: $query, limit: $limit) {\n address\n username\n imageUrl\n isVerified\n }\n}`\n","import { OpenSeaClient } from \"./client.js\"\nimport {\n SEARCH_ACCOUNTS_QUERY,\n SEARCH_COLLECTIONS_QUERY,\n SEARCH_NFTS_QUERY,\n SEARCH_TOKENS_QUERY,\n} from \"./queries.js\"\nimport type {\n Account,\n AssetEvent,\n Chain,\n Collection,\n CollectionOrderBy,\n CollectionStats,\n Contract,\n EventType,\n GetTraitsResponse,\n Listing,\n NFT,\n Offer,\n OpenSeaClientConfig,\n SearchAccountResult,\n SearchCollectionResult,\n SearchNFTResult,\n SearchTokenResult,\n SwapQuoteResponse,\n Token,\n TokenDetails,\n} from \"./types/index.js\"\n\nexport class OpenSeaCLI {\n private client: OpenSeaClient\n\n readonly collections: CollectionsAPI\n readonly nfts: NFTsAPI\n readonly listings: ListingsAPI\n readonly offers: OffersAPI\n readonly events: EventsAPI\n readonly accounts: AccountsAPI\n readonly tokens: TokensAPI\n readonly search: SearchAPI\n readonly swaps: SwapsAPI\n\n constructor(config: OpenSeaClientConfig) {\n this.client = new OpenSeaClient(config)\n this.collections = new CollectionsAPI(this.client)\n this.nfts = new NFTsAPI(this.client)\n this.listings = new ListingsAPI(this.client)\n this.offers = new OffersAPI(this.client)\n this.events = new EventsAPI(this.client)\n this.accounts = new AccountsAPI(this.client)\n this.tokens = new TokensAPI(this.client)\n this.search = new SearchAPI(this.client)\n this.swaps = new SwapsAPI(this.client)\n }\n}\n\nclass CollectionsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(slug: string): Promise<Collection> {\n return this.client.get<Collection>(`/api/v2/collections/${slug}`)\n }\n\n async list(options?: {\n chain?: Chain\n limit?: number\n next?: string\n orderBy?: CollectionOrderBy\n creatorUsername?: string\n includeHidden?: boolean\n }): Promise<{ collections: Collection[]; next?: string }> {\n return this.client.get(\"/api/v2/collections\", {\n chain: options?.chain,\n limit: options?.limit,\n next: options?.next,\n order_by: options?.orderBy,\n creator_username: options?.creatorUsername,\n include_hidden: options?.includeHidden,\n })\n }\n\n async stats(slug: string): Promise<CollectionStats> {\n return this.client.get<CollectionStats>(`/api/v2/collections/${slug}/stats`)\n }\n\n async traits(slug: string): Promise<GetTraitsResponse> {\n return this.client.get<GetTraitsResponse>(`/api/v2/traits/${slug}`)\n }\n}\n\nclass NFTsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(\n chain: Chain,\n address: string,\n identifier: string,\n ): Promise<{ nft: NFT }> {\n return this.client.get(\n `/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}`,\n )\n }\n\n async listByCollection(\n slug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/collection/${slug}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async listByContract(\n chain: Chain,\n address: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/chain/${chain}/contract/${address}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async listByAccount(\n chain: Chain,\n address: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/chain/${chain}/account/${address}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async refresh(\n chain: Chain,\n address: string,\n identifier: string,\n ): Promise<void> {\n await this.client.post(\n `/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}/refresh`,\n )\n }\n\n async getContract(chain: Chain, address: string): Promise<Contract> {\n return this.client.get(`/api/v2/chain/${chain}/contract/${address}`)\n }\n}\n\nclass ListingsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async all(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ listings: Listing[]; next?: string }> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/all`,\n { limit: options?.limit, next: options?.next },\n )\n }\n\n async best(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ listings: Listing[]; next?: string }> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/best`,\n { limit: options?.limit, next: options?.next },\n )\n }\n\n async bestForNFT(collectionSlug: string, tokenId: string): Promise<Listing> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/nfts/${tokenId}/best`,\n )\n }\n}\n\nclass OffersAPI {\n constructor(private client: OpenSeaClient) {}\n\n async all(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(`/api/v2/offers/collection/${collectionSlug}/all`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async collection(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(`/api/v2/offers/collection/${collectionSlug}`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async bestForNFT(collectionSlug: string, tokenId: string): Promise<Offer> {\n return this.client.get(\n `/api/v2/offers/collection/${collectionSlug}/nfts/${tokenId}/best`,\n )\n }\n\n async traits(\n collectionSlug: string,\n options: {\n type: string\n value: string\n limit?: number\n next?: string\n },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(\n `/api/v2/offers/collection/${collectionSlug}/traits`,\n {\n type: options.type,\n value: options.value,\n limit: options.limit,\n next: options.next,\n },\n )\n }\n}\n\nclass EventsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async list(options?: {\n eventType?: EventType\n after?: number\n before?: number\n limit?: number\n next?: string\n chain?: Chain\n }): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(\"/api/v2/events\", {\n event_type: options?.eventType,\n after: options?.after,\n before: options?.before,\n limit: options?.limit,\n next: options?.next,\n chain: options?.chain,\n })\n }\n\n async byAccount(\n address: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n chain?: Chain\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(`/api/v2/events/accounts/${address}`, {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n chain: options?.chain,\n })\n }\n\n async byCollection(\n collectionSlug: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(`/api/v2/events/collection/${collectionSlug}`, {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async byNFT(\n chain: Chain,\n address: string,\n identifier: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(\n `/api/v2/events/chain/${chain}/contract/${address}/nfts/${identifier}`,\n {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n },\n )\n }\n}\n\nclass AccountsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(address: string): Promise<Account> {\n return this.client.get(`/api/v2/accounts/${address}`)\n }\n}\n\nclass TokensAPI {\n constructor(private client: OpenSeaClient) {}\n\n async trending(options?: {\n limit?: number\n chains?: string[]\n next?: string\n }): Promise<{ tokens: Token[]; next?: string }> {\n // The tokens API uses \"cursor\" as its query param instead of \"next\".\n // The SDK accepts \"next\" for consistency with all other endpoints.\n return this.client.get(\"/api/v2/tokens/trending\", {\n limit: options?.limit,\n chains: options?.chains?.join(\",\"),\n cursor: options?.next,\n })\n }\n\n async top(options?: {\n limit?: number\n chains?: string[]\n next?: string\n }): Promise<{ tokens: Token[]; next?: string }> {\n // The tokens API uses \"cursor\" as its query param instead of \"next\".\n // The SDK accepts \"next\" for consistency with all other endpoints.\n return this.client.get(\"/api/v2/tokens/top\", {\n limit: options?.limit,\n chains: options?.chains?.join(\",\"),\n cursor: options?.next,\n })\n }\n\n async get(chain: Chain, address: string): Promise<TokenDetails> {\n return this.client.get(`/api/v2/chain/${chain}/token/${address}`)\n }\n}\n\nclass SearchAPI {\n constructor(private client: OpenSeaClient) {}\n\n async collections(\n query: string,\n options?: { chains?: string[]; limit?: number },\n ): Promise<SearchCollectionResult[]> {\n const result = await this.client.graphql<{\n collectionsByQuery: SearchCollectionResult[]\n }>(SEARCH_COLLECTIONS_QUERY, {\n query,\n limit: options?.limit,\n chains: options?.chains,\n })\n return result.collectionsByQuery\n }\n\n async nfts(\n query: string,\n options?: { collection?: string; chains?: string[]; limit?: number },\n ): Promise<SearchNFTResult[]> {\n const result = await this.client.graphql<{\n itemsByQuery: SearchNFTResult[]\n }>(SEARCH_NFTS_QUERY, {\n query,\n collectionSlug: options?.collection,\n limit: options?.limit,\n chains: options?.chains,\n })\n return result.itemsByQuery\n }\n\n async tokens(\n query: string,\n options?: { chain?: string; limit?: number },\n ): Promise<SearchTokenResult[]> {\n const result = await this.client.graphql<{\n currenciesByQuery: SearchTokenResult[]\n }>(SEARCH_TOKENS_QUERY, {\n query,\n limit: options?.limit,\n chain: options?.chain,\n })\n return result.currenciesByQuery\n }\n\n async accounts(\n query: string,\n options?: { limit?: number },\n ): Promise<SearchAccountResult[]> {\n const result = await this.client.graphql<{\n accountsByQuery: SearchAccountResult[]\n }>(SEARCH_ACCOUNTS_QUERY, {\n query,\n limit: options?.limit,\n })\n return result.accountsByQuery\n }\n}\n\nclass SwapsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async quote(options: {\n fromChain: string\n fromAddress: string\n toChain: string\n toAddress: string\n quantity: string\n address: string\n slippage?: number\n recipient?: string\n }): Promise<SwapQuoteResponse> {\n return this.client.get(\"/api/v2/swap/quote\", {\n from_chain: options.fromChain,\n from_address: options.fromAddress,\n to_chain: options.toChain,\n to_address: options.toAddress,\n quantity: options.quantity,\n address: options.address,\n slippage: options.slippage,\n recipient: options.recipient,\n })\n }\n}\n"],"mappings":"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","names":[]}
|