@quicknode/sdk 1.0.0-beta.1 → 1.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.
Files changed (66) hide show
  1. package/README.md +2 -835
  2. package/cjs/index.js +342 -41
  3. package/esm/package.json +2 -1
  4. package/esm/package.json.js +3 -0
  5. package/esm/src/api/api.js +85 -0
  6. package/esm/src/api/controllers/contracts.js +36 -0
  7. package/esm/src/api/controllers/events.js +121 -0
  8. package/esm/src/api/controllers/nfts.js +244 -0
  9. package/esm/src/api/controllers/tokens.js +98 -0
  10. package/esm/src/api/controllers/transactions.js +125 -0
  11. package/esm/src/api/controllers/utils.js +55 -0
  12. package/esm/src/api/graphql/customUrqlClient.js +23 -0
  13. package/esm/src/api/graphql/generatedTypes.js +62 -0
  14. package/esm/src/api/graphql/schema.json.js +3 -0
  15. package/esm/src/api/index.d.ts +2687 -0
  16. package/esm/src/api/index.js +2 -0
  17. package/esm/src/api/types/chains.js +7 -0
  18. package/esm/src/api/types/contracts/getContractDetails.js +12 -0
  19. package/esm/src/api/types/events/getAll.js +7 -0
  20. package/esm/src/api/types/events/getByContract.js +12 -0
  21. package/esm/src/api/types/nfts/getByContractAddress.js +10 -0
  22. package/esm/src/api/types/nfts/getByWalletAddress.js +18 -0
  23. package/esm/src/api/types/nfts/getCollectionDetails.js +11 -0
  24. package/esm/src/api/types/nfts/getCollectionEvents.js +12 -0
  25. package/esm/src/api/types/nfts/getNFTDetails.js +9 -0
  26. package/esm/src/api/types/nfts/getNFTEvents.js +13 -0
  27. package/esm/src/api/types/nfts/getTrendingCollections.js +7 -0
  28. package/esm/src/api/types/nfts/verifyOwnershipByAddress.js +12 -0
  29. package/esm/src/api/types/tokens/getBalancesByWalletAddress.js +12 -0
  30. package/esm/src/api/types/transactions/getByHash.js +11 -0
  31. package/esm/src/api/types/transactions/getBySearch.js +7 -0
  32. package/esm/src/api/types/utils/gasPrices.js +12 -0
  33. package/esm/src/api/utils/constants.js +3 -0
  34. package/esm/src/api/utils/helpers.js +11 -0
  35. package/esm/src/api/utils/isValidENSAddress.js +21 -0
  36. package/esm/src/api/utils/postQueryFormatter.js +24 -0
  37. package/esm/src/api/utils/removeNodesAndEdges.js +51 -0
  38. package/esm/src/client/client.js +9 -0
  39. package/esm/src/client/index.js +2 -0
  40. package/esm/src/core/addOns/nftTokenV2/actions.js +107 -0
  41. package/esm/src/core/addOns/nftTokenV2/types/qn_fetchNFTCollectionDetails.js +10 -0
  42. package/esm/src/core/addOns/nftTokenV2/types/qn_fetchNFTs.js +13 -0
  43. package/esm/src/core/addOns/nftTokenV2/types/qn_fetchNFTsByCollection.js +13 -0
  44. package/esm/src/core/addOns/nftTokenV2/types/qn_getTokenMetadataByContractAddress.js +10 -0
  45. package/esm/src/core/addOns/nftTokenV2/types/qn_getTokenMetadataBySymbol.js +11 -0
  46. package/esm/src/core/addOns/nftTokenV2/types/qn_getTransactionsByAddress.js +18 -0
  47. package/esm/src/core/addOns/nftTokenV2/types/qn_getTransfersByNFT.js +12 -0
  48. package/esm/src/core/addOns/nftTokenV2/types/qn_getWalletTokenBalance.js +12 -0
  49. package/esm/src/core/addOns/nftTokenV2/types/qn_getWalletTokenTransactions.js +14 -0
  50. package/esm/src/core/addOns/nftTokenV2/types/qn_verifyNFTsOwner.js +11 -0
  51. package/esm/src/core/addOns/shared/helpers.js +10 -0
  52. package/esm/src/core/chains.js +60 -0
  53. package/esm/src/core/core.js +24 -0
  54. package/esm/src/core/index.d.ts +555 -0
  55. package/esm/src/core/index.js +2 -0
  56. package/esm/src/index.js +10 -0
  57. package/esm/src/lib/errors/QNChainNotSupported.js +7 -0
  58. package/esm/src/lib/errors/QNInputValidationError.js +10 -0
  59. package/esm/src/lib/errors/QNInvalidEnpointUrl.js +7 -0
  60. package/esm/src/lib/helpers/globalFetch.js +13 -0
  61. package/esm/src/lib/validation/ValidateInput.js +35 -0
  62. package/esm/src/lib/validation/codegenDerivedValidators.js +28 -0
  63. package/esm/src/lib/validation/validators.js +105 -0
  64. package/index.d.ts +612 -89
  65. package/package.json +25 -3
  66. package/esm/index.js +0 -1172
@@ -0,0 +1,24 @@
1
+ import { createClient, http, publicActions } from 'viem';
2
+ import { nftAndTokenActions } from './addOns/nftTokenV2/actions.js';
3
+ import { deriveChainFromUrl } from './chains.js';
4
+ import { setupGlobalFetch } from '../lib/helpers/globalFetch.js';
5
+
6
+ const buildQNActions = (config) => {
7
+ return (client) => ({
8
+ ...nftAndTokenActions(client, config),
9
+ });
10
+ };
11
+ class Core {
12
+ constructor({ endpointUrl, chain, config = {} }) {
13
+ setupGlobalFetch();
14
+ this.endpointUrl = endpointUrl;
15
+ const baseClient = createClient({
16
+ chain: chain || deriveChainFromUrl(endpointUrl),
17
+ transport: http(this.endpointUrl),
18
+ }).extend(publicActions);
19
+ const qnClient = baseClient.extend(buildQNActions(config));
20
+ this.client = qnClient;
21
+ }
22
+ }
23
+
24
+ export { Core, buildQNActions };
@@ -0,0 +1,555 @@
1
+ import { Chain, PublicClient } from 'viem';
2
+ import { z } from 'zod';
3
+
4
+ type SimplifyType<T> = T extends object ? {
5
+ [K in keyof T]: SimplifyType<T[K]>;
6
+ } : T;
7
+
8
+ type NftTrait = {
9
+ trait_type: string;
10
+ value: string;
11
+ };
12
+ type RpcNftAsset = {
13
+ collectionName: string;
14
+ collectionTokenId: string;
15
+ collectionAddress: string;
16
+ name: string;
17
+ description: string;
18
+ imageUrl: string;
19
+ traits: NftTrait[];
20
+ chain: string;
21
+ network: string;
22
+ };
23
+ type RPCTokenMetadata = {
24
+ name: string | null;
25
+ symbol: string | null;
26
+ contractAddress: string;
27
+ decimals: string | null;
28
+ genesisBlock: string | null;
29
+ genesisTransaction: string | null;
30
+ };
31
+
32
+ declare const qnFetchNFTInputSchema: z.ZodObject<{
33
+ wallet: z.ZodString;
34
+ contracts: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString, "many">>>;
35
+ omitFields: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString, "many">>>;
36
+ perPage: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
37
+ page: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
38
+ }, "strict", z.ZodTypeAny, {
39
+ wallet: string;
40
+ contracts?: string[] | null | undefined;
41
+ omitFields?: string[] | null | undefined;
42
+ perPage?: number | null | undefined;
43
+ page?: number | null | undefined;
44
+ }, {
45
+ wallet: string;
46
+ contracts?: string[] | null | undefined;
47
+ omitFields?: string[] | null | undefined;
48
+ perPage?: number | null | undefined;
49
+ page?: number | null | undefined;
50
+ }>;
51
+ type QNFetchNFTInput = z.infer<typeof qnFetchNFTInputSchema>;
52
+ type QNFetchNFTResult = {
53
+ owner: string;
54
+ assets: RpcNftAsset[];
55
+ totalPages: number;
56
+ totalItems: number;
57
+ pageNumber: number;
58
+ };
59
+
60
+ declare const qnFetchNFTCollectionDetailsInputSchema: z.ZodObject<{
61
+ contracts: z.ZodArray<z.ZodString, "many">;
62
+ }, "strict", z.ZodTypeAny, {
63
+ contracts: string[];
64
+ }, {
65
+ contracts: string[];
66
+ }>;
67
+ type QNFetchNFTCollectionDetailsInput = z.infer<typeof qnFetchNFTCollectionDetailsInputSchema>;
68
+ type RPCNftCollectionDetails = {
69
+ name: string;
70
+ address: string;
71
+ description: string;
72
+ erc1155: boolean;
73
+ erc721: boolean;
74
+ totalSupply: number;
75
+ circulatingSupply: number;
76
+ genesisBlock: number | null;
77
+ genesisTransaction: string | null;
78
+ };
79
+ type QNFetchNFTCollectionDetailsResult = RPCNftCollectionDetails[];
80
+
81
+ declare const qnFetchNFTsByCollectionInputSchema: z.ZodObject<{
82
+ collection: z.ZodString;
83
+ omitFields: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString, "many">>>;
84
+ tokens: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString, "many">>>;
85
+ perPage: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
86
+ page: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
87
+ }, "strict", z.ZodTypeAny, {
88
+ collection: string;
89
+ omitFields?: string[] | null | undefined;
90
+ tokens?: string[] | null | undefined;
91
+ perPage?: number | null | undefined;
92
+ page?: number | null | undefined;
93
+ }, {
94
+ collection: string;
95
+ omitFields?: string[] | null | undefined;
96
+ tokens?: string[] | null | undefined;
97
+ perPage?: number | null | undefined;
98
+ page?: number | null | undefined;
99
+ }>;
100
+ type QNFetchNFTsByCollectionInput = z.infer<typeof qnFetchNFTsByCollectionInputSchema>;
101
+ type QNFetchNFTsByCollectionResult = {
102
+ collection: string;
103
+ tokens: RpcNftAsset[];
104
+ };
105
+
106
+ declare const qnGetTransfersByNFTInputSchema: z.ZodObject<{
107
+ collection: z.ZodString;
108
+ collectionTokenId: z.ZodString;
109
+ perPage: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
110
+ page: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
111
+ }, "strict", z.ZodTypeAny, {
112
+ collection: string;
113
+ collectionTokenId: string;
114
+ perPage?: number | null | undefined;
115
+ page?: number | null | undefined;
116
+ }, {
117
+ collection: string;
118
+ collectionTokenId: string;
119
+ perPage?: number | null | undefined;
120
+ page?: number | null | undefined;
121
+ }>;
122
+ type QNGetTransfersByNFTInput = z.infer<typeof qnGetTransfersByNFTInputSchema>;
123
+ type TransfersByNFTTransfer = {
124
+ blockNumber: number;
125
+ date: string;
126
+ from: string;
127
+ to: string;
128
+ txHash: string;
129
+ };
130
+ type QNGetTransfersByNFTResult = {
131
+ collection: string;
132
+ transfers: TransfersByNFTTransfer[];
133
+ totalPages: number;
134
+ pageNumber: number;
135
+ totalItems: number;
136
+ };
137
+
138
+ declare const qnVerifyNFTsOwnerInputSchema: z.ZodObject<{
139
+ wallet: z.ZodString;
140
+ contracts: z.ZodArray<z.ZodString, "many">;
141
+ }, "strict", z.ZodTypeAny, {
142
+ wallet: string;
143
+ contracts: string[];
144
+ }, {
145
+ wallet: string;
146
+ contracts: string[];
147
+ }>;
148
+ type QNVerifyNFTsOwnerInput = z.infer<typeof qnVerifyNFTsOwnerInputSchema>;
149
+ type QNVerifyNFTsOwnerResult = {
150
+ owner: string;
151
+ assets: string[];
152
+ };
153
+
154
+ declare const qnGetTokenMetadataByCAInputSchema: z.ZodObject<{
155
+ contract: z.ZodString;
156
+ }, "strict", z.ZodTypeAny, {
157
+ contract: string;
158
+ }, {
159
+ contract: string;
160
+ }>;
161
+ type QNGetTokenMetadataByCAInput = z.infer<typeof qnGetTokenMetadataByCAInputSchema>;
162
+ type QNGetTokenMetadataByCAResult = RPCTokenMetadata;
163
+
164
+ declare const qnGetTokenMetadataBySymbolInputSchema: z.ZodObject<{
165
+ symbol: z.ZodString;
166
+ perPage: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
167
+ page: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
168
+ }, "strict", z.ZodTypeAny, {
169
+ symbol: string;
170
+ perPage?: number | null | undefined;
171
+ page?: number | null | undefined;
172
+ }, {
173
+ symbol: string;
174
+ perPage?: number | null | undefined;
175
+ page?: number | null | undefined;
176
+ }>;
177
+ type QNGetTokenMetadataBySymbolInput = z.infer<typeof qnGetTokenMetadataBySymbolInputSchema>;
178
+ type QNGetTokenMetadataBySymbolResult = {
179
+ tokens: RPCTokenMetadata[];
180
+ };
181
+
182
+ declare const qnGetTransactionsByAddressInputSchema: z.ZodEffects<z.ZodObject<{
183
+ address: z.ZodString;
184
+ fromBlock: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
185
+ toBlock: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
186
+ perPage: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
187
+ page: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
188
+ }, "strict", z.ZodTypeAny, {
189
+ address: string;
190
+ fromBlock?: number | null | undefined;
191
+ toBlock?: number | null | undefined;
192
+ perPage?: number | null | undefined;
193
+ page?: number | null | undefined;
194
+ }, {
195
+ address: string;
196
+ fromBlock?: number | null | undefined;
197
+ toBlock?: number | null | undefined;
198
+ perPage?: number | null | undefined;
199
+ page?: number | null | undefined;
200
+ }>, {
201
+ address: string;
202
+ fromBlock?: number | null | undefined;
203
+ toBlock?: number | null | undefined;
204
+ perPage?: number | null | undefined;
205
+ page?: number | null | undefined;
206
+ }, {
207
+ address: string;
208
+ fromBlock?: number | null | undefined;
209
+ toBlock?: number | null | undefined;
210
+ perPage?: number | null | undefined;
211
+ page?: number | null | undefined;
212
+ }>;
213
+ type QNGetTransactionsByAddressInput = z.infer<typeof qnGetTransactionsByAddressInputSchema>;
214
+ interface RPCTransactionByAddress {
215
+ blockTimestamp: string;
216
+ transactionHash: string;
217
+ blockNumber: string;
218
+ transactionIndex: number;
219
+ fromAddress: string;
220
+ toAddress: string;
221
+ contractAddress: string | null;
222
+ value: string;
223
+ }
224
+ type QNGetTransactionsByAddressResult = {
225
+ paginatedItems: RPCTransactionByAddress[];
226
+ totalItems: number;
227
+ totalPages: number;
228
+ pageNumber: number;
229
+ };
230
+
231
+ declare const qnGetWalletTokenBalanceInputSchema: z.ZodObject<{
232
+ wallet: z.ZodString;
233
+ contracts: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString, "many">>>;
234
+ perPage: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
235
+ page: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
236
+ }, "strict", z.ZodTypeAny, {
237
+ wallet: string;
238
+ contracts?: string[] | null | undefined;
239
+ perPage?: number | null | undefined;
240
+ page?: number | null | undefined;
241
+ }, {
242
+ wallet: string;
243
+ contracts?: string[] | null | undefined;
244
+ perPage?: number | null | undefined;
245
+ page?: number | null | undefined;
246
+ }>;
247
+ type QNGetWalletTokenBalanceInput = z.infer<typeof qnGetWalletTokenBalanceInputSchema>;
248
+ type RPCWalletTokenBalance = {
249
+ quantityIn: string;
250
+ quantityOut: string;
251
+ name: string | null;
252
+ symbol: string | null;
253
+ decimals: string | null;
254
+ address: string;
255
+ totalBalance: string;
256
+ };
257
+ type QNGetWalletTokenBalanceResult = {
258
+ result: RPCWalletTokenBalance[];
259
+ totalItems: number;
260
+ totalPages: number;
261
+ pageNumber: number;
262
+ };
263
+
264
+ declare const qnGetWalletTokenTransactionsInputSchema: z.ZodObject<{
265
+ address: z.ZodString;
266
+ contract: z.ZodString;
267
+ fromBlock: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
268
+ toBlock: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
269
+ perPage: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
270
+ page: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
271
+ }, "strict", z.ZodTypeAny, {
272
+ address: string;
273
+ contract: string;
274
+ fromBlock?: number | null | undefined;
275
+ toBlock?: number | null | undefined;
276
+ perPage?: number | null | undefined;
277
+ page?: number | null | undefined;
278
+ }, {
279
+ address: string;
280
+ contract: string;
281
+ fromBlock?: number | null | undefined;
282
+ toBlock?: number | null | undefined;
283
+ perPage?: number | null | undefined;
284
+ page?: number | null | undefined;
285
+ }>;
286
+ type QNGetWalletTokenTransactionsInput = z.infer<typeof qnGetWalletTokenTransactionsInputSchema>;
287
+ type RPCFullTokenMetadata = {
288
+ address: string;
289
+ genesisBlock: string | null;
290
+ genesisTransaction: string | null;
291
+ name: string | null;
292
+ symbol: string | null;
293
+ decimals: string | null;
294
+ contractAddress: string;
295
+ };
296
+ type RPCTokenTransaction = {
297
+ name: string | null;
298
+ symbol: string | null;
299
+ decimals: string | null;
300
+ address: string;
301
+ quantityIn: string;
302
+ quantityOut: string;
303
+ blockNumber: string;
304
+ transactionHash: string;
305
+ timestamp: string;
306
+ totalBalance: string;
307
+ };
308
+ type QNGetWalletTokenTransactionsResult = {
309
+ paginatedItems: RPCTokenTransaction[];
310
+ totalItems: number;
311
+ totalPages: number;
312
+ pageNumber: number;
313
+ token: RPCFullTokenMetadata;
314
+ };
315
+
316
+ type NFTAndTokenActions = {
317
+ /**
318
+ * Returns aggregated data on NFTs for a given wallet.
319
+ *
320
+ * - Docs: https://www.quicknode.com/docs/ethereum/qn_fetchNFTs_v2
321
+ *
322
+ * @param args - {@link QNFetchNFTInput}
323
+ * @returns response - {@link QNFetchNFTsResult}
324
+ *
325
+ * @example
326
+ * import QuickNode from '@quicknode/sdk';
327
+ *
328
+ * const core = new QuickNode.Core({
329
+ * endpointUrl: "https://some-cool-name.quiknode.pro/abcd1234",
330
+ * config: {
331
+ * addOns: { nftTokenV2: true }
332
+ * }
333
+ * }
334
+ *
335
+ * const response = await core.client.qn_fetchNFTs({
336
+ * wallet: "0xD10E24685c7CDD3cd3BaAA86b09C92Be28c834B6",
337
+ * contracts: ['0x2106C00Ac7dA0A3430aE667879139E832307AeAa'],
338
+ * });
339
+ */
340
+ qn_fetchNFTs: (args: SimplifyType<QNFetchNFTInput>) => Promise<SimplifyType<QNFetchNFTResult>>;
341
+ /**
342
+ * Returns aggregated data on NFTs for a given wallet.
343
+ *
344
+ * - Docs: https://www.quicknode.com/docs/ethereum/qn_fetchNFTCollectionDetails_v2
345
+ *
346
+ * @param args - {@link QNFetchNFTCollectionDetailsInput}
347
+ * @returns response - {@link QNFetchNFTCollectionDetailsResult}
348
+ *
349
+ * @example
350
+ * import QuickNode from '@quicknode/sdk';
351
+ *
352
+ * const core = new QuickNode.Core({
353
+ * endpointUrl: "https://some-cool-name.quiknode.pro/abcd1234",
354
+ * config: {
355
+ * addOns: { nftTokenV2: true }
356
+ * }
357
+ * }
358
+ *
359
+ * const response = await core.client.qn_fetchNFTCollectionDetails({
360
+ * contracts: [
361
+ * "0x60E4d786628Fea6478F785A6d7e704777c86a7c6",
362
+ * "0x7Bd29408f11D2bFC23c34f18275bBf23bB716Bc7",
363
+ * ]
364
+ * });
365
+ */
366
+ qn_fetchNFTCollectionDetails: (args: SimplifyType<QNFetchNFTCollectionDetailsInput>) => Promise<SimplifyType<QNFetchNFTCollectionDetailsResult>>;
367
+ /**
368
+ * Returns aggregated data on NFTs within a given collection.
369
+ *
370
+ * - Docs: https://www.quicknode.com/docs/ethereum/qn_fetchNFTsByCollection_v2
371
+ *
372
+ * @param args - {@link QNFetchNFTsByCollectionInput}
373
+ * @returns response - {@link QNFetchNFTsByCollectionResult}
374
+ *
375
+ * @example
376
+ * import QuickNode from '@quicknode/sdk';
377
+ *
378
+ * const core = new QuickNode.Core({
379
+ * endpointUrl: "https://some-cool-name.quiknode.pro/abcd1234",
380
+ * config: {
381
+ * addOns: { nftTokenV2: true }
382
+ * }
383
+ * }
384
+ *
385
+ * const response = await core.client.qn_fetchNFTsByCollection({
386
+ * collection: "0x60E4d786628Fea6478F785A6d7e704777c86a7c6",
387
+ * })
388
+ */
389
+ qn_fetchNFTsByCollection: (args: SimplifyType<QNFetchNFTsByCollectionInput>) => Promise<SimplifyType<QNFetchNFTsByCollectionResult>>;
390
+ /**
391
+ * Returns transfers by given NFT.
392
+ *
393
+ * - Docs: https://www.quicknode.com/docs/ethereum/qn_getTransfersByNFT_v2
394
+ *
395
+ * @param args - {@link QNGetTransfersByNFTInput}
396
+ * @returns response - {@link QNGetTransfersByNFTResult}
397
+ *
398
+ * @example
399
+ * import QuickNode from '@quicknode/sdk';
400
+ *
401
+ * const core = new QuickNode.Core({
402
+ * endpointUrl: "https://some-cool-name.quiknode.pro/abcd1234",
403
+ * config: {
404
+ * addOns: { nftTokenV2: true }
405
+ * }
406
+ * }
407
+ *
408
+ * const response = await core.client.qn_getTransfersByNFT({
409
+ * collection: "0x60E4d786628Fea6478F785A6d7e704777c86a7c6",
410
+ 7 * collectionTokenId: "1",
411
+ * })
412
+ */
413
+ qn_getTransfersByNFT: (args: SimplifyType<QNGetTransfersByNFTInput>) => Promise<SimplifyType<QNGetTransfersByNFTResult>>;
414
+ /**
415
+ * Confirms ownership of specified NFTs for a given wallet.
416
+ *
417
+ * - Docs: https://www.quicknode.com/docs/ethereum/qn_verifyNFTsOwner_v2
418
+ *
419
+ * @param args - {@link QNVerifyNFTsOwnerInput}
420
+ * @returns response - {@link QNVerifyNFTsOwnerResult}
421
+ *
422
+ * @example
423
+ * import QuickNode from '@quicknode/sdk';
424
+ *
425
+ * const core = new QuickNode.Core({
426
+ * endpointUrl: "https://some-cool-name.quiknode.pro/abcd1234",
427
+ * config: {
428
+ * addOns: { nftTokenV2: true }
429
+ * }
430
+ * }
431
+ *
432
+ * const response = await core.client.qn_verifyNFTsOwner({
433
+ * wallet: "0x91b51c173a4bdaa1a60e234fc3f705a16d228740",
434
+ * contracts: [
435
+ * "0x2106c00ac7da0a3430ae667879139e832307aeaa:3643",
436
+ * "0xd07dc4262bcdbf85190c01c996b4c06a461d2430:133803",
437
+ * ],
438
+ * })
439
+ *
440
+ */
441
+ qn_verifyNFTsOwner: (args: SimplifyType<QNVerifyNFTsOwnerInput>) => Promise<SimplifyType<QNVerifyNFTsOwnerResult>>;
442
+ /**
443
+ * Returns token details for specified contract.
444
+ *
445
+ * - Docs: https://www.quicknode.com/docs/ethereum/qn_getTokenMetadataByContractAddress_v2
446
+ *
447
+ * @param args - {@link QNGetTokenMetadataByCAInput}
448
+ * @returns response - {@link QNGetTokenMetadataByCAResult}
449
+ *
450
+ * @example
451
+ * import QuickNode from '@quicknode/sdk';
452
+ *
453
+ * const core = new QuickNode.Core({
454
+ * endpointUrl: "https://some-cool-name.quiknode.pro/abcd1234",
455
+ * config: {
456
+ * addOns: { nftTokenV2: true }
457
+ * }
458
+ * }
459
+ *
460
+ * const response = await core.client.qn_getTokenMetadataByContractAddress({
461
+ * contract: "0x2106c00ac7da0a3430ae667879139e832307aeaa",
462
+ * })
463
+ */
464
+ qn_getTokenMetadataByContractAddress: (args: SimplifyType<QNGetTokenMetadataByCAInput>) => Promise<SimplifyType<QNGetTokenMetadataByCAResult | null>>;
465
+ /**
466
+ * Returns token details for specified token symbol.
467
+ *
468
+ * - Docs: https://www.quicknode.com/docs/ethereum/qn_getTokenMetadataBySymbol_v2
469
+ *
470
+ * @param args - {@link QNGetTokenMetadataBySymbolInput}
471
+ * @returns response - {@link QNGetTokenMetadataBySymbolResult}
472
+ *
473
+ * @example
474
+ * import QuickNode from '@quicknode/sdk';
475
+ *
476
+ * const core = new QuickNode.Core({
477
+ * endpointUrl: "https://some-cool-name.quiknode.pro/abcd1234",
478
+ * config: {
479
+ * addOns: { nftTokenV2: true }
480
+ * }
481
+ * }
482
+ *
483
+ * const response = await core.client.qn_getTokenMetadataBySymbol({
484
+ * symbol: "DAI",
485
+ * })
486
+ */
487
+ qn_getTokenMetadataBySymbol: (args: SimplifyType<QNGetTokenMetadataBySymbolInput>) => Promise<SimplifyType<QNGetTokenMetadataBySymbolResult>>;
488
+ /**
489
+ * Returns transactions within a specified wallet address.
490
+ *
491
+ * - Docs: https://www.quicknode.com/docs/ethereum/qn_getTransactionsByAddress_v2
492
+ *
493
+ * @param args - {@link QNGetTransactionsByAddressInput}
494
+ * @returns response - {@link QNGetTransactionsByAddressResult}
495
+ *
496
+ * @example
497
+ * import QuickNode from '@quicknode/sdk';
498
+ *
499
+ * const core = new QuickNode.Core({
500
+ * endpointUrl: "https://some-cool-name.quiknode.pro/abcd1234",
501
+ * config: {
502
+ * addOns: { nftTokenV2: true }
503
+ * }
504
+ * }
505
+ *
506
+ * const response = await core.client.qn_getTransactionsByAddress({
507
+ * address: "0xD10E24685c7CDD3cd3BaAA86b09C92Be28c834B6"
508
+ * })
509
+ */
510
+ qn_getTransactionsByAddress: (args: SimplifyType<QNGetTransactionsByAddressInput>) => Promise<SimplifyType<QNGetTransactionsByAddressResult>>;
511
+ /**
512
+ * Returns ERC-20 tokens and token balances within a wallet.
513
+ *
514
+ * - Docs: https://www.quicknode.com/docs/ethereum/qn_getWalletTokenBalance_v2
515
+ *
516
+ * @param args - {@link QNGetWalletTokenBalanceInput}
517
+ * @returns response - {@link QNGetWalletTokenBalanceResult}
518
+ *
519
+ * @example
520
+ * import QuickNode from '@quicknode/sdk';
521
+ *
522
+ * const core = new QuickNode.Core({
523
+ * endpointUrl: "https://some-cool-name.quiknode.pro/abcd1234",
524
+ * config: {
525
+ * addOns: { nftTokenV2: true }
526
+ * }
527
+ * }
528
+ *
529
+ * const response = await core.client.qn_getWalletTokenBalance({
530
+ * address: "0xD10E24685c7CDD3cd3BaAA86b09C92Be28c834B6"
531
+ * })
532
+ */
533
+ qn_getWalletTokenBalance: (args: SimplifyType<QNGetWalletTokenBalanceInput>) => Promise<SimplifyType<QNGetWalletTokenBalanceResult>>;
534
+ qn_getWalletTokenTransactions: (args: SimplifyType<QNGetWalletTokenTransactionsInput>) => Promise<SimplifyType<QNGetWalletTokenTransactionsResult>>;
535
+ };
536
+
537
+ interface CoreArguments {
538
+ endpointUrl: string;
539
+ chain?: Chain;
540
+ config?: QNCoreClientConfig;
541
+ }
542
+ type QNCoreClientConfig = {
543
+ addOns?: {
544
+ nftTokenV2: boolean;
545
+ };
546
+ };
547
+ type QNCoreClient = PublicClient & NFTAndTokenActions;
548
+
549
+ declare class Core {
550
+ readonly endpointUrl: string;
551
+ readonly client: QNCoreClient;
552
+ constructor({ endpointUrl, chain, config }: CoreArguments);
553
+ }
554
+
555
+ export { Core as default };
@@ -0,0 +1,2 @@
1
+ import { Core } from './core.js';
2
+ export { Core as default } from './core.js';
@@ -0,0 +1,10 @@
1
+ import QuickNode from './client/client.js';
2
+ export { default } from './client/client.js';
3
+ export { API } from './api/api.js';
4
+ export { Core } from './core/core.js';
5
+ import * as viem from 'viem';
6
+ export { viem };
7
+ export { QNInputValidationError } from './lib/errors/QNInputValidationError.js';
8
+ export { QNInvalidEndpointUrl } from './lib/errors/QNInvalidEnpointUrl.js';
9
+ export { QNChainNotSupported } from './lib/errors/QNChainNotSupported.js';
10
+ export { gql } from '@urql/core';
@@ -0,0 +1,7 @@
1
+ class QNChainNotSupported extends Error {
2
+ constructor(endpointUrl) {
3
+ super(`The chain for endpoint URL ${endpointUrl} is not currently supported by the QuickNode SDK.`);
4
+ }
5
+ }
6
+
7
+ export { QNChainNotSupported };
@@ -0,0 +1,10 @@
1
+ class QNInputValidationError extends Error {
2
+ constructor({ messages, zodError, }) {
3
+ super(`QuickNode SDK Input Validation Error: ${messages.join(', ')}`);
4
+ this.messages = messages;
5
+ this.issues = zodError.issues;
6
+ this.zodError = zodError; // see https://github.com/colinhacks/zod/blob/HEAD/ERROR_HANDLING.md
7
+ }
8
+ }
9
+
10
+ export { QNInputValidationError };
@@ -0,0 +1,7 @@
1
+ class QNInvalidEndpointUrl extends Error {
2
+ constructor() {
3
+ super('Endpoint URL is not in a valid QuickNode URL format. Please check the URL and try again');
4
+ }
5
+ }
6
+
7
+ export { QNInvalidEndpointUrl };
@@ -0,0 +1,13 @@
1
+ import fetch, { Headers, Request, Response } from 'cross-fetch';
2
+
3
+ function setupGlobalFetch() {
4
+ // Required for viem to work in node
5
+ if (!globalThis.fetch) {
6
+ globalThis.fetch = fetch;
7
+ globalThis.Headers = Headers;
8
+ globalThis.Request = Request;
9
+ globalThis.Response = Response;
10
+ }
11
+ }
12
+
13
+ export { setupGlobalFetch };
@@ -0,0 +1,35 @@
1
+ import { QNInputValidationError } from '../errors/QNInputValidationError.js';
2
+
3
+ function formatErrors(baseError) {
4
+ const errorMessages = [];
5
+ baseError.errors.forEach((error) => {
6
+ errorMessages.push(`${error.path.length > 0 ? error.path + ': ' : ''}${error.message}`);
7
+ });
8
+ return errorMessages.length > 0
9
+ ? new QNInputValidationError({
10
+ messages: errorMessages,
11
+ zodError: baseError,
12
+ })
13
+ : null;
14
+ }
15
+ // Decorator for runtime validation to handle input that is unknown at compile time
16
+ function ValidateInput(schema) {
17
+ return function (target, propertyName, descriptor) {
18
+ const method = descriptor.value;
19
+ if (!method)
20
+ return;
21
+ descriptor.value = async function (...args) {
22
+ const [input] = args;
23
+ const validation = schema.safeParse(input);
24
+ if (!validation.success) {
25
+ const formattedErrors = formatErrors(validation.error);
26
+ if (formattedErrors) {
27
+ throw formattedErrors;
28
+ }
29
+ }
30
+ return method.apply(this, args);
31
+ };
32
+ };
33
+ }
34
+
35
+ export { ValidateInput, formatErrors };