UNPKG

@surec/oracle

Version:

Typescript SDK for the Sure Oracle to be used to bring off-chain data on-chain

113 lines 4.06 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Proposal = void 0; const tslib_1 = require("tslib"); const constants_js_1 = require("./constants.js"); const sdk_js_1 = require("./sdk.js"); const utils_js_1 = require("./utils.js"); const spl = tslib_1.__importStar(require("@solana/spl-token")); class Proposal { constructor(sdk) { this.sdk = sdk; this.program = sdk.program; } async fetchAllProposals() { return await this.program.account.proposal.all(); } async fetchProposal({ name }) { const [proposalPDA] = this.sdk.pda.findProposalAddress({ proposalName: name, }); return await this.program.account.proposal.fetch(proposalPDA); } /** * propose vote * * propose a vote * * @param name - name of vote * @param description - description of vote * @param stake - the amount of stake the user bets on the vote * @param mint <optional> - SURE MINT if nothing specified * @returns */ async proposeVote({ name, description, stake, mint, }) { const tokenMint = mint !== null && mint !== void 0 ? mint : constants_js_1.SURE_MINT; (0, utils_js_1.validateKeys)([{ v: tokenMint, n: 'mint' }]); if (name.length == 0) { throw new Error('proposal name cannot be empty'); } if (description.length == 0) { throw new Error('proposal description cannot be empty'); } const proposerAccount = await (0, utils_js_1.getOrCreateAssociatedTokenAccountIx)({ connection: this.sdk.provider.connection, payer: this.sdk.provider.wallet.payer, mint: tokenMint, owner: this.sdk.provider.walletKey, }); const ixs = []; if (proposerAccount.instruction) { ixs.push(proposerAccount.instruction); } const id = (0, utils_js_1.createProposalHash)({ name }); const [config] = this.sdk.pda.findOracleConfig({ tokenMint }); const [proposal] = sdk_js_1.SureOracleSDK.pda().findProposalAddress({ proposalName: name, }); ixs.push(await this.program.methods .proposeVote(id, name, description, stake) .accounts({ config, proposal, proposerAccount: proposerAccount.address, proposalVaultMint: tokenMint, }) .instruction()); return this.sdk.provider.newTX(ixs); } /** * finalize vote resul ts * * @param proposal - the proposal PK * @returns TransactionEnvelope - a new transaction */ async finalizeVoteResults({ proposal, }) { const [voteArray] = this.sdk.pda.findRevealVoteArrayAddress({ proposal }); const ixs = []; ixs.push(await this.program.methods .finalizeVoteResults() .accounts({ finalizer: this.sdk.provider.wallet.publicKey, proposal, revealedVotes: voteArray, }) .instruction()); return this.sdk.provider.newTX(ixs); } /** * collect proposer rewards * * @param proposal - the proposal PK * @returns TransactionEnvelope - a new transaction */ async collectProposerRewards({ proposal, tokenMint, }) { const proposerTokenAccount = await spl.getAssociatedTokenAddress(tokenMint, this.sdk.provider.wallet.publicKey); const [config] = this.sdk.pda.findOracleConfig({ tokenMint }); const [proposalVault] = this.sdk.pda.findProposalVault({ proposal }); const ixs = []; ixs.push(await this.program.methods .collectProposerReward() .accounts({ config, proposerTokenAccount, proposal, proposalVault, proposalVaultMint: tokenMint, }) .instruction()); return this.sdk.provider.newTX(ixs); } } exports.Proposal = Proposal; //# sourceMappingURL=proposal.js.map