quicknode-solana-kit 1.0.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 (70) hide show
  1. package/README.md +495 -0
  2. package/dist/addons.d.ts +3 -0
  3. package/dist/addons.d.ts.map +1 -0
  4. package/dist/addons.js +128 -0
  5. package/dist/addons.js.map +1 -0
  6. package/dist/assets/das.d.ts +8 -0
  7. package/dist/assets/das.d.ts.map +1 -0
  8. package/dist/assets/das.js +74 -0
  9. package/dist/assets/das.js.map +1 -0
  10. package/dist/assets/index.d.ts +2 -0
  11. package/dist/assets/index.d.ts.map +1 -0
  12. package/dist/assets/index.js +11 -0
  13. package/dist/assets/index.js.map +1 -0
  14. package/dist/index.d.ts +40 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +128 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/streaming/index.d.ts +2 -0
  19. package/dist/streaming/index.d.ts.map +1 -0
  20. package/dist/streaming/index.js +8 -0
  21. package/dist/streaming/index.js.map +1 -0
  22. package/dist/streaming/watcher.d.ts +5 -0
  23. package/dist/streaming/watcher.d.ts.map +1 -0
  24. package/dist/streaming/watcher.js +89 -0
  25. package/dist/streaming/watcher.js.map +1 -0
  26. package/dist/swap/index.d.ts +2 -0
  27. package/dist/swap/index.d.ts.map +1 -0
  28. package/dist/swap/index.js +8 -0
  29. package/dist/swap/index.js.map +1 -0
  30. package/dist/swap/jupiter.d.ts +16 -0
  31. package/dist/swap/jupiter.d.ts.map +1 -0
  32. package/dist/swap/jupiter.js +57 -0
  33. package/dist/swap/jupiter.js.map +1 -0
  34. package/dist/transactions/index.d.ts +3 -0
  35. package/dist/transactions/index.d.ts.map +1 -0
  36. package/dist/transactions/index.js +10 -0
  37. package/dist/transactions/index.js.map +1 -0
  38. package/dist/transactions/priority-fees.d.ts +4 -0
  39. package/dist/transactions/priority-fees.d.ts.map +1 -0
  40. package/dist/transactions/priority-fees.js +30 -0
  41. package/dist/transactions/priority-fees.js.map +1 -0
  42. package/dist/transactions/smart-transaction.d.ts +17 -0
  43. package/dist/transactions/smart-transaction.d.ts.map +1 -0
  44. package/dist/transactions/smart-transaction.js +112 -0
  45. package/dist/transactions/smart-transaction.js.map +1 -0
  46. package/dist/types/errors.d.ts +61 -0
  47. package/dist/types/errors.d.ts.map +1 -0
  48. package/dist/types/errors.js +139 -0
  49. package/dist/types/errors.js.map +1 -0
  50. package/dist/types/index.d.ts +211 -0
  51. package/dist/types/index.d.ts.map +1 -0
  52. package/dist/types/index.js +6 -0
  53. package/dist/types/index.js.map +1 -0
  54. package/dist/utils/addon-guard.d.ts +25 -0
  55. package/dist/utils/addon-guard.d.ts.map +1 -0
  56. package/dist/utils/addon-guard.js +67 -0
  57. package/dist/utils/addon-guard.js.map +1 -0
  58. package/dist/utils/helpers.d.ts +10 -0
  59. package/dist/utils/helpers.d.ts.map +1 -0
  60. package/dist/utils/helpers.js +49 -0
  61. package/dist/utils/helpers.js.map +1 -0
  62. package/dist/utils/http.d.ts +4 -0
  63. package/dist/utils/http.d.ts.map +1 -0
  64. package/dist/utils/http.js +88 -0
  65. package/dist/utils/http.js.map +1 -0
  66. package/dist/utils/index.d.ts +4 -0
  67. package/dist/utils/index.d.ts.map +1 -0
  68. package/dist/utils/index.js +20 -0
  69. package/dist/utils/index.js.map +1 -0
  70. package/package.json +82 -0
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendSmartTransaction = sendSmartTransaction;
4
+ exports.prepareSmartTransaction = prepareSmartTransaction;
5
+ const web3_js_1 = require("@solana/web3.js");
6
+ const errors_1 = require("../types/errors");
7
+ const helpers_1 = require("../utils/helpers");
8
+ const priority_fees_1 = require("./priority-fees");
9
+ const DEFAULTS = {
10
+ feeLevel: 'recommended',
11
+ useJito: false,
12
+ maxRetries: 5,
13
+ simulateFirst: true,
14
+ computeUnitBuffer: 10,
15
+ skipPreflight: false,
16
+ };
17
+ async function sendSmartTransaction(config, params) {
18
+ const opts = { ...DEFAULTS, ...params.options };
19
+ const conn = (0, helpers_1.createConnection)(config);
20
+ const startTime = Date.now();
21
+ let computeUnits = 200_000;
22
+ if (opts.simulateFirst) {
23
+ computeUnits = await simulateCU(conn, params.transaction, params.signer, opts.computeUnitBuffer);
24
+ }
25
+ let priorityFee = 1_000;
26
+ try {
27
+ const fees = await (0, priority_fees_1.estimatePriorityFees)(config);
28
+ priorityFee = (0, priority_fees_1.feeForLevel)(fees, opts.feeLevel);
29
+ }
30
+ catch {
31
+ console.warn('[QNSolanaKit] Priority fee estimation failed — using fallback 1000 µlamports/CU');
32
+ }
33
+ const tx = buildTxWithBudget(params.transaction, computeUnits, priorityFee);
34
+ let lastError;
35
+ for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {
36
+ try {
37
+ const { blockhash, lastValidBlockHeight } = await conn.getLatestBlockhash('confirmed');
38
+ tx.recentBlockhash = blockhash;
39
+ tx.feePayer = params.signer.publicKey;
40
+ tx.sign(params.signer);
41
+ const signature = await conn.sendRawTransaction(tx.serialize(), {
42
+ skipPreflight: opts.skipPreflight,
43
+ maxRetries: 0,
44
+ });
45
+ const confirmation = await conn.confirmTransaction({ signature, blockhash, lastValidBlockHeight }, config.commitment ?? 'confirmed');
46
+ if (confirmation.value.err) {
47
+ throw new errors_1.TransactionFailedError(signature, confirmation.value.err);
48
+ }
49
+ const txInfo = await conn.getTransaction(signature, {
50
+ commitment: 'confirmed',
51
+ maxSupportedTransactionVersion: 0,
52
+ });
53
+ return {
54
+ signature,
55
+ slot: txInfo?.slot ?? 0,
56
+ priorityFeeMicroLamports: priorityFee,
57
+ computeUnitsUsed: computeUnits,
58
+ jitoBundle: false,
59
+ confirmationMs: Date.now() - startTime,
60
+ };
61
+ }
62
+ catch (err) {
63
+ lastError = err;
64
+ if (err instanceof errors_1.TransactionFailedError)
65
+ throw err;
66
+ if (attempt < opts.maxRetries) {
67
+ console.warn(`[QNSolanaKit] Attempt ${attempt + 1} failed, retrying...`);
68
+ await (0, helpers_1.sleep)((0, helpers_1.backoffMs)(attempt));
69
+ }
70
+ }
71
+ }
72
+ throw new errors_1.MaxRetriesExceededError(opts.maxRetries, lastError);
73
+ }
74
+ async function prepareSmartTransaction(config, params) {
75
+ const opts = { ...DEFAULTS, ...params.options };
76
+ const conn = (0, helpers_1.createConnection)(config);
77
+ let priorityFee = 1_000;
78
+ let computeUnits = 200_000;
79
+ try {
80
+ const fees = await (0, priority_fees_1.estimatePriorityFees)(config);
81
+ priorityFee = (0, priority_fees_1.feeForLevel)(fees, opts.feeLevel);
82
+ }
83
+ catch { /* use fallback */ }
84
+ const tx = buildTxWithBudget(params.transaction, computeUnits, priorityFee);
85
+ const { blockhash } = await conn.getLatestBlockhash('confirmed');
86
+ tx.recentBlockhash = blockhash;
87
+ tx.feePayer = params.payer;
88
+ return { transaction: tx, priorityFeeMicroLamports: priorityFee, computeUnits };
89
+ }
90
+ async function simulateCU(conn, tx, signer, bufferPct) {
91
+ try {
92
+ const simTx = new web3_js_1.Transaction().add(web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({ units: 1_400_000 }), ...tx.instructions);
93
+ const { blockhash } = await conn.getLatestBlockhash('confirmed');
94
+ simTx.recentBlockhash = blockhash;
95
+ simTx.feePayer = signer.publicKey;
96
+ const sim = await conn.simulateTransaction(simTx, [signer], true);
97
+ if (sim.value.err)
98
+ return 200_000;
99
+ const estimated = sim.value.unitsConsumed ?? 200_000;
100
+ return Math.ceil(estimated * (1 + bufferPct / 100));
101
+ }
102
+ catch {
103
+ return 200_000;
104
+ }
105
+ }
106
+ function buildTxWithBudget(tx, cu, fee) {
107
+ const ixs = tx.instructions.filter((ix) => !ix.programId.equals(web3_js_1.ComputeBudgetProgram.programId));
108
+ const newTx = new web3_js_1.Transaction();
109
+ newTx.add(web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({ units: cu }), web3_js_1.ComputeBudgetProgram.setComputeUnitPrice({ microLamports: fee }), ...ixs);
110
+ return newTx;
111
+ }
112
+ //# sourceMappingURL=smart-transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-transaction.js","sourceRoot":"","sources":["../../src/transactions/smart-transaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Custom errors for @quicknode/solana-kit
3
+ *
4
+ * Every error tells the developer exactly what went wrong
5
+ * and exactly how to fix it — no cryptic RPC errors.
6
+ */
7
+ export declare class QNError extends Error {
8
+ readonly code: string;
9
+ readonly details?: unknown | undefined;
10
+ constructor(message: string, code: string, details?: unknown | undefined);
11
+ }
12
+ /**
13
+ * Thrown when you call a method that requires a QuickNode add-on
14
+ * that isn't enabled on your endpoint.
15
+ *
16
+ * How to fix: Go to https://dashboard.quicknode.com → your endpoint → Add-ons
17
+ */
18
+ export declare class AddOnNotEnabledError extends QNError {
19
+ readonly addOnName: string;
20
+ readonly tier: 'free' | 'paid';
21
+ constructor(addOnName: string, tier: 'free' | 'paid');
22
+ }
23
+ /**
24
+ * Thrown when a transaction is not confirmed within the timeout period.
25
+ * Usually means the network is congested or the fee was too low.
26
+ */
27
+ export declare class TransactionTimeoutError extends QNError {
28
+ readonly signature: string;
29
+ constructor(signature: string);
30
+ }
31
+ /**
32
+ * Thrown when a transaction fails on-chain (e.g. slippage exceeded,
33
+ * program error, insufficient funds for the instruction).
34
+ */
35
+ export declare class TransactionFailedError extends QNError {
36
+ readonly signature: string;
37
+ readonly reason: unknown;
38
+ constructor(signature: string, reason: unknown);
39
+ }
40
+ /**
41
+ * Thrown when the transaction fails after all retry attempts.
42
+ */
43
+ export declare class MaxRetriesExceededError extends QNError {
44
+ readonly maxRetries: number;
45
+ readonly lastError: unknown;
46
+ constructor(maxRetries: number, lastError: unknown);
47
+ }
48
+ /**
49
+ * Thrown when the endpoint URL is missing or malformed.
50
+ */
51
+ export declare class InvalidEndpointError extends QNError {
52
+ constructor(url: string);
53
+ }
54
+ /**
55
+ * Thrown when the RPC request itself fails (network error, bad response, etc.)
56
+ */
57
+ export declare class RPCError extends QNError {
58
+ readonly statusCode: number;
59
+ constructor(method: string, statusCode: number, body: string);
60
+ }
61
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/types/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAa,OAAQ,SAAQ,KAAK;aAGd,IAAI,EAAE,MAAM;aACZ,OAAO,CAAC,EAAE,OAAO;gBAFjC,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,OAAO,YAAA;CAMpC;AAID;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,OAAO;aAE7B,SAAS,EAAE,MAAM;aACjB,IAAI,EAAE,MAAM,GAAG,MAAM;gBADrB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GAAG,MAAM;CAqBxC;AAID;;;GAGG;AACH,qBAAa,uBAAwB,SAAQ,OAAO;aACtB,SAAS,EAAE,MAAM;gBAAjB,SAAS,EAAE,MAAM;CAY9C;AAID;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,OAAO;aAE/B,SAAS,EAAE,MAAM;aACjB,MAAM,EAAE,OAAO;gBADf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO;CAalC;AAID;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,OAAO;aAEhC,UAAU,EAAE,MAAM;aAClB,SAAS,EAAE,OAAO;gBADlB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,OAAO;CAYrC;AAID;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,OAAO;gBACnC,GAAG,EAAE,MAAM;CAWxB;AAID;;GAEG;AACH,qBAAa,QAAS,SAAQ,OAAO;aAGjB,UAAU,EAAE,MAAM;gBADlC,MAAM,EAAE,MAAM,EACE,UAAU,EAAE,MAAM,EAClC,IAAI,EAAE,MAAM;CAcf"}
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ /**
3
+ * Custom errors for @quicknode/solana-kit
4
+ *
5
+ * Every error tells the developer exactly what went wrong
6
+ * and exactly how to fix it — no cryptic RPC errors.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.RPCError = exports.InvalidEndpointError = exports.MaxRetriesExceededError = exports.TransactionFailedError = exports.TransactionTimeoutError = exports.AddOnNotEnabledError = exports.QNError = void 0;
10
+ class QNError extends Error {
11
+ code;
12
+ details;
13
+ constructor(message, code, details) {
14
+ super(message);
15
+ this.code = code;
16
+ this.details = details;
17
+ this.name = 'QNError';
18
+ Object.setPrototypeOf(this, new.target.prototype);
19
+ }
20
+ }
21
+ exports.QNError = QNError;
22
+ // ─────────────────────────────────────────────────────────────
23
+ /**
24
+ * Thrown when you call a method that requires a QuickNode add-on
25
+ * that isn't enabled on your endpoint.
26
+ *
27
+ * How to fix: Go to https://dashboard.quicknode.com → your endpoint → Add-ons
28
+ */
29
+ class AddOnNotEnabledError extends QNError {
30
+ addOnName;
31
+ tier;
32
+ constructor(addOnName, tier) {
33
+ const tierNote = tier === 'free'
34
+ ? 'This is a FREE add-on — enable it in under 30 seconds.'
35
+ : 'This is a PAID add-on — requires a QuickNode paid plan.';
36
+ super(`\n\n ❌ Add-on not enabled: "${addOnName}"\n\n` +
37
+ ` ${tierNote}\n\n` +
38
+ ` How to fix:\n` +
39
+ ` 1. Go to https://dashboard.quicknode.com\n` +
40
+ ` 2. Click on your endpoint\n` +
41
+ ` 3. Go to the "Add-ons" tab\n` +
42
+ ` 4. Enable "${addOnName}"\n` +
43
+ ` 5. Set addOns.${addOnName.toLowerCase().replace(/\s/g, '')}: true in your QNSolanaKit config\n`, 'ADD_ON_NOT_ENABLED', { addOnName, tier });
44
+ this.addOnName = addOnName;
45
+ this.tier = tier;
46
+ this.name = 'AddOnNotEnabledError';
47
+ Object.setPrototypeOf(this, new.target.prototype);
48
+ }
49
+ }
50
+ exports.AddOnNotEnabledError = AddOnNotEnabledError;
51
+ // ─────────────────────────────────────────────────────────────
52
+ /**
53
+ * Thrown when a transaction is not confirmed within the timeout period.
54
+ * Usually means the network is congested or the fee was too low.
55
+ */
56
+ class TransactionTimeoutError extends QNError {
57
+ signature;
58
+ constructor(signature) {
59
+ super(`Transaction not confirmed within timeout.\n` +
60
+ ` Signature: ${signature}\n` +
61
+ ` Try: increase feeLevel to 'high' or 'extreme'\n` +
62
+ ` Explorer: https://explorer.solana.com/tx/${signature}`, 'TX_TIMEOUT', { signature });
63
+ this.signature = signature;
64
+ this.name = 'TransactionTimeoutError';
65
+ Object.setPrototypeOf(this, new.target.prototype);
66
+ }
67
+ }
68
+ exports.TransactionTimeoutError = TransactionTimeoutError;
69
+ // ─────────────────────────────────────────────────────────────
70
+ /**
71
+ * Thrown when a transaction fails on-chain (e.g. slippage exceeded,
72
+ * program error, insufficient funds for the instruction).
73
+ */
74
+ class TransactionFailedError extends QNError {
75
+ signature;
76
+ reason;
77
+ constructor(signature, reason) {
78
+ super(`Transaction failed on-chain.\n` +
79
+ ` Signature: ${signature}\n` +
80
+ ` Reason: ${JSON.stringify(reason)}\n` +
81
+ ` Explorer: https://explorer.solana.com/tx/${signature}`, 'TX_FAILED', { signature, reason });
82
+ this.signature = signature;
83
+ this.reason = reason;
84
+ this.name = 'TransactionFailedError';
85
+ Object.setPrototypeOf(this, new.target.prototype);
86
+ }
87
+ }
88
+ exports.TransactionFailedError = TransactionFailedError;
89
+ // ─────────────────────────────────────────────────────────────
90
+ /**
91
+ * Thrown when the transaction fails after all retry attempts.
92
+ */
93
+ class MaxRetriesExceededError extends QNError {
94
+ maxRetries;
95
+ lastError;
96
+ constructor(maxRetries, lastError) {
97
+ super(`Transaction failed after ${maxRetries} retries.\n` +
98
+ ` Last error: ${lastError instanceof Error ? lastError.message : String(lastError)}\n` +
99
+ ` Try: increase maxRetries, use a higher feeLevel, or check your transaction logic.`, 'TX_MAX_RETRIES', { maxRetries, lastError });
100
+ this.maxRetries = maxRetries;
101
+ this.lastError = lastError;
102
+ this.name = 'MaxRetriesExceededError';
103
+ Object.setPrototypeOf(this, new.target.prototype);
104
+ }
105
+ }
106
+ exports.MaxRetriesExceededError = MaxRetriesExceededError;
107
+ // ─────────────────────────────────────────────────────────────
108
+ /**
109
+ * Thrown when the endpoint URL is missing or malformed.
110
+ */
111
+ class InvalidEndpointError extends QNError {
112
+ constructor(url) {
113
+ super(`Invalid QuickNode endpoint URL: "${url}"\n` +
114
+ ` Expected: https://your-name.solana-mainnet.quiknode.pro/TOKEN/\n` +
115
+ ` Get one free at: https://dashboard.quicknode.com`, 'INVALID_ENDPOINT', { url });
116
+ this.name = 'InvalidEndpointError';
117
+ Object.setPrototypeOf(this, new.target.prototype);
118
+ }
119
+ }
120
+ exports.InvalidEndpointError = InvalidEndpointError;
121
+ // ─────────────────────────────────────────────────────────────
122
+ /**
123
+ * Thrown when the RPC request itself fails (network error, bad response, etc.)
124
+ */
125
+ class RPCError extends QNError {
126
+ statusCode;
127
+ constructor(method, statusCode, body) {
128
+ super(`RPC request failed.\n` +
129
+ ` Method: ${method}\n` +
130
+ ` Status: ${statusCode}\n` +
131
+ ` Body: ${body.slice(0, 300)}\n` +
132
+ ` If you're seeing 403, check your endpoint URL and token.`, 'RPC_ERROR', { method, statusCode, body });
133
+ this.statusCode = statusCode;
134
+ this.name = 'RPCError';
135
+ Object.setPrototypeOf(this, new.target.prototype);
136
+ }
137
+ }
138
+ exports.RPCError = RPCError;
139
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/types/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,211 @@
1
+ export interface QNConfig {
2
+ endpointUrl: string;
3
+ addOns?: {
4
+ priorityFees?: boolean;
5
+ liljit?: boolean;
6
+ das?: boolean;
7
+ metis?: boolean;
8
+ yellowstone?: boolean;
9
+ };
10
+ commitment?: 'processed' | 'confirmed' | 'finalized';
11
+ timeout?: number;
12
+ }
13
+ export type FeeLevel = 'extreme' | 'high' | 'recommended' | 'medium' | 'low';
14
+ export interface PriorityFeeOptions {
15
+ account?: string;
16
+ lastNBlocks?: number;
17
+ }
18
+ export interface PriorityFees {
19
+ recommended: number;
20
+ high: number;
21
+ extreme: number;
22
+ medium: number;
23
+ low: number;
24
+ networkCongestion: number;
25
+ }
26
+ export interface SendSmartTxOptions {
27
+ feeLevel?: FeeLevel;
28
+ useJito?: boolean;
29
+ maxRetries?: number;
30
+ simulateFirst?: boolean;
31
+ computeUnitBuffer?: number;
32
+ skipPreflight?: boolean;
33
+ }
34
+ export interface SmartTxResult {
35
+ signature: string;
36
+ slot: number;
37
+ priorityFeeMicroLamports: number;
38
+ computeUnitsUsed: number;
39
+ jitoBundle: boolean;
40
+ confirmationMs: number;
41
+ }
42
+ export interface GetAssetsByOwnerOptions {
43
+ ownerAddress: string;
44
+ limit?: number;
45
+ page?: number;
46
+ sortBy?: 'created' | 'updated' | 'recent_action';
47
+ sortDirection?: 'asc' | 'desc';
48
+ }
49
+ export interface GetAssetsByCollectionOptions {
50
+ collectionMint: string;
51
+ limit?: number;
52
+ page?: number;
53
+ }
54
+ export interface SearchAssetsOptions {
55
+ ownerAddress?: string;
56
+ creatorAddress?: string;
57
+ collection?: string;
58
+ tokenType?: 'fungible' | 'nonFungible' | 'regularNFT' | 'compressedNFT' | 'all';
59
+ compressed?: boolean;
60
+ limit?: number;
61
+ page?: number;
62
+ }
63
+ export interface DigitalAsset {
64
+ id: string;
65
+ interface: string;
66
+ content: {
67
+ json_uri: string;
68
+ metadata: {
69
+ name: string;
70
+ symbol: string;
71
+ description?: string;
72
+ image?: string;
73
+ attributes?: Array<{
74
+ trait_type: string;
75
+ value: string | number;
76
+ }>;
77
+ };
78
+ };
79
+ ownership: {
80
+ owner: string;
81
+ frozen: boolean;
82
+ delegated: boolean;
83
+ delegate?: string;
84
+ };
85
+ compression?: {
86
+ compressed: boolean;
87
+ tree: string;
88
+ leaf_id: number;
89
+ seq: number;
90
+ data_hash: string;
91
+ creator_hash: string;
92
+ asset_hash: string;
93
+ };
94
+ royalty?: {
95
+ basis_points: number;
96
+ percent: number;
97
+ primary_sale_happened: boolean;
98
+ };
99
+ creators?: Array<{
100
+ address: string;
101
+ share: number;
102
+ verified: boolean;
103
+ }>;
104
+ grouping?: Array<{
105
+ group_key: string;
106
+ group_value: string;
107
+ }>;
108
+ mutable: boolean;
109
+ burnt: boolean;
110
+ }
111
+ export interface AssetsResult {
112
+ total: number;
113
+ limit: number;
114
+ page: number;
115
+ items: DigitalAsset[];
116
+ }
117
+ export interface AssetProof {
118
+ root: string;
119
+ proof: string[];
120
+ node_index: number;
121
+ leaf: string;
122
+ tree_id: string;
123
+ }
124
+ export interface TokenAccount {
125
+ mint: string;
126
+ tokenAccount: string;
127
+ balance: number;
128
+ decimals: number;
129
+ uiAmount: number;
130
+ }
131
+ export type StreamBackend = 'yellowstone' | 'websocket' | 'auto';
132
+ export interface WatchOptions {
133
+ backend?: StreamBackend;
134
+ commitment?: 'processed' | 'confirmed' | 'finalized';
135
+ autoReconnect?: boolean;
136
+ maxReconnectAttempts?: number;
137
+ }
138
+ export interface AccountUpdate {
139
+ pubkey: string;
140
+ lamports: number;
141
+ owner: string;
142
+ executable: boolean;
143
+ data: Buffer;
144
+ slot: number;
145
+ timestamp: number;
146
+ backend: 'yellowstone' | 'websocket';
147
+ }
148
+ export interface ProgramTx {
149
+ signature: string;
150
+ slot: number;
151
+ blockTime: number;
152
+ logs: string[];
153
+ err: object | null;
154
+ }
155
+ export interface WatchHandle {
156
+ unsubscribe: () => void;
157
+ isConnected: () => boolean;
158
+ }
159
+ export interface SwapQuoteOptions {
160
+ inputMint: string;
161
+ outputMint: string;
162
+ amount: bigint;
163
+ slippageBps?: number;
164
+ }
165
+ export interface SwapOptions extends SwapQuoteOptions {
166
+ userPublicKey: string;
167
+ feeLevel?: FeeLevel;
168
+ useJitoTip?: boolean;
169
+ }
170
+ export interface SwapQuote {
171
+ inputMint: string;
172
+ outputMint: string;
173
+ inAmount: string;
174
+ outAmount: string;
175
+ priceImpactPct: string;
176
+ slippageBps: number;
177
+ routePlan: Array<{
178
+ swapInfo: {
179
+ label: string;
180
+ inputMint: string;
181
+ outAmount: string;
182
+ };
183
+ percent: number;
184
+ }>;
185
+ }
186
+ export interface SwapResult {
187
+ signature: string;
188
+ inputAmount: bigint;
189
+ outputAmount: bigint;
190
+ priceImpactPct: number;
191
+ confirmationMs: number;
192
+ }
193
+ export interface AddOnStatus {
194
+ name: string;
195
+ enabled: boolean;
196
+ tier: 'free' | 'paid';
197
+ description: string;
198
+ enableUrl: string;
199
+ }
200
+ export interface AddOnCheckResult {
201
+ endpoint: string;
202
+ addOns: AddOnStatus[];
203
+ canUse: {
204
+ smartTransactions: boolean;
205
+ nftQueries: boolean;
206
+ swaps: boolean;
207
+ yellowstoneStream: boolean;
208
+ jitoBundle: boolean;
209
+ };
210
+ }
211
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ // ─────────────────────────────────────────────────────────────
3
+ // SDK Config
4
+ // ─────────────────────────────────────────────────────────────
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,aAAa;AACb,gEAAgE"}
@@ -0,0 +1,25 @@
1
+ import type { QNConfig } from '../types';
2
+ type AddOnKey = keyof NonNullable<QNConfig['addOns']>;
3
+ interface AddOnMeta {
4
+ tier: 'free' | 'paid';
5
+ displayName: string;
6
+ description: string;
7
+ }
8
+ declare const ADD_ON_META: Record<AddOnKey, AddOnMeta>;
9
+ /**
10
+ * Checks whether a required add-on is enabled in the config.
11
+ *
12
+ * - If explicitly set to true → passes silently
13
+ * - If explicitly set to false → throws AddOnNotEnabledError
14
+ * - If not set (undefined) → logs a warning but does NOT throw
15
+ * (we give the benefit of the doubt if the dev hasn't configured addOns yet)
16
+ */
17
+ export declare function requireAddOn(config: QNConfig, key: AddOnKey): void;
18
+ /**
19
+ * Soft check — returns false instead of throwing.
20
+ * Use this for features that degrade gracefully (e.g. fallback from
21
+ * Yellowstone gRPC → WebSocket when yellowstone isn't enabled).
22
+ */
23
+ export declare function isAddOnEnabled(config: QNConfig, key: AddOnKey): boolean;
24
+ export { ADD_ON_META };
25
+ //# sourceMappingURL=addon-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addon-guard.d.ts","sourceRoot":"","sources":["../../src/utils/addon-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGzC,KAAK,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AAEtD,UAAU,SAAS;IACjB,IAAI,EAAS,MAAM,GAAG,MAAM,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,QAAA,MAAM,WAAW,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,CA0B5C,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,CAmBlE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAEvE;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ADD_ON_META = void 0;
4
+ exports.requireAddOn = requireAddOn;
5
+ exports.isAddOnEnabled = isAddOnEnabled;
6
+ const errors_1 = require("../types/errors");
7
+ const ADD_ON_META = {
8
+ priorityFees: {
9
+ tier: 'free',
10
+ displayName: 'Priority Fee API',
11
+ description: 'Dynamic priority fee estimation for faster tx inclusion',
12
+ },
13
+ das: {
14
+ tier: 'free',
15
+ displayName: 'Metaplex DAS API',
16
+ description: 'Query NFTs, cNFTs, and token metadata',
17
+ },
18
+ liljit: {
19
+ tier: 'paid',
20
+ displayName: "Lil' JIT (Jito Bundles)",
21
+ description: 'MEV protection + atomic transaction execution via Jito',
22
+ },
23
+ metis: {
24
+ tier: 'paid',
25
+ displayName: 'Metis — Jupiter V6 Swap API',
26
+ description: 'Best-price token swaps via Jupiter aggregator',
27
+ },
28
+ yellowstone: {
29
+ tier: 'paid',
30
+ displayName: 'Yellowstone gRPC',
31
+ description: 'Ultra-low-latency real-time account and program streaming',
32
+ },
33
+ };
34
+ exports.ADD_ON_META = ADD_ON_META;
35
+ /**
36
+ * Checks whether a required add-on is enabled in the config.
37
+ *
38
+ * - If explicitly set to true → passes silently
39
+ * - If explicitly set to false → throws AddOnNotEnabledError
40
+ * - If not set (undefined) → logs a warning but does NOT throw
41
+ * (we give the benefit of the doubt if the dev hasn't configured addOns yet)
42
+ */
43
+ function requireAddOn(config, key) {
44
+ const meta = ADD_ON_META[key];
45
+ const status = config.addOns?.[key];
46
+ if (status === false) {
47
+ throw new errors_1.AddOnNotEnabledError(meta.displayName, meta.tier);
48
+ }
49
+ if (status === undefined) {
50
+ // Warn but don't crash — let the RPC call proceed and fail naturally
51
+ // with a helpful error if the add-on really isn't there
52
+ console.warn(`[QNSolanaKit] ⚠ addOns.${key} is not set in your config.\n` +
53
+ ` If you get errors, enable "${meta.displayName}" in your QuickNode dashboard\n` +
54
+ ` and set addOns: { ${key}: true } in your QNSolanaKit config.\n` +
55
+ ` Tier: ${meta.tier.toUpperCase()} — ${meta.description}`);
56
+ }
57
+ // status === true → all good, proceed
58
+ }
59
+ /**
60
+ * Soft check — returns false instead of throwing.
61
+ * Use this for features that degrade gracefully (e.g. fallback from
62
+ * Yellowstone gRPC → WebSocket when yellowstone isn't enabled).
63
+ */
64
+ function isAddOnEnabled(config, key) {
65
+ return config.addOns?.[key] === true;
66
+ }
67
+ //# sourceMappingURL=addon-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addon-guard.js","sourceRoot":"","sources":["../../src/utils/addon-guard.ts"],"names":[],"mappings":";;;AA+CA,oCAmBC;AAOD,wCAEC;AA1ED,4CAAuD;AAUvD,MAAM,WAAW,GAAgC;IAC/C,YAAY,EAAE;QACZ,IAAI,EAAS,MAAM;QACnB,WAAW,EAAE,kBAAkB;QAC/B,WAAW,EAAE,yDAAyD;KACvE;IACD,GAAG,EAAE;QACH,IAAI,EAAS,MAAM;QACnB,WAAW,EAAE,kBAAkB;QAC/B,WAAW,EAAE,uCAAuC;KACrD;IACD,MAAM,EAAE;QACN,IAAI,EAAS,MAAM;QACnB,WAAW,EAAE,yBAAyB;QACtC,WAAW,EAAE,wDAAwD;KACtE;IACD,KAAK,EAAE;QACL,IAAI,EAAS,MAAM;QACnB,WAAW,EAAE,6BAA6B;QAC1C,WAAW,EAAE,+CAA+C;KAC7D;IACD,WAAW,EAAE;QACX,IAAI,EAAS,MAAM;QACnB,WAAW,EAAE,kBAAkB;QAC/B,WAAW,EAAE,2DAA2D;KACzE;CACF,CAAC;AAwCO,kCAAW;AAtCpB;;;;;;;GAOG;AACH,SAAgB,YAAY,CAAC,MAAgB,EAAE,GAAa;IAC1D,MAAM,IAAI,GAAK,WAAW,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IAEpC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,MAAM,IAAI,6BAAoB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,qEAAqE;QACrE,wDAAwD;QACxD,OAAO,CAAC,IAAI,CACV,2BAA2B,GAAG,+BAA+B;YAC7D,gCAAgC,IAAI,CAAC,WAAW,iCAAiC;YACjF,uBAAuB,GAAG,wCAAwC;YAClE,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC,WAAW,EAAE,CAC3D,CAAC;IACJ,CAAC;IACD,sCAAsC;AACxC,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAAC,MAAgB,EAAE,GAAa;IAC5D,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;AACvC,CAAC"}