@solana/rpc-transformers 2.0.0-experimental.12ae1c6

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 (33) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +17 -0
  3. package/dist/index.browser.cjs +270 -0
  4. package/dist/index.browser.cjs.map +1 -0
  5. package/dist/index.browser.js +258 -0
  6. package/dist/index.browser.js.map +1 -0
  7. package/dist/index.native.js +258 -0
  8. package/dist/index.native.js.map +1 -0
  9. package/dist/index.node.cjs +270 -0
  10. package/dist/index.node.cjs.map +1 -0
  11. package/dist/index.node.js +258 -0
  12. package/dist/index.node.js.map +1 -0
  13. package/dist/types/default-commitment.d.ts +10 -0
  14. package/dist/types/default-commitment.d.ts.map +1 -0
  15. package/dist/types/index.d.ts +10 -0
  16. package/dist/types/index.d.ts.map +1 -0
  17. package/dist/types/params-transformer-bigint-downcast.d.ts +3 -0
  18. package/dist/types/params-transformer-bigint-downcast.d.ts.map +1 -0
  19. package/dist/types/params-transformer-integer-overflow.d.ts +5 -0
  20. package/dist/types/params-transformer-integer-overflow.d.ts.map +1 -0
  21. package/dist/types/params-transformer-options-object-position-config.d.ts +2 -0
  22. package/dist/types/params-transformer-options-object-position-config.d.ts.map +1 -0
  23. package/dist/types/params-transformer.d.ts +8 -0
  24. package/dist/types/params-transformer.d.ts.map +1 -0
  25. package/dist/types/response-transformer-allowed-numeric-values.d.ts +5 -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 +3 -0
  28. package/dist/types/response-transformer-bigint-upcast.d.ts.map +1 -0
  29. package/dist/types/response-transformer.d.ts +6 -0
  30. package/dist/types/response-transformer.d.ts.map +1 -0
  31. package/dist/types/tree-traversal.d.ts +14 -0
  32. package/dist/types/tree-traversal.d.ts.map +1 -0
  33. package/package.json +77 -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,17 @@
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/experimental.svg?style=flat
10
+ [npm-image]: https://img.shields.io/npm/v/@solana/rpc-transformers/experimental.svg?style=flat
11
+ [npm-url]: https://www.npmjs.com/package/@solana/rpc-transformers/v/experimental
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
+ TODO
@@ -0,0 +1,270 @@
1
+ 'use strict';
2
+
3
+ // src/default-commitment.ts
4
+ function applyDefaultCommitment({
5
+ commitmentPropertyName,
6
+ params,
7
+ optionsObjectPositionInParams,
8
+ overrideCommitment
9
+ }) {
10
+ const paramInTargetPosition = params[optionsObjectPositionInParams];
11
+ if (
12
+ // There's no config.
13
+ paramInTargetPosition === void 0 || // There is a config object.
14
+ paramInTargetPosition && typeof paramInTargetPosition === "object" && !Array.isArray(paramInTargetPosition)
15
+ ) {
16
+ if (
17
+ // The config object already has a commitment set.
18
+ paramInTargetPosition && commitmentPropertyName in paramInTargetPosition
19
+ ) {
20
+ if (!paramInTargetPosition[commitmentPropertyName] || paramInTargetPosition[commitmentPropertyName] === "finalized") {
21
+ const nextParams = [...params];
22
+ const {
23
+ [commitmentPropertyName]: _,
24
+ // eslint-disable-line @typescript-eslint/no-unused-vars
25
+ ...rest
26
+ } = paramInTargetPosition;
27
+ if (Object.keys(rest).length > 0) {
28
+ nextParams[optionsObjectPositionInParams] = rest;
29
+ } else {
30
+ if (optionsObjectPositionInParams === nextParams.length - 1) {
31
+ nextParams.length--;
32
+ } else {
33
+ nextParams[optionsObjectPositionInParams] = void 0;
34
+ }
35
+ }
36
+ return nextParams;
37
+ }
38
+ } else if (overrideCommitment !== "finalized") {
39
+ const nextParams = [...params];
40
+ nextParams[optionsObjectPositionInParams] = {
41
+ ...paramInTargetPosition,
42
+ [commitmentPropertyName]: overrideCommitment
43
+ };
44
+ return nextParams;
45
+ }
46
+ }
47
+ return params;
48
+ }
49
+
50
+ // src/params-transformer-bigint-downcast.ts
51
+ function downcastNodeToNumberIfBigint(value) {
52
+ return typeof value === "bigint" ? (
53
+ // FIXME(solana-labs/solana/issues/30341) Create a data type to represent u64 in the Solana
54
+ // JSON RPC implementation so that we can throw away this entire patcher instead of unsafely
55
+ // downcasting `bigints` to `numbers`.
56
+ Number(value)
57
+ ) : value;
58
+ }
59
+
60
+ // src/params-transformer-integer-overflow.ts
61
+ function getIntegerOverflowNodeVisitor(onIntegerOverflow) {
62
+ return (value, { keyPath }) => {
63
+ if (typeof value === "bigint") {
64
+ if (onIntegerOverflow && (value > Number.MAX_SAFE_INTEGER || value < -Number.MAX_SAFE_INTEGER)) {
65
+ onIntegerOverflow(keyPath, value);
66
+ }
67
+ }
68
+ return value;
69
+ };
70
+ }
71
+
72
+ // src/params-transformer-options-object-position-config.ts
73
+ var OPTIONS_OBJECT_POSITION_BY_METHOD = {
74
+ accountNotifications: 1,
75
+ blockNotifications: 1,
76
+ getAccountInfo: 1,
77
+ getBalance: 1,
78
+ getBlock: 1,
79
+ getBlockHeight: 0,
80
+ getBlockProduction: 0,
81
+ getBlocks: 2,
82
+ getBlocksWithLimit: 2,
83
+ getConfirmedBlock: 1,
84
+ getConfirmedBlocks: 1,
85
+ getConfirmedBlocksWithLimit: 2,
86
+ getConfirmedSignaturesForAddress2: 1,
87
+ getConfirmedTransaction: 1,
88
+ getEpochInfo: 0,
89
+ getFeeCalculatorForBlockhash: 1,
90
+ getFeeForMessage: 1,
91
+ getFees: 1,
92
+ getInflationGovernor: 0,
93
+ getInflationReward: 1,
94
+ getLargestAccounts: 0,
95
+ getLatestBlockhash: 0,
96
+ getLeaderSchedule: 1,
97
+ getMinimumBalanceForRentExemption: 1,
98
+ getMultipleAccounts: 1,
99
+ getProgramAccounts: 1,
100
+ getRecentBlockhash: 1,
101
+ getSignaturesForAddress: 1,
102
+ getSlot: 0,
103
+ getSlotLeader: 0,
104
+ getStakeActivation: 1,
105
+ getStakeMinimumDelegation: 0,
106
+ getSupply: 0,
107
+ getTokenAccountBalance: 1,
108
+ getTokenAccountsByDelegate: 2,
109
+ getTokenAccountsByOwner: 2,
110
+ getTokenLargestAccounts: 1,
111
+ getTokenSupply: 1,
112
+ getTransaction: 1,
113
+ getTransactionCount: 0,
114
+ getVoteAccounts: 0,
115
+ isBlockhashValid: 1,
116
+ logsNotifications: 1,
117
+ programNotifications: 1,
118
+ requestAirdrop: 2,
119
+ sendTransaction: 1,
120
+ signatureNotifications: 1,
121
+ simulateTransaction: 1
122
+ };
123
+
124
+ // src/tree-traversal.ts
125
+ var KEYPATH_WILDCARD = {};
126
+ function getTreeWalker(visitors) {
127
+ return function traverse(node, state) {
128
+ if (Array.isArray(node)) {
129
+ return node.map((element, ii) => {
130
+ const nextState = {
131
+ ...state,
132
+ keyPath: [...state.keyPath, ii]
133
+ };
134
+ return traverse(element, nextState);
135
+ });
136
+ } else if (typeof node === "object" && node !== null) {
137
+ const out = {};
138
+ for (const propName in node) {
139
+ if (!Object.prototype.hasOwnProperty.call(node, propName)) {
140
+ continue;
141
+ }
142
+ const nextState = {
143
+ ...state,
144
+ keyPath: [...state.keyPath, propName]
145
+ };
146
+ out[propName] = traverse(node[propName], nextState);
147
+ }
148
+ return out;
149
+ } else {
150
+ return visitors.reduce((acc, visitNode) => visitNode(acc, state), node);
151
+ }
152
+ };
153
+ }
154
+
155
+ // src/params-transformer.ts
156
+ function getDefaultParamsTransformerForSolanaRpc(config) {
157
+ const defaultCommitment = config?.defaultCommitment;
158
+ const handleIntegerOverflow = config?.onIntegerOverflow;
159
+ return (rawParams, methodName) => {
160
+ const traverse = getTreeWalker([
161
+ ...handleIntegerOverflow ? [getIntegerOverflowNodeVisitor((...args) => handleIntegerOverflow(methodName, ...args))] : [],
162
+ downcastNodeToNumberIfBigint
163
+ ]);
164
+ const initialState = {
165
+ keyPath: []
166
+ };
167
+ const patchedParams = traverse(rawParams, initialState);
168
+ if (!Array.isArray(patchedParams)) {
169
+ return patchedParams;
170
+ }
171
+ const optionsObjectPositionInParams = OPTIONS_OBJECT_POSITION_BY_METHOD[methodName];
172
+ if (optionsObjectPositionInParams == null) {
173
+ return patchedParams;
174
+ }
175
+ return applyDefaultCommitment({
176
+ commitmentPropertyName: methodName === "sendTransaction" ? "preflightCommitment" : "commitment",
177
+ optionsObjectPositionInParams,
178
+ overrideCommitment: defaultCommitment,
179
+ params: patchedParams
180
+ });
181
+ };
182
+ }
183
+
184
+ // src/response-transformer-bigint-upcast.ts
185
+ function keyPathIsAllowedToBeNumeric(keyPath, allowedNumericKeyPaths) {
186
+ return allowedNumericKeyPaths.some((prohibitedKeyPath) => {
187
+ if (prohibitedKeyPath.length !== keyPath.length) {
188
+ return false;
189
+ }
190
+ for (let ii = keyPath.length - 1; ii >= 0; ii--) {
191
+ const keyPathPart = keyPath[ii];
192
+ const prohibitedKeyPathPart = prohibitedKeyPath[ii];
193
+ if (prohibitedKeyPathPart !== keyPathPart && (prohibitedKeyPathPart !== KEYPATH_WILDCARD || typeof keyPathPart !== "number")) {
194
+ return false;
195
+ }
196
+ }
197
+ return true;
198
+ });
199
+ }
200
+ function getBigIntUpcastVisitor(allowedNumericKeyPaths) {
201
+ return function upcastNodeToBigIntIfNumber(value, { keyPath }) {
202
+ if (typeof value === "number" && Number.isInteger(value) && !keyPathIsAllowedToBeNumeric(keyPath, allowedNumericKeyPaths)) {
203
+ return BigInt(value);
204
+ } else {
205
+ return value;
206
+ }
207
+ };
208
+ }
209
+
210
+ // src/response-transformer.ts
211
+ function getDefaultResponseTransformerForSolanaRpc(config) {
212
+ return (rawResponse, methodName) => {
213
+ const keyPaths = config?.allowedNumericKeyPaths && methodName ? config.allowedNumericKeyPaths[methodName] : void 0;
214
+ const traverse = getTreeWalker([getBigIntUpcastVisitor(keyPaths ?? [])]);
215
+ const initialState = {
216
+ keyPath: []
217
+ };
218
+ return traverse(rawResponse, initialState);
219
+ };
220
+ }
221
+
222
+ // src/response-transformer-allowed-numeric-values.ts
223
+ var jsonParsedTokenAccountsConfigs = [
224
+ // parsed Token/Token22 token account
225
+ ["data", "parsed", "info", "tokenAmount", "decimals"],
226
+ ["data", "parsed", "info", "tokenAmount", "uiAmount"],
227
+ ["data", "parsed", "info", "rentExemptReserve", "decimals"],
228
+ ["data", "parsed", "info", "rentExemptReserve", "uiAmount"],
229
+ ["data", "parsed", "info", "delegatedAmount", "decimals"],
230
+ ["data", "parsed", "info", "delegatedAmount", "uiAmount"],
231
+ ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "olderTransferFee", "transferFeeBasisPoints"],
232
+ ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "newerTransferFee", "transferFeeBasisPoints"],
233
+ ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "preUpdateAverageRate"],
234
+ ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "currentRate"]
235
+ ];
236
+ var jsonParsedAccountsConfigs = [
237
+ ...jsonParsedTokenAccountsConfigs,
238
+ // parsed AddressTableLookup account
239
+ ["data", "parsed", "info", "lastExtendedSlotStartIndex"],
240
+ // parsed Config account
241
+ ["data", "parsed", "info", "slashPenalty"],
242
+ ["data", "parsed", "info", "warmupCooldownRate"],
243
+ // parsed Token/Token22 mint account
244
+ ["data", "parsed", "info", "decimals"],
245
+ // parsed Token/Token22 multisig account
246
+ ["data", "parsed", "info", "numRequiredSigners"],
247
+ ["data", "parsed", "info", "numValidSigners"],
248
+ // parsed Stake account
249
+ ["data", "parsed", "info", "stake", "delegation", "warmupCooldownRate"],
250
+ // parsed Sysvar rent account
251
+ ["data", "parsed", "info", "exemptionThreshold"],
252
+ ["data", "parsed", "info", "burnPercent"],
253
+ // parsed Vote account
254
+ ["data", "parsed", "info", "commission"],
255
+ ["data", "parsed", "info", "votes", KEYPATH_WILDCARD, "confirmationCount"]
256
+ ];
257
+
258
+ exports.KEYPATH_WILDCARD = KEYPATH_WILDCARD;
259
+ exports.OPTIONS_OBJECT_POSITION_BY_METHOD = OPTIONS_OBJECT_POSITION_BY_METHOD;
260
+ exports.applyDefaultCommitment = applyDefaultCommitment;
261
+ exports.downcastNodeToNumberIfBigint = downcastNodeToNumberIfBigint;
262
+ exports.getBigIntUpcastVisitor = getBigIntUpcastVisitor;
263
+ exports.getDefaultParamsTransformerForSolanaRpc = getDefaultParamsTransformerForSolanaRpc;
264
+ exports.getDefaultResponseTransformerForSolanaRpc = getDefaultResponseTransformerForSolanaRpc;
265
+ exports.getIntegerOverflowNodeVisitor = getIntegerOverflowNodeVisitor;
266
+ exports.getTreeWalker = getTreeWalker;
267
+ exports.jsonParsedAccountsConfigs = jsonParsedAccountsConfigs;
268
+ exports.jsonParsedTokenAccountsConfigs = jsonParsedTokenAccountsConfigs;
269
+ //# sourceMappingURL=out.js.map
270
+ //# sourceMappingURL=index.browser.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/default-commitment.ts","../src/params-transformer-bigint-downcast.ts","../src/params-transformer-integer-overflow.ts","../src/params-transformer-options-object-position-config.ts","../src/tree-traversal.ts","../src/params-transformer.ts","../src/response-transformer-bigint-upcast.ts","../src/response-transformer.ts","../src/response-transformer-allowed-numeric-values.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Commitment } from '@solana/rpc-types';\n\ntype Config = Readonly<{\n params: unknown[];\n commitmentPropertyName: string;\n optionsObjectPositionInParams: number;\n overrideCommitment?: Commitment;\n}>;\n\nexport function applyDefaultCommitment({\n commitmentPropertyName,\n params,\n optionsObjectPositionInParams,\n overrideCommitment,\n}: Config) {\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","export 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 { KeyPath, TraversalState } from './tree-traversal';\n\ntype IntegerOverflowHandler = (keyPath: KeyPath, value: bigint) => void;\n\nexport function getIntegerOverflowNodeVisitor(onIntegerOverflow: IntegerOverflowHandler) {\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","export type KeyPathWildcard = { readonly __brand: unique symbol };\nexport type KeyPath = ReadonlyArray<KeyPathWildcard | number | string | KeyPath>;\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<string | number | 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","import { Commitment } from '@solana/rpc-types';\n\nimport { applyDefaultCommitment } from './default-commitment';\nimport { downcastNodeToNumberIfBigint } from './params-transformer-bigint-downcast';\nimport { getIntegerOverflowNodeVisitor } from './params-transformer-integer-overflow';\nimport { OPTIONS_OBJECT_POSITION_BY_METHOD } from './params-transformer-options-object-position-config';\nimport { getTreeWalker, KeyPath } from './tree-traversal';\n\nexport type ParamsTransformerConfig = Readonly<{\n defaultCommitment?: Commitment;\n onIntegerOverflow?: (methodName: string, keyPath: KeyPath, value: bigint) => void;\n}>;\n\nexport function getDefaultParamsTransformerForSolanaRpc(config?: ParamsTransformerConfig) {\n const defaultCommitment = config?.defaultCommitment;\n const handleIntegerOverflow = config?.onIntegerOverflow;\n return <T>(rawParams: T, methodName: string) => {\n const traverse = getTreeWalker([\n ...(handleIntegerOverflow\n ? [getIntegerOverflowNodeVisitor((...args) => handleIntegerOverflow(methodName, ...args))]\n : []),\n downcastNodeToNumberIfBigint,\n ]);\n const initialState = {\n keyPath: [],\n };\n const patchedParams = traverse(rawParams, initialState);\n if (!Array.isArray(patchedParams)) {\n return patchedParams;\n }\n const optionsObjectPositionInParams = OPTIONS_OBJECT_POSITION_BY_METHOD[methodName];\n if (optionsObjectPositionInParams == null) {\n return patchedParams;\n }\n return applyDefaultCommitment({\n commitmentPropertyName: methodName === 'sendTransaction' ? 'preflightCommitment' : 'commitment',\n optionsObjectPositionInParams,\n overrideCommitment: defaultCommitment,\n params: patchedParams,\n });\n };\n}\n","import { KeyPath, KEYPATH_WILDCARD, TraversalState } from './tree-traversal';\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\nexport function getBigIntUpcastVisitor(allowedNumericKeyPaths: readonly KeyPath[]) {\n return function upcastNodeToBigIntIfNumber(value: unknown, { keyPath }: TraversalState) {\n if (\n typeof value === 'number' &&\n Number.isInteger(value) &&\n !keyPathIsAllowedToBeNumeric(keyPath, allowedNumericKeyPaths)\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 return BigInt(value);\n } else {\n return value;\n }\n };\n}\n","import { AllowedNumericKeypaths } from './response-transformer-allowed-numeric-values';\nimport { getBigIntUpcastVisitor } from './response-transformer-bigint-upcast';\nimport { getTreeWalker } from './tree-traversal';\n\nexport type ResponseTransformerConfig<TApi> = Readonly<{\n allowedNumericKeyPaths?: AllowedNumericKeypaths<TApi>;\n}>;\n\nexport function getDefaultResponseTransformerForSolanaRpc<TApi>(config?: ResponseTransformerConfig<TApi>) {\n return <T>(rawResponse: unknown, methodName?: keyof TApi): T => {\n const keyPaths =\n config?.allowedNumericKeyPaths && methodName ? config.allowedNumericKeyPaths[methodName] : undefined;\n const traverse = getTreeWalker([getBigIntUpcastVisitor(keyPaths ?? [])]);\n const initialState = {\n keyPath: [],\n };\n return traverse(rawResponse, 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];\n"]}
@@ -0,0 +1,258 @@
1
+ // src/default-commitment.ts
2
+ function applyDefaultCommitment({
3
+ commitmentPropertyName,
4
+ params,
5
+ optionsObjectPositionInParams,
6
+ overrideCommitment
7
+ }) {
8
+ const paramInTargetPosition = params[optionsObjectPositionInParams];
9
+ if (
10
+ // There's no config.
11
+ paramInTargetPosition === void 0 || // There is a config object.
12
+ paramInTargetPosition && typeof paramInTargetPosition === "object" && !Array.isArray(paramInTargetPosition)
13
+ ) {
14
+ if (
15
+ // The config object already has a commitment set.
16
+ paramInTargetPosition && commitmentPropertyName in paramInTargetPosition
17
+ ) {
18
+ if (!paramInTargetPosition[commitmentPropertyName] || paramInTargetPosition[commitmentPropertyName] === "finalized") {
19
+ const nextParams = [...params];
20
+ const {
21
+ [commitmentPropertyName]: _,
22
+ // eslint-disable-line @typescript-eslint/no-unused-vars
23
+ ...rest
24
+ } = paramInTargetPosition;
25
+ if (Object.keys(rest).length > 0) {
26
+ nextParams[optionsObjectPositionInParams] = rest;
27
+ } else {
28
+ if (optionsObjectPositionInParams === nextParams.length - 1) {
29
+ nextParams.length--;
30
+ } else {
31
+ nextParams[optionsObjectPositionInParams] = void 0;
32
+ }
33
+ }
34
+ return nextParams;
35
+ }
36
+ } else if (overrideCommitment !== "finalized") {
37
+ const nextParams = [...params];
38
+ nextParams[optionsObjectPositionInParams] = {
39
+ ...paramInTargetPosition,
40
+ [commitmentPropertyName]: overrideCommitment
41
+ };
42
+ return nextParams;
43
+ }
44
+ }
45
+ return params;
46
+ }
47
+
48
+ // src/params-transformer-bigint-downcast.ts
49
+ function downcastNodeToNumberIfBigint(value) {
50
+ return typeof value === "bigint" ? (
51
+ // FIXME(solana-labs/solana/issues/30341) Create a data type to represent u64 in the Solana
52
+ // JSON RPC implementation so that we can throw away this entire patcher instead of unsafely
53
+ // downcasting `bigints` to `numbers`.
54
+ Number(value)
55
+ ) : value;
56
+ }
57
+
58
+ // src/params-transformer-integer-overflow.ts
59
+ function getIntegerOverflowNodeVisitor(onIntegerOverflow) {
60
+ return (value, { keyPath }) => {
61
+ if (typeof value === "bigint") {
62
+ if (onIntegerOverflow && (value > Number.MAX_SAFE_INTEGER || value < -Number.MAX_SAFE_INTEGER)) {
63
+ onIntegerOverflow(keyPath, value);
64
+ }
65
+ }
66
+ return value;
67
+ };
68
+ }
69
+
70
+ // src/params-transformer-options-object-position-config.ts
71
+ var OPTIONS_OBJECT_POSITION_BY_METHOD = {
72
+ accountNotifications: 1,
73
+ blockNotifications: 1,
74
+ getAccountInfo: 1,
75
+ getBalance: 1,
76
+ getBlock: 1,
77
+ getBlockHeight: 0,
78
+ getBlockProduction: 0,
79
+ getBlocks: 2,
80
+ getBlocksWithLimit: 2,
81
+ getConfirmedBlock: 1,
82
+ getConfirmedBlocks: 1,
83
+ getConfirmedBlocksWithLimit: 2,
84
+ getConfirmedSignaturesForAddress2: 1,
85
+ getConfirmedTransaction: 1,
86
+ getEpochInfo: 0,
87
+ getFeeCalculatorForBlockhash: 1,
88
+ getFeeForMessage: 1,
89
+ getFees: 1,
90
+ getInflationGovernor: 0,
91
+ getInflationReward: 1,
92
+ getLargestAccounts: 0,
93
+ getLatestBlockhash: 0,
94
+ getLeaderSchedule: 1,
95
+ getMinimumBalanceForRentExemption: 1,
96
+ getMultipleAccounts: 1,
97
+ getProgramAccounts: 1,
98
+ getRecentBlockhash: 1,
99
+ getSignaturesForAddress: 1,
100
+ getSlot: 0,
101
+ getSlotLeader: 0,
102
+ getStakeActivation: 1,
103
+ getStakeMinimumDelegation: 0,
104
+ getSupply: 0,
105
+ getTokenAccountBalance: 1,
106
+ getTokenAccountsByDelegate: 2,
107
+ getTokenAccountsByOwner: 2,
108
+ getTokenLargestAccounts: 1,
109
+ getTokenSupply: 1,
110
+ getTransaction: 1,
111
+ getTransactionCount: 0,
112
+ getVoteAccounts: 0,
113
+ isBlockhashValid: 1,
114
+ logsNotifications: 1,
115
+ programNotifications: 1,
116
+ requestAirdrop: 2,
117
+ sendTransaction: 1,
118
+ signatureNotifications: 1,
119
+ simulateTransaction: 1
120
+ };
121
+
122
+ // src/tree-traversal.ts
123
+ var KEYPATH_WILDCARD = {};
124
+ function getTreeWalker(visitors) {
125
+ return function traverse(node, state) {
126
+ if (Array.isArray(node)) {
127
+ return node.map((element, ii) => {
128
+ const nextState = {
129
+ ...state,
130
+ keyPath: [...state.keyPath, ii]
131
+ };
132
+ return traverse(element, nextState);
133
+ });
134
+ } else if (typeof node === "object" && node !== null) {
135
+ const out = {};
136
+ for (const propName in node) {
137
+ if (!Object.prototype.hasOwnProperty.call(node, propName)) {
138
+ continue;
139
+ }
140
+ const nextState = {
141
+ ...state,
142
+ keyPath: [...state.keyPath, propName]
143
+ };
144
+ out[propName] = traverse(node[propName], nextState);
145
+ }
146
+ return out;
147
+ } else {
148
+ return visitors.reduce((acc, visitNode) => visitNode(acc, state), node);
149
+ }
150
+ };
151
+ }
152
+
153
+ // src/params-transformer.ts
154
+ function getDefaultParamsTransformerForSolanaRpc(config) {
155
+ const defaultCommitment = config?.defaultCommitment;
156
+ const handleIntegerOverflow = config?.onIntegerOverflow;
157
+ return (rawParams, methodName) => {
158
+ const traverse = getTreeWalker([
159
+ ...handleIntegerOverflow ? [getIntegerOverflowNodeVisitor((...args) => handleIntegerOverflow(methodName, ...args))] : [],
160
+ downcastNodeToNumberIfBigint
161
+ ]);
162
+ const initialState = {
163
+ keyPath: []
164
+ };
165
+ const patchedParams = traverse(rawParams, initialState);
166
+ if (!Array.isArray(patchedParams)) {
167
+ return patchedParams;
168
+ }
169
+ const optionsObjectPositionInParams = OPTIONS_OBJECT_POSITION_BY_METHOD[methodName];
170
+ if (optionsObjectPositionInParams == null) {
171
+ return patchedParams;
172
+ }
173
+ return applyDefaultCommitment({
174
+ commitmentPropertyName: methodName === "sendTransaction" ? "preflightCommitment" : "commitment",
175
+ optionsObjectPositionInParams,
176
+ overrideCommitment: defaultCommitment,
177
+ params: patchedParams
178
+ });
179
+ };
180
+ }
181
+
182
+ // src/response-transformer-bigint-upcast.ts
183
+ function keyPathIsAllowedToBeNumeric(keyPath, allowedNumericKeyPaths) {
184
+ return allowedNumericKeyPaths.some((prohibitedKeyPath) => {
185
+ if (prohibitedKeyPath.length !== keyPath.length) {
186
+ return false;
187
+ }
188
+ for (let ii = keyPath.length - 1; ii >= 0; ii--) {
189
+ const keyPathPart = keyPath[ii];
190
+ const prohibitedKeyPathPart = prohibitedKeyPath[ii];
191
+ if (prohibitedKeyPathPart !== keyPathPart && (prohibitedKeyPathPart !== KEYPATH_WILDCARD || typeof keyPathPart !== "number")) {
192
+ return false;
193
+ }
194
+ }
195
+ return true;
196
+ });
197
+ }
198
+ function getBigIntUpcastVisitor(allowedNumericKeyPaths) {
199
+ return function upcastNodeToBigIntIfNumber(value, { keyPath }) {
200
+ if (typeof value === "number" && Number.isInteger(value) && !keyPathIsAllowedToBeNumeric(keyPath, allowedNumericKeyPaths)) {
201
+ return BigInt(value);
202
+ } else {
203
+ return value;
204
+ }
205
+ };
206
+ }
207
+
208
+ // src/response-transformer.ts
209
+ function getDefaultResponseTransformerForSolanaRpc(config) {
210
+ return (rawResponse, methodName) => {
211
+ const keyPaths = config?.allowedNumericKeyPaths && methodName ? config.allowedNumericKeyPaths[methodName] : void 0;
212
+ const traverse = getTreeWalker([getBigIntUpcastVisitor(keyPaths ?? [])]);
213
+ const initialState = {
214
+ keyPath: []
215
+ };
216
+ return traverse(rawResponse, initialState);
217
+ };
218
+ }
219
+
220
+ // src/response-transformer-allowed-numeric-values.ts
221
+ var jsonParsedTokenAccountsConfigs = [
222
+ // parsed Token/Token22 token account
223
+ ["data", "parsed", "info", "tokenAmount", "decimals"],
224
+ ["data", "parsed", "info", "tokenAmount", "uiAmount"],
225
+ ["data", "parsed", "info", "rentExemptReserve", "decimals"],
226
+ ["data", "parsed", "info", "rentExemptReserve", "uiAmount"],
227
+ ["data", "parsed", "info", "delegatedAmount", "decimals"],
228
+ ["data", "parsed", "info", "delegatedAmount", "uiAmount"],
229
+ ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "olderTransferFee", "transferFeeBasisPoints"],
230
+ ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "newerTransferFee", "transferFeeBasisPoints"],
231
+ ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "preUpdateAverageRate"],
232
+ ["data", "parsed", "info", "extensions", KEYPATH_WILDCARD, "state", "currentRate"]
233
+ ];
234
+ var jsonParsedAccountsConfigs = [
235
+ ...jsonParsedTokenAccountsConfigs,
236
+ // parsed AddressTableLookup account
237
+ ["data", "parsed", "info", "lastExtendedSlotStartIndex"],
238
+ // parsed Config account
239
+ ["data", "parsed", "info", "slashPenalty"],
240
+ ["data", "parsed", "info", "warmupCooldownRate"],
241
+ // parsed Token/Token22 mint account
242
+ ["data", "parsed", "info", "decimals"],
243
+ // parsed Token/Token22 multisig account
244
+ ["data", "parsed", "info", "numRequiredSigners"],
245
+ ["data", "parsed", "info", "numValidSigners"],
246
+ // parsed Stake account
247
+ ["data", "parsed", "info", "stake", "delegation", "warmupCooldownRate"],
248
+ // parsed Sysvar rent account
249
+ ["data", "parsed", "info", "exemptionThreshold"],
250
+ ["data", "parsed", "info", "burnPercent"],
251
+ // parsed Vote account
252
+ ["data", "parsed", "info", "commission"],
253
+ ["data", "parsed", "info", "votes", KEYPATH_WILDCARD, "confirmationCount"]
254
+ ];
255
+
256
+ export { KEYPATH_WILDCARD, OPTIONS_OBJECT_POSITION_BY_METHOD, applyDefaultCommitment, downcastNodeToNumberIfBigint, getBigIntUpcastVisitor, getDefaultParamsTransformerForSolanaRpc, getDefaultResponseTransformerForSolanaRpc, getIntegerOverflowNodeVisitor, getTreeWalker, jsonParsedAccountsConfigs, jsonParsedTokenAccountsConfigs };
257
+ //# sourceMappingURL=out.js.map
258
+ //# sourceMappingURL=index.browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/default-commitment.ts","../src/params-transformer-bigint-downcast.ts","../src/params-transformer-integer-overflow.ts","../src/params-transformer-options-object-position-config.ts","../src/tree-traversal.ts","../src/params-transformer.ts","../src/response-transformer-bigint-upcast.ts","../src/response-transformer.ts","../src/response-transformer-allowed-numeric-values.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Commitment } from '@solana/rpc-types';\n\ntype Config = Readonly<{\n params: unknown[];\n commitmentPropertyName: string;\n optionsObjectPositionInParams: number;\n overrideCommitment?: Commitment;\n}>;\n\nexport function applyDefaultCommitment({\n commitmentPropertyName,\n params,\n optionsObjectPositionInParams,\n overrideCommitment,\n}: Config) {\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","export 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 { KeyPath, TraversalState } from './tree-traversal';\n\ntype IntegerOverflowHandler = (keyPath: KeyPath, value: bigint) => void;\n\nexport function getIntegerOverflowNodeVisitor(onIntegerOverflow: IntegerOverflowHandler) {\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","export type KeyPathWildcard = { readonly __brand: unique symbol };\nexport type KeyPath = ReadonlyArray<KeyPathWildcard | number | string | KeyPath>;\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<string | number | 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","import { Commitment } from '@solana/rpc-types';\n\nimport { applyDefaultCommitment } from './default-commitment';\nimport { downcastNodeToNumberIfBigint } from './params-transformer-bigint-downcast';\nimport { getIntegerOverflowNodeVisitor } from './params-transformer-integer-overflow';\nimport { OPTIONS_OBJECT_POSITION_BY_METHOD } from './params-transformer-options-object-position-config';\nimport { getTreeWalker, KeyPath } from './tree-traversal';\n\nexport type ParamsTransformerConfig = Readonly<{\n defaultCommitment?: Commitment;\n onIntegerOverflow?: (methodName: string, keyPath: KeyPath, value: bigint) => void;\n}>;\n\nexport function getDefaultParamsTransformerForSolanaRpc(config?: ParamsTransformerConfig) {\n const defaultCommitment = config?.defaultCommitment;\n const handleIntegerOverflow = config?.onIntegerOverflow;\n return <T>(rawParams: T, methodName: string) => {\n const traverse = getTreeWalker([\n ...(handleIntegerOverflow\n ? [getIntegerOverflowNodeVisitor((...args) => handleIntegerOverflow(methodName, ...args))]\n : []),\n downcastNodeToNumberIfBigint,\n ]);\n const initialState = {\n keyPath: [],\n };\n const patchedParams = traverse(rawParams, initialState);\n if (!Array.isArray(patchedParams)) {\n return patchedParams;\n }\n const optionsObjectPositionInParams = OPTIONS_OBJECT_POSITION_BY_METHOD[methodName];\n if (optionsObjectPositionInParams == null) {\n return patchedParams;\n }\n return applyDefaultCommitment({\n commitmentPropertyName: methodName === 'sendTransaction' ? 'preflightCommitment' : 'commitment',\n optionsObjectPositionInParams,\n overrideCommitment: defaultCommitment,\n params: patchedParams,\n });\n };\n}\n","import { KeyPath, KEYPATH_WILDCARD, TraversalState } from './tree-traversal';\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\nexport function getBigIntUpcastVisitor(allowedNumericKeyPaths: readonly KeyPath[]) {\n return function upcastNodeToBigIntIfNumber(value: unknown, { keyPath }: TraversalState) {\n if (\n typeof value === 'number' &&\n Number.isInteger(value) &&\n !keyPathIsAllowedToBeNumeric(keyPath, allowedNumericKeyPaths)\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 return BigInt(value);\n } else {\n return value;\n }\n };\n}\n","import { AllowedNumericKeypaths } from './response-transformer-allowed-numeric-values';\nimport { getBigIntUpcastVisitor } from './response-transformer-bigint-upcast';\nimport { getTreeWalker } from './tree-traversal';\n\nexport type ResponseTransformerConfig<TApi> = Readonly<{\n allowedNumericKeyPaths?: AllowedNumericKeypaths<TApi>;\n}>;\n\nexport function getDefaultResponseTransformerForSolanaRpc<TApi>(config?: ResponseTransformerConfig<TApi>) {\n return <T>(rawResponse: unknown, methodName?: keyof TApi): T => {\n const keyPaths =\n config?.allowedNumericKeyPaths && methodName ? config.allowedNumericKeyPaths[methodName] : undefined;\n const traverse = getTreeWalker([getBigIntUpcastVisitor(keyPaths ?? [])]);\n const initialState = {\n keyPath: [],\n };\n return traverse(rawResponse, 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];\n"]}