@nucypher/taco
Version:
### [`nucypher/taco-web`](../../README.md)
82 lines • 3.44 kB
JavaScript
import { DkgPublicKey } from '@nucypher/nucypher-core';
import { DkgCoordinatorAgent, DkgRitualState, fromHexString, } from '@nucypher/shared';
export class DkgRitual {
id;
dkgPublicKey;
sharesNum;
threshold;
state;
constructor(id, dkgPublicKey, sharesNum, threshold, state) {
this.id = id;
this.dkgPublicKey = dkgPublicKey;
this.sharesNum = sharesNum;
this.threshold = threshold;
this.state = state;
}
toObj() {
return {
id: this.id,
dkgPublicKey: this.dkgPublicKey.toBytes(),
sharesNum: this.sharesNum,
threshold: this.threshold,
state: this.state,
};
}
static fromObj({ id, dkgPublicKey, sharesNum, threshold, state, }) {
return new DkgRitual(id, DkgPublicKey.fromBytes(dkgPublicKey), sharesNum, threshold, state);
}
equals(other) {
return [
this.id === other.id,
this.dkgPublicKey.equals(other.dkgPublicKey),
this.sharesNum === other.sharesNum,
this.threshold === other.threshold,
this.state === other.state,
].every(Boolean);
}
}
const ERR_RITUAL_NOT_FINALIZED = (ritualId, ritual) => `Ritual ${ritualId} is not finalized. State: ${ritual.state}`;
export class DkgClient {
static async initializeRitual(provider, signer, domain, ursulas, authority, duration, feeModel, accessController, waitUntilEnd = false) {
const ritualId = await DkgCoordinatorAgent.initializeRitual(provider, signer, domain, ursulas.sort(), // Contract call requires sorted addresses
authority, duration, feeModel, accessController);
if (waitUntilEnd) {
const isSuccessful = await DkgClient.waitUntilRitualEnd(provider, domain, ritualId);
if (!isSuccessful) {
const ritualState = await DkgCoordinatorAgent.getRitualState(provider, domain, ritualId);
throw new Error(`Ritual initialization failed. Ritual id ${ritualId} is in state ${ritualState}`);
}
}
return ritualId;
}
static waitUntilRitualEnd = async (provider, domain, ritualId) => {
return new Promise((resolve, reject) => {
const callback = (successful) => {
if (successful) {
resolve(true);
}
else {
reject();
}
};
DkgCoordinatorAgent.onRitualEndEvent(provider, domain, ritualId, callback);
});
};
static async getRitual(provider, domain, ritualId) {
const ritualState = await DkgCoordinatorAgent.getRitualState(provider, domain, ritualId);
const ritual = await DkgCoordinatorAgent.getRitual(provider, domain, ritualId);
const dkgPkBytes = new Uint8Array([
...fromHexString(ritual.publicKey.word0),
...fromHexString(ritual.publicKey.word1),
]);
return new DkgRitual(ritualId, DkgPublicKey.fromBytes(dkgPkBytes), ritual.dkgSize, ritual.threshold, ritualState);
}
static async getActiveRitual(provider, domain, ritualId) {
const ritual = await DkgClient.getRitual(provider, domain, ritualId);
if (ritual.state !== DkgRitualState.ACTIVE) {
throw new Error(ERR_RITUAL_NOT_FINALIZED(ritualId, ritual));
}
return ritual;
}
}
//# sourceMappingURL=dkg.js.map