@opensea/cli 0.4.0 → 0.4.1

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/dist/cli.js CHANGED
@@ -5,19 +5,16 @@ import { Command as Command10 } from "commander";
5
5
 
6
6
  // src/client.ts
7
7
  var DEFAULT_BASE_URL = "https://api.opensea.io";
8
- var DEFAULT_GRAPHQL_URL = "https://gql.opensea.io/graphql";
9
8
  var DEFAULT_TIMEOUT_MS = 3e4;
10
9
  var OpenSeaClient = class {
11
10
  apiKey;
12
11
  baseUrl;
13
- graphqlUrl;
14
12
  defaultChain;
15
13
  timeoutMs;
16
14
  verbose;
17
15
  constructor(config) {
18
16
  this.apiKey = config.apiKey;
19
17
  this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
20
- this.graphqlUrl = config.graphqlUrl ?? DEFAULT_GRAPHQL_URL;
21
18
  this.defaultChain = config.chain ?? "ethereum";
22
19
  this.timeoutMs = config.timeout ?? DEFAULT_TIMEOUT_MS;
23
20
  this.verbose = config.verbose ?? false;
@@ -85,40 +82,6 @@ var OpenSeaClient = class {
85
82
  }
86
83
  return response.json();
87
84
  }
88
- async graphql(query, variables) {
89
- if (this.verbose) {
90
- console.error(`[verbose] POST ${this.graphqlUrl}`);
91
- }
92
- const response = await fetch(this.graphqlUrl, {
93
- method: "POST",
94
- headers: {
95
- "Content-Type": "application/json",
96
- Accept: "application/json",
97
- "x-api-key": this.apiKey
98
- },
99
- body: JSON.stringify({ query, variables }),
100
- signal: AbortSignal.timeout(this.timeoutMs)
101
- });
102
- if (this.verbose) {
103
- console.error(`[verbose] ${response.status} ${response.statusText}`);
104
- }
105
- if (!response.ok) {
106
- const body = await response.text();
107
- throw new OpenSeaAPIError(response.status, body, "graphql");
108
- }
109
- const json = await response.json();
110
- if (json.errors?.length) {
111
- throw new OpenSeaAPIError(
112
- 400,
113
- json.errors.map((e) => e.message).join("; "),
114
- "graphql"
115
- );
116
- }
117
- if (!json.data) {
118
- throw new OpenSeaAPIError(500, "GraphQL response missing data", "graphql");
119
- }
120
- return json.data;
121
- }
122
85
  getDefaultChain() {
123
86
  return this.defaultChain;
124
87
  }
@@ -738,147 +701,30 @@ function offersCommand(getClient2, getFormat2) {
738
701
 
739
702
  // src/commands/search.ts
740
703
  import { Command as Command7 } from "commander";
741
-
742
- // src/queries.ts
743
- var SEARCH_COLLECTIONS_QUERY = `
744
- query SearchCollections($query: String!, $limit: Int, $chains: [ChainIdentifier!]) {
745
- collectionsByQuery(query: $query, limit: $limit, chains: $chains) {
746
- slug
747
- name
748
- description
749
- imageUrl
750
- chain {
751
- identifier
752
- name
753
- }
754
- stats {
755
- totalSupply
756
- ownerCount
757
- volume {
758
- usd
759
- }
760
- sales
761
- }
762
- floorPrice {
763
- pricePerItem {
764
- usd
765
- native {
766
- unit
767
- symbol
768
- }
769
- }
770
- }
771
- }
772
- }`;
773
- var SEARCH_NFTS_QUERY = `
774
- query SearchItems($query: String!, $collectionSlug: String, $limit: Int, $chains: [ChainIdentifier!]) {
775
- itemsByQuery(query: $query, collectionSlug: $collectionSlug, limit: $limit, chains: $chains) {
776
- tokenId
777
- name
778
- description
779
- imageUrl
780
- contractAddress
781
- collection {
782
- slug
783
- name
784
- }
785
- chain {
786
- identifier
787
- name
788
- }
789
- bestListing {
790
- pricePerItem {
791
- usd
792
- native {
793
- unit
794
- symbol
795
- }
796
- }
797
- }
798
- owner {
799
- address
800
- displayName
801
- }
802
- }
803
- }`;
804
- var SEARCH_TOKENS_QUERY = `
805
- query SearchCurrencies($query: String!, $limit: Int, $chain: ChainIdentifier) {
806
- currenciesByQuery(query: $query, limit: $limit, chain: $chain, allowlistOnly: false) {
807
- name
808
- symbol
809
- imageUrl
810
- usdPrice
811
- contractAddress
812
- chain {
813
- identifier
814
- name
815
- }
816
- stats {
817
- marketCapUsd
818
- oneDay {
819
- priceChange
820
- volume
821
- }
822
- }
823
- }
824
- }`;
825
- var SEARCH_ACCOUNTS_QUERY = `
826
- query SearchAccounts($query: String!, $limit: Int) {
827
- accountsByQuery(query: $query, limit: $limit) {
828
- address
829
- username
830
- imageUrl
831
- isVerified
832
- }
833
- }`;
834
-
835
- // src/commands/search.ts
836
704
  function searchCommand(getClient2, getFormat2) {
837
- const cmd = new Command7("search").description(
838
- "Search for collections, NFTs, tokens, and accounts"
839
- );
840
- cmd.command("collections").description("Search collections by name or slug").argument("<query>", "Search query").option("--chains <chains>", "Filter by chains (comma-separated)").option("--limit <limit>", "Number of results", "10").action(
705
+ const cmd = new Command7("search").description("Search across collections, tokens, NFTs, and accounts").argument("<query>", "Search query").option(
706
+ "--types <types>",
707
+ "Filter by type (comma-separated: collection,nft,token,account)"
708
+ ).option("--chains <chains>", "Filter by chains (comma-separated)").option("--limit <limit>", "Number of results", "20").action(
841
709
  async (query, options) => {
842
710
  const client = getClient2();
843
- const result = await client.graphql(SEARCH_COLLECTIONS_QUERY, {
711
+ const params = {
844
712
  query,
845
- limit: parseIntOption(options.limit, "--limit"),
846
- chains: options.chains?.split(",")
847
- });
848
- console.log(formatOutput(result.collectionsByQuery, getFormat2()));
849
- }
850
- );
851
- cmd.command("nfts").description("Search NFTs by name").argument("<query>", "Search query").option("--collection <slug>", "Filter by collection slug").option("--chains <chains>", "Filter by chains (comma-separated)").option("--limit <limit>", "Number of results", "10").action(
852
- async (query, options) => {
853
- const client = getClient2();
854
- const result = await client.graphql(SEARCH_NFTS_QUERY, {
855
- query,
856
- collectionSlug: options.collection,
857
- limit: parseIntOption(options.limit, "--limit"),
858
- chains: options.chains?.split(",")
859
- });
860
- console.log(formatOutput(result.itemsByQuery, getFormat2()));
861
- }
862
- );
863
- cmd.command("tokens").description("Search tokens/currencies by name or symbol").argument("<query>", "Search query").option("--chain <chain>", "Filter by chain").option("--limit <limit>", "Number of results", "10").action(
864
- async (query, options) => {
865
- const client = getClient2();
866
- const result = await client.graphql(SEARCH_TOKENS_QUERY, {
867
- query,
868
- limit: parseIntOption(options.limit, "--limit"),
869
- chain: options.chain
870
- });
871
- console.log(formatOutput(result.currenciesByQuery, getFormat2()));
713
+ limit: parseIntOption(options.limit, "--limit")
714
+ };
715
+ if (options.types) {
716
+ params.asset_types = options.types;
717
+ }
718
+ if (options.chains) {
719
+ params.chains = options.chains;
720
+ }
721
+ const result = await client.get(
722
+ "/api/v2/search",
723
+ params
724
+ );
725
+ console.log(formatOutput(result, getFormat2()));
872
726
  }
873
727
  );
874
- cmd.command("accounts").description("Search accounts by username or address").argument("<query>", "Search query").option("--limit <limit>", "Number of results", "10").action(async (query, options) => {
875
- const client = getClient2();
876
- const result = await client.graphql(SEARCH_ACCOUNTS_QUERY, {
877
- query,
878
- limit: parseIntOption(options.limit, "--limit")
879
- });
880
- console.log(formatOutput(result.accountsByQuery, getFormat2()));
881
- });
882
728
  return cmd;
883
729
  }
884
730
 
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/queries.ts","../src/commands/swaps.ts","../src/commands/tokens.ts"],"sourcesContent":["import { Command } from \"commander\"\nimport { OpenSeaAPIError, OpenSeaClient } from \"./client.js\"\nimport {\n accountsCommand,\n collectionsCommand,\n eventsCommand,\n listingsCommand,\n nftsCommand,\n offersCommand,\n searchCommand,\n swapsCommand,\n tokensCommand,\n} from \"./commands/index.js\"\nimport 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_GRAPHQL_URL = \"https://gql.opensea.io/graphql\"\nconst DEFAULT_TIMEOUT_MS = 30_000\n\nexport class OpenSeaClient {\n private apiKey: string\n private baseUrl: string\n private graphqlUrl: string\n private defaultChain: string\n private timeoutMs: number\n private verbose: boolean\n\n constructor(config: OpenSeaClientConfig) {\n this.apiKey = config.apiKey\n this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL\n this.graphqlUrl = config.graphqlUrl ?? DEFAULT_GRAPHQL_URL\n this.defaultChain = config.chain ?? \"ethereum\"\n this.timeoutMs = config.timeout ?? DEFAULT_TIMEOUT_MS\n this.verbose = config.verbose ?? false\n }\n\n async get<T>(path: string, params?: Record<string, unknown>): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n if (this.verbose) {\n console.error(`[verbose] GET ${url.toString()}`)\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n signal: AbortSignal.timeout(this.timeoutMs),\n })\n\n if (this.verbose) {\n console.error(`[verbose] ${response.status} ${response.statusText}`)\n }\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, path)\n }\n\n return response.json() as Promise<T>\n }\n\n async post<T>(\n path: string,\n body?: Record<string, unknown>,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n }\n\n if (body) {\n headers[\"Content-Type\"] = \"application/json\"\n }\n\n if (this.verbose) {\n console.error(`[verbose] POST ${url.toString()}`)\n }\n\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(this.timeoutMs),\n })\n\n if (this.verbose) {\n console.error(`[verbose] ${response.status} ${response.statusText}`)\n }\n\n if (!response.ok) {\n const text = await response.text()\n throw new OpenSeaAPIError(response.status, text, path)\n }\n\n return response.json() as Promise<T>\n }\n\n async graphql<T>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<T> {\n if (this.verbose) {\n console.error(`[verbose] POST ${this.graphqlUrl}`)\n }\n\n const response = await fetch(this.graphqlUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n body: JSON.stringify({ query, variables }),\n signal: AbortSignal.timeout(this.timeoutMs),\n })\n\n if (this.verbose) {\n console.error(`[verbose] ${response.status} ${response.statusText}`)\n }\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, \"graphql\")\n }\n\n const json = (await response.json()) as {\n data?: T\n errors?: { message: string }[]\n }\n\n if (json.errors?.length) {\n throw new OpenSeaAPIError(\n 400,\n json.errors.map(e => e.message).join(\"; \"),\n \"graphql\",\n )\n }\n\n if (!json.data) {\n throw new OpenSeaAPIError(500, \"GraphQL response missing data\", \"graphql\")\n }\n\n return json.data\n }\n\n getDefaultChain(): string {\n return this.defaultChain\n }\n}\n\nexport class OpenSeaAPIError extends Error {\n constructor(\n public statusCode: number,\n public responseBody: string,\n public path: string,\n ) {\n super(`OpenSea API error ${statusCode} on ${path}: ${responseBody}`)\n this.name = \"OpenSeaAPIError\"\n }\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport 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 {\n SEARCH_ACCOUNTS_QUERY,\n SEARCH_COLLECTIONS_QUERY,\n SEARCH_NFTS_QUERY,\n SEARCH_TOKENS_QUERY,\n} from \"../queries.js\"\nimport type {\n SearchAccountResult,\n SearchCollectionResult,\n SearchNFTResult,\n SearchTokenResult,\n} from \"../types/index.js\"\n\nexport function searchCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => OutputFormat,\n): Command {\n const cmd = new Command(\"search\").description(\n \"Search for collections, NFTs, tokens, and accounts\",\n )\n\n cmd\n .command(\"collections\")\n .description(\"Search collections by name or slug\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--chains <chains>\", \"Filter by chains (comma-separated)\")\n .option(\"--limit <limit>\", \"Number of results\", \"10\")\n .action(\n async (query: string, options: { chains?: string; limit: string }) => {\n const client = getClient()\n const result = await client.graphql<{\n collectionsByQuery: SearchCollectionResult[]\n }>(SEARCH_COLLECTIONS_QUERY, {\n query,\n limit: parseIntOption(options.limit, \"--limit\"),\n chains: options.chains?.split(\",\"),\n })\n console.log(formatOutput(result.collectionsByQuery, getFormat()))\n },\n )\n\n cmd\n .command(\"nfts\")\n .description(\"Search NFTs by name\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--collection <slug>\", \"Filter by collection slug\")\n .option(\"--chains <chains>\", \"Filter by chains (comma-separated)\")\n .option(\"--limit <limit>\", \"Number of results\", \"10\")\n .action(\n async (\n query: string,\n options: { collection?: string; chains?: string; limit: string },\n ) => {\n const client = getClient()\n const result = await client.graphql<{\n itemsByQuery: SearchNFTResult[]\n }>(SEARCH_NFTS_QUERY, {\n query,\n collectionSlug: options.collection,\n limit: parseIntOption(options.limit, \"--limit\"),\n chains: options.chains?.split(\",\"),\n })\n console.log(formatOutput(result.itemsByQuery, getFormat()))\n },\n )\n\n cmd\n .command(\"tokens\")\n .description(\"Search tokens/currencies by name or symbol\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--chain <chain>\", \"Filter by chain\")\n .option(\"--limit <limit>\", \"Number of results\", \"10\")\n .action(\n async (query: string, options: { chain?: string; limit: string }) => {\n const client = getClient()\n const result = await client.graphql<{\n currenciesByQuery: SearchTokenResult[]\n }>(SEARCH_TOKENS_QUERY, {\n query,\n limit: parseIntOption(options.limit, \"--limit\"),\n chain: options.chain,\n })\n console.log(formatOutput(result.currenciesByQuery, getFormat()))\n },\n )\n\n cmd\n .command(\"accounts\")\n .description(\"Search accounts by username or address\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--limit <limit>\", \"Number of results\", \"10\")\n .action(async (query: string, options: { limit: string }) => {\n const client = getClient()\n const result = await client.graphql<{\n accountsByQuery: SearchAccountResult[]\n }>(SEARCH_ACCOUNTS_QUERY, {\n query,\n limit: parseIntOption(options.limit, \"--limit\"),\n })\n console.log(formatOutput(result.accountsByQuery, getFormat()))\n })\n\n return cmd\n}\n","export const SEARCH_COLLECTIONS_QUERY = `\nquery SearchCollections($query: String!, $limit: Int, $chains: [ChainIdentifier!]) {\n collectionsByQuery(query: $query, limit: $limit, chains: $chains) {\n slug\n name\n description\n imageUrl\n chain {\n identifier\n name\n }\n stats {\n totalSupply\n ownerCount\n volume {\n usd\n }\n sales\n }\n floorPrice {\n pricePerItem {\n usd\n native {\n unit\n symbol\n }\n }\n }\n }\n}`\n\nexport const SEARCH_NFTS_QUERY = `\nquery SearchItems($query: String!, $collectionSlug: String, $limit: Int, $chains: [ChainIdentifier!]) {\n itemsByQuery(query: $query, collectionSlug: $collectionSlug, limit: $limit, chains: $chains) {\n tokenId\n name\n description\n imageUrl\n contractAddress\n collection {\n slug\n name\n }\n chain {\n identifier\n name\n }\n bestListing {\n pricePerItem {\n usd\n native {\n unit\n symbol\n }\n }\n }\n owner {\n address\n displayName\n }\n }\n}`\n\nexport const SEARCH_TOKENS_QUERY = `\nquery SearchCurrencies($query: String!, $limit: Int, $chain: ChainIdentifier) {\n currenciesByQuery(query: $query, limit: $limit, chain: $chain, allowlistOnly: false) {\n name\n symbol\n imageUrl\n usdPrice\n contractAddress\n chain {\n identifier\n name\n }\n stats {\n marketCapUsd\n oneDay {\n priceChange\n volume\n }\n }\n }\n}`\n\nexport const SEARCH_ACCOUNTS_QUERY = `\nquery SearchAccounts($query: String!, $limit: Int) {\n accountsByQuery(query: $query, limit: $limit) {\n address\n username\n imageUrl\n isVerified\n }\n}`\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport 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/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"]}
package/dist/index.d.ts CHANGED
@@ -269,90 +269,53 @@ interface SwapQuoteResponse {
269
269
  quote: SwapQuote;
270
270
  transactions: SwapTransaction[];
271
271
  }
272
- interface SearchCollectionResult {
273
- slug: string;
274
- name: string;
275
- description: string;
276
- imageUrl: string;
277
- chain: {
278
- identifier: string;
279
- name: string;
280
- };
281
- stats: {
282
- totalSupply: number;
283
- ownerCount: number;
284
- volume: {
285
- usd: number;
286
- };
287
- sales: number;
288
- } | null;
289
- floorPrice: {
290
- pricePerItem: {
291
- usd: number;
292
- native: {
293
- unit: number;
294
- symbol: string;
295
- };
296
- };
297
- } | null;
298
- }
299
- interface SearchNFTResult {
300
- tokenId: string;
272
+ type SearchAssetType = "collection" | "nft" | "token" | "account";
273
+ interface SearchResultCollection {
274
+ collection: string;
301
275
  name: string;
302
- description: string;
303
- imageUrl: string;
304
- contractAddress: string;
305
- collection: {
306
- slug: string;
307
- name: string;
308
- };
309
- chain: {
310
- identifier: string;
311
- name: string;
312
- };
313
- bestListing: {
314
- pricePerItem: {
315
- usd: number;
316
- native: {
317
- unit: number;
318
- symbol: string;
319
- };
320
- };
321
- } | null;
322
- owner: {
323
- address: string;
324
- displayName: string;
325
- } | null;
276
+ image_url: string | null;
277
+ is_disabled: boolean;
278
+ is_nsfw: boolean;
279
+ opensea_url: string;
326
280
  }
327
- interface SearchTokenResult {
281
+ interface SearchResultToken {
282
+ address: string;
283
+ chain: string;
328
284
  name: string;
329
285
  symbol: string;
330
- imageUrl: string;
331
- usdPrice: string;
332
- contractAddress: string;
333
- chain: {
334
- identifier: string;
335
- name: string;
336
- };
337
- stats: {
338
- marketCapUsd: number;
339
- oneDay: {
340
- priceChange: number;
341
- volume: number;
342
- };
343
- } | null;
286
+ image_url: string | null;
287
+ usd_price: string;
288
+ decimals: number;
289
+ opensea_url: string;
290
+ }
291
+ interface SearchResultNFT {
292
+ identifier: string;
293
+ collection: string;
294
+ contract: string;
295
+ name: string | null;
296
+ image_url: string | null;
297
+ opensea_url: string;
344
298
  }
345
- interface SearchAccountResult {
299
+ interface SearchResultAccount {
346
300
  address: string;
347
- username: string;
348
- imageUrl: string;
349
- isVerified: boolean;
301
+ username: string | null;
302
+ profile_image_url: string | null;
303
+ opensea_url: string;
304
+ }
305
+ interface SearchResult {
306
+ type: SearchAssetType;
307
+ collection?: SearchResultCollection;
308
+ token?: SearchResultToken;
309
+ nft?: SearchResultNFT;
310
+ account?: SearchResultAccount;
311
+ }
312
+ interface SearchResponse {
313
+ results: SearchResult[];
350
314
  }
351
315
 
352
316
  interface OpenSeaClientConfig {
353
317
  apiKey: string;
354
318
  baseUrl?: string;
355
- graphqlUrl?: string;
356
319
  chain?: string;
357
320
  timeout?: number;
358
321
  verbose?: boolean;
@@ -367,14 +330,12 @@ interface CommandOptions {
367
330
  declare class OpenSeaClient {
368
331
  private apiKey;
369
332
  private baseUrl;
370
- private graphqlUrl;
371
333
  private defaultChain;
372
334
  private timeoutMs;
373
335
  private verbose;
374
336
  constructor(config: OpenSeaClientConfig);
375
337
  get<T>(path: string, params?: Record<string, unknown>): Promise<T>;
376
338
  post<T>(path: string, body?: Record<string, unknown>, params?: Record<string, unknown>): Promise<T>;
377
- graphql<T>(query: string, variables?: Record<string, unknown>): Promise<T>;
378
339
  getDefaultChain(): string;
379
340
  }
380
341
  declare class OpenSeaAPIError extends Error {
@@ -564,22 +525,11 @@ declare class TokensAPI {
564
525
  declare class SearchAPI {
565
526
  private client;
566
527
  constructor(client: OpenSeaClient);
567
- collections(query: string, options?: {
568
- chains?: string[];
569
- limit?: number;
570
- }): Promise<SearchCollectionResult[]>;
571
- nfts(query: string, options?: {
572
- collection?: string;
528
+ query(query: string, options?: {
529
+ assetTypes?: SearchAssetType[];
573
530
  chains?: string[];
574
531
  limit?: number;
575
- }): Promise<SearchNFTResult[]>;
576
- tokens(query: string, options?: {
577
- chain?: string;
578
- limit?: number;
579
- }): Promise<SearchTokenResult[]>;
580
- accounts(query: string, options?: {
581
- limit?: number;
582
- }): Promise<SearchAccountResult[]>;
532
+ }): Promise<SearchResponse>;
583
533
  }
584
534
  declare class SwapsAPI {
585
535
  private client;
@@ -598,4 +548,4 @@ declare class SwapsAPI {
598
548
 
599
549
  declare function formatToon(data: unknown): string;
600
550
 
601
- 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 SearchAccountResult, type SearchCollectionResult, type SearchNFTResult, type SearchTokenResult, type SwapQuote, type SwapQuoteResponse, type SwapTransaction, type Token, type TokenDetails, type TokenSocials, type TokenStats, type Trait, type TraitCategories, type TraitCounts, formatOutput, formatToon };
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 };
package/dist/index.js CHANGED
@@ -1,18 +1,15 @@
1
1
  // src/client.ts
2
2
  var DEFAULT_BASE_URL = "https://api.opensea.io";
3
- var DEFAULT_GRAPHQL_URL = "https://gql.opensea.io/graphql";
4
3
  var DEFAULT_TIMEOUT_MS = 3e4;
5
4
  var OpenSeaClient = class {
6
5
  apiKey;
7
6
  baseUrl;
8
- graphqlUrl;
9
7
  defaultChain;
10
8
  timeoutMs;
11
9
  verbose;
12
10
  constructor(config) {
13
11
  this.apiKey = config.apiKey;
14
12
  this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
15
- this.graphqlUrl = config.graphqlUrl ?? DEFAULT_GRAPHQL_URL;
16
13
  this.defaultChain = config.chain ?? "ethereum";
17
14
  this.timeoutMs = config.timeout ?? DEFAULT_TIMEOUT_MS;
18
15
  this.verbose = config.verbose ?? false;
@@ -80,40 +77,6 @@ var OpenSeaClient = class {
80
77
  }
81
78
  return response.json();
82
79
  }
83
- async graphql(query, variables) {
84
- if (this.verbose) {
85
- console.error(`[verbose] POST ${this.graphqlUrl}`);
86
- }
87
- const response = await fetch(this.graphqlUrl, {
88
- method: "POST",
89
- headers: {
90
- "Content-Type": "application/json",
91
- Accept: "application/json",
92
- "x-api-key": this.apiKey
93
- },
94
- body: JSON.stringify({ query, variables }),
95
- signal: AbortSignal.timeout(this.timeoutMs)
96
- });
97
- if (this.verbose) {
98
- console.error(`[verbose] ${response.status} ${response.statusText}`);
99
- }
100
- if (!response.ok) {
101
- const body = await response.text();
102
- throw new OpenSeaAPIError(response.status, body, "graphql");
103
- }
104
- const json = await response.json();
105
- if (json.errors?.length) {
106
- throw new OpenSeaAPIError(
107
- 400,
108
- json.errors.map((e) => e.message).join("; "),
109
- "graphql"
110
- );
111
- }
112
- if (!json.data) {
113
- throw new OpenSeaAPIError(500, "GraphQL response missing data", "graphql");
114
- }
115
- return json.data;
116
- }
117
80
  getDefaultChain() {
118
81
  return this.defaultChain;
119
82
  }
@@ -443,99 +406,6 @@ function formatTable(data) {
443
406
  return String(data);
444
407
  }
445
408
 
446
- // src/queries.ts
447
- var SEARCH_COLLECTIONS_QUERY = `
448
- query SearchCollections($query: String!, $limit: Int, $chains: [ChainIdentifier!]) {
449
- collectionsByQuery(query: $query, limit: $limit, chains: $chains) {
450
- slug
451
- name
452
- description
453
- imageUrl
454
- chain {
455
- identifier
456
- name
457
- }
458
- stats {
459
- totalSupply
460
- ownerCount
461
- volume {
462
- usd
463
- }
464
- sales
465
- }
466
- floorPrice {
467
- pricePerItem {
468
- usd
469
- native {
470
- unit
471
- symbol
472
- }
473
- }
474
- }
475
- }
476
- }`;
477
- var SEARCH_NFTS_QUERY = `
478
- query SearchItems($query: String!, $collectionSlug: String, $limit: Int, $chains: [ChainIdentifier!]) {
479
- itemsByQuery(query: $query, collectionSlug: $collectionSlug, limit: $limit, chains: $chains) {
480
- tokenId
481
- name
482
- description
483
- imageUrl
484
- contractAddress
485
- collection {
486
- slug
487
- name
488
- }
489
- chain {
490
- identifier
491
- name
492
- }
493
- bestListing {
494
- pricePerItem {
495
- usd
496
- native {
497
- unit
498
- symbol
499
- }
500
- }
501
- }
502
- owner {
503
- address
504
- displayName
505
- }
506
- }
507
- }`;
508
- var SEARCH_TOKENS_QUERY = `
509
- query SearchCurrencies($query: String!, $limit: Int, $chain: ChainIdentifier) {
510
- currenciesByQuery(query: $query, limit: $limit, chain: $chain, allowlistOnly: false) {
511
- name
512
- symbol
513
- imageUrl
514
- usdPrice
515
- contractAddress
516
- chain {
517
- identifier
518
- name
519
- }
520
- stats {
521
- marketCapUsd
522
- oneDay {
523
- priceChange
524
- volume
525
- }
526
- }
527
- }
528
- }`;
529
- var SEARCH_ACCOUNTS_QUERY = `
530
- query SearchAccounts($query: String!, $limit: Int) {
531
- accountsByQuery(query: $query, limit: $limit) {
532
- address
533
- username
534
- imageUrl
535
- isVerified
536
- }
537
- }`;
538
-
539
409
  // src/sdk.ts
540
410
  var OpenSeaCLI = class {
541
411
  client;
@@ -750,37 +620,13 @@ var SearchAPI = class {
750
620
  constructor(client) {
751
621
  this.client = client;
752
622
  }
753
- async collections(query, options) {
754
- const result = await this.client.graphql(SEARCH_COLLECTIONS_QUERY, {
755
- query,
756
- limit: options?.limit,
757
- chains: options?.chains
758
- });
759
- return result.collectionsByQuery;
760
- }
761
- async nfts(query, options) {
762
- const result = await this.client.graphql(SEARCH_NFTS_QUERY, {
763
- query,
764
- collectionSlug: options?.collection,
765
- limit: options?.limit,
766
- chains: options?.chains
767
- });
768
- return result.itemsByQuery;
769
- }
770
- async tokens(query, options) {
771
- const result = await this.client.graphql(SEARCH_TOKENS_QUERY, {
772
- query,
773
- limit: options?.limit,
774
- chain: options?.chain
775
- });
776
- return result.currenciesByQuery;
777
- }
778
- async accounts(query, options) {
779
- const result = await this.client.graphql(SEARCH_ACCOUNTS_QUERY, {
623
+ async query(query, options) {
624
+ return this.client.get("/api/v2/search", {
780
625
  query,
626
+ asset_types: options?.assetTypes?.join(","),
627
+ chains: options?.chains?.join(","),
781
628
  limit: options?.limit
782
629
  });
783
- return result.accountsByQuery;
784
630
  }
785
631
  };
786
632
  var SwapsAPI = class {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/toon.ts","../src/output.ts","../src/queries.ts","../src/sdk.ts"],"sourcesContent":["import type { OpenSeaClientConfig } from \"./types/index.js\"\n\nconst DEFAULT_BASE_URL = \"https://api.opensea.io\"\nconst DEFAULT_GRAPHQL_URL = \"https://gql.opensea.io/graphql\"\nconst DEFAULT_TIMEOUT_MS = 30_000\n\nexport class OpenSeaClient {\n private apiKey: string\n private baseUrl: string\n private graphqlUrl: string\n private defaultChain: string\n private timeoutMs: number\n private verbose: boolean\n\n constructor(config: OpenSeaClientConfig) {\n this.apiKey = config.apiKey\n this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL\n this.graphqlUrl = config.graphqlUrl ?? DEFAULT_GRAPHQL_URL\n this.defaultChain = config.chain ?? \"ethereum\"\n this.timeoutMs = config.timeout ?? DEFAULT_TIMEOUT_MS\n this.verbose = config.verbose ?? false\n }\n\n async get<T>(path: string, params?: Record<string, unknown>): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n if (this.verbose) {\n console.error(`[verbose] GET ${url.toString()}`)\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n signal: AbortSignal.timeout(this.timeoutMs),\n })\n\n if (this.verbose) {\n console.error(`[verbose] ${response.status} ${response.statusText}`)\n }\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, path)\n }\n\n return response.json() as Promise<T>\n }\n\n async post<T>(\n path: string,\n body?: Record<string, unknown>,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n }\n\n if (body) {\n headers[\"Content-Type\"] = \"application/json\"\n }\n\n if (this.verbose) {\n console.error(`[verbose] POST ${url.toString()}`)\n }\n\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(this.timeoutMs),\n })\n\n if (this.verbose) {\n console.error(`[verbose] ${response.status} ${response.statusText}`)\n }\n\n if (!response.ok) {\n const text = await response.text()\n throw new OpenSeaAPIError(response.status, text, path)\n }\n\n return response.json() as Promise<T>\n }\n\n async graphql<T>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<T> {\n if (this.verbose) {\n console.error(`[verbose] POST ${this.graphqlUrl}`)\n }\n\n const response = await fetch(this.graphqlUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n body: JSON.stringify({ query, variables }),\n signal: AbortSignal.timeout(this.timeoutMs),\n })\n\n if (this.verbose) {\n console.error(`[verbose] ${response.status} ${response.statusText}`)\n }\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, \"graphql\")\n }\n\n const json = (await response.json()) as {\n data?: T\n errors?: { message: string }[]\n }\n\n if (json.errors?.length) {\n throw new OpenSeaAPIError(\n 400,\n json.errors.map(e => e.message).join(\"; \"),\n \"graphql\",\n )\n }\n\n if (!json.data) {\n throw new OpenSeaAPIError(500, \"GraphQL response missing data\", \"graphql\")\n }\n\n return json.data\n }\n\n getDefaultChain(): string {\n return this.defaultChain\n }\n}\n\nexport class OpenSeaAPIError extends Error {\n constructor(\n public statusCode: number,\n public responseBody: string,\n public path: string,\n ) {\n super(`OpenSea API error ${statusCode} on ${path}: ${responseBody}`)\n this.name = \"OpenSeaAPIError\"\n }\n}\n","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","export const SEARCH_COLLECTIONS_QUERY = `\nquery SearchCollections($query: String!, $limit: Int, $chains: [ChainIdentifier!]) {\n collectionsByQuery(query: $query, limit: $limit, chains: $chains) {\n slug\n name\n description\n imageUrl\n chain {\n identifier\n name\n }\n stats {\n totalSupply\n ownerCount\n volume {\n usd\n }\n sales\n }\n floorPrice {\n pricePerItem {\n usd\n native {\n unit\n symbol\n }\n }\n }\n }\n}`\n\nexport const SEARCH_NFTS_QUERY = `\nquery SearchItems($query: String!, $collectionSlug: String, $limit: Int, $chains: [ChainIdentifier!]) {\n itemsByQuery(query: $query, collectionSlug: $collectionSlug, limit: $limit, chains: $chains) {\n tokenId\n name\n description\n imageUrl\n contractAddress\n collection {\n slug\n name\n }\n chain {\n identifier\n name\n }\n bestListing {\n pricePerItem {\n usd\n native {\n unit\n symbol\n }\n }\n }\n owner {\n address\n displayName\n }\n }\n}`\n\nexport const SEARCH_TOKENS_QUERY = `\nquery SearchCurrencies($query: String!, $limit: Int, $chain: ChainIdentifier) {\n currenciesByQuery(query: $query, limit: $limit, chain: $chain, allowlistOnly: false) {\n name\n symbol\n imageUrl\n usdPrice\n contractAddress\n chain {\n identifier\n name\n }\n stats {\n marketCapUsd\n oneDay {\n priceChange\n volume\n }\n }\n }\n}`\n\nexport const SEARCH_ACCOUNTS_QUERY = `\nquery SearchAccounts($query: String!, $limit: Int) {\n accountsByQuery(query: $query, limit: $limit) {\n address\n username\n imageUrl\n isVerified\n }\n}`\n","import { OpenSeaClient } from \"./client.js\"\nimport {\n SEARCH_ACCOUNTS_QUERY,\n SEARCH_COLLECTIONS_QUERY,\n SEARCH_NFTS_QUERY,\n SEARCH_TOKENS_QUERY,\n} from \"./queries.js\"\nimport type {\n Account,\n AssetEvent,\n Chain,\n Collection,\n CollectionOrderBy,\n CollectionStats,\n Contract,\n EventType,\n GetTraitsResponse,\n Listing,\n NFT,\n Offer,\n OpenSeaClientConfig,\n SearchAccountResult,\n SearchCollectionResult,\n SearchNFTResult,\n SearchTokenResult,\n SwapQuoteResponse,\n Token,\n TokenDetails,\n} from \"./types/index.js\"\n\nexport class OpenSeaCLI {\n private client: OpenSeaClient\n\n readonly collections: CollectionsAPI\n readonly nfts: NFTsAPI\n readonly listings: ListingsAPI\n readonly offers: OffersAPI\n readonly events: EventsAPI\n readonly accounts: AccountsAPI\n readonly tokens: TokensAPI\n readonly search: SearchAPI\n readonly swaps: SwapsAPI\n\n constructor(config: OpenSeaClientConfig) {\n this.client = new OpenSeaClient(config)\n this.collections = new CollectionsAPI(this.client)\n this.nfts = new NFTsAPI(this.client)\n this.listings = new ListingsAPI(this.client)\n this.offers = new OffersAPI(this.client)\n this.events = new EventsAPI(this.client)\n this.accounts = new AccountsAPI(this.client)\n this.tokens = new TokensAPI(this.client)\n this.search = new SearchAPI(this.client)\n this.swaps = new SwapsAPI(this.client)\n }\n}\n\nclass CollectionsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(slug: string): Promise<Collection> {\n return this.client.get<Collection>(`/api/v2/collections/${slug}`)\n }\n\n async list(options?: {\n chain?: Chain\n limit?: number\n next?: string\n orderBy?: CollectionOrderBy\n creatorUsername?: string\n includeHidden?: boolean\n }): Promise<{ collections: Collection[]; next?: string }> {\n return this.client.get(\"/api/v2/collections\", {\n chain: options?.chain,\n limit: options?.limit,\n next: options?.next,\n order_by: options?.orderBy,\n creator_username: options?.creatorUsername,\n include_hidden: options?.includeHidden,\n })\n }\n\n async stats(slug: string): Promise<CollectionStats> {\n return this.client.get<CollectionStats>(`/api/v2/collections/${slug}/stats`)\n }\n\n async traits(slug: string): Promise<GetTraitsResponse> {\n return this.client.get<GetTraitsResponse>(`/api/v2/traits/${slug}`)\n }\n}\n\nclass NFTsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(\n chain: Chain,\n address: string,\n identifier: string,\n ): Promise<{ nft: NFT }> {\n return this.client.get(\n `/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}`,\n )\n }\n\n async listByCollection(\n slug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/collection/${slug}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async listByContract(\n chain: Chain,\n address: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/chain/${chain}/contract/${address}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async listByAccount(\n chain: Chain,\n address: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/chain/${chain}/account/${address}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async refresh(\n chain: Chain,\n address: string,\n identifier: string,\n ): Promise<void> {\n await this.client.post(\n `/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}/refresh`,\n )\n }\n\n async getContract(chain: Chain, address: string): Promise<Contract> {\n return this.client.get(`/api/v2/chain/${chain}/contract/${address}`)\n }\n}\n\nclass ListingsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async all(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ listings: Listing[]; next?: string }> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/all`,\n { limit: options?.limit, next: options?.next },\n )\n }\n\n async best(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ listings: Listing[]; next?: string }> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/best`,\n { limit: options?.limit, next: options?.next },\n )\n }\n\n async bestForNFT(collectionSlug: string, tokenId: string): Promise<Listing> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/nfts/${tokenId}/best`,\n )\n }\n}\n\nclass OffersAPI {\n constructor(private client: OpenSeaClient) {}\n\n async all(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(`/api/v2/offers/collection/${collectionSlug}/all`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async collection(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(`/api/v2/offers/collection/${collectionSlug}`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async bestForNFT(collectionSlug: string, tokenId: string): Promise<Offer> {\n return this.client.get(\n `/api/v2/offers/collection/${collectionSlug}/nfts/${tokenId}/best`,\n )\n }\n\n async traits(\n collectionSlug: string,\n options: {\n type: string\n value: string\n limit?: number\n next?: string\n },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(\n `/api/v2/offers/collection/${collectionSlug}/traits`,\n {\n type: options.type,\n value: options.value,\n limit: options.limit,\n next: options.next,\n },\n )\n }\n}\n\nclass EventsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async list(options?: {\n eventType?: EventType\n after?: number\n before?: number\n limit?: number\n next?: string\n chain?: Chain\n }): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(\"/api/v2/events\", {\n event_type: options?.eventType,\n after: options?.after,\n before: options?.before,\n limit: options?.limit,\n next: options?.next,\n chain: options?.chain,\n })\n }\n\n async byAccount(\n address: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n chain?: Chain\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(`/api/v2/events/accounts/${address}`, {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n chain: options?.chain,\n })\n }\n\n async byCollection(\n collectionSlug: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(`/api/v2/events/collection/${collectionSlug}`, {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async byNFT(\n chain: Chain,\n address: string,\n identifier: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(\n `/api/v2/events/chain/${chain}/contract/${address}/nfts/${identifier}`,\n {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n },\n )\n }\n}\n\nclass AccountsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(address: string): Promise<Account> {\n return this.client.get(`/api/v2/accounts/${address}`)\n }\n}\n\nclass TokensAPI {\n constructor(private client: OpenSeaClient) {}\n\n async trending(options?: {\n limit?: number\n chains?: string[]\n next?: string\n }): Promise<{ tokens: Token[]; next?: string }> {\n // The tokens API uses \"cursor\" as its query param instead of \"next\".\n // The SDK accepts \"next\" for consistency with all other endpoints.\n return this.client.get(\"/api/v2/tokens/trending\", {\n limit: options?.limit,\n chains: options?.chains?.join(\",\"),\n cursor: options?.next,\n })\n }\n\n async top(options?: {\n limit?: number\n chains?: string[]\n next?: string\n }): Promise<{ tokens: Token[]; next?: string }> {\n // The tokens API uses \"cursor\" as its query param instead of \"next\".\n // The SDK accepts \"next\" for consistency with all other endpoints.\n return this.client.get(\"/api/v2/tokens/top\", {\n limit: options?.limit,\n chains: options?.chains?.join(\",\"),\n cursor: options?.next,\n })\n }\n\n async get(chain: Chain, address: string): Promise<TokenDetails> {\n return this.client.get(`/api/v2/chain/${chain}/token/${address}`)\n }\n}\n\nclass SearchAPI {\n constructor(private client: OpenSeaClient) {}\n\n async collections(\n query: string,\n options?: { chains?: string[]; limit?: number },\n ): Promise<SearchCollectionResult[]> {\n const result = await this.client.graphql<{\n collectionsByQuery: SearchCollectionResult[]\n }>(SEARCH_COLLECTIONS_QUERY, {\n query,\n limit: options?.limit,\n chains: options?.chains,\n })\n return result.collectionsByQuery\n }\n\n async nfts(\n query: string,\n options?: { collection?: string; chains?: string[]; limit?: number },\n ): Promise<SearchNFTResult[]> {\n const result = await this.client.graphql<{\n itemsByQuery: SearchNFTResult[]\n }>(SEARCH_NFTS_QUERY, {\n query,\n collectionSlug: options?.collection,\n limit: options?.limit,\n chains: options?.chains,\n })\n return result.itemsByQuery\n }\n\n async tokens(\n query: string,\n options?: { chain?: string; limit?: number },\n ): Promise<SearchTokenResult[]> {\n const result = await this.client.graphql<{\n currenciesByQuery: SearchTokenResult[]\n }>(SEARCH_TOKENS_QUERY, {\n query,\n limit: options?.limit,\n chain: options?.chain,\n })\n return result.currenciesByQuery\n }\n\n async accounts(\n query: string,\n options?: { limit?: number },\n ): Promise<SearchAccountResult[]> {\n const result = await this.client.graphql<{\n accountsByQuery: SearchAccountResult[]\n }>(SEARCH_ACCOUNTS_QUERY, {\n query,\n limit: options?.limit,\n })\n return result.accountsByQuery\n }\n}\n\nclass SwapsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async quote(options: {\n fromChain: string\n fromAddress: string\n toChain: string\n toAddress: string\n quantity: string\n address: string\n slippage?: number\n recipient?: string\n }): Promise<SwapQuoteResponse> {\n return this.client.get(\"/api/v2/swap/quote\", {\n from_chain: options.fromChain,\n from_address: options.fromAddress,\n to_chain: options.toChain,\n to_address: options.toAddress,\n quantity: options.quantity,\n address: options.address,\n slippage: options.slippage,\n recipient: options.recipient,\n })\n }\n}\n"],"mappings":"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","names":["lines"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/toon.ts","../src/output.ts","../src/sdk.ts"],"sourcesContent":["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","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 { OpenSeaClient } from \"./client.js\"\nimport type {\n Account,\n AssetEvent,\n Chain,\n Collection,\n CollectionOrderBy,\n CollectionStats,\n Contract,\n EventType,\n GetTraitsResponse,\n Listing,\n NFT,\n Offer,\n OpenSeaClientConfig,\n SearchAssetType,\n SearchResponse,\n SwapQuoteResponse,\n Token,\n TokenDetails,\n} from \"./types/index.js\"\n\nexport class OpenSeaCLI {\n private client: OpenSeaClient\n\n readonly collections: CollectionsAPI\n readonly nfts: NFTsAPI\n readonly listings: ListingsAPI\n readonly offers: OffersAPI\n readonly events: EventsAPI\n readonly accounts: AccountsAPI\n readonly tokens: TokensAPI\n readonly search: SearchAPI\n readonly swaps: SwapsAPI\n\n constructor(config: OpenSeaClientConfig) {\n this.client = new OpenSeaClient(config)\n this.collections = new CollectionsAPI(this.client)\n this.nfts = new NFTsAPI(this.client)\n this.listings = new ListingsAPI(this.client)\n this.offers = new OffersAPI(this.client)\n this.events = new EventsAPI(this.client)\n this.accounts = new AccountsAPI(this.client)\n this.tokens = new TokensAPI(this.client)\n this.search = new SearchAPI(this.client)\n this.swaps = new SwapsAPI(this.client)\n }\n}\n\nclass CollectionsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(slug: string): Promise<Collection> {\n return this.client.get<Collection>(`/api/v2/collections/${slug}`)\n }\n\n async list(options?: {\n chain?: Chain\n limit?: number\n next?: string\n orderBy?: CollectionOrderBy\n creatorUsername?: string\n includeHidden?: boolean\n }): Promise<{ collections: Collection[]; next?: string }> {\n return this.client.get(\"/api/v2/collections\", {\n chain: options?.chain,\n limit: options?.limit,\n next: options?.next,\n order_by: options?.orderBy,\n creator_username: options?.creatorUsername,\n include_hidden: options?.includeHidden,\n })\n }\n\n async stats(slug: string): Promise<CollectionStats> {\n return this.client.get<CollectionStats>(`/api/v2/collections/${slug}/stats`)\n }\n\n async traits(slug: string): Promise<GetTraitsResponse> {\n return this.client.get<GetTraitsResponse>(`/api/v2/traits/${slug}`)\n }\n}\n\nclass NFTsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(\n chain: Chain,\n address: string,\n identifier: string,\n ): Promise<{ nft: NFT }> {\n return this.client.get(\n `/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}`,\n )\n }\n\n async listByCollection(\n slug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/collection/${slug}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async listByContract(\n chain: Chain,\n address: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/chain/${chain}/contract/${address}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async listByAccount(\n chain: Chain,\n address: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/chain/${chain}/account/${address}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async refresh(\n chain: Chain,\n address: string,\n identifier: string,\n ): Promise<void> {\n await this.client.post(\n `/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}/refresh`,\n )\n }\n\n async getContract(chain: Chain, address: string): Promise<Contract> {\n return this.client.get(`/api/v2/chain/${chain}/contract/${address}`)\n }\n}\n\nclass ListingsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async all(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ listings: Listing[]; next?: string }> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/all`,\n { limit: options?.limit, next: options?.next },\n )\n }\n\n async best(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ listings: Listing[]; next?: string }> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/best`,\n { limit: options?.limit, next: options?.next },\n )\n }\n\n async bestForNFT(collectionSlug: string, tokenId: string): Promise<Listing> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/nfts/${tokenId}/best`,\n )\n }\n}\n\nclass OffersAPI {\n constructor(private client: OpenSeaClient) {}\n\n async all(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(`/api/v2/offers/collection/${collectionSlug}/all`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async collection(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(`/api/v2/offers/collection/${collectionSlug}`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async bestForNFT(collectionSlug: string, tokenId: string): Promise<Offer> {\n return this.client.get(\n `/api/v2/offers/collection/${collectionSlug}/nfts/${tokenId}/best`,\n )\n }\n\n async traits(\n collectionSlug: string,\n options: {\n type: string\n value: string\n limit?: number\n next?: string\n },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(\n `/api/v2/offers/collection/${collectionSlug}/traits`,\n {\n type: options.type,\n value: options.value,\n limit: options.limit,\n next: options.next,\n },\n )\n }\n}\n\nclass EventsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async list(options?: {\n eventType?: EventType\n after?: number\n before?: number\n limit?: number\n next?: string\n chain?: Chain\n }): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(\"/api/v2/events\", {\n event_type: options?.eventType,\n after: options?.after,\n before: options?.before,\n limit: options?.limit,\n next: options?.next,\n chain: options?.chain,\n })\n }\n\n async byAccount(\n address: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n chain?: Chain\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(`/api/v2/events/accounts/${address}`, {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n chain: options?.chain,\n })\n }\n\n async byCollection(\n collectionSlug: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(`/api/v2/events/collection/${collectionSlug}`, {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async byNFT(\n chain: Chain,\n address: string,\n identifier: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(\n `/api/v2/events/chain/${chain}/contract/${address}/nfts/${identifier}`,\n {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n },\n )\n }\n}\n\nclass AccountsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(address: string): Promise<Account> {\n return this.client.get(`/api/v2/accounts/${address}`)\n }\n}\n\nclass TokensAPI {\n constructor(private client: OpenSeaClient) {}\n\n async trending(options?: {\n limit?: number\n chains?: string[]\n next?: string\n }): Promise<{ tokens: Token[]; next?: string }> {\n // The tokens API uses \"cursor\" as its query param instead of \"next\".\n // The SDK accepts \"next\" for consistency with all other endpoints.\n return this.client.get(\"/api/v2/tokens/trending\", {\n limit: options?.limit,\n chains: options?.chains?.join(\",\"),\n cursor: options?.next,\n })\n }\n\n async top(options?: {\n limit?: number\n chains?: string[]\n next?: string\n }): Promise<{ tokens: Token[]; next?: string }> {\n // The tokens API uses \"cursor\" as its query param instead of \"next\".\n // The SDK accepts \"next\" for consistency with all other endpoints.\n return this.client.get(\"/api/v2/tokens/top\", {\n limit: options?.limit,\n chains: options?.chains?.join(\",\"),\n cursor: options?.next,\n })\n }\n\n async get(chain: Chain, address: string): Promise<TokenDetails> {\n return this.client.get(`/api/v2/chain/${chain}/token/${address}`)\n }\n}\n\nclass SearchAPI {\n constructor(private client: OpenSeaClient) {}\n\n async query(\n query: string,\n options?: {\n assetTypes?: SearchAssetType[]\n chains?: string[]\n limit?: number\n },\n ): Promise<SearchResponse> {\n return this.client.get<SearchResponse>(\"/api/v2/search\", {\n query,\n asset_types: options?.assetTypes?.join(\",\"),\n chains: options?.chains?.join(\",\"),\n limit: options?.limit,\n })\n }\n}\n\nclass SwapsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async quote(options: {\n fromChain: string\n fromAddress: string\n toChain: string\n toAddress: string\n quantity: string\n address: string\n slippage?: number\n recipient?: string\n }): Promise<SwapQuoteResponse> {\n return this.client.get(\"/api/v2/swap/quote\", {\n from_chain: options.fromChain,\n from_address: options.fromAddress,\n to_chain: options.toChain,\n to_address: options.toAddress,\n quantity: options.quantity,\n address: options.address,\n slippage: options.slippage,\n recipient: options.recipient,\n })\n }\n}\n"],"mappings":"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","names":["lines"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opensea/cli",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "type": "module",
5
5
  "description": "OpenSea CLI - Query the OpenSea API from the command line or programmatically",
6
6
  "main": "dist/index.js",