solvoid 1.0.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/LICENSE +21 -0
- package/README.md +123 -0
- package/SECURITY.md +174 -0
- package/bin/solvoid-scan +2 -0
- package/dist/cli/privacy-scan.d.ts +11 -0
- package/dist/cli/privacy-scan.d.ts.map +1 -0
- package/dist/cli/privacy-scan.js +112 -0
- package/dist/cli/privacy-scan.js.map +1 -0
- package/dist/cli/solvoid-scan.d.ts +13 -0
- package/dist/cli/solvoid-scan.d.ts.map +1 -0
- package/dist/cli/solvoid-scan.js +174 -0
- package/dist/cli/solvoid-scan.js.map +1 -0
- package/dist/cli/test-forensics.d.ts +2 -0
- package/dist/cli/test-forensics.d.ts.map +1 -0
- package/dist/cli/test-forensics.js +90 -0
- package/dist/cli/test-forensics.js.map +1 -0
- package/dist/cli/test-scenarios.d.ts +2 -0
- package/dist/cli/test-scenarios.d.ts.map +1 -0
- package/dist/cli/test-scenarios.js +96 -0
- package/dist/cli/test-scenarios.js.map +1 -0
- package/dist/examples/enterprise-demo.js +65 -0
- package/dist/sdk/client.d.ts +77 -0
- package/dist/sdk/client.d.ts.map +1 -0
- package/dist/sdk/client.js +180 -0
- package/dist/sdk/client.js.map +1 -0
- package/dist/sdk/compliance/identity.d.ts +34 -0
- package/dist/sdk/compliance/identity.d.ts.map +1 -0
- package/dist/sdk/compliance/identity.js +55 -0
- package/dist/sdk/compliance/identity.js.map +1 -0
- package/dist/sdk/compliance/threat-model.d.ts +14 -0
- package/dist/sdk/compliance/threat-model.d.ts.map +1 -0
- package/dist/sdk/compliance/threat-model.js +101 -0
- package/dist/sdk/compliance/threat-model.js.map +1 -0
- package/dist/sdk/forensics/mev.js +50 -0
- package/dist/sdk/forensics/order-flow.d.ts +20 -0
- package/dist/sdk/forensics/order-flow.d.ts.map +1 -0
- package/dist/sdk/forensics/order-flow.js +104 -0
- package/dist/sdk/forensics/order-flow.js.map +1 -0
- package/dist/sdk/forensics/simulation.d.ts +14 -0
- package/dist/sdk/forensics/simulation.d.ts.map +1 -0
- package/dist/sdk/forensics/simulation.js +45 -0
- package/dist/sdk/forensics/simulation.js.map +1 -0
- package/dist/sdk/index.d.ts +10 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/index.js +43 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/sdk/network/shadow-rpc.d.ts +18 -0
- package/dist/sdk/network/shadow-rpc.d.ts.map +1 -0
- package/dist/sdk/network/shadow-rpc.js +32 -0
- package/dist/sdk/network/shadow-rpc.js.map +1 -0
- package/dist/sdk/obfuscator.d.ts +36 -0
- package/dist/sdk/obfuscator.d.ts.map +1 -0
- package/dist/sdk/obfuscator.js +77 -0
- package/dist/sdk/obfuscator.js.map +1 -0
- package/dist/sdk/passport/manager.d.ts +36 -0
- package/dist/sdk/passport/manager.d.ts.map +1 -0
- package/dist/sdk/passport/manager.js +107 -0
- package/dist/sdk/passport/manager.js.map +1 -0
- package/dist/sdk/pipeline.d.ts +34 -0
- package/dist/sdk/pipeline.d.ts.map +1 -0
- package/dist/sdk/pipeline.js +81 -0
- package/dist/sdk/pipeline.js.map +1 -0
- package/dist/sdk/privacy/confidential-transfer.d.ts +81 -0
- package/dist/sdk/privacy/confidential-transfer.d.ts.map +1 -0
- package/dist/sdk/privacy/confidential-transfer.js +158 -0
- package/dist/sdk/privacy/confidential-transfer.js.map +1 -0
- package/dist/sdk/privacy/history.d.ts +11 -0
- package/dist/sdk/privacy/history.d.ts.map +1 -0
- package/dist/sdk/privacy/history.js +110 -0
- package/dist/sdk/privacy/history.js.map +1 -0
- package/dist/sdk/privacy/light-protocol.d.ts +42 -0
- package/dist/sdk/privacy/light-protocol.d.ts.map +1 -0
- package/dist/sdk/privacy/light-protocol.js +83 -0
- package/dist/sdk/privacy/light-protocol.js.map +1 -0
- package/dist/sdk/privacy/relayer.d.ts +12 -0
- package/dist/sdk/privacy/relayer.d.ts.map +1 -0
- package/dist/sdk/privacy/relayer.js +55 -0
- package/dist/sdk/privacy/relayer.js.map +1 -0
- package/dist/sdk/privacy/safe-obfuscator.d.ts +38 -0
- package/dist/sdk/privacy/safe-obfuscator.d.ts.map +1 -0
- package/dist/sdk/privacy/safe-obfuscator.js +101 -0
- package/dist/sdk/privacy/safe-obfuscator.js.map +1 -0
- package/dist/sdk/privacy/shield.d.ts +34 -0
- package/dist/sdk/privacy/shield.d.ts.map +1 -0
- package/dist/sdk/privacy/shield.js +174 -0
- package/dist/sdk/privacy/shield.js.map +1 -0
- package/dist/sdk/privacy/zk.js +43 -0
- package/dist/sdk/privacy-engine.d.ts +11 -0
- package/dist/sdk/privacy-engine.d.ts.map +1 -0
- package/dist/sdk/privacy-engine.js +165 -0
- package/dist/sdk/privacy-engine.js.map +1 -0
- package/dist/sdk/registry/idl-fetcher.d.ts +17 -0
- package/dist/sdk/registry/idl-fetcher.d.ts.map +1 -0
- package/dist/sdk/registry/idl-fetcher.js +98 -0
- package/dist/sdk/registry/idl-fetcher.js.map +1 -0
- package/dist/sdk/registry/programs.d.ts +18 -0
- package/dist/sdk/registry/programs.d.ts.map +1 -0
- package/dist/sdk/registry/programs.js +45 -0
- package/dist/sdk/registry/programs.js.map +1 -0
- package/dist/sdk/rescue/analyzer.d.ts +22 -0
- package/dist/sdk/rescue/analyzer.d.ts.map +1 -0
- package/dist/sdk/rescue/analyzer.js +46 -0
- package/dist/sdk/rescue/analyzer.js.map +1 -0
- package/dist/sdk/rescue/builder.d.ts +16 -0
- package/dist/sdk/rescue/builder.d.ts.map +1 -0
- package/dist/sdk/rescue/builder.js +33 -0
- package/dist/sdk/rescue/builder.js.map +1 -0
- package/dist/sdk/semantics/analyzer.d.ts +1 -0
- package/dist/sdk/semantics/analyzer.d.ts.map +1 -0
- package/dist/sdk/semantics/analyzer.js +2 -0
- package/dist/sdk/semantics/analyzer.js.map +1 -0
- package/dist/sdk/semantics/decoder.d.ts +7 -0
- package/dist/sdk/semantics/decoder.d.ts.map +1 -0
- package/dist/sdk/semantics/decoder.js +30 -0
- package/dist/sdk/semantics/decoder.js.map +1 -0
- package/dist/sdk/semantics/graph.d.ts +1 -0
- package/dist/sdk/semantics/graph.d.ts.map +1 -0
- package/dist/sdk/semantics/graph.js +2 -0
- package/dist/sdk/semantics/graph.js.map +1 -0
- package/dist/sdk/semantics/idl-registry.d.ts +7 -0
- package/dist/sdk/semantics/idl-registry.d.ts.map +1 -0
- package/dist/sdk/semantics/idl-registry.js +95 -0
- package/dist/sdk/semantics/idl-registry.js.map +1 -0
- package/dist/sdk/semantics/types.d.ts +44 -0
- package/dist/sdk/semantics/types.d.ts.map +1 -0
- package/dist/sdk/semantics/types.js +3 -0
- package/dist/sdk/semantics/types.js.map +1 -0
- package/dist/sdk/simulator.d.ts +15 -0
- package/dist/sdk/simulator.d.ts.map +1 -0
- package/dist/sdk/simulator.js +133 -0
- package/dist/sdk/simulator.js.map +1 -0
- package/dist/sdk/types.d.ts +53 -0
- package/dist/sdk/types.d.ts.map +1 -0
- package/dist/sdk/types.js +3 -0
- package/dist/sdk/types.js.map +1 -0
- package/dist/sdk/utils/config.d.ts +15 -0
- package/dist/sdk/utils/config.d.ts.map +1 -0
- package/dist/sdk/utils/config.js +40 -0
- package/dist/sdk/utils/config.js.map +1 -0
- package/dist/sdk/utils/logger.d.ts +3 -0
- package/dist/sdk/utils/logger.d.ts.map +1 -0
- package/dist/sdk/utils/logger.js +17 -0
- package/dist/sdk/utils/logger.js.map +1 -0
- package/dist/tests/unit/idl-registry.test.d.ts +2 -0
- package/dist/tests/unit/idl-registry.test.d.ts.map +1 -0
- package/dist/tests/unit/idl-registry.test.js +35 -0
- package/dist/tests/unit/idl-registry.test.js.map +1 -0
- package/dist/tools/exploit_demonstration.js +99 -0
- package/dist/tools/gen-tx.js +29 -0
- package/dist/tools/get-recent-tx.js +18 -0
- package/package.json +95 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PrivacyEngine = void 0;
|
|
4
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
5
|
+
const SYSTEM_PROGRAMS = [
|
|
6
|
+
"11111111111111111111111111111111",
|
|
7
|
+
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
|
|
8
|
+
"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",
|
|
9
|
+
];
|
|
10
|
+
class PrivacyEngine {
|
|
11
|
+
analyzeTransaction(tx) {
|
|
12
|
+
const leaks = [];
|
|
13
|
+
const accountKeys = tx.message.accountKeys;
|
|
14
|
+
const rootInstructions = tx.message.instructions;
|
|
15
|
+
const feePayer = accountKeys[0];
|
|
16
|
+
// Funding linkage: check if a fresh account was created in this tx
|
|
17
|
+
if (tx.meta?.logMessages?.some(log => log.includes("CreateAccount"))) {
|
|
18
|
+
leaks.push({
|
|
19
|
+
type: "identity",
|
|
20
|
+
scope: "funding",
|
|
21
|
+
visibility: "PUBLIC",
|
|
22
|
+
description: "Transaction initiated from a fresh account with direct creation history.",
|
|
23
|
+
remediation: "Use a Relayer to decouple fee payment from your main identity.",
|
|
24
|
+
severity: "HIGH"
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
// ATA Linkage: check if an ATA is created for the fee payer (direct identity link)
|
|
28
|
+
rootInstructions.forEach((ix) => {
|
|
29
|
+
const programId = accountKeys[ix.programIdIndex];
|
|
30
|
+
if (programId === "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL") {
|
|
31
|
+
const ownerIndex = ix.accounts[2];
|
|
32
|
+
const owner = accountKeys[ownerIndex];
|
|
33
|
+
if (owner === feePayer) {
|
|
34
|
+
leaks.push({
|
|
35
|
+
type: "identity",
|
|
36
|
+
scope: "ata_link",
|
|
37
|
+
visibility: "PUBLIC",
|
|
38
|
+
description: `ATA creation for fee payer (${owner.slice(0, 8)}) links identity to this token.`,
|
|
39
|
+
remediation: "Shield your token balances before interacting with new dApps.",
|
|
40
|
+
severity: "CRITICAL"
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
// Program diversity: high non-system program counts create a unique fingerprint
|
|
46
|
+
const uniquePrograms = new Set(rootInstructions.map(ix => accountKeys[ix.programIdIndex]));
|
|
47
|
+
const filteredPrograms = Array.from(uniquePrograms).filter(p => !SYSTEM_PROGRAMS.includes(p));
|
|
48
|
+
if (filteredPrograms.length > 2) {
|
|
49
|
+
leaks.push({
|
|
50
|
+
type: "metadata",
|
|
51
|
+
scope: "fingerprinting",
|
|
52
|
+
visibility: "PROGRAM",
|
|
53
|
+
description: `High entropy: Transaction touches ${filteredPrograms.length} distinct non-system programs.`,
|
|
54
|
+
remediation: "Split interactions across multiple transactions with varying intervals.",
|
|
55
|
+
severity: "MEDIUM"
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
// Binary check: searching for raw pubkeys in instruction payload
|
|
59
|
+
rootInstructions.forEach((ix, i) => {
|
|
60
|
+
const dataBase64 = ix.data;
|
|
61
|
+
const dataBuf = Buffer.from(dataBase64, 'base64');
|
|
62
|
+
const dataHex = dataBuf.toString('hex');
|
|
63
|
+
const payerBuf = new web3_js_1.PublicKey(feePayer).toBuffer();
|
|
64
|
+
const payerHex = payerBuf.toString('hex');
|
|
65
|
+
if (dataHex.includes(payerHex)) {
|
|
66
|
+
leaks.push({
|
|
67
|
+
type: "identity",
|
|
68
|
+
scope: `payload:${accountKeys[ix.programIdIndex]}`,
|
|
69
|
+
visibility: "PUBLIC",
|
|
70
|
+
description: `Critical: Signer public key leaked inside Instruction #${i} binary data.`,
|
|
71
|
+
remediation: "Use a SolVoid shim to mask pubkeys in non-private program calls.",
|
|
72
|
+
severity: "CRITICAL"
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
return leaks;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Score calculation based on weighted severity and frequency multipliers.
|
|
80
|
+
* Capped at 100, floored at 0 (or 15 with remediation).
|
|
81
|
+
*/
|
|
82
|
+
calculateScore(leaks) {
|
|
83
|
+
if (leaks.length === 0)
|
|
84
|
+
return 100;
|
|
85
|
+
let totalDeduction = 0;
|
|
86
|
+
const typeCounts = {};
|
|
87
|
+
const typesPresent = new Set();
|
|
88
|
+
const PENALTY_RANGES = {
|
|
89
|
+
"identity": [25, 40],
|
|
90
|
+
"cpi-linkage": [20, 35],
|
|
91
|
+
"state-leak": [15, 25],
|
|
92
|
+
"metadata": [10, 20]
|
|
93
|
+
};
|
|
94
|
+
const FREQUENCY_MULTIPLIERS = [1.0, 1.3, 1.6, 2.0];
|
|
95
|
+
const SCOPE_AMPLIFIERS = {
|
|
96
|
+
"PUBLIC": 1.5,
|
|
97
|
+
"PROGRAM": 1.2,
|
|
98
|
+
"LOCAL": 0.8
|
|
99
|
+
};
|
|
100
|
+
let totalRefundable = 0;
|
|
101
|
+
leaks.forEach(leak => {
|
|
102
|
+
const range = PENALTY_RANGES[leak.type] || [10, 20];
|
|
103
|
+
let basePenalty = 0;
|
|
104
|
+
switch (leak.severity) {
|
|
105
|
+
case "CRITICAL":
|
|
106
|
+
basePenalty = range[1];
|
|
107
|
+
break;
|
|
108
|
+
case "HIGH":
|
|
109
|
+
basePenalty = range[0] + (range[1] - range[0]) * 0.75;
|
|
110
|
+
break;
|
|
111
|
+
case "MEDIUM":
|
|
112
|
+
basePenalty = range[0] + (range[1] - range[0]) * 0.50;
|
|
113
|
+
break;
|
|
114
|
+
case "LOW":
|
|
115
|
+
basePenalty = range[0] + (range[1] - range[0]) * 0.25;
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
const count = (typeCounts[leak.type] || 0);
|
|
119
|
+
const freqMult = count >= 3 ? FREQUENCY_MULTIPLIERS[3] : FREQUENCY_MULTIPLIERS[count];
|
|
120
|
+
typeCounts[leak.type] = count + 1;
|
|
121
|
+
typesPresent.add(leak.type);
|
|
122
|
+
const scopeMult = SCOPE_AMPLIFIERS[leak.visibility] || 1.0;
|
|
123
|
+
const finalLeakPenalty = basePenalty * freqMult * scopeMult;
|
|
124
|
+
totalDeduction += finalLeakPenalty;
|
|
125
|
+
if (leak.remediation) {
|
|
126
|
+
totalRefundable += finalLeakPenalty * 0.3;
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
// Correlation penalties for cross-type leaks
|
|
130
|
+
let correlationDeduction = 0;
|
|
131
|
+
if (typesPresent.has("identity") && typesPresent.has("cpi-linkage"))
|
|
132
|
+
correlationDeduction += 15;
|
|
133
|
+
if (typesPresent.has("identity") && typesPresent.has("state-leak"))
|
|
134
|
+
correlationDeduction += 12;
|
|
135
|
+
if (typesPresent.has("cpi-linkage") && typesPresent.has("metadata"))
|
|
136
|
+
correlationDeduction += 10;
|
|
137
|
+
if (typesPresent.has("state-leak") && typesPresent.has("metadata"))
|
|
138
|
+
correlationDeduction += 8;
|
|
139
|
+
if (typesPresent.size >= 3)
|
|
140
|
+
correlationDeduction += 20;
|
|
141
|
+
totalDeduction += correlationDeduction;
|
|
142
|
+
let finalScore = 100 - totalDeduction + totalRefundable;
|
|
143
|
+
// Remediation cap: cannot exceed 80 if there were any deductions
|
|
144
|
+
const maxScoreWithRemediation = 80;
|
|
145
|
+
if (totalDeduction > 0 && finalScore > maxScoreWithRemediation) {
|
|
146
|
+
finalScore = maxScoreWithRemediation;
|
|
147
|
+
}
|
|
148
|
+
const anyRemediation = leaks.some(l => !!l.remediation);
|
|
149
|
+
if (anyRemediation && finalScore < 15) {
|
|
150
|
+
finalScore = 15;
|
|
151
|
+
}
|
|
152
|
+
return Math.min(100, Math.max(0, Math.round(finalScore)));
|
|
153
|
+
}
|
|
154
|
+
analyzeGeyserEvents(tx, events) {
|
|
155
|
+
const leaks = this.analyzeTransaction(tx);
|
|
156
|
+
// Placeholder for cross-tx state correlation analysis
|
|
157
|
+
events.accountUpdates.forEach(update => {
|
|
158
|
+
if (update.pubkey.includes("1111"))
|
|
159
|
+
return;
|
|
160
|
+
});
|
|
161
|
+
return leaks;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
exports.PrivacyEngine = PrivacyEngine;
|
|
165
|
+
//# sourceMappingURL=privacy-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy-engine.js","sourceRoot":"","sources":["../../sdk/privacy-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Idl } from '../semantics/types';
|
|
2
|
+
export declare class OnChainIdlFetcher {
|
|
3
|
+
private connection;
|
|
4
|
+
constructor(rpcUrl: string);
|
|
5
|
+
/**
|
|
6
|
+
* Real production logic to fetch Anchor IDL from on-chain account.
|
|
7
|
+
* 1. Derive PDA from [buffer("anchor:idl"), programId]
|
|
8
|
+
* 2. Fetch Account Data
|
|
9
|
+
* 3. Strip 8-byte discriminator
|
|
10
|
+
* 4. Read 4-byte length (little endian)
|
|
11
|
+
* 5. Read compressed bytes
|
|
12
|
+
* 6. Decompress (Inflate)
|
|
13
|
+
* 7. JSON Parse
|
|
14
|
+
*/
|
|
15
|
+
fetchIdl(programIdString: string): Promise<Idl | null>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=idl-fetcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idl-fetcher.d.ts","sourceRoot":"","sources":["../../../sdk/registry/idl-fetcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAGzC,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,UAAU,CAAa;gBAEnB,MAAM,EAAE,MAAM;IAI1B;;;;;;;;;OASG;IACU,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;CAgDtE"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.OnChainIdlFetcher = void 0;
|
|
37
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
38
|
+
const zlib = __importStar(require("zlib"));
|
|
39
|
+
class OnChainIdlFetcher {
|
|
40
|
+
constructor(rpcUrl) {
|
|
41
|
+
this.connection = new web3_js_1.Connection(rpcUrl);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Real production logic to fetch Anchor IDL from on-chain account.
|
|
45
|
+
* 1. Derive PDA from [buffer("anchor:idl"), programId]
|
|
46
|
+
* 2. Fetch Account Data
|
|
47
|
+
* 3. Strip 8-byte discriminator
|
|
48
|
+
* 4. Read 4-byte length (little endian)
|
|
49
|
+
* 5. Read compressed bytes
|
|
50
|
+
* 6. Decompress (Inflate)
|
|
51
|
+
* 7. JSON Parse
|
|
52
|
+
*/
|
|
53
|
+
async fetchIdl(programIdString) {
|
|
54
|
+
try {
|
|
55
|
+
// Validate public key format before attempting fetch
|
|
56
|
+
if (!/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(programIdString)) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
const programId = new web3_js_1.PublicKey(programIdString);
|
|
60
|
+
// 1. Derive Address
|
|
61
|
+
const [idlAddress] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("anchor:idl"), programId.toBuffer()], programId);
|
|
62
|
+
// 2. Fetch Account Info
|
|
63
|
+
const accountInfo = await this.connection.getAccountInfo(idlAddress);
|
|
64
|
+
if (!accountInfo)
|
|
65
|
+
return null; // No IDL stored on chain
|
|
66
|
+
// 3. Parse Data
|
|
67
|
+
const data = accountInfo.data;
|
|
68
|
+
const headerSize = 8 + 32;
|
|
69
|
+
if (data.length < headerSize + 4)
|
|
70
|
+
return null;
|
|
71
|
+
const compressedLen = data.readUInt32LE(headerSize);
|
|
72
|
+
const compressedBytes = data.subarray(headerSize + 4, headerSize + 4 + compressedLen);
|
|
73
|
+
// 4. Decompress
|
|
74
|
+
return new Promise((resolve) => {
|
|
75
|
+
zlib.inflate(compressedBytes, (err, buffer) => {
|
|
76
|
+
if (err) {
|
|
77
|
+
resolve(null);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
try {
|
|
81
|
+
const jsonString = buffer.toString('utf-8');
|
|
82
|
+
const idl = JSON.parse(jsonString);
|
|
83
|
+
resolve(idl);
|
|
84
|
+
}
|
|
85
|
+
catch (parseErr) {
|
|
86
|
+
resolve(null);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.OnChainIdlFetcher = OnChainIdlFetcher;
|
|
98
|
+
//# sourceMappingURL=idl-fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idl-fetcher.js","sourceRoot":"","sources":["../../../sdk/registry/idl-fetcher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAAwD;AAExD,2CAA6B;AAE7B,MAAa,iBAAiB;IAG1B,YAAY,MAAc;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,oBAAU,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;;;OASG;IACI,KAAK,CAAC,QAAQ,CAAC,eAAuB;QACzC,IAAI,CAAC;YACD,qDAAqD;YACrD,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;gBACzD,OAAO,IAAI,CAAC;YAChB,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,mBAAS,CAAC,eAAe,CAAC,CAAC;YAEjD,oBAAoB;YACpB,MAAM,CAAC,UAAU,CAAC,GAAG,mBAAS,CAAC,sBAAsB,CACjD,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,EACjD,SAAS,CACZ,CAAC;YAEF,wBAAwB;YACxB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YACrE,IAAI,CAAC,WAAW;gBAAE,OAAO,IAAI,CAAC,CAAC,yBAAyB;YAExD,gBAAgB;YAChB,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;YAC9B,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,MAAM,GAAG,UAAU,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YAE9C,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YACpD,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC;YAEtF,gBAAgB;YAChB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC3B,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;oBAC1C,IAAI,GAAG,EAAE,CAAC;wBACN,OAAO,CAAC,IAAI,CAAC,CAAC;oBAClB,CAAC;yBAAM,CAAC;wBACJ,IAAI,CAAC;4BACD,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;4BAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;4BACnC,OAAO,CAAC,GAAU,CAAC,CAAC;wBACxB,CAAC;wBAAC,OAAO,QAAQ,EAAE,CAAC;4BAChB,OAAO,CAAC,IAAI,CAAC,CAAC;wBAClB,CAAC;oBACL,CAAC;gBACL,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QAEP,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;CACJ;AAjED,8CAiEC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const KNOWN_PROGRAMS: {
|
|
2
|
+
"Raydium V4": string;
|
|
3
|
+
"Raydium CPMM": string;
|
|
4
|
+
"Orca Whirlpools": string;
|
|
5
|
+
"Jupiter Aggregator V6": string;
|
|
6
|
+
"Jupiter Limit Order": string;
|
|
7
|
+
"Pump.fun": string;
|
|
8
|
+
"Meteora DLMM": string;
|
|
9
|
+
Marginfi: string;
|
|
10
|
+
"Kamino Lending": string;
|
|
11
|
+
"System Program": string;
|
|
12
|
+
"Token Program": string;
|
|
13
|
+
"Associated Token": string;
|
|
14
|
+
"Memo Program": string;
|
|
15
|
+
};
|
|
16
|
+
export declare function identifyProgram(programId: string): string;
|
|
17
|
+
export declare function isSwapProgram(programId: string): boolean;
|
|
18
|
+
//# sourceMappingURL=programs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"programs.d.ts","sourceRoot":"","sources":["../../../sdk/registry/programs.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;CAmB1B,CAAC;AAGF,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAKzD;AAGD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAUxD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KNOWN_PROGRAMS = void 0;
|
|
4
|
+
exports.identifyProgram = identifyProgram;
|
|
5
|
+
exports.isSwapProgram = isSwapProgram;
|
|
6
|
+
// Real Mainnet Program IDs for accurate detection
|
|
7
|
+
exports.KNOWN_PROGRAMS = {
|
|
8
|
+
// DEXs / AMMs
|
|
9
|
+
"Raydium V4": "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8",
|
|
10
|
+
"Raydium CPMM": "CPMMoo8L3F4NbTneV256ygjSdjfKrist5a24gnsGf5V",
|
|
11
|
+
"Orca Whirlpools": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc",
|
|
12
|
+
"Jupiter Aggregator V6": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",
|
|
13
|
+
"Jupiter Limit Order": "jupoNjAxXgZ4rjzxzPMP4oxduvQsQtZzyknqvzLM8mK",
|
|
14
|
+
"Pump.fun": "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P", // Example ID, verify validity in real implementation
|
|
15
|
+
"Meteora DLMM": "LBUZKhRxPF3XUpBCjp4YzTkDZJUbDLw9Jq3DKzWzTcL",
|
|
16
|
+
// Lending
|
|
17
|
+
"Marginfi": "MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA",
|
|
18
|
+
"Kamino Lending": "KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD",
|
|
19
|
+
// System
|
|
20
|
+
"System Program": "11111111111111111111111111111111",
|
|
21
|
+
"Token Program": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
|
|
22
|
+
"Associated Token": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",
|
|
23
|
+
"Memo Program": "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcQb"
|
|
24
|
+
};
|
|
25
|
+
// Returns a human readable name if known, or truncated Hash
|
|
26
|
+
function identifyProgram(programId) {
|
|
27
|
+
for (const [name, id] of Object.entries(exports.KNOWN_PROGRAMS)) {
|
|
28
|
+
if (id === programId)
|
|
29
|
+
return name;
|
|
30
|
+
}
|
|
31
|
+
return `Unknown (${programId.slice(0, 8)}...)`;
|
|
32
|
+
}
|
|
33
|
+
// Logic to determine if a program is an AMM/Swap source
|
|
34
|
+
function isSwapProgram(programId) {
|
|
35
|
+
const swapIds = [
|
|
36
|
+
exports.KNOWN_PROGRAMS["Raydium V4"],
|
|
37
|
+
exports.KNOWN_PROGRAMS["Raydium CPMM"],
|
|
38
|
+
exports.KNOWN_PROGRAMS["Orca Whirlpools"],
|
|
39
|
+
exports.KNOWN_PROGRAMS["Jupiter Aggregator V6"],
|
|
40
|
+
exports.KNOWN_PROGRAMS["Meteora DLMM"],
|
|
41
|
+
exports.KNOWN_PROGRAMS["Pump.fun"]
|
|
42
|
+
];
|
|
43
|
+
return swapIds.includes(programId);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=programs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"programs.js","sourceRoot":"","sources":["../../../sdk/registry/programs.ts"],"names":[],"mappings":";;;AAuBA,0CAKC;AAGD,sCAUC;AAzCD,kDAAkD;AACrC,QAAA,cAAc,GAAG;IAC1B,cAAc;IACd,YAAY,EAAE,8CAA8C;IAC5D,cAAc,EAAE,6CAA6C;IAC7D,iBAAiB,EAAE,6CAA6C;IAChE,uBAAuB,EAAE,6CAA6C;IACtE,qBAAqB,EAAE,6CAA6C;IACpE,UAAU,EAAE,6CAA6C,EAAE,qDAAqD;IAChH,cAAc,EAAE,6CAA6C;IAE7D,UAAU;IACV,UAAU,EAAE,6CAA6C;IACzD,gBAAgB,EAAE,6CAA6C;IAE/D,SAAS;IACT,gBAAgB,EAAE,kCAAkC;IACpD,eAAe,EAAE,6CAA6C;IAC9D,kBAAkB,EAAE,8CAA8C;IAClE,cAAc,EAAE,6CAA6C;CAChE,CAAC;AAEF,4DAA4D;AAC5D,SAAgB,eAAe,CAAC,SAAiB;IAC7C,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,sBAAc,CAAC,EAAE,CAAC;QACtD,IAAI,EAAE,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;IACtC,CAAC;IACD,OAAO,YAAY,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;AACnD,CAAC;AAED,wDAAwD;AACxD,SAAgB,aAAa,CAAC,SAAiB;IAC3C,MAAM,OAAO,GAAG;QACZ,sBAAc,CAAC,YAAY,CAAC;QAC5B,sBAAc,CAAC,cAAc,CAAC;QAC9B,sBAAc,CAAC,iBAAiB,CAAC;QACjC,sBAAc,CAAC,uBAAuB,CAAC;QACvC,sBAAc,CAAC,cAAc,CAAC;QAC9B,sBAAc,CAAC,UAAU,CAAC;KAC7B,CAAC;IACF,OAAO,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Leak } from '../types';
|
|
2
|
+
export interface LeakedAsset {
|
|
3
|
+
mint: string;
|
|
4
|
+
amount?: number;
|
|
5
|
+
reason: string;
|
|
6
|
+
severity: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class RescueAnalyzer {
|
|
9
|
+
/**
|
|
10
|
+
* Parse scan results to find every compromised token mint.
|
|
11
|
+
* Looks for 'ata_link:Mint' or defaults to SOL.
|
|
12
|
+
*/
|
|
13
|
+
static identifyLeakedAssets(leaks: Leak[]): LeakedAsset[];
|
|
14
|
+
/**
|
|
15
|
+
* Estimated savings compared to a full wallet shield.
|
|
16
|
+
*/
|
|
17
|
+
static calculateSavings(leakedAssets: LeakedAsset[], totalBalance: number): {
|
|
18
|
+
amount: number;
|
|
19
|
+
percentage: number;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../../sdk/rescue/analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAc;IACvB;;;OAGG;WACW,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE;IA2BhE;;OAEG;WACW,gBAAgB,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;CAW5H"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RescueAnalyzer = void 0;
|
|
4
|
+
class RescueAnalyzer {
|
|
5
|
+
/**
|
|
6
|
+
* Parse scan results to find every compromised token mint.
|
|
7
|
+
* Looks for 'ata_link:Mint' or defaults to SOL.
|
|
8
|
+
*/
|
|
9
|
+
static identifyLeakedAssets(leaks) {
|
|
10
|
+
const leakedAssets = [];
|
|
11
|
+
const seenMints = new Set();
|
|
12
|
+
for (const leak of leaks) {
|
|
13
|
+
let mint = '11111111111111111111111111111111'; // Default SOL
|
|
14
|
+
if (leak.scope.includes(':')) {
|
|
15
|
+
const parts = leak.scope.split(':');
|
|
16
|
+
if (parts[1] && parts[1].length >= 32) {
|
|
17
|
+
mint = parts[1];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (!seenMints.has(mint)) {
|
|
21
|
+
leakedAssets.push({
|
|
22
|
+
mint,
|
|
23
|
+
reason: leak.description,
|
|
24
|
+
severity: leak.severity
|
|
25
|
+
});
|
|
26
|
+
seenMints.add(mint);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return leakedAssets;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Estimated savings compared to a full wallet shield.
|
|
33
|
+
*/
|
|
34
|
+
static calculateSavings(leakedAssets, totalBalance) {
|
|
35
|
+
// Dummy logic: assume each leaked asset averages 1.5 units
|
|
36
|
+
const leakedSum = leakedAssets.length * 1.5;
|
|
37
|
+
const savings = totalBalance - leakedSum;
|
|
38
|
+
const percentage = (savings / totalBalance) * 100;
|
|
39
|
+
return {
|
|
40
|
+
amount: Math.max(0, savings),
|
|
41
|
+
percentage: Math.min(100, Math.max(0, percentage))
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.RescueAnalyzer = RescueAnalyzer;
|
|
46
|
+
//# sourceMappingURL=analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../../sdk/rescue/analyzer.ts"],"names":[],"mappings":";;;AASA,MAAa,cAAc;IACvB;;;OAGG;IACI,MAAM,CAAC,oBAAoB,CAAC,KAAa;QAC5C,MAAM,YAAY,GAAkB,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QAEpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,IAAI,GAAG,kCAAkC,CAAC,CAAC,cAAc;YAE7D,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,YAAY,CAAC,IAAI,CAAC;oBACd,IAAI;oBACJ,MAAM,EAAE,IAAI,CAAC,WAAW;oBACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ;iBAC1B,CAAC,CAAC;gBACH,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;QACL,CAAC;QAED,OAAO,YAAY,CAAC;IACxB,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,gBAAgB,CAAC,YAA2B,EAAE,YAAoB;QAC5E,2DAA2D;QAC3D,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,GAAG,GAAG,CAAC;QAC5C,MAAM,OAAO,GAAG,YAAY,GAAG,SAAS,CAAC;QACzC,MAAM,UAAU,GAAG,CAAC,OAAO,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC;QAElD,OAAO;YACH,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;YAC5B,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;SACrD,CAAC;IACN,CAAC;CACJ;AA9CD,wCA8CC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { VersionedTransaction, PublicKey, Connection } from '@solana/web3.js';
|
|
2
|
+
import { PrivacyShield } from '../privacy/shield';
|
|
3
|
+
import { LeakedAsset } from './analyzer';
|
|
4
|
+
export declare class RescueBuilder {
|
|
5
|
+
private shield;
|
|
6
|
+
private connection;
|
|
7
|
+
constructor(connection: Connection, shield: PrivacyShield);
|
|
8
|
+
/**
|
|
9
|
+
* Bundle multiple shielding instructions into a single v0 transaction.
|
|
10
|
+
*/
|
|
11
|
+
buildAtomicRescueTx(payer: PublicKey, leakedAssets: LeakedAsset[], _options?: {
|
|
12
|
+
useJito?: boolean;
|
|
13
|
+
useShadowRPC?: boolean;
|
|
14
|
+
}): Promise<VersionedTransaction>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../sdk/rescue/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,oBAAoB,EACpB,SAAS,EACT,UAAU,EACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,qBAAa,aAAa;IACtB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAa;gBAEnB,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa;IAKzD;;OAEG;IACU,mBAAmB,CAC5B,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,WAAW,EAAE,EAC3B,QAAQ,GAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO,GAC7D,OAAO,CAAC,oBAAoB,CAAC;CAuBnC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
+
class RescueBuilder {
|
|
6
|
+
constructor(connection, shield) {
|
|
7
|
+
this.connection = connection;
|
|
8
|
+
this.shield = shield;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Bundle multiple shielding instructions into a single v0 transaction.
|
|
12
|
+
*/
|
|
13
|
+
async buildAtomicRescueTx(payer, leakedAssets, _options = {}) {
|
|
14
|
+
for (const asset of leakedAssets) {
|
|
15
|
+
// New commitment per asset to break link
|
|
16
|
+
this.shield.generateCommitment();
|
|
17
|
+
web3_js_1.PublicKey.findProgramAddressSync([Buffer.from('vault')], this.shield.getProgramId());
|
|
18
|
+
web3_js_1.PublicKey.findProgramAddressSync([Buffer.from('state')], this.shield.getProgramId());
|
|
19
|
+
// Build individual deposit instructions here in a full impl
|
|
20
|
+
console.log(`Building rescue instruction for ${asset.mint.slice(0, 8)}...`);
|
|
21
|
+
}
|
|
22
|
+
const { blockhash } = await this.connection.getLatestBlockhash();
|
|
23
|
+
// Atomic v0 bundle
|
|
24
|
+
const messageV0 = new web3_js_1.TransactionMessage({
|
|
25
|
+
payerKey: payer,
|
|
26
|
+
recentBlockhash: blockhash,
|
|
27
|
+
instructions: [],
|
|
28
|
+
}).compileToV0Message();
|
|
29
|
+
return new web3_js_1.VersionedTransaction(messageV0);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.RescueBuilder = RescueBuilder;
|
|
33
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../sdk/rescue/builder.ts"],"names":[],"mappings":";;;AAAA,6CAKyB;AAIzB,MAAa,aAAa;IAItB,YAAY,UAAsB,EAAE,MAAqB;QACrD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,mBAAmB,CAC5B,KAAgB,EAChB,YAA2B,EAC3B,WAA0D,EAAE;QAE5D,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YAC/B,yCAAyC;YACzC,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAEjC,mBAAS,CAAC,sBAAsB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YACrF,mBAAS,CAAC,sBAAsB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YAErF,4DAA4D;YAC5D,OAAO,CAAC,GAAG,CAAC,mCAAmC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC;QAEjE,mBAAmB;QACnB,MAAM,SAAS,GAAG,IAAI,4BAAkB,CAAC;YACrC,QAAQ,EAAE,KAAK;YACf,eAAe,EAAE,SAAS;YAC1B,YAAY,EAAE,EAAE;SACnB,CAAC,CAAC,kBAAkB,EAAE,CAAC;QAExB,OAAO,IAAI,8BAAoB,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;CACJ;AAvCD,sCAuCC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../../sdk/semantics/analyzer.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../../sdk/semantics/analyzer.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decoder.d.ts","sourceRoot":"","sources":["../../../sdk/semantics/decoder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAE9B,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,IAAI,CAA+B;IAEpC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG;IAIvC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG;CAgBvD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InstructionDecoder = void 0;
|
|
4
|
+
class InstructionDecoder {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.idls = new Map();
|
|
7
|
+
}
|
|
8
|
+
registerIdl(programId, idl) {
|
|
9
|
+
this.idls.set(programId, idl);
|
|
10
|
+
}
|
|
11
|
+
decode(programId, _data) {
|
|
12
|
+
const idl = this.idls.get(programId);
|
|
13
|
+
if (!idl)
|
|
14
|
+
return null;
|
|
15
|
+
// Simplified: Attempt to find which instruction this matches
|
|
16
|
+
// In reality, uses 8-byte discriminator
|
|
17
|
+
for (const ix of idl.instructions) {
|
|
18
|
+
try {
|
|
19
|
+
// Here we would use the layouts to decode
|
|
20
|
+
return { name: ix.name, data: "Decoded semantic data" };
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.InstructionDecoder = InstructionDecoder;
|
|
30
|
+
//# sourceMappingURL=decoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decoder.js","sourceRoot":"","sources":["../../../sdk/semantics/decoder.ts"],"names":[],"mappings":";;;AAEA,MAAa,kBAAkB;IAA/B;QACY,SAAI,GAAqB,IAAI,GAAG,EAAE,CAAC;IAsB/C,CAAC;IApBU,WAAW,CAAC,SAAiB,EAAE,GAAQ;QAC1C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IAEM,MAAM,CAAC,SAAiB,EAAE,KAAa;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,6DAA6D;QAC7D,wCAAwC;QACxC,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC;gBACD,0CAA0C;gBAC1C,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;YAC5D,CAAC;YAAC,MAAM,CAAC;gBACL,SAAS;YACb,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAvBD,gDAuBC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../sdk/semantics/graph.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../sdk/semantics/graph.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idl-registry.d.ts","sourceRoot":"","sources":["../../../sdk/semantics/idl-registry.ts"],"names":[],"mappings":"AAiEA,qBAAa,WAAW;IACpB,OAAO,CAAC,KAAK,CAAmB;;IASnB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAoBtD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI;CAGxD"}
|