@opensea/cli 0.4.1 → 0.4.2
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 +2 -1
- package/dist/cli.js +248 -55
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +23 -1
- package/dist/index.js +195 -35
- 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/toon.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/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 type { OutputFormat } from \"./output.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, table, or toon)\", \"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(): OutputFormat {\n const opts = program.opts<{ format: string }>()\n if (opts.format === \"table\") return \"table\"\n if (opts.format === \"toon\") return \"toon\"\n return \"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_TIMEOUT_MS = 30_000\n\nexport class OpenSeaClient {\n private apiKey: string\n private baseUrl: 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.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 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 type { OutputFormat } from \"../output.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { Account } from \"../types/index.js\"\n\nexport function accountsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => OutputFormat,\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","const INDENT = \" \"\n\nconst NUMERIC_RE = /^-?\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?$/i\nconst LEADING_ZERO_RE = /^0\\d+$/\nconst UNQUOTED_KEY_RE = /^[A-Za-z_][A-Za-z0-9_.]*$/\n\nfunction escapeString(s: string): string {\n return s\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\")\n}\n\nfunction needsQuoting(value: string, delimiter: string): boolean {\n if (value === \"\") return true\n if (value !== value.trim()) return true\n if (value === \"true\" || value === \"false\" || value === \"null\") return true\n if (NUMERIC_RE.test(value) || LEADING_ZERO_RE.test(value)) return true\n if (/[:\"\\\\[\\]{}]/.test(value)) return true\n if (/[\\n\\r\\t]/.test(value)) return true\n if (value.includes(delimiter)) return true\n if (value.startsWith(\"-\")) return true\n return false\n}\n\nfunction encodeKey(key: string): string {\n if (UNQUOTED_KEY_RE.test(key)) return key\n return `\"${escapeString(key)}\"`\n}\n\nfunction encodePrimitive(value: unknown, delimiter: string): string {\n if (value === null) return \"null\"\n if (value === undefined) return \"null\"\n if (typeof value === \"boolean\") return String(value)\n if (typeof value === \"number\") return String(value)\n if (typeof value === \"string\") {\n if (needsQuoting(value, delimiter)) {\n return `\"${escapeString(value)}\"`\n }\n return value\n }\n return `\"${escapeString(String(value))}\"`\n}\n\nfunction isPrimitive(value: unknown): boolean {\n return (\n value === null ||\n value === undefined ||\n typeof value === \"boolean\" ||\n typeof value === \"number\" ||\n typeof value === \"string\"\n )\n}\n\nfunction isTabular(arr: unknown[]): boolean {\n if (arr.length === 0) return false\n const first = arr[0]\n if (first === null || typeof first !== \"object\" || Array.isArray(first))\n return false\n const keys = Object.keys(first as Record<string, unknown>).sort()\n for (const item of arr) {\n if (item === null || typeof item !== \"object\" || Array.isArray(item))\n return false\n const itemKeys = Object.keys(item as Record<string, unknown>).sort()\n if (itemKeys.length !== keys.length) return false\n for (let i = 0; i < keys.length; i++) {\n if (itemKeys[i] !== keys[i]) return false\n }\n for (const k of keys) {\n if (!isPrimitive((item as Record<string, unknown>)[k])) return false\n }\n }\n return true\n}\n\nfunction isPrimitiveArray(arr: unknown[]): boolean {\n return arr.every(isPrimitive)\n}\n\nfunction encodeValue(value: unknown, depth: number, delimiter: string): string {\n if (isPrimitive(value)) {\n return encodePrimitive(value, delimiter)\n }\n\n if (Array.isArray(value)) {\n return encodeArray(value, depth, delimiter)\n }\n\n if (typeof value === \"object\" && value !== null) {\n return encodeObject(value as Record<string, unknown>, depth, delimiter)\n }\n\n return encodePrimitive(value, delimiter)\n}\n\nfunction encodeObject(\n obj: Record<string, unknown>,\n depth: number,\n delimiter: string,\n): string {\n const entries = Object.entries(obj)\n if (entries.length === 0) return \"\"\n\n const lines: string[] = []\n const prefix = INDENT.repeat(depth)\n\n for (const [key, value] of entries) {\n const encodedKey = encodeKey(key)\n\n if (isPrimitive(value)) {\n lines.push(`${prefix}${encodedKey}: ${encodePrimitive(value, delimiter)}`)\n } else if (Array.isArray(value)) {\n lines.push(encodeArrayField(encodedKey, value, depth, delimiter))\n } else if (typeof value === \"object\" && value !== null) {\n const nested = value as Record<string, unknown>\n if (Object.keys(nested).length === 0) {\n lines.push(`${prefix}${encodedKey}:`)\n } else {\n lines.push(`${prefix}${encodedKey}:`)\n lines.push(encodeObject(nested, depth + 1, delimiter))\n }\n }\n }\n\n return lines.join(\"\\n\")\n}\n\nfunction encodeArrayField(\n encodedKey: string,\n arr: unknown[],\n depth: number,\n delimiter: string,\n): string {\n const prefix = INDENT.repeat(depth)\n\n if (arr.length === 0) {\n return `${prefix}${encodedKey}[0]:`\n }\n\n if (isPrimitiveArray(arr)) {\n const values = arr.map(v => encodePrimitive(v, delimiter)).join(delimiter)\n return `${prefix}${encodedKey}[${arr.length}]: ${values}`\n }\n\n if (isTabular(arr)) {\n const firstObj = arr[0] as Record<string, unknown>\n const fields = Object.keys(firstObj)\n const fieldHeader = fields.map(encodeKey).join(delimiter)\n const lines: string[] = []\n lines.push(`${prefix}${encodedKey}[${arr.length}]{${fieldHeader}}:`)\n const rowPrefix = INDENT.repeat(depth + 1)\n for (const item of arr) {\n const obj = item as Record<string, unknown>\n const row = fields\n .map(f => encodePrimitive(obj[f], delimiter))\n .join(delimiter)\n lines.push(`${rowPrefix}${row}`)\n }\n return lines.join(\"\\n\")\n }\n\n return encodeExpandedList(encodedKey, arr, depth, delimiter)\n}\n\nfunction encodeExpandedList(\n encodedKey: string,\n arr: unknown[],\n depth: number,\n delimiter: string,\n): string {\n const prefix = INDENT.repeat(depth)\n const itemPrefix = INDENT.repeat(depth + 1)\n const lines: string[] = []\n lines.push(`${prefix}${encodedKey}[${arr.length}]:`)\n\n for (const item of arr) {\n if (isPrimitive(item)) {\n lines.push(`${itemPrefix}- ${encodePrimitive(item, delimiter)}`)\n } else if (Array.isArray(item)) {\n if (isPrimitiveArray(item)) {\n const values = item\n .map(v => encodePrimitive(v, delimiter))\n .join(delimiter)\n lines.push(`${itemPrefix}- [${item.length}]: ${values}`)\n } else {\n lines.push(`${itemPrefix}- [${item.length}]:`)\n for (const inner of item) {\n lines.push(encodeValue(inner, depth + 2, delimiter))\n }\n }\n } else if (typeof item === \"object\" && item !== null) {\n const obj = item as Record<string, unknown>\n const entries = Object.entries(obj)\n if (entries.length === 0) {\n lines.push(`${itemPrefix}-`)\n } else {\n const [firstKey, firstValue] = entries[0]\n const ek = encodeKey(firstKey)\n\n if (Array.isArray(firstValue)) {\n const arrayLine = encodeArrayField(ek, firstValue, 0, delimiter)\n lines.push(`${itemPrefix}- ${arrayLine.trimStart()}`)\n } else if (isPrimitive(firstValue)) {\n lines.push(\n `${itemPrefix}- ${ek}: ${encodePrimitive(firstValue, delimiter)}`,\n )\n } else {\n lines.push(`${itemPrefix}- ${ek}:`)\n lines.push(\n encodeObject(\n firstValue as Record<string, unknown>,\n depth + 2,\n delimiter,\n ),\n )\n }\n\n for (let i = 1; i < entries.length; i++) {\n const [k, v] = entries[i]\n const encodedK = encodeKey(k)\n if (isPrimitive(v)) {\n lines.push(\n `${INDENT.repeat(depth + 2)}${encodedK}: ${encodePrimitive(v, delimiter)}`,\n )\n } else if (Array.isArray(v)) {\n lines.push(encodeArrayField(encodedK, v, depth + 2, delimiter))\n } else if (typeof v === \"object\" && v !== null) {\n lines.push(`${INDENT.repeat(depth + 2)}${encodedK}:`)\n lines.push(\n encodeObject(v as Record<string, unknown>, depth + 3, delimiter),\n )\n }\n }\n }\n }\n }\n\n return lines.join(\"\\n\")\n}\n\nfunction encodeArray(arr: unknown[], depth: number, delimiter: string): string {\n const prefix = INDENT.repeat(depth)\n\n if (arr.length === 0) {\n return `${prefix}[0]:`\n }\n\n if (isPrimitiveArray(arr)) {\n const values = arr.map(v => encodePrimitive(v, delimiter)).join(delimiter)\n return `${prefix}[${arr.length}]: ${values}`\n }\n\n if (isTabular(arr)) {\n const firstObj = arr[0] as Record<string, unknown>\n const fields = Object.keys(firstObj)\n const fieldHeader = fields.map(encodeKey).join(delimiter)\n const lines: string[] = []\n lines.push(`${prefix}[${arr.length}]{${fieldHeader}}:`)\n const rowPrefix = INDENT.repeat(depth + 1)\n for (const item of arr) {\n const obj = item as Record<string, unknown>\n const row = fields\n .map(f => encodePrimitive(obj[f], delimiter))\n .join(delimiter)\n lines.push(`${rowPrefix}${row}`)\n }\n return lines.join(\"\\n\")\n }\n\n const lines: string[] = []\n lines.push(`${prefix}[${arr.length}]:`)\n const itemPrefix = INDENT.repeat(depth + 1)\n for (const item of arr) {\n if (isPrimitive(item)) {\n lines.push(`${itemPrefix}- ${encodePrimitive(item, delimiter)}`)\n } else if (Array.isArray(item)) {\n if (isPrimitiveArray(item)) {\n const values = item\n .map(v => encodePrimitive(v, delimiter))\n .join(delimiter)\n lines.push(`${itemPrefix}- [${item.length}]: ${values}`)\n } else {\n lines.push(`${itemPrefix}- [${item.length}]:`)\n }\n } else if (typeof item === \"object\" && item !== null) {\n const obj = item as Record<string, unknown>\n const entries = Object.entries(obj)\n if (entries.length > 0) {\n const [firstKey, firstValue] = entries[0]\n const ek = encodeKey(firstKey)\n if (isPrimitive(firstValue)) {\n lines.push(\n `${itemPrefix}- ${ek}: ${encodePrimitive(firstValue, delimiter)}`,\n )\n } else {\n lines.push(`${itemPrefix}- ${ek}:`)\n lines.push(encodeValue(firstValue, depth + 2, delimiter))\n }\n for (let i = 1; i < entries.length; i++) {\n const [k, v] = entries[i]\n const encodedK = encodeKey(k)\n if (isPrimitive(v)) {\n lines.push(\n `${INDENT.repeat(depth + 2)}${encodedK}: ${encodePrimitive(v, delimiter)}`,\n )\n } else if (Array.isArray(v)) {\n lines.push(encodeArrayField(encodedK, v, depth + 2, delimiter))\n } else if (typeof v === \"object\" && v !== null) {\n lines.push(`${INDENT.repeat(depth + 2)}${encodedK}:`)\n lines.push(\n encodeObject(v as Record<string, unknown>, depth + 3, delimiter),\n )\n }\n }\n }\n }\n }\n\n return lines.join(\"\\n\")\n}\n\nexport function formatToon(data: unknown): string {\n if (isPrimitive(data)) {\n return encodePrimitive(data, \",\")\n }\n\n if (Array.isArray(data)) {\n return encodeArray(data, 0, \",\")\n }\n\n if (typeof data === \"object\" && data !== null) {\n return encodeObject(data as Record<string, unknown>, 0, \",\")\n }\n\n return String(data)\n}\n","import { formatToon } from \"./toon.js\"\n\nexport type OutputFormat = \"json\" | \"table\" | \"toon\"\n\nexport function formatOutput(data: unknown, format: OutputFormat): string {\n if (format === \"table\") {\n return formatTable(data)\n }\n if (format === \"toon\") {\n return formatToon(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 type { OutputFormat } from \"../output.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: () => OutputFormat,\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 type { OutputFormat } from \"../output.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: () => OutputFormat,\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 type { OutputFormat } from \"../output.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: () => OutputFormat,\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 type { OutputFormat } from \"../output.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: () => OutputFormat,\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 type { OutputFormat } from \"../output.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: () => OutputFormat,\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 type { OutputFormat } from \"../output.js\"\nimport { formatOutput } from \"../output.js\"\nimport { parseIntOption } from \"../parse.js\"\nimport type { SearchResponse } from \"../types/index.js\"\n\nexport function searchCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => OutputFormat,\n): Command {\n const cmd = new Command(\"search\")\n .description(\"Search across collections, tokens, NFTs, and accounts\")\n .argument(\"<query>\", \"Search query\")\n .option(\n \"--types <types>\",\n \"Filter by type (comma-separated: collection,nft,token,account)\",\n )\n .option(\"--chains <chains>\", \"Filter by chains (comma-separated)\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .action(\n async (\n query: string,\n options: {\n types?: string\n chains?: string\n limit: string\n },\n ) => {\n const client = getClient()\n const params: Record<string, unknown> = {\n query,\n limit: parseIntOption(options.limit, \"--limit\"),\n }\n if (options.types) {\n params.asset_types = options.types\n }\n if (options.chains) {\n params.chains = options.chains\n }\n const result = await client.get<SearchResponse>(\n \"/api/v2/search\",\n params,\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 type { OutputFormat } from \"../output.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: () => OutputFormat,\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 type { OutputFormat } from \"../output.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: () => OutputFormat,\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","lines","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/toon.ts","../src/output.ts","../src/commands/collections.ts","../src/parse.ts","../src/commands/events.ts","../src/commands/health.ts","../src/health.ts","../src/commands/listings.ts","../src/commands/nfts.ts","../src/commands/offers.ts","../src/commands/search.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 healthCommand,\n listingsCommand,\n nftsCommand,\n offersCommand,\n searchCommand,\n swapsCommand,\n tokensCommand,\n} from \"./commands/index.js\"\nimport { type OutputFormat, setOutputOptions } from \"./output.js\"\nimport { parseIntOption } from \"./parse.js\"\n\nconst EXIT_API_ERROR = 1\nconst EXIT_AUTH_ERROR = 2\nconst EXIT_RATE_LIMITED = 3\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, table, or toon)\", \"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 .option(\n \"--fields <fields>\",\n \"Comma-separated list of fields to include in output\",\n )\n .option(\"--max-lines <lines>\", \"Truncate output after N lines\")\n .option(\"--max-retries <n>\", \"Max retries on 429/5xx (0 to disable)\", \"3\")\n .option(\"--no-retry\", \"Disable request retries\")\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 maxRetries: string\n retry: 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(EXIT_AUTH_ERROR)\n }\n\n const maxRetries = opts.retry\n ? parseIntOption(opts.maxRetries, \"--max-retries\")\n : 0\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 maxRetries,\n })\n}\n\nfunction getFormat(): OutputFormat {\n const opts = program.opts<{ format: string }>()\n if (opts.format === \"table\") return \"table\"\n if (opts.format === \"toon\") return \"toon\"\n return \"json\"\n}\n\nprogram.hook(\"preAction\", () => {\n const opts = program.opts<{\n fields?: string\n maxLines?: string\n }>()\n let maxLines: number | undefined\n if (opts.maxLines) {\n maxLines = parseIntOption(opts.maxLines, \"--max-lines\")\n if (maxLines < 1) {\n console.error(\"Error: --max-lines must be >= 1\")\n process.exit(2)\n }\n }\n setOutputOptions({\n fields: opts.fields?.split(\",\").map(f => f.trim()),\n maxLines,\n })\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))\nprogram.addCommand(healthCommand(getClient, getFormat))\n\nasync function main() {\n try {\n await program.parseAsync(process.argv)\n } catch (error) {\n if (error instanceof OpenSeaAPIError) {\n const isRateLimited = error.statusCode === 429\n console.error(\n JSON.stringify(\n {\n error: isRateLimited ? \"Rate Limited\" : \"API Error\",\n status: error.statusCode,\n path: error.path,\n message: error.responseBody,\n },\n null,\n 2,\n ),\n )\n process.exit(isRateLimited ? EXIT_RATE_LIMITED : EXIT_API_ERROR)\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(EXIT_API_ERROR)\n }\n}\n\nmain()\n","import type { OpenSeaClientConfig } from \"./types/index.js\"\n\ndeclare const __VERSION__: string\n\nconst DEFAULT_BASE_URL = \"https://api.opensea.io\"\nconst DEFAULT_TIMEOUT_MS = 30_000\nconst USER_AGENT = `opensea-cli/${__VERSION__}`\nconst DEFAULT_MAX_RETRIES = 0\nconst DEFAULT_RETRY_BASE_DELAY_MS = 1_000\n\nfunction isRetryableStatus(status: number, method: string): boolean {\n if (status === 429) return true\n return status >= 500 && method === \"GET\"\n}\n\nfunction parseRetryAfter(header: string | null): number | undefined {\n if (!header) return undefined\n const seconds = Number(header)\n if (!Number.isNaN(seconds)) return seconds * 1000\n const date = Date.parse(header)\n if (!Number.isNaN(date)) return Math.max(0, date - Date.now())\n return undefined\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nexport class OpenSeaClient {\n private apiKey: string\n private baseUrl: string\n private defaultChain: string\n private timeoutMs: number\n private verbose: boolean\n private maxRetries: number\n private retryBaseDelay: number\n\n constructor(config: OpenSeaClientConfig) {\n this.apiKey = config.apiKey\n this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL\n this.defaultChain = config.chain ?? \"ethereum\"\n this.timeoutMs = config.timeout ?? DEFAULT_TIMEOUT_MS\n this.verbose = config.verbose ?? false\n this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES\n this.retryBaseDelay = config.retryBaseDelay ?? DEFAULT_RETRY_BASE_DELAY_MS\n }\n\n private get defaultHeaders(): Record<string, string> {\n return {\n Accept: \"application/json\",\n \"User-Agent\": USER_AGENT,\n \"x-api-key\": this.apiKey,\n }\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 this.fetchWithRetry(\n url.toString(),\n {\n method: \"GET\",\n headers: this.defaultHeaders,\n },\n 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> = { ...this.defaultHeaders }\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 this.fetchWithRetry(\n url.toString(),\n {\n method: \"POST\",\n headers,\n body: body ? JSON.stringify(body) : undefined,\n },\n path,\n )\n\n return response.json() as Promise<T>\n }\n\n getDefaultChain(): string {\n return this.defaultChain\n }\n\n getApiKeyPrefix(): string {\n if (this.apiKey.length < 8) return \"***\"\n return `${this.apiKey.slice(0, 4)}...`\n }\n\n private async fetchWithRetry(\n url: string,\n init: RequestInit,\n path: string,\n ): Promise<Response> {\n for (let attempt = 0; ; attempt++) {\n const response = await fetch(url, {\n ...init,\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 return response\n }\n\n const method = init.method ?? \"GET\"\n if (\n attempt < this.maxRetries &&\n isRetryableStatus(response.status, method)\n ) {\n const retryAfterMs = parseRetryAfter(\n response.headers.get(\"Retry-After\"),\n )\n const backoffMs = this.retryBaseDelay * 2 ** attempt\n const jitterMs = Math.random() * this.retryBaseDelay\n const delayMs = Math.max(retryAfterMs ?? 0, backoffMs) + jitterMs\n\n if (this.verbose) {\n console.error(\n `[verbose] Retry ${attempt + 1}/${this.maxRetries} after ${Math.round(delayMs)}ms (status ${response.status})`,\n )\n }\n\n try {\n await response.body?.cancel()\n } catch {\n // Stream may already be disturbed\n }\n await sleep(delayMs)\n continue\n }\n\n const text = await response.text()\n throw new OpenSeaAPIError(response.status, text, path)\n }\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 type { OutputFormat } from \"../output.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { Account } from \"../types/index.js\"\n\nexport function accountsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => OutputFormat,\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","const INDENT = \" \"\n\nconst NUMERIC_RE = /^-?\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?$/i\nconst LEADING_ZERO_RE = /^0\\d+$/\nconst UNQUOTED_KEY_RE = /^[A-Za-z_][A-Za-z0-9_.]*$/\n\nfunction escapeString(s: string): string {\n return s\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\")\n}\n\nfunction needsQuoting(value: string, delimiter: string): boolean {\n if (value === \"\") return true\n if (value !== value.trim()) return true\n if (value === \"true\" || value === \"false\" || value === \"null\") return true\n if (NUMERIC_RE.test(value) || LEADING_ZERO_RE.test(value)) return true\n if (/[:\"\\\\[\\]{}]/.test(value)) return true\n if (/[\\n\\r\\t]/.test(value)) return true\n if (value.includes(delimiter)) return true\n if (value.startsWith(\"-\")) return true\n return false\n}\n\nfunction encodeKey(key: string): string {\n if (UNQUOTED_KEY_RE.test(key)) return key\n return `\"${escapeString(key)}\"`\n}\n\nfunction encodePrimitive(value: unknown, delimiter: string): string {\n if (value === null) return \"null\"\n if (value === undefined) return \"null\"\n if (typeof value === \"boolean\") return String(value)\n if (typeof value === \"number\") return String(value)\n if (typeof value === \"string\") {\n if (needsQuoting(value, delimiter)) {\n return `\"${escapeString(value)}\"`\n }\n return value\n }\n return `\"${escapeString(String(value))}\"`\n}\n\nfunction isPrimitive(value: unknown): boolean {\n return (\n value === null ||\n value === undefined ||\n typeof value === \"boolean\" ||\n typeof value === \"number\" ||\n typeof value === \"string\"\n )\n}\n\nfunction isTabular(arr: unknown[]): boolean {\n if (arr.length === 0) return false\n const first = arr[0]\n if (first === null || typeof first !== \"object\" || Array.isArray(first))\n return false\n const keys = Object.keys(first as Record<string, unknown>).sort()\n for (const item of arr) {\n if (item === null || typeof item !== \"object\" || Array.isArray(item))\n return false\n const itemKeys = Object.keys(item as Record<string, unknown>).sort()\n if (itemKeys.length !== keys.length) return false\n for (let i = 0; i < keys.length; i++) {\n if (itemKeys[i] !== keys[i]) return false\n }\n for (const k of keys) {\n if (!isPrimitive((item as Record<string, unknown>)[k])) return false\n }\n }\n return true\n}\n\nfunction isPrimitiveArray(arr: unknown[]): boolean {\n return arr.every(isPrimitive)\n}\n\nfunction encodeValue(value: unknown, depth: number, delimiter: string): string {\n if (isPrimitive(value)) {\n return encodePrimitive(value, delimiter)\n }\n\n if (Array.isArray(value)) {\n return encodeArray(value, depth, delimiter)\n }\n\n if (typeof value === \"object\" && value !== null) {\n return encodeObject(value as Record<string, unknown>, depth, delimiter)\n }\n\n return encodePrimitive(value, delimiter)\n}\n\nfunction encodeObject(\n obj: Record<string, unknown>,\n depth: number,\n delimiter: string,\n): string {\n const entries = Object.entries(obj)\n if (entries.length === 0) return \"\"\n\n const lines: string[] = []\n const prefix = INDENT.repeat(depth)\n\n for (const [key, value] of entries) {\n const encodedKey = encodeKey(key)\n\n if (isPrimitive(value)) {\n lines.push(`${prefix}${encodedKey}: ${encodePrimitive(value, delimiter)}`)\n } else if (Array.isArray(value)) {\n lines.push(encodeArrayField(encodedKey, value, depth, delimiter))\n } else if (typeof value === \"object\" && value !== null) {\n const nested = value as Record<string, unknown>\n if (Object.keys(nested).length === 0) {\n lines.push(`${prefix}${encodedKey}:`)\n } else {\n lines.push(`${prefix}${encodedKey}:`)\n lines.push(encodeObject(nested, depth + 1, delimiter))\n }\n }\n }\n\n return lines.join(\"\\n\")\n}\n\nfunction encodeArrayField(\n encodedKey: string,\n arr: unknown[],\n depth: number,\n delimiter: string,\n): string {\n const prefix = INDENT.repeat(depth)\n\n if (arr.length === 0) {\n return `${prefix}${encodedKey}[0]:`\n }\n\n if (isPrimitiveArray(arr)) {\n const values = arr.map(v => encodePrimitive(v, delimiter)).join(delimiter)\n return `${prefix}${encodedKey}[${arr.length}]: ${values}`\n }\n\n if (isTabular(arr)) {\n const firstObj = arr[0] as Record<string, unknown>\n const fields = Object.keys(firstObj)\n const fieldHeader = fields.map(encodeKey).join(delimiter)\n const lines: string[] = []\n lines.push(`${prefix}${encodedKey}[${arr.length}]{${fieldHeader}}:`)\n const rowPrefix = INDENT.repeat(depth + 1)\n for (const item of arr) {\n const obj = item as Record<string, unknown>\n const row = fields\n .map(f => encodePrimitive(obj[f], delimiter))\n .join(delimiter)\n lines.push(`${rowPrefix}${row}`)\n }\n return lines.join(\"\\n\")\n }\n\n return encodeExpandedList(encodedKey, arr, depth, delimiter)\n}\n\nfunction encodeExpandedList(\n encodedKey: string,\n arr: unknown[],\n depth: number,\n delimiter: string,\n): string {\n const prefix = INDENT.repeat(depth)\n const itemPrefix = INDENT.repeat(depth + 1)\n const lines: string[] = []\n lines.push(`${prefix}${encodedKey}[${arr.length}]:`)\n\n for (const item of arr) {\n if (isPrimitive(item)) {\n lines.push(`${itemPrefix}- ${encodePrimitive(item, delimiter)}`)\n } else if (Array.isArray(item)) {\n if (isPrimitiveArray(item)) {\n const values = item\n .map(v => encodePrimitive(v, delimiter))\n .join(delimiter)\n lines.push(`${itemPrefix}- [${item.length}]: ${values}`)\n } else {\n lines.push(`${itemPrefix}- [${item.length}]:`)\n for (const inner of item) {\n lines.push(encodeValue(inner, depth + 2, delimiter))\n }\n }\n } else if (typeof item === \"object\" && item !== null) {\n const obj = item as Record<string, unknown>\n const entries = Object.entries(obj)\n if (entries.length === 0) {\n lines.push(`${itemPrefix}-`)\n } else {\n const [firstKey, firstValue] = entries[0]\n const ek = encodeKey(firstKey)\n\n if (Array.isArray(firstValue)) {\n const arrayLine = encodeArrayField(ek, firstValue, 0, delimiter)\n lines.push(`${itemPrefix}- ${arrayLine.trimStart()}`)\n } else if (isPrimitive(firstValue)) {\n lines.push(\n `${itemPrefix}- ${ek}: ${encodePrimitive(firstValue, delimiter)}`,\n )\n } else {\n lines.push(`${itemPrefix}- ${ek}:`)\n lines.push(\n encodeObject(\n firstValue as Record<string, unknown>,\n depth + 2,\n delimiter,\n ),\n )\n }\n\n for (let i = 1; i < entries.length; i++) {\n const [k, v] = entries[i]\n const encodedK = encodeKey(k)\n if (isPrimitive(v)) {\n lines.push(\n `${INDENT.repeat(depth + 2)}${encodedK}: ${encodePrimitive(v, delimiter)}`,\n )\n } else if (Array.isArray(v)) {\n lines.push(encodeArrayField(encodedK, v, depth + 2, delimiter))\n } else if (typeof v === \"object\" && v !== null) {\n lines.push(`${INDENT.repeat(depth + 2)}${encodedK}:`)\n lines.push(\n encodeObject(v as Record<string, unknown>, depth + 3, delimiter),\n )\n }\n }\n }\n }\n }\n\n return lines.join(\"\\n\")\n}\n\nfunction encodeArray(arr: unknown[], depth: number, delimiter: string): string {\n const prefix = INDENT.repeat(depth)\n\n if (arr.length === 0) {\n return `${prefix}[0]:`\n }\n\n if (isPrimitiveArray(arr)) {\n const values = arr.map(v => encodePrimitive(v, delimiter)).join(delimiter)\n return `${prefix}[${arr.length}]: ${values}`\n }\n\n if (isTabular(arr)) {\n const firstObj = arr[0] as Record<string, unknown>\n const fields = Object.keys(firstObj)\n const fieldHeader = fields.map(encodeKey).join(delimiter)\n const lines: string[] = []\n lines.push(`${prefix}[${arr.length}]{${fieldHeader}}:`)\n const rowPrefix = INDENT.repeat(depth + 1)\n for (const item of arr) {\n const obj = item as Record<string, unknown>\n const row = fields\n .map(f => encodePrimitive(obj[f], delimiter))\n .join(delimiter)\n lines.push(`${rowPrefix}${row}`)\n }\n return lines.join(\"\\n\")\n }\n\n const lines: string[] = []\n lines.push(`${prefix}[${arr.length}]:`)\n const itemPrefix = INDENT.repeat(depth + 1)\n for (const item of arr) {\n if (isPrimitive(item)) {\n lines.push(`${itemPrefix}- ${encodePrimitive(item, delimiter)}`)\n } else if (Array.isArray(item)) {\n if (isPrimitiveArray(item)) {\n const values = item\n .map(v => encodePrimitive(v, delimiter))\n .join(delimiter)\n lines.push(`${itemPrefix}- [${item.length}]: ${values}`)\n } else {\n lines.push(`${itemPrefix}- [${item.length}]:`)\n }\n } else if (typeof item === \"object\" && item !== null) {\n const obj = item as Record<string, unknown>\n const entries = Object.entries(obj)\n if (entries.length > 0) {\n const [firstKey, firstValue] = entries[0]\n const ek = encodeKey(firstKey)\n if (isPrimitive(firstValue)) {\n lines.push(\n `${itemPrefix}- ${ek}: ${encodePrimitive(firstValue, delimiter)}`,\n )\n } else {\n lines.push(`${itemPrefix}- ${ek}:`)\n lines.push(encodeValue(firstValue, depth + 2, delimiter))\n }\n for (let i = 1; i < entries.length; i++) {\n const [k, v] = entries[i]\n const encodedK = encodeKey(k)\n if (isPrimitive(v)) {\n lines.push(\n `${INDENT.repeat(depth + 2)}${encodedK}: ${encodePrimitive(v, delimiter)}`,\n )\n } else if (Array.isArray(v)) {\n lines.push(encodeArrayField(encodedK, v, depth + 2, delimiter))\n } else if (typeof v === \"object\" && v !== null) {\n lines.push(`${INDENT.repeat(depth + 2)}${encodedK}:`)\n lines.push(\n encodeObject(v as Record<string, unknown>, depth + 3, delimiter),\n )\n }\n }\n }\n }\n }\n\n return lines.join(\"\\n\")\n}\n\nexport function formatToon(data: unknown): string {\n if (isPrimitive(data)) {\n return encodePrimitive(data, \",\")\n }\n\n if (Array.isArray(data)) {\n return encodeArray(data, 0, \",\")\n }\n\n if (typeof data === \"object\" && data !== null) {\n return encodeObject(data as Record<string, unknown>, 0, \",\")\n }\n\n return String(data)\n}\n","import { formatToon } from \"./toon.js\"\n\nexport type OutputFormat = \"json\" | \"table\" | \"toon\"\n\nexport interface OutputOptions {\n fields?: string[]\n maxLines?: number\n}\n\nlet _outputOptions: OutputOptions = {}\n\nexport function setOutputOptions(options: OutputOptions): void {\n _outputOptions = options\n}\n\nexport function formatOutput(data: unknown, format: OutputFormat): string {\n const processed = _outputOptions.fields\n ? filterFields(data, _outputOptions.fields)\n : data\n\n let result: string\n if (format === \"table\") {\n result = formatTable(processed)\n } else if (format === \"toon\") {\n result = formatToon(processed)\n } else {\n result = JSON.stringify(processed, null, 2)\n }\n\n if (_outputOptions.maxLines != null) {\n result = truncateOutput(result, _outputOptions.maxLines)\n }\n\n return result\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\nfunction pickFields(\n obj: Record<string, unknown>,\n fields: string[],\n): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const field of fields) {\n if (field in obj) {\n result[field] = obj[field]\n }\n }\n return result\n}\n\nfunction filterFields(data: unknown, fields: string[]): unknown {\n if (Array.isArray(data)) {\n return data.map(item => filterFields(item, fields))\n }\n if (data && typeof data === \"object\") {\n return pickFields(data as Record<string, unknown>, fields)\n }\n return data\n}\n\nfunction truncateOutput(text: string, maxLines: number): string {\n const lines = text.split(\"\\n\")\n if (lines.length <= maxLines) return text\n const omitted = lines.length - maxLines\n return (\n lines.slice(0, maxLines).join(\"\\n\") +\n `\\n... (${omitted} more line${omitted === 1 ? \"\" : \"s\"})`\n )\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport type { OutputFormat } from \"../output.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: () => OutputFormat,\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 type { OutputFormat } from \"../output.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: () => OutputFormat,\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 { checkHealth } from \"../health.js\"\nimport type { OutputFormat } from \"../output.js\"\nimport { formatOutput } from \"../output.js\"\n\nexport function healthCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => OutputFormat,\n): Command {\n const cmd = new Command(\"health\")\n .description(\"Check API connectivity and authentication\")\n .action(async () => {\n const client = getClient()\n const result = await checkHealth(client)\n console.log(formatOutput(result, getFormat()))\n if (result.status === \"error\") {\n process.exit(result.rate_limited ? 3 : 1)\n }\n })\n\n return cmd\n}\n","import { OpenSeaAPIError, type OpenSeaClient } from \"./client.js\"\nimport type { HealthResult } from \"./types/index.js\"\n\nexport async function checkHealth(\n client: OpenSeaClient,\n): Promise<HealthResult> {\n const keyPrefix = client.getApiKeyPrefix()\n\n // Step 1: Check basic connectivity with a public endpoint\n try {\n await client.get(\"/api/v2/collections\", { limit: 1 })\n } catch (error) {\n let message: string\n if (error instanceof OpenSeaAPIError) {\n message =\n error.statusCode === 429\n ? \"Rate limited: too many requests\"\n : `API error (${error.statusCode}): ${error.responseBody}`\n } else {\n message = `Network error: ${(error as Error).message}`\n }\n return {\n status: \"error\",\n key_prefix: keyPrefix,\n authenticated: false,\n rate_limited:\n error instanceof OpenSeaAPIError && error.statusCode === 429,\n message,\n }\n }\n\n // Step 2: Validate authentication with an endpoint that requires a valid API key\n try {\n await client.get(\"/api/v2/listings/collection/boredapeyachtclub/all\", {\n limit: 1,\n })\n return {\n status: \"ok\",\n key_prefix: keyPrefix,\n authenticated: true,\n rate_limited: false,\n message: \"Connectivity and authentication are working\",\n }\n } catch (error) {\n if (error instanceof OpenSeaAPIError) {\n if (error.statusCode === 429) {\n return {\n status: \"error\",\n key_prefix: keyPrefix,\n authenticated: false,\n rate_limited: true,\n message: \"Rate limited: too many requests\",\n }\n }\n if (error.statusCode === 401 || error.statusCode === 403) {\n return {\n status: \"error\",\n key_prefix: keyPrefix,\n authenticated: false,\n rate_limited: false,\n message: `Authentication failed (${error.statusCode}): invalid API key`,\n }\n }\n }\n // Non-auth error on listings endpoint — connectivity works but auth is unverified\n return {\n status: \"ok\",\n key_prefix: keyPrefix,\n authenticated: false,\n rate_limited: false,\n message:\n \"Connectivity is working but authentication could not be verified\",\n }\n }\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport type { OutputFormat } from \"../output.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: () => OutputFormat,\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 type { OutputFormat } from \"../output.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: () => OutputFormat,\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 type { OutputFormat } from \"../output.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: () => OutputFormat,\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 type { OutputFormat } from \"../output.js\"\nimport { formatOutput } from \"../output.js\"\nimport { parseIntOption } from \"../parse.js\"\nimport type { SearchResponse } from \"../types/index.js\"\n\nexport function searchCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => OutputFormat,\n): Command {\n const cmd = new Command(\"search\")\n .description(\"Search across collections, tokens, NFTs, and accounts\")\n .argument(\"<query>\", \"Search query\")\n .option(\n \"--types <types>\",\n \"Filter by type (comma-separated: collection,nft,token,account)\",\n )\n .option(\"--chains <chains>\", \"Filter by chains (comma-separated)\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .action(\n async (\n query: string,\n options: {\n types?: string\n chains?: string\n limit: string\n },\n ) => {\n const client = getClient()\n const params: Record<string, unknown> = {\n query,\n limit: parseIntOption(options.limit, \"--limit\"),\n }\n if (options.types) {\n params.asset_types = options.types\n }\n if (options.chains) {\n params.chains = options.chains\n }\n const result = await client.get<SearchResponse>(\n \"/api/v2/search\",\n params,\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 type { OutputFormat } from \"../output.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: () => OutputFormat,\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 type { OutputFormat } from \"../output.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: () => OutputFormat,\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","lines","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","getClient","getFormat","Command","Command"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -319,6 +319,8 @@ interface OpenSeaClientConfig {
|
|
|
319
319
|
chain?: string;
|
|
320
320
|
timeout?: number;
|
|
321
321
|
verbose?: boolean;
|
|
322
|
+
maxRetries?: number;
|
|
323
|
+
retryBaseDelay?: number;
|
|
322
324
|
}
|
|
323
325
|
interface CommandOptions {
|
|
324
326
|
apiKey?: string;
|
|
@@ -326,6 +328,13 @@ interface CommandOptions {
|
|
|
326
328
|
format?: "json" | "table";
|
|
327
329
|
raw?: boolean;
|
|
328
330
|
}
|
|
331
|
+
interface HealthResult {
|
|
332
|
+
status: "ok" | "error";
|
|
333
|
+
key_prefix: string;
|
|
334
|
+
authenticated: boolean;
|
|
335
|
+
rate_limited: boolean;
|
|
336
|
+
message: string;
|
|
337
|
+
}
|
|
329
338
|
|
|
330
339
|
declare class OpenSeaClient {
|
|
331
340
|
private apiKey;
|
|
@@ -333,10 +342,15 @@ declare class OpenSeaClient {
|
|
|
333
342
|
private defaultChain;
|
|
334
343
|
private timeoutMs;
|
|
335
344
|
private verbose;
|
|
345
|
+
private maxRetries;
|
|
346
|
+
private retryBaseDelay;
|
|
336
347
|
constructor(config: OpenSeaClientConfig);
|
|
348
|
+
private get defaultHeaders();
|
|
337
349
|
get<T>(path: string, params?: Record<string, unknown>): Promise<T>;
|
|
338
350
|
post<T>(path: string, body?: Record<string, unknown>, params?: Record<string, unknown>): Promise<T>;
|
|
339
351
|
getDefaultChain(): string;
|
|
352
|
+
getApiKeyPrefix(): string;
|
|
353
|
+
private fetchWithRetry;
|
|
340
354
|
}
|
|
341
355
|
declare class OpenSeaAPIError extends Error {
|
|
342
356
|
statusCode: number;
|
|
@@ -345,6 +359,8 @@ declare class OpenSeaAPIError extends Error {
|
|
|
345
359
|
constructor(statusCode: number, responseBody: string, path: string);
|
|
346
360
|
}
|
|
347
361
|
|
|
362
|
+
declare function checkHealth(client: OpenSeaClient): Promise<HealthResult>;
|
|
363
|
+
|
|
348
364
|
type OutputFormat = "json" | "table" | "toon";
|
|
349
365
|
declare function formatOutput(data: unknown, format: OutputFormat): string;
|
|
350
366
|
|
|
@@ -359,6 +375,7 @@ declare class OpenSeaCLI {
|
|
|
359
375
|
readonly tokens: TokensAPI;
|
|
360
376
|
readonly search: SearchAPI;
|
|
361
377
|
readonly swaps: SwapsAPI;
|
|
378
|
+
readonly health: HealthAPI;
|
|
362
379
|
constructor(config: OpenSeaClientConfig);
|
|
363
380
|
}
|
|
364
381
|
declare class CollectionsAPI {
|
|
@@ -545,7 +562,12 @@ declare class SwapsAPI {
|
|
|
545
562
|
recipient?: string;
|
|
546
563
|
}): Promise<SwapQuoteResponse>;
|
|
547
564
|
}
|
|
565
|
+
declare class HealthAPI {
|
|
566
|
+
private client;
|
|
567
|
+
constructor(client: OpenSeaClient);
|
|
568
|
+
check(): Promise<HealthResult>;
|
|
569
|
+
}
|
|
548
570
|
|
|
549
571
|
declare function formatToon(data: unknown): string;
|
|
550
572
|
|
|
551
|
-
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 OutputFormat, type PaymentToken, type Price, type SafelistStatus, type SearchAssetType, type SearchResponse, type SearchResult, type SearchResultAccount, type SearchResultCollection, type SearchResultNFT, type SearchResultToken, type SwapQuote, type SwapQuoteResponse, type SwapTransaction, type Token, type TokenDetails, type TokenSocials, type TokenStats, type Trait, type TraitCategories, type TraitCounts, formatOutput, formatToon };
|
|
573
|
+
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 HealthResult, type Listing, type NFT, type Offer, OpenSeaAPIError, OpenSeaCLI, OpenSeaClient, type OpenSeaClientConfig, type Order, type OrderSide, type OutputFormat, type PaymentToken, type Price, type SafelistStatus, type SearchAssetType, type SearchResponse, type SearchResult, type SearchResultAccount, type SearchResultCollection, type SearchResultNFT, type SearchResultToken, type SwapQuote, type SwapQuoteResponse, type SwapTransaction, type Token, type TokenDetails, type TokenSocials, type TokenStats, type Trait, type TraitCategories, type TraitCounts, checkHealth, formatOutput, formatToon };
|