@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.
- package/LICENSE +21 -0
- package/README.md +267 -0
- package/dist/{TransportWebUSB-TQ7WZ4LE.mjs → TransportWebUSB-YQMAGJAJ.mjs} +12 -9
- package/dist/browser.d.mts +10 -4
- package/dist/browser.d.ts +10 -4
- package/dist/browser.js +48874 -18336
- package/dist/browser.mjs +674 -48
- package/dist/chunk-4GRJ5MAW.mjs +152 -0
- package/dist/chunk-5D7A3L3W.mjs +717 -0
- package/dist/chunk-64AYA5F5.mjs +7834 -0
- package/dist/chunk-GMDGB22A.mjs +379 -0
- package/dist/chunk-I534WKN7.mjs +328 -0
- package/dist/chunk-IBZVA5Y7.mjs +1003 -0
- package/dist/chunk-PRRZAWJE.mjs +223 -0
- package/dist/{chunk-UJCSKKID.mjs → chunk-XGB3TDIC.mjs} +13 -1
- package/dist/chunk-YWGJ77A2.mjs +33806 -0
- package/dist/{chunk-6WGN57S2.mjs → chunk-Z3K7W5S3.mjs} +48 -0
- package/dist/constants-LHAAUC2T.mjs +51 -0
- package/dist/dist-2OGQ7FED.mjs +3957 -0
- package/dist/dist-IFHPYLDX.mjs +254 -0
- package/dist/fulfillment_proof-ANHVPKTB.mjs +21 -0
- package/dist/funding_proof-ICFZ5LHY.mjs +21 -0
- package/dist/index-DXh2IGkz.d.ts +24681 -0
- package/dist/index-DeE1ZzA4.d.mts +24681 -0
- package/dist/index.d.mts +9 -3
- package/dist/index.d.ts +9 -3
- package/dist/index.js +48676 -17318
- package/dist/index.mjs +583 -19
- package/dist/interface-Bf7w1PLW.d.mts +679 -0
- package/dist/interface-Bf7w1PLW.d.ts +679 -0
- package/dist/{noir-DKfEzWy9.d.mts → noir-kzbLVTei.d.mts} +31 -21
- package/dist/{noir-DKfEzWy9.d.ts → noir-kzbLVTei.d.ts} +31 -21
- package/dist/proofs/halo2.d.mts +151 -0
- package/dist/proofs/halo2.d.ts +151 -0
- package/dist/proofs/halo2.js +350 -0
- package/dist/proofs/halo2.mjs +11 -0
- package/dist/proofs/kimchi.d.mts +160 -0
- package/dist/proofs/kimchi.d.ts +160 -0
- package/dist/proofs/kimchi.js +431 -0
- package/dist/proofs/kimchi.mjs +13 -0
- package/dist/proofs/noir.d.mts +1 -1
- package/dist/proofs/noir.d.ts +1 -1
- package/dist/proofs/noir.js +74 -18
- package/dist/proofs/noir.mjs +84 -24
- package/dist/solana-U3MEGU7W.mjs +280 -0
- package/dist/validity_proof-3POXLPNY.mjs +21 -0
- package/package.json +54 -21
- package/src/adapters/index.ts +41 -0
- package/src/adapters/jupiter.ts +571 -0
- package/src/adapters/near-intents.ts +135 -0
- package/src/advisor/advisor.ts +653 -0
- package/src/advisor/index.ts +54 -0
- package/src/advisor/tools.ts +303 -0
- package/src/advisor/types.ts +164 -0
- package/src/chains/ethereum/announcement.ts +536 -0
- package/src/chains/ethereum/bnb-optimizations.ts +474 -0
- package/src/chains/ethereum/commitment.ts +522 -0
- package/src/chains/ethereum/constants.ts +462 -0
- package/src/chains/ethereum/deployment.ts +596 -0
- package/src/chains/ethereum/gas-estimation.ts +538 -0
- package/src/chains/ethereum/index.ts +268 -0
- package/src/chains/ethereum/optimizations.ts +614 -0
- package/src/chains/ethereum/privacy-adapter.ts +855 -0
- package/src/chains/ethereum/registry.ts +584 -0
- package/src/chains/ethereum/rpc.ts +905 -0
- package/src/chains/ethereum/stealth.ts +491 -0
- package/src/chains/ethereum/token.ts +790 -0
- package/src/chains/ethereum/transfer.ts +637 -0
- package/src/chains/ethereum/types.ts +456 -0
- package/src/chains/ethereum/viewing-key.ts +455 -0
- package/src/chains/near/commitment.ts +608 -0
- package/src/chains/near/constants.ts +284 -0
- package/src/chains/near/function-call.ts +871 -0
- package/src/chains/near/history.ts +654 -0
- package/src/chains/near/implicit-account.ts +840 -0
- package/src/chains/near/index.ts +393 -0
- package/src/chains/near/native-transfer.ts +658 -0
- package/src/chains/near/nep141.ts +775 -0
- package/src/chains/near/privacy-adapter.ts +889 -0
- package/src/chains/near/resolver.ts +971 -0
- package/src/chains/near/rpc.ts +1016 -0
- package/src/chains/near/stealth.ts +419 -0
- package/src/chains/near/types.ts +317 -0
- package/src/chains/near/viewing-key.ts +876 -0
- package/src/chains/solana/anchor-transfer.ts +386 -0
- package/src/chains/solana/commitment.ts +577 -0
- package/src/chains/solana/constants.ts +126 -12
- package/src/chains/solana/ephemeral-keys.ts +543 -0
- package/src/chains/solana/index.ts +276 -1
- package/src/chains/solana/key-derivation.ts +418 -0
- package/src/chains/solana/kit-compat.ts +334 -0
- package/src/chains/solana/optimizations.ts +560 -0
- package/src/chains/solana/privacy-adapter.ts +605 -0
- package/src/chains/solana/providers/generic.ts +201 -0
- package/src/chains/solana/providers/helius-enhanced-types.ts +336 -0
- package/src/chains/solana/providers/helius-enhanced.ts +623 -0
- package/src/chains/solana/providers/helius.ts +402 -0
- package/src/chains/solana/providers/index.ts +85 -0
- package/src/chains/solana/providers/interface.ts +221 -0
- package/src/chains/solana/providers/quicknode.ts +409 -0
- package/src/chains/solana/providers/triton.ts +426 -0
- package/src/chains/solana/providers/webhook.ts +790 -0
- package/src/chains/solana/rpc-client.ts +1150 -0
- package/src/chains/solana/scan.ts +170 -73
- package/src/chains/solana/sol-transfer.ts +732 -0
- package/src/chains/solana/spl-transfer.ts +886 -0
- package/src/chains/solana/stealth-scanner.ts +703 -0
- package/src/chains/solana/sunspot-verifier.ts +453 -0
- package/src/chains/solana/transaction-builder.ts +755 -0
- package/src/chains/solana/transfer.ts +74 -5
- package/src/chains/solana/types.ts +77 -7
- package/src/chains/solana/utils.ts +110 -0
- package/src/chains/solana/viewing-key.ts +807 -0
- package/src/compliance/fireblocks.ts +921 -0
- package/src/compliance/index.ts +37 -0
- package/src/compliance/range-sas.ts +956 -0
- package/src/config/endpoints.ts +100 -0
- package/src/crypto.ts +11 -8
- package/src/errors.ts +82 -0
- package/src/evm/erc4337-relayer.ts +830 -0
- package/src/evm/index.ts +47 -0
- package/src/fees/calculator.ts +396 -0
- package/src/fees/index.ts +87 -0
- package/src/fees/near-contract.ts +429 -0
- package/src/fees/types.ts +268 -0
- package/src/index.ts +785 -1
- package/src/intent.ts +6 -3
- package/src/logger.ts +324 -0
- package/src/network/index.ts +80 -0
- package/src/network/proxy.ts +691 -0
- package/src/optimizations/index.ts +541 -0
- package/src/oracle/types.ts +1 -0
- package/src/privacy-backends/arcium-types.ts +727 -0
- package/src/privacy-backends/arcium.ts +719 -0
- package/src/privacy-backends/combined-privacy.ts +866 -0
- package/src/privacy-backends/cspl-token.ts +595 -0
- package/src/privacy-backends/cspl-types.ts +512 -0
- package/src/privacy-backends/cspl.ts +907 -0
- package/src/privacy-backends/health.ts +488 -0
- package/src/privacy-backends/inco-types.ts +323 -0
- package/src/privacy-backends/inco.ts +616 -0
- package/src/privacy-backends/index.ts +336 -0
- package/src/privacy-backends/interface.ts +906 -0
- package/src/privacy-backends/lru-cache.ts +343 -0
- package/src/privacy-backends/magicblock.ts +458 -0
- package/src/privacy-backends/mock.ts +258 -0
- package/src/privacy-backends/privacycash-types.ts +278 -0
- package/src/privacy-backends/privacycash.ts +456 -0
- package/src/privacy-backends/private-swap.ts +570 -0
- package/src/privacy-backends/rate-limiter.ts +683 -0
- package/src/privacy-backends/registry.ts +690 -0
- package/src/privacy-backends/router.ts +626 -0
- package/src/privacy-backends/shadowwire.ts +449 -0
- package/src/privacy-backends/sip-native.ts +256 -0
- package/src/privacy-logger.ts +191 -0
- package/src/production-safety.ts +373 -0
- package/src/proofs/aggregator.ts +1029 -0
- package/src/proofs/browser-composer.ts +1150 -0
- package/src/proofs/browser.ts +113 -25
- package/src/proofs/cache/index.ts +127 -0
- package/src/proofs/cache/interface.ts +545 -0
- package/src/proofs/cache/key-generator.ts +188 -0
- package/src/proofs/cache/lru-cache.ts +481 -0
- package/src/proofs/cache/multi-tier-cache.ts +575 -0
- package/src/proofs/cache/persistent-cache.ts +788 -0
- package/src/proofs/compliance-proof.ts +872 -0
- package/src/proofs/composer/base.ts +923 -0
- package/src/proofs/composer/index.ts +25 -0
- package/src/proofs/composer/interface.ts +518 -0
- package/src/proofs/composer/types.ts +383 -0
- package/src/proofs/converters/halo2.ts +452 -0
- package/src/proofs/converters/index.ts +208 -0
- package/src/proofs/converters/interface.ts +363 -0
- package/src/proofs/converters/kimchi.ts +462 -0
- package/src/proofs/converters/noir.ts +451 -0
- package/src/proofs/fallback.ts +888 -0
- package/src/proofs/halo2.ts +42 -0
- package/src/proofs/index.ts +471 -0
- package/src/proofs/interface.ts +13 -0
- package/src/proofs/kimchi.ts +42 -0
- package/src/proofs/lazy.ts +1004 -0
- package/src/proofs/mock.ts +25 -1
- package/src/proofs/noir.ts +111 -30
- package/src/proofs/orchestrator.ts +960 -0
- package/src/proofs/parallel/concurrency.ts +297 -0
- package/src/proofs/parallel/dependency-graph.ts +602 -0
- package/src/proofs/parallel/executor.ts +420 -0
- package/src/proofs/parallel/index.ts +131 -0
- package/src/proofs/parallel/interface.ts +685 -0
- package/src/proofs/parallel/worker-pool.ts +644 -0
- package/src/proofs/providers/halo2.ts +560 -0
- package/src/proofs/providers/index.ts +34 -0
- package/src/proofs/providers/kimchi.ts +641 -0
- package/src/proofs/validator.ts +881 -0
- package/src/proofs/verifier.ts +867 -0
- package/src/quantum/index.ts +112 -0
- package/src/quantum/winternitz-vault.ts +639 -0
- package/src/quantum/wots.ts +611 -0
- package/src/settlement/backends/direct-chain.ts +1 -0
- package/src/settlement/index.ts +9 -0
- package/src/settlement/router.ts +732 -46
- package/src/solana/index.ts +72 -0
- package/src/solana/jito-relayer.ts +687 -0
- package/src/solana/noir-verifier-types.ts +430 -0
- package/src/solana/noir-verifier.ts +816 -0
- package/src/stealth/address-derivation.ts +193 -0
- package/src/stealth/ed25519.ts +431 -0
- package/src/stealth/index.ts +233 -0
- package/src/stealth/meta-address.ts +221 -0
- package/src/stealth/secp256k1.ts +368 -0
- package/src/stealth/utils.ts +194 -0
- package/src/stealth.ts +50 -1504
- 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
- package/src/sync/index.ts +106 -0
- package/src/sync/manager.ts +504 -0
- package/src/sync/mock-provider.ts +318 -0
- package/src/sync/oblivious.ts +625 -0
- package/src/tokens/index.ts +15 -0
- package/src/tokens/registry.ts +301 -0
- package/src/utils/deprecation.ts +94 -0
- package/src/utils/index.ts +9 -0
- package/src/wallet/ethereum/index.ts +68 -0
- package/src/wallet/ethereum/metamask-privacy.ts +420 -0
- package/src/wallet/ethereum/multi-wallet.ts +646 -0
- package/src/wallet/ethereum/privacy-adapter.ts +700 -0
- package/src/wallet/ethereum/types.ts +3 -1
- package/src/wallet/ethereum/walletconnect-adapter.ts +675 -0
- package/src/wallet/hardware/index.ts +10 -0
- package/src/wallet/hardware/ledger-privacy.ts +414 -0
- package/src/wallet/index.ts +71 -0
- package/src/wallet/near/adapter.ts +626 -0
- package/src/wallet/near/index.ts +86 -0
- package/src/wallet/near/meteor-wallet.ts +1153 -0
- package/src/wallet/near/my-near-wallet.ts +790 -0
- package/src/wallet/near/wallet-selector.ts +702 -0
- package/src/wallet/solana/adapter.ts +6 -4
- package/src/wallet/solana/index.ts +13 -0
- package/src/wallet/solana/privacy-adapter.ts +567 -0
- package/src/wallet/sui/types.ts +6 -4
- package/src/zcash/rpc-client.ts +13 -6
- package/dist/chunk-3INS3PR5.mjs +0 -884
- package/dist/chunk-3OVABDRH.mjs +0 -17096
- package/dist/chunk-DLDWZFYC.mjs +0 -1495
- package/dist/chunk-E6SZWREQ.mjs +0 -57
- package/dist/chunk-G33LB27A.mjs +0 -16166
- package/dist/chunk-HGU6HZRC.mjs +0 -231
- package/dist/chunk-L2K34JCU.mjs +0 -1496
- package/dist/chunk-SN4ZDTVW.mjs +0 -16166
- package/dist/constants-VOI7BSLK.mjs +0 -27
- package/dist/index-BYZbDjal.d.ts +0 -11390
- package/dist/index-CHB3KuOB.d.mts +0 -11859
- package/dist/index-CzWPI6Le.d.ts +0 -11859
- package/dist/index-xbWjohNq.d.mts +0 -11390
- package/dist/solana-5EMCTPTS.mjs +0 -46
- package/dist/solana-Q4NAVBTS.mjs +0 -46
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Privacy Advisor LangChain Tools
|
|
3
|
+
*
|
|
4
|
+
* Tools for the Privacy Advisor Agent to analyze wallets and provide recommendations.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { z } from 'zod'
|
|
10
|
+
import { DynamicStructuredTool } from '@langchain/core/tools'
|
|
11
|
+
import { SurveillanceAnalyzer } from '../surveillance/analyzer'
|
|
12
|
+
import type { FullAnalysisResult, PrivacyRecommendation as SurveillanceRecommendation } from '../surveillance/types'
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Configuration for creating tools
|
|
16
|
+
*/
|
|
17
|
+
export interface ToolsConfig {
|
|
18
|
+
/** Helius API key */
|
|
19
|
+
heliusApiKey: string
|
|
20
|
+
/** Solana cluster */
|
|
21
|
+
cluster?: 'mainnet-beta' | 'devnet'
|
|
22
|
+
/** Maximum transactions to analyze */
|
|
23
|
+
maxTransactions?: number
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Create the analyze wallet tool
|
|
28
|
+
*
|
|
29
|
+
* @param config - Tool configuration
|
|
30
|
+
* @returns LangChain tool for wallet analysis
|
|
31
|
+
*/
|
|
32
|
+
export function createAnalyzeWalletTool(config: ToolsConfig): DynamicStructuredTool {
|
|
33
|
+
const analyzer = new SurveillanceAnalyzer({
|
|
34
|
+
heliusApiKey: config.heliusApiKey,
|
|
35
|
+
cluster: config.cluster ?? 'mainnet-beta',
|
|
36
|
+
maxTransactions: config.maxTransactions ?? 500,
|
|
37
|
+
includeSocialLinks: true,
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
return new DynamicStructuredTool({
|
|
41
|
+
name: 'analyze_wallet',
|
|
42
|
+
description: 'Analyze a Solana wallet for privacy risks and surveillance exposure. Returns detailed privacy score and risk breakdown.',
|
|
43
|
+
schema: z.object({
|
|
44
|
+
address: z.string().describe('The Solana wallet address to analyze (base58 encoded)'),
|
|
45
|
+
}),
|
|
46
|
+
func: async ({ address }): Promise<string> => {
|
|
47
|
+
try {
|
|
48
|
+
const result = await analyzer.analyze(address)
|
|
49
|
+
return formatAnalysisResult(result)
|
|
50
|
+
} catch (error) {
|
|
51
|
+
const message = error instanceof Error ? error.message : 'Unknown error'
|
|
52
|
+
return JSON.stringify({
|
|
53
|
+
error: true,
|
|
54
|
+
message: `Failed to analyze wallet: ${message}`,
|
|
55
|
+
})
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Create the quick score tool for faster analysis
|
|
63
|
+
*
|
|
64
|
+
* @param config - Tool configuration
|
|
65
|
+
* @returns LangChain tool for quick scoring
|
|
66
|
+
*/
|
|
67
|
+
export function createQuickScoreTool(config: ToolsConfig): DynamicStructuredTool {
|
|
68
|
+
const analyzer = new SurveillanceAnalyzer({
|
|
69
|
+
heliusApiKey: config.heliusApiKey,
|
|
70
|
+
cluster: config.cluster ?? 'mainnet-beta',
|
|
71
|
+
maxTransactions: 100,
|
|
72
|
+
includeSocialLinks: false,
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
return new DynamicStructuredTool({
|
|
76
|
+
name: 'quick_privacy_score',
|
|
77
|
+
description: 'Get a quick privacy score for a wallet without full analysis. Faster but less detailed.',
|
|
78
|
+
schema: z.object({
|
|
79
|
+
address: z.string().describe('The Solana wallet address to score'),
|
|
80
|
+
}),
|
|
81
|
+
func: async ({ address }): Promise<string> => {
|
|
82
|
+
try {
|
|
83
|
+
const result = await analyzer.quickScore(address)
|
|
84
|
+
return JSON.stringify({
|
|
85
|
+
score: result.score,
|
|
86
|
+
risk: result.risk,
|
|
87
|
+
topIssue: result.topIssue,
|
|
88
|
+
summary: getQuickSummary(result.score),
|
|
89
|
+
})
|
|
90
|
+
} catch (error) {
|
|
91
|
+
const message = error instanceof Error ? error.message : 'Unknown error'
|
|
92
|
+
return JSON.stringify({
|
|
93
|
+
error: true,
|
|
94
|
+
message: `Failed to get quick score: ${message}`,
|
|
95
|
+
})
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
})
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Create the SIP comparison tool
|
|
103
|
+
*
|
|
104
|
+
* @returns LangChain tool for SIP protection comparison
|
|
105
|
+
*/
|
|
106
|
+
export function createSIPComparisonTool(): DynamicStructuredTool {
|
|
107
|
+
return new DynamicStructuredTool({
|
|
108
|
+
name: 'sip_protection_comparison',
|
|
109
|
+
description: 'Calculate how much a privacy score would improve with SIP Protocol protection.',
|
|
110
|
+
schema: z.object({
|
|
111
|
+
currentScore: z.number().min(0).max(100).describe('Current privacy score'),
|
|
112
|
+
addressReuseScore: z.number().min(0).max(25).describe('Address reuse score component'),
|
|
113
|
+
clusterScore: z.number().min(0).max(25).describe('Cluster exposure score component'),
|
|
114
|
+
}),
|
|
115
|
+
func: async ({ currentScore, addressReuseScore, clusterScore }): Promise<string> => {
|
|
116
|
+
// SIP stealth addresses eliminate address reuse and cluster linking
|
|
117
|
+
const maxAddressImprovement = 25 - addressReuseScore
|
|
118
|
+
const maxClusterImprovement = 25 - clusterScore
|
|
119
|
+
|
|
120
|
+
// SIP typically provides 80-90% of theoretical maximum improvement
|
|
121
|
+
const addressImprovement = Math.round(maxAddressImprovement * 0.85)
|
|
122
|
+
const clusterImprovement = Math.round(maxClusterImprovement * 0.80)
|
|
123
|
+
const totalImprovement = addressImprovement + clusterImprovement
|
|
124
|
+
|
|
125
|
+
const projectedScore = Math.min(100, currentScore + totalImprovement)
|
|
126
|
+
|
|
127
|
+
return JSON.stringify({
|
|
128
|
+
currentScore,
|
|
129
|
+
projectedScore,
|
|
130
|
+
improvement: totalImprovement,
|
|
131
|
+
breakdown: {
|
|
132
|
+
addressReuse: {
|
|
133
|
+
current: addressReuseScore,
|
|
134
|
+
projected: addressReuseScore + addressImprovement,
|
|
135
|
+
reason: 'Stealth addresses prevent address reuse',
|
|
136
|
+
},
|
|
137
|
+
cluster: {
|
|
138
|
+
current: clusterScore,
|
|
139
|
+
projected: clusterScore + clusterImprovement,
|
|
140
|
+
reason: 'Each stealth address is unlinkable',
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
recommendation: totalImprovement > 20
|
|
144
|
+
? 'SIP Protocol would significantly improve your privacy'
|
|
145
|
+
: totalImprovement > 10
|
|
146
|
+
? 'SIP Protocol would moderately improve your privacy'
|
|
147
|
+
: 'Your privacy is already good, but SIP can help maintain it',
|
|
148
|
+
})
|
|
149
|
+
},
|
|
150
|
+
})
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Create the explain concept tool
|
|
155
|
+
*
|
|
156
|
+
* @returns LangChain tool for explaining privacy concepts
|
|
157
|
+
*/
|
|
158
|
+
export function createExplainTool(): DynamicStructuredTool {
|
|
159
|
+
const explanations: Record<string, string> = {
|
|
160
|
+
'stealth-address': 'A stealth address is like a P.O. Box that automatically changes after each delivery. When someone sends you crypto, it goes to a unique address that only you can access. Even if someone knows your main address, they cannot link all your received payments together.',
|
|
161
|
+
'pedersen-commitment': 'A Pedersen commitment is like a sealed envelope with a number inside. You can prove the envelope contains a valid number without opening it. This lets blockchain verify transactions are correct without revealing the actual amounts.',
|
|
162
|
+
'viewing-key': 'A viewing key is like giving someone read-only access to your bank statements. They can see your transactions but cannot spend your money. This is useful for tax preparers, auditors, or proving funds to a lender.',
|
|
163
|
+
'address-reuse': 'Address reuse is when you receive multiple payments to the same address. This is bad for privacy because anyone watching that address can see all your incoming payments and potentially link them to your identity.',
|
|
164
|
+
'cluster-analysis': 'Cluster analysis is a technique used to link multiple wallet addresses to the same owner. By analyzing transaction patterns (like which addresses send to each other or appear together), analysts can de-anonymize users.',
|
|
165
|
+
'privacy-score': 'Your privacy score (0-100) measures how resistant your wallet is to surveillance. Higher is better. It considers: address reuse (are you using the same address?), cluster exposure (can your wallets be linked?), exchange interactions (do KYC exchanges know you?), and timing patterns.',
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return new DynamicStructuredTool({
|
|
169
|
+
name: 'explain_privacy_concept',
|
|
170
|
+
description: 'Explain a privacy concept in simple terms',
|
|
171
|
+
schema: z.object({
|
|
172
|
+
concept: z.enum([
|
|
173
|
+
'stealth-address',
|
|
174
|
+
'pedersen-commitment',
|
|
175
|
+
'viewing-key',
|
|
176
|
+
'address-reuse',
|
|
177
|
+
'cluster-analysis',
|
|
178
|
+
'privacy-score',
|
|
179
|
+
]).describe('The concept to explain'),
|
|
180
|
+
}),
|
|
181
|
+
func: async ({ concept }): Promise<string> => {
|
|
182
|
+
return explanations[concept] ?? 'I don\'t have an explanation for that concept yet.'
|
|
183
|
+
},
|
|
184
|
+
})
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Format analysis result for the agent
|
|
189
|
+
*/
|
|
190
|
+
function formatAnalysisResult(result: FullAnalysisResult): string {
|
|
191
|
+
const { privacyScore, addressReuse, cluster, exchangeExposure, temporalPatterns, sipComparison } = result
|
|
192
|
+
|
|
193
|
+
// Format recommendations for readability
|
|
194
|
+
const topRecommendations = privacyScore.recommendations
|
|
195
|
+
.slice(0, 5)
|
|
196
|
+
.map((rec: SurveillanceRecommendation, i: number) => ({
|
|
197
|
+
rank: i + 1,
|
|
198
|
+
title: rec.title,
|
|
199
|
+
action: rec.action,
|
|
200
|
+
severity: rec.severity,
|
|
201
|
+
potentialGain: rec.potentialGain,
|
|
202
|
+
}))
|
|
203
|
+
|
|
204
|
+
return JSON.stringify({
|
|
205
|
+
// Summary
|
|
206
|
+
overall: {
|
|
207
|
+
score: privacyScore.overall,
|
|
208
|
+
risk: privacyScore.risk,
|
|
209
|
+
analyzedAt: new Date(privacyScore.analyzedAt).toISOString(),
|
|
210
|
+
},
|
|
211
|
+
|
|
212
|
+
// Score breakdown
|
|
213
|
+
breakdown: privacyScore.breakdown,
|
|
214
|
+
|
|
215
|
+
// Key findings
|
|
216
|
+
findings: {
|
|
217
|
+
addressReuse: {
|
|
218
|
+
count: addressReuse.totalReuseCount,
|
|
219
|
+
severity: addressReuse.scoreDeduction > 15 ? 'critical' : addressReuse.scoreDeduction > 8 ? 'high' : 'medium',
|
|
220
|
+
mostReused: addressReuse.reusedAddresses.slice(0, 3),
|
|
221
|
+
},
|
|
222
|
+
clusterExposure: {
|
|
223
|
+
linkedAddresses: cluster.linkedAddressCount,
|
|
224
|
+
confidence: cluster.confidence,
|
|
225
|
+
clusters: cluster.clusters.length,
|
|
226
|
+
},
|
|
227
|
+
exchangeExposure: {
|
|
228
|
+
exchanges: exchangeExposure.exchangeCount,
|
|
229
|
+
deposits: exchangeExposure.depositCount,
|
|
230
|
+
withdrawals: exchangeExposure.withdrawalCount,
|
|
231
|
+
kycExchanges: exchangeExposure.exchanges.filter((e: { kycRequired: boolean }) => e.kycRequired).length,
|
|
232
|
+
},
|
|
233
|
+
temporalPatterns: {
|
|
234
|
+
patternsFound: temporalPatterns.patterns.length,
|
|
235
|
+
inferredTimezone: temporalPatterns.inferredTimezone,
|
|
236
|
+
patterns: temporalPatterns.patterns.map((p: { type: string; confidence: number }) => ({
|
|
237
|
+
type: p.type,
|
|
238
|
+
confidence: p.confidence,
|
|
239
|
+
})),
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
|
|
243
|
+
// SIP improvement projection
|
|
244
|
+
sipComparison: {
|
|
245
|
+
currentScore: sipComparison.currentScore,
|
|
246
|
+
projectedScore: sipComparison.projectedScore,
|
|
247
|
+
improvement: sipComparison.improvement,
|
|
248
|
+
},
|
|
249
|
+
|
|
250
|
+
// Top recommendations
|
|
251
|
+
recommendations: topRecommendations,
|
|
252
|
+
|
|
253
|
+
// Transaction count analyzed
|
|
254
|
+
transactionCount: result.transactionCount,
|
|
255
|
+
}, null, 2)
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Get a quick summary based on score
|
|
260
|
+
*/
|
|
261
|
+
function getQuickSummary(score: number): string {
|
|
262
|
+
if (score >= 80) {
|
|
263
|
+
return 'Excellent privacy. Your wallet shows minimal surveillance exposure.'
|
|
264
|
+
} else if (score >= 60) {
|
|
265
|
+
return 'Good privacy with some room for improvement. Consider using stealth addresses.'
|
|
266
|
+
} else if (score >= 40) {
|
|
267
|
+
return 'Moderate privacy risks detected. Your wallet activity may be trackable.'
|
|
268
|
+
} else if (score >= 20) {
|
|
269
|
+
return 'High privacy risks. Your wallet is significantly exposed to surveillance.'
|
|
270
|
+
} else {
|
|
271
|
+
return 'Critical privacy risks. Your wallet activity is highly visible to analysts.'
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Create all tools for the Privacy Advisor agent
|
|
277
|
+
*
|
|
278
|
+
* @param config - Tool configuration
|
|
279
|
+
* @returns Array of LangChain tools
|
|
280
|
+
*
|
|
281
|
+
* @example
|
|
282
|
+
* ```typescript
|
|
283
|
+
* const tools = createPrivacyAdvisorTools({
|
|
284
|
+
* heliusApiKey: process.env.HELIUS_API_KEY!,
|
|
285
|
+
* cluster: 'mainnet-beta',
|
|
286
|
+
* })
|
|
287
|
+
*
|
|
288
|
+
* // Use with LangChain agent
|
|
289
|
+
* const agent = await createOpenAIToolsAgent({
|
|
290
|
+
* llm: model,
|
|
291
|
+
* tools,
|
|
292
|
+
* prompt,
|
|
293
|
+
* })
|
|
294
|
+
* ```
|
|
295
|
+
*/
|
|
296
|
+
export function createPrivacyAdvisorTools(config: ToolsConfig): DynamicStructuredTool[] {
|
|
297
|
+
return [
|
|
298
|
+
createAnalyzeWalletTool(config),
|
|
299
|
+
createQuickScoreTool(config),
|
|
300
|
+
createSIPComparisonTool(),
|
|
301
|
+
createExplainTool(),
|
|
302
|
+
]
|
|
303
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Privacy Advisor Agent Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the LangChain-powered Privacy Advisor Agent
|
|
5
|
+
* that provides intelligent, contextual privacy recommendations.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { FullAnalysisResult, RiskLevel } from '../surveillance/types'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Advisor message role
|
|
14
|
+
*/
|
|
15
|
+
export type AdvisorRole = 'user' | 'assistant' | 'system'
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Chat message for the advisor
|
|
19
|
+
*/
|
|
20
|
+
export interface AdvisorMessage {
|
|
21
|
+
/** Message role */
|
|
22
|
+
role: AdvisorRole
|
|
23
|
+
/** Message content */
|
|
24
|
+
content: string
|
|
25
|
+
/** Timestamp */
|
|
26
|
+
timestamp: number
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Advisor recommendation with priority and actionability
|
|
31
|
+
*/
|
|
32
|
+
export interface AdvisorRecommendation {
|
|
33
|
+
/** Unique identifier */
|
|
34
|
+
id: string
|
|
35
|
+
/** Priority level (1 = highest) */
|
|
36
|
+
priority: number
|
|
37
|
+
/** Recommendation title */
|
|
38
|
+
title: string
|
|
39
|
+
/** Plain-English explanation */
|
|
40
|
+
explanation: string
|
|
41
|
+
/** Step-by-step action items */
|
|
42
|
+
actions: string[]
|
|
43
|
+
/** Expected privacy score improvement */
|
|
44
|
+
expectedImprovement: number
|
|
45
|
+
/** Difficulty level */
|
|
46
|
+
difficulty: 'easy' | 'medium' | 'hard'
|
|
47
|
+
/** Estimated time to implement */
|
|
48
|
+
estimatedTime: string
|
|
49
|
+
/** Whether SIP Protocol can automate this */
|
|
50
|
+
canAutomate: boolean
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Privacy advisory report generated by the agent
|
|
55
|
+
*/
|
|
56
|
+
export interface PrivacyAdvisoryReport {
|
|
57
|
+
/** Wallet address analyzed */
|
|
58
|
+
walletAddress: string
|
|
59
|
+
/** Current privacy score */
|
|
60
|
+
currentScore: number
|
|
61
|
+
/** Risk level assessment */
|
|
62
|
+
riskLevel: RiskLevel
|
|
63
|
+
/** Executive summary (2-3 sentences) */
|
|
64
|
+
summary: string
|
|
65
|
+
/** Prioritized recommendations */
|
|
66
|
+
recommendations: AdvisorRecommendation[]
|
|
67
|
+
/** Key risks explained in plain language */
|
|
68
|
+
keyRisks: Array<{
|
|
69
|
+
category: string
|
|
70
|
+
description: string
|
|
71
|
+
severity: RiskLevel
|
|
72
|
+
}>
|
|
73
|
+
/** SIP Protocol benefits if adopted */
|
|
74
|
+
sipBenefits: {
|
|
75
|
+
projectedScore: number
|
|
76
|
+
improvement: number
|
|
77
|
+
features: string[]
|
|
78
|
+
}
|
|
79
|
+
/** Report generation timestamp */
|
|
80
|
+
generatedAt: number
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Advisor agent configuration
|
|
85
|
+
*/
|
|
86
|
+
export interface PrivacyAdvisorConfig {
|
|
87
|
+
/** OpenAI API key */
|
|
88
|
+
openaiApiKey: string
|
|
89
|
+
/** Model to use (default: gpt-4o-mini for cost efficiency) */
|
|
90
|
+
model?: 'gpt-4o-mini' | 'gpt-4o' | 'gpt-4-turbo'
|
|
91
|
+
/** Temperature for responses (0-1, default: 0.3) */
|
|
92
|
+
temperature?: number
|
|
93
|
+
/** Maximum tokens per response (default: 1024) */
|
|
94
|
+
maxTokens?: number
|
|
95
|
+
/** Enable verbose logging */
|
|
96
|
+
verbose?: boolean
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Analysis context passed to the advisor
|
|
101
|
+
*/
|
|
102
|
+
export interface AdvisoryContext {
|
|
103
|
+
/** Full surveillance analysis result */
|
|
104
|
+
analysisResult: FullAnalysisResult
|
|
105
|
+
/** User's question or request (optional) */
|
|
106
|
+
userQuery?: string
|
|
107
|
+
/** Previous conversation messages */
|
|
108
|
+
conversationHistory?: AdvisorMessage[]
|
|
109
|
+
/** User preferences */
|
|
110
|
+
preferences?: {
|
|
111
|
+
/** Prioritize automation over manual steps */
|
|
112
|
+
preferAutomation?: boolean
|
|
113
|
+
/** Technical skill level */
|
|
114
|
+
technicalLevel?: 'beginner' | 'intermediate' | 'advanced'
|
|
115
|
+
/** Focus areas */
|
|
116
|
+
focusAreas?: Array<'privacy' | 'compliance' | 'convenience'>
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Advisor response
|
|
122
|
+
*/
|
|
123
|
+
export interface AdvisorResponse {
|
|
124
|
+
/** Response message */
|
|
125
|
+
message: string
|
|
126
|
+
/** Generated report (if analysis was requested) */
|
|
127
|
+
report?: PrivacyAdvisoryReport
|
|
128
|
+
/** Suggested follow-up questions */
|
|
129
|
+
suggestedQuestions?: string[]
|
|
130
|
+
/** Token usage */
|
|
131
|
+
usage?: {
|
|
132
|
+
promptTokens: number
|
|
133
|
+
completionTokens: number
|
|
134
|
+
totalTokens: number
|
|
135
|
+
estimatedCost: number
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Tool execution result for LangChain tools
|
|
141
|
+
*/
|
|
142
|
+
export interface ToolResult<T = unknown> {
|
|
143
|
+
/** Whether the tool executed successfully */
|
|
144
|
+
success: boolean
|
|
145
|
+
/** Result data */
|
|
146
|
+
data?: T
|
|
147
|
+
/** Error message if failed */
|
|
148
|
+
error?: string
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Advisor status for React integration
|
|
153
|
+
*/
|
|
154
|
+
export type AdvisorStatus =
|
|
155
|
+
| 'idle'
|
|
156
|
+
| 'analyzing'
|
|
157
|
+
| 'thinking'
|
|
158
|
+
| 'responding'
|
|
159
|
+
| 'error'
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Streaming callback for real-time responses
|
|
163
|
+
*/
|
|
164
|
+
export type StreamCallback = (chunk: string) => void
|