@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,442 @@
1
+ /**
2
+ * Surveillance Analyzer
3
+ *
4
+ * Main class for analyzing wallet privacy and surveillance exposure.
5
+ * Orchestrates all analysis algorithms and produces comprehensive results.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+
10
+ import type {
11
+ SurveillanceAnalyzerConfig,
12
+ FullAnalysisResult,
13
+ AnalyzableTransaction,
14
+ SocialLinkResult,
15
+ } from './types'
16
+ import { analyzeAddressReuse } from './algorithms/address-reuse'
17
+ import { detectClusters } from './algorithms/cluster'
18
+ import { detectExchangeExposure } from './algorithms/exchange'
19
+ import { analyzeTemporalPatterns } from './algorithms/temporal'
20
+ import { calculatePrivacyScore, calculateSIPComparison } from './scoring'
21
+
22
+ /**
23
+ * Helius transaction history response
24
+ */
25
+ interface HeliusTransaction {
26
+ signature: string
27
+ slot: number
28
+ timestamp: number
29
+ type: string
30
+ fee: number
31
+ feePayer: string
32
+ nativeTransfers?: Array<{
33
+ fromUserAccount: string
34
+ toUserAccount: string
35
+ amount: number
36
+ }>
37
+ tokenTransfers?: Array<{
38
+ fromUserAccount: string
39
+ toUserAccount: string
40
+ mint: string
41
+ tokenAmount: number
42
+ }>
43
+ accountData?: Array<{
44
+ account: string
45
+ nativeBalanceChange: number
46
+ }>
47
+ events?: {
48
+ swap?: {
49
+ nativeInput?: { account: string; amount: number }
50
+ nativeOutput?: { account: string; amount: number }
51
+ tokenInputs?: Array<{ mint: string; amount: number }>
52
+ tokenOutputs?: Array<{ mint: string; amount: number }>
53
+ }
54
+ }
55
+ }
56
+
57
+ /**
58
+ * SurveillanceAnalyzer - Analyze wallet privacy exposure
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * import { SurveillanceAnalyzer } from '@sip-protocol/sdk'
63
+ *
64
+ * const analyzer = new SurveillanceAnalyzer({
65
+ * heliusApiKey: process.env.HELIUS_API_KEY!,
66
+ * cluster: 'mainnet-beta',
67
+ * })
68
+ *
69
+ * const result = await analyzer.analyze('7xK9...')
70
+ * console.log(result.privacyScore.overall) // 45
71
+ * console.log(result.privacyScore.risk) // 'high'
72
+ * ```
73
+ */
74
+ export class SurveillanceAnalyzer {
75
+ private config: Required<SurveillanceAnalyzerConfig>
76
+ private heliusUrl: string
77
+
78
+ constructor(config: SurveillanceAnalyzerConfig) {
79
+ if (!config.heliusApiKey) {
80
+ throw new Error(
81
+ 'Helius API key is required. Get one at https://dev.helius.xyz'
82
+ )
83
+ }
84
+
85
+ this.config = {
86
+ heliusApiKey: config.heliusApiKey,
87
+ cluster: config.cluster ?? 'mainnet-beta',
88
+ maxTransactions: config.maxTransactions ?? 1000,
89
+ includeSocialLinks: config.includeSocialLinks ?? false,
90
+ customExchangeAddresses: config.customExchangeAddresses ?? [],
91
+ }
92
+
93
+ // Use Enhanced Transactions API
94
+ this.heliusUrl =
95
+ this.config.cluster === 'devnet'
96
+ ? `https://api-devnet.helius.xyz/v0`
97
+ : `https://api.helius.xyz/v0`
98
+ }
99
+
100
+ /**
101
+ * Perform full privacy analysis on a wallet
102
+ *
103
+ * @param walletAddress - Solana wallet address to analyze
104
+ * @returns Complete analysis result with all details
105
+ */
106
+ async analyze(walletAddress: string): Promise<FullAnalysisResult> {
107
+ const startTime = Date.now()
108
+
109
+ // Fetch transaction history
110
+ const transactions = await this.fetchTransactionHistory(walletAddress)
111
+
112
+ // Run all analysis algorithms
113
+ const addressReuse = analyzeAddressReuse(transactions, walletAddress)
114
+ const cluster = detectClusters(transactions, walletAddress)
115
+ const exchangeExposure = detectExchangeExposure(
116
+ transactions,
117
+ walletAddress,
118
+ this.config.customExchangeAddresses
119
+ )
120
+ const temporalPatterns = analyzeTemporalPatterns(transactions)
121
+
122
+ // Social links (placeholder - requires external API integration)
123
+ const socialLinks = await this.analyzeSocialLinks(walletAddress)
124
+
125
+ // Calculate final privacy score
126
+ const privacyScore = calculatePrivacyScore(
127
+ addressReuse,
128
+ cluster,
129
+ exchangeExposure,
130
+ temporalPatterns,
131
+ socialLinks,
132
+ walletAddress
133
+ )
134
+
135
+ // Calculate SIP protection comparison
136
+ const sipComparison = calculateSIPComparison(privacyScore)
137
+
138
+ const analysisDurationMs = Date.now() - startTime
139
+
140
+ return {
141
+ privacyScore,
142
+ addressReuse,
143
+ cluster,
144
+ exchangeExposure,
145
+ temporalPatterns,
146
+ socialLinks,
147
+ sipComparison,
148
+ transactionCount: transactions.length,
149
+ analysisDurationMs,
150
+ }
151
+ }
152
+
153
+ /**
154
+ * Fetch transaction history using Helius Enhanced Transactions API
155
+ */
156
+ private async fetchTransactionHistory(
157
+ walletAddress: string
158
+ ): Promise<AnalyzableTransaction[]> {
159
+ const transactions: AnalyzableTransaction[] = []
160
+ let beforeSignature: string | undefined
161
+ let hasMore = true
162
+
163
+ while (hasMore && transactions.length < this.config.maxTransactions) {
164
+ const url = new URL(`${this.heliusUrl}/addresses/${walletAddress}/transactions`)
165
+ url.searchParams.set('api-key', this.config.heliusApiKey)
166
+ url.searchParams.set('limit', '100')
167
+
168
+ if (beforeSignature) {
169
+ url.searchParams.set('before', beforeSignature)
170
+ }
171
+
172
+ // Add timeout to prevent hanging requests
173
+ const controller = new AbortController()
174
+ const timeoutId = setTimeout(() => controller.abort(), 30000) // 30s timeout
175
+
176
+ let response: Response
177
+ try {
178
+ response = await fetch(url.toString(), {
179
+ signal: controller.signal,
180
+ })
181
+ } catch (error) {
182
+ clearTimeout(timeoutId)
183
+ if (error instanceof Error && error.name === 'AbortError') {
184
+ throw new Error('Helius API request timed out after 30 seconds')
185
+ }
186
+ throw error
187
+ }
188
+ clearTimeout(timeoutId)
189
+
190
+ if (!response.ok) {
191
+ throw new Error(
192
+ `Helius API error: ${response.status} ${response.statusText}`
193
+ )
194
+ }
195
+
196
+ const data = (await response.json()) as HeliusTransaction[]
197
+
198
+ if (data.length === 0) {
199
+ hasMore = false
200
+ break
201
+ }
202
+
203
+ for (const tx of data) {
204
+ const analyzable = this.parseTransaction(tx, walletAddress)
205
+ if (analyzable) {
206
+ transactions.push(analyzable)
207
+ }
208
+ }
209
+
210
+ beforeSignature = data[data.length - 1]?.signature
211
+ hasMore = data.length === 100
212
+
213
+ // Rate limiting protection
214
+ await new Promise((resolve) => setTimeout(resolve, 100))
215
+ }
216
+
217
+ return transactions
218
+ }
219
+
220
+ /**
221
+ * Parse Helius transaction into analyzable format
222
+ */
223
+ private parseTransaction(
224
+ tx: HeliusTransaction,
225
+ walletAddress: string
226
+ ): AnalyzableTransaction | null {
227
+ const involvedAddresses = new Set<string>()
228
+
229
+ // Extract all involved addresses
230
+ if (tx.feePayer) {
231
+ involvedAddresses.add(tx.feePayer)
232
+ }
233
+
234
+ // Native transfers
235
+ let sender: string | null = null
236
+ let recipient: string | null = null
237
+ let amount = BigInt(0)
238
+
239
+ if (tx.nativeTransfers && tx.nativeTransfers.length > 0) {
240
+ for (const transfer of tx.nativeTransfers) {
241
+ involvedAddresses.add(transfer.fromUserAccount)
242
+ involvedAddresses.add(transfer.toUserAccount)
243
+
244
+ if (transfer.fromUserAccount === walletAddress) {
245
+ sender = walletAddress
246
+ recipient = transfer.toUserAccount
247
+ amount = BigInt(transfer.amount)
248
+ } else if (transfer.toUserAccount === walletAddress) {
249
+ sender = transfer.fromUserAccount
250
+ recipient = walletAddress
251
+ amount = BigInt(transfer.amount)
252
+ }
253
+ }
254
+ }
255
+
256
+ // Token transfers
257
+ let mint: string | null = null
258
+
259
+ if (tx.tokenTransfers && tx.tokenTransfers.length > 0) {
260
+ for (const transfer of tx.tokenTransfers) {
261
+ if (transfer.fromUserAccount) {
262
+ involvedAddresses.add(transfer.fromUserAccount)
263
+ }
264
+ if (transfer.toUserAccount) {
265
+ involvedAddresses.add(transfer.toUserAccount)
266
+ }
267
+
268
+ if (transfer.fromUserAccount === walletAddress) {
269
+ sender = walletAddress
270
+ recipient = transfer.toUserAccount
271
+ amount = BigInt(Math.floor(transfer.tokenAmount))
272
+ mint = transfer.mint
273
+ } else if (transfer.toUserAccount === walletAddress) {
274
+ sender = transfer.fromUserAccount
275
+ recipient = walletAddress
276
+ amount = BigInt(Math.floor(transfer.tokenAmount))
277
+ mint = transfer.mint
278
+ }
279
+ }
280
+ }
281
+
282
+ // Account data for additional addresses
283
+ if (tx.accountData) {
284
+ for (const account of tx.accountData) {
285
+ involvedAddresses.add(account.account)
286
+ }
287
+ }
288
+
289
+ // Determine transaction type
290
+ let type: AnalyzableTransaction['type'] = 'other'
291
+ if (tx.type === 'SWAP' || tx.events?.swap) {
292
+ type = 'swap'
293
+ } else if (tx.type === 'TRANSFER' || tx.nativeTransfers?.length || tx.tokenTransfers?.length) {
294
+ type = 'transfer'
295
+ } else if (tx.type?.includes('STAKE')) {
296
+ type = 'stake'
297
+ }
298
+
299
+ return {
300
+ signature: tx.signature,
301
+ slot: tx.slot,
302
+ timestamp: tx.timestamp,
303
+ sender,
304
+ recipient,
305
+ amount,
306
+ mint,
307
+ fee: BigInt(tx.fee || 0),
308
+ involvedAddresses: Array.from(involvedAddresses),
309
+ type,
310
+ success: true, // Helius only returns successful transactions
311
+ }
312
+ }
313
+
314
+ /**
315
+ * Analyze social links (placeholder for external API integration)
316
+ *
317
+ * In production, this would query:
318
+ * - SNS (Solana Name Service)
319
+ * - Arkham Intelligence
320
+ * - 0xppl API
321
+ * - Other identity providers
322
+ */
323
+ private async analyzeSocialLinks(
324
+ walletAddress: string
325
+ ): Promise<SocialLinkResult> {
326
+ // If social link analysis is disabled, return empty result
327
+ if (!this.config.includeSocialLinks) {
328
+ return {
329
+ isDoxxed: false,
330
+ partialExposure: false,
331
+ scoreDeduction: 0,
332
+ links: [],
333
+ }
334
+ }
335
+
336
+ // Check SNS (Solana Name Service)
337
+ try {
338
+ const snsResult = await this.checkSNS(walletAddress)
339
+ if (snsResult) {
340
+ return {
341
+ isDoxxed: false,
342
+ partialExposure: true,
343
+ scoreDeduction: 7,
344
+ links: [snsResult],
345
+ }
346
+ }
347
+ } catch {
348
+ // SNS lookup failed, continue without it
349
+ }
350
+
351
+ return {
352
+ isDoxxed: false,
353
+ partialExposure: false,
354
+ scoreDeduction: 0,
355
+ links: [],
356
+ }
357
+ }
358
+
359
+ /**
360
+ * Check Solana Name Service for domain names
361
+ */
362
+ private async checkSNS(
363
+ walletAddress: string
364
+ ): Promise<SocialLinkResult['links'][0] | null> {
365
+ // This is a placeholder - in production you'd use the SNS SDK
366
+ // or Helius name lookup API
367
+ try {
368
+ const url = `${this.heliusUrl}/addresses/${walletAddress}/names?api-key=${this.config.heliusApiKey}`
369
+ const response = await fetch(url)
370
+
371
+ if (!response.ok) {
372
+ return null
373
+ }
374
+
375
+ const data = await response.json()
376
+
377
+ if (Array.isArray(data) && data.length > 0) {
378
+ return {
379
+ platform: 'sns',
380
+ identifier: data[0].name || data[0],
381
+ confidence: 1.0,
382
+ }
383
+ }
384
+ } catch {
385
+ // Ignore errors
386
+ }
387
+
388
+ return null
389
+ }
390
+
391
+ /**
392
+ * Get quick privacy score without full analysis
393
+ *
394
+ * Performs a lighter analysis suitable for real-time display.
395
+ * Uses only the most recent transactions (100 max).
396
+ */
397
+ async quickScore(walletAddress: string): Promise<{
398
+ score: number
399
+ risk: 'critical' | 'high' | 'medium' | 'low'
400
+ topIssue: string | null
401
+ }> {
402
+ // Create a temporary analyzer with limited transactions for quick analysis
403
+ // This avoids mutating shared state and is thread-safe
404
+ const quickAnalyzer = new SurveillanceAnalyzer({
405
+ heliusApiKey: this.config.heliusApiKey,
406
+ cluster: this.config.cluster,
407
+ maxTransactions: 100,
408
+ includeSocialLinks: false, // Skip social links for speed
409
+ customExchangeAddresses: this.config.customExchangeAddresses,
410
+ })
411
+
412
+ const result = await quickAnalyzer.analyze(walletAddress)
413
+ const topRecommendation = result.privacyScore.recommendations[0]
414
+
415
+ return {
416
+ score: result.privacyScore.overall,
417
+ risk: result.privacyScore.risk,
418
+ topIssue: topRecommendation?.title ?? null,
419
+ }
420
+ }
421
+ }
422
+
423
+ /**
424
+ * Create a new SurveillanceAnalyzer instance
425
+ *
426
+ * @param config - Analyzer configuration
427
+ * @returns SurveillanceAnalyzer instance
428
+ *
429
+ * @example
430
+ * ```typescript
431
+ * const analyzer = createSurveillanceAnalyzer({
432
+ * heliusApiKey: 'your-api-key',
433
+ * })
434
+ *
435
+ * const result = await analyzer.analyze('wallet-address')
436
+ * ```
437
+ */
438
+ export function createSurveillanceAnalyzer(
439
+ config: SurveillanceAnalyzerConfig
440
+ ): SurveillanceAnalyzer {
441
+ return new SurveillanceAnalyzer(config)
442
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Surveillance Analysis Module
3
+ *
4
+ * Analyzes wallet privacy exposure and surveillance vulnerability.
5
+ * Provides privacy scoring, recommendations, and SIP protection comparison.
6
+ *
7
+ * @packageDocumentation
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { createSurveillanceAnalyzer } from '@sip-protocol/sdk'
12
+ *
13
+ * const analyzer = createSurveillanceAnalyzer({
14
+ * heliusApiKey: process.env.HELIUS_API_KEY!,
15
+ * })
16
+ *
17
+ * const result = await analyzer.analyze('7xK9abc123...')
18
+ *
19
+ * console.log(`Privacy Score: ${result.privacyScore.overall}/100`)
20
+ * console.log(`Risk Level: ${result.privacyScore.risk}`)
21
+ *
22
+ * // Show recommendations
23
+ * for (const rec of result.privacyScore.recommendations) {
24
+ * console.log(`- ${rec.title}: ${rec.action}`)
25
+ * }
26
+ *
27
+ * // SIP protection comparison
28
+ * console.log(`With SIP: ${result.sipComparison.projectedScore}/100`)
29
+ * console.log(`Improvement: +${result.sipComparison.improvement} points`)
30
+ * ```
31
+ */
32
+
33
+ // Main analyzer
34
+ export {
35
+ SurveillanceAnalyzer,
36
+ createSurveillanceAnalyzer,
37
+ } from './analyzer'
38
+
39
+ // Types
40
+ export type {
41
+ RiskLevel,
42
+ PrivacyScore,
43
+ PrivacyScoreBreakdown,
44
+ PrivacyRecommendation,
45
+ AddressReuseResult,
46
+ ClusterResult,
47
+ ExchangeExposureResult,
48
+ TemporalPatternResult,
49
+ SocialLinkResult,
50
+ SIPProtectionComparison,
51
+ FullAnalysisResult,
52
+ SurveillanceAnalyzerConfig,
53
+ AnalyzableTransaction,
54
+ KnownExchange,
55
+ } from './types'
56
+
57
+ // Individual algorithms (for advanced usage)
58
+ export { analyzeAddressReuse } from './algorithms/address-reuse'
59
+ export { detectClusters } from './algorithms/cluster'
60
+ export { detectExchangeExposure, KNOWN_EXCHANGES } from './algorithms/exchange'
61
+ export { analyzeTemporalPatterns } from './algorithms/temporal'
62
+
63
+ // Scoring utilities
64
+ export { calculatePrivacyScore, calculateSIPComparison } from './scoring'