@aintivirus-ai/mixer-sdk 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.
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Supported blockchain networks
3
+ */
4
+ export declare enum ChainType {
5
+ EVM = "EVM",
6
+ SOLANA = "SOLANA"
7
+ }
8
+ /**
9
+ * Asset modes for deposits and withdrawals
10
+ */
11
+ export declare enum AssetMode {
12
+ ETH = 0,// For EVM: ETH, For Solana: SOL
13
+ TOKEN = 1
14
+ }
15
+ /**
16
+ * Withdrawal proof structure
17
+ */
18
+ export interface WithdrawalProof {
19
+ pA: [bigint, bigint];
20
+ pB: [[bigint, bigint], [bigint, bigint]];
21
+ pC: [bigint, bigint];
22
+ pubSignals: [bigint, bigint, bigint];
23
+ }
24
+ /**
25
+ * Deposit data structure
26
+ */
27
+ export interface DepositData {
28
+ secret: bigint;
29
+ nullifier: bigint;
30
+ commitment: bigint;
31
+ amount: bigint;
32
+ mode: AssetMode;
33
+ }
34
+ /**
35
+ * Staking season information
36
+ */
37
+ export interface StakeSeason {
38
+ seasonId: bigint;
39
+ startTimestamp: bigint;
40
+ endTimestamp: bigint;
41
+ totalStakedEthAmount: bigint;
42
+ totalStakedTokenAmount: bigint;
43
+ totalRewardEthAmount: bigint;
44
+ totalRewardTokenAmount: bigint;
45
+ totalEthWeightValue: bigint;
46
+ totalTokenWeightValue: bigint;
47
+ }
48
+ /**
49
+ * Staker record information
50
+ */
51
+ export interface StakerRecord {
52
+ ethStakedSeasonId: bigint;
53
+ tokenStakedSeasonId: bigint;
54
+ ethStakedTimestamp: bigint;
55
+ tokenStakedTimestamp: bigint;
56
+ stakedEthAmount: bigint;
57
+ stakedTokenAmount: bigint;
58
+ ethWeightValue: bigint;
59
+ tokenWeightValue: bigint;
60
+ }
61
+ /**
62
+ * Configuration for SDK initialization
63
+ */
64
+ export interface SDKConfig {
65
+ evm?: {
66
+ factoryAddress: string;
67
+ tokenAddress: string;
68
+ rpcUrl?: string;
69
+ provider?: any;
70
+ };
71
+ solana?: {
72
+ factoryProgramId: string;
73
+ mixerProgramId: string;
74
+ stakingProgramId: string;
75
+ tokenMint?: string;
76
+ rpcUrl?: string;
77
+ connection?: any;
78
+ };
79
+ }
80
+ /**
81
+ * Transaction result
82
+ */
83
+ export interface TransactionResult {
84
+ txHash: string;
85
+ blockNumber?: number;
86
+ blockTime?: number;
87
+ }
88
+ /**
89
+ * Hook configuration for EVM
90
+ */
91
+ export interface EVMHookConfig {
92
+ factoryAddress: string;
93
+ tokenAddress?: string;
94
+ }
95
+ /**
96
+ * Hook configuration for Solana
97
+ */
98
+ export interface SolanaHookConfig {
99
+ factoryProgramId: string;
100
+ mixerProgramId: string;
101
+ stakingProgramId: string;
102
+ tokenMint?: string;
103
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AssetMode = exports.ChainType = void 0;
4
+ /**
5
+ * Supported blockchain networks
6
+ */
7
+ var ChainType;
8
+ (function (ChainType) {
9
+ ChainType["EVM"] = "EVM";
10
+ ChainType["SOLANA"] = "SOLANA";
11
+ })(ChainType || (exports.ChainType = ChainType = {}));
12
+ /**
13
+ * Asset modes for deposits and withdrawals
14
+ */
15
+ var AssetMode;
16
+ (function (AssetMode) {
17
+ AssetMode[AssetMode["ETH"] = 0] = "ETH";
18
+ AssetMode[AssetMode["TOKEN"] = 1] = "TOKEN";
19
+ })(AssetMode || (exports.AssetMode = AssetMode = {}));
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Generate secret and nullifier for a deposit
3
+ */
4
+ export declare function generateSecretAndNullifier(): {
5
+ secret: bigint;
6
+ nullifier: bigint;
7
+ };
8
+ /**
9
+ * Compute commitment hash: Poseidon(secret, nullifier)
10
+ */
11
+ export declare function computeCommitment(secret: bigint, nullifier: bigint): bigint;
12
+ /**
13
+ * Compute nullifier hash: Poseidon(nullifier, 0)
14
+ */
15
+ export declare function computeNullifierHash(nullifier: bigint): bigint;
16
+ /**
17
+ * Convert bigint to bytes32 (for EVM)
18
+ */
19
+ export declare function bigIntToBytes32(value: bigint): string;
20
+ /**
21
+ * Convert bytes32 to bigint (for EVM)
22
+ */
23
+ export declare function bytes32ToBigInt(value: string): bigint;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateSecretAndNullifier = generateSecretAndNullifier;
4
+ exports.computeCommitment = computeCommitment;
5
+ exports.computeNullifierHash = computeNullifierHash;
6
+ exports.bigIntToBytes32 = bigIntToBytes32;
7
+ exports.bytes32ToBigInt = bytes32ToBigInt;
8
+ const poseidon_lite_1 = require("poseidon-lite");
9
+ const ethers_1 = require("ethers");
10
+ /**
11
+ * Generate secret and nullifier for a deposit
12
+ */
13
+ function generateSecretAndNullifier() {
14
+ const secretBytes = (0, ethers_1.randomBytes)(32);
15
+ const nullifierBytes = (0, ethers_1.randomBytes)(32);
16
+ const secret = BigInt("0x" + Buffer.from(secretBytes).toString("hex"));
17
+ const nullifier = BigInt("0x" + Buffer.from(nullifierBytes).toString("hex"));
18
+ return { secret, nullifier };
19
+ }
20
+ /**
21
+ * Compute commitment hash: Poseidon(secret, nullifier)
22
+ */
23
+ function computeCommitment(secret, nullifier) {
24
+ return (0, poseidon_lite_1.poseidon2)([secret, nullifier]);
25
+ }
26
+ /**
27
+ * Compute nullifier hash: Poseidon(nullifier, 0)
28
+ */
29
+ function computeNullifierHash(nullifier) {
30
+ return (0, poseidon_lite_1.poseidon2)([nullifier, 0n]);
31
+ }
32
+ /**
33
+ * Convert bigint to bytes32 (for EVM)
34
+ */
35
+ function bigIntToBytes32(value) {
36
+ return "0x" + value.toString(16).padStart(64, "0");
37
+ }
38
+ /**
39
+ * Convert bytes32 to bigint (for EVM)
40
+ */
41
+ function bytes32ToBigInt(value) {
42
+ return BigInt(value);
43
+ }
@@ -0,0 +1,34 @@
1
+ import MerkleTree from "fixed-merkle-tree";
2
+ import { WithdrawalProof } from "../types";
3
+ /**
4
+ * Build merkle tree from commitments
5
+ */
6
+ export declare function buildMerkleTree(commitments: bigint[]): MerkleTree;
7
+ /**
8
+ * Get merkle path for a commitment
9
+ */
10
+ export declare function getMerklePath(tree: MerkleTree, commitment: bigint): {
11
+ pathElements: bigint[];
12
+ pathIndices: number[];
13
+ };
14
+ /**
15
+ * Generate withdrawal proof
16
+ * Note: This requires the circuit WASM and zkey files
17
+ * In production, you should load these from your build directory
18
+ */
19
+ export declare function generateWithdrawalProof(secret: bigint, nullifier: bigint, root: bigint, recipient: string, pathElements: bigint[], pathIndices: number[], circuitWasm?: Buffer, circuitZkey?: Buffer): Promise<WithdrawalProof>;
20
+ /**
21
+ * Helper to prepare withdrawal proof data
22
+ */
23
+ export interface WithdrawalProofData {
24
+ secret: bigint;
25
+ nullifier: bigint;
26
+ recipient: string;
27
+ commitments: bigint[];
28
+ circuitWasm?: Buffer;
29
+ circuitZkey?: Buffer;
30
+ }
31
+ /**
32
+ * Generate complete withdrawal proof from deposit data
33
+ */
34
+ export declare function generateWithdrawalProofFromData(data: WithdrawalProofData): Promise<WithdrawalProof>;
@@ -0,0 +1,120 @@
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.buildMerkleTree = buildMerkleTree;
7
+ exports.getMerklePath = getMerklePath;
8
+ exports.generateWithdrawalProof = generateWithdrawalProof;
9
+ exports.generateWithdrawalProofFromData = generateWithdrawalProofFromData;
10
+ const poseidon_lite_1 = require("poseidon-lite");
11
+ const fixed_merkle_tree_1 = __importDefault(require("fixed-merkle-tree"));
12
+ const crypto_1 = require("./crypto");
13
+ const snarkjs_1 = __importDefault(require("snarkjs"));
14
+ /**
15
+ * Build merkle tree from commitments
16
+ */
17
+ function buildMerkleTree(commitments) {
18
+ const tree = new fixed_merkle_tree_1.default(24, [], {
19
+ hashFunction: (left, right) => {
20
+ return (0, poseidon_lite_1.poseidon2)([BigInt(left), BigInt(right)]).toString();
21
+ },
22
+ zeroElement: "0",
23
+ });
24
+ for (const commitment of commitments) {
25
+ tree.insert(commitment.toString());
26
+ }
27
+ return tree;
28
+ }
29
+ /**
30
+ * Get merkle path for a commitment
31
+ */
32
+ function getMerklePath(tree, commitment) {
33
+ const commitmentIndex = tree.elements.indexOf(commitment.toString());
34
+ if (commitmentIndex === -1) {
35
+ throw new Error("Commitment not found in merkle tree");
36
+ }
37
+ const path = tree.path(commitmentIndex);
38
+ return {
39
+ pathElements: path.pathElements.map((e) => BigInt(e)),
40
+ pathIndices: path.pathIndices,
41
+ };
42
+ }
43
+ /**
44
+ * Generate withdrawal proof
45
+ * Note: This requires the circuit WASM and zkey files
46
+ * In production, you should load these from your build directory
47
+ */
48
+ async function generateWithdrawalProof(secret, nullifier, root, recipient, pathElements, pathIndices, circuitWasm, circuitZkey) {
49
+ // If circuit files are not provided, return a placeholder structure
50
+ // In production, you should always provide these files
51
+ if (!circuitWasm || !circuitZkey) {
52
+ console.warn("Circuit files not provided. Returning placeholder proof structure.");
53
+ const nullifierHash = (0, crypto_1.computeNullifierHash)(nullifier);
54
+ const recipientBigInt = BigInt(recipient);
55
+ return {
56
+ pA: [0n, 0n],
57
+ pB: [
58
+ [0n, 0n],
59
+ [0n, 0n],
60
+ ],
61
+ pC: [0n, 0n],
62
+ pubSignals: [nullifierHash, recipientBigInt, root],
63
+ };
64
+ }
65
+ // Prepare inputs
66
+ const input = {
67
+ secret: secret.toString(),
68
+ nullifier: nullifier.toString(),
69
+ root: root.toString(),
70
+ recipient: BigInt(recipient).toString(),
71
+ pathElements: pathElements.map((e) => e.toString()),
72
+ pathIndices: pathIndices.map((i) => i.toString()),
73
+ };
74
+ // Generate witness (requires witness calculator)
75
+ // Note: This is a simplified version. In production, you need to:
76
+ // 1. Load the witness calculator from your compiled circuit
77
+ // 2. Calculate witness using the calculator
78
+ // 3. Generate proof using snarkjs.groth16.prove()
79
+ // For now, return placeholder
80
+ // TODO: Implement full proof generation with witness calculator
81
+ const nullifierHash = (0, crypto_1.computeNullifierHash)(nullifier);
82
+ const recipientBigInt = BigInt(recipient);
83
+ try {
84
+ // Attempt to generate proof if witness calculator is available
85
+ // This would require loading the witness calculator from your build
86
+ const { proof, publicSignals } = await snarkjs_1.default.groth16.fullProve(input, circuitWasm, circuitZkey);
87
+ return {
88
+ pA: [BigInt(proof.pi_a[0]), BigInt(proof.pi_a[1])],
89
+ pB: [
90
+ [BigInt(proof.pi_b[0][1]), BigInt(proof.pi_b[0][0])],
91
+ [BigInt(proof.pi_b[1][1]), BigInt(proof.pi_b[1][0])],
92
+ ],
93
+ pC: [BigInt(proof.pi_c[0]), BigInt(proof.pi_c[1])],
94
+ pubSignals: publicSignals.map((x) => BigInt(x)),
95
+ };
96
+ }
97
+ catch (error) {
98
+ console.error("Proof generation failed:", error);
99
+ // Return placeholder on error
100
+ return {
101
+ pA: [0n, 0n],
102
+ pB: [
103
+ [0n, 0n],
104
+ [0n, 0n],
105
+ ],
106
+ pC: [0n, 0n],
107
+ pubSignals: [nullifierHash, recipientBigInt, root],
108
+ };
109
+ }
110
+ }
111
+ /**
112
+ * Generate complete withdrawal proof from deposit data
113
+ */
114
+ async function generateWithdrawalProofFromData(data) {
115
+ const commitment = (0, crypto_1.computeCommitment)(data.secret, data.nullifier);
116
+ const tree = buildMerkleTree(data.commitments);
117
+ const root = BigInt(tree.root);
118
+ const path = getMerklePath(tree, commitment);
119
+ return generateWithdrawalProof(data.secret, data.nullifier, root, data.recipient, path.pathElements, path.pathIndices, data.circuitWasm, data.circuitZkey);
120
+ }
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@aintivirus-ai/mixer-sdk",
3
+ "version": "1.0.0",
4
+ "description": "TypeScript SDK for AintiVirus Mixer - Easy web3 integration for privacy-preserving transactions",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "npx tsc",
9
+ "dev": "npx tsc --watch",
10
+ "prepublishOnly": "npm run build"
11
+ },
12
+ "keywords": [
13
+ "web3",
14
+ "privacy",
15
+ "mixer",
16
+ "zk-proof",
17
+ "ethereum",
18
+ "solana",
19
+ "staking"
20
+ ],
21
+ "author": "",
22
+ "license": "MIT",
23
+ "dependencies": {
24
+ "@coral-xyz/anchor": "^0.29.0",
25
+ "@solana/spl-token": "^0.3.9",
26
+ "@solana/web3.js": "^1.87.6",
27
+ "ethers": "^6.9.0",
28
+ "fixed-merkle-tree": "^0.7.0",
29
+ "poseidon-lite": "^0.3.0",
30
+ "snarkjs": "^0.7.0"
31
+ },
32
+ "devDependencies": {
33
+ "@tanstack/react-query": "^5.0.0",
34
+ "@types/node": "^20.10.0",
35
+ "@types/react": "^18.2.0",
36
+ "@types/react-dom": "^18.2.0",
37
+ "@types/snarkjs": "^0.7.9",
38
+ "react": "^18.2.0",
39
+ "typescript": "^5.3.3",
40
+ "viem": "^2.0.0",
41
+ "wagmi": "^2.0.0"
42
+ },
43
+ "peerDependencies": {
44
+ "@tanstack/react-query": "^5.0.0",
45
+ "viem": "^2.0.0",
46
+ "wagmi": "^2.0.0"
47
+ },
48
+ "peerDependenciesMeta": {
49
+ "wagmi": {
50
+ "optional": true
51
+ },
52
+ "viem": {
53
+ "optional": true
54
+ },
55
+ "@tanstack/react-query": {
56
+ "optional": true
57
+ }
58
+ },
59
+ "files": [
60
+ "dist",
61
+ "README.md"
62
+ ]
63
+ }