solvoid 1.1.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +240 -230
  3. package/SECURITY.md +39 -0
  4. package/bin/solvoid-scan +2 -0
  5. package/dist/cli/commands/ghost.d.ts +11 -0
  6. package/dist/cli/commands/ghost.d.ts.map +1 -0
  7. package/dist/cli/commands/ghost.js +185 -0
  8. package/dist/cli/commands/ghost.js.map +1 -0
  9. package/dist/cli/commands/rescue.d.ts +3 -0
  10. package/dist/cli/commands/rescue.d.ts.map +1 -0
  11. package/dist/cli/commands/rescue.js +300 -0
  12. package/dist/cli/commands/rescue.js.map +1 -0
  13. package/dist/cli/comprehensive-rpc-list.d.ts +31 -0
  14. package/dist/cli/comprehensive-rpc-list.d.ts.map +1 -0
  15. package/dist/cli/comprehensive-rpc-list.js +341 -0
  16. package/dist/cli/comprehensive-rpc-list.js.map +1 -0
  17. package/dist/cli/demo-scan.d.ts +6 -0
  18. package/dist/cli/demo-scan.d.ts.map +1 -0
  19. package/dist/cli/demo-scan.js +260 -0
  20. package/dist/cli/demo-scan.js.map +1 -0
  21. package/dist/cli/enhanced-privacy-scan.d.ts +46 -0
  22. package/dist/cli/enhanced-privacy-scan.d.ts.map +1 -0
  23. package/dist/cli/enhanced-privacy-scan.js +422 -0
  24. package/dist/cli/enhanced-privacy-scan.js.map +1 -0
  25. package/dist/cli/ghost-test.d.ts +7 -0
  26. package/dist/cli/ghost-test.d.ts.map +1 -0
  27. package/dist/cli/ghost-test.js +192 -0
  28. package/dist/cli/ghost-test.js.map +1 -0
  29. package/dist/cli/simple-scan.d.ts +6 -0
  30. package/dist/cli/simple-scan.d.ts.map +1 -0
  31. package/dist/cli/simple-scan.js +250 -0
  32. package/dist/cli/simple-scan.js.map +1 -0
  33. package/dist/cli/solvoid-scan.d.ts +6 -0
  34. package/dist/cli/solvoid-scan.d.ts.map +1 -0
  35. package/dist/cli/solvoid-scan.js +254 -0
  36. package/dist/cli/solvoid-scan.js.map +1 -0
  37. package/dist/cli/ultimate-privacy-scan.d.ts +54 -0
  38. package/dist/cli/ultimate-privacy-scan.d.ts.map +1 -0
  39. package/dist/cli/ultimate-privacy-scan.js +543 -0
  40. package/dist/cli/ultimate-privacy-scan.js.map +1 -0
  41. package/dist/cli/utils/asset-scanner.d.ts +76 -0
  42. package/dist/cli/utils/asset-scanner.d.ts.map +1 -0
  43. package/dist/cli/utils/asset-scanner.js +222 -0
  44. package/dist/cli/utils/asset-scanner.js.map +1 -0
  45. package/dist/cli/utils/badge-generator.d.ts +33 -0
  46. package/dist/cli/utils/badge-generator.d.ts.map +1 -0
  47. package/dist/cli/utils/badge-generator.js +261 -0
  48. package/dist/cli/utils/badge-generator.js.map +1 -0
  49. package/dist/cli/utils/env-validator.d.ts +17 -0
  50. package/dist/cli/utils/env-validator.d.ts.map +1 -0
  51. package/dist/cli/utils/env-validator.js +254 -0
  52. package/dist/cli/utils/env-validator.js.map +1 -0
  53. package/dist/cli/utils/ghost-art.d.ts +14 -0
  54. package/dist/cli/utils/ghost-art.d.ts.map +1 -0
  55. package/dist/cli/utils/ghost-art.js +285 -0
  56. package/dist/cli/utils/ghost-art.js.map +1 -0
  57. package/dist/cli/utils/ghost-calculator.d.ts +52 -0
  58. package/dist/cli/utils/ghost-calculator.d.ts.map +1 -0
  59. package/dist/cli/utils/ghost-calculator.js +207 -0
  60. package/dist/cli/utils/ghost-calculator.js.map +1 -0
  61. package/dist/cli/utils/rescue-engine.d.ts +61 -0
  62. package/dist/cli/utils/rescue-engine.d.ts.map +1 -0
  63. package/dist/cli/utils/rescue-engine.js +210 -0
  64. package/dist/cli/utils/rescue-engine.js.map +1 -0
  65. package/dist/cli/utils/threat-detector.d.ts +48 -0
  66. package/dist/cli/utils/threat-detector.d.ts.map +1 -0
  67. package/dist/cli/utils/threat-detector.js +304 -0
  68. package/dist/cli/utils/threat-detector.js.map +1 -0
  69. package/dist/{client.d.ts → sdk/client.d.ts} +8 -0
  70. package/dist/sdk/client.d.ts.map +1 -0
  71. package/dist/{client.js → sdk/client.js} +115 -19
  72. package/dist/sdk/client.js.map +1 -0
  73. package/dist/sdk/crypto/poseidon.d.ts.map +1 -0
  74. package/dist/sdk/crypto/poseidon.js.map +1 -0
  75. package/dist/sdk/events/bus.d.ts.map +1 -0
  76. package/dist/sdk/events/bus.js.map +1 -0
  77. package/dist/sdk/index.d.ts.map +1 -0
  78. package/dist/sdk/index.js.map +1 -0
  79. package/dist/sdk/integrity.d.ts.map +1 -0
  80. package/dist/sdk/integrity.js.map +1 -0
  81. package/dist/sdk/network/shadow-rpc.d.ts.map +1 -0
  82. package/dist/sdk/network/shadow-rpc.js.map +1 -0
  83. package/dist/sdk/passport/manager.d.ts.map +1 -0
  84. package/dist/sdk/passport/manager.js.map +1 -0
  85. package/dist/sdk/pipeline.d.ts.map +1 -0
  86. package/dist/sdk/pipeline.js.map +1 -0
  87. package/dist/sdk/privacy/relayer.d.ts.map +1 -0
  88. package/dist/sdk/privacy/relayer.js.map +1 -0
  89. package/dist/{privacy → sdk/privacy}/shield.d.ts +4 -1
  90. package/dist/sdk/privacy/shield.d.ts.map +1 -0
  91. package/dist/{privacy → sdk/privacy}/shield.js +57 -11
  92. package/dist/sdk/privacy/shield.js.map +1 -0
  93. package/dist/sdk/privacy-engine.d.ts.map +1 -0
  94. package/dist/sdk/privacy-engine.js.map +1 -0
  95. package/dist/sdk/registry/idl-fetcher.d.ts.map +1 -0
  96. package/dist/sdk/registry/idl-fetcher.js.map +1 -0
  97. package/dist/sdk/registry/programs.d.ts.map +1 -0
  98. package/dist/sdk/registry/programs.js.map +1 -0
  99. package/dist/sdk/rescue/analyzer.d.ts.map +1 -0
  100. package/dist/sdk/rescue/analyzer.js.map +1 -0
  101. package/dist/sdk/rescue/builder.d.ts.map +1 -0
  102. package/dist/sdk/rescue/builder.js.map +1 -0
  103. package/dist/sdk/security/key-rotation.d.ts.map +1 -0
  104. package/dist/sdk/security/key-rotation.js.map +1 -0
  105. package/dist/{semantics → sdk/semantics}/analyzer.d.ts.map +1 -1
  106. package/dist/{semantics → sdk/semantics}/analyzer.js.map +1 -1
  107. package/dist/sdk/semantics/decoder.d.ts.map +1 -0
  108. package/dist/sdk/semantics/decoder.js.map +1 -0
  109. package/dist/{semantics → sdk/semantics}/graph.d.ts.map +1 -1
  110. package/dist/{semantics → sdk/semantics}/graph.js.map +1 -1
  111. package/dist/sdk/semantics/idl-registry.d.ts.map +1 -0
  112. package/dist/sdk/semantics/idl-registry.js.map +1 -0
  113. package/dist/sdk/semantics/types.d.ts.map +1 -0
  114. package/dist/sdk/semantics/types.js.map +1 -0
  115. package/dist/sdk/types.d.ts.map +1 -0
  116. package/dist/{semantics → sdk}/types.js.map +1 -1
  117. package/dist/sdk/utils/address.d.ts.map +1 -0
  118. package/dist/sdk/utils/address.js.map +1 -0
  119. package/dist/sdk/utils/config.d.ts.map +1 -0
  120. package/dist/sdk/utils/config.js.map +1 -0
  121. package/dist/sdk/utils/logger.d.ts.map +1 -0
  122. package/dist/sdk/utils/logger.js.map +1 -0
  123. package/dist/simple-scan.js +249 -0
  124. package/package.json +104 -37
  125. package/CHANGELOG.md +0 -118
  126. package/dist/client.d.ts.map +0 -1
  127. package/dist/client.js.map +0 -1
  128. package/dist/crypto/poseidon.d.ts.map +0 -1
  129. package/dist/crypto/poseidon.js.map +0 -1
  130. package/dist/events/bus.d.ts.map +0 -1
  131. package/dist/events/bus.js.map +0 -1
  132. package/dist/index.d.ts.map +0 -1
  133. package/dist/index.js.map +0 -1
  134. package/dist/integrity.d.ts.map +0 -1
  135. package/dist/integrity.js.map +0 -1
  136. package/dist/network/shadow-rpc.d.ts.map +0 -1
  137. package/dist/network/shadow-rpc.js.map +0 -1
  138. package/dist/passport/manager.d.ts.map +0 -1
  139. package/dist/passport/manager.js.map +0 -1
  140. package/dist/pipeline.d.ts.map +0 -1
  141. package/dist/pipeline.js.map +0 -1
  142. package/dist/privacy/relayer.d.ts.map +0 -1
  143. package/dist/privacy/relayer.js.map +0 -1
  144. package/dist/privacy/shield.d.ts.map +0 -1
  145. package/dist/privacy/shield.js.map +0 -1
  146. package/dist/privacy-engine.d.ts.map +0 -1
  147. package/dist/privacy-engine.js.map +0 -1
  148. package/dist/registry/idl-fetcher.d.ts.map +0 -1
  149. package/dist/registry/idl-fetcher.js.map +0 -1
  150. package/dist/registry/programs.d.ts.map +0 -1
  151. package/dist/registry/programs.js.map +0 -1
  152. package/dist/rescue/analyzer.d.ts.map +0 -1
  153. package/dist/rescue/analyzer.js.map +0 -1
  154. package/dist/rescue/builder.d.ts.map +0 -1
  155. package/dist/rescue/builder.js.map +0 -1
  156. package/dist/security/key-rotation.d.ts.map +0 -1
  157. package/dist/security/key-rotation.js.map +0 -1
  158. package/dist/semantics/decoder.d.ts.map +0 -1
  159. package/dist/semantics/decoder.js.map +0 -1
  160. package/dist/semantics/idl-registry.d.ts.map +0 -1
  161. package/dist/semantics/idl-registry.js.map +0 -1
  162. package/dist/semantics/types.d.ts.map +0 -1
  163. package/dist/types.d.ts.map +0 -1
  164. package/dist/types.js.map +0 -1
  165. package/dist/utils/address.d.ts.map +0 -1
  166. package/dist/utils/address.js.map +0 -1
  167. package/dist/utils/config.d.ts.map +0 -1
  168. package/dist/utils/config.js.map +0 -1
  169. package/dist/utils/logger.d.ts.map +0 -1
  170. package/dist/utils/logger.js.map +0 -1
  171. /package/dist/{crypto → sdk/crypto}/poseidon.d.ts +0 -0
  172. /package/dist/{crypto → sdk/crypto}/poseidon.js +0 -0
  173. /package/dist/{events → sdk/events}/bus.d.ts +0 -0
  174. /package/dist/{events → sdk/events}/bus.js +0 -0
  175. /package/dist/{index.d.ts → sdk/index.d.ts} +0 -0
  176. /package/dist/{index.js → sdk/index.js} +0 -0
  177. /package/dist/{integrity.d.ts → sdk/integrity.d.ts} +0 -0
  178. /package/dist/{integrity.js → sdk/integrity.js} +0 -0
  179. /package/dist/{network → sdk/network}/shadow-rpc.d.ts +0 -0
  180. /package/dist/{network → sdk/network}/shadow-rpc.js +0 -0
  181. /package/dist/{passport → sdk/passport}/manager.d.ts +0 -0
  182. /package/dist/{passport → sdk/passport}/manager.js +0 -0
  183. /package/dist/{pipeline.d.ts → sdk/pipeline.d.ts} +0 -0
  184. /package/dist/{pipeline.js → sdk/pipeline.js} +0 -0
  185. /package/dist/{privacy → sdk/privacy}/relayer.d.ts +0 -0
  186. /package/dist/{privacy → sdk/privacy}/relayer.js +0 -0
  187. /package/dist/{privacy-engine.d.ts → sdk/privacy-engine.d.ts} +0 -0
  188. /package/dist/{privacy-engine.js → sdk/privacy-engine.js} +0 -0
  189. /package/dist/{registry → sdk/registry}/idl-fetcher.d.ts +0 -0
  190. /package/dist/{registry → sdk/registry}/idl-fetcher.js +0 -0
  191. /package/dist/{registry → sdk/registry}/programs.d.ts +0 -0
  192. /package/dist/{registry → sdk/registry}/programs.js +0 -0
  193. /package/dist/{rescue → sdk/rescue}/analyzer.d.ts +0 -0
  194. /package/dist/{rescue → sdk/rescue}/analyzer.js +0 -0
  195. /package/dist/{rescue → sdk/rescue}/builder.d.ts +0 -0
  196. /package/dist/{rescue → sdk/rescue}/builder.js +0 -0
  197. /package/dist/{security → sdk/security}/key-rotation.d.ts +0 -0
  198. /package/dist/{security → sdk/security}/key-rotation.js +0 -0
  199. /package/dist/{semantics → sdk/semantics}/analyzer.d.ts +0 -0
  200. /package/dist/{semantics → sdk/semantics}/analyzer.js +0 -0
  201. /package/dist/{semantics → sdk/semantics}/decoder.d.ts +0 -0
  202. /package/dist/{semantics → sdk/semantics}/decoder.js +0 -0
  203. /package/dist/{semantics → sdk/semantics}/graph.d.ts +0 -0
  204. /package/dist/{semantics → sdk/semantics}/graph.js +0 -0
  205. /package/dist/{semantics → sdk/semantics}/idl-registry.d.ts +0 -0
  206. /package/dist/{semantics → sdk/semantics}/idl-registry.js +0 -0
  207. /package/dist/{semantics → sdk/semantics}/types.d.ts +0 -0
  208. /package/dist/{semantics → sdk/semantics}/types.js +0 -0
  209. /package/dist/{types.d.ts → sdk/types.d.ts} +0 -0
  210. /package/dist/{types.js → sdk/types.js} +0 -0
  211. /package/dist/{utils → sdk/utils}/address.d.ts +0 -0
  212. /package/dist/{utils → sdk/utils}/address.js +0 -0
  213. /package/dist/{utils → sdk/utils}/config.d.ts +0 -0
  214. /package/dist/{utils → sdk/utils}/config.js +0 -0
  215. /package/dist/{utils → sdk/utils}/logger.d.ts +0 -0
  216. /package/dist/{utils → sdk/utils}/logger.js +0 -0
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ // cli/utils/asset-scanner.ts
3
+ // Asset Scanner
4
+ // Comprehensively scans all wallet assets for atomic rescue
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AssetScanner = void 0;
7
+ const web3_js_1 = require("@solana/web3.js");
8
+ const spl_token_1 = require("@solana/spl-token");
9
+ class AssetScanner {
10
+ constructor(connection) {
11
+ this.connection = connection;
12
+ }
13
+ /**
14
+ * Comprehensive asset scan
15
+ */
16
+ async scan(address) {
17
+ const [sol, tokens, nfts] = await Promise.all([
18
+ this.scanSOL(address),
19
+ this.scanTokens(address),
20
+ this.scanNFTs(address)
21
+ ]);
22
+ const totalValue = sol.lamports + tokens.reduce((sum, t) => sum + parseFloat(t.valueUSD), 0);
23
+ return {
24
+ sol,
25
+ tokens,
26
+ nfts,
27
+ total: {
28
+ count: 1 + tokens.length + nfts.length,
29
+ value: totalValue,
30
+ valueUSD: totalValue.toFixed(2)
31
+ }
32
+ };
33
+ }
34
+ /**
35
+ * Scan SOL balance
36
+ */
37
+ async scanSOL(address) {
38
+ const balance = await this.connection.getBalance(address);
39
+ const solBalance = balance / web3_js_1.LAMPORTS_PER_SOL;
40
+ // In production, fetch real SOL price
41
+ const solPrice = 100; // Placeholder USD price
42
+ const valueUSD = (solBalance * solPrice).toFixed(2);
43
+ return {
44
+ balance: solBalance.toFixed(4),
45
+ lamports: balance,
46
+ valueUSD
47
+ };
48
+ }
49
+ /**
50
+ * Scan all SPL tokens
51
+ */
52
+ async scanTokens(address) {
53
+ const tokens = [];
54
+ try {
55
+ // Get all token accounts owned by address
56
+ const tokenAccounts = await this.connection.getParsedTokenAccountsByOwner(address, { programId: spl_token_1.TOKEN_PROGRAM_ID });
57
+ for (const account of tokenAccounts.value) {
58
+ const parsedInfo = account.account.data.parsed.info;
59
+ const mint = parsedInfo.mint;
60
+ const amount = parsedInfo.tokenAmount.uiAmount;
61
+ const decimals = parsedInfo.tokenAmount.decimals;
62
+ // Skip empty accounts
63
+ if (amount === 0)
64
+ continue;
65
+ // Check if it's an NFT (amount = 1, decimals = 0)
66
+ if (amount === 1 && decimals === 0) {
67
+ continue; // This will be handled by scanNFTs
68
+ }
69
+ // Get token metadata (symbol, name)
70
+ const metadata = await this.getTokenMetadata(mint);
71
+ tokens.push({
72
+ mint,
73
+ symbol: metadata.symbol || 'UNKNOWN',
74
+ name: metadata.name || 'Unknown Token',
75
+ amount: amount.toString(),
76
+ decimals,
77
+ valueUSD: this.estimateTokenValue(metadata.symbol || 'UNKNOWN', amount).toFixed(2),
78
+ address: account.pubkey.toBase58()
79
+ });
80
+ }
81
+ }
82
+ catch (error) {
83
+ console.error('Error scanning tokens:', error);
84
+ }
85
+ return tokens;
86
+ }
87
+ /**
88
+ * Scan all NFTs
89
+ */
90
+ async scanNFTs(address) {
91
+ const nfts = [];
92
+ try {
93
+ // Get all token accounts
94
+ const tokenAccounts = await this.connection.getParsedTokenAccountsByOwner(address, { programId: spl_token_1.TOKEN_PROGRAM_ID });
95
+ for (const account of tokenAccounts.value) {
96
+ const parsedInfo = account.account.data.parsed.info;
97
+ const mint = parsedInfo.mint;
98
+ const amount = parsedInfo.tokenAmount.uiAmount;
99
+ const decimals = parsedInfo.tokenAmount.decimals;
100
+ // NFT: amount = 1, decimals = 0
101
+ if (amount === 1 && decimals === 0) {
102
+ const metadata = await this.getNFTMetadata(mint);
103
+ if (metadata) {
104
+ nfts.push({
105
+ mint,
106
+ name: metadata.name || 'Unknown NFT',
107
+ collection: metadata.collection || 'Uncategorized',
108
+ address: account.pubkey.toBase58(),
109
+ amount: '1'
110
+ });
111
+ }
112
+ }
113
+ }
114
+ }
115
+ catch (error) {
116
+ console.error('Error scanning NFTs:', error);
117
+ }
118
+ return nfts;
119
+ }
120
+ /**
121
+ * Get token metadata from mint
122
+ */
123
+ async getTokenMetadata(mint) {
124
+ // In production, this would:
125
+ // 1. Check Metaplex metadata account
126
+ // 2. Query token registry
127
+ // 3. Use Jupiter/CoinGecko API
128
+ // Known tokens for demo
129
+ const knownTokens = {
130
+ 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v': {
131
+ symbol: 'USDC',
132
+ name: 'USD Coin'
133
+ },
134
+ 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB': {
135
+ symbol: 'USDT',
136
+ name: 'Tether USD'
137
+ },
138
+ 'DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263': {
139
+ symbol: 'BONK',
140
+ name: 'Bonk'
141
+ }
142
+ };
143
+ return knownTokens[mint] || { symbol: 'UNKNOWN', name: 'Unknown Token' };
144
+ }
145
+ /**
146
+ * Get NFT metadata
147
+ */
148
+ async getNFTMetadata(mint) {
149
+ try {
150
+ // In production, this would:
151
+ // 1. Derive Metaplex metadata PDA
152
+ // 2. Fetch and parse metadata account
153
+ // 3. Fetch JSON metadata from URI
154
+ // For now, return basic info
155
+ return {
156
+ name: `NFT ${mint.slice(0, 8)}...`,
157
+ collection: 'Unknown Collection'
158
+ };
159
+ }
160
+ catch {
161
+ return null;
162
+ }
163
+ }
164
+ /**
165
+ * Estimate token value in USD
166
+ */
167
+ estimateTokenValue(symbol, amount) {
168
+ // Simplified price estimation
169
+ // In production, use real-time prices from Jupiter/CoinGecko
170
+ const prices = {
171
+ 'USDC': 1.00,
172
+ 'USDT': 1.00,
173
+ 'BONK': 0.00001,
174
+ 'JUP': 0.50,
175
+ 'WIF': 1.20,
176
+ 'PYTH': 0.30
177
+ };
178
+ return (prices[symbol] || 0) * amount;
179
+ }
180
+ /**
181
+ * Quick scan for emergency situations (only critical assets)
182
+ */
183
+ async quickScan(address) {
184
+ const [solBalance, tokenAccounts] = await Promise.all([
185
+ this.connection.getBalance(address),
186
+ this.connection.getParsedTokenAccountsByOwner(address, { programId: spl_token_1.TOKEN_PROGRAM_ID })
187
+ ]);
188
+ let tokenCount = 0;
189
+ let nftCount = 0;
190
+ for (const account of tokenAccounts.value) {
191
+ const parsedInfo = account.account.data.parsed.info;
192
+ const amount = parsedInfo.tokenAmount.uiAmount;
193
+ const decimals = parsedInfo.tokenAmount.decimals;
194
+ if (amount > 0) {
195
+ if (amount === 1 && decimals === 0) {
196
+ nftCount++;
197
+ }
198
+ else {
199
+ tokenCount++;
200
+ }
201
+ }
202
+ }
203
+ return {
204
+ sol: solBalance,
205
+ tokenCount,
206
+ nftCount
207
+ };
208
+ }
209
+ /**
210
+ * Estimate total rescue time based on asset count
211
+ */
212
+ estimateRescueTime(assets, emergencyMode) {
213
+ const baseTime = emergencyMode ? 0.5 : 2; // seconds
214
+ const perToken = 0.1; // seconds per token
215
+ const perNFT = 0.1; // seconds per NFT
216
+ return baseTime +
217
+ (assets.tokens.length * perToken) +
218
+ (assets.nfts.length * perNFT);
219
+ }
220
+ }
221
+ exports.AssetScanner = AssetScanner;
222
+ //# sourceMappingURL=asset-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-scanner.js","sourceRoot":"","sources":["../../../cli/utils/asset-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { GhostScore, PrivacyBadge } from './ghost-calculator';
2
+ export declare class BadgeGenerator {
3
+ /**
4
+ * Generate verifiable privacy badge
5
+ */
6
+ static generate(address: string, ghostScore: GhostScore): Promise<PrivacyBadge>;
7
+ private static getBadgeType;
8
+ private static hashAddress;
9
+ private static generateProof;
10
+ private static generateSVGBadgeUrl;
11
+ private static generateMarkdown;
12
+ private static generateHTML;
13
+ private static generateTweet;
14
+ private static generateDiscord;
15
+ /**
16
+ * Generate ASCII art badge for terminal
17
+ */
18
+ static generateTerminalBadge(ghostScore: GhostScore): string;
19
+ /**
20
+ * FIXED: Verify a privacy badge proof with constant-time operations
21
+ */
22
+ static verifyProof(proofData: string): {
23
+ valid: boolean;
24
+ scoreThreshold?: string;
25
+ timestamp?: number;
26
+ age?: string;
27
+ };
28
+ static getBadgeColor(score: number): string;
29
+ static generateBadgeSvg(score: GhostScore, address: string): string;
30
+ static verifyBadge(proofData: string): boolean;
31
+ private static getEmojiForLevel;
32
+ }
33
+ //# sourceMappingURL=badge-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge-generator.d.ts","sourceRoot":"","sources":["../../../cli/utils/badge-generator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG9D,qBAAa,cAAc;IACzB;;OAEG;WACU,QAAQ,CACnB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,YAAY,CAAC;IA0BxB,OAAO,CAAC,MAAM,CAAC,YAAY;IAO3B,OAAO,CAAC,MAAM,CAAC,WAAW;IAS1B,OAAO,CAAC,MAAM,CAAC,aAAa;IAuB5B,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAiBlC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAe/B,OAAO,CAAC,MAAM,CAAC,YAAY;IAY3B,OAAO,CAAC,MAAM,CAAC,aAAa;IAqB5B,OAAO,CAAC,MAAM,CAAC,eAAe;IAmB9B;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM;IAkB5D;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG;QACrC,KAAK,EAAE,OAAO,CAAC;QACf,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,GAAG,CAAC,EAAE,MAAM,CAAC;KACd;IAoED,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAQ3C,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IAsBnE,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAM9C,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAOhC"}
@@ -0,0 +1,261 @@
1
+ "use strict";
2
+ // cli/utils/badge-generator.ts
3
+ // Generate shareable privacy badges with ZK proofs
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.BadgeGenerator = void 0;
9
+ const crypto_1 = __importDefault(require("crypto"));
10
+ class BadgeGenerator {
11
+ /**
12
+ * Generate verifiable privacy badge
13
+ */
14
+ static async generate(address, ghostScore) {
15
+ const badgeType = this.getBadgeType(ghostScore.score);
16
+ // Generate ZK-like proof (simplified for demo)
17
+ const proofData = this.generateProof({
18
+ score: ghostScore.score,
19
+ grade: ghostScore.grade,
20
+ timestamp: Date.now(),
21
+ addressHash: this.hashAddress(address)
22
+ });
23
+ // Generate SVG badge URL
24
+ const imageUrl = this.generateSVGBadgeUrl(badgeType, ghostScore.score, ghostScore.grade);
25
+ return {
26
+ badgeType,
27
+ score: ghostScore.score,
28
+ proofData,
29
+ imageUrl,
30
+ markdownEmbed: this.generateMarkdown(imageUrl, ghostScore),
31
+ htmlEmbed: this.generateHTML(imageUrl, ghostScore),
32
+ twitterText: this.generateTweet(ghostScore, badgeType),
33
+ discordText: this.generateDiscord(ghostScore, badgeType)
34
+ };
35
+ }
36
+ static getBadgeType(score) {
37
+ if (score >= 95)
38
+ return 'INVISIBLE';
39
+ if (score >= 85)
40
+ return 'PHANTOM';
41
+ if (score >= 70)
42
+ return 'SHIELD';
43
+ return 'GHOST';
44
+ }
45
+ static hashAddress(address) {
46
+ // Create a privacy-preserving hash
47
+ return crypto_1.default
48
+ .createHash('sha256')
49
+ .update(address)
50
+ .digest('hex')
51
+ .slice(0, 16);
52
+ }
53
+ static generateProof(input) {
54
+ // Simplified proof - in production, use your Groth16 circuit
55
+ const proofData = {
56
+ commitment: crypto_1.default
57
+ .createHash('sha256')
58
+ .update(JSON.stringify(input))
59
+ .digest('hex'),
60
+ timestamp: input.timestamp,
61
+ scoreThreshold: input.score >= 90 ? 'ELITE' :
62
+ input.score >= 70 ? 'HIGH' :
63
+ input.score >= 50 ? 'MEDIUM' : 'LOW',
64
+ verified: true,
65
+ // Don't include actual score or address!
66
+ };
67
+ return Buffer.from(JSON.stringify(proofData)).toString('base64');
68
+ }
69
+ static generateSVGBadgeUrl(badgeType, score, grade) {
70
+ // Color based on score
71
+ const color = score >= 90 ? '00ff00' :
72
+ score >= 70 ? '00ffff' :
73
+ score >= 50 ? 'ffaa00' : 'ff0000';
74
+ // Badge label
75
+ const label = `Privacy_Ghost_${badgeType}_${grade}`;
76
+ // Use shields.io (free!)
77
+ return `https://img.shields.io/badge/${label}-${score}-${color}?style=for-the-badge&logo=ghost&logoColor=white`;
78
+ }
79
+ static generateMarkdown(imageUrl, ghostScore) {
80
+ return `[![Privacy Ghost Score: ${ghostScore.score}/100](${imageUrl})](https://solvoid.dev)
81
+
82
+ **Privacy Status:** ${ghostScore.ghostLevel} (Grade ${ghostScore.grade})
83
+
84
+ **Breakdown:**
85
+ - Anonymity: ${ghostScore.breakdown.anonymityScore}%
86
+ - Linkage: ${ghostScore.breakdown.linkageScore}%
87
+ - Pattern: ${ghostScore.breakdown.patternScore}%
88
+ - Volume: ${ghostScore.breakdown.volumeScore}%
89
+ - Timing: ${ghostScore.breakdown.timingScore}%
90
+
91
+ *Verified by [SolVoid](https://solvoid.dev) - Privacy Lifecycle Management for Solana*`;
92
+ }
93
+ static generateHTML(imageUrl, ghostScore) {
94
+ return `<div style="text-align: center; padding: 20px;">
95
+ <a href="https://solvoid.dev" target="_blank">
96
+ <img src="${imageUrl}" alt="Privacy Ghost Score: ${ghostScore.score}/100" />
97
+ </a>
98
+ <p><strong>Privacy Status:</strong> ${ghostScore.ghostLevel} (Grade ${ghostScore.grade})</p>
99
+ <p style="font-size: 0.9em; color: #666;">
100
+ Verified by <a href="https://solvoid.dev">SolVoid</a>
101
+ </p>
102
+ </div>`;
103
+ }
104
+ static generateTweet(ghostScore, badgeType) {
105
+ const status = ghostScore.score >= 90 ? "I'm basically invisible on-chain! " :
106
+ ghostScore.score >= 70 ? "My privacy game is strong! " :
107
+ ghostScore.score >= 50 ? "Working on my privacy... " :
108
+ "Time to level up my privacy! ";
109
+ const badgeEmoji = badgeType === 'INVISIBLE' ? '' :
110
+ badgeType === 'PHANTOM' ? '' :
111
+ badgeType === 'SHIELD' ? '' : '';
112
+ return `${badgeEmoji} Privacy Ghost Score: ${ghostScore.score}/100 (${ghostScore.grade})
113
+
114
+ Status: ${ghostScore.ghostLevel}
115
+ ${status}
116
+
117
+ Protect your #Solana privacy with @SolVoid
118
+
119
+ Check yours: https://solvoid.dev
120
+ #SolanaPrivacy #Web3Security`;
121
+ }
122
+ static generateDiscord(ghostScore, badgeType) {
123
+ const emoji = badgeType === 'INVISIBLE' ? ':ghost:' :
124
+ badgeType === 'PHANTOM' ? ':shield:' :
125
+ badgeType === 'SHIELD' ? ':warning:' : ':rotating_light:';
126
+ return `${emoji} **Privacy Ghost Score: ${ghostScore.score}/100** (Grade ${ghostScore.grade})
127
+
128
+ **Status:** ${ghostScore.ghostLevel}
129
+
130
+ **Breakdown:**
131
+ :performing_arts: Anonymity: ${ghostScore.breakdown.anonymityScore}%
132
+ :link: Linkage: ${ghostScore.breakdown.linkageScore}%
133
+ :bar_chart: Pattern: ${ghostScore.breakdown.patternScore}%
134
+ :moneybag: Volume: ${ghostScore.breakdown.volumeScore}%
135
+ :clock: Timing: ${ghostScore.breakdown.timingScore}%
136
+
137
+ *Verified by SolVoid - https://solvoid.dev*`;
138
+ }
139
+ /**
140
+ * Generate ASCII art badge for terminal
141
+ */
142
+ static generateTerminalBadge(ghostScore) {
143
+ const { score, grade, ghostLevel } = ghostScore;
144
+ const box = `
145
+
146
+ PRIVACY GHOST BADGE
147
+
148
+
149
+ Score: ${score.toString().padEnd(3)} / 100
150
+ Grade: ${grade.padEnd(2)}
151
+ Status: ${ghostLevel.padEnd(15)}
152
+
153
+
154
+ `.trim();
155
+ return box;
156
+ }
157
+ /**
158
+ * FIXED: Verify a privacy badge proof with constant-time operations
159
+ */
160
+ static verifyProof(proofData) {
161
+ // FIXED: Use constant-time operations to prevent timing attacks
162
+ const startTime = process.hrtime.bigint();
163
+ try {
164
+ // FIXED: Always perform the same operations regardless of input validity
165
+ const proof = JSON.parse(Buffer.from(proofData, 'base64').toString());
166
+ // FIXED: Use constant-time timestamp comparison
167
+ const currentTime = Date.now();
168
+ const proofTime = proof.timestamp || 0;
169
+ const age = currentTime - proofTime;
170
+ const maxAge = 30 * 24 * 60 * 60 * 1000; // 30 days
171
+ // FIXED: Constant-time boolean operations
172
+ const timeValid = age < maxAge ? 1 : 0;
173
+ const proofValid = proof.verified ? 1 : 0;
174
+ const isValid = (timeValid & proofValid) === 1;
175
+ // FIXED: Always calculate age to prevent timing differences
176
+ const ageInDays = Math.floor(Math.abs(age) / (1000 * 60 * 60 * 24));
177
+ // FIXED: Add dummy operations to normalize timing
178
+ Array(100).fill(0).forEach((_, i) => crypto_1.default.createHash('sha256').update(`${i}${proofData}`).digest('hex'));
179
+ const result = {
180
+ valid: isValid,
181
+ scoreThreshold: proof.scoreThreshold,
182
+ timestamp: proofTime,
183
+ age: `${ageInDays} day${ageInDays !== 1 ? 's' : ''} ago`
184
+ };
185
+ // FIXED: Ensure minimum execution time to prevent timing analysis
186
+ const elapsed = process.hrtime.bigint() - startTime;
187
+ const minTime = 1000000n; // 1ms in nanoseconds
188
+ if (elapsed < minTime) {
189
+ // Busy wait to normalize timing
190
+ const target = process.hrtime.bigint() + (minTime - elapsed);
191
+ while (process.hrtime.bigint() < target) {
192
+ // No-op
193
+ }
194
+ }
195
+ return result;
196
+ }
197
+ catch {
198
+ // FIXED: Perform same dummy operations on error path
199
+ Array(100).fill(0).forEach((_, i) => crypto_1.default.createHash('sha256').update(`error${i}${proofData}`).digest('hex'));
200
+ // FIXED: Ensure minimum execution time on error path too
201
+ const elapsed = process.hrtime.bigint() - startTime;
202
+ const minTime = 1000000n; // 1ms in nanoseconds
203
+ if (elapsed < minTime) {
204
+ const target = process.hrtime.bigint() + (minTime - elapsed);
205
+ while (process.hrtime.bigint() < target) {
206
+ // No-op
207
+ }
208
+ }
209
+ return { valid: false };
210
+ }
211
+ }
212
+ static getBadgeColor(score) {
213
+ if (score >= 90)
214
+ return '#4CAF50';
215
+ if (score >= 75)
216
+ return '#9C27B0';
217
+ if (score >= 60)
218
+ return '#2196F3';
219
+ if (score >= 40)
220
+ return '#FF9800';
221
+ return '#F44336';
222
+ }
223
+ static generateBadgeSvg(score, address) {
224
+ const color = this.getBadgeColor(score.score);
225
+ const truncatedAddress = `${address.substring(0, 4)}...${address.substring(address.length - 4)}`;
226
+ return `<svg width="200" height="60" xmlns="http://www.w3.org/2000/svg">
227
+ <rect width="200" height="60" rx="4" fill="${color}"/>
228
+ <text x="10" y="20" font-family="Arial, sans-serif" font-size="12" fill="white" font-weight="bold">
229
+ Privacy Ghost Score
230
+ </text>
231
+ <text x="10" y="40" font-family="Arial, sans-serif" font-size="16" fill="white" font-weight="bold">
232
+ ${score.score}/100
233
+ </text>
234
+ <text x="10" y="55" font-family="Arial, sans-serif" font-size="10" fill="white">
235
+ ${truncatedAddress}
236
+ </text>
237
+ <text x="150" y="35" font-family="Arial, sans-serif" font-size="20" fill="white">
238
+ ${this.getEmojiForLevel(score.ghostLevel)}
239
+ </text>
240
+ </svg>`;
241
+ }
242
+ // FIXED: Constant-time badge verification to prevent timing attacks
243
+ static verifyBadge(proofData) {
244
+ const result = this.verifyProof(proofData);
245
+ // FIXED: Use constant-time comparison
246
+ return result.valid ? true : false;
247
+ }
248
+ static getEmojiForLevel(ghostLevel) {
249
+ if (ghostLevel === 'Invisible')
250
+ return '';
251
+ if (ghostLevel === 'Translucent')
252
+ return '';
253
+ if (ghostLevel === 'Visible')
254
+ return '';
255
+ if (ghostLevel === 'Exposed')
256
+ return '';
257
+ return '';
258
+ }
259
+ }
260
+ exports.BadgeGenerator = BadgeGenerator;
261
+ //# sourceMappingURL=badge-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge-generator.js","sourceRoot":"","sources":["../../../cli/utils/badge-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ interface ValidationResult {
2
+ isValid: boolean;
3
+ errors: string[];
4
+ warnings: string[];
5
+ config: Record<string, string>;
6
+ }
7
+ declare class EnvironmentValidator {
8
+ private requiredVars;
9
+ private optionalVars;
10
+ private validationErrors;
11
+ private warnings;
12
+ constructor();
13
+ validate(): ValidationResult;
14
+ printValidation(): ValidationResult;
15
+ }
16
+ export { EnvironmentValidator };
17
+ //# sourceMappingURL=env-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-validator.d.ts","sourceRoot":"","sources":["../../../cli/utils/env-validator.ts"],"names":[],"mappings":"AAeA,UAAU,gBAAgB;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,cAAM,oBAAoB;IACxB,OAAO,CAAC,YAAY,CAAW;IAC/B,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,gBAAgB,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAW;;IA6I3B,QAAQ,IAAI,gBAAgB;IA8C5B,eAAe,IAAI,gBAAgB;CA+BpC;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC"}