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,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Light Protocol (ZK State Compression) Manager
|
|
3
|
+
*
|
|
4
|
+
* This module provides interfaces for Light Protocol's privacy features.
|
|
5
|
+
*
|
|
6
|
+
* PRIVACY GUARANTEES:
|
|
7
|
+
* - ✅ Hides sender identity (within anonymity set)
|
|
8
|
+
* - ✅ Hides receiver identity (within anonymity set)
|
|
9
|
+
* - ✅ Hides transfer amounts
|
|
10
|
+
*/
|
|
11
|
+
import { PublicKey, TransactionInstruction } from '@solana/web3.js';
|
|
12
|
+
/**
|
|
13
|
+
* Manager for Light Protocol (ZK Compression).
|
|
14
|
+
*/
|
|
15
|
+
export declare class LightProtocolManager {
|
|
16
|
+
constructor(_rpcUrl: string);
|
|
17
|
+
/**
|
|
18
|
+
* Shields SOL from a Public Account to a Private (Compressed) Account.
|
|
19
|
+
*/
|
|
20
|
+
createShieldSolInstruction(user: PublicKey, amountLamports: number): Promise<TransactionInstruction>;
|
|
21
|
+
/**
|
|
22
|
+
* Shields an SPL Token.
|
|
23
|
+
* NOTE: Requires CompressedTokenProgram setup.
|
|
24
|
+
*/
|
|
25
|
+
createShieldSplInstruction(_user: PublicKey, _mint: PublicKey, _tokenAccount: PublicKey, _amount: number): Promise<TransactionInstruction>;
|
|
26
|
+
/**
|
|
27
|
+
* Unshields (Decompresses) SOL back to Public State.
|
|
28
|
+
*
|
|
29
|
+
* NOTE: This is a simplified interface. Full implementation
|
|
30
|
+
* requires input accounts and validity proofs from the Light SDK.
|
|
31
|
+
*/
|
|
32
|
+
createUnshieldSolInstruction(_user: PublicKey, _destPublic: PublicKey, _amountLamports: number): Promise<TransactionInstruction>;
|
|
33
|
+
/**
|
|
34
|
+
* Get privacy capabilities summary
|
|
35
|
+
*/
|
|
36
|
+
static getPrivacyCapabilities(): {
|
|
37
|
+
hides: string[];
|
|
38
|
+
exposes: string[];
|
|
39
|
+
requirements: string[];
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=light-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"light-protocol.d.ts","sourceRoot":"","sources":["../../../sdk/privacy/light-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,EACH,SAAS,EACT,sBAAsB,EACzB,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,qBAAa,oBAAoB;gBACjB,OAAO,EAAE,MAAM;IAI3B;;OAEG;IACU,0BAA0B,CACnC,IAAI,EAAE,SAAS,EACf,cAAc,EAAE,MAAM,GACvB,OAAO,CAAC,sBAAsB,CAAC;IAgBlC;;;OAGG;IACU,0BAA0B,CACnC,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,SAAS,EACxB,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,sBAAsB,CAAC;IAOlC;;;;;OAKG;IACU,4BAA4B,CACrC,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,SAAS,EACtB,eAAe,EAAE,MAAM,GACxB,OAAO,CAAC,sBAAsB,CAAC;IAOlC;;OAEG;WACW,sBAAsB,IAAI;QACpC,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,YAAY,EAAE,MAAM,EAAE,CAAC;KAC1B;CAmBJ"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Light Protocol (ZK State Compression) Manager
|
|
4
|
+
*
|
|
5
|
+
* This module provides interfaces for Light Protocol's privacy features.
|
|
6
|
+
*
|
|
7
|
+
* PRIVACY GUARANTEES:
|
|
8
|
+
* - ✅ Hides sender identity (within anonymity set)
|
|
9
|
+
* - ✅ Hides receiver identity (within anonymity set)
|
|
10
|
+
* - ✅ Hides transfer amounts
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.LightProtocolManager = void 0;
|
|
14
|
+
const stateless_js_1 = require("@lightprotocol/stateless.js");
|
|
15
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
16
|
+
/**
|
|
17
|
+
* Manager for Light Protocol (ZK Compression).
|
|
18
|
+
*/
|
|
19
|
+
class LightProtocolManager {
|
|
20
|
+
constructor(_rpcUrl) {
|
|
21
|
+
// RPC URL stored for future operations
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Shields SOL from a Public Account to a Private (Compressed) Account.
|
|
25
|
+
*/
|
|
26
|
+
async createShieldSolInstruction(user, amountLamports) {
|
|
27
|
+
const ix = stateless_js_1.LightSystemProgram.compress({
|
|
28
|
+
payer: user,
|
|
29
|
+
toAddress: user,
|
|
30
|
+
lamports: (0, stateless_js_1.bn)(amountLamports),
|
|
31
|
+
outputStateTreeInfo: {
|
|
32
|
+
tree: web3_js_1.PublicKey.default,
|
|
33
|
+
queue: web3_js_1.PublicKey.default,
|
|
34
|
+
cpiContext: undefined,
|
|
35
|
+
treeType: stateless_js_1.TreeType.StateV1,
|
|
36
|
+
nextTreeInfo: null
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
return ix;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Shields an SPL Token.
|
|
43
|
+
* NOTE: Requires CompressedTokenProgram setup.
|
|
44
|
+
*/
|
|
45
|
+
async createShieldSplInstruction(_user, _mint, _tokenAccount, _amount) {
|
|
46
|
+
throw new Error("SPL Token compression requires CompressedTokenProgram setup. " +
|
|
47
|
+
"Please use @lightprotocol/compressed-token for token operations.");
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Unshields (Decompresses) SOL back to Public State.
|
|
51
|
+
*
|
|
52
|
+
* NOTE: This is a simplified interface. Full implementation
|
|
53
|
+
* requires input accounts and validity proofs from the Light SDK.
|
|
54
|
+
*/
|
|
55
|
+
async createUnshieldSolInstruction(_user, _destPublic, _amountLamports) {
|
|
56
|
+
throw new Error("Decompress requires input accounts and validity proofs. " +
|
|
57
|
+
"Use @lightprotocol/stateless.js directly for unshielding operations.");
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get privacy capabilities summary
|
|
61
|
+
*/
|
|
62
|
+
static getPrivacyCapabilities() {
|
|
63
|
+
return {
|
|
64
|
+
hides: [
|
|
65
|
+
"Sender identity (within anonymity set)",
|
|
66
|
+
"Receiver identity (within anonymity set)",
|
|
67
|
+
"Transfer amounts"
|
|
68
|
+
],
|
|
69
|
+
exposes: [
|
|
70
|
+
"That a shielding/unshielding transaction occurred",
|
|
71
|
+
"Approximate timing",
|
|
72
|
+
"Total value entering/exiting the shielded pool"
|
|
73
|
+
],
|
|
74
|
+
requirements: [
|
|
75
|
+
"Wait time between shield/unshield for better privacy",
|
|
76
|
+
"Use fresh wallet for unshielding",
|
|
77
|
+
"Avoid distinctive amounts"
|
|
78
|
+
]
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
exports.LightProtocolManager = LightProtocolManager;
|
|
83
|
+
//# sourceMappingURL=light-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"light-protocol.js","sourceRoot":"","sources":["../../../sdk/privacy/light-protocol.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAEH,8DAIqC;AACrC,6CAGyB;AAEzB;;GAEG;AACH,MAAa,oBAAoB;IAC7B,YAAY,OAAe;QACvB,uCAAuC;IAC3C,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,0BAA0B,CACnC,IAAe,EACf,cAAsB;QAEtB,MAAM,EAAE,GAAG,iCAAkB,CAAC,QAAQ,CAAC;YACnC,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,IAAA,iBAAE,EAAC,cAAc,CAAC;YAC5B,mBAAmB,EAAE;gBACjB,IAAI,EAAE,mBAAS,CAAC,OAAO;gBACvB,KAAK,EAAE,mBAAS,CAAC,OAAO;gBACxB,UAAU,EAAE,SAAS;gBACrB,QAAQ,EAAE,uBAAQ,CAAC,OAAO;gBAC1B,YAAY,EAAE,IAAI;aACrB;SACJ,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACd,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,0BAA0B,CACnC,KAAgB,EAChB,KAAgB,EAChB,aAAwB,EACxB,OAAe;QAEf,MAAM,IAAI,KAAK,CACX,+DAA+D;YAC/D,kEAAkE,CACrE,CAAC;IACN,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,4BAA4B,CACrC,KAAgB,EAChB,WAAsB,EACtB,eAAuB;QAEvB,MAAM,IAAI,KAAK,CACX,0DAA0D;YAC1D,sEAAsE,CACzE,CAAC;IACN,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,sBAAsB;QAKhC,OAAO;YACH,KAAK,EAAE;gBACH,wCAAwC;gBACxC,0CAA0C;gBAC1C,kBAAkB;aACrB;YACD,OAAO,EAAE;gBACL,mDAAmD;gBACnD,oBAAoB;gBACpB,gDAAgD;aACnD;YACD,YAAY,EAAE;gBACV,sDAAsD;gBACtD,kCAAkC;gBAClC,2BAA2B;aAC9B;SACJ,CAAC;IACN,CAAC;CACJ;AAtFD,oDAsFC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Connection } from '@solana/web3.js';
|
|
2
|
+
/**
|
|
3
|
+
* Privacy Relayer
|
|
4
|
+
* Facilitates gasless (for the user) and unlinkable withdrawals.
|
|
5
|
+
*/
|
|
6
|
+
export declare class PrivacyRelayer {
|
|
7
|
+
private relayerKeypair;
|
|
8
|
+
private program;
|
|
9
|
+
constructor(connection: Connection, relayerSecretKey: Uint8Array, _programId: string, idl: any);
|
|
10
|
+
start(port?: number): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=relayer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relayer.d.ts","sourceRoot":"","sources":["../../../sdk/privacy/relayer.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,UAAU,EAIb,MAAM,iBAAiB,CAAC;AAIzB;;;GAGG;AACH,qBAAa,cAAc;IACvB,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,OAAO,CAAU;gBAGrB,UAAU,EAAE,UAAU,EACtB,gBAAgB,EAAE,UAAU,EAC5B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,GAAG;IAUC,KAAK,CAAC,IAAI,GAAE,MAAa;CAyCzC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PrivacyRelayer = void 0;
|
|
7
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
8
|
+
const anchor_1 = require("@coral-xyz/anchor");
|
|
9
|
+
const express_1 = __importDefault(require("express"));
|
|
10
|
+
/**
|
|
11
|
+
* Privacy Relayer
|
|
12
|
+
* Facilitates gasless (for the user) and unlinkable withdrawals.
|
|
13
|
+
*/
|
|
14
|
+
class PrivacyRelayer {
|
|
15
|
+
constructor(connection, relayerSecretKey, _programId, idl) {
|
|
16
|
+
this.relayerKeypair = web3_js_1.Keypair.fromSecretKey(relayerSecretKey);
|
|
17
|
+
const wallet = new anchor_1.Wallet(this.relayerKeypair);
|
|
18
|
+
const provider = new anchor_1.AnchorProvider(connection, wallet, {
|
|
19
|
+
preflightCommitment: 'confirmed',
|
|
20
|
+
});
|
|
21
|
+
this.program = new anchor_1.Program(idl, provider);
|
|
22
|
+
}
|
|
23
|
+
async start(port = 3000) {
|
|
24
|
+
const app = (0, express_1.default)();
|
|
25
|
+
app.use(express_1.default.json());
|
|
26
|
+
app.post('/withdraw', async (req, res) => {
|
|
27
|
+
try {
|
|
28
|
+
const { nullifierHash, root, proof, recipient } = req.body;
|
|
29
|
+
const [vaultPda] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from('vault')], this.program.programId);
|
|
30
|
+
const [statePda] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from('state')], this.program.programId);
|
|
31
|
+
const tx = await this.program.methods
|
|
32
|
+
.withdraw(nullifierHash, root, proof)
|
|
33
|
+
.accounts({
|
|
34
|
+
state: statePda,
|
|
35
|
+
vault: vaultPda,
|
|
36
|
+
recipient: new web3_js_1.PublicKey(recipient),
|
|
37
|
+
relayer: this.relayerKeypair.publicKey,
|
|
38
|
+
systemProgram: web3_js_1.SystemProgram.programId,
|
|
39
|
+
})
|
|
40
|
+
.signers([this.relayerKeypair])
|
|
41
|
+
.rpc();
|
|
42
|
+
res.json({ success: true, txid: tx });
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.error('Relayer error:', error);
|
|
46
|
+
res.status(500).json({ success: false, error: 'Withdrawal failed' });
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
app.listen(port, () => {
|
|
50
|
+
console.log(`Privacy Relayer running on port ${port}`);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.PrivacyRelayer = PrivacyRelayer;
|
|
55
|
+
//# sourceMappingURL=relayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relayer.js","sourceRoot":"","sources":["../../../sdk/privacy/relayer.ts"],"names":[],"mappings":";;;;;;AAAA,6CAKyB;AACzB,8CAAoE;AACpE,sDAAqD;AAErD;;;GAGG;AACH,MAAa,cAAc;IAIvB,YACI,UAAsB,EACtB,gBAA4B,EAC5B,UAAkB,EAClB,GAAQ;QAER,IAAI,CAAC,cAAc,GAAG,iBAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,uBAAc,CAAC,UAAU,EAAE,MAAM,EAAE;YACpD,mBAAmB,EAAE,WAAW;SACnC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,OAAe,IAAI;QAClC,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;QACtB,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAExB,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;YACxD,IAAI,CAAC;gBACD,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;gBAE3D,MAAM,CAAC,QAAQ,CAAC,GAAG,mBAAS,CAAC,sBAAsB,CAC/C,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EACtB,IAAI,CAAC,OAAO,CAAC,SAAS,CACzB,CAAC;gBAEF,MAAM,CAAC,QAAQ,CAAC,GAAG,mBAAS,CAAC,sBAAsB,CAC/C,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EACtB,IAAI,CAAC,OAAO,CAAC,SAAS,CACzB,CAAC;gBAEF,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO;qBAChC,QAAQ,CAAC,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC;qBACpC,QAAQ,CAAC;oBACN,KAAK,EAAE,QAAQ;oBACf,KAAK,EAAE,QAAQ;oBACf,SAAS,EAAE,IAAI,mBAAS,CAAC,SAAS,CAAC;oBACnC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS;oBACtC,aAAa,EAAE,uBAAa,CAAC,SAAS;iBAClC,CAAC;qBACR,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;qBAC9B,GAAG,EAAE,CAAC;gBAEX,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;gBACvC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACzE,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YAClB,OAAO,CAAC,GAAG,CAAC,mCAAmC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AA3DD,wCA2DC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ⚠️ DEPRECATED - THIS MODULE IS REMOVED ⚠️
|
|
3
|
+
*
|
|
4
|
+
* The SafeObfuscator class has been REMOVED because:
|
|
5
|
+
*
|
|
6
|
+
* 1. It provided NO PRIVACY - the funding trace immediately deanonymizes users
|
|
7
|
+
* 2. It gave users a FALSE SENSE OF SECURITY
|
|
8
|
+
* 3. It was WORSE than doing nothing (unusual patterns draw attention)
|
|
9
|
+
*
|
|
10
|
+
* WHAT TO USE INSTEAD:
|
|
11
|
+
*
|
|
12
|
+
* For MEV Protection:
|
|
13
|
+
* import { JitoClient } from '@jito-foundation/jito-ts';
|
|
14
|
+
* // Use Jito bundles to bypass public mempool
|
|
15
|
+
*
|
|
16
|
+
* For Amount Privacy:
|
|
17
|
+
* import { ConfidentialTokenManager } from './confidential-transfer';
|
|
18
|
+
* // Use Token-2022 Confidential Transfers
|
|
19
|
+
*
|
|
20
|
+
* For Full Privacy:
|
|
21
|
+
* import { LightProtocolManager } from './light-protocol';
|
|
22
|
+
* // Use Light Protocol ZK Compression
|
|
23
|
+
*
|
|
24
|
+
* This file exists only to provide a clear error message for any code
|
|
25
|
+
* that was previously using SafeObfuscator.
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* @deprecated REMOVED - Use LightProtocolManager or ConfidentialTokenManager instead
|
|
29
|
+
*/
|
|
30
|
+
export declare class SafeObfuscator {
|
|
31
|
+
constructor(_forceDryRun?: boolean);
|
|
32
|
+
obfuscateSafely(..._args: any[]): Promise<never>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Migration helper - shows users how to migrate from SafeObfuscator
|
|
36
|
+
*/
|
|
37
|
+
export declare function getObfuscatorMigrationGuide(): string;
|
|
38
|
+
//# sourceMappingURL=safe-obfuscator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-obfuscator.d.ts","sourceRoot":"","sources":["../../../sdk/privacy/safe-obfuscator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH;;GAEG;AACH,qBAAa,cAAc;gBACX,YAAY,GAAE,OAAe;IAa5B,eAAe,CAAC,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;CAGhE;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,CA+CpD"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ⚠️ DEPRECATED - THIS MODULE IS REMOVED ⚠️
|
|
4
|
+
*
|
|
5
|
+
* The SafeObfuscator class has been REMOVED because:
|
|
6
|
+
*
|
|
7
|
+
* 1. It provided NO PRIVACY - the funding trace immediately deanonymizes users
|
|
8
|
+
* 2. It gave users a FALSE SENSE OF SECURITY
|
|
9
|
+
* 3. It was WORSE than doing nothing (unusual patterns draw attention)
|
|
10
|
+
*
|
|
11
|
+
* WHAT TO USE INSTEAD:
|
|
12
|
+
*
|
|
13
|
+
* For MEV Protection:
|
|
14
|
+
* import { JitoClient } from '@jito-foundation/jito-ts';
|
|
15
|
+
* // Use Jito bundles to bypass public mempool
|
|
16
|
+
*
|
|
17
|
+
* For Amount Privacy:
|
|
18
|
+
* import { ConfidentialTokenManager } from './confidential-transfer';
|
|
19
|
+
* // Use Token-2022 Confidential Transfers
|
|
20
|
+
*
|
|
21
|
+
* For Full Privacy:
|
|
22
|
+
* import { LightProtocolManager } from './light-protocol';
|
|
23
|
+
* // Use Light Protocol ZK Compression
|
|
24
|
+
*
|
|
25
|
+
* This file exists only to provide a clear error message for any code
|
|
26
|
+
* that was previously using SafeObfuscator.
|
|
27
|
+
*/
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.SafeObfuscator = void 0;
|
|
30
|
+
exports.getObfuscatorMigrationGuide = getObfuscatorMigrationGuide;
|
|
31
|
+
/**
|
|
32
|
+
* @deprecated REMOVED - Use LightProtocolManager or ConfidentialTokenManager instead
|
|
33
|
+
*/
|
|
34
|
+
class SafeObfuscator {
|
|
35
|
+
constructor(_forceDryRun = false) {
|
|
36
|
+
throw new Error("SafeObfuscator has been REMOVED. " +
|
|
37
|
+
"It provided no privacy and gave users a false sense of security. " +
|
|
38
|
+
"The SessionKey funding trace immediately deanonymizes users. " +
|
|
39
|
+
"\n\n" +
|
|
40
|
+
"Use instead:\n" +
|
|
41
|
+
"- For MEV protection: @jito-foundation/jito-ts\n" +
|
|
42
|
+
"- For amount privacy: ConfidentialTokenManager\n" +
|
|
43
|
+
"- For full privacy: LightProtocolManager\n");
|
|
44
|
+
}
|
|
45
|
+
async obfuscateSafely(..._args) {
|
|
46
|
+
throw new Error("SafeObfuscator has been removed. See class documentation for alternatives.");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.SafeObfuscator = SafeObfuscator;
|
|
50
|
+
/**
|
|
51
|
+
* Migration helper - shows users how to migrate from SafeObfuscator
|
|
52
|
+
*/
|
|
53
|
+
function getObfuscatorMigrationGuide() {
|
|
54
|
+
return `
|
|
55
|
+
╔══════════════════════════════════════════════════════════════════════════════╗
|
|
56
|
+
║ SAFE OBFUSCATOR MIGRATION GUIDE ║
|
|
57
|
+
╠══════════════════════════════════════════════════════════════════════════════╣
|
|
58
|
+
║ ║
|
|
59
|
+
║ SafeObfuscator has been REMOVED because it provided NO PRIVACY. ║
|
|
60
|
+
║ ║
|
|
61
|
+
║ The "obfuscation" approach was fundamentally broken: ║
|
|
62
|
+
║ • You had to fund the SessionKey from your main wallet ║
|
|
63
|
+
║ • This created an instant, permanent on-chain link ║
|
|
64
|
+
║ • Chain analysts could deanonymize in seconds ║
|
|
65
|
+
║ ║
|
|
66
|
+
║ ═══════════════════════════════════════════════════════════════════════ ║
|
|
67
|
+
║ MIGRATION OPTIONS: ║
|
|
68
|
+
║ ═══════════════════════════════════════════════════════════════════════ ║
|
|
69
|
+
║ ║
|
|
70
|
+
║ 1. FOR MEV PROTECTION (most common use case): ║
|
|
71
|
+
║ ┌─────────────────────────────────────────────────────────────────┐ ║
|
|
72
|
+
║ │ import { searcherClient } from '@jito-foundation/jito-ts'; │ ║
|
|
73
|
+
║ │ │ ║
|
|
74
|
+
║ │ // Send via Jito's private mempool │ ║
|
|
75
|
+
║ │ const bundle = await client.sendBundle([signedTx]); │ ║
|
|
76
|
+
║ └─────────────────────────────────────────────────────────────────┘ ║
|
|
77
|
+
║ ║
|
|
78
|
+
║ 2. FOR HIDING TRANSFER AMOUNTS: ║
|
|
79
|
+
║ ┌─────────────────────────────────────────────────────────────────┐ ║
|
|
80
|
+
║ │ import { ConfidentialTokenManager } from './confidential'; │ ║
|
|
81
|
+
║ │ │ ║
|
|
82
|
+
║ │ const manager = new ConfidentialTokenManager(connection); │ ║
|
|
83
|
+
║ │ const depositIx = await manager.createDepositPublicToPrivate( │ ║
|
|
84
|
+
║ │ mint, tokenAccount, owner, amount │ ║
|
|
85
|
+
║ │ ); │ ║
|
|
86
|
+
║ └─────────────────────────────────────────────────────────────────┘ ║
|
|
87
|
+
║ ║
|
|
88
|
+
║ 3. FOR FULL PRIVACY (hide sender, receiver, and amounts): ║
|
|
89
|
+
║ ┌─────────────────────────────────────────────────────────────────┐ ║
|
|
90
|
+
║ │ import { LightProtocolManager } from './light-protocol'; │ ║
|
|
91
|
+
║ │ │ ║
|
|
92
|
+
║ │ const manager = new LightProtocolManager(rpcUrl); │ ║
|
|
93
|
+
║ │ const shieldIx = await manager.createShieldSolInstruction( │ ║
|
|
94
|
+
║ │ userPubkey, amountLamports │ ║
|
|
95
|
+
║ │ ); │ ║
|
|
96
|
+
║ └─────────────────────────────────────────────────────────────────┘ ║
|
|
97
|
+
║ ║
|
|
98
|
+
╚══════════════════════════════════════════════════════════════════════════════╝
|
|
99
|
+
`;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=safe-obfuscator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-obfuscator.js","sourceRoot":"","sources":["../../../sdk/privacy/safe-obfuscator.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;;;AA2BH,kEA+CC;AAxED;;GAEG;AACH,MAAa,cAAc;IACvB,YAAY,eAAwB,KAAK;QACrC,MAAM,IAAI,KAAK,CACX,mCAAmC;YACnC,mEAAmE;YACnE,+DAA+D;YAC/D,MAAM;YACN,gBAAgB;YAChB,kDAAkD;YAClD,kDAAkD;YAClD,4CAA4C,CAC/C,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,GAAG,KAAY;QACxC,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;IAClG,CAAC;CACJ;AAjBD,wCAiBC;AAED;;GAEG;AACH,SAAgB,2BAA2B;IACvC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CV,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Connection, PublicKey } from '@solana/web3.js';
|
|
2
|
+
export declare class PrivacyShield {
|
|
3
|
+
private program;
|
|
4
|
+
constructor(connection: Connection, _programId: string, idl: any, wallet: any);
|
|
5
|
+
getProgramId(): PublicKey;
|
|
6
|
+
generateCommitment(): {
|
|
7
|
+
secret: NonSharedBuffer;
|
|
8
|
+
nullifier: NonSharedBuffer;
|
|
9
|
+
commitment: NonSharedBuffer;
|
|
10
|
+
nullifierHash: NonSharedBuffer;
|
|
11
|
+
commitmentHex: string;
|
|
12
|
+
};
|
|
13
|
+
deposit(commitment: Buffer): Promise<string>;
|
|
14
|
+
/**
|
|
15
|
+
* Build the authentication path for a commitment at a given index.
|
|
16
|
+
*/
|
|
17
|
+
getMerkleProof(commitmentIndex: number, allCommitments: Buffer[]): Promise<{
|
|
18
|
+
proof: Buffer[];
|
|
19
|
+
indices: number[];
|
|
20
|
+
}>;
|
|
21
|
+
/**
|
|
22
|
+
* Groth16 proof generation via snarkjs.
|
|
23
|
+
*/
|
|
24
|
+
generateZKProof(secret: Buffer, nullifier: Buffer, root: Buffer, merklePath: {
|
|
25
|
+
proof: Buffer[];
|
|
26
|
+
indices: number[];
|
|
27
|
+
}, wasmPath: string, zkeyPath: string): Promise<{
|
|
28
|
+
proof: Buffer<ArrayBufferLike>;
|
|
29
|
+
publicSignals: any;
|
|
30
|
+
}>;
|
|
31
|
+
private formatProof;
|
|
32
|
+
withdraw(nullifierHash: Buffer, root: Buffer, proof: Buffer[], recipient: PublicKey, relayer: any, fee?: number): Promise<string>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=shield.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shield.d.ts","sourceRoot":"","sources":["../../../sdk/privacy/shield.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,UAAU,EACV,SAAS,EAEZ,MAAM,iBAAiB,CAAC;AAMzB,qBAAa,aAAa;IACtB,OAAO,CAAC,OAAO,CAAU;gBAEb,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG;IAYtE,YAAY,IAAI,SAAS;IAIzB,kBAAkB;;;;;;;IAsBZ,OAAO,CAAC,UAAU,EAAE,MAAM;IAevC;;OAEG;IACU,cAAc,CAAC,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAgD/H;;OAEG;IACU,eAAe,CACxB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,EAClD,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM;;;;IAqBpB,OAAO,CAAC,WAAW;IAUN,QAAQ,CACjB,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,GAAG,EACZ,GAAG,GAAE,MAAU;CAoBtB"}
|
|
@@ -0,0 +1,174 @@
|
|
|
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.PrivacyShield = void 0;
|
|
37
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
38
|
+
const anchor_1 = require("@coral-xyz/anchor");
|
|
39
|
+
const crypto = __importStar(require("crypto"));
|
|
40
|
+
const MERKLE_TREE_DEPTH = 20;
|
|
41
|
+
class PrivacyShield {
|
|
42
|
+
constructor(connection, _programId, idl, wallet) {
|
|
43
|
+
const provider = new anchor_1.AnchorProvider(connection, wallet, {
|
|
44
|
+
preflightCommitment: 'confirmed',
|
|
45
|
+
});
|
|
46
|
+
try {
|
|
47
|
+
this.program = new anchor_1.Program(idl, provider);
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
// Silently fail if IDL is invalid - allowed for mock mode/offline audits
|
|
51
|
+
this.program = { programId: new web3_js_1.PublicKey(_programId) };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
getProgramId() {
|
|
55
|
+
return this.program.programId;
|
|
56
|
+
}
|
|
57
|
+
generateCommitment() {
|
|
58
|
+
const secret = crypto.randomBytes(32);
|
|
59
|
+
const nullifier = crypto.randomBytes(32);
|
|
60
|
+
// H = Hash(secret || nullifier)
|
|
61
|
+
const commitment = crypto.createHash('sha256')
|
|
62
|
+
.update(Buffer.concat([secret, nullifier]))
|
|
63
|
+
.digest();
|
|
64
|
+
const nullifierHash = crypto.createHash('sha256')
|
|
65
|
+
.update(nullifier)
|
|
66
|
+
.digest();
|
|
67
|
+
return {
|
|
68
|
+
secret,
|
|
69
|
+
nullifier,
|
|
70
|
+
commitment,
|
|
71
|
+
nullifierHash,
|
|
72
|
+
commitmentHex: commitment.toString('hex'),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
async deposit(commitment) {
|
|
76
|
+
const [vaultPda] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from('vault')], this.program.programId);
|
|
77
|
+
const [statePda] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from('state')], this.program.programId);
|
|
78
|
+
return await this.program.methods
|
|
79
|
+
.deposit(Array.from(commitment))
|
|
80
|
+
.accounts({
|
|
81
|
+
state: statePda,
|
|
82
|
+
depositor: this.program.provider.publicKey,
|
|
83
|
+
vault: vaultPda,
|
|
84
|
+
systemProgram: web3_js_1.SystemProgram.programId,
|
|
85
|
+
})
|
|
86
|
+
.rpc();
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Build the authentication path for a commitment at a given index.
|
|
90
|
+
*/
|
|
91
|
+
async getMerkleProof(commitmentIndex, allCommitments) {
|
|
92
|
+
if (commitmentIndex >= allCommitments.length) {
|
|
93
|
+
throw new Error("Commitment index out of range");
|
|
94
|
+
}
|
|
95
|
+
// Cache empty branch hashes up to tree depth
|
|
96
|
+
const zeros = [];
|
|
97
|
+
let currentZero = Buffer.alloc(32, 0);
|
|
98
|
+
for (let i = 0; i < MERKLE_TREE_DEPTH; i++) {
|
|
99
|
+
zeros.push(currentZero);
|
|
100
|
+
currentZero = crypto.createHash('sha256')
|
|
101
|
+
.update(Buffer.concat([currentZero, currentZero]))
|
|
102
|
+
.digest();
|
|
103
|
+
}
|
|
104
|
+
const proof = [];
|
|
105
|
+
const indices = [];
|
|
106
|
+
let index = commitmentIndex;
|
|
107
|
+
let nodes = [...allCommitments];
|
|
108
|
+
for (let level = 0; level < MERKLE_TREE_DEPTH; level++) {
|
|
109
|
+
if (index % 2 === 0) {
|
|
110
|
+
const sibling = (index + 1 < nodes.length) ? nodes[index + 1] : zeros[level];
|
|
111
|
+
proof.push(sibling);
|
|
112
|
+
indices.push(0);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
proof.push(nodes[index - 1]);
|
|
116
|
+
indices.push(1);
|
|
117
|
+
}
|
|
118
|
+
const nextLevelNodes = [];
|
|
119
|
+
for (let i = 0; i < nodes.length; i += 2) {
|
|
120
|
+
const left = nodes[i];
|
|
121
|
+
const right = (i + 1 < nodes.length) ? nodes[i + 1] : zeros[level];
|
|
122
|
+
// Deterministic parent hashing
|
|
123
|
+
const parent = crypto.createHash('sha256')
|
|
124
|
+
.update(left < right ? Buffer.concat([left, right]) : Buffer.concat([right, left]))
|
|
125
|
+
.digest();
|
|
126
|
+
nextLevelNodes.push(parent);
|
|
127
|
+
}
|
|
128
|
+
nodes = nextLevelNodes;
|
|
129
|
+
index = Math.floor(index / 2);
|
|
130
|
+
}
|
|
131
|
+
return { proof, indices };
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Groth16 proof generation via snarkjs.
|
|
135
|
+
*/
|
|
136
|
+
async generateZKProof(secret, nullifier, root, merklePath, wasmPath, zkeyPath) {
|
|
137
|
+
const { proof, publicSignals } = await (require('snarkjs')).groth16.fullProve({
|
|
138
|
+
root: root.toString('hex'),
|
|
139
|
+
nullifierHash: crypto.createHash('sha256').update(nullifier).digest().toString('hex'),
|
|
140
|
+
secret: secret.toString('hex'),
|
|
141
|
+
nullifier: nullifier.toString('hex'),
|
|
142
|
+
pathElements: merklePath.proof.map(p => p.toString('hex')),
|
|
143
|
+
pathIndices: merklePath.indices
|
|
144
|
+
}, wasmPath, zkeyPath);
|
|
145
|
+
return {
|
|
146
|
+
proof: this.formatProof(proof),
|
|
147
|
+
publicSignals
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
formatProof(proof) {
|
|
151
|
+
// Flatten pi_a, pi_b, pi_c for the on-chain verifier
|
|
152
|
+
return Buffer.concat([
|
|
153
|
+
Buffer.from(proof.pi_a[0]), Buffer.from(proof.pi_a[1]),
|
|
154
|
+
Buffer.from(proof.pi_b[0][0]), Buffer.from(proof.pi_b[0][1]),
|
|
155
|
+
Buffer.from(proof.pi_b[1][0]), Buffer.from(proof.pi_b[1][1]),
|
|
156
|
+
Buffer.from(proof.pi_c[0]), Buffer.from(proof.pi_c[1])
|
|
157
|
+
]);
|
|
158
|
+
}
|
|
159
|
+
async withdraw(nullifierHash, root, proof, recipient, relayer, fee = 0) {
|
|
160
|
+
const [statePda] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from('state')], this.program.programId);
|
|
161
|
+
return await this.program.methods
|
|
162
|
+
.withdraw(Array.from(nullifierHash), Array.from(root), proof.map(p => Array.from(p)), new this.program.provider.anchor.BN(fee))
|
|
163
|
+
.accounts({
|
|
164
|
+
state: statePda,
|
|
165
|
+
recipient,
|
|
166
|
+
relayer: relayer.publicKey,
|
|
167
|
+
systemProgram: web3_js_1.SystemProgram.programId,
|
|
168
|
+
})
|
|
169
|
+
.signers([relayer])
|
|
170
|
+
.rpc();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
exports.PrivacyShield = PrivacyShield;
|
|
174
|
+
//# sourceMappingURL=shield.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shield.js","sourceRoot":"","sources":["../../../sdk/privacy/shield.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ZkPrivacyProvider = void 0;
|
|
4
|
+
class ZkPrivacyProvider {
|
|
5
|
+
/**
|
|
6
|
+
* Generates a remediation plan utilizing Zero Knowledge proofs.
|
|
7
|
+
* e.g., "Instead of signing with Key A, provide a Proof that you know Key A"
|
|
8
|
+
*/
|
|
9
|
+
proposeZkFix(leak) {
|
|
10
|
+
if (leak.type === 'identity') {
|
|
11
|
+
return {
|
|
12
|
+
circuitType: 'authority',
|
|
13
|
+
publicInputs: ['hash(pubkey)']
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
return null; // No ZK fix available
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generates the client-side code snippet to create the proof.
|
|
20
|
+
*/
|
|
21
|
+
getProofGenerationCode(requirement) {
|
|
22
|
+
if (requirement.circuitType === 'authority') {
|
|
23
|
+
return `
|
|
24
|
+
// Auto-generated ZK Fix
|
|
25
|
+
import { prove } from '@privacy-zero/zk';
|
|
26
|
+
|
|
27
|
+
const proof = await prove('authority_circuit', {
|
|
28
|
+
privateInput: { privateKey: myKey },
|
|
29
|
+
publicInput: { commitment: myCommitment }
|
|
30
|
+
});
|
|
31
|
+
`;
|
|
32
|
+
}
|
|
33
|
+
return "";
|
|
34
|
+
}
|
|
35
|
+
/*
|
|
36
|
+
* Validates a ZK proof on-chain (simulation).
|
|
37
|
+
*/
|
|
38
|
+
async verifyProof(proof) {
|
|
39
|
+
// snarkjs.verify(...)
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.ZkPrivacyProvider = ZkPrivacyProvider;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TransactionJSON, Leak, GeyserTransactionEvents } from './types';
|
|
2
|
+
export declare class PrivacyEngine {
|
|
3
|
+
analyzeTransaction(tx: TransactionJSON): Leak[];
|
|
4
|
+
/**
|
|
5
|
+
* Score calculation based on weighted severity and frequency multipliers.
|
|
6
|
+
* Capped at 100, floored at 0 (or 15 with remediation).
|
|
7
|
+
*/
|
|
8
|
+
calculateScore(leaks: Leak[]): number;
|
|
9
|
+
analyzeGeyserEvents(tx: TransactionJSON, events: GeyserTransactionEvents): Leak[];
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=privacy-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy-engine.d.ts","sourceRoot":"","sources":["../../sdk/privacy-engine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAQzE,qBAAa,aAAa;IAEf,kBAAkB,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,EAAE;IA4EtD;;;OAGG;IACI,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM;IA0ErC,mBAAmB,CAAC,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,uBAAuB,GAAG,IAAI,EAAE;CAU3F"}
|