rln-interep-contract/test/rln.ts

141 lines
4.8 KiB
TypeScript
Raw Normal View History

2022-11-25 06:37:06 +00:00
import { expect, assert } from "chai";
import { BigNumber } from "ethers";
import { ethers, deployments } from "hardhat";
2022-11-28 09:31:35 +00:00
import { createGroupId, sToBytes32 } from "../common";
describe("RLN", () => {
beforeEach(async () => {
await deployments.fixture(["RLN"]);
2022-11-25 06:08:38 +00:00
});
it("should register new memberships", async () => {
const rln = await ethers.getContract("RLN", ethers.provider.getSigner(0));
2022-11-25 06:08:38 +00:00
const price = await rln.MEMBERSHIP_DEPOSIT();
// A valid pair of (id_secret, id_commitment) generated in rust
2022-11-25 06:08:38 +00:00
const idCommitment =
"0x0c3ac305f6a4fe9bfeb3eba978bc876e2a99208b8b56c80160cfb54ba8f02368";
2022-11-25 06:08:38 +00:00
const registerTx = await rln["register(uint256)"](idCommitment, {
value: price,
});
const txRegisterReceipt = await registerTx.wait();
2022-11-25 06:08:38 +00:00
const pubkey = txRegisterReceipt.events[0].args.pubkey;
// We ensure the registered id_commitment is the one we passed
2022-11-25 06:08:38 +00:00
expect(
pubkey.toHexString() === idCommitment,
"registered commitment doesn't match passed commitment"
);
});
it("should withdraw membership", async () => {
const rln = await ethers.getContract("RLN", ethers.provider.getSigner(0));
2022-11-25 06:08:38 +00:00
const price = await rln.MEMBERSHIP_DEPOSIT();
// A valid pair of (id_secret, id_commitment) generated in rust
2022-11-25 06:08:38 +00:00
const idSecret =
"0x2a09a9fd93c590c26b91effbb2499f07e8f7aa12e2b4940a3aed2411cb65e11c";
const idCommitment =
"0x0c3ac305f6a4fe9bfeb3eba978bc876e2a99208b8b56c80160cfb54ba8f02368";
2022-11-25 06:08:38 +00:00
const registerTx = await rln["register(uint256)"](idCommitment, {
value: price,
});
const txRegisterReceipt = await registerTx.wait();
2022-11-25 06:08:38 +00:00
const treeIndex = txRegisterReceipt.events[0].args.index;
// We withdraw our id_commitment
2022-11-25 06:08:38 +00:00
const receiverAddress = "0x000000000000000000000000000000000000dead";
const withdrawTx = await rln.withdraw(idSecret, treeIndex, receiverAddress);
const txWithdrawReceipt = await withdrawTx.wait();
const withdrawalPk = txWithdrawReceipt.events[0].args.pubkey;
const withdrawalTreeIndex = txWithdrawReceipt.events[0].args.index;
// We ensure the registered id_commitment is the one we passed and that the index is the same
expect(
withdrawalPk.toHexString() === idCommitment,
"withdraw commitment doesn't match registered commitment"
);
expect(
withdrawalTreeIndex.toHexString() === treeIndex.toHexString(),
"withdraw index doesn't match registered index"
);
});
2022-11-25 06:37:06 +00:00
it.skip("should not allow multiple registrations with same pubkey", async () => {
2022-11-25 06:37:06 +00:00
const rln = await ethers.getContract("RLN", ethers.provider.getSigner(0));
const price = await rln.MEMBERSHIP_DEPOSIT();
// A valid pair of (id_secret, id_commitment) generated in rust
const idCommitment =
"0x0c3ac305f6a4fe9bfeb3eba978bc876e2a99208b8b56c80160cfb54ba8f02368";
const registerTx = await rln["register(uint256)"](idCommitment, {
value: price,
});
const txRegisterReceipt = await registerTx.wait();
const index1 = txRegisterReceipt.events[0].args.index;
// Send the same tx again
const registerTx2 = await rln["register(uint256)"](idCommitment, {
value: price,
});
const txRegisterReceipt2 = await registerTx2.wait();
const index2 = txRegisterReceipt2.events[0].args.index;
const pk1 = await rln.members(index1);
2022-11-25 06:40:37 +00:00
const pk2 = await rln.members(index2);
2022-11-25 06:37:06 +00:00
const samePk = pk1.toHexString() === pk2.toHexString();
2022-11-25 06:40:37 +00:00
if (samePk) {
2022-11-25 06:37:06 +00:00
assert(false, "same pubkey registered twice");
}
2022-11-25 06:40:37 +00:00
});
2022-11-25 06:37:06 +00:00
it("[interep] should register new memberships", async () => {
const rln = await ethers.getContract("RLN", ethers.provider.getSigner(0));
const validGroupId = createGroupId("github", "silver");
2022-11-28 09:31:35 +00:00
const dummySignal = sToBytes32("foo");
const dummyNullifierHash = BigNumber.from(0);
const dummyExternalNullifier = BigNumber.from(0);
const dummyProof = Array(8).fill(BigNumber.from(0));
const dummyPubkey = BigNumber.from(0);
const registerTx = await rln[
"register(uint256,bytes32,uint256,uint256,uint256[8],uint256)"
](
validGroupId,
dummySignal,
dummyNullifierHash,
dummyExternalNullifier,
dummyProof,
dummyPubkey
);
const txRegisterReceipt = await registerTx.wait();
const iface = new ethers.utils.Interface([
"event ProofVerified(uint256 indexed groupId, bytes32 signal)",
]);
const event = iface.parseLog(txRegisterReceipt.events[0]);
expect(event.args.groupId.toHexString()).to.equal(
BigNumber.from(validGroupId).toHexString()
);
expect(event.args.signal).to.equal(dummySignal);
const pubkey = txRegisterReceipt.events[1].args.pubkey;
expect(pubkey.toHexString() === dummyPubkey.toHexString());
2022-11-25 06:37:06 +00:00
});
it("[interep] should withdraw membership", () => {
// TODO
});
2022-11-25 06:08:38 +00:00
});