mirror of
https://github.com/logos-messaging/lab.waku.org.git
synced 2026-01-09 01:03:07 +00:00
92 lines
2.3 KiB
JavaScript
92 lines
2.3 KiB
JavaScript
import { createRLN, Keystore, extractMetaMaskSigner } from "@waku/rln";
|
|
import { randomNumber } from "./utils";
|
|
import { SIGNATURE_MESSAGE } from "./const";
|
|
|
|
export async function initRLN({ onStatusChange }) {
|
|
onStatusChange("Initializing RLN...");
|
|
|
|
let rln;
|
|
try {
|
|
rln = await createRLN();
|
|
} catch (err) {
|
|
onStatusChange(`Failed to initialize RLN: ${err}`, "error");
|
|
throw Error(err);
|
|
}
|
|
|
|
onStatusChange("RLN initialized", "success");
|
|
|
|
const connectWallet = async () => {
|
|
let signer;
|
|
try {
|
|
onStatusChange("Connecting to wallet...");
|
|
signer = await extractMetaMaskSigner();
|
|
} catch (err) {
|
|
onStatusChange(`Failed to access MetaMask: ${err}`, "error");
|
|
throw Error(err);
|
|
}
|
|
|
|
try {
|
|
onStatusChange("Connecting to Ethereum...");
|
|
const localKeystore = readLocalKeystore();
|
|
|
|
await rln.start({
|
|
signer,
|
|
credentials: { keystore: localKeystore },
|
|
});
|
|
} catch (err) {
|
|
onStatusChange(`Failed to connect to Ethereum: ${err}`, "error");
|
|
throw Error(err);
|
|
}
|
|
|
|
onStatusChange("RLN started", "success");
|
|
};
|
|
|
|
const registerCredential = async (password) => {
|
|
if (!rln.signer) {
|
|
alert("RLN is not initialized. Try connecting wallet first.");
|
|
return;
|
|
}
|
|
|
|
const signature = await rln.signer.signMessage(
|
|
`${SIGNATURE_MESSAGE}. Nonce: ${randomNumber()}`
|
|
);
|
|
|
|
const credential = await rln.registerMembership({ signature });
|
|
const hash = await rln.keystore.addCredential(credential, password);
|
|
|
|
return { hash, credential };
|
|
};
|
|
|
|
const readKeystoreOptions = () => {
|
|
return rln.keystore.keys();
|
|
};
|
|
|
|
const readCredential = async (hash, password) => {
|
|
return rln.keystore.readCredential(hash, password);
|
|
};
|
|
|
|
const saveLocalKeystore = () => {
|
|
const keystoreStr = rln.keystore.toString();
|
|
localStorage.setItem("keystore", keystoreStr);
|
|
return keystoreStr;
|
|
};
|
|
|
|
const importLocalKeystore = (keystoreStr) => {
|
|
rln.keystore = Keystore.fromString(keystoreStr) || Keystore.create();
|
|
};
|
|
|
|
return {
|
|
rln,
|
|
connectWallet,
|
|
registerCredential,
|
|
readKeystoreOptions,
|
|
readCredential,
|
|
saveLocalKeystore,
|
|
importLocalKeystore,
|
|
};
|
|
}
|
|
|
|
function readLocalKeystore() {
|
|
return localStorage.getItem("keystore") || "";
|
|
}
|