const chai = require("chai"); const Fr = require("ffjavascript").bn128.Fr; const smt = require("circomlib").smt; const assert = chai.assert; describe("SMT javascript testvectors", function () { this.timeout(100000); before( async () => { }); it("Should insert 2 elements and empty them", async () => { const tree = await smt.newMemEmptyTrie(); console.log(tree); let k = Fr.e(1); let v = Fr.e(2); await tree.insert(k,v); console.log(tree.root); k = Fr.e(33); v = Fr.e(44); await tree.insert(k,v); console.log(tree.root); k = Fr.e(1234); v = Fr.e(9876); await tree.insert(k,v); console.log(tree.root); await tree.delete(Fr.e(33)); console.log(tree.root); await tree.delete(Fr.e(1234)); await tree.delete(Fr.e(1)); console.log(tree.root); assert(Fr.isZero(tree.root)); }); it("TestDelete3", async () => { const tree = await smt.newMemEmptyTrie(); console.log(tree); let k = Fr.e(1); let v = Fr.e(1); await tree.insert(k,v); k = Fr.e(2); v = Fr.e(2); await tree.insert(k,v); console.log(tree.root); console.log("TestDelete3", tree.root); await tree.delete(Fr.e(1)); console.log("TestDelete3", tree.root); }); it("TestDelete4", async () => { const tree = await smt.newMemEmptyTrie(); console.log(tree); let k = Fr.e(1); let v = Fr.e(1); await tree.insert(k,v); k = Fr.e(2); v = Fr.e(2); await tree.insert(k,v); console.log(tree.root); k = Fr.e(3); v = Fr.e(3); await tree.insert(k,v); console.log(tree.root); console.log("TestDelete4", tree.root); await tree.delete(Fr.e(1)); console.log("TestDelete4", tree.root); }); it("TestDelete5", async () => { const tree = await smt.newMemEmptyTrie(); console.log(tree); let k = Fr.e(1); let v = Fr.e(2); await tree.insert(k,v); k = Fr.e(33); v = Fr.e(44); await tree.insert(k,v); console.log(tree.root); console.log("TestDelete5", tree.root); await tree.delete(Fr.e(1)); console.log("TestDelete5", tree.root); }); it("TestAddAndGetCircomProof", async () => { const tree = await smt.newMemEmptyTrie(); let key = Fr.e(1); let value = Fr.e(2); let res = await tree.insert(key,value); res = fixRes(res); console.log(res); key = Fr.e(33); value = Fr.e(44); res = await tree.insert(key,value); res = fixRes(res); console.log(res); key = Fr.e(55); value = Fr.e(66); res = await tree.insert(key,value); res = fixRes(res); console.log(res); }); it("TestUpdateAndCircomProcessorProof", async () => { const tree = await smt.newMemEmptyTrie(); console.log(tree); for (let i=0; i<16; i++) { let k = Fr.e(i); let v = Fr.e(i*2); await tree.insert(k,v); } console.log(tree.root); k = Fr.e(10); v = Fr.e(1024); let res = await tree.update(k, v) console.log(res); }); }) function fixRes(res) { while (res.siblings.length<10) res.siblings.push(Fr.e(0)); res.oldKey = res.isOld0 ? 0 : res.oldKey; res.oldValue = res.isOld0 ? 0 : res.oldValue; res.isOld0 = res.isOld0 ? 1 : 0; return res; }