@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.
- package/README.md +267 -0
- package/dist/{TransportWebUSB-TQ7WZ4LE.mjs → TransportWebUSB-YQMAGJAJ.mjs} +12 -9
- package/dist/browser.d.mts +10 -4
- package/dist/browser.d.ts +10 -4
- package/dist/browser.js +47556 -19603
- package/dist/browser.mjs +628 -48
- package/dist/chunk-4GRJ5MAW.mjs +152 -0
- package/dist/chunk-5D7A3L3W.mjs +717 -0
- package/dist/chunk-64AYA5F5.mjs +7834 -0
- package/dist/chunk-GMDGB22A.mjs +379 -0
- package/dist/chunk-I534WKN7.mjs +328 -0
- package/dist/chunk-IBZVA5Y7.mjs +1003 -0
- package/dist/chunk-PRRZAWJE.mjs +223 -0
- package/dist/{chunk-UJCSKKID.mjs → chunk-XGB3TDIC.mjs} +13 -1
- package/dist/{chunk-3M3HNQCW.mjs → chunk-YWGJ77A2.mjs} +28656 -13103
- package/dist/{chunk-6WGN57S2.mjs → chunk-Z3K7W5S3.mjs} +48 -0
- package/dist/constants-LHAAUC2T.mjs +51 -0
- package/dist/dist-2OGQ7FED.mjs +3957 -0
- package/dist/dist-IFHPYLDX.mjs +254 -0
- package/dist/fulfillment_proof-ANHVPKTB.mjs +21 -0
- package/dist/funding_proof-ICFZ5LHY.mjs +21 -0
- package/dist/{index-DIBZHOOQ.d.ts → index-DXh2IGkz.d.ts} +21239 -10304
- package/dist/{index-8MQz13eJ.d.mts → index-DeE1ZzA4.d.mts} +21239 -10304
- package/dist/index.d.mts +9 -3
- package/dist/index.d.ts +9 -3
- package/dist/index.js +48396 -19623
- package/dist/index.mjs +537 -19
- package/dist/interface-Bf7w1PLW.d.mts +679 -0
- package/dist/interface-Bf7w1PLW.d.ts +679 -0
- package/dist/{noir-DKfEzWy9.d.mts → noir-kzbLVTei.d.mts} +31 -21
- package/dist/{noir-DKfEzWy9.d.ts → noir-kzbLVTei.d.ts} +31 -21
- package/dist/proofs/halo2.d.mts +151 -0
- package/dist/proofs/halo2.d.ts +151 -0
- package/dist/proofs/halo2.js +350 -0
- package/dist/proofs/halo2.mjs +11 -0
- package/dist/proofs/kimchi.d.mts +160 -0
- package/dist/proofs/kimchi.d.ts +160 -0
- package/dist/proofs/kimchi.js +431 -0
- package/dist/proofs/kimchi.mjs +13 -0
- package/dist/proofs/noir.d.mts +1 -1
- package/dist/proofs/noir.d.ts +1 -1
- package/dist/proofs/noir.js +74 -18
- package/dist/proofs/noir.mjs +84 -24
- package/dist/solana-U3MEGU7W.mjs +280 -0
- package/dist/validity_proof-3POXLPNY.mjs +21 -0
- package/package.json +44 -11
- package/src/adapters/index.ts +41 -0
- package/src/adapters/jupiter.ts +571 -0
- package/src/adapters/near-intents.ts +135 -0
- package/src/advisor/advisor.ts +653 -0
- package/src/advisor/index.ts +54 -0
- package/src/advisor/tools.ts +303 -0
- package/src/advisor/types.ts +164 -0
- package/src/chains/ethereum/announcement.ts +536 -0
- package/src/chains/ethereum/bnb-optimizations.ts +474 -0
- package/src/chains/ethereum/commitment.ts +522 -0
- package/src/chains/ethereum/constants.ts +462 -0
- package/src/chains/ethereum/deployment.ts +596 -0
- package/src/chains/ethereum/gas-estimation.ts +538 -0
- package/src/chains/ethereum/index.ts +268 -0
- package/src/chains/ethereum/optimizations.ts +614 -0
- package/src/chains/ethereum/privacy-adapter.ts +855 -0
- package/src/chains/ethereum/registry.ts +584 -0
- package/src/chains/ethereum/rpc.ts +905 -0
- package/src/chains/ethereum/stealth.ts +491 -0
- package/src/chains/ethereum/token.ts +790 -0
- package/src/chains/ethereum/transfer.ts +637 -0
- package/src/chains/ethereum/types.ts +456 -0
- package/src/chains/ethereum/viewing-key.ts +455 -0
- package/src/chains/near/commitment.ts +608 -0
- package/src/chains/near/constants.ts +284 -0
- package/src/chains/near/function-call.ts +871 -0
- package/src/chains/near/history.ts +654 -0
- package/src/chains/near/implicit-account.ts +840 -0
- package/src/chains/near/index.ts +393 -0
- package/src/chains/near/native-transfer.ts +658 -0
- package/src/chains/near/nep141.ts +775 -0
- package/src/chains/near/privacy-adapter.ts +889 -0
- package/src/chains/near/resolver.ts +971 -0
- package/src/chains/near/rpc.ts +1016 -0
- package/src/chains/near/stealth.ts +419 -0
- package/src/chains/near/types.ts +317 -0
- package/src/chains/near/viewing-key.ts +876 -0
- package/src/chains/solana/anchor-transfer.ts +386 -0
- package/src/chains/solana/commitment.ts +577 -0
- package/src/chains/solana/constants.ts +126 -12
- package/src/chains/solana/ephemeral-keys.ts +543 -0
- package/src/chains/solana/index.ts +252 -1
- package/src/chains/solana/key-derivation.ts +418 -0
- package/src/chains/solana/kit-compat.ts +334 -0
- package/src/chains/solana/optimizations.ts +560 -0
- package/src/chains/solana/privacy-adapter.ts +605 -0
- package/src/chains/solana/providers/generic.ts +47 -6
- package/src/chains/solana/providers/helius-enhanced-types.ts +336 -0
- package/src/chains/solana/providers/helius-enhanced.ts +623 -0
- package/src/chains/solana/providers/helius.ts +186 -33
- package/src/chains/solana/providers/index.ts +31 -0
- package/src/chains/solana/providers/interface.ts +61 -18
- package/src/chains/solana/providers/quicknode.ts +409 -0
- package/src/chains/solana/providers/triton.ts +426 -0
- package/src/chains/solana/providers/webhook.ts +338 -67
- package/src/chains/solana/rpc-client.ts +1150 -0
- package/src/chains/solana/scan.ts +83 -66
- package/src/chains/solana/sol-transfer.ts +732 -0
- package/src/chains/solana/spl-transfer.ts +886 -0
- package/src/chains/solana/stealth-scanner.ts +703 -0
- package/src/chains/solana/sunspot-verifier.ts +453 -0
- package/src/chains/solana/transaction-builder.ts +755 -0
- package/src/chains/solana/transfer.ts +74 -5
- package/src/chains/solana/types.ts +57 -6
- package/src/chains/solana/utils.ts +110 -0
- package/src/chains/solana/viewing-key.ts +807 -0
- package/src/compliance/fireblocks.ts +921 -0
- package/src/compliance/index.ts +23 -0
- package/src/compliance/range-sas.ts +398 -33
- package/src/config/endpoints.ts +100 -0
- package/src/crypto.ts +11 -8
- package/src/errors.ts +82 -0
- package/src/evm/erc4337-relayer.ts +830 -0
- package/src/evm/index.ts +47 -0
- package/src/fees/calculator.ts +396 -0
- package/src/fees/index.ts +87 -0
- package/src/fees/near-contract.ts +429 -0
- package/src/fees/types.ts +268 -0
- package/src/index.ts +686 -1
- package/src/intent.ts +6 -3
- package/src/logger.ts +324 -0
- package/src/network/index.ts +80 -0
- package/src/network/proxy.ts +691 -0
- package/src/optimizations/index.ts +541 -0
- package/src/oracle/types.ts +1 -0
- package/src/privacy-backends/arcium-types.ts +727 -0
- package/src/privacy-backends/arcium.ts +719 -0
- package/src/privacy-backends/combined-privacy.ts +866 -0
- package/src/privacy-backends/cspl-token.ts +595 -0
- package/src/privacy-backends/cspl-types.ts +512 -0
- package/src/privacy-backends/cspl.ts +907 -0
- package/src/privacy-backends/health.ts +488 -0
- package/src/privacy-backends/inco-types.ts +323 -0
- package/src/privacy-backends/inco.ts +616 -0
- package/src/privacy-backends/index.ts +254 -4
- package/src/privacy-backends/interface.ts +649 -6
- package/src/privacy-backends/lru-cache.ts +343 -0
- package/src/privacy-backends/magicblock.ts +458 -0
- package/src/privacy-backends/mock.ts +258 -0
- package/src/privacy-backends/privacycash.ts +13 -17
- package/src/privacy-backends/private-swap.ts +570 -0
- package/src/privacy-backends/rate-limiter.ts +683 -0
- package/src/privacy-backends/registry.ts +414 -2
- package/src/privacy-backends/router.ts +283 -3
- package/src/privacy-backends/shadowwire.ts +449 -0
- package/src/privacy-backends/sip-native.ts +3 -0
- package/src/privacy-logger.ts +191 -0
- package/src/production-safety.ts +373 -0
- package/src/proofs/aggregator.ts +1029 -0
- package/src/proofs/browser-composer.ts +1150 -0
- package/src/proofs/browser.ts +113 -25
- package/src/proofs/cache/index.ts +127 -0
- package/src/proofs/cache/interface.ts +545 -0
- package/src/proofs/cache/key-generator.ts +188 -0
- package/src/proofs/cache/lru-cache.ts +481 -0
- package/src/proofs/cache/multi-tier-cache.ts +575 -0
- package/src/proofs/cache/persistent-cache.ts +788 -0
- package/src/proofs/compliance-proof.ts +872 -0
- package/src/proofs/composer/base.ts +923 -0
- package/src/proofs/composer/index.ts +25 -0
- package/src/proofs/composer/interface.ts +518 -0
- package/src/proofs/composer/types.ts +383 -0
- package/src/proofs/converters/halo2.ts +452 -0
- package/src/proofs/converters/index.ts +208 -0
- package/src/proofs/converters/interface.ts +363 -0
- package/src/proofs/converters/kimchi.ts +462 -0
- package/src/proofs/converters/noir.ts +451 -0
- package/src/proofs/fallback.ts +888 -0
- package/src/proofs/halo2.ts +42 -0
- package/src/proofs/index.ts +471 -0
- package/src/proofs/interface.ts +13 -0
- package/src/proofs/kimchi.ts +42 -0
- package/src/proofs/lazy.ts +1004 -0
- package/src/proofs/mock.ts +25 -1
- package/src/proofs/noir.ts +110 -29
- package/src/proofs/orchestrator.ts +960 -0
- package/src/proofs/parallel/concurrency.ts +297 -0
- package/src/proofs/parallel/dependency-graph.ts +602 -0
- package/src/proofs/parallel/executor.ts +420 -0
- package/src/proofs/parallel/index.ts +131 -0
- package/src/proofs/parallel/interface.ts +685 -0
- package/src/proofs/parallel/worker-pool.ts +644 -0
- package/src/proofs/providers/halo2.ts +560 -0
- package/src/proofs/providers/index.ts +34 -0
- package/src/proofs/providers/kimchi.ts +641 -0
- package/src/proofs/validator.ts +881 -0
- package/src/proofs/verifier.ts +867 -0
- package/src/quantum/index.ts +112 -0
- package/src/quantum/winternitz-vault.ts +639 -0
- package/src/quantum/wots.ts +611 -0
- package/src/settlement/backends/direct-chain.ts +1 -0
- package/src/settlement/index.ts +9 -0
- package/src/settlement/router.ts +732 -46
- package/src/solana/index.ts +72 -0
- package/src/solana/jito-relayer.ts +687 -0
- package/src/solana/noir-verifier-types.ts +430 -0
- package/src/solana/noir-verifier.ts +816 -0
- package/src/stealth/address-derivation.ts +193 -0
- package/src/stealth/ed25519.ts +431 -0
- package/src/stealth/index.ts +233 -0
- package/src/stealth/meta-address.ts +221 -0
- package/src/stealth/secp256k1.ts +368 -0
- package/src/stealth/utils.ts +194 -0
- package/src/stealth.ts +50 -1504
- package/src/sync/index.ts +106 -0
- package/src/sync/manager.ts +504 -0
- package/src/sync/mock-provider.ts +318 -0
- package/src/sync/oblivious.ts +625 -0
- package/src/tokens/index.ts +15 -0
- package/src/tokens/registry.ts +301 -0
- package/src/utils/deprecation.ts +94 -0
- package/src/utils/index.ts +9 -0
- package/src/wallet/ethereum/index.ts +68 -0
- package/src/wallet/ethereum/metamask-privacy.ts +420 -0
- package/src/wallet/ethereum/multi-wallet.ts +646 -0
- package/src/wallet/ethereum/privacy-adapter.ts +700 -0
- package/src/wallet/ethereum/types.ts +3 -1
- package/src/wallet/ethereum/walletconnect-adapter.ts +675 -0
- package/src/wallet/hardware/index.ts +10 -0
- package/src/wallet/hardware/ledger-privacy.ts +414 -0
- package/src/wallet/index.ts +71 -0
- package/src/wallet/near/adapter.ts +626 -0
- package/src/wallet/near/index.ts +86 -0
- package/src/wallet/near/meteor-wallet.ts +1153 -0
- package/src/wallet/near/my-near-wallet.ts +790 -0
- package/src/wallet/near/wallet-selector.ts +702 -0
- package/src/wallet/solana/adapter.ts +6 -4
- package/src/wallet/solana/index.ts +13 -0
- package/src/wallet/solana/privacy-adapter.ts +567 -0
- package/src/wallet/sui/types.ts +6 -4
- package/src/zcash/rpc-client.ts +13 -6
- package/dist/chunk-2XIVXWHA.mjs +0 -1930
- package/dist/chunk-3INS3PR5.mjs +0 -884
- package/dist/chunk-3OVABDRH.mjs +0 -17096
- package/dist/chunk-7RFRWDCW.mjs +0 -1504
- package/dist/chunk-DLDWZFYC.mjs +0 -1495
- package/dist/chunk-E6SZWREQ.mjs +0 -57
- package/dist/chunk-F6F73W35.mjs +0 -16166
- package/dist/chunk-G33LB27A.mjs +0 -16166
- package/dist/chunk-HGU6HZRC.mjs +0 -231
- package/dist/chunk-L2K34JCU.mjs +0 -1496
- package/dist/chunk-OFDBEIEK.mjs +0 -16166
- package/dist/chunk-SF7YSLF5.mjs +0 -1515
- package/dist/chunk-SN4ZDTVW.mjs +0 -16166
- package/dist/chunk-WWUSGOXE.mjs +0 -17129
- package/dist/constants-VOI7BSLK.mjs +0 -27
- package/dist/index-B71aXVzk.d.ts +0 -13264
- package/dist/index-BYZbDjal.d.ts +0 -11390
- package/dist/index-CHB3KuOB.d.mts +0 -11859
- package/dist/index-CzWPI6Le.d.ts +0 -11859
- package/dist/index-pOIIuwfV.d.mts +0 -13264
- package/dist/index-xbWjohNq.d.mts +0 -11390
- package/dist/solana-4O4K45VU.mjs +0 -46
- package/dist/solana-5EMCTPTS.mjs +0 -46
- package/dist/solana-NDABAZ6P.mjs +0 -56
- package/dist/solana-Q4NAVBTS.mjs +0 -46
- 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
|
-
|
|
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 =
|
|
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
|
-
//
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
131
|
-
|
|
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
|
|
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
|
-
//
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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 =
|
|
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
|
|
183
|
-
// Skip failed transaction parsing
|
|
184
|
-
|
|
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
|
|
189
|
-
|
|
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
|
|
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
|