@q-dev/q-js-sdk
Version:
Typescript Library to interact with Q System Contracts
112 lines • 4.43 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaseVotingInstance = void 0;
const types_1 = require("../types");
const BaseContractInstance_1 = require("./BaseContractInstance");
/**
* Voting interface to interact with Voting implementation contracts.
* See [onchain documentation](@system-contracts-repo/@network/IVoting/) for more details.
*/
class BaseVotingInstance extends BaseContractInstance_1.BaseContractInstance {
/**
* Get all proposals in specific block diapason
* @param fromBlock start block from which we get proposals
* @param toBlock end block from which we get proposals
* @returns proposals
*/
async getProposalIds(fromBlock = 0, toBlock = 'latest') {
const proposalEvents = await this.instance.queryFilter(this.instance.filters.ProposalCreated(), fromBlock, toBlock);
const proposalIds = proposalEvents.map((evt) => evt.args._id.toString());
return proposalIds;
}
/**
* Get proposal information
* @param proposalId proposal id
* @returns information about proposal
*/
async getProposalWithStatus(proposalId) {
const p = await this.getProposal(proposalId);
const status = await this.getStatus(proposalId);
return { id: proposalId.toString(), ...p, status };
}
/**
* Get proposals by ids
* @param proposalIds proposal ids
* @returns proposals
*/
async getProposals(...proposalIds) {
if (!proposalIds || proposalIds.length == 0) {
proposalIds = await this.getProposalIds();
}
const promises = proposalIds.map(async (id) => (await this.getProposalWithStatus(id)));
return Promise.all(promises);
}
/**
* Get proposal statistics
* @param proposalId proposal id
* @returns proposal statistics
*/
async getProposalStats(proposalId) {
const proposalStats = await this.instance.getProposalStats(proposalId);
return {
requiredQuorum: proposalStats.requiredQuorum.toString(),
currentQuorum: proposalStats.currentQuorum.toString(),
requiredMajority: proposalStats.requiredMajority.toString(),
currentMajority: proposalStats.currentMajority.toString(),
currentVetoPercentage: proposalStats.currentVetoPercentage.toString(),
};
}
/**
* Get proposal status
* @param proposalId proposal id
* @returns status of proposal
*/
async getStatus(proposalId) {
const statusMethod = this.instance['getStatus'];
if (!statusMethod)
throw Error('status not supported on this kind of voting');
return (await statusMethod(proposalId)).toString();
}
mapStatus(rawStatus) {
switch (rawStatus) {
case types_1.ProposalStatus.NONE: return 'NONE';
case types_1.ProposalStatus.PENDING: return 'PENDING';
case types_1.ProposalStatus.REJECTED: return 'REJECTED';
case types_1.ProposalStatus.ACCEPTED: return 'ACCEPTED';
case types_1.ProposalStatus.PASSED: return 'PASSED';
case types_1.ProposalStatus.EXECUTED: return 'EXECUTED';
case types_1.ProposalStatus.OBSOLETE: return 'OBSOLETE';
case types_1.ProposalStatus.EXPIRED: return 'EXPIRED';
default: throw new Error(`cannot convert unknown proposal status ${rawStatus}`);
}
}
/**
* Vote for proposal
* @param proposalId current proposal id
* @param txOptions transaction options
* @returns transaction receipt
*/
async voteFor(proposalId, txOptions) {
return this.submitTransaction('voteFor', [proposalId], txOptions);
}
/**
* Vote against proposal
* @param proposalId current proposal id
* @param txOptions transaction options
* @returns transaction receipt
*/
async voteAgainst(proposalId, txOptions) {
return this.submitTransaction('voteAgainst', [proposalId], txOptions);
}
/**
* execute proposal
* @param proposalId current proposal id
* @param txOptions transaction options
* @returns transaction receipt
*/
async execute(proposalId, txOptions) {
return this.submitTransaction('execute', [proposalId], txOptions);
}
}
exports.BaseVotingInstance = BaseVotingInstance;
//# sourceMappingURL=BaseVotingInstance.js.map