opensea-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +246 -0
- package/dist/cli.js +530 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +493 -0
- package/dist/index.js +293 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
// src/client.ts
|
|
2
|
+
var DEFAULT_BASE_URL = "https://api.opensea.io";
|
|
3
|
+
var OpenSeaClient = class {
|
|
4
|
+
apiKey;
|
|
5
|
+
baseUrl;
|
|
6
|
+
defaultChain;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.apiKey = config.apiKey;
|
|
9
|
+
this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
|
|
10
|
+
this.defaultChain = config.chain ?? "ethereum";
|
|
11
|
+
}
|
|
12
|
+
async get(path, params) {
|
|
13
|
+
const url = new URL(`${this.baseUrl}${path}`);
|
|
14
|
+
if (params) {
|
|
15
|
+
for (const [key, value] of Object.entries(params)) {
|
|
16
|
+
if (value !== void 0 && value !== null) {
|
|
17
|
+
url.searchParams.set(key, String(value));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const response = await fetch(url.toString(), {
|
|
22
|
+
method: "GET",
|
|
23
|
+
headers: {
|
|
24
|
+
Accept: "application/json",
|
|
25
|
+
"x-api-key": this.apiKey
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
if (!response.ok) {
|
|
29
|
+
const body = await response.text();
|
|
30
|
+
throw new OpenSeaAPIError(response.status, body, path);
|
|
31
|
+
}
|
|
32
|
+
return response.json();
|
|
33
|
+
}
|
|
34
|
+
async post(path) {
|
|
35
|
+
const url = new URL(`${this.baseUrl}${path}`);
|
|
36
|
+
const response = await fetch(url.toString(), {
|
|
37
|
+
method: "POST",
|
|
38
|
+
headers: {
|
|
39
|
+
Accept: "application/json",
|
|
40
|
+
"x-api-key": this.apiKey
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
if (!response.ok) {
|
|
44
|
+
const body = await response.text();
|
|
45
|
+
throw new OpenSeaAPIError(response.status, body, path);
|
|
46
|
+
}
|
|
47
|
+
return response.json();
|
|
48
|
+
}
|
|
49
|
+
getDefaultChain() {
|
|
50
|
+
return this.defaultChain;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
var OpenSeaAPIError = class extends Error {
|
|
54
|
+
constructor(statusCode, responseBody, path) {
|
|
55
|
+
super(`OpenSea API error ${statusCode} on ${path}: ${responseBody}`);
|
|
56
|
+
this.statusCode = statusCode;
|
|
57
|
+
this.responseBody = responseBody;
|
|
58
|
+
this.path = path;
|
|
59
|
+
this.name = "OpenSeaAPIError";
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
// src/sdk.ts
|
|
64
|
+
var OpenSeaCLI = class {
|
|
65
|
+
client;
|
|
66
|
+
collections;
|
|
67
|
+
nfts;
|
|
68
|
+
listings;
|
|
69
|
+
offers;
|
|
70
|
+
events;
|
|
71
|
+
accounts;
|
|
72
|
+
tokens;
|
|
73
|
+
swaps;
|
|
74
|
+
constructor(config) {
|
|
75
|
+
this.client = new OpenSeaClient(config);
|
|
76
|
+
this.collections = new CollectionsAPI(this.client);
|
|
77
|
+
this.nfts = new NFTsAPI(this.client);
|
|
78
|
+
this.listings = new ListingsAPI(this.client);
|
|
79
|
+
this.offers = new OffersAPI(this.client);
|
|
80
|
+
this.events = new EventsAPI(this.client);
|
|
81
|
+
this.accounts = new AccountsAPI(this.client);
|
|
82
|
+
this.tokens = new TokensAPI(this.client);
|
|
83
|
+
this.swaps = new SwapsAPI(this.client);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
var CollectionsAPI = class {
|
|
87
|
+
constructor(client) {
|
|
88
|
+
this.client = client;
|
|
89
|
+
}
|
|
90
|
+
async get(slug) {
|
|
91
|
+
return this.client.get(`/api/v2/collections/${slug}`);
|
|
92
|
+
}
|
|
93
|
+
async list(options) {
|
|
94
|
+
return this.client.get("/api/v2/collections", {
|
|
95
|
+
chain: options?.chain,
|
|
96
|
+
limit: options?.limit,
|
|
97
|
+
next: options?.next,
|
|
98
|
+
order_by: options?.orderBy,
|
|
99
|
+
creator_username: options?.creatorUsername,
|
|
100
|
+
include_hidden: options?.includeHidden
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
async stats(slug) {
|
|
104
|
+
return this.client.get(`/api/v2/collections/${slug}/stats`);
|
|
105
|
+
}
|
|
106
|
+
async traits(slug) {
|
|
107
|
+
return this.client.get(`/api/v2/traits/${slug}`);
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
var NFTsAPI = class {
|
|
111
|
+
constructor(client) {
|
|
112
|
+
this.client = client;
|
|
113
|
+
}
|
|
114
|
+
async get(chain, address, identifier) {
|
|
115
|
+
return this.client.get(
|
|
116
|
+
`/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}`
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
async listByCollection(slug, options) {
|
|
120
|
+
return this.client.get(`/api/v2/collection/${slug}/nfts`, {
|
|
121
|
+
limit: options?.limit,
|
|
122
|
+
next: options?.next
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
async listByContract(chain, address, options) {
|
|
126
|
+
return this.client.get(`/api/v2/chain/${chain}/contract/${address}/nfts`, {
|
|
127
|
+
limit: options?.limit,
|
|
128
|
+
next: options?.next
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
async listByAccount(chain, address, options) {
|
|
132
|
+
return this.client.get(`/api/v2/chain/${chain}/account/${address}/nfts`, {
|
|
133
|
+
limit: options?.limit,
|
|
134
|
+
next: options?.next
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
async refresh(chain, address, identifier) {
|
|
138
|
+
await this.client.post(
|
|
139
|
+
`/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}/refresh`
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
async getContract(chain, address) {
|
|
143
|
+
return this.client.get(`/api/v2/chain/${chain}/contract/${address}`);
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
var ListingsAPI = class {
|
|
147
|
+
constructor(client) {
|
|
148
|
+
this.client = client;
|
|
149
|
+
}
|
|
150
|
+
async all(collectionSlug, options) {
|
|
151
|
+
return this.client.get(
|
|
152
|
+
`/api/v2/listings/collection/${collectionSlug}/all`,
|
|
153
|
+
{ limit: options?.limit, next: options?.next }
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
async best(collectionSlug, options) {
|
|
157
|
+
return this.client.get(
|
|
158
|
+
`/api/v2/listings/collection/${collectionSlug}/best`,
|
|
159
|
+
{ limit: options?.limit, next: options?.next }
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
async bestForNFT(collectionSlug, tokenId) {
|
|
163
|
+
return this.client.get(
|
|
164
|
+
`/api/v2/listings/collection/${collectionSlug}/nfts/${tokenId}/best`
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
var OffersAPI = class {
|
|
169
|
+
constructor(client) {
|
|
170
|
+
this.client = client;
|
|
171
|
+
}
|
|
172
|
+
async all(collectionSlug, options) {
|
|
173
|
+
return this.client.get(`/api/v2/offers/collection/${collectionSlug}/all`, {
|
|
174
|
+
limit: options?.limit,
|
|
175
|
+
next: options?.next
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
async collection(collectionSlug, options) {
|
|
179
|
+
return this.client.get(`/api/v2/offers/collection/${collectionSlug}`, {
|
|
180
|
+
limit: options?.limit,
|
|
181
|
+
next: options?.next
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
async bestForNFT(collectionSlug, tokenId) {
|
|
185
|
+
return this.client.get(
|
|
186
|
+
`/api/v2/offers/collection/${collectionSlug}/nfts/${tokenId}/best`
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
async traits(collectionSlug, options) {
|
|
190
|
+
return this.client.get(
|
|
191
|
+
`/api/v2/offers/collection/${collectionSlug}/traits`,
|
|
192
|
+
{
|
|
193
|
+
type: options.type,
|
|
194
|
+
value: options.value,
|
|
195
|
+
limit: options.limit,
|
|
196
|
+
next: options.next
|
|
197
|
+
}
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
var EventsAPI = class {
|
|
202
|
+
constructor(client) {
|
|
203
|
+
this.client = client;
|
|
204
|
+
}
|
|
205
|
+
async list(options) {
|
|
206
|
+
return this.client.get("/api/v2/events", {
|
|
207
|
+
event_type: options?.eventType,
|
|
208
|
+
after: options?.after,
|
|
209
|
+
before: options?.before,
|
|
210
|
+
limit: options?.limit,
|
|
211
|
+
next: options?.next,
|
|
212
|
+
chain: options?.chain
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
async byAccount(address, options) {
|
|
216
|
+
return this.client.get(`/api/v2/events/accounts/${address}`, {
|
|
217
|
+
event_type: options?.eventType,
|
|
218
|
+
limit: options?.limit,
|
|
219
|
+
next: options?.next,
|
|
220
|
+
chain: options?.chain
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
async byCollection(collectionSlug, options) {
|
|
224
|
+
return this.client.get(`/api/v2/events/collection/${collectionSlug}`, {
|
|
225
|
+
event_type: options?.eventType,
|
|
226
|
+
limit: options?.limit,
|
|
227
|
+
next: options?.next
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
async byNFT(chain, address, identifier, options) {
|
|
231
|
+
return this.client.get(
|
|
232
|
+
`/api/v2/events/chain/${chain}/contract/${address}/nfts/${identifier}`,
|
|
233
|
+
{
|
|
234
|
+
event_type: options?.eventType,
|
|
235
|
+
limit: options?.limit,
|
|
236
|
+
next: options?.next
|
|
237
|
+
}
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
var AccountsAPI = class {
|
|
242
|
+
constructor(client) {
|
|
243
|
+
this.client = client;
|
|
244
|
+
}
|
|
245
|
+
async get(address) {
|
|
246
|
+
return this.client.get(`/api/v2/accounts/${address}`);
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
var TokensAPI = class {
|
|
250
|
+
constructor(client) {
|
|
251
|
+
this.client = client;
|
|
252
|
+
}
|
|
253
|
+
async trending(options) {
|
|
254
|
+
return this.client.get("/api/v2/tokens/trending", {
|
|
255
|
+
limit: options?.limit,
|
|
256
|
+
chains: options?.chains?.join(","),
|
|
257
|
+
cursor: options?.cursor
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
async top(options) {
|
|
261
|
+
return this.client.get("/api/v2/tokens/top", {
|
|
262
|
+
limit: options?.limit,
|
|
263
|
+
chains: options?.chains?.join(","),
|
|
264
|
+
cursor: options?.cursor
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
async get(chain, address) {
|
|
268
|
+
return this.client.get(`/api/v2/chain/${chain}/token/${address}`);
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
var SwapsAPI = class {
|
|
272
|
+
constructor(client) {
|
|
273
|
+
this.client = client;
|
|
274
|
+
}
|
|
275
|
+
async quote(options) {
|
|
276
|
+
return this.client.get("/api/v2/swap/quote", {
|
|
277
|
+
from_chain: options.fromChain,
|
|
278
|
+
from_address: options.fromAddress,
|
|
279
|
+
to_chain: options.toChain,
|
|
280
|
+
to_address: options.toAddress,
|
|
281
|
+
quantity: options.quantity,
|
|
282
|
+
address: options.address,
|
|
283
|
+
slippage: options.slippage,
|
|
284
|
+
recipient: options.recipient
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
export {
|
|
289
|
+
OpenSeaAPIError,
|
|
290
|
+
OpenSeaCLI,
|
|
291
|
+
OpenSeaClient
|
|
292
|
+
};
|
|
293
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "opensea-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "OpenSea CLI - Query the OpenSea API from the command line or programmatically",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"opensea": "dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsup",
|
|
16
|
+
"dev": "tsup --watch",
|
|
17
|
+
"format": "biome format --write .",
|
|
18
|
+
"format:check": "biome format .",
|
|
19
|
+
"lint": "biome check .",
|
|
20
|
+
"lint:fix": "biome check --fix .",
|
|
21
|
+
"type-check": "tsc --noEmit",
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"prepublishOnly": "npm run build"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"commander": "^12.1.0",
|
|
27
|
+
"zod": "^3.24.0"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@biomejs/biome": "^2.2.4",
|
|
31
|
+
"@types/node": "^20.0.0",
|
|
32
|
+
"tsup": "^8.3.0",
|
|
33
|
+
"typescript": "^5.8.3",
|
|
34
|
+
"vitest": "^3.2.4"
|
|
35
|
+
},
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=18.0.0"
|
|
38
|
+
},
|
|
39
|
+
"keywords": [
|
|
40
|
+
"opensea",
|
|
41
|
+
"nft",
|
|
42
|
+
"cli",
|
|
43
|
+
"api",
|
|
44
|
+
"web3"
|
|
45
|
+
],
|
|
46
|
+
"license": "MIT",
|
|
47
|
+
"repository": {
|
|
48
|
+
"type": "git",
|
|
49
|
+
"url": "https://github.com/ProjectOpenSea/opensea-cli"
|
|
50
|
+
}
|
|
51
|
+
}
|