opensea-cli 0.1.6 → 0.2.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/package.json +3 -42
- package/postinstall.js +11 -0
- package/LICENSE +0 -7
- package/README.md +0 -343
- package/dist/cli.js +0 -705
- package/dist/cli.js.map +0 -1
- package/dist/index.d.ts +0 -596
- package/dist/index.js +0 -455
- package/dist/index.js.map +0 -1
package/dist/index.js
DELETED
|
@@ -1,455 +0,0 @@
|
|
|
1
|
-
// src/client.ts
|
|
2
|
-
var DEFAULT_BASE_URL = "https://api.opensea.io";
|
|
3
|
-
var DEFAULT_GRAPHQL_URL = "https://gql.opensea.io/graphql";
|
|
4
|
-
var OpenSeaClient = class {
|
|
5
|
-
apiKey;
|
|
6
|
-
baseUrl;
|
|
7
|
-
graphqlUrl;
|
|
8
|
-
defaultChain;
|
|
9
|
-
constructor(config) {
|
|
10
|
-
this.apiKey = config.apiKey;
|
|
11
|
-
this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
|
|
12
|
-
this.graphqlUrl = config.graphqlUrl ?? DEFAULT_GRAPHQL_URL;
|
|
13
|
-
this.defaultChain = config.chain ?? "ethereum";
|
|
14
|
-
}
|
|
15
|
-
async get(path, params) {
|
|
16
|
-
const url = new URL(`${this.baseUrl}${path}`);
|
|
17
|
-
if (params) {
|
|
18
|
-
for (const [key, value] of Object.entries(params)) {
|
|
19
|
-
if (value !== void 0 && value !== null) {
|
|
20
|
-
url.searchParams.set(key, String(value));
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
const response = await fetch(url.toString(), {
|
|
25
|
-
method: "GET",
|
|
26
|
-
headers: {
|
|
27
|
-
Accept: "application/json",
|
|
28
|
-
"x-api-key": this.apiKey
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
if (!response.ok) {
|
|
32
|
-
const body = await response.text();
|
|
33
|
-
throw new OpenSeaAPIError(response.status, body, path);
|
|
34
|
-
}
|
|
35
|
-
return response.json();
|
|
36
|
-
}
|
|
37
|
-
async post(path) {
|
|
38
|
-
const url = new URL(`${this.baseUrl}${path}`);
|
|
39
|
-
const response = await fetch(url.toString(), {
|
|
40
|
-
method: "POST",
|
|
41
|
-
headers: {
|
|
42
|
-
Accept: "application/json",
|
|
43
|
-
"x-api-key": this.apiKey
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
if (!response.ok) {
|
|
47
|
-
const body = await response.text();
|
|
48
|
-
throw new OpenSeaAPIError(response.status, body, path);
|
|
49
|
-
}
|
|
50
|
-
return response.json();
|
|
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
|
-
}
|
|
79
|
-
getDefaultChain() {
|
|
80
|
-
return this.defaultChain;
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
var OpenSeaAPIError = class extends Error {
|
|
84
|
-
constructor(statusCode, responseBody, path) {
|
|
85
|
-
super(`OpenSea API error ${statusCode} on ${path}: ${responseBody}`);
|
|
86
|
-
this.statusCode = statusCode;
|
|
87
|
-
this.responseBody = responseBody;
|
|
88
|
-
this.path = path;
|
|
89
|
-
this.name = "OpenSeaAPIError";
|
|
90
|
-
}
|
|
91
|
-
};
|
|
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
|
-
|
|
186
|
-
// src/sdk.ts
|
|
187
|
-
var OpenSeaCLI = class {
|
|
188
|
-
client;
|
|
189
|
-
collections;
|
|
190
|
-
nfts;
|
|
191
|
-
listings;
|
|
192
|
-
offers;
|
|
193
|
-
events;
|
|
194
|
-
accounts;
|
|
195
|
-
tokens;
|
|
196
|
-
search;
|
|
197
|
-
swaps;
|
|
198
|
-
constructor(config) {
|
|
199
|
-
this.client = new OpenSeaClient(config);
|
|
200
|
-
this.collections = new CollectionsAPI(this.client);
|
|
201
|
-
this.nfts = new NFTsAPI(this.client);
|
|
202
|
-
this.listings = new ListingsAPI(this.client);
|
|
203
|
-
this.offers = new OffersAPI(this.client);
|
|
204
|
-
this.events = new EventsAPI(this.client);
|
|
205
|
-
this.accounts = new AccountsAPI(this.client);
|
|
206
|
-
this.tokens = new TokensAPI(this.client);
|
|
207
|
-
this.search = new SearchAPI(this.client);
|
|
208
|
-
this.swaps = new SwapsAPI(this.client);
|
|
209
|
-
}
|
|
210
|
-
};
|
|
211
|
-
var CollectionsAPI = class {
|
|
212
|
-
constructor(client) {
|
|
213
|
-
this.client = client;
|
|
214
|
-
}
|
|
215
|
-
async get(slug) {
|
|
216
|
-
return this.client.get(`/api/v2/collections/${slug}`);
|
|
217
|
-
}
|
|
218
|
-
async list(options) {
|
|
219
|
-
return this.client.get("/api/v2/collections", {
|
|
220
|
-
chain: options?.chain,
|
|
221
|
-
limit: options?.limit,
|
|
222
|
-
next: options?.next,
|
|
223
|
-
order_by: options?.orderBy,
|
|
224
|
-
creator_username: options?.creatorUsername,
|
|
225
|
-
include_hidden: options?.includeHidden
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
async stats(slug) {
|
|
229
|
-
return this.client.get(`/api/v2/collections/${slug}/stats`);
|
|
230
|
-
}
|
|
231
|
-
async traits(slug) {
|
|
232
|
-
return this.client.get(`/api/v2/traits/${slug}`);
|
|
233
|
-
}
|
|
234
|
-
};
|
|
235
|
-
var NFTsAPI = class {
|
|
236
|
-
constructor(client) {
|
|
237
|
-
this.client = client;
|
|
238
|
-
}
|
|
239
|
-
async get(chain, address, identifier) {
|
|
240
|
-
return this.client.get(
|
|
241
|
-
`/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}`
|
|
242
|
-
);
|
|
243
|
-
}
|
|
244
|
-
async listByCollection(slug, options) {
|
|
245
|
-
return this.client.get(`/api/v2/collection/${slug}/nfts`, {
|
|
246
|
-
limit: options?.limit,
|
|
247
|
-
next: options?.next
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
async listByContract(chain, address, options) {
|
|
251
|
-
return this.client.get(`/api/v2/chain/${chain}/contract/${address}/nfts`, {
|
|
252
|
-
limit: options?.limit,
|
|
253
|
-
next: options?.next
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
async listByAccount(chain, address, options) {
|
|
257
|
-
return this.client.get(`/api/v2/chain/${chain}/account/${address}/nfts`, {
|
|
258
|
-
limit: options?.limit,
|
|
259
|
-
next: options?.next
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
async refresh(chain, address, identifier) {
|
|
263
|
-
await this.client.post(
|
|
264
|
-
`/api/v2/chain/${chain}/contract/${address}/nfts/${identifier}/refresh`
|
|
265
|
-
);
|
|
266
|
-
}
|
|
267
|
-
async getContract(chain, address) {
|
|
268
|
-
return this.client.get(`/api/v2/chain/${chain}/contract/${address}`);
|
|
269
|
-
}
|
|
270
|
-
};
|
|
271
|
-
var ListingsAPI = class {
|
|
272
|
-
constructor(client) {
|
|
273
|
-
this.client = client;
|
|
274
|
-
}
|
|
275
|
-
async all(collectionSlug, options) {
|
|
276
|
-
return this.client.get(
|
|
277
|
-
`/api/v2/listings/collection/${collectionSlug}/all`,
|
|
278
|
-
{ limit: options?.limit, next: options?.next }
|
|
279
|
-
);
|
|
280
|
-
}
|
|
281
|
-
async best(collectionSlug, options) {
|
|
282
|
-
return this.client.get(
|
|
283
|
-
`/api/v2/listings/collection/${collectionSlug}/best`,
|
|
284
|
-
{ limit: options?.limit, next: options?.next }
|
|
285
|
-
);
|
|
286
|
-
}
|
|
287
|
-
async bestForNFT(collectionSlug, tokenId) {
|
|
288
|
-
return this.client.get(
|
|
289
|
-
`/api/v2/listings/collection/${collectionSlug}/nfts/${tokenId}/best`
|
|
290
|
-
);
|
|
291
|
-
}
|
|
292
|
-
};
|
|
293
|
-
var OffersAPI = class {
|
|
294
|
-
constructor(client) {
|
|
295
|
-
this.client = client;
|
|
296
|
-
}
|
|
297
|
-
async all(collectionSlug, options) {
|
|
298
|
-
return this.client.get(`/api/v2/offers/collection/${collectionSlug}/all`, {
|
|
299
|
-
limit: options?.limit,
|
|
300
|
-
next: options?.next
|
|
301
|
-
});
|
|
302
|
-
}
|
|
303
|
-
async collection(collectionSlug, options) {
|
|
304
|
-
return this.client.get(`/api/v2/offers/collection/${collectionSlug}`, {
|
|
305
|
-
limit: options?.limit,
|
|
306
|
-
next: options?.next
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
async bestForNFT(collectionSlug, tokenId) {
|
|
310
|
-
return this.client.get(
|
|
311
|
-
`/api/v2/offers/collection/${collectionSlug}/nfts/${tokenId}/best`
|
|
312
|
-
);
|
|
313
|
-
}
|
|
314
|
-
async traits(collectionSlug, options) {
|
|
315
|
-
return this.client.get(
|
|
316
|
-
`/api/v2/offers/collection/${collectionSlug}/traits`,
|
|
317
|
-
{
|
|
318
|
-
type: options.type,
|
|
319
|
-
value: options.value,
|
|
320
|
-
limit: options.limit,
|
|
321
|
-
next: options.next
|
|
322
|
-
}
|
|
323
|
-
);
|
|
324
|
-
}
|
|
325
|
-
};
|
|
326
|
-
var EventsAPI = class {
|
|
327
|
-
constructor(client) {
|
|
328
|
-
this.client = client;
|
|
329
|
-
}
|
|
330
|
-
async list(options) {
|
|
331
|
-
return this.client.get("/api/v2/events", {
|
|
332
|
-
event_type: options?.eventType,
|
|
333
|
-
after: options?.after,
|
|
334
|
-
before: options?.before,
|
|
335
|
-
limit: options?.limit,
|
|
336
|
-
next: options?.next,
|
|
337
|
-
chain: options?.chain
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
async byAccount(address, options) {
|
|
341
|
-
return this.client.get(`/api/v2/events/accounts/${address}`, {
|
|
342
|
-
event_type: options?.eventType,
|
|
343
|
-
limit: options?.limit,
|
|
344
|
-
next: options?.next,
|
|
345
|
-
chain: options?.chain
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
async byCollection(collectionSlug, options) {
|
|
349
|
-
return this.client.get(`/api/v2/events/collection/${collectionSlug}`, {
|
|
350
|
-
event_type: options?.eventType,
|
|
351
|
-
limit: options?.limit,
|
|
352
|
-
next: options?.next
|
|
353
|
-
});
|
|
354
|
-
}
|
|
355
|
-
async byNFT(chain, address, identifier, options) {
|
|
356
|
-
return this.client.get(
|
|
357
|
-
`/api/v2/events/chain/${chain}/contract/${address}/nfts/${identifier}`,
|
|
358
|
-
{
|
|
359
|
-
event_type: options?.eventType,
|
|
360
|
-
limit: options?.limit,
|
|
361
|
-
next: options?.next
|
|
362
|
-
}
|
|
363
|
-
);
|
|
364
|
-
}
|
|
365
|
-
};
|
|
366
|
-
var AccountsAPI = class {
|
|
367
|
-
constructor(client) {
|
|
368
|
-
this.client = client;
|
|
369
|
-
}
|
|
370
|
-
async get(address) {
|
|
371
|
-
return this.client.get(`/api/v2/accounts/${address}`);
|
|
372
|
-
}
|
|
373
|
-
};
|
|
374
|
-
var TokensAPI = class {
|
|
375
|
-
constructor(client) {
|
|
376
|
-
this.client = client;
|
|
377
|
-
}
|
|
378
|
-
async trending(options) {
|
|
379
|
-
return this.client.get("/api/v2/tokens/trending", {
|
|
380
|
-
limit: options?.limit,
|
|
381
|
-
chains: options?.chains?.join(","),
|
|
382
|
-
cursor: options?.cursor
|
|
383
|
-
});
|
|
384
|
-
}
|
|
385
|
-
async top(options) {
|
|
386
|
-
return this.client.get("/api/v2/tokens/top", {
|
|
387
|
-
limit: options?.limit,
|
|
388
|
-
chains: options?.chains?.join(","),
|
|
389
|
-
cursor: options?.cursor
|
|
390
|
-
});
|
|
391
|
-
}
|
|
392
|
-
async get(chain, address) {
|
|
393
|
-
return this.client.get(`/api/v2/chain/${chain}/token/${address}`);
|
|
394
|
-
}
|
|
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
|
-
};
|
|
433
|
-
var SwapsAPI = class {
|
|
434
|
-
constructor(client) {
|
|
435
|
-
this.client = client;
|
|
436
|
-
}
|
|
437
|
-
async quote(options) {
|
|
438
|
-
return this.client.get("/api/v2/swap/quote", {
|
|
439
|
-
from_chain: options.fromChain,
|
|
440
|
-
from_address: options.fromAddress,
|
|
441
|
-
to_chain: options.toChain,
|
|
442
|
-
to_address: options.toAddress,
|
|
443
|
-
quantity: options.quantity,
|
|
444
|
-
address: options.address,
|
|
445
|
-
slippage: options.slippage,
|
|
446
|
-
recipient: options.recipient
|
|
447
|
-
});
|
|
448
|
-
}
|
|
449
|
-
};
|
|
450
|
-
export {
|
|
451
|
-
OpenSeaAPIError,
|
|
452
|
-
OpenSeaCLI,
|
|
453
|
-
OpenSeaClient
|
|
454
|
-
};
|
|
455
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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":";AAEA,IAAM,mBAAmB;AACzB,IAAM,sBAAsB;AAErB,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAA6B;AACvC,SAAK,SAAS,OAAO;AACrB,SAAK,UAAU,OAAO,WAAW;AACjC,SAAK,aAAa,OAAO,cAAc;AACvC,SAAK,eAAe,OAAO,SAAS;AAAA,EACtC;AAAA,EAEA,MAAM,IAAO,MAAc,QAA8C;AACvE,UAAM,MAAM,IAAI,IAAI,GAAG,KAAK,OAAO,GAAG,IAAI,EAAE;AAE5C,QAAI,QAAQ;AACV,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,YAAI,UAAU,UAAa,UAAU,MAAM;AACzC,cAAI,aAAa,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,MAAM,IAAI,SAAS,GAAG;AAAA,MAC3C,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,aAAa,KAAK;AAAA,MACpB;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,IAAI,gBAAgB,SAAS,QAAQ,MAAM,IAAI;AAAA,IACvD;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,KAAQ,MAA0B;AACtC,UAAM,MAAM,IAAI,IAAI,GAAG,KAAK,OAAO,GAAG,IAAI,EAAE;AAE5C,UAAM,WAAW,MAAM,MAAM,IAAI,SAAS,GAAG;AAAA,MAC3C,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,aAAa,KAAK;AAAA,MACpB;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,IAAI,gBAAgB,SAAS,QAAQ,MAAM,IAAI;AAAA,IACvD;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,QACJ,OACA,WACY;AACZ,UAAM,WAAW,MAAM,MAAM,KAAK,YAAY;AAAA,MAC5C,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,aAAa,KAAK;AAAA,MACpB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,OAAO,UAAU,CAAC;AAAA,IAC3C,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,IAAI,gBAAgB,SAAS,QAAQ,MAAM,SAAS;AAAA,IAC5D;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAKlC,QAAI,KAAK,QAAQ,QAAQ;AACvB,YAAM,IAAI;AAAA,QACR;AAAA,QACA,KAAK,OAAO,IAAI,OAAK,EAAE,OAAO,EAAE,KAAK,IAAI;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,MAAM;AACd,YAAM,IAAI,gBAAgB,KAAK,iCAAiC,SAAS;AAAA,IAC3E;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,kBAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AACF;AAEO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YACS,YACA,cACA,MACP;AACA,UAAM,qBAAqB,UAAU,OAAO,IAAI,KAAK,YAAY,EAAE;AAJ5D;AACA;AACA;AAGP,SAAK,OAAO;AAAA,EACd;AACF;;;ACrHO,IAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BjC,IAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgC1B,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsB5B,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACvD9B,IAAM,aAAN,MAAiB;AAAA,EACd;AAAA,EAEC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAA6B;AACvC,SAAK,SAAS,IAAI,cAAc,MAAM;AACtC,SAAK,cAAc,IAAI,eAAe,KAAK,MAAM;AACjD,SAAK,OAAO,IAAI,QAAQ,KAAK,MAAM;AACnC,SAAK,WAAW,IAAI,YAAY,KAAK,MAAM;AAC3C,SAAK,SAAS,IAAI,UAAU,KAAK,MAAM;AACvC,SAAK,SAAS,IAAI,UAAU,KAAK,MAAM;AACvC,SAAK,WAAW,IAAI,YAAY,KAAK,MAAM;AAC3C,SAAK,SAAS,IAAI,UAAU,KAAK,MAAM;AACvC,SAAK,SAAS,IAAI,UAAU,KAAK,MAAM;AACvC,SAAK,QAAQ,IAAI,SAAS,KAAK,MAAM;AAAA,EACvC;AACF;AAEA,IAAM,iBAAN,MAAqB;AAAA,EACnB,YAAoB,QAAuB;AAAvB;AAAA,EAAwB;AAAA,EAE5C,MAAM,IAAI,MAAmC;AAC3C,WAAO,KAAK,OAAO,IAAgB,uBAAuB,IAAI,EAAE;AAAA,EAClE;AAAA,EAEA,MAAM,KAAK,SAO+C;AACxD,WAAO,KAAK,OAAO,IAAI,uBAAuB;AAAA,MAC5C,OAAO,SAAS;AAAA,MAChB,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS;AAAA,MACf,UAAU,SAAS;AAAA,MACnB,kBAAkB,SAAS;AAAA,MAC3B,gBAAgB,SAAS;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAM,MAAwC;AAClD,WAAO,KAAK,OAAO,IAAqB,uBAAuB,IAAI,QAAQ;AAAA,EAC7E;AAAA,EAEA,MAAM,OAAO,MAA0C;AACrD,WAAO,KAAK,OAAO,IAAuB,kBAAkB,IAAI,EAAE;AAAA,EACpE;AACF;AAEA,IAAM,UAAN,MAAc;AAAA,EACZ,YAAoB,QAAuB;AAAvB;AAAA,EAAwB;AAAA,EAE5C,MAAM,IACJ,OACA,SACA,YACuB;AACvB,WAAO,KAAK,OAAO;AAAA,MACjB,iBAAiB,KAAK,aAAa,OAAO,SAAS,UAAU;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,MAAM,iBACJ,MACA,SACyC;AACzC,WAAO,KAAK,OAAO,IAAI,sBAAsB,IAAI,SAAS;AAAA,MACxD,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eACJ,OACA,SACA,SACyC;AACzC,WAAO,KAAK,OAAO,IAAI,iBAAiB,KAAK,aAAa,OAAO,SAAS;AAAA,MACxE,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,cACJ,OACA,SACA,SACyC;AACzC,WAAO,KAAK,OAAO,IAAI,iBAAiB,KAAK,YAAY,OAAO,SAAS;AAAA,MACvE,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QACJ,OACA,SACA,YACe;AACf,UAAM,KAAK,OAAO;AAAA,MAChB,iBAAiB,KAAK,aAAa,OAAO,SAAS,UAAU;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,OAAc,SAAoC;AAClE,WAAO,KAAK,OAAO,IAAI,iBAAiB,KAAK,aAAa,OAAO,EAAE;AAAA,EACrE;AACF;AAEA,IAAM,cAAN,MAAkB;AAAA,EAChB,YAAoB,QAAuB;AAAvB;AAAA,EAAwB;AAAA,EAE5C,MAAM,IACJ,gBACA,SACiD;AACjD,WAAO,KAAK,OAAO;AAAA,MACjB,+BAA+B,cAAc;AAAA,MAC7C,EAAE,OAAO,SAAS,OAAO,MAAM,SAAS,KAAK;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,MAAM,KACJ,gBACA,SACiD;AACjD,WAAO,KAAK,OAAO;AAAA,MACjB,+BAA+B,cAAc;AAAA,MAC7C,EAAE,OAAO,SAAS,OAAO,MAAM,SAAS,KAAK;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,gBAAwB,SAAmC;AAC1E,WAAO,KAAK,OAAO;AAAA,MACjB,+BAA+B,cAAc,SAAS,OAAO;AAAA,IAC/D;AAAA,EACF;AACF;AAEA,IAAM,YAAN,MAAgB;AAAA,EACd,YAAoB,QAAuB;AAAvB;AAAA,EAAwB;AAAA,EAE5C,MAAM,IACJ,gBACA,SAC6C;AAC7C,WAAO,KAAK,OAAO,IAAI,6BAA6B,cAAc,QAAQ;AAAA,MACxE,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WACJ,gBACA,SAC6C;AAC7C,WAAO,KAAK,OAAO,IAAI,6BAA6B,cAAc,IAAI;AAAA,MACpE,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,gBAAwB,SAAiC;AACxE,WAAO,KAAK,OAAO;AAAA,MACjB,6BAA6B,cAAc,SAAS,OAAO;AAAA,IAC7D;AAAA,EACF;AAAA,EAEA,MAAM,OACJ,gBACA,SAM6C;AAC7C,WAAO,KAAK,OAAO;AAAA,MACjB,6BAA6B,cAAc;AAAA,MAC3C;AAAA,QACE,MAAM,QAAQ;AAAA,QACd,OAAO,QAAQ;AAAA,QACf,OAAO,QAAQ;AAAA,QACf,MAAM,QAAQ;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,YAAN,MAAgB;AAAA,EACd,YAAoB,QAAuB;AAAvB;AAAA,EAAwB;AAAA,EAE5C,MAAM,KAAK,SAOgD;AACzD,WAAO,KAAK,OAAO,IAAI,kBAAkB;AAAA,MACvC,YAAY,SAAS;AAAA,MACrB,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS;AAAA,MACjB,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS;AAAA,MACf,OAAO,SAAS;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UACJ,SACA,SAMwD;AACxD,WAAO,KAAK,OAAO,IAAI,2BAA2B,OAAO,IAAI;AAAA,MAC3D,YAAY,SAAS;AAAA,MACrB,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS;AAAA,MACf,OAAO,SAAS;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aACJ,gBACA,SAKwD;AACxD,WAAO,KAAK,OAAO,IAAI,6BAA6B,cAAc,IAAI;AAAA,MACpE,YAAY,SAAS;AAAA,MACrB,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MACJ,OACA,SACA,YACA,SAKwD;AACxD,WAAO,KAAK,OAAO;AAAA,MACjB,wBAAwB,KAAK,aAAa,OAAO,SAAS,UAAU;AAAA,MACpE;AAAA,QACE,YAAY,SAAS;AAAA,QACrB,OAAO,SAAS;AAAA,QAChB,MAAM,SAAS;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,cAAN,MAAkB;AAAA,EAChB,YAAoB,QAAuB;AAAvB;AAAA,EAAwB;AAAA,EAE5C,MAAM,IAAI,SAAmC;AAC3C,WAAO,KAAK,OAAO,IAAI,oBAAoB,OAAO,EAAE;AAAA,EACtD;AACF;AAEA,IAAM,YAAN,MAAgB;AAAA,EACd,YAAoB,QAAuB;AAAvB;AAAA,EAAwB;AAAA,EAE5C,MAAM,SAAS,SAIiC;AAC9C,WAAO,KAAK,OAAO,IAAI,2BAA2B;AAAA,MAChD,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS,QAAQ,KAAK,GAAG;AAAA,MACjC,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,IAAI,SAIsC;AAC9C,WAAO,KAAK,OAAO,IAAI,sBAAsB;AAAA,MAC3C,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS,QAAQ,KAAK,GAAG;AAAA,MACjC,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,IAAI,OAAc,SAAwC;AAC9D,WAAO,KAAK,OAAO,IAAI,iBAAiB,KAAK,UAAU,OAAO,EAAE;AAAA,EAClE;AACF;AAEA,IAAM,YAAN,MAAgB;AAAA,EACd,YAAoB,QAAuB;AAAvB;AAAA,EAAwB;AAAA,EAE5C,MAAM,YACJ,OACA,SACmC;AACnC,UAAM,SAAS,MAAM,KAAK,OAAO,QAE9B,0BAA0B;AAAA,MAC3B;AAAA,MACA,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS;AAAA,IACnB,CAAC;AACD,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,KACJ,OACA,SAC4B;AAC5B,UAAM,SAAS,MAAM,KAAK,OAAO,QAE9B,mBAAmB;AAAA,MACpB;AAAA,MACA,gBAAgB,SAAS;AAAA,MACzB,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS;AAAA,IACnB,CAAC;AACD,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,OACJ,OACA,SAC8B;AAC9B,UAAM,SAAS,MAAM,KAAK,OAAO,QAE9B,qBAAqB;AAAA,MACtB;AAAA,MACA,OAAO,SAAS;AAAA,MAChB,OAAO,SAAS;AAAA,IAClB,CAAC;AACD,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,SACJ,OACA,SACgC;AAChC,UAAM,SAAS,MAAM,KAAK,OAAO,QAE9B,uBAAuB;AAAA,MACxB;AAAA,MACA,OAAO,SAAS;AAAA,IAClB,CAAC;AACD,WAAO,OAAO;AAAA,EAChB;AACF;AAEA,IAAM,WAAN,MAAe;AAAA,EACb,YAAoB,QAAuB;AAAvB;AAAA,EAAwB;AAAA,EAE5C,MAAM,MAAM,SASmB;AAC7B,WAAO,KAAK,OAAO,IAAI,sBAAsB;AAAA,MAC3C,YAAY,QAAQ;AAAA,MACpB,cAAc,QAAQ;AAAA,MACtB,UAAU,QAAQ;AAAA,MAClB,YAAY,QAAQ;AAAA,MACpB,UAAU,QAAQ;AAAA,MAClB,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ;AAAA,MAClB,WAAW,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH;AACF;","names":[]}
|