@solana/rpc-transformers 2.0.0-20241006045741

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 (37) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +152 -0
  3. package/dist/index.browser.cjs +368 -0
  4. package/dist/index.browser.cjs.map +1 -0
  5. package/dist/index.browser.mjs +345 -0
  6. package/dist/index.browser.mjs.map +1 -0
  7. package/dist/index.native.mjs +345 -0
  8. package/dist/index.native.mjs.map +1 -0
  9. package/dist/index.node.cjs +368 -0
  10. package/dist/index.node.cjs.map +1 -0
  11. package/dist/index.node.mjs +345 -0
  12. package/dist/index.node.mjs.map +1 -0
  13. package/dist/types/index.d.ts +12 -0
  14. package/dist/types/index.d.ts.map +1 -0
  15. package/dist/types/request-transformer-bigint-downcast.d.ts +4 -0
  16. package/dist/types/request-transformer-bigint-downcast.d.ts.map +1 -0
  17. package/dist/types/request-transformer-default-commitment.d.ts +13 -0
  18. package/dist/types/request-transformer-default-commitment.d.ts.map +1 -0
  19. package/dist/types/request-transformer-integer-overflow.d.ts +6 -0
  20. package/dist/types/request-transformer-integer-overflow.d.ts.map +1 -0
  21. package/dist/types/request-transformer-options-object-position-config.d.ts +2 -0
  22. package/dist/types/request-transformer-options-object-position-config.d.ts.map +1 -0
  23. package/dist/types/request-transformer.d.ts +9 -0
  24. package/dist/types/request-transformer.d.ts.map +1 -0
  25. package/dist/types/response-transformer-allowed-numeric-values.d.ts +7 -0
  26. package/dist/types/response-transformer-allowed-numeric-values.d.ts.map +1 -0
  27. package/dist/types/response-transformer-bigint-upcast.d.ts +4 -0
  28. package/dist/types/response-transformer-bigint-upcast.d.ts.map +1 -0
  29. package/dist/types/response-transformer-result.d.ts +3 -0
  30. package/dist/types/response-transformer-result.d.ts.map +1 -0
  31. package/dist/types/response-transformer-throw-solana-error.d.ts +3 -0
  32. package/dist/types/response-transformer-throw-solana-error.d.ts.map +1 -0
  33. package/dist/types/response-transformer.d.ts +8 -0
  34. package/dist/types/response-transformer.d.ts.map +1 -0
  35. package/dist/types/tree-traversal.d.ts +15 -0
  36. package/dist/types/tree-traversal.d.ts.map +1 -0
  37. package/package.json +90 -0
package/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2023 Solana Labs, Inc
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,152 @@
1
+ [![npm][npm-image]][npm-url]
2
+ [![npm-downloads][npm-downloads-image]][npm-url]
3
+ [![semantic-release][semantic-release-image]][semantic-release-url]
4
+ <br />
5
+ [![code-style-prettier][code-style-prettier-image]][code-style-prettier-url]
6
+
7
+ [code-style-prettier-image]: https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square
8
+ [code-style-prettier-url]: https://github.com/prettier/prettier
9
+ [npm-downloads-image]: https://img.shields.io/npm/dm/@solana/rpc-transformers/rc.svg?style=flat
10
+ [npm-image]: https://img.shields.io/npm/v/@solana/rpc-transformers/rc.svg?style=flat
11
+ [npm-url]: https://www.npmjs.com/package/@solana/rpc-transformers/v/rc
12
+ [semantic-release-image]: https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
13
+ [semantic-release-url]: https://github.com/semantic-release/semantic-release
14
+
15
+ # @solana/rpc-transformers
16
+
17
+ ## Request Transformers
18
+
19
+ ### `getDefaultRequestTransformerForSolanaRpc(config)`
20
+
21
+ Returns the default request transformer for the Solana RPC API. Under the hood, this function composes multiple `RpcRequestTransformers` together such as the `getDefaultCommitmentTransformer`, the `getIntegerOverflowRequestTransformer` and the `getBigIntDowncastRequestTransformer`.
22
+
23
+ ```ts
24
+ import { getDefaultRequestTransformerForSolanaRpc } from '@solana/rpc-transformers';
25
+
26
+ const requestTransformer = getDefaultRequestTransformerForSolanaRpc({
27
+ defaultCommitment: 'confirmed',
28
+ onIntegerOverflow: (request, keyPath, value) => {
29
+ throw new Error(`Integer overflow at ${keyPath.join('.')}: ${value}`);
30
+ },
31
+ });
32
+ ```
33
+
34
+ ### `getDefaultCommitmentTransformer(config)`
35
+
36
+ Creates a transformer that adds the provided default commitment to the configuration object of the request when applicable.
37
+
38
+ ```ts
39
+ import { getDefaultCommitmentTransformer, OPTIONS_OBJECT_POSITION_BY_METHOD } from '@solana/rpc-transformers';
40
+
41
+ const requestTransformer = getDefaultCommitmentTransformer({
42
+ defaultCommitment: 'confirmed',
43
+ optionsObjectPositionByMethod: OPTIONS_OBJECT_POSITION_BY_METHOD,
44
+ });
45
+ ```
46
+
47
+ ### `getIntegerOverflowRequestTransformer(handler)`
48
+
49
+ Creates a transformer that traverses the request parameters and executes the provided handler when an integer overflow is detected.
50
+
51
+ ```ts
52
+ import { getIntegerOverflowRequestTransformer } from '@solana/rpc-transformers';
53
+
54
+ const requestTransformer = getIntegerOverflowRequestTransformer((request, keyPath, value) => {
55
+ throw new Error(`Integer overflow at ${keyPath.join('.')}: ${value}`);
56
+ });
57
+ ```
58
+
59
+ ### `getBigIntDowncastRequestTransformer()`
60
+
61
+ Creates a transformer that downcasts all `BigInt` values to `Number`.
62
+
63
+ ```ts
64
+ import { getBigIntDowncastRequestTransformer } from '@solana/rpc-transformers';
65
+
66
+ const requestTransformer = getBigIntDowncastRequestTransformer();
67
+ ```
68
+
69
+ ### `getTreeWalkerRequestTransformer(visitors, initialState)`
70
+
71
+ Creates a transformer that traverses the request parameters and executes the provided visitors at each node. A custom initial state can be provided but must at least provide `{ keyPath: [] }`.
72
+
73
+ ```ts
74
+ import { getTreeWalkerRequestTransformer } from '@solana/rpc-transformers';
75
+
76
+ const requestTransformer = getTreeWalkerRequestTransformer(
77
+ [
78
+ // Replaces foo.bar with "baz".
79
+ (node, state) => (state.keyPath === ['foo', 'bar'] ? 'baz' : node),
80
+ // Increments all numbers by 1.
81
+ node => (typeof node === number ? node + 1 : node),
82
+ ],
83
+ { keyPath: [] },
84
+ );
85
+ ```
86
+
87
+ ## Response Transformers
88
+
89
+ ### `getDefaultResponseTransformerForSolanaRpc(config)`
90
+
91
+ Returns the default response transformer for the Solana RPC API. Under the hood, this function composes multiple `RpcResponseTransformers` together such as the `getThrowSolanaErrorResponseTransformer`, the `getResultResponseTransformer` and the `getBigIntUpcastResponseTransformer`.
92
+
93
+ ```ts
94
+ import { getDefaultResponseTransformerForSolanaRpc } from '@solana/rpc-transformers';
95
+
96
+ const responseTransformer = getDefaultResponseTransformerForSolanaRpc({
97
+ allowedNumericKeyPaths: getAllowedNumericKeypaths(),
98
+ });
99
+ ```
100
+
101
+ ### `getThrowSolanaErrorResponseTransformer()`
102
+
103
+ Returns a transformer that throws a `SolanaError` with the appropriate RPC error code if the body of the RPC response contains an error.
104
+
105
+ ```ts
106
+ import { getThrowSolanaErrorResponseTransformer } from '@solana/rpc-transformers';
107
+
108
+ const responseTransformer = getThrowSolanaErrorResponseTransformer();
109
+ ```
110
+
111
+ ### `getResultResponseTransformer()`
112
+
113
+ Returns a transformer that extracts the `result` field from the body of the RPC response. For instance, we go from `{ jsonrpc: '2.0', result: 'foo', id: 1 }` to `'foo'`.
114
+
115
+ ```ts
116
+ import { getResultResponseTransformer } from '@solana/rpc-transformers';
117
+
118
+ const responseTransformer = getResultResponseTransformer();
119
+ ```
120
+
121
+ ### `getBigIntUpcastResponseTransformer(allowedNumericKeyPaths)`
122
+
123
+ Returns a transformer that upcasts all `Number` values to `BigInts` unless they match within the provided `KeyPaths`. In other words, the provided `KeyPaths` will remain as `Number` values, any other numeric value will be upcasted to a `BigInt`. Note that you can use `KEYPATH_WILDCARD` to match any key within a `KeyPath`.
124
+
125
+ ```ts
126
+ import { getBigIntUpcastResponseTransformer } from '@solana/rpc-transformers';
127
+
128
+ const responseTransformer = getBigIntUpcastResponseTransformer([
129
+ ['index'],
130
+ ['instructions', KEYPATH_WILDCARD, 'accounts', KEYPATH_WILDCARD],
131
+ ['instructions', KEYPATH_WILDCARD, 'programIdIndex'],
132
+ ['instructions', KEYPATH_WILDCARD, 'stackHeight'],
133
+ ]);
134
+ ```
135
+
136
+ ### `getTreeWalkerResponseTransformer(visitors, initialState)`
137
+
138
+ Creates a transformer that traverses the json response and executes the provided visitors at each node. A custom initial state can be provided but must at least provide `{ keyPath: [] }`.
139
+
140
+ ```ts
141
+ import { getTreeWalkerResponseTransformer } from '@solana/rpc-transformers';
142
+
143
+ const responseTransformer = getTreeWalkerResponseTransformer(
144
+ [
145
+ // Replaces foo.bar with "baz".
146
+ (node, state) => (state.keyPath === ['foo', 'bar'] ? 'baz' : node),
147
+ // Increments all numbers by 1.
148
+ node => (typeof node === number ? node + 1 : node),
149
+ ],
150
+ { keyPath: [] },
151
+ );
152
+ ```
@@ -0,0 +1,368 @@
1
+ 'use strict';
2
+
3
+ var functional = require('@solana/functional');
4
+ var errors = require('@solana/errors');
5
+
6
+ // src/request-transformer.ts
7
+
8
+ // src/tree-traversal.ts
9
+ var KEYPATH_WILDCARD = {};
10
+ function getTreeWalker(visitors) {
11
+ return function traverse(node, state) {
12
+ if (Array.isArray(node)) {
13
+ return node.map((element, ii) => {
14
+ const nextState = {
15
+ ...state,
16
+ keyPath: [...state.keyPath, ii]
17
+ };
18
+ return traverse(element, nextState);
19
+ });
20
+ } else if (typeof node === "object" && node !== null) {
21
+ const out = {};
22
+ for (const propName in node) {
23
+ if (!Object.prototype.hasOwnProperty.call(node, propName)) {
24
+ continue;
25
+ }
26
+ const nextState = {
27
+ ...state,
28
+ keyPath: [...state.keyPath, propName]
29
+ };
30
+ out[propName] = traverse(node[propName], nextState);
31
+ }
32
+ return out;
33
+ } else {
34
+ return visitors.reduce((acc, visitNode) => visitNode(acc, state), node);
35
+ }
36
+ };
37
+ }
38
+ function getTreeWalkerRequestTransformer(visitors, initialState) {
39
+ return (request) => {
40
+ const traverse = getTreeWalker(visitors);
41
+ return Object.freeze({
42
+ ...request,
43
+ params: traverse(request.params, initialState)
44
+ });
45
+ };
46
+ }
47
+ function getTreeWalkerResponseTransformer(visitors, initialState) {
48
+ return (json) => getTreeWalker(visitors)(json, initialState);
49
+ }
50
+
51
+ // src/request-transformer-bigint-downcast.ts
52
+ function getBigIntDowncastRequestTransformer() {
53
+ return getTreeWalkerRequestTransformer([downcastNodeToNumberIfBigint], { keyPath: [] });
54
+ }
55
+ function downcastNodeToNumberIfBigint(value) {
56
+ return typeof value === "bigint" ? (
57
+ // FIXME(solana-labs/solana/issues/30341) Create a data type to represent u64 in the Solana
58
+ // JSON RPC implementation so that we can throw away this entire patcher instead of unsafely
59
+ // downcasting `bigints` to `numbers`.
60
+ Number(value)
61
+ ) : value;
62
+ }
63
+
64
+ // src/request-transformer-default-commitment.ts
65
+ function getDefaultCommitmentRequestTransformer({
66
+ defaultCommitment,
67
+ optionsObjectPositionByMethod
68
+ }) {
69
+ return (request) => {
70
+ const { params, methodName } = request;
71
+ if (!Array.isArray(params)) {
72
+ return request;
73
+ }
74
+ const optionsObjectPositionInParams = optionsObjectPositionByMethod[methodName];
75
+ if (optionsObjectPositionInParams == null) {
76
+ return request;
77
+ }
78
+ return Object.freeze({
79
+ methodName,
80
+ params: applyDefaultCommitment({
81
+ commitmentPropertyName: methodName === "sendTransaction" ? "preflightCommitment" : "commitment",
82
+ optionsObjectPositionInParams,
83
+ overrideCommitment: defaultCommitment,
84
+ params
85
+ })
86
+ });
87
+ };
88
+ }
89
+ function applyDefaultCommitment({
90
+ commitmentPropertyName,
91
+ params,
92
+ optionsObjectPositionInParams,
93
+ overrideCommitment
94
+ }) {
95
+ const paramInTargetPosition = params[optionsObjectPositionInParams];
96
+ if (
97
+ // There's no config.
98
+ paramInTargetPosition === void 0 || // There is a config object.
99
+ paramInTargetPosition && typeof paramInTargetPosition === "object" && !Array.isArray(paramInTargetPosition)
100
+ ) {
101
+ if (
102
+ // The config object already has a commitment set.
103
+ paramInTargetPosition && commitmentPropertyName in paramInTargetPosition
104
+ ) {
105
+ if (!paramInTargetPosition[commitmentPropertyName] || paramInTargetPosition[commitmentPropertyName] === "finalized") {
106
+ const nextParams = [...params];
107
+ const {
108
+ [commitmentPropertyName]: _,
109
+ // eslint-disable-line @typescript-eslint/no-unused-vars
110
+ ...rest
111
+ } = paramInTargetPosition;
112
+ if (Object.keys(rest).length > 0) {
113
+ nextParams[optionsObjectPositionInParams] = rest;
114
+ } else {
115
+ if (optionsObjectPositionInParams === nextParams.length - 1) {
116
+ nextParams.length--;
117
+ } else {
118
+ nextParams[optionsObjectPositionInParams] = void 0;
119
+ }
120
+ }
121
+ return nextParams;
122
+ }
123
+ } else if (overrideCommitment !== "finalized") {
124
+ const nextParams = [...params];
125
+ nextParams[optionsObjectPositionInParams] = {
126
+ ...paramInTargetPosition,
127
+ [commitmentPropertyName]: overrideCommitment
128
+ };
129
+ return nextParams;
130
+ }
131
+ }
132
+ return params;
133
+ }
134
+
135
+ // src/request-transformer-integer-overflow.ts
136
+ function getIntegerOverflowRequestTransformer(onIntegerOverflow) {
137
+ return (request) => {
138
+ const transformer = getTreeWalkerRequestTransformer(
139
+ [getIntegerOverflowNodeVisitor((...args) => onIntegerOverflow(request, ...args))],
140
+ { keyPath: [] }
141
+ );
142
+ return transformer(request);
143
+ };
144
+ }
145
+ function getIntegerOverflowNodeVisitor(onIntegerOverflow) {
146
+ return (value, { keyPath }) => {
147
+ if (typeof value === "bigint") {
148
+ if (onIntegerOverflow && (value > Number.MAX_SAFE_INTEGER || value < -Number.MAX_SAFE_INTEGER)) {
149
+ onIntegerOverflow(keyPath, value);
150
+ }
151
+ }
152
+ return value;
153
+ };
154
+ }
155
+
156
+ // src/request-transformer-options-object-position-config.ts
157
+ var OPTIONS_OBJECT_POSITION_BY_METHOD = {
158
+ accountNotifications: 1,
159
+ blockNotifications: 1,
160
+ getAccountInfo: 1,
161
+ getBalance: 1,
162
+ getBlock: 1,
163
+ getBlockHeight: 0,
164
+ getBlockProduction: 0,
165
+ getBlocks: 2,
166
+ getBlocksWithLimit: 2,
167
+ getConfirmedBlock: 1,
168
+ getConfirmedBlocks: 1,
169
+ getConfirmedBlocksWithLimit: 2,
170
+ getConfirmedSignaturesForAddress2: 1,
171
+ getConfirmedTransaction: 1,
172
+ getEpochInfo: 0,
173
+ getFeeCalculatorForBlockhash: 1,
174
+ getFeeForMessage: 1,
175
+ getFees: 1,
176
+ getInflationGovernor: 0,
177
+ getInflationReward: 1,
178
+ getLargestAccounts: 0,
179
+ getLatestBlockhash: 0,
180
+ getLeaderSchedule: 1,
181
+ getMinimumBalanceForRentExemption: 1,
182
+ getMultipleAccounts: 1,
183
+ getProgramAccounts: 1,
184
+ getRecentBlockhash: 1,
185
+ getSignaturesForAddress: 1,
186
+ getSlot: 0,
187
+ getSlotLeader: 0,
188
+ getStakeActivation: 1,
189
+ getStakeMinimumDelegation: 0,
190
+ getSupply: 0,
191
+ getTokenAccountBalance: 1,
192
+ getTokenAccountsByDelegate: 2,
193
+ getTokenAccountsByOwner: 2,
194
+ getTokenLargestAccounts: 1,
195
+ getTokenSupply: 1,
196
+ getTransaction: 1,
197
+ getTransactionCount: 0,
198
+ getVoteAccounts: 0,
199
+ isBlockhashValid: 1,
200
+ logsNotifications: 1,
201
+ programNotifications: 1,
202
+ requestAirdrop: 2,
203
+ sendTransaction: 1,
204
+ signatureNotifications: 1,
205
+ simulateTransaction: 1
206
+ };
207
+
208
+ // src/request-transformer.ts
209
+ function getDefaultRequestTransformerForSolanaRpc(config) {
210
+ const handleIntegerOverflow = config?.onIntegerOverflow;
211
+ return (request) => {
212
+ return functional.pipe(
213
+ request,
214
+ handleIntegerOverflow ? getIntegerOverflowRequestTransformer(handleIntegerOverflow) : (r) => r,
215
+ getBigIntDowncastRequestTransformer(),
216
+ getDefaultCommitmentRequestTransformer({
217
+ defaultCommitment: config?.defaultCommitment,
218
+ optionsObjectPositionByMethod: OPTIONS_OBJECT_POSITION_BY_METHOD
219
+ })
220
+ );
221
+ };
222
+ }
223
+
224
+ // src/response-transformer-bigint-upcast.ts
225
+ function getBigIntUpcastResponseTransformer(allowedNumericKeyPaths) {
226
+ return getTreeWalkerResponseTransformer([getBigIntUpcastVisitor(allowedNumericKeyPaths)], { keyPath: [] });
227
+ }
228
+ function getBigIntUpcastVisitor(allowedNumericKeyPaths) {
229
+ return function upcastNodeToBigIntIfNumber(value, { keyPath }) {
230
+ const isInteger = typeof value === "number" && Number.isInteger(value) || typeof value === "bigint";
231
+ if (!isInteger) return value;
232
+ if (keyPathIsAllowedToBeNumeric(keyPath, allowedNumericKeyPaths)) {
233
+ return Number(value);
234
+ } else {
235
+ return BigInt(value);
236
+ }
237
+ };
238
+ }
239
+ function keyPathIsAllowedToBeNumeric(keyPath, allowedNumericKeyPaths) {
240
+ return allowedNumericKeyPaths.some((prohibitedKeyPath) => {
241
+ if (prohibitedKeyPath.length !== keyPath.length) {
242
+ return false;
243
+ }
244
+ for (let ii = keyPath.length - 1; ii >= 0; ii--) {
245
+ const keyPathPart = keyPath[ii];
246
+ const prohibitedKeyPathPart = prohibitedKeyPath[ii];
247
+ if (prohibitedKeyPathPart !== keyPathPart && (prohibitedKeyPathPart !== KEYPATH_WILDCARD || typeof keyPathPart !== "number")) {
248
+ return false;
249
+ }
250
+ }
251
+ return true;
252
+ });
253
+ }
254
+
255
+ // src/response-transformer-result.ts
256
+ function getResultResponseTransformer() {
257
+ return (json) => json.result;
258
+ }
259
+ function getThrowSolanaErrorResponseTransformer() {
260
+ return (json) => {
261
+ const jsonRpcResponse = json;
262
+ if ("error" in jsonRpcResponse) {
263
+ throw errors.getSolanaErrorFromJsonRpcError(jsonRpcResponse.error);
264
+ }
265
+ return jsonRpcResponse;
266
+ };
267
+ }
268
+
269
+ // src/response-transformer.ts
270
+ function getDefaultResponseTransformerForSolanaRpc(config) {
271
+ return (response, request) => {
272
+ const methodName = request.methodName;
273
+ const keyPaths = config?.allowedNumericKeyPaths && methodName ? config.allowedNumericKeyPaths[methodName] : void 0;
274
+ return functional.pipe(
275
+ response,
276
+ (r) => getThrowSolanaErrorResponseTransformer()(r, request),
277
+ (r) => getResultResponseTransformer()(r, request),
278
+ (r) => getBigIntUpcastResponseTransformer(keyPaths ?? [])(r, request)
279
+ );
280
+ };
281
+ }
282
+ function getDefaultResponseTransformerForSolanaRpcSubscriptions(config) {
283
+ return (notification, notificationName) => {
284
+ const keyPaths = config?.allowedNumericKeyPaths && notificationName ? config.allowedNumericKeyPaths[notificationName] : void 0;
285
+ const traverse = getTreeWalker([getBigIntUpcastVisitor(keyPaths ?? [])]);
286
+ const initialState = {
287
+ keyPath: []
288
+ };
289
+ return traverse(notification, initialState);
290
+ };
291
+ }
292
+
293
+ // src/response-transformer-allowed-numeric-values.ts
294
+ var jsonParsedTokenAccountsConfigs = [
295
+ // parsed Token/Token22 token account
296
+ ["data", "parsed", "info", "tokenAmount", "decimals"],
297
+ ["data", "parsed", "info", "tokenAmount", "uiAmount"],
298
+ ["data", "parsed", "info", "rentExemptReserve", "decimals"],
299
+ ["data", "parsed", "info", "rentExemptReserve", "uiAmount"],
300
+ ["data", "parsed", "info", "delegatedAmount", "decimals"],
301
+ ["data", "parsed", "info", "delegatedAmount", "uiAmount"],
302
+ ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "olderTransferFee", "transferFeeBasisPoints"],
303
+ ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "newerTransferFee", "transferFeeBasisPoints"],
304
+ ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "preUpdateAverageRate"],
305
+ ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "currentRate"]
306
+ ];
307
+ var jsonParsedAccountsConfigs = [
308
+ ...jsonParsedTokenAccountsConfigs,
309
+ // parsed AddressTableLookup account
310
+ ["data", "parsed", "info", "lastExtendedSlotStartIndex"],
311
+ // parsed Config account
312
+ ["data", "parsed", "info", "slashPenalty"],
313
+ ["data", "parsed", "info", "warmupCooldownRate"],
314
+ // parsed Token/Token22 mint account
315
+ ["data", "parsed", "info", "decimals"],
316
+ // parsed Token/Token22 multisig account
317
+ ["data", "parsed", "info", "numRequiredSigners"],
318
+ ["data", "parsed", "info", "numValidSigners"],
319
+ // parsed Stake account
320
+ ["data", "parsed", "info", "stake", "delegation", "warmupCooldownRate"],
321
+ // parsed Sysvar rent account
322
+ ["data", "parsed", "info", "exemptionThreshold"],
323
+ ["data", "parsed", "info", "burnPercent"],
324
+ // parsed Vote account
325
+ ["data", "parsed", "info", "commission"],
326
+ ["data", "parsed", "info", "votes", KEYPATH_WILDCARD, "confirmationCount"]
327
+ ];
328
+ var innerInstructionsConfigs = [
329
+ ["index"],
330
+ ["instructions", KEYPATH_WILDCARD, "accounts", KEYPATH_WILDCARD],
331
+ ["instructions", KEYPATH_WILDCARD, "programIdIndex"],
332
+ ["instructions", KEYPATH_WILDCARD, "stackHeight"]
333
+ ];
334
+ var messageConfig = [
335
+ ["addressTableLookups", KEYPATH_WILDCARD, "writableIndexes", KEYPATH_WILDCARD],
336
+ ["addressTableLookups", KEYPATH_WILDCARD, "readonlyIndexes", KEYPATH_WILDCARD],
337
+ ["header", "numReadonlySignedAccounts"],
338
+ ["header", "numReadonlyUnsignedAccounts"],
339
+ ["header", "numRequiredSignatures"],
340
+ ["instructions", KEYPATH_WILDCARD, "accounts", KEYPATH_WILDCARD],
341
+ ["instructions", KEYPATH_WILDCARD, "programIdIndex"],
342
+ ["instructions", KEYPATH_WILDCARD, "stackHeight"]
343
+ ];
344
+
345
+ exports.KEYPATH_WILDCARD = KEYPATH_WILDCARD;
346
+ exports.OPTIONS_OBJECT_POSITION_BY_METHOD = OPTIONS_OBJECT_POSITION_BY_METHOD;
347
+ exports.applyDefaultCommitment = applyDefaultCommitment;
348
+ exports.downcastNodeToNumberIfBigint = downcastNodeToNumberIfBigint;
349
+ exports.getBigIntDowncastRequestTransformer = getBigIntDowncastRequestTransformer;
350
+ exports.getBigIntUpcastResponseTransformer = getBigIntUpcastResponseTransformer;
351
+ exports.getBigIntUpcastVisitor = getBigIntUpcastVisitor;
352
+ exports.getDefaultCommitmentRequestTransformer = getDefaultCommitmentRequestTransformer;
353
+ exports.getDefaultRequestTransformerForSolanaRpc = getDefaultRequestTransformerForSolanaRpc;
354
+ exports.getDefaultResponseTransformerForSolanaRpc = getDefaultResponseTransformerForSolanaRpc;
355
+ exports.getDefaultResponseTransformerForSolanaRpcSubscriptions = getDefaultResponseTransformerForSolanaRpcSubscriptions;
356
+ exports.getIntegerOverflowNodeVisitor = getIntegerOverflowNodeVisitor;
357
+ exports.getIntegerOverflowRequestTransformer = getIntegerOverflowRequestTransformer;
358
+ exports.getResultResponseTransformer = getResultResponseTransformer;
359
+ exports.getThrowSolanaErrorResponseTransformer = getThrowSolanaErrorResponseTransformer;
360
+ exports.getTreeWalker = getTreeWalker;
361
+ exports.getTreeWalkerRequestTransformer = getTreeWalkerRequestTransformer;
362
+ exports.getTreeWalkerResponseTransformer = getTreeWalkerResponseTransformer;
363
+ exports.innerInstructionsConfigs = innerInstructionsConfigs;
364
+ exports.jsonParsedAccountsConfigs = jsonParsedAccountsConfigs;
365
+ exports.jsonParsedTokenAccountsConfigs = jsonParsedTokenAccountsConfigs;
366
+ exports.messageConfig = messageConfig;
367
+ //# sourceMappingURL=index.browser.cjs.map
368
+ //# sourceMappingURL=index.browser.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tree-traversal.ts","../src/request-transformer-bigint-downcast.ts","../src/request-transformer-default-commitment.ts","../src/request-transformer-integer-overflow.ts","../src/request-transformer-options-object-position-config.ts","../src/request-transformer.ts","../src/response-transformer-bigint-upcast.ts","../src/response-transformer-result.ts","../src/response-transformer-throw-solana-error.ts","../src/response-transformer.ts","../src/response-transformer-allowed-numeric-values.ts"],"names":["pipe","getSolanaErrorFromJsonRpcError"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["import { RpcRequest, RpcRequestTransformer, RpcResponseTransformer } from '@solana/rpc-spec';\n\nexport type KeyPathWildcard = { readonly __brand: unique symbol };\nexport type KeyPath = ReadonlyArray<KeyPath | KeyPathWildcard | number | string>;\n\nexport const KEYPATH_WILDCARD = {} as KeyPathWildcard;\n\ntype NodeVisitor = <TState extends TraversalState>(value: unknown, state: TState) => unknown;\nexport type TraversalState = Readonly<{\n keyPath: KeyPath;\n}>;\n\nexport function getTreeWalker(visitors: NodeVisitor[]) {\n return function traverse<TState extends TraversalState>(node: unknown, state: TState): unknown {\n if (Array.isArray(node)) {\n return node.map((element, ii) => {\n const nextState = {\n ...state,\n keyPath: [...state.keyPath, ii],\n };\n return traverse(element, nextState);\n });\n } else if (typeof node === 'object' && node !== null) {\n const out: Record<number | string | symbol, unknown> = {};\n for (const propName in node) {\n if (!Object.prototype.hasOwnProperty.call(node, propName)) {\n continue;\n }\n const nextState = {\n ...state,\n keyPath: [...state.keyPath, propName],\n };\n out[propName] = traverse(node[propName as keyof typeof node], nextState);\n }\n return out;\n } else {\n return visitors.reduce((acc, visitNode) => visitNode(acc, state), node);\n }\n };\n}\n\nexport function getTreeWalkerRequestTransformer<TState extends TraversalState>(\n visitors: NodeVisitor[],\n initialState: TState,\n): RpcRequestTransformer {\n return <TParams>(request: RpcRequest<TParams>): RpcRequest => {\n const traverse = getTreeWalker(visitors);\n return Object.freeze({\n ...request,\n params: traverse(request.params, initialState),\n });\n };\n}\n\nexport function getTreeWalkerResponseTransformer<TState extends TraversalState>(\n visitors: NodeVisitor[],\n initialState: TState,\n): RpcResponseTransformer {\n return json => getTreeWalker(visitors)(json, initialState);\n}\n","import { getTreeWalkerRequestTransformer } from './tree-traversal';\n\nexport function getBigIntDowncastRequestTransformer() {\n return getTreeWalkerRequestTransformer([downcastNodeToNumberIfBigint], { keyPath: [] });\n}\n\nexport function downcastNodeToNumberIfBigint(value: bigint): number;\nexport function downcastNodeToNumberIfBigint<T>(value: T): T;\nexport function downcastNodeToNumberIfBigint(value: unknown): unknown {\n return typeof value === 'bigint'\n ? // FIXME(solana-labs/solana/issues/30341) Create a data type to represent u64 in the Solana\n // JSON RPC implementation so that we can throw away this entire patcher instead of unsafely\n // downcasting `bigints` to `numbers`.\n Number(value)\n : value;\n}\n","import type { RpcRequest, RpcRequestTransformer } from '@solana/rpc-spec';\nimport type { Commitment } from '@solana/rpc-types';\n\nexport function getDefaultCommitmentRequestTransformer({\n defaultCommitment,\n optionsObjectPositionByMethod,\n}: Readonly<{\n defaultCommitment?: Commitment;\n optionsObjectPositionByMethod: Record<string, number>;\n}>): RpcRequestTransformer {\n return <TParams>(request: RpcRequest<TParams>): RpcRequest => {\n const { params, methodName } = request;\n\n // We only apply default commitment to array parameters.\n if (!Array.isArray(params)) {\n return request;\n }\n\n // Find the position of the options object in the parameters and abort if not found.\n const optionsObjectPositionInParams = optionsObjectPositionByMethod[methodName];\n if (optionsObjectPositionInParams == null) {\n return request;\n }\n\n return Object.freeze({\n methodName,\n params: applyDefaultCommitment({\n commitmentPropertyName: methodName === 'sendTransaction' ? 'preflightCommitment' : 'commitment',\n optionsObjectPositionInParams,\n overrideCommitment: defaultCommitment,\n params,\n }),\n });\n };\n}\n\nexport function applyDefaultCommitment({\n commitmentPropertyName,\n params,\n optionsObjectPositionInParams,\n overrideCommitment,\n}: Readonly<{\n commitmentPropertyName: string;\n optionsObjectPositionInParams: number;\n overrideCommitment?: Commitment;\n params: unknown[];\n}>) {\n const paramInTargetPosition = params[optionsObjectPositionInParams];\n if (\n // There's no config.\n paramInTargetPosition === undefined ||\n // There is a config object.\n (paramInTargetPosition && typeof paramInTargetPosition === 'object' && !Array.isArray(paramInTargetPosition))\n ) {\n if (\n // The config object already has a commitment set.\n paramInTargetPosition &&\n commitmentPropertyName in paramInTargetPosition\n ) {\n if (\n !paramInTargetPosition[commitmentPropertyName as keyof typeof paramInTargetPosition] ||\n paramInTargetPosition[commitmentPropertyName as keyof typeof paramInTargetPosition] === 'finalized'\n ) {\n // Delete the commitment property; `finalized` is already the server default.\n const nextParams = [...params];\n const {\n [commitmentPropertyName as keyof typeof paramInTargetPosition]: _, // eslint-disable-line @typescript-eslint/no-unused-vars\n ...rest\n } = paramInTargetPosition;\n if (Object.keys(rest).length > 0) {\n nextParams[optionsObjectPositionInParams] = rest;\n } else {\n if (optionsObjectPositionInParams === nextParams.length - 1) {\n nextParams.length--;\n } else {\n nextParams[optionsObjectPositionInParams] = undefined;\n }\n }\n return nextParams;\n }\n } else if (overrideCommitment !== 'finalized') {\n // Apply the default commitment.\n const nextParams = [...params];\n nextParams[optionsObjectPositionInParams] = {\n ...paramInTargetPosition,\n [commitmentPropertyName]: overrideCommitment,\n };\n return nextParams;\n }\n }\n return params;\n}\n","import { RpcRequest } from '@solana/rpc-spec';\n\nimport { getTreeWalkerRequestTransformer, KeyPath, TraversalState } from './tree-traversal';\n\nexport type IntegerOverflowHandler = (request: RpcRequest, keyPath: KeyPath, value: bigint) => void;\n\nexport function getIntegerOverflowRequestTransformer(onIntegerOverflow: IntegerOverflowHandler) {\n return <TParams>(request: RpcRequest<TParams>): RpcRequest => {\n const transformer = getTreeWalkerRequestTransformer(\n [getIntegerOverflowNodeVisitor((...args) => onIntegerOverflow(request, ...args))],\n { keyPath: [] },\n );\n return transformer(request);\n };\n}\n\nexport function getIntegerOverflowNodeVisitor(onIntegerOverflow: (keyPath: KeyPath, value: bigint) => void) {\n return <T>(value: T, { keyPath }: TraversalState): T => {\n if (typeof value === 'bigint') {\n if (onIntegerOverflow && (value > Number.MAX_SAFE_INTEGER || value < -Number.MAX_SAFE_INTEGER)) {\n onIntegerOverflow(keyPath as (number | string)[], value);\n }\n }\n return value;\n };\n}\n","export const OPTIONS_OBJECT_POSITION_BY_METHOD: Record<string, number> = {\n accountNotifications: 1,\n blockNotifications: 1,\n getAccountInfo: 1,\n getBalance: 1,\n getBlock: 1,\n getBlockHeight: 0,\n getBlockProduction: 0,\n getBlocks: 2,\n getBlocksWithLimit: 2,\n getConfirmedBlock: 1,\n getConfirmedBlocks: 1,\n getConfirmedBlocksWithLimit: 2,\n getConfirmedSignaturesForAddress2: 1,\n getConfirmedTransaction: 1,\n getEpochInfo: 0,\n getFeeCalculatorForBlockhash: 1,\n getFeeForMessage: 1,\n getFees: 1,\n getInflationGovernor: 0,\n getInflationReward: 1,\n getLargestAccounts: 0,\n getLatestBlockhash: 0,\n getLeaderSchedule: 1,\n getMinimumBalanceForRentExemption: 1,\n getMultipleAccounts: 1,\n getProgramAccounts: 1,\n getRecentBlockhash: 1,\n getSignaturesForAddress: 1,\n getSlot: 0,\n getSlotLeader: 0,\n getStakeActivation: 1,\n getStakeMinimumDelegation: 0,\n getSupply: 0,\n getTokenAccountBalance: 1,\n getTokenAccountsByDelegate: 2,\n getTokenAccountsByOwner: 2,\n getTokenLargestAccounts: 1,\n getTokenSupply: 1,\n getTransaction: 1,\n getTransactionCount: 0,\n getVoteAccounts: 0,\n isBlockhashValid: 1,\n logsNotifications: 1,\n programNotifications: 1,\n requestAirdrop: 2,\n sendTransaction: 1,\n signatureNotifications: 1,\n simulateTransaction: 1,\n};\n","import { pipe } from '@solana/functional';\nimport { RpcRequest, RpcRequestTransformer } from '@solana/rpc-spec';\nimport { Commitment } from '@solana/rpc-types';\n\nimport { getBigIntDowncastRequestTransformer } from './request-transformer-bigint-downcast';\nimport { getDefaultCommitmentRequestTransformer } from './request-transformer-default-commitment';\nimport { getIntegerOverflowRequestTransformer, IntegerOverflowHandler } from './request-transformer-integer-overflow';\nimport { OPTIONS_OBJECT_POSITION_BY_METHOD } from './request-transformer-options-object-position-config';\n\nexport type RequestTransformerConfig = Readonly<{\n defaultCommitment?: Commitment;\n onIntegerOverflow?: IntegerOverflowHandler;\n}>;\n\nexport function getDefaultRequestTransformerForSolanaRpc(config?: RequestTransformerConfig): RpcRequestTransformer {\n const handleIntegerOverflow = config?.onIntegerOverflow;\n return (request: RpcRequest): RpcRequest => {\n return pipe(\n request,\n handleIntegerOverflow ? getIntegerOverflowRequestTransformer(handleIntegerOverflow) : r => r,\n getBigIntDowncastRequestTransformer(),\n getDefaultCommitmentRequestTransformer({\n defaultCommitment: config?.defaultCommitment,\n optionsObjectPositionByMethod: OPTIONS_OBJECT_POSITION_BY_METHOD,\n }),\n );\n };\n}\n","import { getTreeWalkerResponseTransformer, KeyPath, KEYPATH_WILDCARD, TraversalState } from './tree-traversal';\n\nexport function getBigIntUpcastResponseTransformer(allowedNumericKeyPaths: readonly KeyPath[]) {\n return getTreeWalkerResponseTransformer([getBigIntUpcastVisitor(allowedNumericKeyPaths)], { keyPath: [] });\n}\n\nexport function getBigIntUpcastVisitor(allowedNumericKeyPaths: readonly KeyPath[]) {\n return function upcastNodeToBigIntIfNumber(value: unknown, { keyPath }: TraversalState) {\n const isInteger = (typeof value === 'number' && Number.isInteger(value)) || typeof value === 'bigint';\n if (!isInteger) return value;\n\n // FIXME(solana-labs/solana/issues/30341) Create a data type to represent u64 in the\n // Solana JSON RPC implementation so that we can throw away this entire patcher instead\n // of unsafely upcasting `numbers` to `bigints`.\n if (keyPathIsAllowedToBeNumeric(keyPath, allowedNumericKeyPaths)) {\n return Number(value);\n } else {\n return BigInt(value);\n }\n };\n}\n\nfunction keyPathIsAllowedToBeNumeric(keyPath: KeyPath, allowedNumericKeyPaths: readonly KeyPath[]) {\n return allowedNumericKeyPaths.some(prohibitedKeyPath => {\n if (prohibitedKeyPath.length !== keyPath.length) {\n return false;\n }\n for (let ii = keyPath.length - 1; ii >= 0; ii--) {\n const keyPathPart = keyPath[ii];\n const prohibitedKeyPathPart = prohibitedKeyPath[ii];\n if (\n prohibitedKeyPathPart !== keyPathPart &&\n (prohibitedKeyPathPart !== KEYPATH_WILDCARD || typeof keyPathPart !== 'number')\n ) {\n return false;\n }\n }\n return true;\n });\n}\n","import { RpcResponseTransformer } from '@solana/rpc-spec';\n\ntype JsonRpcResponse = { result: unknown };\n\nexport function getResultResponseTransformer(): RpcResponseTransformer {\n return json => (json as JsonRpcResponse).result;\n}\n","import { getSolanaErrorFromJsonRpcError } from '@solana/errors';\nimport { RpcResponseTransformer } from '@solana/rpc-spec';\n\ntype JsonRpcResponse = { error: Parameters<typeof getSolanaErrorFromJsonRpcError>[0] } | { result: unknown };\n\nexport function getThrowSolanaErrorResponseTransformer(): RpcResponseTransformer {\n return json => {\n const jsonRpcResponse = json as JsonRpcResponse;\n if ('error' in jsonRpcResponse) {\n throw getSolanaErrorFromJsonRpcError(jsonRpcResponse.error);\n }\n return jsonRpcResponse;\n };\n}\n","import { pipe } from '@solana/functional';\nimport { RpcRequest, RpcResponse, RpcResponseTransformer } from '@solana/rpc-spec';\n\nimport { AllowedNumericKeypaths } from './response-transformer-allowed-numeric-values';\nimport { getBigIntUpcastResponseTransformer, getBigIntUpcastVisitor } from './response-transformer-bigint-upcast';\nimport { getResultResponseTransformer } from './response-transformer-result';\nimport { getThrowSolanaErrorResponseTransformer } from './response-transformer-throw-solana-error';\nimport { getTreeWalker } from './tree-traversal';\n\nexport type ResponseTransformerConfig<TApi> = Readonly<{\n allowedNumericKeyPaths?: AllowedNumericKeypaths<TApi>;\n}>;\n\nexport function getDefaultResponseTransformerForSolanaRpc<TApi>(\n config?: ResponseTransformerConfig<TApi>,\n): RpcResponseTransformer {\n return (response: RpcResponse, request: RpcRequest): RpcResponse => {\n const methodName = request.methodName as keyof TApi;\n const keyPaths =\n config?.allowedNumericKeyPaths && methodName ? config.allowedNumericKeyPaths[methodName] : undefined;\n return pipe(\n response,\n r => getThrowSolanaErrorResponseTransformer()(r, request),\n r => getResultResponseTransformer()(r, request),\n r => getBigIntUpcastResponseTransformer(keyPaths ?? [])(r, request),\n );\n };\n}\n\nexport function getDefaultResponseTransformerForSolanaRpcSubscriptions<TApi>(\n config?: ResponseTransformerConfig<TApi>,\n): <T>(notification: unknown, notificationName: string) => T {\n return <T>(notification: unknown, notificationName: string): T => {\n const keyPaths =\n config?.allowedNumericKeyPaths && notificationName\n ? config.allowedNumericKeyPaths[notificationName as keyof TApi]\n : undefined;\n const traverse = getTreeWalker([getBigIntUpcastVisitor(keyPaths ?? [])]);\n const initialState = {\n keyPath: [],\n };\n return traverse(notification, initialState) as T;\n };\n}\n","import { KeyPath, KEYPATH_WILDCARD } from './tree-traversal';\n\nexport type AllowedNumericKeypaths<TApi> = Partial<Record<keyof TApi, readonly KeyPath[]>>;\n\n// Numeric values nested in `jsonParsed` accounts\nexport const jsonParsedTokenAccountsConfigs = [\n // parsed Token/Token22 token account\n ['data', 'parsed', 'info', 'tokenAmount', 'decimals'],\n ['data', 'parsed', 'info', 'tokenAmount', 'uiAmount'],\n ['data', 'parsed', 'info', 'rentExemptReserve', 'decimals'],\n ['data', 'parsed', 'info', 'rentExemptReserve', 'uiAmount'],\n ['data', 'parsed', 'info', 'delegatedAmount', 'decimals'],\n ['data', 'parsed', 'info', 'delegatedAmount', 'uiAmount'],\n ['data', 'parsed', 'info', 'extensions', KEYPATH_WILDCARD, 'state', 'olderTransferFee', 'transferFeeBasisPoints'],\n ['data', 'parsed', 'info', 'extensions', KEYPATH_WILDCARD, 'state', 'newerTransferFee', 'transferFeeBasisPoints'],\n ['data', 'parsed', 'info', 'extensions', KEYPATH_WILDCARD, 'state', 'preUpdateAverageRate'],\n ['data', 'parsed', 'info', 'extensions', KEYPATH_WILDCARD, 'state', 'currentRate'],\n];\nexport const jsonParsedAccountsConfigs = [\n ...jsonParsedTokenAccountsConfigs,\n // parsed AddressTableLookup account\n ['data', 'parsed', 'info', 'lastExtendedSlotStartIndex'],\n // parsed Config account\n ['data', 'parsed', 'info', 'slashPenalty'],\n ['data', 'parsed', 'info', 'warmupCooldownRate'],\n // parsed Token/Token22 mint account\n ['data', 'parsed', 'info', 'decimals'],\n // parsed Token/Token22 multisig account\n ['data', 'parsed', 'info', 'numRequiredSigners'],\n ['data', 'parsed', 'info', 'numValidSigners'],\n // parsed Stake account\n ['data', 'parsed', 'info', 'stake', 'delegation', 'warmupCooldownRate'],\n // parsed Sysvar rent account\n ['data', 'parsed', 'info', 'exemptionThreshold'],\n ['data', 'parsed', 'info', 'burnPercent'],\n // parsed Vote account\n ['data', 'parsed', 'info', 'commission'],\n ['data', 'parsed', 'info', 'votes', KEYPATH_WILDCARD, 'confirmationCount'],\n];\nexport const innerInstructionsConfigs = [\n ['index'],\n ['instructions', KEYPATH_WILDCARD, 'accounts', KEYPATH_WILDCARD],\n ['instructions', KEYPATH_WILDCARD, 'programIdIndex'],\n ['instructions', KEYPATH_WILDCARD, 'stackHeight'],\n];\nexport const messageConfig = [\n ['addressTableLookups', KEYPATH_WILDCARD, 'writableIndexes', KEYPATH_WILDCARD],\n ['addressTableLookups', KEYPATH_WILDCARD, 'readonlyIndexes', KEYPATH_WILDCARD],\n ['header', 'numReadonlySignedAccounts'],\n ['header', 'numReadonlyUnsignedAccounts'],\n ['header', 'numRequiredSignatures'],\n ['instructions', KEYPATH_WILDCARD, 'accounts', KEYPATH_WILDCARD],\n ['instructions', KEYPATH_WILDCARD, 'programIdIndex'],\n ['instructions', KEYPATH_WILDCARD, 'stackHeight'],\n] as const;\n"]}