@sip-protocol/sdk 0.7.2 → 0.7.4

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 (262) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +267 -0
  3. package/dist/{TransportWebUSB-TQ7WZ4LE.mjs → TransportWebUSB-YQMAGJAJ.mjs} +12 -9
  4. package/dist/browser.d.mts +10 -4
  5. package/dist/browser.d.ts +10 -4
  6. package/dist/browser.js +48874 -18336
  7. package/dist/browser.mjs +674 -48
  8. package/dist/chunk-4GRJ5MAW.mjs +152 -0
  9. package/dist/chunk-5D7A3L3W.mjs +717 -0
  10. package/dist/chunk-64AYA5F5.mjs +7834 -0
  11. package/dist/chunk-GMDGB22A.mjs +379 -0
  12. package/dist/chunk-I534WKN7.mjs +328 -0
  13. package/dist/chunk-IBZVA5Y7.mjs +1003 -0
  14. package/dist/chunk-PRRZAWJE.mjs +223 -0
  15. package/dist/{chunk-UJCSKKID.mjs → chunk-XGB3TDIC.mjs} +13 -1
  16. package/dist/chunk-YWGJ77A2.mjs +33806 -0
  17. package/dist/{chunk-6WGN57S2.mjs → chunk-Z3K7W5S3.mjs} +48 -0
  18. package/dist/constants-LHAAUC2T.mjs +51 -0
  19. package/dist/dist-2OGQ7FED.mjs +3957 -0
  20. package/dist/dist-IFHPYLDX.mjs +254 -0
  21. package/dist/fulfillment_proof-ANHVPKTB.mjs +21 -0
  22. package/dist/funding_proof-ICFZ5LHY.mjs +21 -0
  23. package/dist/index-DXh2IGkz.d.ts +24681 -0
  24. package/dist/index-DeE1ZzA4.d.mts +24681 -0
  25. package/dist/index.d.mts +9 -3
  26. package/dist/index.d.ts +9 -3
  27. package/dist/index.js +48676 -17318
  28. package/dist/index.mjs +583 -19
  29. package/dist/interface-Bf7w1PLW.d.mts +679 -0
  30. package/dist/interface-Bf7w1PLW.d.ts +679 -0
  31. package/dist/{noir-DKfEzWy9.d.mts → noir-kzbLVTei.d.mts} +31 -21
  32. package/dist/{noir-DKfEzWy9.d.ts → noir-kzbLVTei.d.ts} +31 -21
  33. package/dist/proofs/halo2.d.mts +151 -0
  34. package/dist/proofs/halo2.d.ts +151 -0
  35. package/dist/proofs/halo2.js +350 -0
  36. package/dist/proofs/halo2.mjs +11 -0
  37. package/dist/proofs/kimchi.d.mts +160 -0
  38. package/dist/proofs/kimchi.d.ts +160 -0
  39. package/dist/proofs/kimchi.js +431 -0
  40. package/dist/proofs/kimchi.mjs +13 -0
  41. package/dist/proofs/noir.d.mts +1 -1
  42. package/dist/proofs/noir.d.ts +1 -1
  43. package/dist/proofs/noir.js +74 -18
  44. package/dist/proofs/noir.mjs +84 -24
  45. package/dist/solana-U3MEGU7W.mjs +280 -0
  46. package/dist/validity_proof-3POXLPNY.mjs +21 -0
  47. package/package.json +54 -21
  48. package/src/adapters/index.ts +41 -0
  49. package/src/adapters/jupiter.ts +571 -0
  50. package/src/adapters/near-intents.ts +135 -0
  51. package/src/advisor/advisor.ts +653 -0
  52. package/src/advisor/index.ts +54 -0
  53. package/src/advisor/tools.ts +303 -0
  54. package/src/advisor/types.ts +164 -0
  55. package/src/chains/ethereum/announcement.ts +536 -0
  56. package/src/chains/ethereum/bnb-optimizations.ts +474 -0
  57. package/src/chains/ethereum/commitment.ts +522 -0
  58. package/src/chains/ethereum/constants.ts +462 -0
  59. package/src/chains/ethereum/deployment.ts +596 -0
  60. package/src/chains/ethereum/gas-estimation.ts +538 -0
  61. package/src/chains/ethereum/index.ts +268 -0
  62. package/src/chains/ethereum/optimizations.ts +614 -0
  63. package/src/chains/ethereum/privacy-adapter.ts +855 -0
  64. package/src/chains/ethereum/registry.ts +584 -0
  65. package/src/chains/ethereum/rpc.ts +905 -0
  66. package/src/chains/ethereum/stealth.ts +491 -0
  67. package/src/chains/ethereum/token.ts +790 -0
  68. package/src/chains/ethereum/transfer.ts +637 -0
  69. package/src/chains/ethereum/types.ts +456 -0
  70. package/src/chains/ethereum/viewing-key.ts +455 -0
  71. package/src/chains/near/commitment.ts +608 -0
  72. package/src/chains/near/constants.ts +284 -0
  73. package/src/chains/near/function-call.ts +871 -0
  74. package/src/chains/near/history.ts +654 -0
  75. package/src/chains/near/implicit-account.ts +840 -0
  76. package/src/chains/near/index.ts +393 -0
  77. package/src/chains/near/native-transfer.ts +658 -0
  78. package/src/chains/near/nep141.ts +775 -0
  79. package/src/chains/near/privacy-adapter.ts +889 -0
  80. package/src/chains/near/resolver.ts +971 -0
  81. package/src/chains/near/rpc.ts +1016 -0
  82. package/src/chains/near/stealth.ts +419 -0
  83. package/src/chains/near/types.ts +317 -0
  84. package/src/chains/near/viewing-key.ts +876 -0
  85. package/src/chains/solana/anchor-transfer.ts +386 -0
  86. package/src/chains/solana/commitment.ts +577 -0
  87. package/src/chains/solana/constants.ts +126 -12
  88. package/src/chains/solana/ephemeral-keys.ts +543 -0
  89. package/src/chains/solana/index.ts +276 -1
  90. package/src/chains/solana/key-derivation.ts +418 -0
  91. package/src/chains/solana/kit-compat.ts +334 -0
  92. package/src/chains/solana/optimizations.ts +560 -0
  93. package/src/chains/solana/privacy-adapter.ts +605 -0
  94. package/src/chains/solana/providers/generic.ts +201 -0
  95. package/src/chains/solana/providers/helius-enhanced-types.ts +336 -0
  96. package/src/chains/solana/providers/helius-enhanced.ts +623 -0
  97. package/src/chains/solana/providers/helius.ts +402 -0
  98. package/src/chains/solana/providers/index.ts +85 -0
  99. package/src/chains/solana/providers/interface.ts +221 -0
  100. package/src/chains/solana/providers/quicknode.ts +409 -0
  101. package/src/chains/solana/providers/triton.ts +426 -0
  102. package/src/chains/solana/providers/webhook.ts +790 -0
  103. package/src/chains/solana/rpc-client.ts +1150 -0
  104. package/src/chains/solana/scan.ts +170 -73
  105. package/src/chains/solana/sol-transfer.ts +732 -0
  106. package/src/chains/solana/spl-transfer.ts +886 -0
  107. package/src/chains/solana/stealth-scanner.ts +703 -0
  108. package/src/chains/solana/sunspot-verifier.ts +453 -0
  109. package/src/chains/solana/transaction-builder.ts +755 -0
  110. package/src/chains/solana/transfer.ts +74 -5
  111. package/src/chains/solana/types.ts +77 -7
  112. package/src/chains/solana/utils.ts +110 -0
  113. package/src/chains/solana/viewing-key.ts +807 -0
  114. package/src/compliance/fireblocks.ts +921 -0
  115. package/src/compliance/index.ts +37 -0
  116. package/src/compliance/range-sas.ts +956 -0
  117. package/src/config/endpoints.ts +100 -0
  118. package/src/crypto.ts +11 -8
  119. package/src/errors.ts +82 -0
  120. package/src/evm/erc4337-relayer.ts +830 -0
  121. package/src/evm/index.ts +47 -0
  122. package/src/fees/calculator.ts +396 -0
  123. package/src/fees/index.ts +87 -0
  124. package/src/fees/near-contract.ts +429 -0
  125. package/src/fees/types.ts +268 -0
  126. package/src/index.ts +785 -1
  127. package/src/intent.ts +6 -3
  128. package/src/logger.ts +324 -0
  129. package/src/network/index.ts +80 -0
  130. package/src/network/proxy.ts +691 -0
  131. package/src/optimizations/index.ts +541 -0
  132. package/src/oracle/types.ts +1 -0
  133. package/src/privacy-backends/arcium-types.ts +727 -0
  134. package/src/privacy-backends/arcium.ts +719 -0
  135. package/src/privacy-backends/combined-privacy.ts +866 -0
  136. package/src/privacy-backends/cspl-token.ts +595 -0
  137. package/src/privacy-backends/cspl-types.ts +512 -0
  138. package/src/privacy-backends/cspl.ts +907 -0
  139. package/src/privacy-backends/health.ts +488 -0
  140. package/src/privacy-backends/inco-types.ts +323 -0
  141. package/src/privacy-backends/inco.ts +616 -0
  142. package/src/privacy-backends/index.ts +336 -0
  143. package/src/privacy-backends/interface.ts +906 -0
  144. package/src/privacy-backends/lru-cache.ts +343 -0
  145. package/src/privacy-backends/magicblock.ts +458 -0
  146. package/src/privacy-backends/mock.ts +258 -0
  147. package/src/privacy-backends/privacycash-types.ts +278 -0
  148. package/src/privacy-backends/privacycash.ts +456 -0
  149. package/src/privacy-backends/private-swap.ts +570 -0
  150. package/src/privacy-backends/rate-limiter.ts +683 -0
  151. package/src/privacy-backends/registry.ts +690 -0
  152. package/src/privacy-backends/router.ts +626 -0
  153. package/src/privacy-backends/shadowwire.ts +449 -0
  154. package/src/privacy-backends/sip-native.ts +256 -0
  155. package/src/privacy-logger.ts +191 -0
  156. package/src/production-safety.ts +373 -0
  157. package/src/proofs/aggregator.ts +1029 -0
  158. package/src/proofs/browser-composer.ts +1150 -0
  159. package/src/proofs/browser.ts +113 -25
  160. package/src/proofs/cache/index.ts +127 -0
  161. package/src/proofs/cache/interface.ts +545 -0
  162. package/src/proofs/cache/key-generator.ts +188 -0
  163. package/src/proofs/cache/lru-cache.ts +481 -0
  164. package/src/proofs/cache/multi-tier-cache.ts +575 -0
  165. package/src/proofs/cache/persistent-cache.ts +788 -0
  166. package/src/proofs/compliance-proof.ts +872 -0
  167. package/src/proofs/composer/base.ts +923 -0
  168. package/src/proofs/composer/index.ts +25 -0
  169. package/src/proofs/composer/interface.ts +518 -0
  170. package/src/proofs/composer/types.ts +383 -0
  171. package/src/proofs/converters/halo2.ts +452 -0
  172. package/src/proofs/converters/index.ts +208 -0
  173. package/src/proofs/converters/interface.ts +363 -0
  174. package/src/proofs/converters/kimchi.ts +462 -0
  175. package/src/proofs/converters/noir.ts +451 -0
  176. package/src/proofs/fallback.ts +888 -0
  177. package/src/proofs/halo2.ts +42 -0
  178. package/src/proofs/index.ts +471 -0
  179. package/src/proofs/interface.ts +13 -0
  180. package/src/proofs/kimchi.ts +42 -0
  181. package/src/proofs/lazy.ts +1004 -0
  182. package/src/proofs/mock.ts +25 -1
  183. package/src/proofs/noir.ts +111 -30
  184. package/src/proofs/orchestrator.ts +960 -0
  185. package/src/proofs/parallel/concurrency.ts +297 -0
  186. package/src/proofs/parallel/dependency-graph.ts +602 -0
  187. package/src/proofs/parallel/executor.ts +420 -0
  188. package/src/proofs/parallel/index.ts +131 -0
  189. package/src/proofs/parallel/interface.ts +685 -0
  190. package/src/proofs/parallel/worker-pool.ts +644 -0
  191. package/src/proofs/providers/halo2.ts +560 -0
  192. package/src/proofs/providers/index.ts +34 -0
  193. package/src/proofs/providers/kimchi.ts +641 -0
  194. package/src/proofs/validator.ts +881 -0
  195. package/src/proofs/verifier.ts +867 -0
  196. package/src/quantum/index.ts +112 -0
  197. package/src/quantum/winternitz-vault.ts +639 -0
  198. package/src/quantum/wots.ts +611 -0
  199. package/src/settlement/backends/direct-chain.ts +1 -0
  200. package/src/settlement/index.ts +9 -0
  201. package/src/settlement/router.ts +732 -46
  202. package/src/solana/index.ts +72 -0
  203. package/src/solana/jito-relayer.ts +687 -0
  204. package/src/solana/noir-verifier-types.ts +430 -0
  205. package/src/solana/noir-verifier.ts +816 -0
  206. package/src/stealth/address-derivation.ts +193 -0
  207. package/src/stealth/ed25519.ts +431 -0
  208. package/src/stealth/index.ts +233 -0
  209. package/src/stealth/meta-address.ts +221 -0
  210. package/src/stealth/secp256k1.ts +368 -0
  211. package/src/stealth/utils.ts +194 -0
  212. package/src/stealth.ts +50 -1504
  213. package/src/surveillance/algorithms/address-reuse.ts +143 -0
  214. package/src/surveillance/algorithms/cluster.ts +247 -0
  215. package/src/surveillance/algorithms/exchange.ts +295 -0
  216. package/src/surveillance/algorithms/temporal.ts +337 -0
  217. package/src/surveillance/analyzer.ts +442 -0
  218. package/src/surveillance/index.ts +64 -0
  219. package/src/surveillance/scoring.ts +372 -0
  220. package/src/surveillance/types.ts +264 -0
  221. package/src/sync/index.ts +106 -0
  222. package/src/sync/manager.ts +504 -0
  223. package/src/sync/mock-provider.ts +318 -0
  224. package/src/sync/oblivious.ts +625 -0
  225. package/src/tokens/index.ts +15 -0
  226. package/src/tokens/registry.ts +301 -0
  227. package/src/utils/deprecation.ts +94 -0
  228. package/src/utils/index.ts +9 -0
  229. package/src/wallet/ethereum/index.ts +68 -0
  230. package/src/wallet/ethereum/metamask-privacy.ts +420 -0
  231. package/src/wallet/ethereum/multi-wallet.ts +646 -0
  232. package/src/wallet/ethereum/privacy-adapter.ts +700 -0
  233. package/src/wallet/ethereum/types.ts +3 -1
  234. package/src/wallet/ethereum/walletconnect-adapter.ts +675 -0
  235. package/src/wallet/hardware/index.ts +10 -0
  236. package/src/wallet/hardware/ledger-privacy.ts +414 -0
  237. package/src/wallet/index.ts +71 -0
  238. package/src/wallet/near/adapter.ts +626 -0
  239. package/src/wallet/near/index.ts +86 -0
  240. package/src/wallet/near/meteor-wallet.ts +1153 -0
  241. package/src/wallet/near/my-near-wallet.ts +790 -0
  242. package/src/wallet/near/wallet-selector.ts +702 -0
  243. package/src/wallet/solana/adapter.ts +6 -4
  244. package/src/wallet/solana/index.ts +13 -0
  245. package/src/wallet/solana/privacy-adapter.ts +567 -0
  246. package/src/wallet/sui/types.ts +6 -4
  247. package/src/zcash/rpc-client.ts +13 -6
  248. package/dist/chunk-3INS3PR5.mjs +0 -884
  249. package/dist/chunk-3OVABDRH.mjs +0 -17096
  250. package/dist/chunk-DLDWZFYC.mjs +0 -1495
  251. package/dist/chunk-E6SZWREQ.mjs +0 -57
  252. package/dist/chunk-G33LB27A.mjs +0 -16166
  253. package/dist/chunk-HGU6HZRC.mjs +0 -231
  254. package/dist/chunk-L2K34JCU.mjs +0 -1496
  255. package/dist/chunk-SN4ZDTVW.mjs +0 -16166
  256. package/dist/constants-VOI7BSLK.mjs +0 -27
  257. package/dist/index-BYZbDjal.d.ts +0 -11390
  258. package/dist/index-CHB3KuOB.d.mts +0 -11859
  259. package/dist/index-CzWPI6Le.d.ts +0 -11859
  260. package/dist/index-xbWjohNq.d.mts +0 -11390
  261. package/dist/solana-5EMCTPTS.mjs +0 -46
  262. package/dist/solana-Q4NAVBTS.mjs +0 -46
@@ -0,0 +1,343 @@
1
+ /**
2
+ * LRU (Least Recently Used) Cache Implementation
3
+ *
4
+ * A generic, efficient LRU cache with configurable max size and optional TTL.
5
+ * Automatically evicts the least recently used entries when the cache is full.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // Basic usage with max size
10
+ * const cache = new LRUCache<string, User>({ maxSize: 100 })
11
+ * cache.set('user:123', user)
12
+ * const cached = cache.get('user:123')
13
+ *
14
+ * // With TTL expiration (5 minutes)
15
+ * const cacheWithTTL = new LRUCache<string, Balance>({
16
+ * maxSize: 1000,
17
+ * ttl: 5 * 60 * 1000,
18
+ * })
19
+ * ```
20
+ *
21
+ * @see https://en.wikipedia.org/wiki/Cache_replacement_policies#Least_recently_used_(LRU)
22
+ */
23
+
24
+ /**
25
+ * Configuration options for LRU cache
26
+ */
27
+ export interface LRUCacheConfig {
28
+ /**
29
+ * Maximum number of entries to store.
30
+ * When exceeded, the least recently used entry is evicted.
31
+ *
32
+ * @default 1000
33
+ */
34
+ maxSize?: number
35
+
36
+ /**
37
+ * Time-to-live in milliseconds for cache entries.
38
+ * Entries older than this are considered expired and will be evicted.
39
+ * If not set, entries never expire based on time.
40
+ *
41
+ * @default undefined (no TTL)
42
+ */
43
+ ttl?: number
44
+
45
+ /**
46
+ * Called when an entry is evicted from the cache.
47
+ * Useful for cleanup operations or logging.
48
+ */
49
+ onEvict?: (key: string, value: unknown) => void
50
+ }
51
+
52
+ /**
53
+ * Internal cache entry with metadata
54
+ */
55
+ interface CacheEntry<V> {
56
+ /** The cached value */
57
+ value: V
58
+ /** Timestamp when entry was created/updated */
59
+ createdAt: number
60
+ }
61
+
62
+ /**
63
+ * LRU Cache Statistics
64
+ */
65
+ export interface LRUCacheStats {
66
+ /** Current number of entries */
67
+ size: number
68
+ /** Maximum allowed entries */
69
+ maxSize: number
70
+ /** Number of cache hits */
71
+ hits: number
72
+ /** Number of cache misses */
73
+ misses: number
74
+ /** Hit rate as a percentage (0-100) */
75
+ hitRate: number
76
+ /** Number of entries evicted */
77
+ evictions: number
78
+ }
79
+
80
+ /**
81
+ * LRU (Least Recently Used) Cache
82
+ *
83
+ * Efficient O(1) get/set operations using Map iteration order.
84
+ * When the cache exceeds maxSize, the oldest (least recently used) entries
85
+ * are automatically evicted.
86
+ *
87
+ * @typeParam K - Key type (must be a valid Map key)
88
+ * @typeParam V - Value type
89
+ */
90
+ export class LRUCache<K extends string, V> {
91
+ private cache: Map<K, CacheEntry<V>> = new Map()
92
+ private readonly config: Required<Pick<LRUCacheConfig, 'maxSize'>> & LRUCacheConfig
93
+ private stats = { hits: 0, misses: 0, evictions: 0 }
94
+
95
+ /**
96
+ * Create a new LRU cache
97
+ *
98
+ * @param config - Cache configuration
99
+ */
100
+ constructor(config: LRUCacheConfig = {}) {
101
+ this.config = {
102
+ maxSize: config.maxSize ?? 1000,
103
+ ttl: config.ttl,
104
+ onEvict: config.onEvict,
105
+ }
106
+
107
+ if (this.config.maxSize < 1) {
108
+ throw new Error('maxSize must be at least 1')
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Get a value from the cache
114
+ *
115
+ * If the entry exists and hasn't expired, it's moved to the end
116
+ * of the cache (most recently used position).
117
+ *
118
+ * @param key - Cache key
119
+ * @returns The cached value, or undefined if not found/expired
120
+ */
121
+ get(key: K): V | undefined {
122
+ const entry = this.cache.get(key)
123
+
124
+ if (!entry) {
125
+ this.stats.misses++
126
+ return undefined
127
+ }
128
+
129
+ // Check TTL expiration
130
+ if (this.isExpired(entry)) {
131
+ this.delete(key)
132
+ this.stats.misses++
133
+ return undefined
134
+ }
135
+
136
+ // Move to end (most recently used) by re-inserting
137
+ this.cache.delete(key)
138
+ this.cache.set(key, entry)
139
+
140
+ this.stats.hits++
141
+ return entry.value
142
+ }
143
+
144
+ /**
145
+ * Check if a key exists in the cache (without updating LRU order)
146
+ *
147
+ * @param key - Cache key
148
+ * @returns True if key exists and hasn't expired
149
+ */
150
+ has(key: K): boolean {
151
+ const entry = this.cache.get(key)
152
+ if (!entry) return false
153
+
154
+ if (this.isExpired(entry)) {
155
+ this.delete(key)
156
+ return false
157
+ }
158
+
159
+ return true
160
+ }
161
+
162
+ /**
163
+ * Set a value in the cache
164
+ *
165
+ * If the cache is at capacity, the least recently used entry
166
+ * is evicted before adding the new entry.
167
+ *
168
+ * @param key - Cache key
169
+ * @param value - Value to cache
170
+ */
171
+ set(key: K, value: V): void {
172
+ // Delete existing entry to update LRU order
173
+ if (this.cache.has(key)) {
174
+ this.cache.delete(key)
175
+ }
176
+
177
+ // Evict oldest entries if at capacity
178
+ while (this.cache.size >= this.config.maxSize) {
179
+ this.evictOldest()
180
+ }
181
+
182
+ // Add new entry at end (most recently used)
183
+ this.cache.set(key, {
184
+ value,
185
+ createdAt: Date.now(),
186
+ })
187
+ }
188
+
189
+ /**
190
+ * Delete an entry from the cache
191
+ *
192
+ * @param key - Cache key
193
+ * @returns True if the entry was deleted
194
+ */
195
+ delete(key: K): boolean {
196
+ const entry = this.cache.get(key)
197
+ if (!entry) return false
198
+
199
+ this.cache.delete(key)
200
+
201
+ if (this.config.onEvict) {
202
+ this.config.onEvict(key, entry.value)
203
+ }
204
+
205
+ return true
206
+ }
207
+
208
+ /**
209
+ * Clear all entries from the cache
210
+ */
211
+ clear(): void {
212
+ if (this.config.onEvict) {
213
+ for (const [key, entry] of this.cache) {
214
+ this.config.onEvict(key, entry.value)
215
+ }
216
+ }
217
+ this.cache.clear()
218
+ }
219
+
220
+ /**
221
+ * Get the current number of entries
222
+ */
223
+ get size(): number {
224
+ return this.cache.size
225
+ }
226
+
227
+ /**
228
+ * Get all keys in the cache (in LRU order, oldest first)
229
+ */
230
+ keys(): IterableIterator<K> {
231
+ return this.cache.keys()
232
+ }
233
+
234
+ /**
235
+ * Get all values in the cache (in LRU order, oldest first)
236
+ */
237
+ values(): V[] {
238
+ return Array.from(this.cache.values()).map(entry => entry.value)
239
+ }
240
+
241
+ /**
242
+ * Get cache statistics
243
+ *
244
+ * @returns Cache stats including hit rate and eviction count
245
+ */
246
+ getStats(): LRUCacheStats {
247
+ const totalAccesses = this.stats.hits + this.stats.misses
248
+ return {
249
+ size: this.cache.size,
250
+ maxSize: this.config.maxSize,
251
+ hits: this.stats.hits,
252
+ misses: this.stats.misses,
253
+ hitRate: totalAccesses > 0 ? (this.stats.hits / totalAccesses) * 100 : 0,
254
+ evictions: this.stats.evictions,
255
+ }
256
+ }
257
+
258
+ /**
259
+ * Reset cache statistics
260
+ */
261
+ resetStats(): void {
262
+ this.stats = { hits: 0, misses: 0, evictions: 0 }
263
+ }
264
+
265
+ /**
266
+ * Prune expired entries from the cache
267
+ *
268
+ * This is automatically called during get(), but can be called
269
+ * manually to clean up expired entries proactively.
270
+ *
271
+ * @returns Number of entries pruned
272
+ */
273
+ prune(): number {
274
+ if (!this.config.ttl) return 0
275
+
276
+ let pruned = 0
277
+ const now = Date.now()
278
+
279
+ for (const [key, entry] of this.cache) {
280
+ if (now - entry.createdAt > this.config.ttl) {
281
+ this.delete(key)
282
+ pruned++
283
+ }
284
+ }
285
+
286
+ return pruned
287
+ }
288
+
289
+ // ─── Private Methods ────────────────────────────────────────────────────────
290
+
291
+ /**
292
+ * Check if an entry has expired based on TTL
293
+ */
294
+ private isExpired(entry: CacheEntry<V>): boolean {
295
+ if (!this.config.ttl) return false
296
+ return Date.now() - entry.createdAt > this.config.ttl
297
+ }
298
+
299
+ /**
300
+ * Evict the oldest (least recently used) entry
301
+ */
302
+ private evictOldest(): void {
303
+ // Map iteration order is insertion order, so first entry is oldest
304
+ const oldestKey = this.cache.keys().next().value
305
+ if (oldestKey !== undefined) {
306
+ const entry = this.cache.get(oldestKey)
307
+ this.cache.delete(oldestKey)
308
+ this.stats.evictions++
309
+
310
+ if (this.config.onEvict && entry) {
311
+ this.config.onEvict(oldestKey, entry.value)
312
+ }
313
+ }
314
+ }
315
+ }
316
+
317
+ /**
318
+ * Default cache sizes for different use cases
319
+ */
320
+ export const DEFAULT_CACHE_SIZES = {
321
+ /** Token accounts cache */
322
+ TOKEN_ACCOUNTS: 1000,
323
+ /** Balance cache */
324
+ BALANCES: 500,
325
+ /** Computation cache */
326
+ COMPUTATIONS: 100,
327
+ /** Pool info cache */
328
+ POOLS: 50,
329
+ } as const
330
+
331
+ /**
332
+ * Default TTL values in milliseconds
333
+ */
334
+ export const DEFAULT_CACHE_TTL = {
335
+ /** Token accounts: 5 minutes */
336
+ TOKEN_ACCOUNTS: 5 * 60 * 1000,
337
+ /** Balances: 30 seconds (balances change frequently) */
338
+ BALANCES: 30 * 1000,
339
+ /** Computations: 10 minutes */
340
+ COMPUTATIONS: 10 * 60 * 1000,
341
+ /** Pool info: 1 minute */
342
+ POOLS: 60 * 1000,
343
+ } as const