solvoid 1.0.0 → 1.1.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/dist/client.d.ts +73 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +281 -0
- package/dist/client.js.map +1 -0
- package/dist/crypto/poseidon.d.ts +124 -0
- package/dist/crypto/poseidon.d.ts.map +1 -0
- package/dist/crypto/poseidon.js +293 -0
- package/dist/crypto/poseidon.js.map +1 -0
- package/dist/events/bus.d.ts +44 -0
- package/dist/events/bus.d.ts.map +1 -0
- package/dist/events/bus.js +83 -0
- package/dist/events/bus.js.map +1 -0
- package/dist/{sdk/index.d.ts → index.d.ts} +2 -3
- package/dist/index.d.ts.map +1 -0
- package/dist/{sdk/index.js → index.js} +21 -11
- package/dist/index.js.map +1 -0
- package/dist/integrity.d.ts +371 -0
- package/dist/integrity.d.ts.map +1 -0
- package/dist/integrity.js +260 -0
- package/dist/integrity.js.map +1 -0
- package/dist/network/shadow-rpc.d.ts +36 -0
- package/dist/network/shadow-rpc.d.ts.map +1 -0
- package/dist/network/shadow-rpc.js +163 -0
- package/dist/network/shadow-rpc.js.map +1 -0
- package/dist/{sdk/passport → passport}/manager.d.ts +9 -18
- package/dist/passport/manager.d.ts.map +1 -0
- package/dist/passport/manager.js +148 -0
- package/dist/passport/manager.js.map +1 -0
- package/dist/pipeline.d.ts +25 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +127 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/privacy/relayer.d.ts.map +1 -0
- package/dist/privacy/relayer.js.map +1 -0
- package/dist/privacy/shield.d.ts +27 -0
- package/dist/privacy/shield.d.ts.map +1 -0
- package/dist/privacy/shield.js +289 -0
- package/dist/privacy/shield.js.map +1 -0
- package/dist/{sdk/privacy-engine.d.ts → privacy-engine.d.ts} +2 -1
- package/dist/privacy-engine.d.ts.map +1 -0
- package/dist/{sdk/privacy-engine.js → privacy-engine.js} +24 -15
- package/dist/privacy-engine.js.map +1 -0
- package/dist/registry/idl-fetcher.d.ts +10 -0
- package/dist/registry/idl-fetcher.d.ts.map +1 -0
- package/dist/{sdk/registry → registry}/idl-fetcher.js +19 -16
- package/dist/registry/idl-fetcher.js.map +1 -0
- package/dist/registry/programs.d.ts.map +1 -0
- package/dist/registry/programs.js.map +1 -0
- package/dist/rescue/analyzer.d.ts +20 -0
- package/dist/rescue/analyzer.d.ts.map +1 -0
- package/dist/rescue/analyzer.js +137 -0
- package/dist/rescue/analyzer.js.map +1 -0
- package/dist/rescue/builder.d.ts +23 -0
- package/dist/rescue/builder.d.ts.map +1 -0
- package/dist/rescue/builder.js +164 -0
- package/dist/rescue/builder.js.map +1 -0
- package/dist/security/key-rotation.d.ts +153 -0
- package/dist/security/key-rotation.d.ts.map +1 -0
- package/dist/security/key-rotation.js +354 -0
- package/dist/security/key-rotation.js.map +1 -0
- package/dist/{sdk/semantics → semantics}/analyzer.d.ts.map +1 -1
- package/dist/{sdk/semantics → semantics}/analyzer.js.map +1 -1
- package/dist/semantics/decoder.d.ts.map +1 -0
- package/dist/semantics/decoder.js.map +1 -0
- package/dist/{sdk/semantics → semantics}/graph.d.ts.map +1 -1
- package/dist/{sdk/semantics → semantics}/graph.js.map +1 -1
- package/dist/semantics/idl-registry.d.ts +8 -0
- package/dist/semantics/idl-registry.d.ts.map +1 -0
- package/dist/{sdk/semantics → semantics}/idl-registry.js +23 -7
- package/dist/semantics/idl-registry.js.map +1 -0
- package/dist/semantics/types.d.ts +10 -0
- package/dist/semantics/types.d.ts.map +1 -0
- package/dist/{sdk → semantics}/types.js.map +1 -1
- package/dist/types.d.ts +23 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/address.d.ts +10 -0
- package/dist/utils/address.d.ts.map +1 -0
- package/dist/utils/address.js +45 -0
- package/dist/utils/address.js.map +1 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +38 -76
- package/LICENSE +0 -21
- package/README.md +0 -123
- package/SECURITY.md +0 -174
- package/bin/solvoid-scan +0 -2
- package/dist/cli/privacy-scan.d.ts +0 -11
- package/dist/cli/privacy-scan.d.ts.map +0 -1
- package/dist/cli/privacy-scan.js +0 -112
- package/dist/cli/privacy-scan.js.map +0 -1
- package/dist/cli/solvoid-scan.d.ts +0 -13
- package/dist/cli/solvoid-scan.d.ts.map +0 -1
- package/dist/cli/solvoid-scan.js +0 -174
- package/dist/cli/solvoid-scan.js.map +0 -1
- package/dist/cli/test-forensics.d.ts +0 -2
- package/dist/cli/test-forensics.d.ts.map +0 -1
- package/dist/cli/test-forensics.js +0 -90
- package/dist/cli/test-forensics.js.map +0 -1
- package/dist/cli/test-scenarios.d.ts +0 -2
- package/dist/cli/test-scenarios.d.ts.map +0 -1
- package/dist/cli/test-scenarios.js +0 -96
- package/dist/cli/test-scenarios.js.map +0 -1
- package/dist/examples/enterprise-demo.js +0 -65
- package/dist/sdk/client.d.ts +0 -77
- package/dist/sdk/client.d.ts.map +0 -1
- package/dist/sdk/client.js +0 -180
- package/dist/sdk/client.js.map +0 -1
- package/dist/sdk/compliance/identity.d.ts +0 -34
- package/dist/sdk/compliance/identity.d.ts.map +0 -1
- package/dist/sdk/compliance/identity.js +0 -55
- package/dist/sdk/compliance/identity.js.map +0 -1
- package/dist/sdk/compliance/threat-model.d.ts +0 -14
- package/dist/sdk/compliance/threat-model.d.ts.map +0 -1
- package/dist/sdk/compliance/threat-model.js +0 -101
- package/dist/sdk/compliance/threat-model.js.map +0 -1
- package/dist/sdk/forensics/mev.js +0 -50
- package/dist/sdk/forensics/order-flow.d.ts +0 -20
- package/dist/sdk/forensics/order-flow.d.ts.map +0 -1
- package/dist/sdk/forensics/order-flow.js +0 -104
- package/dist/sdk/forensics/order-flow.js.map +0 -1
- package/dist/sdk/forensics/simulation.d.ts +0 -14
- package/dist/sdk/forensics/simulation.d.ts.map +0 -1
- package/dist/sdk/forensics/simulation.js +0 -45
- package/dist/sdk/forensics/simulation.js.map +0 -1
- package/dist/sdk/index.d.ts.map +0 -1
- package/dist/sdk/index.js.map +0 -1
- package/dist/sdk/network/shadow-rpc.d.ts +0 -18
- package/dist/sdk/network/shadow-rpc.d.ts.map +0 -1
- package/dist/sdk/network/shadow-rpc.js +0 -32
- package/dist/sdk/network/shadow-rpc.js.map +0 -1
- package/dist/sdk/obfuscator.d.ts +0 -36
- package/dist/sdk/obfuscator.d.ts.map +0 -1
- package/dist/sdk/obfuscator.js +0 -77
- package/dist/sdk/obfuscator.js.map +0 -1
- package/dist/sdk/passport/manager.d.ts.map +0 -1
- package/dist/sdk/passport/manager.js +0 -107
- package/dist/sdk/passport/manager.js.map +0 -1
- package/dist/sdk/pipeline.d.ts +0 -34
- package/dist/sdk/pipeline.d.ts.map +0 -1
- package/dist/sdk/pipeline.js +0 -81
- package/dist/sdk/pipeline.js.map +0 -1
- package/dist/sdk/privacy/confidential-transfer.d.ts +0 -81
- package/dist/sdk/privacy/confidential-transfer.d.ts.map +0 -1
- package/dist/sdk/privacy/confidential-transfer.js +0 -158
- package/dist/sdk/privacy/confidential-transfer.js.map +0 -1
- package/dist/sdk/privacy/history.d.ts +0 -11
- package/dist/sdk/privacy/history.d.ts.map +0 -1
- package/dist/sdk/privacy/history.js +0 -110
- package/dist/sdk/privacy/history.js.map +0 -1
- package/dist/sdk/privacy/light-protocol.d.ts +0 -42
- package/dist/sdk/privacy/light-protocol.d.ts.map +0 -1
- package/dist/sdk/privacy/light-protocol.js +0 -83
- package/dist/sdk/privacy/light-protocol.js.map +0 -1
- package/dist/sdk/privacy/relayer.d.ts.map +0 -1
- package/dist/sdk/privacy/relayer.js.map +0 -1
- package/dist/sdk/privacy/safe-obfuscator.d.ts +0 -38
- package/dist/sdk/privacy/safe-obfuscator.d.ts.map +0 -1
- package/dist/sdk/privacy/safe-obfuscator.js +0 -101
- package/dist/sdk/privacy/safe-obfuscator.js.map +0 -1
- package/dist/sdk/privacy/shield.d.ts +0 -34
- package/dist/sdk/privacy/shield.d.ts.map +0 -1
- package/dist/sdk/privacy/shield.js +0 -174
- package/dist/sdk/privacy/shield.js.map +0 -1
- package/dist/sdk/privacy/zk.js +0 -43
- package/dist/sdk/privacy-engine.d.ts.map +0 -1
- package/dist/sdk/privacy-engine.js.map +0 -1
- package/dist/sdk/registry/idl-fetcher.d.ts +0 -17
- package/dist/sdk/registry/idl-fetcher.d.ts.map +0 -1
- package/dist/sdk/registry/idl-fetcher.js.map +0 -1
- package/dist/sdk/registry/programs.d.ts.map +0 -1
- package/dist/sdk/registry/programs.js.map +0 -1
- package/dist/sdk/rescue/analyzer.d.ts +0 -22
- package/dist/sdk/rescue/analyzer.d.ts.map +0 -1
- package/dist/sdk/rescue/analyzer.js +0 -46
- package/dist/sdk/rescue/analyzer.js.map +0 -1
- package/dist/sdk/rescue/builder.d.ts +0 -16
- package/dist/sdk/rescue/builder.d.ts.map +0 -1
- package/dist/sdk/rescue/builder.js +0 -33
- package/dist/sdk/rescue/builder.js.map +0 -1
- package/dist/sdk/semantics/decoder.d.ts.map +0 -1
- package/dist/sdk/semantics/decoder.js.map +0 -1
- package/dist/sdk/semantics/idl-registry.d.ts +0 -7
- package/dist/sdk/semantics/idl-registry.d.ts.map +0 -1
- package/dist/sdk/semantics/idl-registry.js.map +0 -1
- package/dist/sdk/semantics/types.d.ts +0 -44
- package/dist/sdk/semantics/types.d.ts.map +0 -1
- package/dist/sdk/semantics/types.js.map +0 -1
- package/dist/sdk/simulator.d.ts +0 -15
- package/dist/sdk/simulator.d.ts.map +0 -1
- package/dist/sdk/simulator.js +0 -133
- package/dist/sdk/simulator.js.map +0 -1
- package/dist/sdk/types.d.ts +0 -53
- package/dist/sdk/types.d.ts.map +0 -1
- package/dist/sdk/utils/config.d.ts.map +0 -1
- package/dist/sdk/utils/config.js.map +0 -1
- package/dist/sdk/utils/logger.d.ts.map +0 -1
- package/dist/sdk/utils/logger.js.map +0 -1
- package/dist/tests/unit/idl-registry.test.d.ts +0 -2
- package/dist/tests/unit/idl-registry.test.d.ts.map +0 -1
- package/dist/tests/unit/idl-registry.test.js +0 -35
- package/dist/tests/unit/idl-registry.test.js.map +0 -1
- package/dist/tools/exploit_demonstration.js +0 -99
- package/dist/tools/gen-tx.js +0 -29
- package/dist/tools/get-recent-tx.js +0 -18
- /package/dist/{sdk/privacy → privacy}/relayer.d.ts +0 -0
- /package/dist/{sdk/privacy → privacy}/relayer.js +0 -0
- /package/dist/{sdk/registry → registry}/programs.d.ts +0 -0
- /package/dist/{sdk/registry → registry}/programs.js +0 -0
- /package/dist/{sdk/semantics → semantics}/analyzer.d.ts +0 -0
- /package/dist/{sdk/semantics → semantics}/analyzer.js +0 -0
- /package/dist/{sdk/semantics → semantics}/decoder.d.ts +0 -0
- /package/dist/{sdk/semantics → semantics}/decoder.js +0 -0
- /package/dist/{sdk/semantics → semantics}/graph.d.ts +0 -0
- /package/dist/{sdk/semantics → semantics}/graph.js +0 -0
- /package/dist/{sdk/semantics → semantics}/types.js +0 -0
- /package/dist/{sdk/types.js → types.js} +0 -0
- /package/dist/{sdk/utils → utils}/config.d.ts +0 -0
- /package/dist/{sdk/utils → utils}/config.js +0 -0
- /package/dist/{sdk/utils → utils}/logger.d.ts +0 -0
- /package/dist/{sdk/utils → utils}/logger.js +0 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RescueAnalyzer = void 0;
|
|
4
|
+
const spl_token_1 = require("@solana/spl-token");
|
|
5
|
+
const bus_1 = require("../events/bus");
|
|
6
|
+
const integrity_1 = require("../integrity");
|
|
7
|
+
const NATIVE_SOL_MINT = '11111111111111111111111111111111';
|
|
8
|
+
class RescueAnalyzer {
|
|
9
|
+
constructor(connection) {
|
|
10
|
+
this.connection = connection;
|
|
11
|
+
}
|
|
12
|
+
async analyzeWallet(walletAddress, leaks) {
|
|
13
|
+
bus_1.EventBus.info('Analyzing wallet for multi-asset rescue...');
|
|
14
|
+
const leakedAssets = [];
|
|
15
|
+
const seenMints = new Set();
|
|
16
|
+
let totalValueLamports = 0;
|
|
17
|
+
let splTokenCount = 0;
|
|
18
|
+
let nativeSOL = 0;
|
|
19
|
+
const tokenAccounts = await this.connection.getParsedTokenAccountsByOwner(walletAddress, { programId: spl_token_1.TOKEN_PROGRAM_ID });
|
|
20
|
+
bus_1.EventBus.info(`Found ${tokenAccounts.value.length} token accounts`);
|
|
21
|
+
for (const leak of leaks) {
|
|
22
|
+
let mint = NATIVE_SOL_MINT;
|
|
23
|
+
if (leak.scope.includes(':')) {
|
|
24
|
+
const parts = leak.scope.split(':');
|
|
25
|
+
if (parts[1] && parts[1].length >= 32) {
|
|
26
|
+
mint = parts[1];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (!seenMints.has(mint)) {
|
|
30
|
+
seenMints.add(mint);
|
|
31
|
+
if (mint === NATIVE_SOL_MINT) {
|
|
32
|
+
const balance = await this.connection.getBalance(walletAddress);
|
|
33
|
+
nativeSOL = balance;
|
|
34
|
+
totalValueLamports += balance;
|
|
35
|
+
leakedAssets.push((0, integrity_1.enforce)(integrity_1.LeakedAssetSchema, {
|
|
36
|
+
mint,
|
|
37
|
+
mintName: 'SOL',
|
|
38
|
+
amount: balance,
|
|
39
|
+
decimals: 9,
|
|
40
|
+
reason: leak.description,
|
|
41
|
+
severity: leak.severity,
|
|
42
|
+
isNative: true
|
|
43
|
+
}, {
|
|
44
|
+
origin: integrity_1.DataOrigin.CHAIN,
|
|
45
|
+
trust: integrity_1.DataTrust.TRUSTED,
|
|
46
|
+
createdAt: Date.now(),
|
|
47
|
+
owner: 'RescueAnalyzer'
|
|
48
|
+
}).value);
|
|
49
|
+
bus_1.EventBus.leakDetected('Native SOL', leak.severity, `${balance / 1e9} SOL exposed`);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
const tokenAccount = tokenAccounts.value.find(ta => ta.account.data.parsed.info.mint === mint);
|
|
53
|
+
if (tokenAccount) {
|
|
54
|
+
const info = tokenAccount.account.data.parsed.info;
|
|
55
|
+
const amount = parseInt(info.tokenAmount.amount);
|
|
56
|
+
const decimals = info.tokenAmount.decimals;
|
|
57
|
+
splTokenCount++;
|
|
58
|
+
leakedAssets.push((0, integrity_1.enforce)(integrity_1.LeakedAssetSchema, {
|
|
59
|
+
mint,
|
|
60
|
+
amount,
|
|
61
|
+
decimals,
|
|
62
|
+
reason: leak.description,
|
|
63
|
+
severity: leak.severity,
|
|
64
|
+
isNative: false,
|
|
65
|
+
ataAddress: tokenAccount.pubkey.toBase58()
|
|
66
|
+
}, {
|
|
67
|
+
origin: integrity_1.DataOrigin.CHAIN,
|
|
68
|
+
trust: integrity_1.DataTrust.TRUSTED,
|
|
69
|
+
createdAt: Date.now(),
|
|
70
|
+
owner: 'RescueAnalyzer'
|
|
71
|
+
}).value);
|
|
72
|
+
bus_1.EventBus.leakDetected('SPL Token', leak.severity, `${amount / Math.pow(10, decimals)} tokens (${mint.slice(0, 8)}...)`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (leakedAssets.length === 0 && leaks.length > 0) {
|
|
78
|
+
const balance = await this.connection.getBalance(walletAddress);
|
|
79
|
+
if (balance > 0) {
|
|
80
|
+
nativeSOL = balance;
|
|
81
|
+
totalValueLamports += balance;
|
|
82
|
+
leakedAssets.push((0, integrity_1.enforce)(integrity_1.LeakedAssetSchema, {
|
|
83
|
+
mint: NATIVE_SOL_MINT,
|
|
84
|
+
mintName: 'SOL',
|
|
85
|
+
amount: balance,
|
|
86
|
+
decimals: 9,
|
|
87
|
+
reason: 'General privacy leak affecting wallet',
|
|
88
|
+
severity: leaks[0]?.severity || 'MEDIUM',
|
|
89
|
+
isNative: true
|
|
90
|
+
}, {
|
|
91
|
+
origin: integrity_1.DataOrigin.CHAIN,
|
|
92
|
+
trust: integrity_1.DataTrust.TRUSTED,
|
|
93
|
+
createdAt: Date.now(),
|
|
94
|
+
owner: 'RescueAnalyzer'
|
|
95
|
+
}).value);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const riskScore = this.calculateRiskScore(leaks);
|
|
99
|
+
const estimatedFee = this.estimateRescueFee(leakedAssets);
|
|
100
|
+
const analysis = {
|
|
101
|
+
leakedAssets,
|
|
102
|
+
totalValueLamports,
|
|
103
|
+
splTokenCount,
|
|
104
|
+
nativeSOL,
|
|
105
|
+
riskScore,
|
|
106
|
+
estimatedFee
|
|
107
|
+
};
|
|
108
|
+
bus_1.EventBus.info(`Rescue analysis complete: ${leakedAssets.length} assets, risk score ${riskScore}`);
|
|
109
|
+
return (0, integrity_1.enforce)(integrity_1.RescueAnalysisSchema, analysis, {
|
|
110
|
+
origin: integrity_1.DataOrigin.INTERNAL_LOGIC,
|
|
111
|
+
trust: integrity_1.DataTrust.TRUSTED,
|
|
112
|
+
createdAt: Date.now(),
|
|
113
|
+
owner: 'RescueAnalyzer'
|
|
114
|
+
}).value;
|
|
115
|
+
}
|
|
116
|
+
calculateRiskScore(leaks) {
|
|
117
|
+
const severityWeights = {
|
|
118
|
+
'CRITICAL': 40,
|
|
119
|
+
'HIGH': 25,
|
|
120
|
+
'MEDIUM': 15,
|
|
121
|
+
'LOW': 5
|
|
122
|
+
};
|
|
123
|
+
let score = 0;
|
|
124
|
+
for (const leak of leaks) {
|
|
125
|
+
score += severityWeights[leak.severity] || 10;
|
|
126
|
+
}
|
|
127
|
+
return Math.min(100, score);
|
|
128
|
+
}
|
|
129
|
+
estimateRescueFee(assets) {
|
|
130
|
+
let fee = 5000;
|
|
131
|
+
fee += assets.length * 5000;
|
|
132
|
+
fee += 50000;
|
|
133
|
+
return fee;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.RescueAnalyzer = RescueAnalyzer;
|
|
137
|
+
//# sourceMappingURL=analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../rescue/analyzer.ts"],"names":[],"mappings":";;;AAEA,iDAAqD;AACrD,uCAAyC;AAEzC,4CAMsB;AAYtB,MAAM,eAAe,GAAG,kCAAkC,CAAC;AAE3D,MAAa,cAAc;IAGvB,YAAY,UAAsB;QAC9B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,aAAwB,EAAE,KAAa;QAC9D,cAAQ,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAE5D,MAAM,YAAY,GAAkB,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,IAAI,kBAAkB,GAAG,CAAC,CAAC;QAC3B,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,6BAA6B,CACrE,aAAa,EACb,EAAE,SAAS,EAAE,4BAAgB,EAAE,CAClC,CAAC;QAEF,cAAQ,CAAC,IAAI,CAAC,SAAS,aAAa,CAAC,KAAK,CAAC,MAAM,iBAAiB,CAAC,CAAC;QAEpE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,IAAI,GAAG,eAAe,CAAC;YAE3B,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACpC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;oBACpC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACpB,CAAC;YACL,CAAC;YAED,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAEpB,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;oBAC3B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;oBAChE,SAAS,GAAG,OAAO,CAAC;oBACpB,kBAAkB,IAAI,OAAO,CAAC;oBAE9B,YAAY,CAAC,IAAI,CAAC,IAAA,mBAAO,EAAC,6BAAiB,EAAE;wBACzC,IAAI;wBACJ,QAAQ,EAAE,KAAK;wBACf,MAAM,EAAE,OAAO;wBACf,QAAQ,EAAE,CAAC;wBACX,MAAM,EAAE,IAAI,CAAC,WAAW;wBACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,QAAQ,EAAE,IAAI;qBACjB,EAAE;wBACC,MAAM,EAAE,sBAAU,CAAC,KAAK;wBACxB,KAAK,EAAE,qBAAS,CAAC,OAAO;wBACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,KAAK,EAAE,gBAAgB;qBAC1B,CAAC,CAAC,KAAK,CAAC,CAAC;oBAEV,cAAQ,CAAC,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,OAAO,GAAG,GAAG,cAAc,CAAC,CAAC;gBACvF,CAAC;qBAAM,CAAC;oBACJ,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CACzC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAClD,CAAC;oBAEF,IAAI,YAAY,EAAE,CAAC;wBACf,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;wBACnD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;wBACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;wBAC3C,aAAa,EAAE,CAAC;wBAEhB,YAAY,CAAC,IAAI,CAAC,IAAA,mBAAO,EAAC,6BAAiB,EAAE;4BACzC,IAAI;4BACJ,MAAM;4BACN,QAAQ;4BACR,MAAM,EAAE,IAAI,CAAC,WAAW;4BACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ;4BACvB,QAAQ,EAAE,KAAK;4BACf,UAAU,EAAE,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE;yBAC7C,EAAE;4BACC,MAAM,EAAE,sBAAU,CAAC,KAAK;4BACxB,KAAK,EAAE,qBAAS,CAAC,OAAO;4BACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;4BACrB,KAAK,EAAE,gBAAgB;yBAC1B,CAAC,CAAC,KAAK,CAAC,CAAC;wBAEV,cAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAC5C,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;oBAC9E,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;YAChE,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBACd,SAAS,GAAG,OAAO,CAAC;gBACpB,kBAAkB,IAAI,OAAO,CAAC;gBAC9B,YAAY,CAAC,IAAI,CAAC,IAAA,mBAAO,EAAC,6BAAiB,EAAE;oBACzC,IAAI,EAAE,eAAe;oBACrB,QAAQ,EAAE,KAAK;oBACf,MAAM,EAAE,OAAO;oBACf,QAAQ,EAAE,CAAC;oBACX,MAAM,EAAE,uCAAuC;oBAC/C,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,QAAQ;oBACxC,QAAQ,EAAE,IAAI;iBACjB,EAAE;oBACC,MAAM,EAAE,sBAAU,CAAC,KAAK;oBACxB,KAAK,EAAE,qBAAS,CAAC,OAAO;oBACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;oBACrB,KAAK,EAAE,gBAAgB;iBAC1B,CAAC,CAAC,KAAK,CAAC,CAAC;YACd,CAAC;QACL,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAE1D,MAAM,QAAQ,GAAG;YACb,YAAY;YACZ,kBAAkB;YAClB,aAAa;YACb,SAAS;YACT,SAAS;YACT,YAAY;SACf,CAAC;QAEF,cAAQ,CAAC,IAAI,CAAC,6BAA6B,YAAY,CAAC,MAAM,uBAAuB,SAAS,EAAE,CAAC,CAAC;QAElG,OAAO,IAAA,mBAAO,EAAC,gCAAoB,EAAE,QAAQ,EAAE;YAC3C,MAAM,EAAE,sBAAU,CAAC,cAAc;YACjC,KAAK,EAAE,qBAAS,CAAC,OAAO;YACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,KAAK,EAAE,gBAAgB;SAC1B,CAAC,CAAC,KAAK,CAAC;IACb,CAAC;IAEO,kBAAkB,CAAC,KAAa;QACpC,MAAM,eAAe,GAA2B;YAC5C,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE,CAAC;SACX,CAAC;QAEF,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,KAAK,IAAI,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClD,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;IAEO,iBAAiB,CAAC,MAA8B;QACpD,IAAI,GAAG,GAAG,IAAI,CAAC;QACf,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;QAC5B,GAAG,IAAI,KAAK,CAAC;QACb,OAAO,GAAG,CAAC;IACf,CAAC;CACJ;AA5JD,wCA4JC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { VersionedTransaction, PublicKey, Connection } from '@solana/web3.js';
|
|
2
|
+
import { PrivacyShield } from '../privacy/shield';
|
|
3
|
+
import { LeakedAsset } from './analyzer';
|
|
4
|
+
export interface RescueOptions {
|
|
5
|
+
readonly useJito?: boolean;
|
|
6
|
+
readonly jitoTipLamports?: number;
|
|
7
|
+
readonly useShadowRPC?: boolean;
|
|
8
|
+
readonly priorityFee?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class RescueBuilder {
|
|
11
|
+
private readonly shield;
|
|
12
|
+
private readonly connection;
|
|
13
|
+
constructor(connection: Connection, shield: PrivacyShield);
|
|
14
|
+
buildAtomicRescueTx(payer: PublicKey, leakedAssets: readonly LeakedAsset[], options?: RescueOptions): Promise<VersionedTransaction>;
|
|
15
|
+
private buildSOLDepositInstruction;
|
|
16
|
+
private buildTokenDepositInstructions;
|
|
17
|
+
private buildJitoTip;
|
|
18
|
+
submitJitoBundle(transactions: VersionedTransaction[]): Promise<{
|
|
19
|
+
readonly bundleId: string;
|
|
20
|
+
readonly status: string;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../rescue/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,oBAAoB,EACpB,SAAS,EACT,UAAU,EAIb,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAMzC,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CACjC;AAaD,qBAAa,aAAa;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;gBAE5B,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa;IAK5C,mBAAmB,CAC5B,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,SAAS,WAAW,EAAE,EACpC,OAAO,GAAE,aAAkB,GAC5B,OAAO,CAAC,oBAAoB,CAAC;YAmFlB,0BAA0B;YAuB1B,6BAA6B;YAuE7B,YAAY;IAmBb,gBAAgB,CACzB,YAAY,EAAE,oBAAoB,EAAE,GACrC,OAAO,CAAC;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CA0CrE"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RescueBuilder = void 0;
|
|
4
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
5
|
+
const spl_token_1 = require("@solana/spl-token");
|
|
6
|
+
const bus_1 = require("../events/bus");
|
|
7
|
+
const integrity_1 = require("../integrity");
|
|
8
|
+
const JITO_TIP_ACCOUNTS = [
|
|
9
|
+
'96gYZGLnJYVFmbjzopPSU6QiEV5fGqZNyN9nmNhvrZU5',
|
|
10
|
+
'HFqU5x63VTqvQss8hp11i4bVEWH5GBF7dSprRSQmAPP1',
|
|
11
|
+
'Cw8CFyM9FkoMi7K7Crf6HNQqf4uEMzpKw6QNghXLvLkY',
|
|
12
|
+
'ADaUMid9yfUytqMBgopwjb2DTLSokTSzL1zt6iGPaS49',
|
|
13
|
+
'DfXygSm4jCyNCybVYYK6DwvWqjKee8pbDmJGcLWNDXjh',
|
|
14
|
+
'ADuUkR4vqLUMWXxW9gh6D6L8pMSawimctcNZ5pGwDcEt',
|
|
15
|
+
'DttWaMuVvTiduZRnguLF7jNxTgiMBZ1hyAumKUiL2KRL',
|
|
16
|
+
'3AVi9Tg9Uo68tJfuvoKvqKNWKkC5wPdSSdeBnizKZ6jT'
|
|
17
|
+
];
|
|
18
|
+
class RescueBuilder {
|
|
19
|
+
constructor(connection, shield) {
|
|
20
|
+
this.connection = connection;
|
|
21
|
+
this.shield = shield;
|
|
22
|
+
}
|
|
23
|
+
async buildAtomicRescueTx(payer, leakedAssets, options = {}) {
|
|
24
|
+
bus_1.EventBus.info(`Building atomic rescue for ${leakedAssets.length} assets...`);
|
|
25
|
+
const instructions = [];
|
|
26
|
+
const commitments = [];
|
|
27
|
+
if (options.priorityFee || options.useJito) {
|
|
28
|
+
const fee = options.priorityFee || 100000;
|
|
29
|
+
instructions.push(web3_js_1.ComputeBudgetProgram.setComputeUnitPrice({
|
|
30
|
+
microLamports: fee
|
|
31
|
+
}));
|
|
32
|
+
bus_1.EventBus.info(`Priority fee set: ${fee} microLamports`);
|
|
33
|
+
}
|
|
34
|
+
if (options.useJito) {
|
|
35
|
+
const tipIx = await this.buildJitoTip(payer, options.jitoTipLamports);
|
|
36
|
+
instructions.push(tipIx);
|
|
37
|
+
bus_1.EventBus.info(`Jito tip added: ${(options.jitoTipLamports || 10000) / web3_js_1.LAMPORTS_PER_SOL} SOL`, { units: integrity_1.Unit.SOL });
|
|
38
|
+
}
|
|
39
|
+
for (const asset of leakedAssets) {
|
|
40
|
+
bus_1.EventBus.info(`Processing rescue for ${asset.isNative ? 'SOL' : asset.mint.slice(0, 8)}...`);
|
|
41
|
+
const commitmentData = await this.shield.generateCommitment(asset.amount);
|
|
42
|
+
commitments.push({
|
|
43
|
+
mint: asset.mint,
|
|
44
|
+
commitment: commitmentData.commitmentHex
|
|
45
|
+
});
|
|
46
|
+
const [vaultPDA] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from('vault')], this.shield.getProgramId());
|
|
47
|
+
const [statePDA] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from('state')], this.shield.getProgramId());
|
|
48
|
+
if (asset.isNative) {
|
|
49
|
+
const depositIx = await this.buildSOLDepositInstruction(payer, vaultPDA, statePDA, Buffer.from(commitmentData.commitmentHex, 'hex'), asset.amount);
|
|
50
|
+
instructions.push(depositIx);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
const tokenIxs = await this.buildTokenDepositInstructions(payer, vaultPDA, statePDA, new web3_js_1.PublicKey(asset.mint), asset.ataAddress ? new web3_js_1.PublicKey(asset.ataAddress) : undefined, Buffer.from(commitmentData.commitmentHex, 'hex'), asset.amount);
|
|
54
|
+
instructions.push(...tokenIxs);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const { blockhash } = await this.connection.getLatestBlockhash('finalized');
|
|
58
|
+
const messageV0 = new web3_js_1.TransactionMessage({
|
|
59
|
+
payerKey: payer,
|
|
60
|
+
recentBlockhash: blockhash,
|
|
61
|
+
instructions,
|
|
62
|
+
}).compileToV0Message();
|
|
63
|
+
const tx = new web3_js_1.VersionedTransaction(messageV0);
|
|
64
|
+
bus_1.EventBus.info(`Rescue transaction built: ${instructions.length} instructions`);
|
|
65
|
+
bus_1.EventBus.emit('COMMITMENT_CREATED', `Multi-asset rescue prepared`, {
|
|
66
|
+
assetCount: leakedAssets.length,
|
|
67
|
+
commitments: commitments.length,
|
|
68
|
+
useJito: options.useJito
|
|
69
|
+
});
|
|
70
|
+
return tx;
|
|
71
|
+
}
|
|
72
|
+
async buildSOLDepositInstruction(payer, vaultPDA, statePDA, commitment, amount) {
|
|
73
|
+
return new web3_js_1.TransactionInstruction({
|
|
74
|
+
keys: [
|
|
75
|
+
{ pubkey: statePDA, isSigner: false, isWritable: true },
|
|
76
|
+
{ pubkey: payer, isSigner: true, isWritable: true },
|
|
77
|
+
{ pubkey: vaultPDA, isSigner: false, isWritable: true },
|
|
78
|
+
{ pubkey: web3_js_1.SystemProgram.programId, isSigner: false, isWritable: false }
|
|
79
|
+
],
|
|
80
|
+
programId: this.shield.getProgramId(),
|
|
81
|
+
data: Buffer.concat([
|
|
82
|
+
Buffer.from([1]),
|
|
83
|
+
commitment,
|
|
84
|
+
Buffer.from(new BigUint64Array([BigInt(amount)]).buffer)
|
|
85
|
+
])
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async buildTokenDepositInstructions(payer, vaultPDA, statePDA, mint, sourceATA, commitment, amount) {
|
|
89
|
+
const instructions = [];
|
|
90
|
+
const vaultATA = await spl_token_1.Token.getAssociatedTokenAddress(spl_token_1.ASSOCIATED_TOKEN_PROGRAM_ID, spl_token_1.TOKEN_PROGRAM_ID, mint, vaultPDA, true);
|
|
91
|
+
const vaultATAInfo = await this.connection.getAccountInfo(vaultATA);
|
|
92
|
+
if (!vaultATAInfo) {
|
|
93
|
+
instructions.push(spl_token_1.Token.createAssociatedTokenAccountInstruction(spl_token_1.ASSOCIATED_TOKEN_PROGRAM_ID, spl_token_1.TOKEN_PROGRAM_ID, mint, vaultATA, vaultPDA, payer));
|
|
94
|
+
}
|
|
95
|
+
if (!sourceATA) {
|
|
96
|
+
sourceATA = await spl_token_1.Token.getAssociatedTokenAddress(spl_token_1.ASSOCIATED_TOKEN_PROGRAM_ID, spl_token_1.TOKEN_PROGRAM_ID, mint, payer);
|
|
97
|
+
}
|
|
98
|
+
instructions.push(spl_token_1.Token.createTransferInstruction(spl_token_1.TOKEN_PROGRAM_ID, sourceATA, vaultATA, payer, [], amount));
|
|
99
|
+
instructions.push(new web3_js_1.TransactionInstruction({
|
|
100
|
+
keys: [
|
|
101
|
+
{ pubkey: statePDA, isSigner: false, isWritable: true },
|
|
102
|
+
{ pubkey: payer, isSigner: true, isWritable: true },
|
|
103
|
+
{ pubkey: mint, isSigner: false, isWritable: false },
|
|
104
|
+
{ pubkey: spl_token_1.TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }
|
|
105
|
+
],
|
|
106
|
+
programId: this.shield.getProgramId(),
|
|
107
|
+
data: Buffer.concat([
|
|
108
|
+
Buffer.from([2]),
|
|
109
|
+
commitment,
|
|
110
|
+
mint.toBuffer()
|
|
111
|
+
])
|
|
112
|
+
}));
|
|
113
|
+
return instructions;
|
|
114
|
+
}
|
|
115
|
+
async buildJitoTip(payer, tipLamports = 10000) {
|
|
116
|
+
const tipAccountIndex = Math.floor(Math.random() * JITO_TIP_ACCOUNTS.length);
|
|
117
|
+
const tipAccountStr = JITO_TIP_ACCOUNTS[tipAccountIndex];
|
|
118
|
+
if (!tipAccountStr)
|
|
119
|
+
throw new Error("Invalid tip account index");
|
|
120
|
+
const tipAccount = new web3_js_1.PublicKey(tipAccountStr);
|
|
121
|
+
bus_1.EventBus.info(`Jito tip account selected: ${tipAccount.toBase58().slice(0, 8)}...`);
|
|
122
|
+
return web3_js_1.SystemProgram.transfer({
|
|
123
|
+
fromPubkey: payer,
|
|
124
|
+
toPubkey: tipAccount,
|
|
125
|
+
lamports: tipLamports
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
async submitJitoBundle(transactions) {
|
|
129
|
+
bus_1.EventBus.info(`Submitting ${transactions.length} transactions to Jito...`);
|
|
130
|
+
const JITO_BUNDLE_API = 'https://mainnet.block-engine.jito.wtf/api/v1/bundles';
|
|
131
|
+
try {
|
|
132
|
+
const serializedTxs = transactions.map(tx => Buffer.from(tx.serialize()).toString('base64'));
|
|
133
|
+
const response = await fetch(JITO_BUNDLE_API, {
|
|
134
|
+
method: 'POST',
|
|
135
|
+
headers: {
|
|
136
|
+
'Content-Type': 'application/json'
|
|
137
|
+
},
|
|
138
|
+
body: JSON.stringify({
|
|
139
|
+
jsonrpc: '2.0',
|
|
140
|
+
id: 1,
|
|
141
|
+
method: 'sendBundle',
|
|
142
|
+
params: [serializedTxs]
|
|
143
|
+
})
|
|
144
|
+
});
|
|
145
|
+
const result = (await response.json());
|
|
146
|
+
if (result.error) {
|
|
147
|
+
throw new Error(result.error.message);
|
|
148
|
+
}
|
|
149
|
+
const bundleId = result.result;
|
|
150
|
+
bus_1.EventBus.relayBroadcast(1, bundleId);
|
|
151
|
+
bus_1.EventBus.info(`Jito bundle submitted: ${bundleId}`);
|
|
152
|
+
return {
|
|
153
|
+
bundleId,
|
|
154
|
+
status: 'SUBMITTED'
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
bus_1.EventBus.error(`Jito submission failed: ${error.message}`);
|
|
159
|
+
throw error;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
exports.RescueBuilder = RescueBuilder;
|
|
164
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../rescue/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { Keypair } from '@solana/web3.js';
|
|
2
|
+
/**
|
|
3
|
+
* Key rotation configuration
|
|
4
|
+
*/
|
|
5
|
+
export interface KeyRotationConfig {
|
|
6
|
+
maxKeyAge: number;
|
|
7
|
+
rotationInterval: number;
|
|
8
|
+
backupEnabled: boolean;
|
|
9
|
+
encryptionEnabled: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Key metadata for rotation tracking
|
|
13
|
+
*/
|
|
14
|
+
export interface KeyMetadata {
|
|
15
|
+
keyId: string;
|
|
16
|
+
publicKey: string;
|
|
17
|
+
createdAt: number;
|
|
18
|
+
lastUsed: number;
|
|
19
|
+
usageCount: number;
|
|
20
|
+
isRetired: boolean;
|
|
21
|
+
retiredAt?: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Encrypted key backup
|
|
25
|
+
*/
|
|
26
|
+
export interface EncryptedKeyBackup {
|
|
27
|
+
keyId: string;
|
|
28
|
+
encryptedPrivateKey: string;
|
|
29
|
+
publicKey: string;
|
|
30
|
+
createdAt: number;
|
|
31
|
+
encryptionAlgorithm: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Key Rotation Manager
|
|
35
|
+
* Provides secure key lifecycle management with automatic rotation
|
|
36
|
+
*/
|
|
37
|
+
export declare class KeyRotationManager {
|
|
38
|
+
private currentKey;
|
|
39
|
+
private keyHistory;
|
|
40
|
+
private backups;
|
|
41
|
+
private config;
|
|
42
|
+
private rotationTimer?;
|
|
43
|
+
constructor(config?: Partial<KeyRotationConfig>);
|
|
44
|
+
/**
|
|
45
|
+
* Initialize current key metadata
|
|
46
|
+
*/
|
|
47
|
+
private initializeCurrentKey;
|
|
48
|
+
/**
|
|
49
|
+
* Generate unique key identifier
|
|
50
|
+
*/
|
|
51
|
+
private generateKeyId;
|
|
52
|
+
/**
|
|
53
|
+
* Start automatic rotation timer
|
|
54
|
+
*/
|
|
55
|
+
private startRotationTimer;
|
|
56
|
+
/**
|
|
57
|
+
* Check if key needs rotation and perform if necessary
|
|
58
|
+
*/
|
|
59
|
+
private checkAndRotate;
|
|
60
|
+
/**
|
|
61
|
+
* Determine if key should be rotated
|
|
62
|
+
*/
|
|
63
|
+
private shouldRotate;
|
|
64
|
+
/**
|
|
65
|
+
* Perform key rotation
|
|
66
|
+
*/
|
|
67
|
+
rotateKey(): Keypair;
|
|
68
|
+
/**
|
|
69
|
+
* Get current key metadata
|
|
70
|
+
*/
|
|
71
|
+
private getCurrentKeyMetadata;
|
|
72
|
+
/**
|
|
73
|
+
* Get current keypair
|
|
74
|
+
*/
|
|
75
|
+
getCurrentKey(): Keypair;
|
|
76
|
+
/**
|
|
77
|
+
* Update key usage statistics
|
|
78
|
+
*/
|
|
79
|
+
private updateKeyUsage;
|
|
80
|
+
/**
|
|
81
|
+
* Create encrypted backup of private key
|
|
82
|
+
*/
|
|
83
|
+
private createBackup;
|
|
84
|
+
/**
|
|
85
|
+
* Get encryption key (in production, use secure key management)
|
|
86
|
+
*/
|
|
87
|
+
private getEncryptionKey;
|
|
88
|
+
/**
|
|
89
|
+
* Find keypair by ID (simplified implementation)
|
|
90
|
+
*/
|
|
91
|
+
private findKeypairById;
|
|
92
|
+
/**
|
|
93
|
+
* Restore key from backup
|
|
94
|
+
*/
|
|
95
|
+
restoreFromBackup(keyId: string, encryptionKey?: string): Keypair;
|
|
96
|
+
/**
|
|
97
|
+
* Get key metadata by public key
|
|
98
|
+
*/
|
|
99
|
+
getKeyMetadata(publicKey: string): KeyMetadata | undefined;
|
|
100
|
+
/**
|
|
101
|
+
* Get all key metadata
|
|
102
|
+
*/
|
|
103
|
+
getAllKeyMetadata(): KeyMetadata[];
|
|
104
|
+
/**
|
|
105
|
+
* Get backup information
|
|
106
|
+
*/
|
|
107
|
+
getBackupInfo(): EncryptedKeyBackup[];
|
|
108
|
+
/**
|
|
109
|
+
* Force immediate rotation
|
|
110
|
+
*/
|
|
111
|
+
forceRotation(): Keypair;
|
|
112
|
+
/**
|
|
113
|
+
* Stop rotation timer
|
|
114
|
+
*/
|
|
115
|
+
stopRotation(): void;
|
|
116
|
+
/**
|
|
117
|
+
* Resume rotation timer
|
|
118
|
+
*/
|
|
119
|
+
resumeRotation(): void;
|
|
120
|
+
/**
|
|
121
|
+
* Cleanup old keys and backups
|
|
122
|
+
*/
|
|
123
|
+
cleanup(maxAge?: number): void;
|
|
124
|
+
/**
|
|
125
|
+
* Export configuration for persistence
|
|
126
|
+
*/
|
|
127
|
+
exportConfig(): {
|
|
128
|
+
config: KeyRotationConfig;
|
|
129
|
+
keyHistory: KeyMetadata[];
|
|
130
|
+
backups: EncryptedKeyBackup[];
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* Import configuration
|
|
134
|
+
*/
|
|
135
|
+
importConfig(data: {
|
|
136
|
+
config: KeyRotationConfig;
|
|
137
|
+
keyHistory: KeyMetadata[];
|
|
138
|
+
backups: EncryptedKeyBackup[];
|
|
139
|
+
}): void;
|
|
140
|
+
/**
|
|
141
|
+
* Destroy sensitive data
|
|
142
|
+
*/
|
|
143
|
+
destroy(): void;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get global key manager instance
|
|
147
|
+
*/
|
|
148
|
+
export declare function getKeyManager(config?: Partial<KeyRotationConfig>): KeyRotationManager;
|
|
149
|
+
/**
|
|
150
|
+
* Destroy global key manager
|
|
151
|
+
*/
|
|
152
|
+
export declare function destroyKeyManager(): void;
|
|
153
|
+
//# sourceMappingURL=key-rotation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-rotation.d.ts","sourceRoot":"","sources":["../../security/key-rotation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAI1C;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;CAC/B;AAED;;;GAGG;AACH,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,OAAO,CAA8C;IAC7D,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,aAAa,CAAC,CAAiB;gBAE3B,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM;IAcnD;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkB5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAMrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAM1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAiBpB;;OAEG;IACI,SAAS,IAAI,OAAO;IAe3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAW7B;;OAEG;IACI,aAAa,IAAI,OAAO;IAK/B;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAsCpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;IACI,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO;IAmBxE;;OAEG;IACI,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAKjE;;OAEG;IACI,iBAAiB,IAAI,WAAW,EAAE;IAIzC;;OAEG;IACI,aAAa,IAAI,kBAAkB,EAAE;IAI5C;;OAEG;IACI,aAAa,IAAI,OAAO;IAI/B;;OAEG;IACI,YAAY,IAAI,IAAI;IAO3B;;OAEG;IACI,cAAc,IAAI,IAAI;IAM7B;;OAEG;IACI,OAAO,CAAC,MAAM,GAAE,MAAgC,GAAG,IAAI;IAa9D;;OAEG;IACI,YAAY,IAAI;QACnB,MAAM,EAAE,iBAAiB,CAAC;QAC1B,UAAU,EAAE,WAAW,EAAE,CAAC;QAC1B,OAAO,EAAE,kBAAkB,EAAE,CAAC;KACjC;IAQD;;OAEG;IACI,YAAY,CAAC,IAAI,EAAE;QACtB,MAAM,EAAE,iBAAiB,CAAC;QAC1B,UAAU,EAAE,WAAW,EAAE,CAAC;QAC1B,OAAO,EAAE,kBAAkB,EAAE,CAAC;KACjC,GAAG,IAAI;IAkBR;;OAEG;IACI,OAAO,IAAI,IAAI;CAQzB;AAOD;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,kBAAkB,CAKrF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC"}
|