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.
Files changed (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +123 -0
  3. package/SECURITY.md +174 -0
  4. package/bin/solvoid-scan +2 -0
  5. package/dist/cli/privacy-scan.d.ts +11 -0
  6. package/dist/cli/privacy-scan.d.ts.map +1 -0
  7. package/dist/cli/privacy-scan.js +112 -0
  8. package/dist/cli/privacy-scan.js.map +1 -0
  9. package/dist/cli/solvoid-scan.d.ts +13 -0
  10. package/dist/cli/solvoid-scan.d.ts.map +1 -0
  11. package/dist/cli/solvoid-scan.js +174 -0
  12. package/dist/cli/solvoid-scan.js.map +1 -0
  13. package/dist/cli/test-forensics.d.ts +2 -0
  14. package/dist/cli/test-forensics.d.ts.map +1 -0
  15. package/dist/cli/test-forensics.js +90 -0
  16. package/dist/cli/test-forensics.js.map +1 -0
  17. package/dist/cli/test-scenarios.d.ts +2 -0
  18. package/dist/cli/test-scenarios.d.ts.map +1 -0
  19. package/dist/cli/test-scenarios.js +96 -0
  20. package/dist/cli/test-scenarios.js.map +1 -0
  21. package/dist/examples/enterprise-demo.js +65 -0
  22. package/dist/sdk/client.d.ts +77 -0
  23. package/dist/sdk/client.d.ts.map +1 -0
  24. package/dist/sdk/client.js +180 -0
  25. package/dist/sdk/client.js.map +1 -0
  26. package/dist/sdk/compliance/identity.d.ts +34 -0
  27. package/dist/sdk/compliance/identity.d.ts.map +1 -0
  28. package/dist/sdk/compliance/identity.js +55 -0
  29. package/dist/sdk/compliance/identity.js.map +1 -0
  30. package/dist/sdk/compliance/threat-model.d.ts +14 -0
  31. package/dist/sdk/compliance/threat-model.d.ts.map +1 -0
  32. package/dist/sdk/compliance/threat-model.js +101 -0
  33. package/dist/sdk/compliance/threat-model.js.map +1 -0
  34. package/dist/sdk/forensics/mev.js +50 -0
  35. package/dist/sdk/forensics/order-flow.d.ts +20 -0
  36. package/dist/sdk/forensics/order-flow.d.ts.map +1 -0
  37. package/dist/sdk/forensics/order-flow.js +104 -0
  38. package/dist/sdk/forensics/order-flow.js.map +1 -0
  39. package/dist/sdk/forensics/simulation.d.ts +14 -0
  40. package/dist/sdk/forensics/simulation.d.ts.map +1 -0
  41. package/dist/sdk/forensics/simulation.js +45 -0
  42. package/dist/sdk/forensics/simulation.js.map +1 -0
  43. package/dist/sdk/index.d.ts +10 -0
  44. package/dist/sdk/index.d.ts.map +1 -0
  45. package/dist/sdk/index.js +43 -0
  46. package/dist/sdk/index.js.map +1 -0
  47. package/dist/sdk/network/shadow-rpc.d.ts +18 -0
  48. package/dist/sdk/network/shadow-rpc.d.ts.map +1 -0
  49. package/dist/sdk/network/shadow-rpc.js +32 -0
  50. package/dist/sdk/network/shadow-rpc.js.map +1 -0
  51. package/dist/sdk/obfuscator.d.ts +36 -0
  52. package/dist/sdk/obfuscator.d.ts.map +1 -0
  53. package/dist/sdk/obfuscator.js +77 -0
  54. package/dist/sdk/obfuscator.js.map +1 -0
  55. package/dist/sdk/passport/manager.d.ts +36 -0
  56. package/dist/sdk/passport/manager.d.ts.map +1 -0
  57. package/dist/sdk/passport/manager.js +107 -0
  58. package/dist/sdk/passport/manager.js.map +1 -0
  59. package/dist/sdk/pipeline.d.ts +34 -0
  60. package/dist/sdk/pipeline.d.ts.map +1 -0
  61. package/dist/sdk/pipeline.js +81 -0
  62. package/dist/sdk/pipeline.js.map +1 -0
  63. package/dist/sdk/privacy/confidential-transfer.d.ts +81 -0
  64. package/dist/sdk/privacy/confidential-transfer.d.ts.map +1 -0
  65. package/dist/sdk/privacy/confidential-transfer.js +158 -0
  66. package/dist/sdk/privacy/confidential-transfer.js.map +1 -0
  67. package/dist/sdk/privacy/history.d.ts +11 -0
  68. package/dist/sdk/privacy/history.d.ts.map +1 -0
  69. package/dist/sdk/privacy/history.js +110 -0
  70. package/dist/sdk/privacy/history.js.map +1 -0
  71. package/dist/sdk/privacy/light-protocol.d.ts +42 -0
  72. package/dist/sdk/privacy/light-protocol.d.ts.map +1 -0
  73. package/dist/sdk/privacy/light-protocol.js +83 -0
  74. package/dist/sdk/privacy/light-protocol.js.map +1 -0
  75. package/dist/sdk/privacy/relayer.d.ts +12 -0
  76. package/dist/sdk/privacy/relayer.d.ts.map +1 -0
  77. package/dist/sdk/privacy/relayer.js +55 -0
  78. package/dist/sdk/privacy/relayer.js.map +1 -0
  79. package/dist/sdk/privacy/safe-obfuscator.d.ts +38 -0
  80. package/dist/sdk/privacy/safe-obfuscator.d.ts.map +1 -0
  81. package/dist/sdk/privacy/safe-obfuscator.js +101 -0
  82. package/dist/sdk/privacy/safe-obfuscator.js.map +1 -0
  83. package/dist/sdk/privacy/shield.d.ts +34 -0
  84. package/dist/sdk/privacy/shield.d.ts.map +1 -0
  85. package/dist/sdk/privacy/shield.js +174 -0
  86. package/dist/sdk/privacy/shield.js.map +1 -0
  87. package/dist/sdk/privacy/zk.js +43 -0
  88. package/dist/sdk/privacy-engine.d.ts +11 -0
  89. package/dist/sdk/privacy-engine.d.ts.map +1 -0
  90. package/dist/sdk/privacy-engine.js +165 -0
  91. package/dist/sdk/privacy-engine.js.map +1 -0
  92. package/dist/sdk/registry/idl-fetcher.d.ts +17 -0
  93. package/dist/sdk/registry/idl-fetcher.d.ts.map +1 -0
  94. package/dist/sdk/registry/idl-fetcher.js +98 -0
  95. package/dist/sdk/registry/idl-fetcher.js.map +1 -0
  96. package/dist/sdk/registry/programs.d.ts +18 -0
  97. package/dist/sdk/registry/programs.d.ts.map +1 -0
  98. package/dist/sdk/registry/programs.js +45 -0
  99. package/dist/sdk/registry/programs.js.map +1 -0
  100. package/dist/sdk/rescue/analyzer.d.ts +22 -0
  101. package/dist/sdk/rescue/analyzer.d.ts.map +1 -0
  102. package/dist/sdk/rescue/analyzer.js +46 -0
  103. package/dist/sdk/rescue/analyzer.js.map +1 -0
  104. package/dist/sdk/rescue/builder.d.ts +16 -0
  105. package/dist/sdk/rescue/builder.d.ts.map +1 -0
  106. package/dist/sdk/rescue/builder.js +33 -0
  107. package/dist/sdk/rescue/builder.js.map +1 -0
  108. package/dist/sdk/semantics/analyzer.d.ts +1 -0
  109. package/dist/sdk/semantics/analyzer.d.ts.map +1 -0
  110. package/dist/sdk/semantics/analyzer.js +2 -0
  111. package/dist/sdk/semantics/analyzer.js.map +1 -0
  112. package/dist/sdk/semantics/decoder.d.ts +7 -0
  113. package/dist/sdk/semantics/decoder.d.ts.map +1 -0
  114. package/dist/sdk/semantics/decoder.js +30 -0
  115. package/dist/sdk/semantics/decoder.js.map +1 -0
  116. package/dist/sdk/semantics/graph.d.ts +1 -0
  117. package/dist/sdk/semantics/graph.d.ts.map +1 -0
  118. package/dist/sdk/semantics/graph.js +2 -0
  119. package/dist/sdk/semantics/graph.js.map +1 -0
  120. package/dist/sdk/semantics/idl-registry.d.ts +7 -0
  121. package/dist/sdk/semantics/idl-registry.d.ts.map +1 -0
  122. package/dist/sdk/semantics/idl-registry.js +95 -0
  123. package/dist/sdk/semantics/idl-registry.js.map +1 -0
  124. package/dist/sdk/semantics/types.d.ts +44 -0
  125. package/dist/sdk/semantics/types.d.ts.map +1 -0
  126. package/dist/sdk/semantics/types.js +3 -0
  127. package/dist/sdk/semantics/types.js.map +1 -0
  128. package/dist/sdk/simulator.d.ts +15 -0
  129. package/dist/sdk/simulator.d.ts.map +1 -0
  130. package/dist/sdk/simulator.js +133 -0
  131. package/dist/sdk/simulator.js.map +1 -0
  132. package/dist/sdk/types.d.ts +53 -0
  133. package/dist/sdk/types.d.ts.map +1 -0
  134. package/dist/sdk/types.js +3 -0
  135. package/dist/sdk/types.js.map +1 -0
  136. package/dist/sdk/utils/config.d.ts +15 -0
  137. package/dist/sdk/utils/config.d.ts.map +1 -0
  138. package/dist/sdk/utils/config.js +40 -0
  139. package/dist/sdk/utils/config.js.map +1 -0
  140. package/dist/sdk/utils/logger.d.ts +3 -0
  141. package/dist/sdk/utils/logger.d.ts.map +1 -0
  142. package/dist/sdk/utils/logger.js +17 -0
  143. package/dist/sdk/utils/logger.js.map +1 -0
  144. package/dist/tests/unit/idl-registry.test.d.ts +2 -0
  145. package/dist/tests/unit/idl-registry.test.d.ts.map +1 -0
  146. package/dist/tests/unit/idl-registry.test.js +35 -0
  147. package/dist/tests/unit/idl-registry.test.js.map +1 -0
  148. package/dist/tools/exploit_demonstration.js +99 -0
  149. package/dist/tools/gen-tx.js +29 -0
  150. package/dist/tools/get-recent-tx.js +18 -0
  151. 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,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../../sdk/semantics/analyzer.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import { Idl } from './types';
2
+ export declare class InstructionDecoder {
3
+ private idls;
4
+ registerIdl(programId: string, idl: Idl): void;
5
+ decode(programId: string, _data: Buffer): any;
6
+ }
7
+ //# sourceMappingURL=decoder.d.ts.map
@@ -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,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../sdk/semantics/graph.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export declare class IdlRegistry {
2
+ private cache;
3
+ constructor();
4
+ fetchIdl(programId: string): Promise<any | null>;
5
+ registerIdl(programId: string, idl: any): void;
6
+ }
7
+ //# sourceMappingURL=idl-registry.d.ts.map
@@ -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"}