* Stored ephemeral key pairs in localStorage (nonce -> ephemeralKeyPair)
export type StoredEphemeralKeyPairs = { [nonce: string]: EphemeralKeyPair };
* Retrieve all ephemeral key pairs from localStorage and decode them. The new ephemeral key pair
* is then stored in localStorage with the nonce as the key.
export const storeEphemeralKeyPair = (
ephemeralKeyPair: EphemeralKeyPair,
// Retrieve the current ephemeral key pairs from localStorage
const accounts = getLocalEphemeralKeyPairs();
// Store the new ephemeral key pair in localStorage
accounts[ephemeralKeyPair.nonce] = ephemeralKeyPair;
encodeEphemeralKeyPairs(accounts),
* Retrieve all ephemeral key pairs from localStorage and decode them.
export const getLocalEphemeralKeyPairs = (): StoredEphemeralKeyPairs => {
const rawEphemeralKeyPairs = localStorage.getItem("ephemeral-key-pairs");
return rawEphemeralKeyPairs
? decodeEphemeralKeyPairs(rawEphemeralKeyPairs)
// eslint-disable-next-line no-console
"Failed to decode ephemeral key pairs from localStorage",
* Encoding for the EphemeralKeyPair class to be stored in localStorage
const EphemeralKeyPairEncoding = {
decode: (e: any) => EphemeralKeyPair.fromBytes(e.data),
encode: (e: EphemeralKeyPair) => ({ __type: 'EphemeralKeyPair', data: e.bcsToBytes() }),
* Stringify the ephemeral key pairs to be stored in localStorage
export const encodeEphemeralKeyPairs = (
keyPairs: StoredEphemeralKeyPairs,
JSON.stringify(keyPairs, (_, e) => {
if (typeof e === "bigint") return { __type: "bigint", value: e.toString() };
if (e instanceof Uint8Array)
return { __type: "Uint8Array", value: Array.from(e) };
if (e instanceof EphemeralKeyPair)
return EphemeralKeyPairEncoding.encode(e);
* Parse the ephemeral key pairs from a string
export const decodeEphemeralKeyPairs = (
encodedEphemeralKeyPairs: string,
): StoredEphemeralKeyPairs =>
JSON.parse(encodedEphemeralKeyPairs, (_, e) => {
if (e && e.__type === "bigint") return BigInt(e.value);
if (e && e.__type === "Uint8Array") return new Uint8Array(e.value);
if (e && e.__type === "EphemeralKeyPair")
return EphemeralKeyPairEncoding.decode(e);
export default function useEphemeralKeyPair() {
const ephemeralKeyPair = EphemeralKeyPair.generate();
storeEphemeralKeyPair(ephemeralKeyPair);