diff --git a/rln-js/index.html b/rln-js/index.html
index efeeae1..c661094 100644
--- a/rln-js/index.html
+++ b/rln-js/index.html
@@ -66,10 +66,14 @@
>Membership ID (your index in the RLN smart contract):
-
-
+
+
+
+
+
+
@@ -81,13 +85,21 @@
none
-
Key
- none
+ Secret Hash
+ none
Commitment
none
+
+
Nullifier
+ none
+
+
+
Trapdoor
+ none
+
Waku
diff --git a/rln-js/index.js b/rln-js/index.js
index 26e2aaa..525385d 100644
--- a/rln-js/index.js
+++ b/rln-js/index.js
@@ -8,11 +8,11 @@ import {
import { protobuf } from "https://taisukef.github.io/protobuf-es.js/dist/protobuf-es.js";
import {
create,
- MembershipKey,
+ IdentityCredential,
RLNDecoder,
RLNEncoder,
RLNContract,
-} from "https://unpkg.com/@waku/rln@0.0.14-7e0966a/bundle/index.js";
+} from "https://unpkg.com/@waku/rln@0.1.0/bundle/index.js";
import { ethers } from "https://unpkg.com/ethers@5.7.2/dist/ethers.esm.min.js";
const ContentTopic = "/toy-chat/2/luzhou/proto";
@@ -23,8 +23,8 @@ const ProtoChatMessage = new protobuf.Type("ChatMessage")
.add(new protobuf.Field("nick", 2, "string"))
.add(new protobuf.Field("text", 3, "bytes"));
-const rlnDeployBlk = 7109391;
-const rlnAddress = "0x4252105670fe33d2947e8ead304969849e64f2a6";
+const rlnDeployBlk = 3193048;
+const rlnAddress = "0x9C09146844C1326c2dBC41c451766C7138F88155";
const SIGNATURE_MESSAGE =
"The signature of this message will be used to generate your RLN credentials. Anyone accessing it may send messages on your behalf, please only share with the RLN dApp";
@@ -64,14 +64,14 @@ async function initRLN(ui) {
window.ethereum.on("accountsChanged", ui.setAccount);
window.ethereum.on("chainChanged", (chainId) => {
const id = parseInt(chainId, 16);
- ui.disableIfNotGoerli(id);
+ ui.disableIfNotSepolia(id);
});
ui.onConnectWallet(async () => {
try {
const accounts = await provider.send("eth_requestAccounts", []);
ui.setAccount(accounts);
const network = await provider.getNetwork();
- ui.disableIfNotGoerli(network.chainId);
+ ui.disableIfNotSepolia(network.chainId);
} catch (e) {
console.log("No web3 provider available", e);
}
@@ -100,12 +100,9 @@ async function initRLN(ui) {
let signature;
let membershipId;
- let membershipKey;
-
- ui.onManualImport((id, key) => {
- membershipId = id;
- membershipKey = key;
+ let credentials;
+ ui.onManualImport((membershipId, credentials) => {
result.encoder = new RLNEncoder(
createEncoder({
ephemeral: false,
@@ -113,10 +110,10 @@ async function initRLN(ui) {
}),
rlnInstance,
membershipId,
- membershipKey
+ credentials
);
- ui.setMembershipInfo(membershipId, membershipKey);
+ ui.setMembershipInfo(membershipId, credentials);
ui.enableDialButton();
});
@@ -124,9 +121,9 @@ async function initRLN(ui) {
const signer = provider.getSigner();
signature = await signer.signMessage(SIGNATURE_MESSAGE);
- membershipKey = await rlnInstance.generateSeededMembershipKey(signature);
+ credentials = await rlnInstance.generateSeededIdentityCredential(signature);
- const idCommitment = ethers.utils.hexlify(membershipKey.IDCommitment);
+ const idCommitment = ethers.utils.hexlify(credentials.IDCommitment);
rlnContract.members.forEach((m) => {
if (m.pubkey._hex === idCommitment) {
@@ -142,21 +139,21 @@ async function initRLN(ui) {
}),
rlnInstance,
membershipId,
- membershipKey
+ credentials
);
}
- ui.setMembershipInfo(membershipId, membershipKey);
+ ui.setMembershipInfo(membershipId, credentials);
const network = await provider.getNetwork();
- ui.enableRegisterButtonForGoerli(network.chainId);
+ ui.enableRegisterButtonForSepolia(network.chainId);
});
ui.onRegister(async () => {
ui.setRlnStatus("Trying to register...");
const event = signature
- ? await rlnContract.registerMember(rlnInstance, signature)
- : await rlnContract.registerMemberFromMembershipKey(membershipKey);
+ ? await rlnContract.registerWithSignature(rlnInstance, signature)
+ : await rlnContract.registerWithKey(credentials);
// Update membershipId
membershipId = event.args.index.toNumber();
@@ -167,7 +164,7 @@ async function initRLN(ui) {
);
ui.setRlnStatus("Successfully registered.");
- ui.setMembershipInfo(membershipId, membershipKey);
+ ui.setMembershipInfo(membershipId, credentials);
ui.enableDialButton();
});
@@ -285,16 +282,20 @@ function initUI() {
// Credentials Elements
const membershipIdInput = document.getElementById("membership-id");
- const identityKeyInput = document.getElementById("id-key");
+ const idSecretHashInput = document.getElementById("id-secret-hash");
const commitmentKeyInput = document.getElementById("commitment-key");
+ const idTrapdoorInput = document.getElementById("id-trapdoor")
+ const idNullifierInput = document.getElementById("id-nullifier")
const importManually = document.getElementById("import-manually-button");
const importFromWalletButton = document.getElementById(
"import-from-wallet-button"
);
const idDiv = document.getElementById("id");
- const keyDiv = document.getElementById("key");
+ const secretHashDiv = document.getElementById("secret-hash");
const commitmentDiv = document.getElementById("commitment");
+ const trapdoorDiv = document.getElementById("trapdoor");
+ const nullifierDiv = document.getElementById("nullifier");
const registerButton = document.getElementById("register-button");
// Waku Elements
@@ -320,13 +321,17 @@ function initUI() {
// monitor & enable buttons if needed
membershipIdInput.onchange = enableManualImportIfNeeded;
- identityKeyInput.onchange = enableManualImportIfNeeded;
+ idSecretHashInput.onchange = enableManualImportIfNeeded;
commitmentKeyInput.onchange = enableManualImportIfNeeded;
+ idNullifierInput.onchange = enableManualImportIfNeeded;
+ idTrapdoorInput.onchange = enableManualImportIfNeeded;
function enableManualImportIfNeeded() {
const isValuesPresent =
- identityKeyInput.value &&
+ idSecretHashInput.value &&
commitmentKeyInput.value &&
+ idNullifierInput.value &&
+ idTrapdoorInput.value &&
membershipIdInput.value;
if (isValuesPresent) {
@@ -349,10 +354,12 @@ function initUI() {
setRlnStatus(text) {
statusSpan.innerText = text;
},
- setMembershipInfo(id, key) {
+ setMembershipInfo(id, credential) {
idDiv.innerText = id || "not registered yet";
- keyDiv.innerText = utils.bytesToHex(key.IDKey);
- commitmentDiv.innerText = utils.bytesToHex(key.IDCommitment);
+ secretHashDiv.innerText = utils.bytesToHex(credential.IDSecretHash);
+ commitmentDiv.innerText = utils.bytesToHex(credential.IDCommitment);
+ nullifierDiv.innerText = utils.bytesToHex(credential.IDNullifier);
+ trapdoorDiv.innerText = utils.bytesToHex(credential.IDTrapdoor);
},
setLastMember(index, pubkey) {
try {
@@ -371,9 +378,9 @@ function initUI() {
console.error(err); // TODO: the merkle tree can be in a wrong state. The app should be disabled
}
},
- disableIfNotGoerli(chainId) {
- if (!isGoerliChain(chainId)) {
- window.alert("Switch to Goerli");
+ disableIfNotSepolia(chainId) {
+ if (!isSepolia(chainId)) {
+ window.alert("Switch to Sepolia");
registerButton.disabled = true;
this.disableRetrieveButton();
@@ -387,8 +394,8 @@ function initUI() {
disableRetrieveButton() {
retrieveRLNDetailsButton.disabled = true;
},
- enableRegisterButtonForGoerli(chainId) {
- registerButton.disabled = isGoerliChain(chainId) ? false : true;
+ enableRegisterButtonForSepolia(chainId) {
+ registerButton.disabled = isSepolia(chainId) ? false : true;
},
setAccount(accounts) {
addressDiv.innerText = accounts.length ? accounts[0] : "";
@@ -406,13 +413,16 @@ function initUI() {
},
onManualImport(fn) {
importManually.addEventListener("click", () => {
- const idKey = utils.hexToBytes(identityKeyInput.value);
+ const idTrapdoor = utils.hexToBytes(idTrapdoorInput.value);
+ const idNullifier = utils.hexToBytes(idNullifierInput.value);
const idCommitment = utils.hexToBytes(commitmentKeyInput.value);
+ const idSecretHash = utils.hexToBytes(idSecretHashInput.value);
+
const membershipId = membershipIdInput.value;
- const membershipKey = new MembershipKey(idKey, idCommitment);
+ const credentials = new IdentityCredential(idTrapdoor, idNullifier, idSecretHash, idCommitment);
- fn(membershipId, membershipKey);
+ fn(membershipId, credentials);
});
},
onWalletImport(fn) {
@@ -480,6 +490,6 @@ function initUI() {
};
}
-function isGoerliChain(id) {
- return id === 5;
+function isSepolia(id) {
+ return id === 11155111;
}