@sip-protocol/sdk 0.7.2 → 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.d.mts +1 -1
- package/dist/browser.d.ts +1 -1
- package/dist/browser.js +2926 -341
- package/dist/browser.mjs +48 -2
- package/dist/chunk-2XIVXWHA.mjs +1930 -0
- package/dist/chunk-3M3HNQCW.mjs +18253 -0
- package/dist/chunk-7RFRWDCW.mjs +1504 -0
- package/dist/chunk-F6F73W35.mjs +16166 -0
- package/dist/chunk-OFDBEIEK.mjs +16166 -0
- package/dist/chunk-SF7YSLF5.mjs +1515 -0
- package/dist/chunk-WWUSGOXE.mjs +17129 -0
- package/dist/index-8MQz13eJ.d.mts +13746 -0
- package/dist/index-B71aXVzk.d.ts +13264 -0
- package/dist/index-DIBZHOOQ.d.ts +13746 -0
- package/dist/index-pOIIuwfV.d.mts +13264 -0
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2911 -326
- package/dist/index.mjs +48 -2
- package/dist/solana-4O4K45VU.mjs +46 -0
- package/dist/solana-NDABAZ6P.mjs +56 -0
- package/dist/solana-ZYO63LY5.mjs +46 -0
- package/package.json +2 -2
- package/src/chains/solana/index.ts +24 -0
- package/src/chains/solana/providers/generic.ts +160 -0
- package/src/chains/solana/providers/helius.ts +249 -0
- package/src/chains/solana/providers/index.ts +54 -0
- package/src/chains/solana/providers/interface.ts +178 -0
- package/src/chains/solana/providers/webhook.ts +519 -0
- package/src/chains/solana/scan.ts +88 -8
- package/src/chains/solana/types.ts +20 -1
- package/src/compliance/index.ts +14 -0
- package/src/compliance/range-sas.ts +591 -0
- package/src/index.ts +99 -0
- package/src/privacy-backends/index.ts +86 -0
- package/src/privacy-backends/interface.ts +263 -0
- package/src/privacy-backends/privacycash-types.ts +278 -0
- package/src/privacy-backends/privacycash.ts +460 -0
- package/src/privacy-backends/registry.ts +278 -0
- package/src/privacy-backends/router.ts +346 -0
- package/src/privacy-backends/sip-native.ts +253 -0
- package/src/proofs/noir.ts +1 -1
- package/src/surveillance/algorithms/address-reuse.ts +143 -0
- package/src/surveillance/algorithms/cluster.ts +247 -0
- package/src/surveillance/algorithms/exchange.ts +295 -0
- package/src/surveillance/algorithms/temporal.ts +337 -0
- package/src/surveillance/analyzer.ts +442 -0
- package/src/surveillance/index.ts +64 -0
- package/src/surveillance/scoring.ts +372 -0
- package/src/surveillance/types.ts +264 -0
|
@@ -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'
|