miksi-core/test/contracts/miksi.test.ts
test/contracts/miksi.test.tsRaw
1const Verifier = artifacts.require("../../contracts/Verifier");
2const Miksi = artifacts.require("../../contracts/Miksi.sol");
3
4const chai = require("chai");
5const expect = chai.expect;
6
7const fs = require("fs");
8const { groth } = require('snarkjs');
9const { stringifyBigInts, unstringifyBigInts } = require('ffjavascript').utils;
10const WitnessCalculatorBuilder = require("circom_runtime").WitnessCalculatorBuilder;
11const circomlib = require("circomlib");
12
13contract("miksi", (accounts) => {
14
15
16 const {
17 0: owner,
18 1: idEth1,
19 2: idEth2,
20 3: idEth3,
21 } = accounts;
22
23 let insVerifier;
24 let insMiksi;
25
26 before(async () => {
27
28 insVerifier = await Verifier.new();
29 insMiksi = await Miksi.new(insVerifier.address);
30 });
31
32 it("miksi flow", async () => {
33 const secret = "123456789";
34
35 const coinCode = "1";
36 const amount = "100";
37
38 const poseidon = circomlib.poseidon.createHash(6, 8, 57);
39 const commitment = poseidon([coinCode, amount, secret]).toString();
40
41 // deposit
42 await insMiksi.deposit(coinCode, amount, commitment);
43
44 // getDeposit data
45 const res = await insMiksi.getDeposit(commitment);
46 expect(res[0].toString()).to.be.equal(coinCode);
47 expect(res[1].toString()).to.be.equal(amount);
48
49
50 // calculate witness
51 const wasm = await fs.promises.readFile("./build/withdraw.wasm");
52 const input = unstringifyBigInts({
53 "coinCode": coinCode,
54 "amount": amount,
55 "commitment": commitment,
56 "secret": secret
57 });
58 const options = {};
59 const wc = await WitnessCalculatorBuilder(wasm, options);
60 const w = await wc.calculateWitness(input);
61 const witness = unstringifyBigInts(stringifyBigInts(w));
62
63 // generate zkproof of commitment using snarkjs (as is a test)
64 const provingKey = unstringifyBigInts(JSON.parse(fs.readFileSync("./build/proving_key.json", "utf8")));
65
66 const {proof, publicSignals} = groth.genProof(provingKey, witness);
67
68 // withdraw
69 const resW = await insMiksi.withdraw(
70 commitment,
71 [proof.pi_a[0].toString(), proof.pi_a[1].toString()],
72 [
73 [proof.pi_b[0][1].toString(), proof.pi_b[0][0].toString()],
74 [proof.pi_b[1][1].toString(), proof.pi_b[1][0].toString()]
75 ],
76 [proof.pi_c[0].toString(), proof.pi_c[1].toString()]
77 );
78 console.log("resW", resW);
79
80 });
81});