@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,414 @@
1
+ /**
2
+ * Ledger Privacy Wallet Adapter
3
+ *
4
+ * Extends the Ledger wallet adapter with privacy features for
5
+ * Ethereum stealth address operations.
6
+ *
7
+ * @module wallet/hardware/ledger-privacy
8
+ */
9
+
10
+ import { secp256k1 } from '@noble/curves/secp256k1'
11
+ import { sha256 } from '@noble/hashes/sha256'
12
+ import { bytesToHex, hexToBytes } from '@noble/hashes/utils'
13
+ import type { HexString, StealthMetaAddress, StealthAddress } from '@sip-protocol/types'
14
+ import { WalletErrorCode } from '@sip-protocol/types'
15
+ import { WalletError } from '../errors'
16
+ import { LedgerWalletAdapter } from './ledger'
17
+ import {
18
+ type LedgerConfig,
19
+ type HardwareAccount,
20
+ HardwareErrorCode,
21
+ HardwareWalletError,
22
+ } from './types'
23
+ import {
24
+ generateEthereumStealthAddress,
25
+ deriveEthereumStealthPrivateKey,
26
+ checkEthereumStealthAddress,
27
+ encodeEthereumStealthMetaAddress,
28
+ } from '../../chains/ethereum/stealth'
29
+
30
+ // ─── Types ──────────────────────────────────────────────────────────────────
31
+
32
+ /**
33
+ * Privacy Ledger adapter configuration
34
+ */
35
+ export interface LedgerPrivacyConfig extends Omit<LedgerConfig, 'chain'> {
36
+ /**
37
+ * Domain for key derivation message
38
+ * Used to generate deterministic privacy keys
39
+ */
40
+ derivationDomain?: string
41
+ /**
42
+ * Nonce for key derivation (default: 0)
43
+ * Different nonces produce different key sets
44
+ */
45
+ derivationNonce?: number
46
+ }
47
+
48
+ /**
49
+ * Ledger-derived stealth key material
50
+ */
51
+ export interface LedgerStealthKeyMaterial {
52
+ /** Stealth meta-address */
53
+ metaAddress: StealthMetaAddress
54
+ /** Spending private key (derived from signature) */
55
+ spendingPrivateKey: HexString
56
+ /** Viewing private key (derived from signature) */
57
+ viewingPrivateKey: HexString
58
+ /** Encoded meta-address string */
59
+ encodedMetaAddress: string
60
+ }
61
+
62
+ /**
63
+ * Scanned payment from stealth address
64
+ */
65
+ export interface LedgerScannedPayment {
66
+ /** Original stealth address announcement */
67
+ announcement: StealthAddress
68
+ /** Derived private key to claim funds */
69
+ claimKey: HexString
70
+ /** Standard Ethereum address for the stealth address */
71
+ ethAddress: HexString
72
+ }
73
+
74
+ /**
75
+ * Claim result from stealth address
76
+ */
77
+ export interface LedgerClaimResult {
78
+ /** Stealth address */
79
+ stealthAddress: HexString
80
+ /** Ephemeral public key used */
81
+ ephemeralPublicKey: HexString
82
+ /** Private key to claim funds */
83
+ privateKey: HexString
84
+ /** Standard Ethereum address */
85
+ ethAddress: HexString
86
+ }
87
+
88
+ // ─── Ledger Privacy Adapter ─────────────────────────────────────────────────
89
+
90
+ /**
91
+ * Ledger Privacy Wallet Adapter
92
+ *
93
+ * Provides privacy features (stealth addresses) for Ledger hardware wallets.
94
+ * Keys are derived from signatures on the device, ensuring private keys
95
+ * never leave the hardware wallet.
96
+ *
97
+ * @example Basic usage
98
+ * ```typescript
99
+ * const ledger = new LedgerPrivacyAdapter({
100
+ * accountIndex: 0,
101
+ * derivationDomain: 'myapp.com',
102
+ * })
103
+ *
104
+ * await ledger.connect()
105
+ * await ledger.initializePrivacy()
106
+ *
107
+ * // Get stealth meta-address for receiving
108
+ * const metaAddress = ledger.getMetaAddress()
109
+ *
110
+ * // Scan for payments
111
+ * const payments = ledger.scanPayments(announcements)
112
+ * ```
113
+ *
114
+ * @remarks
115
+ * Hardware wallets cannot export private keys directly. Instead, we derive
116
+ * privacy keys by signing a deterministic message and using the signature
117
+ * as entropy. The same domain/nonce will always produce the same keys.
118
+ *
119
+ * IMPORTANT: Privacy keys are held in memory and will be lost when the
120
+ * adapter is disconnected. Call `initializePrivacy()` after each connection.
121
+ */
122
+ export class LedgerPrivacyAdapter extends LedgerWalletAdapter {
123
+ private derivationDomain: string
124
+ private derivationNonce: number
125
+ private stealthKeys: LedgerStealthKeyMaterial | undefined
126
+ private _privacyInitialized: boolean = false
127
+
128
+ constructor(config: LedgerPrivacyConfig) {
129
+ super({
130
+ ...config,
131
+ chain: 'ethereum', // Privacy adapter is Ethereum-only
132
+ })
133
+ this.derivationDomain = config.derivationDomain ?? 'sip-protocol.org'
134
+ this.derivationNonce = config.derivationNonce ?? 0
135
+ }
136
+
137
+ // ─── Privacy Initialization ─────────────────────────────────────────────────
138
+
139
+ /**
140
+ * Initialize privacy features
141
+ *
142
+ * Derives stealth keys by signing a message on the Ledger device.
143
+ * This requires user approval on the device.
144
+ *
145
+ * @throws {HardwareWalletError} If user rejects or device error
146
+ */
147
+ async initializePrivacy(): Promise<void> {
148
+ this.requireConnected()
149
+
150
+ try {
151
+ // Build key derivation message
152
+ const message = this.buildKeyDerivationMessage()
153
+ const messageBytes = new TextEncoder().encode(message)
154
+
155
+ // Sign on Ledger (requires user approval)
156
+ const signature = await this.signMessage(messageBytes)
157
+
158
+ // Derive stealth keys from signature
159
+ this.stealthKeys = this.deriveStealthKeysFromSignature(signature.signature)
160
+ this._privacyInitialized = true
161
+ } catch (error) {
162
+ if (error instanceof HardwareWalletError) {
163
+ throw error
164
+ }
165
+ throw new HardwareWalletError(
166
+ 'Failed to initialize privacy keys',
167
+ HardwareErrorCode.TRANSPORT_ERROR,
168
+ 'ledger',
169
+ error
170
+ )
171
+ }
172
+ }
173
+
174
+ /**
175
+ * Check if privacy is initialized
176
+ */
177
+ isPrivacyInitialized(): boolean {
178
+ return this._privacyInitialized && this.stealthKeys !== undefined
179
+ }
180
+
181
+ /**
182
+ * Require privacy to be initialized
183
+ */
184
+ private requirePrivacy(): void {
185
+ if (!this.isPrivacyInitialized()) {
186
+ throw new WalletError(
187
+ 'Privacy not initialized. Call initializePrivacy() first.',
188
+ WalletErrorCode.NOT_CONNECTED
189
+ )
190
+ }
191
+ }
192
+
193
+ // ─── Stealth Address Operations ─────────────────────────────────────────────
194
+
195
+ /**
196
+ * Get stealth meta-address for receiving private payments
197
+ */
198
+ getMetaAddress(): StealthMetaAddress {
199
+ this.requirePrivacy()
200
+ return this.stealthKeys!.metaAddress
201
+ }
202
+
203
+ /**
204
+ * Get encoded stealth meta-address string
205
+ *
206
+ * Format: st:eth:0x<spendingKey><viewingKey>
207
+ */
208
+ getEncodedMetaAddress(): string {
209
+ this.requirePrivacy()
210
+ return this.stealthKeys!.encodedMetaAddress
211
+ }
212
+
213
+ /**
214
+ * Get stealth key material (for backup/export)
215
+ *
216
+ * @remarks
217
+ * SECURITY: Handle with care - contains private keys.
218
+ * Only export if user explicitly requests backup.
219
+ */
220
+ getStealthKeys(): LedgerStealthKeyMaterial | undefined {
221
+ return this.stealthKeys
222
+ }
223
+
224
+ /**
225
+ * Generate a stealth address for a recipient
226
+ *
227
+ * @param recipientMetaAddress - Recipient's stealth meta-address
228
+ * @returns Generated stealth address
229
+ */
230
+ generateStealthAddress(recipientMetaAddress: StealthMetaAddress): StealthAddress {
231
+ const result = generateEthereumStealthAddress(recipientMetaAddress)
232
+ return result.stealthAddress
233
+ }
234
+
235
+ /**
236
+ * Scan announcements for payments to this wallet
237
+ *
238
+ * @param announcements - Stealth address announcements to scan
239
+ * @returns Payments that belong to this wallet
240
+ */
241
+ scanPayments(announcements: StealthAddress[]): LedgerScannedPayment[] {
242
+ this.requirePrivacy()
243
+
244
+ const payments: LedgerScannedPayment[] = []
245
+
246
+ for (const announcement of announcements) {
247
+ // Check if this payment belongs to us using viewing key
248
+ const isOurs = checkEthereumStealthAddress(
249
+ announcement,
250
+ this.stealthKeys!.spendingPrivateKey,
251
+ this.stealthKeys!.viewingPrivateKey
252
+ )
253
+
254
+ if (isOurs) {
255
+ // Derive claim key
256
+ const recovery = deriveEthereumStealthPrivateKey(
257
+ announcement,
258
+ this.stealthKeys!.spendingPrivateKey,
259
+ this.stealthKeys!.viewingPrivateKey
260
+ )
261
+
262
+ payments.push({
263
+ announcement,
264
+ claimKey: recovery.privateKey,
265
+ ethAddress: recovery.ethAddress,
266
+ })
267
+ }
268
+ }
269
+
270
+ return payments
271
+ }
272
+
273
+ /**
274
+ * Derive claim key for a specific stealth address
275
+ *
276
+ * @param stealthAddress - The stealth address announcement
277
+ * @returns Claim result with private key
278
+ */
279
+ deriveClaimKey(stealthAddress: StealthAddress): LedgerClaimResult {
280
+ this.requirePrivacy()
281
+
282
+ const recovery = deriveEthereumStealthPrivateKey(
283
+ stealthAddress,
284
+ this.stealthKeys!.spendingPrivateKey,
285
+ this.stealthKeys!.viewingPrivateKey
286
+ )
287
+
288
+ return {
289
+ stealthAddress: recovery.stealthAddress,
290
+ ephemeralPublicKey: stealthAddress.ephemeralPublicKey,
291
+ privateKey: recovery.privateKey,
292
+ ethAddress: recovery.ethAddress,
293
+ }
294
+ }
295
+
296
+ // ─── Account Management ─────────────────────────────────────────────────────
297
+
298
+ /**
299
+ * Switch account and reinitialize privacy
300
+ *
301
+ * @param accountIndex - New account index
302
+ * @returns New account info
303
+ */
304
+ async switchAccountWithPrivacy(accountIndex: number): Promise<HardwareAccount> {
305
+ const account = await this.switchAccount(accountIndex)
306
+
307
+ // Clear old privacy keys
308
+ this.stealthKeys = undefined
309
+ this._privacyInitialized = false
310
+
311
+ // User must call initializePrivacy() again
312
+ return account
313
+ }
314
+
315
+ // ─── Disconnect ─────────────────────────────────────────────────────────────
316
+
317
+ /**
318
+ * Disconnect and clear privacy keys
319
+ */
320
+ async disconnect(): Promise<void> {
321
+ this.stealthKeys = undefined
322
+ this._privacyInitialized = false
323
+ await super.disconnect()
324
+ }
325
+
326
+ // ─── Private Methods ────────────────────────────────────────────────────────
327
+
328
+ /**
329
+ * Build key derivation message
330
+ *
331
+ * This message is signed on the Ledger to derive privacy keys.
332
+ * The same domain/nonce/address always produces the same signature.
333
+ */
334
+ private buildKeyDerivationMessage(): string {
335
+ return [
336
+ 'SIP Protocol Privacy Key Derivation',
337
+ '',
338
+ `Domain: ${this.derivationDomain}`,
339
+ `Address: ${this.address}`,
340
+ `Nonce: ${this.derivationNonce}`,
341
+ '',
342
+ 'Sign this message to generate your privacy keys.',
343
+ 'Your keys will be derived deterministically from this signature.',
344
+ ].join('\n')
345
+ }
346
+
347
+ /**
348
+ * Derive stealth keys from signature
349
+ *
350
+ * Uses the signature as entropy to generate spending and viewing keys.
351
+ */
352
+ private deriveStealthKeysFromSignature(signature: HexString): LedgerStealthKeyMaterial {
353
+ // Remove 0x prefix
354
+ const sigBytes = hexToBytes(signature.slice(2))
355
+
356
+ // Derive spending key: hash(signature || "spending")
357
+ const spendingInput = new Uint8Array(sigBytes.length + 8)
358
+ spendingInput.set(sigBytes)
359
+ spendingInput.set(new TextEncoder().encode('spending'), sigBytes.length)
360
+ const spendingPrivateKeyBytes = sha256(spendingInput)
361
+ const spendingPrivateKey = `0x${bytesToHex(spendingPrivateKeyBytes)}` as HexString
362
+
363
+ // Derive viewing key: hash(signature || "viewing")
364
+ const viewingInput = new Uint8Array(sigBytes.length + 7)
365
+ viewingInput.set(sigBytes)
366
+ viewingInput.set(new TextEncoder().encode('viewing'), sigBytes.length)
367
+ const viewingPrivateKeyBytes = sha256(viewingInput)
368
+ const viewingPrivateKey = `0x${bytesToHex(viewingPrivateKeyBytes)}` as HexString
369
+
370
+ // Derive public keys from private keys using secp256k1
371
+ const spendingPublicKey = secp256k1.getPublicKey(spendingPrivateKeyBytes, true)
372
+ const viewingPublicKey = secp256k1.getPublicKey(viewingPrivateKeyBytes, true)
373
+
374
+ // Create meta-address
375
+ const metaAddress: StealthMetaAddress = {
376
+ spendingKey: `0x${bytesToHex(spendingPublicKey)}` as HexString,
377
+ viewingKey: `0x${bytesToHex(viewingPublicKey)}` as HexString,
378
+ chain: 'ethereum',
379
+ }
380
+
381
+ const encodedMetaAddress = encodeEthereumStealthMetaAddress(metaAddress)
382
+
383
+ return {
384
+ metaAddress,
385
+ spendingPrivateKey,
386
+ viewingPrivateKey,
387
+ encodedMetaAddress,
388
+ }
389
+ }
390
+ }
391
+
392
+ // ─── Factory Function ───────────────────────────────────────────────────────
393
+
394
+ /**
395
+ * Create a Ledger privacy adapter
396
+ *
397
+ * @example
398
+ * ```typescript
399
+ * const ledger = createLedgerPrivacyAdapter({
400
+ * accountIndex: 0,
401
+ * derivationDomain: 'myapp.com',
402
+ * })
403
+ *
404
+ * await ledger.connect()
405
+ * await ledger.initializePrivacy()
406
+ *
407
+ * const metaAddress = ledger.getEncodedMetaAddress()
408
+ * ```
409
+ */
410
+ export function createLedgerPrivacyAdapter(
411
+ config: LedgerPrivacyConfig
412
+ ): LedgerPrivacyAdapter {
413
+ return new LedgerPrivacyAdapter(config)
414
+ }
@@ -211,6 +211,77 @@ export type {
211
211
  MockSuiAdapterConfig,
212
212
  } from './sui'
213
213
 
214
+ // NEAR adapter
215
+ export {
216
+ NEARWalletAdapter,
217
+ type NEARWalletAdapterConfig,
218
+ type NEARConnectOptions,
219
+ type NEARPrivacyKeyPair,
220
+ type NEARStealthAddressWithKeys,
221
+ type NEARPrivacyTransaction,
222
+ type NEARSignedPrivacyTransaction,
223
+ type NEARViewingKeyExport,
224
+ // Wallet Selector integration
225
+ PrivacyWalletSelector,
226
+ createPrivacyWalletSelector,
227
+ createMainnetPrivacySelector,
228
+ createTestnetPrivacySelector,
229
+ type WalletSelector,
230
+ type WalletSelectorState,
231
+ type Wallet as NEARWallet,
232
+ type WalletAction as NEARWalletAction,
233
+ type WalletTransactionResult as NEARWalletTransactionResult,
234
+ type SignAndSendTransactionParams as NEARSignAndSendTransactionParams,
235
+ type SignAndSendTransactionsParams as NEARSignAndSendTransactionsParams,
236
+ type SignMessageParams as NEARSignMessageParams,
237
+ type SignedMessage as NEARSignedMessage,
238
+ type PrivacyWalletSelectorConfig,
239
+ type PrivacyKeyPair,
240
+ type StealthAddressResult,
241
+ type PrivateTransferParams,
242
+ type PrivateTransferResult,
243
+ type WalletPrivacyCapabilities,
244
+ type ViewingKeyExport,
245
+ // MyNearWallet integration
246
+ MyNearWalletPrivacy,
247
+ createMyNearWalletPrivacy,
248
+ createMainnetMyNearWallet,
249
+ createTestnetMyNearWallet,
250
+ parseMyNearWalletCallback,
251
+ MY_NEAR_WALLET_MAINNET,
252
+ MY_NEAR_WALLET_TESTNET,
253
+ type MyNearWalletConfig,
254
+ type MyNearWalletConnectionState,
255
+ type MyNearWalletPrivacyKeys,
256
+ type MyNearWalletStealthAddress,
257
+ type MyNearWalletPrivateTransferParams,
258
+ type TransactionPreview as NEARTransactionPreview,
259
+ type MyNearWalletCallbackResult,
260
+ type MyNearWalletViewingKeyExport,
261
+ type LedgerStatus as NEARLedgerStatus,
262
+ // Meteor Wallet integration
263
+ MeteorWalletPrivacy,
264
+ createMeteorWalletPrivacy,
265
+ createMainnetMeteorWallet,
266
+ createTestnetMeteorWallet,
267
+ isMeteorWalletAvailable,
268
+ MeteorWalletError,
269
+ MeteorErrorCode,
270
+ METEOR_DEEP_LINK_SCHEME,
271
+ METEOR_APP_LINK_MAINNET,
272
+ METEOR_APP_LINK_TESTNET,
273
+ METEOR_PROVIDER_KEY,
274
+ type MeteorWalletProvider,
275
+ type MeteorWalletConfig,
276
+ type MeteorConnectionState,
277
+ type MeteorSigningMode,
278
+ type MeteorPrivacyKeys,
279
+ type MeteorPrivateTransferParams,
280
+ type TransactionSimulation as NEARTransactionSimulation,
281
+ type MeteorTransactionResult,
282
+ type MeteorAccountInfo,
283
+ } from './near'
284
+
214
285
  // Hardware wallet adapters
215
286
  export {
216
287
  // Types