@sip-protocol/sdk 0.7.3 → 0.8.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 (263) hide show
  1. package/README.md +267 -0
  2. package/dist/{TransportWebUSB-TQ7WZ4LE.mjs → TransportWebUSB-YQMAGJAJ.mjs} +12 -9
  3. package/dist/browser.d.mts +10 -4
  4. package/dist/browser.d.ts +10 -4
  5. package/dist/browser.js +47556 -19603
  6. package/dist/browser.mjs +628 -48
  7. package/dist/chunk-4GRJ5MAW.mjs +152 -0
  8. package/dist/chunk-5D7A3L3W.mjs +717 -0
  9. package/dist/chunk-64AYA5F5.mjs +7834 -0
  10. package/dist/chunk-GMDGB22A.mjs +379 -0
  11. package/dist/chunk-I534WKN7.mjs +328 -0
  12. package/dist/chunk-IBZVA5Y7.mjs +1003 -0
  13. package/dist/chunk-PRRZAWJE.mjs +223 -0
  14. package/dist/{chunk-UJCSKKID.mjs → chunk-XGB3TDIC.mjs} +13 -1
  15. package/dist/{chunk-3M3HNQCW.mjs → chunk-YWGJ77A2.mjs} +28656 -13103
  16. package/dist/{chunk-6WGN57S2.mjs → chunk-Z3K7W5S3.mjs} +48 -0
  17. package/dist/constants-LHAAUC2T.mjs +51 -0
  18. package/dist/dist-2OGQ7FED.mjs +3957 -0
  19. package/dist/dist-IFHPYLDX.mjs +254 -0
  20. package/dist/fulfillment_proof-ANHVPKTB.mjs +21 -0
  21. package/dist/funding_proof-ICFZ5LHY.mjs +21 -0
  22. package/dist/{index-DIBZHOOQ.d.ts → index-DXh2IGkz.d.ts} +21239 -10304
  23. package/dist/{index-8MQz13eJ.d.mts → index-DeE1ZzA4.d.mts} +21239 -10304
  24. package/dist/index.d.mts +9 -3
  25. package/dist/index.d.ts +9 -3
  26. package/dist/index.js +48396 -19623
  27. package/dist/index.mjs +537 -19
  28. package/dist/interface-Bf7w1PLW.d.mts +679 -0
  29. package/dist/interface-Bf7w1PLW.d.ts +679 -0
  30. package/dist/{noir-DKfEzWy9.d.mts → noir-kzbLVTei.d.mts} +31 -21
  31. package/dist/{noir-DKfEzWy9.d.ts → noir-kzbLVTei.d.ts} +31 -21
  32. package/dist/proofs/halo2.d.mts +151 -0
  33. package/dist/proofs/halo2.d.ts +151 -0
  34. package/dist/proofs/halo2.js +350 -0
  35. package/dist/proofs/halo2.mjs +11 -0
  36. package/dist/proofs/kimchi.d.mts +160 -0
  37. package/dist/proofs/kimchi.d.ts +160 -0
  38. package/dist/proofs/kimchi.js +431 -0
  39. package/dist/proofs/kimchi.mjs +13 -0
  40. package/dist/proofs/noir.d.mts +1 -1
  41. package/dist/proofs/noir.d.ts +1 -1
  42. package/dist/proofs/noir.js +74 -18
  43. package/dist/proofs/noir.mjs +84 -24
  44. package/dist/solana-U3MEGU7W.mjs +280 -0
  45. package/dist/validity_proof-3POXLPNY.mjs +21 -0
  46. package/package.json +44 -11
  47. package/src/adapters/index.ts +41 -0
  48. package/src/adapters/jupiter.ts +571 -0
  49. package/src/adapters/near-intents.ts +135 -0
  50. package/src/advisor/advisor.ts +653 -0
  51. package/src/advisor/index.ts +54 -0
  52. package/src/advisor/tools.ts +303 -0
  53. package/src/advisor/types.ts +164 -0
  54. package/src/chains/ethereum/announcement.ts +536 -0
  55. package/src/chains/ethereum/bnb-optimizations.ts +474 -0
  56. package/src/chains/ethereum/commitment.ts +522 -0
  57. package/src/chains/ethereum/constants.ts +462 -0
  58. package/src/chains/ethereum/deployment.ts +596 -0
  59. package/src/chains/ethereum/gas-estimation.ts +538 -0
  60. package/src/chains/ethereum/index.ts +268 -0
  61. package/src/chains/ethereum/optimizations.ts +614 -0
  62. package/src/chains/ethereum/privacy-adapter.ts +855 -0
  63. package/src/chains/ethereum/registry.ts +584 -0
  64. package/src/chains/ethereum/rpc.ts +905 -0
  65. package/src/chains/ethereum/stealth.ts +491 -0
  66. package/src/chains/ethereum/token.ts +790 -0
  67. package/src/chains/ethereum/transfer.ts +637 -0
  68. package/src/chains/ethereum/types.ts +456 -0
  69. package/src/chains/ethereum/viewing-key.ts +455 -0
  70. package/src/chains/near/commitment.ts +608 -0
  71. package/src/chains/near/constants.ts +284 -0
  72. package/src/chains/near/function-call.ts +871 -0
  73. package/src/chains/near/history.ts +654 -0
  74. package/src/chains/near/implicit-account.ts +840 -0
  75. package/src/chains/near/index.ts +393 -0
  76. package/src/chains/near/native-transfer.ts +658 -0
  77. package/src/chains/near/nep141.ts +775 -0
  78. package/src/chains/near/privacy-adapter.ts +889 -0
  79. package/src/chains/near/resolver.ts +971 -0
  80. package/src/chains/near/rpc.ts +1016 -0
  81. package/src/chains/near/stealth.ts +419 -0
  82. package/src/chains/near/types.ts +317 -0
  83. package/src/chains/near/viewing-key.ts +876 -0
  84. package/src/chains/solana/anchor-transfer.ts +386 -0
  85. package/src/chains/solana/commitment.ts +577 -0
  86. package/src/chains/solana/constants.ts +126 -12
  87. package/src/chains/solana/ephemeral-keys.ts +543 -0
  88. package/src/chains/solana/index.ts +252 -1
  89. package/src/chains/solana/key-derivation.ts +418 -0
  90. package/src/chains/solana/kit-compat.ts +334 -0
  91. package/src/chains/solana/optimizations.ts +560 -0
  92. package/src/chains/solana/privacy-adapter.ts +605 -0
  93. package/src/chains/solana/providers/generic.ts +47 -6
  94. package/src/chains/solana/providers/helius-enhanced-types.ts +336 -0
  95. package/src/chains/solana/providers/helius-enhanced.ts +623 -0
  96. package/src/chains/solana/providers/helius.ts +186 -33
  97. package/src/chains/solana/providers/index.ts +31 -0
  98. package/src/chains/solana/providers/interface.ts +61 -18
  99. package/src/chains/solana/providers/quicknode.ts +409 -0
  100. package/src/chains/solana/providers/triton.ts +426 -0
  101. package/src/chains/solana/providers/webhook.ts +338 -67
  102. package/src/chains/solana/rpc-client.ts +1150 -0
  103. package/src/chains/solana/scan.ts +83 -66
  104. package/src/chains/solana/sol-transfer.ts +732 -0
  105. package/src/chains/solana/spl-transfer.ts +886 -0
  106. package/src/chains/solana/stealth-scanner.ts +703 -0
  107. package/src/chains/solana/sunspot-verifier.ts +453 -0
  108. package/src/chains/solana/transaction-builder.ts +755 -0
  109. package/src/chains/solana/transfer.ts +74 -5
  110. package/src/chains/solana/types.ts +57 -6
  111. package/src/chains/solana/utils.ts +110 -0
  112. package/src/chains/solana/viewing-key.ts +807 -0
  113. package/src/compliance/fireblocks.ts +921 -0
  114. package/src/compliance/index.ts +23 -0
  115. package/src/compliance/range-sas.ts +398 -33
  116. package/src/config/endpoints.ts +100 -0
  117. package/src/crypto.ts +11 -8
  118. package/src/errors.ts +82 -0
  119. package/src/evm/erc4337-relayer.ts +830 -0
  120. package/src/evm/index.ts +47 -0
  121. package/src/fees/calculator.ts +396 -0
  122. package/src/fees/index.ts +87 -0
  123. package/src/fees/near-contract.ts +429 -0
  124. package/src/fees/types.ts +268 -0
  125. package/src/index.ts +686 -1
  126. package/src/intent.ts +6 -3
  127. package/src/logger.ts +324 -0
  128. package/src/network/index.ts +80 -0
  129. package/src/network/proxy.ts +691 -0
  130. package/src/optimizations/index.ts +541 -0
  131. package/src/oracle/types.ts +1 -0
  132. package/src/privacy-backends/arcium-types.ts +727 -0
  133. package/src/privacy-backends/arcium.ts +719 -0
  134. package/src/privacy-backends/combined-privacy.ts +866 -0
  135. package/src/privacy-backends/cspl-token.ts +595 -0
  136. package/src/privacy-backends/cspl-types.ts +512 -0
  137. package/src/privacy-backends/cspl.ts +907 -0
  138. package/src/privacy-backends/health.ts +488 -0
  139. package/src/privacy-backends/inco-types.ts +323 -0
  140. package/src/privacy-backends/inco.ts +616 -0
  141. package/src/privacy-backends/index.ts +254 -4
  142. package/src/privacy-backends/interface.ts +649 -6
  143. package/src/privacy-backends/lru-cache.ts +343 -0
  144. package/src/privacy-backends/magicblock.ts +458 -0
  145. package/src/privacy-backends/mock.ts +258 -0
  146. package/src/privacy-backends/privacycash.ts +13 -17
  147. package/src/privacy-backends/private-swap.ts +570 -0
  148. package/src/privacy-backends/rate-limiter.ts +683 -0
  149. package/src/privacy-backends/registry.ts +414 -2
  150. package/src/privacy-backends/router.ts +283 -3
  151. package/src/privacy-backends/shadowwire.ts +449 -0
  152. package/src/privacy-backends/sip-native.ts +3 -0
  153. package/src/privacy-logger.ts +191 -0
  154. package/src/production-safety.ts +373 -0
  155. package/src/proofs/aggregator.ts +1029 -0
  156. package/src/proofs/browser-composer.ts +1150 -0
  157. package/src/proofs/browser.ts +113 -25
  158. package/src/proofs/cache/index.ts +127 -0
  159. package/src/proofs/cache/interface.ts +545 -0
  160. package/src/proofs/cache/key-generator.ts +188 -0
  161. package/src/proofs/cache/lru-cache.ts +481 -0
  162. package/src/proofs/cache/multi-tier-cache.ts +575 -0
  163. package/src/proofs/cache/persistent-cache.ts +788 -0
  164. package/src/proofs/compliance-proof.ts +872 -0
  165. package/src/proofs/composer/base.ts +923 -0
  166. package/src/proofs/composer/index.ts +25 -0
  167. package/src/proofs/composer/interface.ts +518 -0
  168. package/src/proofs/composer/types.ts +383 -0
  169. package/src/proofs/converters/halo2.ts +452 -0
  170. package/src/proofs/converters/index.ts +208 -0
  171. package/src/proofs/converters/interface.ts +363 -0
  172. package/src/proofs/converters/kimchi.ts +462 -0
  173. package/src/proofs/converters/noir.ts +451 -0
  174. package/src/proofs/fallback.ts +888 -0
  175. package/src/proofs/halo2.ts +42 -0
  176. package/src/proofs/index.ts +471 -0
  177. package/src/proofs/interface.ts +13 -0
  178. package/src/proofs/kimchi.ts +42 -0
  179. package/src/proofs/lazy.ts +1004 -0
  180. package/src/proofs/mock.ts +25 -1
  181. package/src/proofs/noir.ts +110 -29
  182. package/src/proofs/orchestrator.ts +960 -0
  183. package/src/proofs/parallel/concurrency.ts +297 -0
  184. package/src/proofs/parallel/dependency-graph.ts +602 -0
  185. package/src/proofs/parallel/executor.ts +420 -0
  186. package/src/proofs/parallel/index.ts +131 -0
  187. package/src/proofs/parallel/interface.ts +685 -0
  188. package/src/proofs/parallel/worker-pool.ts +644 -0
  189. package/src/proofs/providers/halo2.ts +560 -0
  190. package/src/proofs/providers/index.ts +34 -0
  191. package/src/proofs/providers/kimchi.ts +641 -0
  192. package/src/proofs/validator.ts +881 -0
  193. package/src/proofs/verifier.ts +867 -0
  194. package/src/quantum/index.ts +112 -0
  195. package/src/quantum/winternitz-vault.ts +639 -0
  196. package/src/quantum/wots.ts +611 -0
  197. package/src/settlement/backends/direct-chain.ts +1 -0
  198. package/src/settlement/index.ts +9 -0
  199. package/src/settlement/router.ts +732 -46
  200. package/src/solana/index.ts +72 -0
  201. package/src/solana/jito-relayer.ts +687 -0
  202. package/src/solana/noir-verifier-types.ts +430 -0
  203. package/src/solana/noir-verifier.ts +816 -0
  204. package/src/stealth/address-derivation.ts +193 -0
  205. package/src/stealth/ed25519.ts +431 -0
  206. package/src/stealth/index.ts +233 -0
  207. package/src/stealth/meta-address.ts +221 -0
  208. package/src/stealth/secp256k1.ts +368 -0
  209. package/src/stealth/utils.ts +194 -0
  210. package/src/stealth.ts +50 -1504
  211. package/src/sync/index.ts +106 -0
  212. package/src/sync/manager.ts +504 -0
  213. package/src/sync/mock-provider.ts +318 -0
  214. package/src/sync/oblivious.ts +625 -0
  215. package/src/tokens/index.ts +15 -0
  216. package/src/tokens/registry.ts +301 -0
  217. package/src/utils/deprecation.ts +94 -0
  218. package/src/utils/index.ts +9 -0
  219. package/src/wallet/ethereum/index.ts +68 -0
  220. package/src/wallet/ethereum/metamask-privacy.ts +420 -0
  221. package/src/wallet/ethereum/multi-wallet.ts +646 -0
  222. package/src/wallet/ethereum/privacy-adapter.ts +700 -0
  223. package/src/wallet/ethereum/types.ts +3 -1
  224. package/src/wallet/ethereum/walletconnect-adapter.ts +675 -0
  225. package/src/wallet/hardware/index.ts +10 -0
  226. package/src/wallet/hardware/ledger-privacy.ts +414 -0
  227. package/src/wallet/index.ts +71 -0
  228. package/src/wallet/near/adapter.ts +626 -0
  229. package/src/wallet/near/index.ts +86 -0
  230. package/src/wallet/near/meteor-wallet.ts +1153 -0
  231. package/src/wallet/near/my-near-wallet.ts +790 -0
  232. package/src/wallet/near/wallet-selector.ts +702 -0
  233. package/src/wallet/solana/adapter.ts +6 -4
  234. package/src/wallet/solana/index.ts +13 -0
  235. package/src/wallet/solana/privacy-adapter.ts +567 -0
  236. package/src/wallet/sui/types.ts +6 -4
  237. package/src/zcash/rpc-client.ts +13 -6
  238. package/dist/chunk-2XIVXWHA.mjs +0 -1930
  239. package/dist/chunk-3INS3PR5.mjs +0 -884
  240. package/dist/chunk-3OVABDRH.mjs +0 -17096
  241. package/dist/chunk-7RFRWDCW.mjs +0 -1504
  242. package/dist/chunk-DLDWZFYC.mjs +0 -1495
  243. package/dist/chunk-E6SZWREQ.mjs +0 -57
  244. package/dist/chunk-F6F73W35.mjs +0 -16166
  245. package/dist/chunk-G33LB27A.mjs +0 -16166
  246. package/dist/chunk-HGU6HZRC.mjs +0 -231
  247. package/dist/chunk-L2K34JCU.mjs +0 -1496
  248. package/dist/chunk-OFDBEIEK.mjs +0 -16166
  249. package/dist/chunk-SF7YSLF5.mjs +0 -1515
  250. package/dist/chunk-SN4ZDTVW.mjs +0 -16166
  251. package/dist/chunk-WWUSGOXE.mjs +0 -17129
  252. package/dist/constants-VOI7BSLK.mjs +0 -27
  253. package/dist/index-B71aXVzk.d.ts +0 -13264
  254. package/dist/index-BYZbDjal.d.ts +0 -11390
  255. package/dist/index-CHB3KuOB.d.mts +0 -11859
  256. package/dist/index-CzWPI6Le.d.ts +0 -11859
  257. package/dist/index-pOIIuwfV.d.mts +0 -13264
  258. package/dist/index-xbWjohNq.d.mts +0 -11390
  259. package/dist/solana-4O4K45VU.mjs +0 -46
  260. package/dist/solana-5EMCTPTS.mjs +0 -46
  261. package/dist/solana-NDABAZ6P.mjs +0 -56
  262. package/dist/solana-Q4NAVBTS.mjs +0 -46
  263. package/dist/solana-ZYO63LY5.mjs +0 -46
@@ -31,9 +31,11 @@ import {
31
31
  SIP_MEMO_PREFIX,
32
32
  MEMO_PROGRAM_ID,
33
33
  getExplorerUrl,
34
- SOLANA_TOKEN_MINTS,
34
+ DEFAULT_SCAN_LIMIT,
35
+ VIEW_TAG_MAX,
35
36
  type SolanaCluster,
36
37
  } from './constants'
38
+ import { getTokenSymbol, parseTokenTransferFromBalances } from './utils'
37
39
  import type { SolanaRPCProvider } from './providers/interface'
38
40
  import { hexToBytes } from '@noble/hashes/utils'
39
41
  import { ed25519 } from '@noble/curves/ed25519'
@@ -70,7 +72,7 @@ export async function scanForPayments(
70
72
  spendingPublicKey,
71
73
  fromSlot,
72
74
  toSlot,
73
- limit = 100,
75
+ limit = DEFAULT_SCAN_LIMIT,
74
76
  provider,
75
77
  } = params
76
78
 
@@ -119,32 +121,61 @@ export async function scanForPayments(
119
121
  const announcement = parseAnnouncement(memoContent)
120
122
  if (!announcement) continue
121
123
 
122
- // Check if this payment is for us using view tag first
123
- const ephemeralPubKeyHex = solanaAddressToEd25519PublicKey(
124
- announcement.ephemeralPublicKey
125
- )
124
+ // M5 FIX: Wrap ephemeral key conversion in try-catch
125
+ let ephemeralPubKeyHex: HexString
126
+ try {
127
+ ephemeralPubKeyHex = solanaAddressToEd25519PublicKey(
128
+ announcement.ephemeralPublicKey
129
+ )
130
+ } catch {
131
+ // Invalid ephemeral key format, skip this announcement
132
+ continue
133
+ }
126
134
 
127
135
  // Construct stealth address object for checking
128
136
  // viewTag is a number (0-255), parse from hex string
129
137
  const viewTagNumber = parseInt(announcement.viewTag, 16)
130
- const stealthAddressToCheck: StealthAddress = {
131
- address: announcement.stealthAddress
138
+
139
+ // M5 FIX: Validate view tag range
140
+ if (!Number.isInteger(viewTagNumber) || viewTagNumber < 0 || viewTagNumber > VIEW_TAG_MAX) {
141
+ continue
142
+ }
143
+
144
+ let stealthAddressHex: HexString
145
+ try {
146
+ stealthAddressHex = announcement.stealthAddress
132
147
  ? solanaAddressToEd25519PublicKey(announcement.stealthAddress)
133
- : ('0x' + '00'.repeat(32)) as HexString, // Will be computed
148
+ : ('0x' + '00'.repeat(32)) as HexString
149
+ } catch {
150
+ continue
151
+ }
152
+
153
+ const stealthAddressToCheck: StealthAddress = {
154
+ address: stealthAddressHex,
134
155
  ephemeralPublicKey: ephemeralPubKeyHex,
135
156
  viewTag: viewTagNumber,
136
157
  }
137
158
 
138
- // Check if this is our payment
139
- const isOurs = checkEd25519StealthAddress(
140
- stealthAddressToCheck,
141
- viewingPrivateKey,
142
- spendingPublicKey
143
- )
159
+ // M5 FIX: Wrap checkEd25519StealthAddress in try-catch
160
+ // This can throw for invalid curve points
161
+ let isOurs = false
162
+ try {
163
+ isOurs = checkEd25519StealthAddress(
164
+ stealthAddressToCheck,
165
+ viewingPrivateKey,
166
+ spendingPublicKey
167
+ )
168
+ } catch {
169
+ // Invalid keys or malformed data - not our payment
170
+ continue
171
+ }
144
172
 
145
173
  if (isOurs) {
146
- // Parse token transfer from transaction
147
- const transferInfo = parseTokenTransfer(tx)
174
+ // Parse token transfer from transaction using shared utility
175
+ const transferInfo = parseTokenTransferFromBalances(
176
+ tx?.meta?.preTokenBalances as Parameters<typeof parseTokenTransferFromBalances>[0],
177
+ tx?.meta?.postTokenBalances as Parameters<typeof parseTokenTransferFromBalances>[1]
178
+ )
148
179
  if (transferInfo) {
149
180
  // If provider is available, use it for more accurate current balance
150
181
  let amount = transferInfo.amount
@@ -179,14 +210,15 @@ export async function scanForPayments(
179
210
  }
180
211
  }
181
212
  }
182
- } catch (err) {
183
- // Skip failed transaction parsing
184
- console.warn(`Failed to parse tx ${sigInfo.signature}:`, err)
213
+ } catch {
214
+ // M10 FIX: Skip failed transaction parsing silently
215
+ // Individual tx parse failures shouldn't block scanning
185
216
  }
186
217
  }
187
218
  } catch (err) {
188
- console.error('Scan failed:', err)
189
- throw new Error(`Failed to scan for payments: ${err}`)
219
+ // M10 FIX: Remove console.error, throw proper error
220
+ const message = err instanceof Error ? err.message : String(err)
221
+ throw new Error(`Failed to scan for payments: ${message}`)
190
222
  }
191
223
 
192
224
  return results
@@ -215,6 +247,9 @@ export async function scanForPayments(
215
247
  * console.log('Claimed! Tx:', result.txSignature)
216
248
  * ```
217
249
  */
250
+ /** Minimum SOL balance required for transaction fees (in lamports) */
251
+ const MIN_SOL_FOR_FEES = 5000n // ~0.000005 SOL, typical tx fee
252
+
218
253
  export async function claimStealthPayment(
219
254
  params: SolanaClaimParams
220
255
  ): Promise<SolanaClaimResult> {
@@ -228,6 +263,17 @@ export async function claimStealthPayment(
228
263
  mint,
229
264
  } = params
230
265
 
266
+ // M7 FIX: Check SOL balance for fees before attempting claim
267
+ const stealthPubkeyForBalance = new PublicKey(stealthAddress)
268
+ const solBalance = await connection.getBalance(stealthPubkeyForBalance)
269
+ if (BigInt(solBalance) < MIN_SOL_FOR_FEES) {
270
+ throw new Error(
271
+ `Insufficient SOL for transaction fees. Stealth address has ${solBalance} lamports, ` +
272
+ `needs at least ${MIN_SOL_FOR_FEES} lamports (~0.000005 SOL). ` +
273
+ `Fund the stealth address with SOL before claiming.`
274
+ )
275
+ }
276
+
231
277
  // Convert addresses to hex for SDK functions
232
278
  const stealthAddressHex = solanaAddressToEd25519PublicKey(stealthAddress)
233
279
  const ephemeralPubKeyHex = solanaAddressToEd25519PublicKey(ephemeralPublicKey)
@@ -391,51 +437,16 @@ export async function getStealthBalance(
391
437
  }
392
438
  }
393
439
 
394
- /**
395
- * Parse token transfer info from a transaction
396
- */
397
- function parseTokenTransfer(
398
- tx: Awaited<ReturnType<typeof import('@solana/web3.js').Connection.prototype.getTransaction>>
399
- ): { mint: string; amount: bigint } | null {
400
- if (!tx?.meta?.postTokenBalances || !tx.meta.preTokenBalances) {
401
- return null
402
- }
403
-
404
- // Find token balance changes
405
- for (let i = 0; i < tx.meta.postTokenBalances.length; i++) {
406
- const post = tx.meta.postTokenBalances[i]
407
- const pre = tx.meta.preTokenBalances.find(
408
- (p) => p.accountIndex === post.accountIndex
409
- )
410
-
411
- const postAmount = BigInt(post.uiTokenAmount.amount)
412
- const preAmount = pre ? BigInt(pre.uiTokenAmount.amount) : 0n
413
-
414
- if (postAmount > preAmount) {
415
- return {
416
- mint: post.mint,
417
- amount: postAmount - preAmount,
418
- }
419
- }
420
- }
421
-
422
- return null
423
- }
424
-
425
- /**
426
- * Get token symbol from mint address
427
- */
428
- function getTokenSymbol(mint: string): string | undefined {
429
- for (const [symbol, address] of Object.entries(SOLANA_TOKEN_MINTS)) {
430
- if (address === mint) {
431
- return symbol
432
- }
433
- }
434
- return undefined
435
- }
440
+ // Token transfer parsing and symbol lookup moved to ./utils.ts (L3 fix)
436
441
 
437
442
  /**
438
- * Detect Solana cluster from RPC endpoint
443
+ * Detect Solana cluster from RPC endpoint URL
444
+ *
445
+ * Parses the endpoint URL to determine which Solana cluster it connects to.
446
+ *
447
+ * @param endpoint - RPC endpoint URL
448
+ * @returns Detected cluster name
449
+ * @internal
439
450
  */
440
451
  function detectCluster(endpoint: string): SolanaCluster {
441
452
  if (endpoint.includes('devnet')) {
@@ -451,7 +462,13 @@ function detectCluster(endpoint: string): SolanaCluster {
451
462
  }
452
463
 
453
464
  /**
454
- * Convert bytes to bigint (little-endian, for ed25519 scalars)
465
+ * Convert bytes to bigint in little-endian format
466
+ *
467
+ * Used for ed25519 scalar conversion where bytes are in little-endian order.
468
+ *
469
+ * @param bytes - Byte array to convert
470
+ * @returns BigInt representation of the bytes
471
+ * @internal
455
472
  */
456
473
  function bytesToBigIntLE(bytes: Uint8Array): bigint {
457
474
  let result = 0n