import { RestClient } from '@reyaxyz/common'; import { GetVoteContractDetailsResult, GetVoteDetailsParams, GetVoteDetailsResult, GetVoteStatusParams, GetVoteStatusResult, VoteParams, VoteResult, } from './types'; import { Logger, Loggable } from '@reyaxyz/common'; import { sendVote } from './services'; export default class VoteModule extends RestClient implements Loggable { loggingEnabled: boolean = false; constructor(apiUrl: string, loggingEnabled: boolean) { super(apiUrl); this.loggingEnabled = loggingEnabled; } // WRITE @Logger('VoteModule.vote') async vote(params: VoteParams): Promise { const infoUri = `/api/vote/contract-details/${params.slug}`; const infoMetadata = await this.get(infoUri); const { signature: signature, deadline: signatureDeadline } = await sendVote({ ...params, contractAddress: infoMetadata.contractAddress, }); const voteUri = `/api/vote/${infoMetadata.contractAddress}/vote`; const result = await this.put<{ txHash: string }>( voteUri, {}, { voter: await params.signer.getAddress(), isYesVote: params.voted, signature: signature, signatureDeadline: signatureDeadline, }, ); return { transactionHash: result.txHash }; } // READ @Logger('VoteModule.getVoteDetails') async getVoteDetails(params: GetVoteDetailsParams) { const uri = `/api/vote/${params.slug}`; const voteDetails = await this.get(uri); let markdownDescription = ''; voteDetails.description.split('\n ').forEach((i) => { markdownDescription = `${markdownDescription} ${i}`; }); voteDetails.description = markdownDescription; return voteDetails; } @Logger('VoteModule.getVoteStatus') async getVoteStatus(params: GetVoteStatusParams) { const uri = `/api/vote/${params.slug}/user/${params.address}`; return this.get(uri); } }