@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
@@ -0,0 +1,301 @@
1
+ /**
2
+ * Token Registry - Lookup token metadata by symbol or address
3
+ *
4
+ * This module provides a centralized registry for token metadata,
5
+ * ensuring correct decimals are used throughout the protocol.
6
+ *
7
+ * CRITICAL: Never hardcode decimals (e.g., `decimals: 9`).
8
+ * Always use this registry to get the correct decimals for a token.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * import { getTokenDecimals, getAsset } from '@sip-protocol/sdk'
13
+ *
14
+ * // Get decimals for USDC on Solana
15
+ * const decimals = getTokenDecimals('USDC', 'solana') // Returns 6, not 9!
16
+ *
17
+ * // Get full asset info
18
+ * const asset = getAsset('SOL', 'solana')
19
+ * // { chain: 'solana', symbol: 'SOL', address: null, decimals: 9 }
20
+ * ```
21
+ */
22
+
23
+ import type { Asset, ChainId, HexString } from '@sip-protocol/types'
24
+ import { NATIVE_TOKENS } from '@sip-protocol/types'
25
+ import { ValidationError, ErrorCode } from '../errors'
26
+
27
+ /**
28
+ * Extended token metadata with optional fields
29
+ */
30
+ export interface TokenMetadata extends Asset {
31
+ /** Common name (e.g., "USD Coin", "Tether") */
32
+ name?: string
33
+ /** Logo URL */
34
+ logoUri?: string
35
+ /** Whether this is a stablecoin */
36
+ isStablecoin?: boolean
37
+ }
38
+
39
+ /**
40
+ * Well-known SPL tokens on Solana with verified decimals
41
+ */
42
+ const SOLANA_TOKENS: TokenMetadata[] = [
43
+ // Native
44
+ { chain: 'solana', symbol: 'SOL', address: null, decimals: 9, name: 'Solana' },
45
+ // Stablecoins
46
+ {
47
+ chain: 'solana',
48
+ symbol: 'USDC',
49
+ address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v' as HexString,
50
+ decimals: 6,
51
+ name: 'USD Coin',
52
+ isStablecoin: true,
53
+ },
54
+ {
55
+ chain: 'solana',
56
+ symbol: 'USDT',
57
+ address: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB' as HexString,
58
+ decimals: 6,
59
+ name: 'Tether USD',
60
+ isStablecoin: true,
61
+ },
62
+ // Wrapped tokens
63
+ {
64
+ chain: 'solana',
65
+ symbol: 'WBTC',
66
+ address: '3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh' as HexString,
67
+ decimals: 8,
68
+ name: 'Wrapped Bitcoin',
69
+ },
70
+ {
71
+ chain: 'solana',
72
+ symbol: 'WETH',
73
+ address: '7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs' as HexString,
74
+ decimals: 8,
75
+ name: 'Wrapped Ether',
76
+ },
77
+ // Popular DeFi tokens
78
+ {
79
+ chain: 'solana',
80
+ symbol: 'RAY',
81
+ address: '4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R' as HexString,
82
+ decimals: 6,
83
+ name: 'Raydium',
84
+ },
85
+ {
86
+ chain: 'solana',
87
+ symbol: 'JUP',
88
+ address: 'JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN' as HexString,
89
+ decimals: 6,
90
+ name: 'Jupiter',
91
+ },
92
+ {
93
+ chain: 'solana',
94
+ symbol: 'BONK',
95
+ address: 'DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263' as HexString,
96
+ decimals: 5,
97
+ name: 'Bonk',
98
+ },
99
+ ]
100
+
101
+ /**
102
+ * Well-known ERC-20 tokens on Ethereum with verified decimals
103
+ */
104
+ const ETHEREUM_TOKENS: TokenMetadata[] = [
105
+ // Native
106
+ { chain: 'ethereum', symbol: 'ETH', address: null, decimals: 18, name: 'Ether' },
107
+ // Stablecoins
108
+ {
109
+ chain: 'ethereum',
110
+ symbol: 'USDC',
111
+ address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as HexString,
112
+ decimals: 6,
113
+ name: 'USD Coin',
114
+ isStablecoin: true,
115
+ },
116
+ {
117
+ chain: 'ethereum',
118
+ symbol: 'USDT',
119
+ address: '0xdAC17F958D2ee523a2206206994597C13D831ec7' as HexString,
120
+ decimals: 6,
121
+ name: 'Tether USD',
122
+ isStablecoin: true,
123
+ },
124
+ {
125
+ chain: 'ethereum',
126
+ symbol: 'DAI',
127
+ address: '0x6B175474E89094C44Da98b954EescdeCB5BE3830' as HexString,
128
+ decimals: 18,
129
+ name: 'Dai Stablecoin',
130
+ isStablecoin: true,
131
+ },
132
+ // Wrapped tokens
133
+ {
134
+ chain: 'ethereum',
135
+ symbol: 'WBTC',
136
+ address: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599' as HexString,
137
+ decimals: 8,
138
+ name: 'Wrapped Bitcoin',
139
+ },
140
+ {
141
+ chain: 'ethereum',
142
+ symbol: 'WETH',
143
+ address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2' as HexString,
144
+ decimals: 18,
145
+ name: 'Wrapped Ether',
146
+ },
147
+ ]
148
+
149
+ /**
150
+ * Combined token registry indexed by chain
151
+ */
152
+ const TOKEN_REGISTRY: Map<ChainId, TokenMetadata[]> = new Map([
153
+ ['solana', SOLANA_TOKENS],
154
+ ['ethereum', ETHEREUM_TOKENS],
155
+ // Other chains use NATIVE_TOKENS only for now
156
+ ])
157
+
158
+ /**
159
+ * Get token decimals by symbol and chain
160
+ *
161
+ * @param symbol - Token symbol (e.g., 'USDC', 'SOL', 'ETH')
162
+ * @param chain - Chain identifier
163
+ * @returns Number of decimals for the token
164
+ * @throws {ValidationError} If token is unknown
165
+ *
166
+ * @example
167
+ * ```typescript
168
+ * // Correct usage - always lookup decimals
169
+ * const decimals = getTokenDecimals('USDC', 'solana') // 6
170
+ * const solDecimals = getTokenDecimals('SOL', 'solana') // 9
171
+ * const ethDecimals = getTokenDecimals('ETH', 'ethereum') // 18
172
+ *
173
+ * // This prevents the common bug of hardcoding 9:
174
+ * // WRONG: decimals: 9
175
+ * // RIGHT: decimals: getTokenDecimals(symbol, chain)
176
+ * ```
177
+ */
178
+ export function getTokenDecimals(symbol: string, chain: ChainId): number {
179
+ const token = findToken(symbol, chain)
180
+ if (!token) {
181
+ throw new ValidationError(
182
+ `Unknown token: ${symbol} on ${chain}. Register it in the token registry.`,
183
+ 'symbol',
184
+ undefined,
185
+ ErrorCode.TOKEN_NOT_FOUND
186
+ )
187
+ }
188
+ return token.decimals
189
+ }
190
+
191
+ /**
192
+ * Get full asset info by symbol and chain
193
+ *
194
+ * @param symbol - Token symbol (e.g., 'USDC', 'SOL', 'ETH')
195
+ * @param chain - Chain identifier
196
+ * @returns Asset object with all metadata
197
+ * @throws {ValidationError} If token is unknown
198
+ */
199
+ export function getAsset(symbol: string, chain: ChainId): Asset {
200
+ const token = findToken(symbol, chain)
201
+ if (!token) {
202
+ throw new ValidationError(
203
+ `Unknown token: ${symbol} on ${chain}. Register it in the token registry.`,
204
+ 'symbol',
205
+ undefined,
206
+ ErrorCode.TOKEN_NOT_FOUND
207
+ )
208
+ }
209
+ return {
210
+ chain: token.chain,
211
+ symbol: token.symbol,
212
+ address: token.address,
213
+ decimals: token.decimals,
214
+ }
215
+ }
216
+
217
+ /**
218
+ * Get native token asset for a chain
219
+ *
220
+ * @param chain - Chain identifier
221
+ * @returns Native token asset (SOL for Solana, ETH for Ethereum, etc.)
222
+ * @throws {ValidationError} If chain is not supported
223
+ */
224
+ export function getNativeToken(chain: ChainId): Asset {
225
+ const native = NATIVE_TOKENS[chain]
226
+ if (!native) {
227
+ throw new ValidationError(
228
+ `No native token defined for chain: ${chain}`,
229
+ 'chain',
230
+ undefined,
231
+ ErrorCode.UNSUPPORTED_CHAIN
232
+ )
233
+ }
234
+ return native
235
+ }
236
+
237
+ /**
238
+ * Get token by contract address
239
+ *
240
+ * @param address - Token contract address
241
+ * @param chain - Chain identifier
242
+ * @returns Token metadata or null if not found
243
+ */
244
+ export function getTokenByAddress(address: string, chain: ChainId): TokenMetadata | null {
245
+ const tokens = TOKEN_REGISTRY.get(chain) || []
246
+ return tokens.find(t => t.address?.toLowerCase() === address.toLowerCase()) || null
247
+ }
248
+
249
+ /**
250
+ * Check if a token is registered in the registry
251
+ *
252
+ * @param symbol - Token symbol
253
+ * @param chain - Chain identifier
254
+ * @returns true if token is known, false otherwise
255
+ */
256
+ export function isKnownToken(symbol: string, chain: ChainId): boolean {
257
+ return findToken(symbol, chain) !== null
258
+ }
259
+
260
+ /**
261
+ * Get all registered tokens for a chain
262
+ *
263
+ * @param chain - Chain identifier
264
+ * @returns Array of token metadata
265
+ */
266
+ export function getTokensForChain(chain: ChainId): TokenMetadata[] {
267
+ const tokens = TOKEN_REGISTRY.get(chain)
268
+ if (tokens) {
269
+ return [...tokens]
270
+ }
271
+
272
+ // Fall back to native token only
273
+ const native = NATIVE_TOKENS[chain]
274
+ if (native) {
275
+ return [{ ...native }]
276
+ }
277
+
278
+ return []
279
+ }
280
+
281
+ /**
282
+ * Internal: Find token in registry
283
+ */
284
+ function findToken(symbol: string, chain: ChainId): TokenMetadata | null {
285
+ const upperSymbol = symbol.toUpperCase()
286
+
287
+ // Check chain-specific registry first
288
+ const chainTokens = TOKEN_REGISTRY.get(chain)
289
+ if (chainTokens) {
290
+ const found = chainTokens.find(t => t.symbol.toUpperCase() === upperSymbol)
291
+ if (found) return found
292
+ }
293
+
294
+ // Fall back to native tokens
295
+ const native = NATIVE_TOKENS[chain]
296
+ if (native && native.symbol.toUpperCase() === upperSymbol) {
297
+ return { ...native }
298
+ }
299
+
300
+ return null
301
+ }
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Deprecation Warning Utility
3
+ *
4
+ * Provides a consistent way to handle deprecation warnings that:
5
+ * - Logs each warning only once per session (no spam)
6
+ * - Can be suppressed via environment variable
7
+ * - Uses consistent message format with removal date
8
+ *
9
+ * @module utils/deprecation
10
+ */
11
+
12
+ import { createLogger } from '../logger'
13
+
14
+ const log = createLogger('deprecation')
15
+
16
+ /** Set of warning IDs that have already been emitted */
17
+ const warnedIds = new Set<string>()
18
+
19
+ /**
20
+ * Check if deprecation warnings should be suppressed
21
+ *
22
+ * Set SIP_SUPPRESS_DEPRECATION=true to disable all warnings
23
+ */
24
+ const isSuppressed = (): boolean => {
25
+ // Check both process.env and global (for browser compatibility)
26
+ if (typeof process !== 'undefined' && process.env?.SIP_SUPPRESS_DEPRECATION === 'true') {
27
+ return true
28
+ }
29
+ return false
30
+ }
31
+
32
+ /**
33
+ * Emit a deprecation warning (once per function)
34
+ *
35
+ * @param id - Unique identifier for this deprecation (e.g., 'createCommitment')
36
+ * @param message - Warning message to display
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * export function oldFunction() {
41
+ * warnOnce('oldFunction', 'oldFunction() is deprecated. Use newFunction() instead.')
42
+ * // ... implementation
43
+ * }
44
+ * ```
45
+ */
46
+ export function warnOnce(id: string, message: string): void {
47
+ if (isSuppressed()) return
48
+ if (warnedIds.has(id)) return
49
+
50
+ warnedIds.add(id)
51
+ log.warn({ deprecationId: id }, message)
52
+ }
53
+
54
+ /**
55
+ * Create a standard deprecation message
56
+ *
57
+ * @param funcName - Name of the deprecated function
58
+ * @param replacement - Name of the replacement function/module
59
+ * @param removalDate - Date when the function will be removed (YYYY-MM-DD)
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * warnOnce('createCommitment', deprecationMessage(
64
+ * 'createCommitment()',
65
+ * 'commit() from "./commitment"',
66
+ * '2026-06-01'
67
+ * ))
68
+ * ```
69
+ */
70
+ export function deprecationMessage(
71
+ funcName: string,
72
+ replacement: string,
73
+ removalDate: string = '2026-06-01'
74
+ ): string {
75
+ return `${funcName} is deprecated and will be removed after ${removalDate}. Use ${replacement} instead.`
76
+ }
77
+
78
+ /**
79
+ * Reset warning state (for testing only)
80
+ *
81
+ * @internal
82
+ */
83
+ export function _resetWarnings(): void {
84
+ warnedIds.clear()
85
+ }
86
+
87
+ /**
88
+ * Check if a warning has been emitted (for testing only)
89
+ *
90
+ * @internal
91
+ */
92
+ export function _hasWarned(id: string): boolean {
93
+ return warnedIds.has(id)
94
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * SDK Utilities
3
+ *
4
+ * Internal utilities used throughout the SDK.
5
+ *
6
+ * @module utils
7
+ */
8
+
9
+ export { warnOnce, deprecationMessage, _resetWarnings, _hasWarned } from './deprecation'
@@ -7,6 +7,74 @@
7
7
  // Adapter
8
8
  export { EthereumWalletAdapter, createEthereumAdapter } from './adapter'
9
9
 
10
+ // Privacy Adapter
11
+ export {
12
+ PrivacyEthereumWalletAdapter,
13
+ createPrivacyEthereumAdapter,
14
+ type PrivacyEthereumAdapterConfig,
15
+ type EthereumStealthKeyMaterial,
16
+ type EthereumScannedPayment,
17
+ type EthereumClaimResult,
18
+ type PrivacyContext,
19
+ } from './privacy-adapter'
20
+
21
+ // Multi-Wallet Privacy Adapter (Rabby, Rainbow, etc.)
22
+ export {
23
+ MultiWalletPrivacyAdapter,
24
+ createMultiWalletAdapter,
25
+ createRabbyPrivacyAdapter,
26
+ createRainbowPrivacyAdapter,
27
+ detectWallets,
28
+ isWalletInstalled,
29
+ getWalletProvider,
30
+ type WalletType,
31
+ type DetectedWallet,
32
+ type MultiWalletConfig,
33
+ type WalletConnectionOptions,
34
+ type EIP1193Provider as MultiWalletEIP1193Provider,
35
+ } from './multi-wallet'
36
+
37
+ // WalletConnect Privacy Adapter
38
+ export {
39
+ WalletConnectPrivacyAdapter,
40
+ createWalletConnectPrivacyAdapter,
41
+ type WalletConnectAdapterConfig,
42
+ type WalletConnectSession,
43
+ type WalletConnectResult,
44
+ type PairingUri,
45
+ } from './walletconnect-adapter'
46
+
47
+ // MetaMask Privacy Utilities
48
+ export {
49
+ // Factory
50
+ createMetaMaskPrivacyAdapter,
51
+ isMetaMaskAdapter,
52
+ // Detection
53
+ isMetaMaskInstalled,
54
+ isMetaMaskFlaskInstalled,
55
+ getMetaMaskVersion,
56
+ // Message building
57
+ buildKeyDerivationMessage,
58
+ buildKeyDerivationTypedData,
59
+ buildViewKeyShareTypedData,
60
+ createSigningContext,
61
+ // Signature parsing
62
+ parseSignature,
63
+ toCompactSignature,
64
+ // Constants
65
+ DEFAULT_SIP_DOMAIN,
66
+ PRIVACY_OPERATION_DESCRIPTIONS,
67
+ KEY_DERIVATION_TYPES,
68
+ STEALTH_TRANSFER_TYPES,
69
+ VIEW_KEY_SHARE_TYPES,
70
+ // Types
71
+ type MetaMaskSigningMethod,
72
+ type PrivacyOperationType,
73
+ type PrivacySigningContext,
74
+ type MetaMaskSigningRequest,
75
+ type SIPDomainConfig,
76
+ } from './metamask-privacy'
77
+
10
78
  // Mock adapter for testing
11
79
  export {
12
80
  MockEthereumAdapter,