solvoid 1.2.0 → 1.3.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.
- package/README.md +116 -258
- package/SECURITY.md +27 -24
- package/dist/cli/commands/ghost.d.ts +3 -3
- package/dist/cli/commands/ghost.d.ts.map +1 -1
- package/dist/cli/commands/ghost.js +67 -91
- package/dist/cli/commands/ghost.js.map +1 -1
- package/dist/cli/commands/rescue.d.ts +4 -0
- package/dist/cli/commands/rescue.d.ts.map +1 -1
- package/dist/cli/commands/rescue.js +102 -199
- package/dist/cli/commands/rescue.js.map +1 -1
- package/dist/cli/demo-scan.js +48 -130
- package/dist/cli/demo-scan.js.map +1 -1
- package/dist/cli/solvoid-scan.d.ts +4 -3
- package/dist/cli/solvoid-scan.d.ts.map +1 -1
- package/dist/cli/solvoid-scan.js +55 -46
- package/dist/cli/solvoid-scan.js.map +1 -1
- package/dist/cli/utils/asset-scanner.d.ts.map +1 -1
- package/dist/cli/utils/asset-scanner.js +7 -5
- package/dist/cli/utils/asset-scanner.js.map +1 -1
- package/dist/cli/utils/badge-generator.d.ts.map +1 -1
- package/dist/cli/utils/badge-generator.js +11 -9
- package/dist/cli/utils/badge-generator.js.map +1 -1
- package/dist/cli/utils/enhanced-monitoring.d.ts +13 -0
- package/dist/cli/utils/enhanced-monitoring.d.ts.map +1 -0
- package/dist/cli/utils/enhanced-monitoring.js +46 -0
- package/dist/cli/utils/enhanced-monitoring.js.map +1 -0
- package/dist/cli/utils/enhanced-pyth-feed.d.ts +20 -0
- package/dist/cli/utils/enhanced-pyth-feed.d.ts.map +1 -0
- package/dist/cli/utils/enhanced-pyth-feed.js +64 -0
- package/dist/cli/utils/enhanced-pyth-feed.js.map +1 -0
- package/dist/cli/utils/enhanced-threat-intel.d.ts +20 -0
- package/dist/cli/utils/enhanced-threat-intel.d.ts.map +1 -0
- package/dist/cli/utils/enhanced-threat-intel.js +57 -0
- package/dist/cli/utils/enhanced-threat-intel.js.map +1 -0
- package/dist/cli/utils/env-validator.d.ts.map +1 -1
- package/dist/cli/utils/env-validator.js +6 -3
- package/dist/cli/utils/env-validator.js.map +1 -1
- package/dist/cli/utils/jito-mev-bundle.d.ts +9 -0
- package/dist/cli/utils/jito-mev-bundle.d.ts.map +1 -0
- package/dist/cli/utils/jito-mev-bundle.js +40 -0
- package/dist/cli/utils/jito-mev-bundle.js.map +1 -0
- package/dist/cli/utils/rescue-engine.d.ts +0 -4
- package/dist/cli/utils/rescue-engine.d.ts.map +1 -1
- package/dist/cli/utils/rescue-engine.js +28 -46
- package/dist/cli/utils/rescue-engine.js.map +1 -1
- package/dist/cli/utils/shadow-bridge.d.ts +20 -0
- package/dist/cli/utils/shadow-bridge.d.ts.map +1 -0
- package/dist/cli/utils/shadow-bridge.js +33 -0
- package/dist/cli/utils/shadow-bridge.js.map +1 -0
- package/dist/relayer/key-manager.d.ts +52 -0
- package/dist/relayer/key-manager.d.ts.map +1 -0
- package/dist/relayer/key-manager.js +356 -0
- package/dist/relayer/key-manager.js.map +1 -0
- package/dist/relayer/replay-protection.d.ts +94 -0
- package/dist/relayer/replay-protection.d.ts.map +1 -0
- package/dist/relayer/replay-protection.js +189 -0
- package/dist/relayer/replay-protection.js.map +1 -0
- package/dist/relayer/secure-service.d.ts +46 -0
- package/dist/relayer/secure-service.d.ts.map +1 -0
- package/dist/relayer/secure-service.js +538 -0
- package/dist/relayer/secure-service.js.map +1 -0
- package/dist/relayer/service.d.ts +25 -0
- package/dist/relayer/service.d.ts.map +1 -0
- package/dist/relayer/service.js +380 -0
- package/dist/relayer/service.js.map +1 -0
- package/dist/sdk/client.d.ts +42 -8
- package/dist/sdk/client.d.ts.map +1 -1
- package/dist/sdk/client.js +115 -242
- package/dist/sdk/client.js.map +1 -1
- package/dist/sdk/crypto/poseidon.d.ts +4 -4
- package/dist/sdk/crypto/poseidon.d.ts.map +1 -1
- package/dist/sdk/crypto/poseidon.js +34 -17
- package/dist/sdk/crypto/poseidon.js.map +1 -1
- package/dist/sdk/integrity.d.ts +3 -3
- package/dist/sdk/integrity.d.ts.map +1 -1
- package/dist/sdk/integrity.js +2 -2
- package/dist/sdk/integrity.js.map +1 -1
- package/dist/sdk/passport/manager.d.ts +15 -3
- package/dist/sdk/passport/manager.d.ts.map +1 -1
- package/dist/sdk/passport/manager.js +30 -17
- package/dist/sdk/passport/manager.js.map +1 -1
- package/dist/sdk/pipeline.d.ts.map +1 -1
- package/dist/sdk/pipeline.js +69 -12
- package/dist/sdk/pipeline.js.map +1 -1
- package/dist/sdk/polyfill.d.ts +8 -0
- package/dist/sdk/polyfill.d.ts.map +1 -0
- package/dist/sdk/polyfill.js +21 -0
- package/dist/sdk/polyfill.js.map +1 -0
- package/dist/sdk/privacy/shield.d.ts +46 -0
- package/dist/sdk/privacy/shield.d.ts.map +1 -1
- package/dist/sdk/privacy/shield.js +117 -35
- package/dist/sdk/privacy/shield.js.map +1 -1
- package/dist/sdk/privacy-engine.d.ts +17 -3
- package/dist/sdk/privacy-engine.d.ts.map +1 -1
- package/dist/sdk/privacy-engine.js +46 -20
- package/dist/sdk/privacy-engine.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
#!/usr/bin/node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* SolVoid Shadow Relayer Service: Multi-hop transaction orchestration node.
|
|
5
|
+
* Implements onion-routing for transaction obfuscation and gasless submission.
|
|
6
|
+
*/
|
|
7
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.metrics = exports.peerRegistry = exports.app = void 0;
|
|
12
|
+
const express_1 = __importDefault(require("express"));
|
|
13
|
+
const cors_1 = __importDefault(require("cors"));
|
|
14
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
15
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
16
|
+
const index_1 = require("../sdk/index");
|
|
17
|
+
const cross_fetch_1 = __importDefault(require("cross-fetch"));
|
|
18
|
+
/** Core service configuration parameters. */
|
|
19
|
+
const PORT = parseInt(process.env.PORT || '8080');
|
|
20
|
+
const RPC_ENDPOINT = process.env.RPC_ENDPOINT || 'https://api.mainnet-beta.solana.com';
|
|
21
|
+
const BOUNTY_RATE_SOL = parseFloat(process.env.BOUNTY_RATE || '0.001');
|
|
22
|
+
/**
|
|
23
|
+
* Node cryptographic identity.
|
|
24
|
+
* We generate unique RSA-2048 keypairs for peer authentication and onion decryption.
|
|
25
|
+
*/
|
|
26
|
+
const { publicKey: nodePublicKey, privateKey: nodePrivateKey } = crypto_1.default.generateKeyPairSync('rsa', {
|
|
27
|
+
modulusLength: 2048,
|
|
28
|
+
publicKeyEncoding: { type: 'spki', format: 'pem' },
|
|
29
|
+
privateKeyEncoding: { type: 'pkcs8', format: 'pem' }
|
|
30
|
+
});
|
|
31
|
+
const NODE_ID = process.env.NODE_ID || `shadow-${crypto_1.default.createHash('sha256').update(nodePublicKey).digest('hex').slice(0, 8)}`;
|
|
32
|
+
/** Registry for decentralized peer topology. */
|
|
33
|
+
const peerRegistry = new Map();
|
|
34
|
+
exports.peerRegistry = peerRegistry;
|
|
35
|
+
/** Service telemetry and performance metrics. */
|
|
36
|
+
const metrics = {
|
|
37
|
+
relayed: 0,
|
|
38
|
+
failed: 0,
|
|
39
|
+
totalBountySOL: 0,
|
|
40
|
+
uptime: Date.now()
|
|
41
|
+
};
|
|
42
|
+
exports.metrics = metrics;
|
|
43
|
+
const app = (0, express_1.default)();
|
|
44
|
+
exports.app = app;
|
|
45
|
+
app.use((0, cors_1.default)());
|
|
46
|
+
app.use(express_1.default.json({ limit: '1mb' }));
|
|
47
|
+
/** Standard upstream JSON-RPC connection. */
|
|
48
|
+
const connection = new web3_js_1.Connection(RPC_ENDPOINT, 'confirmed');
|
|
49
|
+
const API_METADATA = {
|
|
50
|
+
origin: index_1.DataOrigin.API_PAYLOAD,
|
|
51
|
+
trust: index_1.DataTrust.UNTRUSTED,
|
|
52
|
+
createdAt: Date.now(),
|
|
53
|
+
owner: 'External API Client'
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Service health and node metadata summary.
|
|
57
|
+
*/
|
|
58
|
+
app.get('/health', (_req, res) => {
|
|
59
|
+
res.json({
|
|
60
|
+
status: 'healthy',
|
|
61
|
+
nodeId: NODE_ID,
|
|
62
|
+
uptime: Math.floor((Date.now() - metrics.uptime) / 1000),
|
|
63
|
+
metrics: {
|
|
64
|
+
relayed: metrics.relayed,
|
|
65
|
+
failed: metrics.failed,
|
|
66
|
+
successRate: metrics.relayed / (metrics.relayed + metrics.failed || 1),
|
|
67
|
+
totalBountySOL: metrics.totalBountySOL
|
|
68
|
+
},
|
|
69
|
+
peers: peerRegistry.size,
|
|
70
|
+
bountyRate: BOUNTY_RATE_SOL,
|
|
71
|
+
units: { bounty: index_1.Unit.SOL },
|
|
72
|
+
publicKey: nodePublicKey
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
/**
|
|
76
|
+
* Peer registration endpoint.
|
|
77
|
+
* Enables nodes to join the decentralized relay network.
|
|
78
|
+
*/
|
|
79
|
+
app.post('/register', (req, res) => {
|
|
80
|
+
const { endpoint, publicKey, region } = req.body;
|
|
81
|
+
if (!endpoint || !publicKey) {
|
|
82
|
+
res.status(400).json({ error: 'Missing registration credentials' });
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const nodeId = `peer-${crypto_1.default.createHash('sha256').update(publicKey).digest('hex').slice(0, 8)}`;
|
|
86
|
+
peerRegistry.set(nodeId, {
|
|
87
|
+
id: nodeId,
|
|
88
|
+
endpoint,
|
|
89
|
+
publicKey,
|
|
90
|
+
lastSeen: Date.now(),
|
|
91
|
+
successRate: 1.0,
|
|
92
|
+
region: region || 'UNKNOWN'
|
|
93
|
+
});
|
|
94
|
+
res.json({ registered: true, nodeId });
|
|
95
|
+
});
|
|
96
|
+
/**
|
|
97
|
+
* Synchronizes Merkle tree state from on-chain program accounts.
|
|
98
|
+
* Provides all commitments necessary for client-side witness generation.
|
|
99
|
+
*/
|
|
100
|
+
app.get('/commitments', async (_req, res) => {
|
|
101
|
+
try {
|
|
102
|
+
const PROGRAM_ID = process.env.PROGRAM_ID || '3QcKRYWquzbBR3UpKeh4aKVCSpoHy89UT8gyovzRzzan';
|
|
103
|
+
const programId = new (require('@solana/web3.js').PublicKey)(PROGRAM_ID);
|
|
104
|
+
const [statePda] = require('@solana/web3.js').PublicKey.findProgramAddressSync([Buffer.from('state')], programId);
|
|
105
|
+
try {
|
|
106
|
+
const accountInfo = await connection.getAccountInfo(statePda);
|
|
107
|
+
if (!accountInfo) {
|
|
108
|
+
// Return test commitments if program is not currently deployed to the RPC endpoint
|
|
109
|
+
const testCommitments = process.env.TEST_COMMITMENTS?.split(',') || [
|
|
110
|
+
"2ec33752c89a1fa7a0992d3647590abee2184fb0c47296690f2c1da40681363e"
|
|
111
|
+
];
|
|
112
|
+
res.json({
|
|
113
|
+
commitments: testCommitments,
|
|
114
|
+
message: 'Internal Test Mode: Using static commitments.',
|
|
115
|
+
programId: PROGRAM_ID,
|
|
116
|
+
statePda: statePda.toBase58(),
|
|
117
|
+
testMode: true
|
|
118
|
+
});
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Deserialization of ProgramState using Anchor 0.29+ layout.
|
|
123
|
+
* Fields: [Discrimiator(8), Authority(32), MerkleRoot(32), LeafCount(8), Subtrees(256), InitFlag(1)]
|
|
124
|
+
*/
|
|
125
|
+
const data = accountInfo.data;
|
|
126
|
+
const ANCHOR_DISCRIMINATOR = 8;
|
|
127
|
+
let offset = ANCHOR_DISCRIMINATOR;
|
|
128
|
+
const authority = new (require('@solana/web3.js').PublicKey)(data.slice(offset, offset + 32));
|
|
129
|
+
offset += 32;
|
|
130
|
+
const merkleRoot = data.slice(offset, offset + 32);
|
|
131
|
+
offset += 32;
|
|
132
|
+
const leafCount = data.readBigUInt64LE(offset);
|
|
133
|
+
offset += 8;
|
|
134
|
+
offset += 256; // Skip internal subtree nodes
|
|
135
|
+
const isInitialized = data[offset] === 1;
|
|
136
|
+
/**
|
|
137
|
+
* Historical log parsing for commitment discovery.
|
|
138
|
+
* We iterate through transaction signatures to reconstruct the leaf set.
|
|
139
|
+
*/
|
|
140
|
+
const signatures = await connection.getSignaturesForAddress(statePda, { limit: 100 });
|
|
141
|
+
const commitments = [];
|
|
142
|
+
for (const sig of signatures) {
|
|
143
|
+
try {
|
|
144
|
+
const tx = await connection.getTransaction(sig.signature, {
|
|
145
|
+
maxSupportedTransactionVersion: 0
|
|
146
|
+
});
|
|
147
|
+
if (tx?.meta?.logMessages) {
|
|
148
|
+
for (const log of tx.meta.logMessages) {
|
|
149
|
+
if (log.includes('Deposit successful')) {
|
|
150
|
+
// Leaf extraction logic would iterate over CPI data here
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch (e) {
|
|
156
|
+
// Suppression of fetch failures for individual transactions
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
res.json({
|
|
160
|
+
commitments,
|
|
161
|
+
merkleRoot: Buffer.from(merkleRoot).toString('hex'),
|
|
162
|
+
leafCount: Number(leafCount),
|
|
163
|
+
isInitialized,
|
|
164
|
+
programId: PROGRAM_ID,
|
|
165
|
+
statePda: statePda.toBase58(),
|
|
166
|
+
message: commitments.length === 0
|
|
167
|
+
? 'State synchronized. No commitments identified.'
|
|
168
|
+
: `State synchronized. Identified ${commitments.length} leaf hashes.`
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
catch (fetchError) {
|
|
172
|
+
res.json({
|
|
173
|
+
commitments: [],
|
|
174
|
+
error: `Synchronization failure: ${fetchError.message}`,
|
|
175
|
+
programId: PROGRAM_ID,
|
|
176
|
+
statePda: statePda.toBase58()
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
res.status(500).json({ error: 'Critical node failure during state synchronization.' });
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
/**
|
|
185
|
+
* Primary relay entry point.
|
|
186
|
+
* Orchestrates multi-hop onion routing logic or direct network broadcast.
|
|
187
|
+
*/
|
|
188
|
+
app.post('/relay', async (req, res) => {
|
|
189
|
+
try {
|
|
190
|
+
const enforcedRequest = (0, index_1.enforce)(index_1.RelayRequestSchema, req.body, {
|
|
191
|
+
...API_METADATA,
|
|
192
|
+
createdAt: Date.now()
|
|
193
|
+
});
|
|
194
|
+
const relayReq = enforcedRequest.value;
|
|
195
|
+
if (relayReq.encryptedPayload) {
|
|
196
|
+
const result = await handleOnionRelay(relayReq.encryptedPayload);
|
|
197
|
+
res.json(result);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (!relayReq.transaction) {
|
|
201
|
+
res.status(400).json({ error: 'Missing transaction primitive.' });
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const txBuffer = Buffer.from(relayReq.transaction, 'base64');
|
|
205
|
+
const tx = web3_js_1.VersionedTransaction.deserialize(txBuffer);
|
|
206
|
+
let response;
|
|
207
|
+
if (relayReq.hops > 1 && peerRegistry.size > 0) {
|
|
208
|
+
response = await multiHopRelay(tx, relayReq.hops - 1, relayReq.targetNode);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
response = await broadcastTransaction(tx);
|
|
212
|
+
}
|
|
213
|
+
if (response.success) {
|
|
214
|
+
metrics.relayed++;
|
|
215
|
+
metrics.totalBountySOL += BOUNTY_RATE_SOL;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
metrics.failed++;
|
|
219
|
+
}
|
|
220
|
+
res.json(response);
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
metrics.failed++;
|
|
224
|
+
const errorMsg = error instanceof Error ? error.message : 'Internal Relay Error';
|
|
225
|
+
res.status(errorMsg.includes('Data Integrity') ? 400 : 500).json({
|
|
226
|
+
success: false,
|
|
227
|
+
error: errorMsg
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
/**
|
|
232
|
+
* Recursive onion decryption logic.
|
|
233
|
+
* Decouples next-hop routing from payload contents using node-specific private keys.
|
|
234
|
+
*/
|
|
235
|
+
async function handleOnionRelay(encryptedPayload) {
|
|
236
|
+
try {
|
|
237
|
+
const decrypted = crypto_1.default.privateDecrypt({ key: nodePrivateKey, padding: crypto_1.default.constants.RSA_PKCS1_OAEP_PADDING }, Buffer.from(encryptedPayload, 'base64'));
|
|
238
|
+
const layer = JSON.parse(decrypted.toString('utf-8'));
|
|
239
|
+
if (layer.nextHop === 'FINAL') {
|
|
240
|
+
const txBuffer = Buffer.from(layer.payload, 'base64');
|
|
241
|
+
const tx = web3_js_1.VersionedTransaction.deserialize(txBuffer);
|
|
242
|
+
return broadcastTransaction(tx);
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
const peer = peerRegistry.get(layer.nextHop);
|
|
246
|
+
if (!peer)
|
|
247
|
+
return { success: false, error: `Hop failure: Target peer ${layer.nextHop} unreachable.` };
|
|
248
|
+
const response = await (0, cross_fetch_1.default)(`${peer.endpoint}/relay`, {
|
|
249
|
+
method: 'POST',
|
|
250
|
+
headers: { 'Content-Type': 'application/json' },
|
|
251
|
+
body: JSON.stringify({ encryptedPayload: layer.payload, hops: 1 })
|
|
252
|
+
});
|
|
253
|
+
return await response.json();
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
return { success: false, error: 'Cryptographic failure: Onion layer decryption rejected.' };
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Multi-hop orchestration with weight-based peer selection.
|
|
262
|
+
*/
|
|
263
|
+
async function multiHopRelay(tx, remainingHops, preferredNode) {
|
|
264
|
+
let nextPeer;
|
|
265
|
+
if (preferredNode && peerRegistry.has(preferredNode)) {
|
|
266
|
+
nextPeer = peerRegistry.get(preferredNode);
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
const activePeers = Array.from(peerRegistry.values())
|
|
270
|
+
.filter(p => Date.now() - p.lastSeen < 60000);
|
|
271
|
+
if (activePeers.length > 0) {
|
|
272
|
+
const totalWeight = activePeers.reduce((sum, p) => sum + p.successRate, 0);
|
|
273
|
+
let random = Math.random() * totalWeight;
|
|
274
|
+
for (const peer of activePeers) {
|
|
275
|
+
random -= peer.successRate;
|
|
276
|
+
if (random <= 0) {
|
|
277
|
+
nextPeer = peer;
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
if (!nextPeer)
|
|
284
|
+
return broadcastTransaction(tx);
|
|
285
|
+
try {
|
|
286
|
+
const response = await (0, cross_fetch_1.default)(`${nextPeer.endpoint}/relay`, {
|
|
287
|
+
method: 'POST',
|
|
288
|
+
headers: { 'Content-Type': 'application/json' },
|
|
289
|
+
body: JSON.stringify({
|
|
290
|
+
transaction: Buffer.from(tx.serialize()).toString('base64'),
|
|
291
|
+
hops: remainingHops
|
|
292
|
+
})
|
|
293
|
+
});
|
|
294
|
+
const rawJson = await response.json();
|
|
295
|
+
const enforcedResponse = (0, index_1.enforce)(index_1.RelayResponseSchema, rawJson, {
|
|
296
|
+
origin: index_1.DataOrigin.API_PAYLOAD,
|
|
297
|
+
trust: index_1.DataTrust.SEMI_TRUSTED,
|
|
298
|
+
createdAt: Date.now(),
|
|
299
|
+
owner: nextPeer.id
|
|
300
|
+
});
|
|
301
|
+
const result = enforcedResponse.value;
|
|
302
|
+
if (result.success) {
|
|
303
|
+
nextPeer.successRate = Math.min(1, nextPeer.successRate + 0.01);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
nextPeer.successRate = Math.max(0.5, nextPeer.successRate - 0.1);
|
|
307
|
+
}
|
|
308
|
+
nextPeer.lastSeen = Date.now();
|
|
309
|
+
return {
|
|
310
|
+
...result,
|
|
311
|
+
relayPath: [NODE_ID, ...(result.relayPath || [])]
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
if (nextPeer)
|
|
316
|
+
nextPeer.successRate = Math.max(0.5, nextPeer.successRate - 0.2);
|
|
317
|
+
return broadcastTransaction(tx);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Direct transaction broadcast to the Solana network.
|
|
322
|
+
* Implements anti-correlation jitter and retry logic.
|
|
323
|
+
*/
|
|
324
|
+
async function broadcastTransaction(tx) {
|
|
325
|
+
try {
|
|
326
|
+
const jitterMs = Math.floor(Math.random() * 200) + 50;
|
|
327
|
+
await new Promise(resolve => setTimeout(resolve, jitterMs));
|
|
328
|
+
const rawTransaction = tx.serialize();
|
|
329
|
+
const txid = await connection.sendRawTransaction(rawTransaction, {
|
|
330
|
+
skipPreflight: true,
|
|
331
|
+
maxRetries: 3
|
|
332
|
+
});
|
|
333
|
+
return {
|
|
334
|
+
success: true,
|
|
335
|
+
txid,
|
|
336
|
+
hopCount: 1,
|
|
337
|
+
relayPath: [NODE_ID]
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
catch (error) {
|
|
341
|
+
return {
|
|
342
|
+
success: false,
|
|
343
|
+
error: error instanceof Error ? error.message : 'Solana network broadcast rejected.'
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Onion encryption engine.
|
|
349
|
+
* Recursive RSA-OAEP encryption for multi-hop route decoupling.
|
|
350
|
+
*/
|
|
351
|
+
app.post('/encrypt-route', (req, res) => {
|
|
352
|
+
const { transaction, route, publicKeys } = req.body;
|
|
353
|
+
if (!transaction || !route || !publicKeys || route.length !== publicKeys.length) {
|
|
354
|
+
res.status(400).json({ error: 'Route specification mismatch.' });
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
try {
|
|
358
|
+
let payload = transaction;
|
|
359
|
+
for (let i = route.length - 1; i >= 0; i--) {
|
|
360
|
+
const layer = {
|
|
361
|
+
nextHop: i === route.length - 1 ? 'FINAL' : route[i + 1],
|
|
362
|
+
payload,
|
|
363
|
+
nonce: crypto_1.default.randomBytes(16).toString('hex')
|
|
364
|
+
};
|
|
365
|
+
const encryptedBuffer = crypto_1.default.publicEncrypt({ key: publicKeys[i], padding: crypto_1.default.constants.RSA_PKCS1_OAEP_PADDING }, Buffer.from(JSON.stringify(layer)));
|
|
366
|
+
payload = encryptedBuffer.toString('base64');
|
|
367
|
+
}
|
|
368
|
+
res.json({ encrypted: payload, hops: route.length });
|
|
369
|
+
}
|
|
370
|
+
catch (e) {
|
|
371
|
+
res.status(500).json({ error: 'Encryption failure: Payload construction rejected.' });
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
app.use((err, _req, res, _next) => {
|
|
375
|
+
res.status(500).json({ error: 'Critical service interruption.' });
|
|
376
|
+
});
|
|
377
|
+
app.listen(PORT, () => {
|
|
378
|
+
console.log(` SolVoid Relayer operational on port ${PORT}`);
|
|
379
|
+
});
|
|
380
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../relayer/service.ts"],"names":[],"mappings":"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"}
|
package/dist/sdk/client.d.ts
CHANGED
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
import { PublicKey, Transaction, VersionedTransaction } from '@solana/web3.js';
|
|
2
2
|
import { Unit } from './integrity';
|
|
3
3
|
import { ScanResult } from './pipeline';
|
|
4
|
+
/**
|
|
5
|
+
* Interface definition for protocol configuration parameters.
|
|
6
|
+
*/
|
|
4
7
|
export interface SolVoidConfig {
|
|
5
8
|
readonly rpcUrl: string;
|
|
6
9
|
readonly programId: string;
|
|
7
10
|
readonly relayerUrl?: string;
|
|
8
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Standard wallet adapter interface required for transaction orchestration.
|
|
14
|
+
*/
|
|
9
15
|
export interface WalletAdapter {
|
|
10
16
|
readonly publicKey: PublicKey | null;
|
|
11
17
|
readonly signTransaction: <T extends Transaction | VersionedTransaction>(tx: T) => Promise<T>;
|
|
12
18
|
readonly signAllTransactions: <T extends Transaction | VersionedTransaction>(txs: T[]) => Promise<T[]>;
|
|
13
19
|
}
|
|
14
20
|
/**
|
|
15
|
-
* SolVoidClient
|
|
21
|
+
* SolVoidClient: Main orchestration layer for protocol interactions.
|
|
22
|
+
* Implements browser-compatible ZK primitives and state management.
|
|
16
23
|
*/
|
|
17
24
|
export declare class SolVoidClient {
|
|
18
25
|
private readonly pipeline;
|
|
@@ -20,7 +27,15 @@ export declare class SolVoidClient {
|
|
|
20
27
|
private readonly connection;
|
|
21
28
|
private readonly protocolShield;
|
|
22
29
|
constructor(config: SolVoidConfig, wallet: WalletAdapter);
|
|
30
|
+
/**
|
|
31
|
+
* Executes a comprehensive privacy audit for a specified Solana address.
|
|
32
|
+
* Analyzes transaction history to identify potential anonymity leaks.
|
|
33
|
+
*/
|
|
23
34
|
protect(address: PublicKey): Promise<ScanResult[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Retrieves the Privacy Passport for a specified address.
|
|
37
|
+
* Passport data includes aggregated scores and earned reputation badges.
|
|
38
|
+
*/
|
|
24
39
|
getPassport(address: string): Promise<{
|
|
25
40
|
walletAddress: string;
|
|
26
41
|
overallScore: number;
|
|
@@ -36,6 +51,10 @@ export declare class SolVoidClient {
|
|
|
36
51
|
}[];
|
|
37
52
|
recommendations: string[];
|
|
38
53
|
}>;
|
|
54
|
+
/**
|
|
55
|
+
* Initiates a security audit to identify remediable privacy vulnerabilities.
|
|
56
|
+
* Evaluates leak surface area and provides potential score improvement metrics.
|
|
57
|
+
*/
|
|
39
58
|
rescue(address: PublicKey): Promise<{
|
|
40
59
|
status: string;
|
|
41
60
|
message: string;
|
|
@@ -49,6 +68,10 @@ export declare class SolVoidClient {
|
|
|
49
68
|
potentialScore: number;
|
|
50
69
|
message: string;
|
|
51
70
|
}>;
|
|
71
|
+
/**
|
|
72
|
+
* Generates a Poseidon commitment for a shielded deposit.
|
|
73
|
+
* Amount must be supplied in atomic units (Lamports).
|
|
74
|
+
*/
|
|
52
75
|
shield(amountLamports: number): Promise<{
|
|
53
76
|
status: "commitment_ready";
|
|
54
77
|
commitmentData: {
|
|
@@ -61,21 +84,32 @@ export declare class SolVoidClient {
|
|
|
61
84
|
message: string;
|
|
62
85
|
units: Unit;
|
|
63
86
|
}>;
|
|
87
|
+
/**
|
|
88
|
+
* Prepares the cryptographic witness for a ZK withdrawal.
|
|
89
|
+
* Executes snarkjs prover logic to generate a Groth16 proof against the current Merkle root.
|
|
90
|
+
*/
|
|
64
91
|
prepareWithdrawal(secretHex: string, nullifierHex: string, amount: bigint, recipient: PublicKey, allCommitmentsHex: string[], wasmPath: string, zkeyPath: string): Promise<{
|
|
65
|
-
status: "proof_ready";
|
|
66
92
|
proof: any;
|
|
93
|
+
publicSignals: any;
|
|
67
94
|
nullifierHash: string;
|
|
68
95
|
root: string;
|
|
69
|
-
recipient: string;
|
|
70
|
-
message: string;
|
|
71
96
|
}>;
|
|
97
|
+
/**
|
|
98
|
+
* Triggers protocol-wide emergency fee multiplier.
|
|
99
|
+
* Requirement: Administrative authority authorization.
|
|
100
|
+
*/
|
|
72
101
|
triggerEmergencyMode(multiplier: bigint, reason: string): Promise<string>;
|
|
102
|
+
/**
|
|
103
|
+
* Deactivates emergency mode and resets protocol fees.
|
|
104
|
+
*/
|
|
73
105
|
disableEmergencyMode(): Promise<string>;
|
|
106
|
+
/**
|
|
107
|
+
* Pauses all withdrawals via the protocol Circuit Breaker.
|
|
108
|
+
*/
|
|
74
109
|
triggerCircuitBreaker(): Promise<string>;
|
|
110
|
+
/**
|
|
111
|
+
* Resets the Circuit Breaker and resumes protocol operations.
|
|
112
|
+
*/
|
|
75
113
|
resetCircuitBreaker(): Promise<string>;
|
|
76
|
-
initialize(authority: PublicKey): Promise<string>;
|
|
77
|
-
initializeVerifier(vk: any): Promise<string>;
|
|
78
|
-
initializeRootHistory(): Promise<string>;
|
|
79
|
-
initializeEconomics(): Promise<string>;
|
|
80
114
|
}
|
|
81
115
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/sdk/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../sdk/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../sdk/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAQ3F,OAAO,EAGH,IAAI,EAIP,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC,SAAS,WAAW,GAAG,oBAAoB,EAAE,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9F,QAAQ,CAAC,mBAAmB,EAAE,CAAC,CAAC,SAAS,WAAW,GAAG,oBAAoB,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;CAC1G;AAED;;;GAGG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;gBAEnC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa;IAsCxD;;;OAGG;IACU,OAAO,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAkB/D;;;OAGG;IACU,WAAW,CAAC,OAAO,EAAE,MAAM;;;;;;;;;;;;;;;IAUxC;;;OAGG;IACU,MAAM,CAAC,OAAO,EAAE,SAAS;;;;;;;;;;;;;IAyBtC;;;OAGG;IACU,MAAM,CAAC,cAAc,EAAE,MAAM;;;;;;;;;;;;IAoB1C;;;OAGG;IACU,iBAAiB,CAC1B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM;;;;;;IAgFpB;;;OAGG;IACU,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IActF;;OAEG;IACU,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAcpD;;OAEG;IACU,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAcrD;;OAEG;IACU,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC;CAatD"}
|