opensea-cli 0.1.5 → 0.1.6
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/LICENSE +7 -0
- package/README.md +83 -1
- package/dist/cli.js +184 -9
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +104 -1
- package/dist/index.js +162 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Copyright 2026 Ozone Networks, Inc.
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
4
|
+
|
|
5
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,7 +1,37 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="./img/banner.png" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
[![Version][version-badge]][version-link]
|
|
6
|
+
[![npm][npm-badge]][npm-link]
|
|
7
|
+
[![Test CI][ci-badge]][ci-link]
|
|
8
|
+
[![License][license-badge]][license-link]
|
|
9
|
+
|
|
10
|
+
# opensea-cli <!-- omit in toc -->
|
|
2
11
|
|
|
3
12
|
Query the OpenSea API from the command line or programmatically. Designed for both AI agents and developers.
|
|
4
13
|
|
|
14
|
+
## Table of Contents
|
|
15
|
+
|
|
16
|
+
- [Install](#install)
|
|
17
|
+
- [Authentication](#authentication)
|
|
18
|
+
- [CLI Usage](#cli-usage)
|
|
19
|
+
- [Global Options](#global-options)
|
|
20
|
+
- [Collections](#collections)
|
|
21
|
+
- [NFTs](#nfts)
|
|
22
|
+
- [Listings](#listings)
|
|
23
|
+
- [Offers](#offers)
|
|
24
|
+
- [Events](#events)
|
|
25
|
+
- [Search](#search)
|
|
26
|
+
- [Tokens](#tokens)
|
|
27
|
+
- [Swaps](#swaps)
|
|
28
|
+
- [Accounts](#accounts)
|
|
29
|
+
- [Programmatic SDK](#programmatic-sdk)
|
|
30
|
+
- [Output Formats](#output-formats)
|
|
31
|
+
- [Examples](#examples)
|
|
32
|
+
- [Exit Codes](#exit-codes)
|
|
33
|
+
- [Requirements](#requirements)
|
|
34
|
+
|
|
5
35
|
## Install
|
|
6
36
|
|
|
7
37
|
```bash
|
|
@@ -85,6 +115,15 @@ opensea events by-collection <slug> [--event-type <type>]
|
|
|
85
115
|
opensea events by-nft <chain> <contract> <token-id> [--event-type <type>]
|
|
86
116
|
```
|
|
87
117
|
|
|
118
|
+
### Search
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
opensea search collections <query> [--chains <chains>] [--limit <n>]
|
|
122
|
+
opensea search nfts <query> [--collection <slug>] [--chains <chains>] [--limit <n>]
|
|
123
|
+
opensea search tokens <query> [--chain <chain>] [--limit <n>]
|
|
124
|
+
opensea search accounts <query> [--limit <n>]
|
|
125
|
+
```
|
|
126
|
+
|
|
88
127
|
### Tokens
|
|
89
128
|
|
|
90
129
|
```bash
|
|
@@ -120,6 +159,7 @@ const nfts = await client.nfts.listByCollection("mfers", { limit: 5 })
|
|
|
120
159
|
const listings = await client.listings.best("mfers", { limit: 10 })
|
|
121
160
|
const events = await client.events.byCollection("mfers", { eventType: "sale" })
|
|
122
161
|
const account = await client.accounts.get("0x21130e908bba2d41b63fbca7caa131285b8724f8")
|
|
162
|
+
const searchResults = await client.search.collections("mfers", { limit: 5 })
|
|
123
163
|
```
|
|
124
164
|
|
|
125
165
|
## Output Formats
|
|
@@ -223,6 +263,28 @@ opensea events by-nft ethereum 0xd9b78a2f1dafc8bb9c60961790d2beefebee56f4 1 --li
|
|
|
223
263
|
opensea events by-account 0x21130e908bba2d41b63fbca7caa131285b8724f8 --limit 2
|
|
224
264
|
```
|
|
225
265
|
|
|
266
|
+
### Search
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
# Search for collections
|
|
270
|
+
opensea search collections mfers
|
|
271
|
+
|
|
272
|
+
# Search for NFTs
|
|
273
|
+
opensea search nfts "cool cat" --limit 5
|
|
274
|
+
|
|
275
|
+
# Search for NFTs within a specific collection
|
|
276
|
+
opensea search nfts "rare" --collection tiny-dinos-eth --limit 5
|
|
277
|
+
|
|
278
|
+
# Search for tokens/currencies
|
|
279
|
+
opensea search tokens eth --limit 5
|
|
280
|
+
|
|
281
|
+
# Search for tokens on a specific chain
|
|
282
|
+
opensea search tokens usdc --chain base --limit 5
|
|
283
|
+
|
|
284
|
+
# Search for accounts
|
|
285
|
+
opensea search accounts vitalik --limit 5
|
|
286
|
+
```
|
|
287
|
+
|
|
226
288
|
### Tokens
|
|
227
289
|
|
|
228
290
|
```bash
|
|
@@ -242,6 +304,17 @@ opensea tokens top --chains base --limit 2
|
|
|
242
304
|
opensea tokens get base 0x3ec2156d4c0a9cbdab4a016633b7bcf6a8d68ea2
|
|
243
305
|
```
|
|
244
306
|
|
|
307
|
+
### Swaps
|
|
308
|
+
|
|
309
|
+
```bash
|
|
310
|
+
# Get a swap quote for USDC to DRB on Base
|
|
311
|
+
opensea swaps quote \
|
|
312
|
+
--from-chain base --from-address 0x833589fcd6edb6e08f4c7c32d4f71b54bda02913 \
|
|
313
|
+
--to-chain base --to-address 0x3ec2156d4c0a9cbdab4a016633b7bcf6a8d68ea2 \
|
|
314
|
+
--quantity 1000000 \
|
|
315
|
+
--address 0x21130e908bba2d41b63fbca7caa131285b8724f8
|
|
316
|
+
```
|
|
317
|
+
|
|
245
318
|
### Accounts
|
|
246
319
|
|
|
247
320
|
```bash
|
|
@@ -259,3 +332,12 @@ opensea accounts get 0x21130e908bba2d41b63fbca7caa131285b8724f8
|
|
|
259
332
|
|
|
260
333
|
- Node.js >= 18.0.0
|
|
261
334
|
- OpenSea API key ([get one here](https://docs.opensea.io/reference/api-keys))
|
|
335
|
+
|
|
336
|
+
[version-badge]: https://img.shields.io/github/package-json/v/ProjectOpenSea/opensea-cli
|
|
337
|
+
[version-link]: https://github.com/ProjectOpenSea/opensea-cli/releases
|
|
338
|
+
[npm-badge]: https://img.shields.io/npm/v/opensea-cli?color=red
|
|
339
|
+
[npm-link]: https://www.npmjs.com/package/opensea-cli
|
|
340
|
+
[ci-badge]: https://github.com/ProjectOpenSea/opensea-cli/actions/workflows/ci.yml/badge.svg
|
|
341
|
+
[ci-link]: https://github.com/ProjectOpenSea/opensea-cli/actions/workflows/ci.yml
|
|
342
|
+
[license-badge]: https://img.shields.io/github/license/ProjectOpenSea/opensea-cli
|
|
343
|
+
[license-link]: https://github.com/ProjectOpenSea/opensea-cli/blob/main/LICENSE
|
package/dist/cli.js
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// src/cli.ts
|
|
4
|
-
import { Command as
|
|
4
|
+
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";
|
|
8
9
|
var OpenSeaClient = class {
|
|
9
10
|
apiKey;
|
|
10
11
|
baseUrl;
|
|
12
|
+
graphqlUrl;
|
|
11
13
|
defaultChain;
|
|
12
14
|
constructor(config) {
|
|
13
15
|
this.apiKey = config.apiKey;
|
|
14
16
|
this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
|
|
17
|
+
this.graphqlUrl = config.graphqlUrl ?? DEFAULT_GRAPHQL_URL;
|
|
15
18
|
this.defaultChain = config.chain ?? "ethereum";
|
|
16
19
|
}
|
|
17
20
|
async get(path, params) {
|
|
@@ -51,6 +54,33 @@ var OpenSeaClient = class {
|
|
|
51
54
|
}
|
|
52
55
|
return response.json();
|
|
53
56
|
}
|
|
57
|
+
async graphql(query, variables) {
|
|
58
|
+
const response = await fetch(this.graphqlUrl, {
|
|
59
|
+
method: "POST",
|
|
60
|
+
headers: {
|
|
61
|
+
"Content-Type": "application/json",
|
|
62
|
+
Accept: "application/json",
|
|
63
|
+
"x-api-key": this.apiKey
|
|
64
|
+
},
|
|
65
|
+
body: JSON.stringify({ query, variables })
|
|
66
|
+
});
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
const body = await response.text();
|
|
69
|
+
throw new OpenSeaAPIError(response.status, body, "graphql");
|
|
70
|
+
}
|
|
71
|
+
const json = await response.json();
|
|
72
|
+
if (json.errors?.length) {
|
|
73
|
+
throw new OpenSeaAPIError(
|
|
74
|
+
400,
|
|
75
|
+
json.errors.map((e) => e.message).join("; "),
|
|
76
|
+
"graphql"
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
if (!json.data) {
|
|
80
|
+
throw new OpenSeaAPIError(500, "GraphQL response missing data", "graphql");
|
|
81
|
+
}
|
|
82
|
+
return json.data;
|
|
83
|
+
}
|
|
54
84
|
getDefaultChain() {
|
|
55
85
|
return this.defaultChain;
|
|
56
86
|
}
|
|
@@ -376,10 +406,156 @@ function offersCommand(getClient2, getFormat2) {
|
|
|
376
406
|
return cmd;
|
|
377
407
|
}
|
|
378
408
|
|
|
379
|
-
// src/commands/
|
|
409
|
+
// src/commands/search.ts
|
|
380
410
|
import { Command as Command7 } from "commander";
|
|
411
|
+
|
|
412
|
+
// src/queries.ts
|
|
413
|
+
var SEARCH_COLLECTIONS_QUERY = `
|
|
414
|
+
query SearchCollections($query: String!, $limit: Int, $chains: [ChainIdentifier!]) {
|
|
415
|
+
collectionsByQuery(query: $query, limit: $limit, chains: $chains) {
|
|
416
|
+
slug
|
|
417
|
+
name
|
|
418
|
+
description
|
|
419
|
+
imageUrl
|
|
420
|
+
chain {
|
|
421
|
+
identifier
|
|
422
|
+
name
|
|
423
|
+
}
|
|
424
|
+
stats {
|
|
425
|
+
totalSupply
|
|
426
|
+
ownerCount
|
|
427
|
+
volume {
|
|
428
|
+
usd
|
|
429
|
+
}
|
|
430
|
+
sales
|
|
431
|
+
}
|
|
432
|
+
floorPrice {
|
|
433
|
+
pricePerItem {
|
|
434
|
+
usd
|
|
435
|
+
native {
|
|
436
|
+
unit
|
|
437
|
+
symbol
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
}`;
|
|
443
|
+
var SEARCH_NFTS_QUERY = `
|
|
444
|
+
query SearchItems($query: String!, $collectionSlug: String, $limit: Int, $chains: [ChainIdentifier!]) {
|
|
445
|
+
itemsByQuery(query: $query, collectionSlug: $collectionSlug, limit: $limit, chains: $chains) {
|
|
446
|
+
tokenId
|
|
447
|
+
name
|
|
448
|
+
description
|
|
449
|
+
imageUrl
|
|
450
|
+
contractAddress
|
|
451
|
+
collection {
|
|
452
|
+
slug
|
|
453
|
+
name
|
|
454
|
+
}
|
|
455
|
+
chain {
|
|
456
|
+
identifier
|
|
457
|
+
name
|
|
458
|
+
}
|
|
459
|
+
bestListing {
|
|
460
|
+
pricePerItem {
|
|
461
|
+
usd
|
|
462
|
+
native {
|
|
463
|
+
unit
|
|
464
|
+
symbol
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
owner {
|
|
469
|
+
address
|
|
470
|
+
displayName
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}`;
|
|
474
|
+
var SEARCH_TOKENS_QUERY = `
|
|
475
|
+
query SearchCurrencies($query: String!, $limit: Int, $chain: ChainIdentifier) {
|
|
476
|
+
currenciesByQuery(query: $query, limit: $limit, chain: $chain, allowlistOnly: false) {
|
|
477
|
+
name
|
|
478
|
+
symbol
|
|
479
|
+
imageUrl
|
|
480
|
+
usdPrice
|
|
481
|
+
contractAddress
|
|
482
|
+
chain {
|
|
483
|
+
identifier
|
|
484
|
+
name
|
|
485
|
+
}
|
|
486
|
+
stats {
|
|
487
|
+
marketCapUsd
|
|
488
|
+
oneDay {
|
|
489
|
+
priceChange
|
|
490
|
+
volume
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
}`;
|
|
495
|
+
var SEARCH_ACCOUNTS_QUERY = `
|
|
496
|
+
query SearchAccounts($query: String!, $limit: Int) {
|
|
497
|
+
accountsByQuery(query: $query, limit: $limit) {
|
|
498
|
+
address
|
|
499
|
+
username
|
|
500
|
+
imageUrl
|
|
501
|
+
isVerified
|
|
502
|
+
}
|
|
503
|
+
}`;
|
|
504
|
+
|
|
505
|
+
// src/commands/search.ts
|
|
506
|
+
function searchCommand(getClient2, getFormat2) {
|
|
507
|
+
const cmd = new Command7("search").description(
|
|
508
|
+
"Search for collections, NFTs, tokens, and accounts"
|
|
509
|
+
);
|
|
510
|
+
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(
|
|
511
|
+
async (query, options) => {
|
|
512
|
+
const client = getClient2();
|
|
513
|
+
const result = await client.graphql(SEARCH_COLLECTIONS_QUERY, {
|
|
514
|
+
query,
|
|
515
|
+
limit: Number.parseInt(options.limit, 10),
|
|
516
|
+
chains: options.chains?.split(",")
|
|
517
|
+
});
|
|
518
|
+
console.log(formatOutput(result.collectionsByQuery, getFormat2()));
|
|
519
|
+
}
|
|
520
|
+
);
|
|
521
|
+
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(
|
|
522
|
+
async (query, options) => {
|
|
523
|
+
const client = getClient2();
|
|
524
|
+
const result = await client.graphql(SEARCH_NFTS_QUERY, {
|
|
525
|
+
query,
|
|
526
|
+
collectionSlug: options.collection,
|
|
527
|
+
limit: Number.parseInt(options.limit, 10),
|
|
528
|
+
chains: options.chains?.split(",")
|
|
529
|
+
});
|
|
530
|
+
console.log(formatOutput(result.itemsByQuery, getFormat2()));
|
|
531
|
+
}
|
|
532
|
+
);
|
|
533
|
+
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(
|
|
534
|
+
async (query, options) => {
|
|
535
|
+
const client = getClient2();
|
|
536
|
+
const result = await client.graphql(SEARCH_TOKENS_QUERY, {
|
|
537
|
+
query,
|
|
538
|
+
limit: Number.parseInt(options.limit, 10),
|
|
539
|
+
chain: options.chain
|
|
540
|
+
});
|
|
541
|
+
console.log(formatOutput(result.currenciesByQuery, getFormat2()));
|
|
542
|
+
}
|
|
543
|
+
);
|
|
544
|
+
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) => {
|
|
545
|
+
const client = getClient2();
|
|
546
|
+
const result = await client.graphql(SEARCH_ACCOUNTS_QUERY, {
|
|
547
|
+
query,
|
|
548
|
+
limit: Number.parseInt(options.limit, 10)
|
|
549
|
+
});
|
|
550
|
+
console.log(formatOutput(result.accountsByQuery, getFormat2()));
|
|
551
|
+
});
|
|
552
|
+
return cmd;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
// src/commands/swaps.ts
|
|
556
|
+
import { Command as Command8 } from "commander";
|
|
381
557
|
function swapsCommand(getClient2, getFormat2) {
|
|
382
|
-
const cmd = new
|
|
558
|
+
const cmd = new Command8("swaps").description(
|
|
383
559
|
"Get swap quotes for token trading"
|
|
384
560
|
);
|
|
385
561
|
cmd.command("quote").description(
|
|
@@ -419,9 +595,9 @@ function swapsCommand(getClient2, getFormat2) {
|
|
|
419
595
|
}
|
|
420
596
|
|
|
421
597
|
// src/commands/tokens.ts
|
|
422
|
-
import { Command as
|
|
598
|
+
import { Command as Command9 } from "commander";
|
|
423
599
|
function tokensCommand(getClient2, getFormat2) {
|
|
424
|
-
const cmd = new
|
|
600
|
+
const cmd = new Command9("tokens").description(
|
|
425
601
|
"Query trending tokens, top tokens, and token details"
|
|
426
602
|
);
|
|
427
603
|
cmd.command("trending").description("Get trending tokens based on OpenSea's trending score").option("--chains <chains>", "Comma-separated list of chains to filter by").option("--limit <limit>", "Number of results (max 100)", "20").option("--cursor <cursor>", "Pagination cursor").action(
|
|
@@ -473,8 +649,8 @@ var BANNER = `
|
|
|
473
649
|
| |
|
|
474
650
|
|_|
|
|
475
651
|
`;
|
|
476
|
-
var program = new
|
|
477
|
-
program.name("opensea").description("OpenSea CLI - Query the OpenSea API from the command line").version("0.
|
|
652
|
+
var program = new Command10();
|
|
653
|
+
program.name("opensea").description("OpenSea CLI - Query the OpenSea API from the command line").version(process.env.npm_package_version ?? "0.0.0").addHelpText("before", BANNER).option("--api-key <key>", "OpenSea API key (or set OPENSEA_API_KEY env var)").option("--chain <chain>", "Default chain", "ethereum").option("--format <format>", "Output format (json or table)", "json").option("--base-url <url>", "API base URL");
|
|
478
654
|
function getClient() {
|
|
479
655
|
const opts = program.opts();
|
|
480
656
|
const apiKey = opts.apiKey ?? process.env.OPENSEA_API_KEY;
|
|
@@ -501,9 +677,8 @@ program.addCommand(offersCommand(getClient, getFormat));
|
|
|
501
677
|
program.addCommand(eventsCommand(getClient, getFormat));
|
|
502
678
|
program.addCommand(accountsCommand(getClient, getFormat));
|
|
503
679
|
program.addCommand(tokensCommand(getClient, getFormat));
|
|
680
|
+
program.addCommand(searchCommand(getClient, getFormat));
|
|
504
681
|
program.addCommand(swapsCommand(getClient, getFormat));
|
|
505
|
-
program.hook("postAction", () => {
|
|
506
|
-
});
|
|
507
682
|
async function main() {
|
|
508
683
|
try {
|
|
509
684
|
await program.parseAsync(process.argv);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/client.ts","../src/commands/accounts.ts","../src/output.ts","../src/commands/collections.ts","../src/commands/events.ts","../src/commands/listings.ts","../src/commands/nfts.ts","../src/commands/offers.ts","../src/commands/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 swapsCommand,\n tokensCommand,\n} from \"./commands/index.js\"\n\nconst BANNER = `\n ____ _____\n / __ \\\\ / ____|\n | | | |_ __ ___ _ _| (___ ___ __ _\n | | | | '_ \\\\ / _ \\\\ '_ \\\\___ \\\\ / _ \\\\/ _\\` |\n | |__| | |_) | __/ | | |___) | __/ (_| |\n \\\\____/| .__/ \\\\___|_| |_|____/ \\\\___|\\\\__,_|\n | |\n |_|\n`\n\nconst program = new Command()\n\nprogram\n .name(\"opensea\")\n .description(\"OpenSea CLI - Query the OpenSea API from the command line\")\n .version(\"0.1.0\")\n .addHelpText(\"before\", BANNER)\n .option(\"--api-key <key>\", \"OpenSea API key (or set OPENSEA_API_KEY env var)\")\n .option(\"--chain <chain>\", \"Default chain\", \"ethereum\")\n .option(\"--format <format>\", \"Output format (json or table)\", \"json\")\n .option(\"--base-url <url>\", \"API base URL\")\n\nfunction getClient(): OpenSeaClient {\n const opts = program.opts<{\n apiKey?: string\n chain: string\n baseUrl?: string\n }>()\n\n const apiKey = opts.apiKey ?? process.env.OPENSEA_API_KEY\n if (!apiKey) {\n console.error(\n \"Error: API key required. Use --api-key or set OPENSEA_API_KEY environment variable.\",\n )\n process.exit(2)\n }\n\n return new OpenSeaClient({\n apiKey,\n chain: opts.chain,\n baseUrl: opts.baseUrl,\n })\n}\n\nfunction getFormat(): \"json\" | \"table\" {\n const opts = program.opts<{ format: string }>()\n return opts.format === \"table\" ? \"table\" : \"json\"\n}\n\nprogram.addCommand(collectionsCommand(getClient, getFormat))\nprogram.addCommand(nftsCommand(getClient, getFormat))\nprogram.addCommand(listingsCommand(getClient, getFormat))\nprogram.addCommand(offersCommand(getClient, getFormat))\nprogram.addCommand(eventsCommand(getClient, getFormat))\nprogram.addCommand(accountsCommand(getClient, getFormat))\nprogram.addCommand(tokensCommand(getClient, getFormat))\nprogram.addCommand(swapsCommand(getClient, getFormat))\n\nprogram.hook(\"postAction\", () => {})\n\nasync function main() {\n try {\n await program.parseAsync(process.argv)\n } catch (error) {\n if (error instanceof OpenSeaAPIError) {\n console.error(\n JSON.stringify(\n {\n error: \"API Error\",\n status: error.statusCode,\n path: error.path,\n message: error.responseBody,\n },\n null,\n 2,\n ),\n )\n process.exit(1)\n }\n throw error\n }\n}\n\nmain()\n","import type { OpenSeaClientConfig } from \"./types/index.js\"\n\nconst DEFAULT_BASE_URL = \"https://api.opensea.io\"\n\nexport class OpenSeaClient {\n private apiKey: string\n private baseUrl: string\n private defaultChain: string\n\n constructor(config: OpenSeaClientConfig) {\n this.apiKey = config.apiKey\n this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL\n this.defaultChain = config.chain ?? \"ethereum\"\n }\n\n async get<T>(path: string, params?: Record<string, unknown>): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, path)\n }\n\n return response.json() as Promise<T>\n }\n\n async post<T>(path: string): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, path)\n }\n\n return response.json() as Promise<T>\n }\n\n getDefaultChain(): string {\n return this.defaultChain\n }\n}\n\nexport class OpenSeaAPIError extends Error {\n constructor(\n public statusCode: number,\n public responseBody: string,\n public path: string,\n ) {\n super(`OpenSea API error ${statusCode} on ${path}: ${responseBody}`)\n this.name = \"OpenSeaAPIError\"\n }\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { Account } from \"../types/index.js\"\n\nexport function accountsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"accounts\").description(\"Query accounts\")\n\n cmd\n .command(\"get\")\n .description(\"Get an account by address\")\n .argument(\"<address>\", \"Wallet address\")\n .action(async (address: string) => {\n const client = getClient()\n const result = await client.get<Account>(`/api/v2/accounts/${address}`)\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n","export function formatOutput(data: unknown, format: \"json\" | \"table\"): string {\n if (format === \"table\") {\n return formatTable(data)\n }\n return JSON.stringify(data, null, 2)\n}\n\nfunction formatTable(data: unknown): string {\n if (Array.isArray(data)) {\n if (data.length === 0) return \"(empty)\"\n const keys = Object.keys(data[0] as Record<string, unknown>)\n const widths = keys.map(key =>\n Math.max(\n key.length,\n ...data.map(row => {\n const val = (row as Record<string, unknown>)[key]\n return String(val ?? \"\").length\n }),\n ),\n )\n\n const header = keys.map((key, i) => key.padEnd(widths[i])).join(\" \")\n const separator = widths.map(w => \"-\".repeat(w)).join(\" \")\n const rows = data.map(row =>\n keys\n .map((key, i) => {\n const val = (row as Record<string, unknown>)[key]\n return String(val ?? \"\").padEnd(widths[i])\n })\n .join(\" \"),\n )\n\n return [header, separator, ...rows].join(\"\\n\")\n }\n\n if (data && typeof data === \"object\") {\n const entries = Object.entries(data as Record<string, unknown>)\n const maxKeyLength = Math.max(...entries.map(([k]) => k.length))\n return entries\n .map(([key, value]) => {\n const displayValue =\n typeof value === \"object\" && value !== null\n ? JSON.stringify(value)\n : String(value ?? \"\")\n return `${key.padEnd(maxKeyLength)} ${displayValue}`\n })\n .join(\"\\n\")\n }\n\n return String(data)\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type {\n Chain,\n Collection,\n CollectionOrderBy,\n CollectionStats,\n GetTraitsResponse,\n} from \"../types/index.js\"\n\nexport function collectionsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"collections\").description(\n \"Manage and query NFT collections\",\n )\n\n cmd\n .command(\"get\")\n .description(\"Get a single collection by slug\")\n .argument(\"<slug>\", \"Collection slug\")\n .action(async (slug: string) => {\n const client = getClient()\n const result = await client.get<Collection>(`/api/v2/collections/${slug}`)\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"list\")\n .description(\"List collections\")\n .option(\"--chain <chain>\", \"Filter by chain\")\n .option(\n \"--order-by <orderBy>\",\n \"Order by field (created_date, one_day_change, seven_day_volume, seven_day_change, num_owners, market_cap)\",\n )\n .option(\"--creator <username>\", \"Filter by creator username\")\n .option(\"--include-hidden\", \"Include hidden collections\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (options: {\n chain?: string\n orderBy?: string\n creator?: string\n includeHidden?: boolean\n limit: string\n next?: string\n }) => {\n const client = getClient()\n const result = await client.get<{\n collections: Collection[]\n next?: string\n }>(\"/api/v2/collections\", {\n chain: options.chain as Chain | undefined,\n order_by: options.orderBy as CollectionOrderBy | undefined,\n creator_username: options.creator,\n include_hidden: options.includeHidden,\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"stats\")\n .description(\"Get collection stats\")\n .argument(\"<slug>\", \"Collection slug\")\n .action(async (slug: string) => {\n const client = getClient()\n const result = await client.get<CollectionStats>(\n `/api/v2/collections/${slug}/stats`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"traits\")\n .description(\"Get collection traits\")\n .argument(\"<slug>\", \"Collection slug\")\n .action(async (slug: string) => {\n const client = getClient()\n const result = await client.get<GetTraitsResponse>(\n `/api/v2/traits/${slug}`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { AssetEvent } from \"../types/index.js\"\n\nexport function eventsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"events\").description(\"Query marketplace events\")\n\n cmd\n .command(\"list\")\n .description(\"List events\")\n .option(\n \"--event-type <type>\",\n \"Event type (sale, transfer, mint, listing, offer, trait_offer, collection_offer)\",\n )\n .option(\"--after <timestamp>\", \"Filter events after this Unix timestamp\")\n .option(\"--before <timestamp>\", \"Filter events before this Unix timestamp\")\n .option(\"--chain <chain>\", \"Filter by chain\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (options: {\n eventType?: string\n after?: string\n before?: string\n chain?: string\n limit: string\n next?: string\n }) => {\n const client = getClient()\n const result = await client.get<{\n asset_events: AssetEvent[]\n next?: string\n }>(\"/api/v2/events\", {\n event_type: options.eventType,\n after: options.after ? Number.parseInt(options.after, 10) : undefined,\n before: options.before\n ? Number.parseInt(options.before, 10)\n : undefined,\n chain: options.chain,\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"by-account\")\n .description(\"Get events for an account\")\n .argument(\"<address>\", \"Account address\")\n .option(\"--event-type <type>\", \"Event type\")\n .option(\"--chain <chain>\", \"Filter by chain\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n address: string,\n options: {\n eventType?: string\n chain?: string\n limit: string\n next?: string\n },\n ) => {\n const client = getClient()\n const result = await client.get<{\n asset_events: AssetEvent[]\n next?: string\n }>(`/api/v2/events/accounts/${address}`, {\n event_type: options.eventType,\n chain: options.chain,\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"by-collection\")\n .description(\"Get events for a collection\")\n .argument(\"<slug>\", \"Collection slug\")\n .option(\"--event-type <type>\", \"Event type\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n slug: string,\n options: {\n eventType?: string\n limit: string\n next?: string\n },\n ) => {\n const client = getClient()\n const result = await client.get<{\n asset_events: AssetEvent[]\n next?: string\n }>(`/api/v2/events/collection/${slug}`, {\n event_type: options.eventType,\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"by-nft\")\n .description(\"Get events for a specific NFT\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<contract>\", \"Contract address\")\n .argument(\"<token-id>\", \"Token ID\")\n .option(\"--event-type <type>\", \"Event type\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n chain: string,\n contract: string,\n tokenId: string,\n options: {\n eventType?: string\n limit: string\n next?: string\n },\n ) => {\n const client = getClient()\n const result = await client.get<{\n asset_events: AssetEvent[]\n next?: string\n }>(\n `/api/v2/events/chain/${chain}/contract/${contract}/nfts/${tokenId}`,\n {\n event_type: options.eventType,\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { Listing } from \"../types/index.js\"\n\nexport function listingsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"listings\").description(\"Query NFT listings\")\n\n cmd\n .command(\"all\")\n .description(\"Get all listings for a collection\")\n .argument(\"<collection>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (collection: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{\n listings: Listing[]\n next?: string\n }>(`/api/v2/listings/collection/${collection}/all`, {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"best\")\n .description(\"Get best listings for a collection\")\n .argument(\"<collection>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (collection: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{\n listings: Listing[]\n next?: string\n }>(`/api/v2/listings/collection/${collection}/best`, {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"best-for-nft\")\n .description(\"Get best listing for a specific NFT\")\n .argument(\"<collection>\", \"Collection slug\")\n .argument(\"<token-id>\", \"Token ID\")\n .action(async (collection: string, tokenId: string) => {\n const client = getClient()\n const result = await client.get<Listing>(\n `/api/v2/listings/collection/${collection}/nfts/${tokenId}/best`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { Contract, NFT } from \"../types/index.js\"\n\nexport function nftsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"nfts\").description(\"Query NFTs\")\n\n cmd\n .command(\"get\")\n .description(\"Get a single NFT\")\n .argument(\"<chain>\", \"Chain (e.g. ethereum, base)\")\n .argument(\"<contract>\", \"Contract address\")\n .argument(\"<token-id>\", \"Token ID\")\n .action(async (chain: string, contract: string, tokenId: string) => {\n const client = getClient()\n const result = await client.get<{ nft: NFT }>(\n `/api/v2/chain/${chain}/contract/${contract}/nfts/${tokenId}`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"list-by-collection\")\n .description(\"List NFTs in a collection\")\n .argument(\"<slug>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(async (slug: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{ nfts: NFT[]; next?: string }>(\n `/api/v2/collection/${slug}/nfts`,\n {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n },\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"list-by-contract\")\n .description(\"List NFTs by contract address\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<contract>\", \"Contract address\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n chain: string,\n contract: string,\n options: { limit: string; next?: string },\n ) => {\n const client = getClient()\n const result = await client.get<{ nfts: NFT[]; next?: string }>(\n `/api/v2/chain/${chain}/contract/${contract}/nfts`,\n {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"list-by-account\")\n .description(\"List NFTs owned by an account\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<address>\", \"Account address\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n chain: string,\n address: string,\n options: { limit: string; next?: string },\n ) => {\n const client = getClient()\n const result = await client.get<{ nfts: NFT[]; next?: string }>(\n `/api/v2/chain/${chain}/account/${address}/nfts`,\n {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"refresh\")\n .description(\"Refresh NFT metadata\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<contract>\", \"Contract address\")\n .argument(\"<token-id>\", \"Token ID\")\n .action(async (chain: string, contract: string, tokenId: string) => {\n const client = getClient()\n await client.post(\n `/api/v2/chain/${chain}/contract/${contract}/nfts/${tokenId}/refresh`,\n )\n console.log(\n formatOutput(\n { status: \"ok\", message: \"Metadata refresh requested\" },\n getFormat(),\n ),\n )\n })\n\n cmd\n .command(\"contract\")\n .description(\"Get contract details\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<address>\", \"Contract address\")\n .action(async (chain: string, address: string) => {\n const client = getClient()\n const result = await client.get<Contract>(\n `/api/v2/chain/${chain}/contract/${address}`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { Offer } from \"../types/index.js\"\n\nexport function offersCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"offers\").description(\"Query NFT offers\")\n\n cmd\n .command(\"all\")\n .description(\"Get all offers for a collection\")\n .argument(\"<collection>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (collection: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{\n offers: Offer[]\n next?: string\n }>(`/api/v2/offers/collection/${collection}/all`, {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"collection\")\n .description(\"Get collection offers\")\n .argument(\"<collection>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (collection: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{\n offers: Offer[]\n next?: string\n }>(`/api/v2/offers/collection/${collection}`, {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"best-for-nft\")\n .description(\"Get best offer for a specific NFT\")\n .argument(\"<collection>\", \"Collection slug\")\n .argument(\"<token-id>\", \"Token ID\")\n .action(async (collection: string, tokenId: string) => {\n const client = getClient()\n const result = await client.get<Offer>(\n `/api/v2/offers/collection/${collection}/nfts/${tokenId}/best`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"traits\")\n .description(\"Get trait offers for a collection\")\n .argument(\"<collection>\", \"Collection slug\")\n .requiredOption(\"--type <type>\", \"Trait type (required)\")\n .requiredOption(\"--value <value>\", \"Trait value (required)\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n collection: string,\n options: {\n type: string\n value: string\n limit: string\n next?: string\n },\n ) => {\n const client = getClient()\n const result = await client.get<{\n offers: Offer[]\n next?: string\n }>(`/api/v2/offers/collection/${collection}/traits`, {\n type: options.type,\n value: options.value,\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { SwapQuoteResponse } from \"../types/index.js\"\n\nexport function swapsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"swaps\").description(\n \"Get swap quotes for token trading\",\n )\n\n cmd\n .command(\"quote\")\n .description(\n \"Get a quote for swapping tokens, including price details and executable transaction data\",\n )\n .requiredOption(\"--from-chain <chain>\", \"Chain of the token to swap from\")\n .requiredOption(\n \"--from-address <address>\",\n \"Contract address of the token to swap from\",\n )\n .requiredOption(\"--to-chain <chain>\", \"Chain of the token to swap to\")\n .requiredOption(\n \"--to-address <address>\",\n \"Contract address of the token to swap to\",\n )\n .requiredOption(\"--quantity <quantity>\", \"Amount to swap (in token units)\")\n .requiredOption(\"--address <address>\", \"Wallet address executing the swap\")\n .option(\n \"--slippage <slippage>\",\n \"Slippage tolerance (0.0 to 0.5, default: 0.01)\",\n )\n .option(\n \"--recipient <recipient>\",\n \"Recipient address (defaults to sender address)\",\n )\n .action(\n async (options: {\n fromChain: string\n fromAddress: string\n toChain: string\n toAddress: string\n quantity: string\n address: string\n slippage?: string\n recipient?: string\n }) => {\n const client = getClient()\n const result = await client.get<SwapQuoteResponse>(\n \"/api/v2/swap/quote\",\n {\n from_chain: options.fromChain,\n from_address: options.fromAddress,\n to_chain: options.toChain,\n to_address: options.toAddress,\n quantity: options.quantity,\n address: options.address,\n slippage: options.slippage\n ? Number.parseFloat(options.slippage)\n : undefined,\n recipient: options.recipient,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { Chain, Token, TokenDetails } from \"../types/index.js\"\n\nexport function tokensCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"tokens\").description(\n \"Query trending tokens, top tokens, and token details\",\n )\n\n cmd\n .command(\"trending\")\n .description(\"Get trending tokens based on OpenSea's trending score\")\n .option(\"--chains <chains>\", \"Comma-separated list of chains to filter by\")\n .option(\"--limit <limit>\", \"Number of results (max 100)\", \"20\")\n .option(\"--cursor <cursor>\", \"Pagination cursor\")\n .action(\n async (options: { chains?: string; limit: string; cursor?: string }) => {\n const client = getClient()\n const result = await client.get<{ tokens: Token[]; next?: string }>(\n \"/api/v2/tokens/trending\",\n {\n chains: options.chains,\n limit: Number.parseInt(options.limit, 10),\n cursor: options.cursor,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"top\")\n .description(\"Get top tokens ranked by 24-hour trading volume\")\n .option(\"--chains <chains>\", \"Comma-separated list of chains to filter by\")\n .option(\"--limit <limit>\", \"Number of results (max 100)\", \"20\")\n .option(\"--cursor <cursor>\", \"Pagination cursor\")\n .action(\n async (options: { chains?: string; limit: string; cursor?: string }) => {\n const client = getClient()\n const result = await client.get<{ tokens: Token[]; next?: string }>(\n \"/api/v2/tokens/top\",\n {\n chains: options.chains,\n limit: Number.parseInt(options.limit, 10),\n cursor: options.cursor,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"get\")\n .description(\"Get detailed information about a specific token\")\n .argument(\"<chain>\", \"Blockchain chain\")\n .argument(\"<address>\", \"Token contract address\")\n .action(async (chain: string, address: string) => {\n const client = getClient()\n const result = await client.get<TokenDetails>(\n `/api/v2/chain/${chain as Chain}/token/${address}`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n"],"mappings":"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","names":["Command","getClient","getFormat","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/client.ts","../src/commands/accounts.ts","../src/output.ts","../src/commands/collections.ts","../src/commands/events.ts","../src/commands/listings.ts","../src/commands/nfts.ts","../src/commands/offers.ts","../src/commands/search.ts","../src/queries.ts","../src/commands/swaps.ts","../src/commands/tokens.ts"],"sourcesContent":["import { Command } from \"commander\"\nimport { OpenSeaAPIError, OpenSeaClient } from \"./client.js\"\nimport {\n accountsCommand,\n collectionsCommand,\n eventsCommand,\n listingsCommand,\n nftsCommand,\n offersCommand,\n searchCommand,\n swapsCommand,\n tokensCommand,\n} from \"./commands/index.js\"\n\nconst BANNER = `\n ____ _____\n / __ \\\\ / ____|\n | | | |_ __ ___ _ _| (___ ___ __ _\n | | | | '_ \\\\ / _ \\\\ '_ \\\\___ \\\\ / _ \\\\/ _\\` |\n | |__| | |_) | __/ | | |___) | __/ (_| |\n \\\\____/| .__/ \\\\___|_| |_|____/ \\\\___|\\\\__,_|\n | |\n |_|\n`\n\nconst program = new Command()\n\nprogram\n .name(\"opensea\")\n .description(\"OpenSea CLI - Query the OpenSea API from the command line\")\n .version(process.env.npm_package_version ?? \"0.0.0\")\n .addHelpText(\"before\", BANNER)\n .option(\"--api-key <key>\", \"OpenSea API key (or set OPENSEA_API_KEY env var)\")\n .option(\"--chain <chain>\", \"Default chain\", \"ethereum\")\n .option(\"--format <format>\", \"Output format (json or table)\", \"json\")\n .option(\"--base-url <url>\", \"API base URL\")\n\nfunction getClient(): OpenSeaClient {\n const opts = program.opts<{\n apiKey?: string\n chain: string\n baseUrl?: string\n }>()\n\n const apiKey = opts.apiKey ?? process.env.OPENSEA_API_KEY\n if (!apiKey) {\n console.error(\n \"Error: API key required. Use --api-key or set OPENSEA_API_KEY environment variable.\",\n )\n process.exit(2)\n }\n\n return new OpenSeaClient({\n apiKey,\n chain: opts.chain,\n baseUrl: opts.baseUrl,\n })\n}\n\nfunction getFormat(): \"json\" | \"table\" {\n const opts = program.opts<{ format: string }>()\n return opts.format === \"table\" ? \"table\" : \"json\"\n}\n\nprogram.addCommand(collectionsCommand(getClient, getFormat))\nprogram.addCommand(nftsCommand(getClient, getFormat))\nprogram.addCommand(listingsCommand(getClient, getFormat))\nprogram.addCommand(offersCommand(getClient, getFormat))\nprogram.addCommand(eventsCommand(getClient, getFormat))\nprogram.addCommand(accountsCommand(getClient, getFormat))\nprogram.addCommand(tokensCommand(getClient, getFormat))\nprogram.addCommand(searchCommand(getClient, getFormat))\nprogram.addCommand(swapsCommand(getClient, getFormat))\n\nasync function main() {\n try {\n await program.parseAsync(process.argv)\n } catch (error) {\n if (error instanceof OpenSeaAPIError) {\n console.error(\n JSON.stringify(\n {\n error: \"API Error\",\n status: error.statusCode,\n path: error.path,\n message: error.responseBody,\n },\n null,\n 2,\n ),\n )\n process.exit(1)\n }\n throw error\n }\n}\n\nmain()\n","import type { OpenSeaClientConfig } from \"./types/index.js\"\n\nconst DEFAULT_BASE_URL = \"https://api.opensea.io\"\nconst DEFAULT_GRAPHQL_URL = \"https://gql.opensea.io/graphql\"\n\nexport class OpenSeaClient {\n private apiKey: string\n private baseUrl: string\n private graphqlUrl: string\n private defaultChain: string\n\n constructor(config: OpenSeaClientConfig) {\n this.apiKey = config.apiKey\n this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL\n this.graphqlUrl = config.graphqlUrl ?? DEFAULT_GRAPHQL_URL\n this.defaultChain = config.chain ?? \"ethereum\"\n }\n\n async get<T>(path: string, params?: Record<string, unknown>): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, path)\n }\n\n return response.json() as Promise<T>\n }\n\n async post<T>(path: string): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, path)\n }\n\n return response.json() as Promise<T>\n }\n\n async graphql<T>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<T> {\n const response = await fetch(this.graphqlUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n body: JSON.stringify({ query, variables }),\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, \"graphql\")\n }\n\n const json = (await response.json()) as {\n data?: T\n errors?: { message: string }[]\n }\n\n if (json.errors?.length) {\n throw new OpenSeaAPIError(\n 400,\n json.errors.map(e => e.message).join(\"; \"),\n \"graphql\",\n )\n }\n\n if (!json.data) {\n throw new OpenSeaAPIError(500, \"GraphQL response missing data\", \"graphql\")\n }\n\n return json.data\n }\n\n getDefaultChain(): string {\n return this.defaultChain\n }\n}\n\nexport class OpenSeaAPIError extends Error {\n constructor(\n public statusCode: number,\n public responseBody: string,\n public path: string,\n ) {\n super(`OpenSea API error ${statusCode} on ${path}: ${responseBody}`)\n this.name = \"OpenSeaAPIError\"\n }\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { Account } from \"../types/index.js\"\n\nexport function accountsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"accounts\").description(\"Query accounts\")\n\n cmd\n .command(\"get\")\n .description(\"Get an account by address\")\n .argument(\"<address>\", \"Wallet address\")\n .action(async (address: string) => {\n const client = getClient()\n const result = await client.get<Account>(`/api/v2/accounts/${address}`)\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n","export function formatOutput(data: unknown, format: \"json\" | \"table\"): string {\n if (format === \"table\") {\n return formatTable(data)\n }\n return JSON.stringify(data, null, 2)\n}\n\nfunction formatTable(data: unknown): string {\n if (Array.isArray(data)) {\n if (data.length === 0) return \"(empty)\"\n const keys = Object.keys(data[0] as Record<string, unknown>)\n const widths = keys.map(key =>\n Math.max(\n key.length,\n ...data.map(row => {\n const val = (row as Record<string, unknown>)[key]\n return String(val ?? \"\").length\n }),\n ),\n )\n\n const header = keys.map((key, i) => key.padEnd(widths[i])).join(\" \")\n const separator = widths.map(w => \"-\".repeat(w)).join(\" \")\n const rows = data.map(row =>\n keys\n .map((key, i) => {\n const val = (row as Record<string, unknown>)[key]\n return String(val ?? \"\").padEnd(widths[i])\n })\n .join(\" \"),\n )\n\n return [header, separator, ...rows].join(\"\\n\")\n }\n\n if (data && typeof data === \"object\") {\n const entries = Object.entries(data as Record<string, unknown>)\n const maxKeyLength = Math.max(...entries.map(([k]) => k.length))\n return entries\n .map(([key, value]) => {\n const displayValue =\n typeof value === \"object\" && value !== null\n ? JSON.stringify(value)\n : String(value ?? \"\")\n return `${key.padEnd(maxKeyLength)} ${displayValue}`\n })\n .join(\"\\n\")\n }\n\n return String(data)\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type {\n Chain,\n Collection,\n CollectionOrderBy,\n CollectionStats,\n GetTraitsResponse,\n} from \"../types/index.js\"\n\nexport function collectionsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"collections\").description(\n \"Manage and query NFT collections\",\n )\n\n cmd\n .command(\"get\")\n .description(\"Get a single collection by slug\")\n .argument(\"<slug>\", \"Collection slug\")\n .action(async (slug: string) => {\n const client = getClient()\n const result = await client.get<Collection>(`/api/v2/collections/${slug}`)\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"list\")\n .description(\"List collections\")\n .option(\"--chain <chain>\", \"Filter by chain\")\n .option(\n \"--order-by <orderBy>\",\n \"Order by field (created_date, one_day_change, seven_day_volume, seven_day_change, num_owners, market_cap)\",\n )\n .option(\"--creator <username>\", \"Filter by creator username\")\n .option(\"--include-hidden\", \"Include hidden collections\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (options: {\n chain?: string\n orderBy?: string\n creator?: string\n includeHidden?: boolean\n limit: string\n next?: string\n }) => {\n const client = getClient()\n const result = await client.get<{\n collections: Collection[]\n next?: string\n }>(\"/api/v2/collections\", {\n chain: options.chain as Chain | undefined,\n order_by: options.orderBy as CollectionOrderBy | undefined,\n creator_username: options.creator,\n include_hidden: options.includeHidden,\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"stats\")\n .description(\"Get collection stats\")\n .argument(\"<slug>\", \"Collection slug\")\n .action(async (slug: string) => {\n const client = getClient()\n const result = await client.get<CollectionStats>(\n `/api/v2/collections/${slug}/stats`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"traits\")\n .description(\"Get collection traits\")\n .argument(\"<slug>\", \"Collection slug\")\n .action(async (slug: string) => {\n const client = getClient()\n const result = await client.get<GetTraitsResponse>(\n `/api/v2/traits/${slug}`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { AssetEvent } from \"../types/index.js\"\n\nexport function eventsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"events\").description(\"Query marketplace events\")\n\n cmd\n .command(\"list\")\n .description(\"List events\")\n .option(\n \"--event-type <type>\",\n \"Event type (sale, transfer, mint, listing, offer, trait_offer, collection_offer)\",\n )\n .option(\"--after <timestamp>\", \"Filter events after this Unix timestamp\")\n .option(\"--before <timestamp>\", \"Filter events before this Unix timestamp\")\n .option(\"--chain <chain>\", \"Filter by chain\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (options: {\n eventType?: string\n after?: string\n before?: string\n chain?: string\n limit: string\n next?: string\n }) => {\n const client = getClient()\n const result = await client.get<{\n asset_events: AssetEvent[]\n next?: string\n }>(\"/api/v2/events\", {\n event_type: options.eventType,\n after: options.after ? Number.parseInt(options.after, 10) : undefined,\n before: options.before\n ? Number.parseInt(options.before, 10)\n : undefined,\n chain: options.chain,\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"by-account\")\n .description(\"Get events for an account\")\n .argument(\"<address>\", \"Account address\")\n .option(\"--event-type <type>\", \"Event type\")\n .option(\"--chain <chain>\", \"Filter by chain\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n address: string,\n options: {\n eventType?: string\n chain?: string\n limit: string\n next?: string\n },\n ) => {\n const client = getClient()\n const result = await client.get<{\n asset_events: AssetEvent[]\n next?: string\n }>(`/api/v2/events/accounts/${address}`, {\n event_type: options.eventType,\n chain: options.chain,\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"by-collection\")\n .description(\"Get events for a collection\")\n .argument(\"<slug>\", \"Collection slug\")\n .option(\"--event-type <type>\", \"Event type\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n slug: string,\n options: {\n eventType?: string\n limit: string\n next?: string\n },\n ) => {\n const client = getClient()\n const result = await client.get<{\n asset_events: AssetEvent[]\n next?: string\n }>(`/api/v2/events/collection/${slug}`, {\n event_type: options.eventType,\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"by-nft\")\n .description(\"Get events for a specific NFT\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<contract>\", \"Contract address\")\n .argument(\"<token-id>\", \"Token ID\")\n .option(\"--event-type <type>\", \"Event type\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n chain: string,\n contract: string,\n tokenId: string,\n options: {\n eventType?: string\n limit: string\n next?: string\n },\n ) => {\n const client = getClient()\n const result = await client.get<{\n asset_events: AssetEvent[]\n next?: string\n }>(\n `/api/v2/events/chain/${chain}/contract/${contract}/nfts/${tokenId}`,\n {\n event_type: options.eventType,\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { Listing } from \"../types/index.js\"\n\nexport function listingsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"listings\").description(\"Query NFT listings\")\n\n cmd\n .command(\"all\")\n .description(\"Get all listings for a collection\")\n .argument(\"<collection>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (collection: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{\n listings: Listing[]\n next?: string\n }>(`/api/v2/listings/collection/${collection}/all`, {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"best\")\n .description(\"Get best listings for a collection\")\n .argument(\"<collection>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (collection: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{\n listings: Listing[]\n next?: string\n }>(`/api/v2/listings/collection/${collection}/best`, {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"best-for-nft\")\n .description(\"Get best listing for a specific NFT\")\n .argument(\"<collection>\", \"Collection slug\")\n .argument(\"<token-id>\", \"Token ID\")\n .action(async (collection: string, tokenId: string) => {\n const client = getClient()\n const result = await client.get<Listing>(\n `/api/v2/listings/collection/${collection}/nfts/${tokenId}/best`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { Contract, NFT } from \"../types/index.js\"\n\nexport function nftsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"nfts\").description(\"Query NFTs\")\n\n cmd\n .command(\"get\")\n .description(\"Get a single NFT\")\n .argument(\"<chain>\", \"Chain (e.g. ethereum, base)\")\n .argument(\"<contract>\", \"Contract address\")\n .argument(\"<token-id>\", \"Token ID\")\n .action(async (chain: string, contract: string, tokenId: string) => {\n const client = getClient()\n const result = await client.get<{ nft: NFT }>(\n `/api/v2/chain/${chain}/contract/${contract}/nfts/${tokenId}`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"list-by-collection\")\n .description(\"List NFTs in a collection\")\n .argument(\"<slug>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(async (slug: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{ nfts: NFT[]; next?: string }>(\n `/api/v2/collection/${slug}/nfts`,\n {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n },\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"list-by-contract\")\n .description(\"List NFTs by contract address\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<contract>\", \"Contract address\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n chain: string,\n contract: string,\n options: { limit: string; next?: string },\n ) => {\n const client = getClient()\n const result = await client.get<{ nfts: NFT[]; next?: string }>(\n `/api/v2/chain/${chain}/contract/${contract}/nfts`,\n {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"list-by-account\")\n .description(\"List NFTs owned by an account\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<address>\", \"Account address\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n chain: string,\n address: string,\n options: { limit: string; next?: string },\n ) => {\n const client = getClient()\n const result = await client.get<{ nfts: NFT[]; next?: string }>(\n `/api/v2/chain/${chain}/account/${address}/nfts`,\n {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"refresh\")\n .description(\"Refresh NFT metadata\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<contract>\", \"Contract address\")\n .argument(\"<token-id>\", \"Token ID\")\n .action(async (chain: string, contract: string, tokenId: string) => {\n const client = getClient()\n await client.post(\n `/api/v2/chain/${chain}/contract/${contract}/nfts/${tokenId}/refresh`,\n )\n console.log(\n formatOutput(\n { status: \"ok\", message: \"Metadata refresh requested\" },\n getFormat(),\n ),\n )\n })\n\n cmd\n .command(\"contract\")\n .description(\"Get contract details\")\n .argument(\"<chain>\", \"Chain\")\n .argument(\"<address>\", \"Contract address\")\n .action(async (chain: string, address: string) => {\n const client = getClient()\n const result = await client.get<Contract>(\n `/api/v2/chain/${chain}/contract/${address}`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { Offer } from \"../types/index.js\"\n\nexport function offersCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"offers\").description(\"Query NFT offers\")\n\n cmd\n .command(\"all\")\n .description(\"Get all offers for a collection\")\n .argument(\"<collection>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (collection: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{\n offers: Offer[]\n next?: string\n }>(`/api/v2/offers/collection/${collection}/all`, {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"collection\")\n .description(\"Get collection offers\")\n .argument(\"<collection>\", \"Collection slug\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (collection: string, options: { limit: string; next?: string }) => {\n const client = getClient()\n const result = await client.get<{\n offers: Offer[]\n next?: string\n }>(`/api/v2/offers/collection/${collection}`, {\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"best-for-nft\")\n .description(\"Get best offer for a specific NFT\")\n .argument(\"<collection>\", \"Collection slug\")\n .argument(\"<token-id>\", \"Token ID\")\n .action(async (collection: string, tokenId: string) => {\n const client = getClient()\n const result = await client.get<Offer>(\n `/api/v2/offers/collection/${collection}/nfts/${tokenId}/best`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n cmd\n .command(\"traits\")\n .description(\"Get trait offers for a collection\")\n .argument(\"<collection>\", \"Collection slug\")\n .requiredOption(\"--type <type>\", \"Trait type (required)\")\n .requiredOption(\"--value <value>\", \"Trait value (required)\")\n .option(\"--limit <limit>\", \"Number of results\", \"20\")\n .option(\"--next <cursor>\", \"Pagination cursor\")\n .action(\n async (\n collection: string,\n options: {\n type: string\n value: string\n limit: string\n next?: string\n },\n ) => {\n const client = getClient()\n const result = await client.get<{\n offers: Offer[]\n next?: string\n }>(`/api/v2/offers/collection/${collection}/traits`, {\n type: options.type,\n value: options.value,\n limit: Number.parseInt(options.limit, 10),\n next: options.next,\n })\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport {\n SEARCH_ACCOUNTS_QUERY,\n SEARCH_COLLECTIONS_QUERY,\n SEARCH_NFTS_QUERY,\n SEARCH_TOKENS_QUERY,\n} from \"../queries.js\"\nimport type {\n SearchAccountResult,\n SearchCollectionResult,\n SearchNFTResult,\n SearchTokenResult,\n} from \"../types/index.js\"\n\nexport function searchCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"search\").description(\n \"Search for collections, NFTs, tokens, and accounts\",\n )\n\n cmd\n .command(\"collections\")\n .description(\"Search collections by name or slug\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--chains <chains>\", \"Filter by chains (comma-separated)\")\n .option(\"--limit <limit>\", \"Number of results\", \"10\")\n .action(\n async (query: string, options: { chains?: string; limit: string }) => {\n const client = getClient()\n const result = await client.graphql<{\n collectionsByQuery: SearchCollectionResult[]\n }>(SEARCH_COLLECTIONS_QUERY, {\n query,\n limit: Number.parseInt(options.limit, 10),\n chains: options.chains?.split(\",\"),\n })\n console.log(formatOutput(result.collectionsByQuery, getFormat()))\n },\n )\n\n cmd\n .command(\"nfts\")\n .description(\"Search NFTs by name\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--collection <slug>\", \"Filter by collection slug\")\n .option(\"--chains <chains>\", \"Filter by chains (comma-separated)\")\n .option(\"--limit <limit>\", \"Number of results\", \"10\")\n .action(\n async (\n query: string,\n options: { collection?: string; chains?: string; limit: string },\n ) => {\n const client = getClient()\n const result = await client.graphql<{\n itemsByQuery: SearchNFTResult[]\n }>(SEARCH_NFTS_QUERY, {\n query,\n collectionSlug: options.collection,\n limit: Number.parseInt(options.limit, 10),\n chains: options.chains?.split(\",\"),\n })\n console.log(formatOutput(result.itemsByQuery, getFormat()))\n },\n )\n\n cmd\n .command(\"tokens\")\n .description(\"Search tokens/currencies by name or symbol\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--chain <chain>\", \"Filter by chain\")\n .option(\"--limit <limit>\", \"Number of results\", \"10\")\n .action(\n async (query: string, options: { chain?: string; limit: string }) => {\n const client = getClient()\n const result = await client.graphql<{\n currenciesByQuery: SearchTokenResult[]\n }>(SEARCH_TOKENS_QUERY, {\n query,\n limit: Number.parseInt(options.limit, 10),\n chain: options.chain,\n })\n console.log(formatOutput(result.currenciesByQuery, getFormat()))\n },\n )\n\n cmd\n .command(\"accounts\")\n .description(\"Search accounts by username or address\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--limit <limit>\", \"Number of results\", \"10\")\n .action(async (query: string, options: { limit: string }) => {\n const client = getClient()\n const result = await client.graphql<{\n accountsByQuery: SearchAccountResult[]\n }>(SEARCH_ACCOUNTS_QUERY, {\n query,\n limit: Number.parseInt(options.limit, 10),\n })\n console.log(formatOutput(result.accountsByQuery, getFormat()))\n })\n\n return cmd\n}\n","export const SEARCH_COLLECTIONS_QUERY = `\nquery SearchCollections($query: String!, $limit: Int, $chains: [ChainIdentifier!]) {\n collectionsByQuery(query: $query, limit: $limit, chains: $chains) {\n slug\n name\n description\n imageUrl\n chain {\n identifier\n name\n }\n stats {\n totalSupply\n ownerCount\n volume {\n usd\n }\n sales\n }\n floorPrice {\n pricePerItem {\n usd\n native {\n unit\n symbol\n }\n }\n }\n }\n}`\n\nexport const SEARCH_NFTS_QUERY = `\nquery SearchItems($query: String!, $collectionSlug: String, $limit: Int, $chains: [ChainIdentifier!]) {\n itemsByQuery(query: $query, collectionSlug: $collectionSlug, limit: $limit, chains: $chains) {\n tokenId\n name\n description\n imageUrl\n contractAddress\n collection {\n slug\n name\n }\n chain {\n identifier\n name\n }\n bestListing {\n pricePerItem {\n usd\n native {\n unit\n symbol\n }\n }\n }\n owner {\n address\n displayName\n }\n }\n}`\n\nexport const SEARCH_TOKENS_QUERY = `\nquery SearchCurrencies($query: String!, $limit: Int, $chain: ChainIdentifier) {\n currenciesByQuery(query: $query, limit: $limit, chain: $chain, allowlistOnly: false) {\n name\n symbol\n imageUrl\n usdPrice\n contractAddress\n chain {\n identifier\n name\n }\n stats {\n marketCapUsd\n oneDay {\n priceChange\n volume\n }\n }\n }\n}`\n\nexport const SEARCH_ACCOUNTS_QUERY = `\nquery SearchAccounts($query: String!, $limit: Int) {\n accountsByQuery(query: $query, limit: $limit) {\n address\n username\n imageUrl\n isVerified\n }\n}`\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { SwapQuoteResponse } from \"../types/index.js\"\n\nexport function swapsCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"swaps\").description(\n \"Get swap quotes for token trading\",\n )\n\n cmd\n .command(\"quote\")\n .description(\n \"Get a quote for swapping tokens, including price details and executable transaction data\",\n )\n .requiredOption(\"--from-chain <chain>\", \"Chain of the token to swap from\")\n .requiredOption(\n \"--from-address <address>\",\n \"Contract address of the token to swap from\",\n )\n .requiredOption(\"--to-chain <chain>\", \"Chain of the token to swap to\")\n .requiredOption(\n \"--to-address <address>\",\n \"Contract address of the token to swap to\",\n )\n .requiredOption(\"--quantity <quantity>\", \"Amount to swap (in token units)\")\n .requiredOption(\"--address <address>\", \"Wallet address executing the swap\")\n .option(\n \"--slippage <slippage>\",\n \"Slippage tolerance (0.0 to 0.5, default: 0.01)\",\n )\n .option(\n \"--recipient <recipient>\",\n \"Recipient address (defaults to sender address)\",\n )\n .action(\n async (options: {\n fromChain: string\n fromAddress: string\n toChain: string\n toAddress: string\n quantity: string\n address: string\n slippage?: string\n recipient?: string\n }) => {\n const client = getClient()\n const result = await client.get<SwapQuoteResponse>(\n \"/api/v2/swap/quote\",\n {\n from_chain: options.fromChain,\n from_address: options.fromAddress,\n to_chain: options.toChain,\n to_address: options.toAddress,\n quantity: options.quantity,\n address: options.address,\n slippage: options.slippage\n ? Number.parseFloat(options.slippage)\n : undefined,\n recipient: options.recipient,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n return cmd\n}\n","import { Command } from \"commander\"\nimport type { OpenSeaClient } from \"../client.js\"\nimport { formatOutput } from \"../output.js\"\nimport type { Chain, Token, TokenDetails } from \"../types/index.js\"\n\nexport function tokensCommand(\n getClient: () => OpenSeaClient,\n getFormat: () => \"json\" | \"table\",\n): Command {\n const cmd = new Command(\"tokens\").description(\n \"Query trending tokens, top tokens, and token details\",\n )\n\n cmd\n .command(\"trending\")\n .description(\"Get trending tokens based on OpenSea's trending score\")\n .option(\"--chains <chains>\", \"Comma-separated list of chains to filter by\")\n .option(\"--limit <limit>\", \"Number of results (max 100)\", \"20\")\n .option(\"--cursor <cursor>\", \"Pagination cursor\")\n .action(\n async (options: { chains?: string; limit: string; cursor?: string }) => {\n const client = getClient()\n const result = await client.get<{ tokens: Token[]; next?: string }>(\n \"/api/v2/tokens/trending\",\n {\n chains: options.chains,\n limit: Number.parseInt(options.limit, 10),\n cursor: options.cursor,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"top\")\n .description(\"Get top tokens ranked by 24-hour trading volume\")\n .option(\"--chains <chains>\", \"Comma-separated list of chains to filter by\")\n .option(\"--limit <limit>\", \"Number of results (max 100)\", \"20\")\n .option(\"--cursor <cursor>\", \"Pagination cursor\")\n .action(\n async (options: { chains?: string; limit: string; cursor?: string }) => {\n const client = getClient()\n const result = await client.get<{ tokens: Token[]; next?: string }>(\n \"/api/v2/tokens/top\",\n {\n chains: options.chains,\n limit: Number.parseInt(options.limit, 10),\n cursor: options.cursor,\n },\n )\n console.log(formatOutput(result, getFormat()))\n },\n )\n\n cmd\n .command(\"get\")\n .description(\"Get detailed information about a specific token\")\n .argument(\"<chain>\", \"Blockchain chain\")\n .argument(\"<address>\", \"Token contract address\")\n .action(async (chain: string, address: string) => {\n const client = getClient()\n const result = await client.get<TokenDetails>(\n `/api/v2/chain/${chain as Chain}/token/${address}`,\n )\n console.log(formatOutput(result, getFormat()))\n })\n\n return cmd\n}\n"],"mappings":"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","names":["Command","getClient","getFormat","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command","getClient","getFormat","Command","Command"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -273,10 +273,90 @@ interface SwapQuoteResponse {
|
|
|
273
273
|
quote: SwapQuote;
|
|
274
274
|
transactions: SwapTransaction[];
|
|
275
275
|
}
|
|
276
|
+
interface SearchCollectionResult {
|
|
277
|
+
slug: string;
|
|
278
|
+
name: string;
|
|
279
|
+
description: string;
|
|
280
|
+
imageUrl: string;
|
|
281
|
+
chain: {
|
|
282
|
+
identifier: string;
|
|
283
|
+
name: string;
|
|
284
|
+
};
|
|
285
|
+
stats: {
|
|
286
|
+
totalSupply: number;
|
|
287
|
+
ownerCount: number;
|
|
288
|
+
volume: {
|
|
289
|
+
usd: number;
|
|
290
|
+
};
|
|
291
|
+
sales: number;
|
|
292
|
+
} | null;
|
|
293
|
+
floorPrice: {
|
|
294
|
+
pricePerItem: {
|
|
295
|
+
usd: number;
|
|
296
|
+
native: {
|
|
297
|
+
unit: number;
|
|
298
|
+
symbol: string;
|
|
299
|
+
};
|
|
300
|
+
};
|
|
301
|
+
} | null;
|
|
302
|
+
}
|
|
303
|
+
interface SearchNFTResult {
|
|
304
|
+
tokenId: string;
|
|
305
|
+
name: string;
|
|
306
|
+
description: string;
|
|
307
|
+
imageUrl: string;
|
|
308
|
+
contractAddress: string;
|
|
309
|
+
collection: {
|
|
310
|
+
slug: string;
|
|
311
|
+
name: string;
|
|
312
|
+
};
|
|
313
|
+
chain: {
|
|
314
|
+
identifier: string;
|
|
315
|
+
name: string;
|
|
316
|
+
};
|
|
317
|
+
bestListing: {
|
|
318
|
+
pricePerItem: {
|
|
319
|
+
usd: number;
|
|
320
|
+
native: {
|
|
321
|
+
unit: number;
|
|
322
|
+
symbol: string;
|
|
323
|
+
};
|
|
324
|
+
};
|
|
325
|
+
} | null;
|
|
326
|
+
owner: {
|
|
327
|
+
address: string;
|
|
328
|
+
displayName: string;
|
|
329
|
+
} | null;
|
|
330
|
+
}
|
|
331
|
+
interface SearchTokenResult {
|
|
332
|
+
name: string;
|
|
333
|
+
symbol: string;
|
|
334
|
+
imageUrl: string;
|
|
335
|
+
usdPrice: string;
|
|
336
|
+
contractAddress: string;
|
|
337
|
+
chain: {
|
|
338
|
+
identifier: string;
|
|
339
|
+
name: string;
|
|
340
|
+
};
|
|
341
|
+
stats: {
|
|
342
|
+
marketCapUsd: number;
|
|
343
|
+
oneDay: {
|
|
344
|
+
priceChange: number;
|
|
345
|
+
volume: number;
|
|
346
|
+
};
|
|
347
|
+
} | null;
|
|
348
|
+
}
|
|
349
|
+
interface SearchAccountResult {
|
|
350
|
+
address: string;
|
|
351
|
+
username: string;
|
|
352
|
+
imageUrl: string;
|
|
353
|
+
isVerified: boolean;
|
|
354
|
+
}
|
|
276
355
|
|
|
277
356
|
interface OpenSeaClientConfig {
|
|
278
357
|
apiKey: string;
|
|
279
358
|
baseUrl?: string;
|
|
359
|
+
graphqlUrl?: string;
|
|
280
360
|
chain?: string;
|
|
281
361
|
}
|
|
282
362
|
interface CommandOptions {
|
|
@@ -289,10 +369,12 @@ interface CommandOptions {
|
|
|
289
369
|
declare class OpenSeaClient {
|
|
290
370
|
private apiKey;
|
|
291
371
|
private baseUrl;
|
|
372
|
+
private graphqlUrl;
|
|
292
373
|
private defaultChain;
|
|
293
374
|
constructor(config: OpenSeaClientConfig);
|
|
294
375
|
get<T>(path: string, params?: Record<string, unknown>): Promise<T>;
|
|
295
376
|
post<T>(path: string): Promise<T>;
|
|
377
|
+
graphql<T>(query: string, variables?: Record<string, unknown>): Promise<T>;
|
|
296
378
|
getDefaultChain(): string;
|
|
297
379
|
}
|
|
298
380
|
declare class OpenSeaAPIError extends Error {
|
|
@@ -311,6 +393,7 @@ declare class OpenSeaCLI {
|
|
|
311
393
|
readonly events: EventsAPI;
|
|
312
394
|
readonly accounts: AccountsAPI;
|
|
313
395
|
readonly tokens: TokensAPI;
|
|
396
|
+
readonly search: SearchAPI;
|
|
314
397
|
readonly swaps: SwapsAPI;
|
|
315
398
|
constructor(config: OpenSeaClientConfig);
|
|
316
399
|
}
|
|
@@ -475,6 +558,26 @@ declare class TokensAPI {
|
|
|
475
558
|
}>;
|
|
476
559
|
get(chain: Chain, address: string): Promise<TokenDetails>;
|
|
477
560
|
}
|
|
561
|
+
declare class SearchAPI {
|
|
562
|
+
private client;
|
|
563
|
+
constructor(client: OpenSeaClient);
|
|
564
|
+
collections(query: string, options?: {
|
|
565
|
+
chains?: string[];
|
|
566
|
+
limit?: number;
|
|
567
|
+
}): Promise<SearchCollectionResult[]>;
|
|
568
|
+
nfts(query: string, options?: {
|
|
569
|
+
collection?: string;
|
|
570
|
+
chains?: string[];
|
|
571
|
+
limit?: number;
|
|
572
|
+
}): Promise<SearchNFTResult[]>;
|
|
573
|
+
tokens(query: string, options?: {
|
|
574
|
+
chain?: string;
|
|
575
|
+
limit?: number;
|
|
576
|
+
}): Promise<SearchTokenResult[]>;
|
|
577
|
+
accounts(query: string, options?: {
|
|
578
|
+
limit?: number;
|
|
579
|
+
}): Promise<SearchAccountResult[]>;
|
|
580
|
+
}
|
|
478
581
|
declare class SwapsAPI {
|
|
479
582
|
private client;
|
|
480
583
|
constructor(client: OpenSeaClient);
|
|
@@ -490,4 +593,4 @@ declare class SwapsAPI {
|
|
|
490
593
|
}): Promise<SwapQuoteResponse>;
|
|
491
594
|
}
|
|
492
595
|
|
|
493
|
-
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 PaginatedResponse, type PaymentToken, type Price, type SafelistStatus, type SwapQuote, type SwapQuoteResponse, type SwapTransaction, type Token, type TokenDetails, type TokenSocials, type TokenStats, type Trait, type TraitCategories, type TraitCounts };
|
|
596
|
+
export { type Account, type AssetEvent, type Chain, type Collection, type CollectionOrderBy, type CollectionStats, type CommandOptions, type Contract, type EventAsset, type EventPayment, type EventType, type Fee, type GetTraitsResponse, type Listing, type NFT, type Offer, OpenSeaAPIError, OpenSeaCLI, OpenSeaClient, type OpenSeaClientConfig, type Order, type OrderSide, type PaginatedResponse, type PaymentToken, type Price, type SafelistStatus, type SearchAccountResult, type SearchCollectionResult, type SearchNFTResult, type SearchTokenResult, type SwapQuote, type SwapQuoteResponse, type SwapTransaction, type Token, type TokenDetails, type TokenSocials, type TokenStats, type Trait, type TraitCategories, type TraitCounts };
|
package/dist/index.js
CHANGED
|
@@ -1,12 +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";
|
|
3
4
|
var OpenSeaClient = class {
|
|
4
5
|
apiKey;
|
|
5
6
|
baseUrl;
|
|
7
|
+
graphqlUrl;
|
|
6
8
|
defaultChain;
|
|
7
9
|
constructor(config) {
|
|
8
10
|
this.apiKey = config.apiKey;
|
|
9
11
|
this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
|
|
12
|
+
this.graphqlUrl = config.graphqlUrl ?? DEFAULT_GRAPHQL_URL;
|
|
10
13
|
this.defaultChain = config.chain ?? "ethereum";
|
|
11
14
|
}
|
|
12
15
|
async get(path, params) {
|
|
@@ -46,6 +49,33 @@ var OpenSeaClient = class {
|
|
|
46
49
|
}
|
|
47
50
|
return response.json();
|
|
48
51
|
}
|
|
52
|
+
async graphql(query, variables) {
|
|
53
|
+
const response = await fetch(this.graphqlUrl, {
|
|
54
|
+
method: "POST",
|
|
55
|
+
headers: {
|
|
56
|
+
"Content-Type": "application/json",
|
|
57
|
+
Accept: "application/json",
|
|
58
|
+
"x-api-key": this.apiKey
|
|
59
|
+
},
|
|
60
|
+
body: JSON.stringify({ query, variables })
|
|
61
|
+
});
|
|
62
|
+
if (!response.ok) {
|
|
63
|
+
const body = await response.text();
|
|
64
|
+
throw new OpenSeaAPIError(response.status, body, "graphql");
|
|
65
|
+
}
|
|
66
|
+
const json = await response.json();
|
|
67
|
+
if (json.errors?.length) {
|
|
68
|
+
throw new OpenSeaAPIError(
|
|
69
|
+
400,
|
|
70
|
+
json.errors.map((e) => e.message).join("; "),
|
|
71
|
+
"graphql"
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
if (!json.data) {
|
|
75
|
+
throw new OpenSeaAPIError(500, "GraphQL response missing data", "graphql");
|
|
76
|
+
}
|
|
77
|
+
return json.data;
|
|
78
|
+
}
|
|
49
79
|
getDefaultChain() {
|
|
50
80
|
return this.defaultChain;
|
|
51
81
|
}
|
|
@@ -60,6 +90,99 @@ var OpenSeaAPIError = class extends Error {
|
|
|
60
90
|
}
|
|
61
91
|
};
|
|
62
92
|
|
|
93
|
+
// src/queries.ts
|
|
94
|
+
var SEARCH_COLLECTIONS_QUERY = `
|
|
95
|
+
query SearchCollections($query: String!, $limit: Int, $chains: [ChainIdentifier!]) {
|
|
96
|
+
collectionsByQuery(query: $query, limit: $limit, chains: $chains) {
|
|
97
|
+
slug
|
|
98
|
+
name
|
|
99
|
+
description
|
|
100
|
+
imageUrl
|
|
101
|
+
chain {
|
|
102
|
+
identifier
|
|
103
|
+
name
|
|
104
|
+
}
|
|
105
|
+
stats {
|
|
106
|
+
totalSupply
|
|
107
|
+
ownerCount
|
|
108
|
+
volume {
|
|
109
|
+
usd
|
|
110
|
+
}
|
|
111
|
+
sales
|
|
112
|
+
}
|
|
113
|
+
floorPrice {
|
|
114
|
+
pricePerItem {
|
|
115
|
+
usd
|
|
116
|
+
native {
|
|
117
|
+
unit
|
|
118
|
+
symbol
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}`;
|
|
124
|
+
var SEARCH_NFTS_QUERY = `
|
|
125
|
+
query SearchItems($query: String!, $collectionSlug: String, $limit: Int, $chains: [ChainIdentifier!]) {
|
|
126
|
+
itemsByQuery(query: $query, collectionSlug: $collectionSlug, limit: $limit, chains: $chains) {
|
|
127
|
+
tokenId
|
|
128
|
+
name
|
|
129
|
+
description
|
|
130
|
+
imageUrl
|
|
131
|
+
contractAddress
|
|
132
|
+
collection {
|
|
133
|
+
slug
|
|
134
|
+
name
|
|
135
|
+
}
|
|
136
|
+
chain {
|
|
137
|
+
identifier
|
|
138
|
+
name
|
|
139
|
+
}
|
|
140
|
+
bestListing {
|
|
141
|
+
pricePerItem {
|
|
142
|
+
usd
|
|
143
|
+
native {
|
|
144
|
+
unit
|
|
145
|
+
symbol
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
owner {
|
|
150
|
+
address
|
|
151
|
+
displayName
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}`;
|
|
155
|
+
var SEARCH_TOKENS_QUERY = `
|
|
156
|
+
query SearchCurrencies($query: String!, $limit: Int, $chain: ChainIdentifier) {
|
|
157
|
+
currenciesByQuery(query: $query, limit: $limit, chain: $chain, allowlistOnly: false) {
|
|
158
|
+
name
|
|
159
|
+
symbol
|
|
160
|
+
imageUrl
|
|
161
|
+
usdPrice
|
|
162
|
+
contractAddress
|
|
163
|
+
chain {
|
|
164
|
+
identifier
|
|
165
|
+
name
|
|
166
|
+
}
|
|
167
|
+
stats {
|
|
168
|
+
marketCapUsd
|
|
169
|
+
oneDay {
|
|
170
|
+
priceChange
|
|
171
|
+
volume
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}`;
|
|
176
|
+
var SEARCH_ACCOUNTS_QUERY = `
|
|
177
|
+
query SearchAccounts($query: String!, $limit: Int) {
|
|
178
|
+
accountsByQuery(query: $query, limit: $limit) {
|
|
179
|
+
address
|
|
180
|
+
username
|
|
181
|
+
imageUrl
|
|
182
|
+
isVerified
|
|
183
|
+
}
|
|
184
|
+
}`;
|
|
185
|
+
|
|
63
186
|
// src/sdk.ts
|
|
64
187
|
var OpenSeaCLI = class {
|
|
65
188
|
client;
|
|
@@ -70,6 +193,7 @@ var OpenSeaCLI = class {
|
|
|
70
193
|
events;
|
|
71
194
|
accounts;
|
|
72
195
|
tokens;
|
|
196
|
+
search;
|
|
73
197
|
swaps;
|
|
74
198
|
constructor(config) {
|
|
75
199
|
this.client = new OpenSeaClient(config);
|
|
@@ -80,6 +204,7 @@ var OpenSeaCLI = class {
|
|
|
80
204
|
this.events = new EventsAPI(this.client);
|
|
81
205
|
this.accounts = new AccountsAPI(this.client);
|
|
82
206
|
this.tokens = new TokensAPI(this.client);
|
|
207
|
+
this.search = new SearchAPI(this.client);
|
|
83
208
|
this.swaps = new SwapsAPI(this.client);
|
|
84
209
|
}
|
|
85
210
|
};
|
|
@@ -268,6 +393,43 @@ var TokensAPI = class {
|
|
|
268
393
|
return this.client.get(`/api/v2/chain/${chain}/token/${address}`);
|
|
269
394
|
}
|
|
270
395
|
};
|
|
396
|
+
var SearchAPI = class {
|
|
397
|
+
constructor(client) {
|
|
398
|
+
this.client = client;
|
|
399
|
+
}
|
|
400
|
+
async collections(query, options) {
|
|
401
|
+
const result = await this.client.graphql(SEARCH_COLLECTIONS_QUERY, {
|
|
402
|
+
query,
|
|
403
|
+
limit: options?.limit,
|
|
404
|
+
chains: options?.chains
|
|
405
|
+
});
|
|
406
|
+
return result.collectionsByQuery;
|
|
407
|
+
}
|
|
408
|
+
async nfts(query, options) {
|
|
409
|
+
const result = await this.client.graphql(SEARCH_NFTS_QUERY, {
|
|
410
|
+
query,
|
|
411
|
+
collectionSlug: options?.collection,
|
|
412
|
+
limit: options?.limit,
|
|
413
|
+
chains: options?.chains
|
|
414
|
+
});
|
|
415
|
+
return result.itemsByQuery;
|
|
416
|
+
}
|
|
417
|
+
async tokens(query, options) {
|
|
418
|
+
const result = await this.client.graphql(SEARCH_TOKENS_QUERY, {
|
|
419
|
+
query,
|
|
420
|
+
limit: options?.limit,
|
|
421
|
+
chain: options?.chain
|
|
422
|
+
});
|
|
423
|
+
return result.currenciesByQuery;
|
|
424
|
+
}
|
|
425
|
+
async accounts(query, options) {
|
|
426
|
+
const result = await this.client.graphql(SEARCH_ACCOUNTS_QUERY, {
|
|
427
|
+
query,
|
|
428
|
+
limit: options?.limit
|
|
429
|
+
});
|
|
430
|
+
return result.accountsByQuery;
|
|
431
|
+
}
|
|
432
|
+
};
|
|
271
433
|
var SwapsAPI = class {
|
|
272
434
|
constructor(client) {
|
|
273
435
|
this.client = client;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../src/sdk.ts"],"sourcesContent":["import type { OpenSeaClientConfig } from \"./types/index.js\"\n\nconst DEFAULT_BASE_URL = \"https://api.opensea.io\"\n\nexport class OpenSeaClient {\n private apiKey: string\n private baseUrl: string\n private defaultChain: string\n\n constructor(config: OpenSeaClientConfig) {\n this.apiKey = config.apiKey\n this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL\n this.defaultChain = config.chain ?? \"ethereum\"\n }\n\n async get<T>(path: string, params?: Record<string, unknown>): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, path)\n }\n\n return response.json() as Promise<T>\n }\n\n async post<T>(path: string): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, path)\n }\n\n return response.json() as Promise<T>\n }\n\n 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 { 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 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 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.swaps = new SwapsAPI(this.client)\n }\n}\n\nclass CollectionsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(slug: string): Promise<Collection> {\n return this.client.get<Collection>(`/api/v2/collections/${slug}`)\n }\n\n async list(options?: {\n chain?: Chain\n limit?: number\n next?: string\n orderBy?: CollectionOrderBy\n creatorUsername?: string\n includeHidden?: boolean\n }): Promise<{ collections: Collection[]; next?: string }> {\n return this.client.get(\"/api/v2/collections\", {\n chain: options?.chain,\n limit: options?.limit,\n next: options?.next,\n order_by: options?.orderBy,\n creator_username: options?.creatorUsername,\n include_hidden: options?.includeHidden,\n })\n }\n\n async stats(slug: string): Promise<CollectionStats> {\n return this.client.get<CollectionStats>(`/api/v2/collections/${slug}/stats`)\n }\n\n async traits(slug: string): Promise<GetTraitsResponse> {\n return this.client.get<GetTraitsResponse>(`/api/v2/traits/${slug}`)\n }\n}\n\nclass NFTsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(\n chain: Chain,\n address: string,\n identifier: string,\n ): Promise<{ nft: NFT }> {\n return this.client.get(\n `/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}`,\n )\n }\n\n async listByCollection(\n slug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/collection/${slug}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async listByContract(\n chain: Chain,\n address: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/chain/${chain}/contract/${address}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async listByAccount(\n chain: Chain,\n address: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/chain/${chain}/account/${address}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async refresh(\n chain: Chain,\n address: string,\n identifier: string,\n ): Promise<void> {\n await this.client.post(\n `/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}/refresh`,\n )\n }\n\n async getContract(chain: Chain, address: string): Promise<Contract> {\n return this.client.get(`/api/v2/chain/${chain}/contract/${address}`)\n }\n}\n\nclass ListingsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async all(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ listings: Listing[]; next?: string }> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/all`,\n { limit: options?.limit, next: options?.next },\n )\n }\n\n async best(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ listings: Listing[]; next?: string }> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/best`,\n { limit: options?.limit, next: options?.next },\n )\n }\n\n async bestForNFT(collectionSlug: string, tokenId: string): Promise<Listing> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/nfts/${tokenId}/best`,\n )\n }\n}\n\nclass OffersAPI {\n constructor(private client: OpenSeaClient) {}\n\n async all(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(`/api/v2/offers/collection/${collectionSlug}/all`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async collection(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(`/api/v2/offers/collection/${collectionSlug}`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async bestForNFT(collectionSlug: string, tokenId: string): Promise<Offer> {\n return this.client.get(\n `/api/v2/offers/collection/${collectionSlug}/nfts/${tokenId}/best`,\n )\n }\n\n async traits(\n collectionSlug: string,\n options: {\n type: string\n value: string\n limit?: number\n next?: string\n },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(\n `/api/v2/offers/collection/${collectionSlug}/traits`,\n {\n type: options.type,\n value: options.value,\n limit: options.limit,\n next: options.next,\n },\n )\n }\n}\n\nclass EventsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async list(options?: {\n eventType?: EventType\n after?: number\n before?: number\n limit?: number\n next?: string\n chain?: Chain\n }): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(\"/api/v2/events\", {\n event_type: options?.eventType,\n after: options?.after,\n before: options?.before,\n limit: options?.limit,\n next: options?.next,\n chain: options?.chain,\n })\n }\n\n async byAccount(\n address: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n chain?: Chain\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(`/api/v2/events/accounts/${address}`, {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n chain: options?.chain,\n })\n }\n\n async byCollection(\n collectionSlug: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(`/api/v2/events/collection/${collectionSlug}`, {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async byNFT(\n chain: Chain,\n address: string,\n identifier: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(\n `/api/v2/events/chain/${chain}/contract/${address}/nfts/${identifier}`,\n {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n },\n )\n }\n}\n\nclass AccountsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(address: string): Promise<Account> {\n return this.client.get(`/api/v2/accounts/${address}`)\n }\n}\n\nclass TokensAPI {\n constructor(private client: OpenSeaClient) {}\n\n async trending(options?: {\n limit?: number\n chains?: string[]\n cursor?: string\n }): Promise<{ tokens: Token[]; next?: string }> {\n return this.client.get(\"/api/v2/tokens/trending\", {\n limit: options?.limit,\n chains: options?.chains?.join(\",\"),\n cursor: options?.cursor,\n })\n }\n\n async top(options?: {\n limit?: number\n chains?: string[]\n cursor?: string\n }): Promise<{ tokens: Token[]; next?: string }> {\n return this.client.get(\"/api/v2/tokens/top\", {\n limit: options?.limit,\n chains: options?.chains?.join(\",\"),\n cursor: options?.cursor,\n })\n }\n\n async get(chain: Chain, address: string): Promise<TokenDetails> {\n return this.client.get(`/api/v2/chain/${chain}/token/${address}`)\n }\n}\n\nclass SwapsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async quote(options: {\n fromChain: string\n fromAddress: string\n toChain: string\n toAddress: string\n quantity: string\n address: string\n slippage?: number\n recipient?: string\n }): Promise<SwapQuoteResponse> {\n return this.client.get(\"/api/v2/swap/quote\", {\n from_chain: options.fromChain,\n from_address: options.fromAddress,\n to_chain: options.toChain,\n to_address: options.toAddress,\n quantity: options.quantity,\n address: options.address,\n slippage: options.slippage,\n recipient: options.recipient,\n })\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/queries.ts","../src/sdk.ts"],"sourcesContent":["import type { OpenSeaClientConfig } from \"./types/index.js\"\n\nconst DEFAULT_BASE_URL = \"https://api.opensea.io\"\nconst DEFAULT_GRAPHQL_URL = \"https://gql.opensea.io/graphql\"\n\nexport class OpenSeaClient {\n private apiKey: string\n private baseUrl: string\n private graphqlUrl: string\n private defaultChain: string\n\n constructor(config: OpenSeaClientConfig) {\n this.apiKey = config.apiKey\n this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL\n this.graphqlUrl = config.graphqlUrl ?? DEFAULT_GRAPHQL_URL\n this.defaultChain = config.chain ?? \"ethereum\"\n }\n\n async get<T>(path: string, params?: Record<string, unknown>): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, path)\n }\n\n return response.json() as Promise<T>\n }\n\n async post<T>(path: string): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`)\n\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, path)\n }\n\n return response.json() as Promise<T>\n }\n\n async graphql<T>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<T> {\n const response = await fetch(this.graphqlUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"x-api-key\": this.apiKey,\n },\n body: JSON.stringify({ query, variables }),\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new OpenSeaAPIError(response.status, body, \"graphql\")\n }\n\n const json = (await response.json()) as {\n data?: T\n errors?: { message: string }[]\n }\n\n if (json.errors?.length) {\n throw new OpenSeaAPIError(\n 400,\n json.errors.map(e => e.message).join(\"; \"),\n \"graphql\",\n )\n }\n\n if (!json.data) {\n throw new OpenSeaAPIError(500, \"GraphQL response missing data\", \"graphql\")\n }\n\n return json.data\n }\n\n getDefaultChain(): string {\n return this.defaultChain\n }\n}\n\nexport class OpenSeaAPIError extends Error {\n constructor(\n public statusCode: number,\n public responseBody: string,\n public path: string,\n ) {\n super(`OpenSea API error ${statusCode} on ${path}: ${responseBody}`)\n this.name = \"OpenSeaAPIError\"\n }\n}\n","export const SEARCH_COLLECTIONS_QUERY = `\nquery SearchCollections($query: String!, $limit: Int, $chains: [ChainIdentifier!]) {\n collectionsByQuery(query: $query, limit: $limit, chains: $chains) {\n slug\n name\n description\n imageUrl\n chain {\n identifier\n name\n }\n stats {\n totalSupply\n ownerCount\n volume {\n usd\n }\n sales\n }\n floorPrice {\n pricePerItem {\n usd\n native {\n unit\n symbol\n }\n }\n }\n }\n}`\n\nexport const SEARCH_NFTS_QUERY = `\nquery SearchItems($query: String!, $collectionSlug: String, $limit: Int, $chains: [ChainIdentifier!]) {\n itemsByQuery(query: $query, collectionSlug: $collectionSlug, limit: $limit, chains: $chains) {\n tokenId\n name\n description\n imageUrl\n contractAddress\n collection {\n slug\n name\n }\n chain {\n identifier\n name\n }\n bestListing {\n pricePerItem {\n usd\n native {\n unit\n symbol\n }\n }\n }\n owner {\n address\n displayName\n }\n }\n}`\n\nexport const SEARCH_TOKENS_QUERY = `\nquery SearchCurrencies($query: String!, $limit: Int, $chain: ChainIdentifier) {\n currenciesByQuery(query: $query, limit: $limit, chain: $chain, allowlistOnly: false) {\n name\n symbol\n imageUrl\n usdPrice\n contractAddress\n chain {\n identifier\n name\n }\n stats {\n marketCapUsd\n oneDay {\n priceChange\n volume\n }\n }\n }\n}`\n\nexport const SEARCH_ACCOUNTS_QUERY = `\nquery SearchAccounts($query: String!, $limit: Int) {\n accountsByQuery(query: $query, limit: $limit) {\n address\n username\n imageUrl\n isVerified\n }\n}`\n","import { OpenSeaClient } from \"./client.js\"\nimport {\n SEARCH_ACCOUNTS_QUERY,\n SEARCH_COLLECTIONS_QUERY,\n SEARCH_NFTS_QUERY,\n SEARCH_TOKENS_QUERY,\n} from \"./queries.js\"\nimport type {\n Account,\n AssetEvent,\n Chain,\n Collection,\n CollectionOrderBy,\n CollectionStats,\n Contract,\n EventType,\n GetTraitsResponse,\n Listing,\n NFT,\n Offer,\n OpenSeaClientConfig,\n SearchAccountResult,\n SearchCollectionResult,\n SearchNFTResult,\n SearchTokenResult,\n SwapQuoteResponse,\n Token,\n TokenDetails,\n} from \"./types/index.js\"\n\nexport class OpenSeaCLI {\n private client: OpenSeaClient\n\n readonly collections: CollectionsAPI\n readonly nfts: NFTsAPI\n readonly listings: ListingsAPI\n readonly offers: OffersAPI\n readonly events: EventsAPI\n readonly accounts: AccountsAPI\n readonly tokens: TokensAPI\n readonly search: SearchAPI\n readonly swaps: SwapsAPI\n\n constructor(config: OpenSeaClientConfig) {\n this.client = new OpenSeaClient(config)\n this.collections = new CollectionsAPI(this.client)\n this.nfts = new NFTsAPI(this.client)\n this.listings = new ListingsAPI(this.client)\n this.offers = new OffersAPI(this.client)\n this.events = new EventsAPI(this.client)\n this.accounts = new AccountsAPI(this.client)\n this.tokens = new TokensAPI(this.client)\n this.search = new SearchAPI(this.client)\n this.swaps = new SwapsAPI(this.client)\n }\n}\n\nclass CollectionsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(slug: string): Promise<Collection> {\n return this.client.get<Collection>(`/api/v2/collections/${slug}`)\n }\n\n async list(options?: {\n chain?: Chain\n limit?: number\n next?: string\n orderBy?: CollectionOrderBy\n creatorUsername?: string\n includeHidden?: boolean\n }): Promise<{ collections: Collection[]; next?: string }> {\n return this.client.get(\"/api/v2/collections\", {\n chain: options?.chain,\n limit: options?.limit,\n next: options?.next,\n order_by: options?.orderBy,\n creator_username: options?.creatorUsername,\n include_hidden: options?.includeHidden,\n })\n }\n\n async stats(slug: string): Promise<CollectionStats> {\n return this.client.get<CollectionStats>(`/api/v2/collections/${slug}/stats`)\n }\n\n async traits(slug: string): Promise<GetTraitsResponse> {\n return this.client.get<GetTraitsResponse>(`/api/v2/traits/${slug}`)\n }\n}\n\nclass NFTsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(\n chain: Chain,\n address: string,\n identifier: string,\n ): Promise<{ nft: NFT }> {\n return this.client.get(\n `/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}`,\n )\n }\n\n async listByCollection(\n slug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/collection/${slug}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async listByContract(\n chain: Chain,\n address: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/chain/${chain}/contract/${address}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async listByAccount(\n chain: Chain,\n address: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ nfts: NFT[]; next?: string }> {\n return this.client.get(`/api/v2/chain/${chain}/account/${address}/nfts`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async refresh(\n chain: Chain,\n address: string,\n identifier: string,\n ): Promise<void> {\n await this.client.post(\n `/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}/refresh`,\n )\n }\n\n async getContract(chain: Chain, address: string): Promise<Contract> {\n return this.client.get(`/api/v2/chain/${chain}/contract/${address}`)\n }\n}\n\nclass ListingsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async all(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ listings: Listing[]; next?: string }> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/all`,\n { limit: options?.limit, next: options?.next },\n )\n }\n\n async best(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ listings: Listing[]; next?: string }> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/best`,\n { limit: options?.limit, next: options?.next },\n )\n }\n\n async bestForNFT(collectionSlug: string, tokenId: string): Promise<Listing> {\n return this.client.get(\n `/api/v2/listings/collection/${collectionSlug}/nfts/${tokenId}/best`,\n )\n }\n}\n\nclass OffersAPI {\n constructor(private client: OpenSeaClient) {}\n\n async all(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(`/api/v2/offers/collection/${collectionSlug}/all`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async collection(\n collectionSlug: string,\n options?: { limit?: number; next?: string },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(`/api/v2/offers/collection/${collectionSlug}`, {\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async bestForNFT(collectionSlug: string, tokenId: string): Promise<Offer> {\n return this.client.get(\n `/api/v2/offers/collection/${collectionSlug}/nfts/${tokenId}/best`,\n )\n }\n\n async traits(\n collectionSlug: string,\n options: {\n type: string\n value: string\n limit?: number\n next?: string\n },\n ): Promise<{ offers: Offer[]; next?: string }> {\n return this.client.get(\n `/api/v2/offers/collection/${collectionSlug}/traits`,\n {\n type: options.type,\n value: options.value,\n limit: options.limit,\n next: options.next,\n },\n )\n }\n}\n\nclass EventsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async list(options?: {\n eventType?: EventType\n after?: number\n before?: number\n limit?: number\n next?: string\n chain?: Chain\n }): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(\"/api/v2/events\", {\n event_type: options?.eventType,\n after: options?.after,\n before: options?.before,\n limit: options?.limit,\n next: options?.next,\n chain: options?.chain,\n })\n }\n\n async byAccount(\n address: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n chain?: Chain\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(`/api/v2/events/accounts/${address}`, {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n chain: options?.chain,\n })\n }\n\n async byCollection(\n collectionSlug: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(`/api/v2/events/collection/${collectionSlug}`, {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n })\n }\n\n async byNFT(\n chain: Chain,\n address: string,\n identifier: string,\n options?: {\n eventType?: EventType\n limit?: number\n next?: string\n },\n ): Promise<{ asset_events: AssetEvent[]; next?: string }> {\n return this.client.get(\n `/api/v2/events/chain/${chain}/contract/${address}/nfts/${identifier}`,\n {\n event_type: options?.eventType,\n limit: options?.limit,\n next: options?.next,\n },\n )\n }\n}\n\nclass AccountsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async get(address: string): Promise<Account> {\n return this.client.get(`/api/v2/accounts/${address}`)\n }\n}\n\nclass TokensAPI {\n constructor(private client: OpenSeaClient) {}\n\n async trending(options?: {\n limit?: number\n chains?: string[]\n cursor?: string\n }): Promise<{ tokens: Token[]; next?: string }> {\n return this.client.get(\"/api/v2/tokens/trending\", {\n limit: options?.limit,\n chains: options?.chains?.join(\",\"),\n cursor: options?.cursor,\n })\n }\n\n async top(options?: {\n limit?: number\n chains?: string[]\n cursor?: string\n }): Promise<{ tokens: Token[]; next?: string }> {\n return this.client.get(\"/api/v2/tokens/top\", {\n limit: options?.limit,\n chains: options?.chains?.join(\",\"),\n cursor: options?.cursor,\n })\n }\n\n async get(chain: Chain, address: string): Promise<TokenDetails> {\n return this.client.get(`/api/v2/chain/${chain}/token/${address}`)\n }\n}\n\nclass SearchAPI {\n constructor(private client: OpenSeaClient) {}\n\n async collections(\n query: string,\n options?: { chains?: string[]; limit?: number },\n ): Promise<SearchCollectionResult[]> {\n const result = await this.client.graphql<{\n collectionsByQuery: SearchCollectionResult[]\n }>(SEARCH_COLLECTIONS_QUERY, {\n query,\n limit: options?.limit,\n chains: options?.chains,\n })\n return result.collectionsByQuery\n }\n\n async nfts(\n query: string,\n options?: { collection?: string; chains?: string[]; limit?: number },\n ): Promise<SearchNFTResult[]> {\n const result = await this.client.graphql<{\n itemsByQuery: SearchNFTResult[]\n }>(SEARCH_NFTS_QUERY, {\n query,\n collectionSlug: options?.collection,\n limit: options?.limit,\n chains: options?.chains,\n })\n return result.itemsByQuery\n }\n\n async tokens(\n query: string,\n options?: { chain?: string; limit?: number },\n ): Promise<SearchTokenResult[]> {\n const result = await this.client.graphql<{\n currenciesByQuery: SearchTokenResult[]\n }>(SEARCH_TOKENS_QUERY, {\n query,\n limit: options?.limit,\n chain: options?.chain,\n })\n return result.currenciesByQuery\n }\n\n async accounts(\n query: string,\n options?: { limit?: number },\n ): Promise<SearchAccountResult[]> {\n const result = await this.client.graphql<{\n accountsByQuery: SearchAccountResult[]\n }>(SEARCH_ACCOUNTS_QUERY, {\n query,\n limit: options?.limit,\n })\n return result.accountsByQuery\n }\n}\n\nclass SwapsAPI {\n constructor(private client: OpenSeaClient) {}\n\n async quote(options: {\n fromChain: string\n fromAddress: string\n toChain: string\n toAddress: string\n quantity: string\n address: string\n slippage?: number\n recipient?: string\n }): Promise<SwapQuoteResponse> {\n return this.client.get(\"/api/v2/swap/quote\", {\n from_chain: options.fromChain,\n from_address: options.fromAddress,\n to_chain: options.toChain,\n to_address: options.toAddress,\n quantity: options.quantity,\n address: options.address,\n slippage: options.slippage,\n recipient: options.recipient,\n })\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opensea-cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
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",
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@biomejs/biome": "^2.2.4",
|
|
31
31
|
"@types/node": "^20.0.0",
|
|
32
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
32
33
|
"tsup": "^8.3.0",
|
|
33
34
|
"typescript": "^5.8.3",
|
|
34
35
|
"vitest": "^3.2.4"
|