Antes de votar em um candidato devemos validar se a eleição está ou não ocorrendo. Não será possível votar se a eleição não estiver entre o startsAt e endsAt.
Portanto, vamos criar uma função de suporte para lidar com isso no mesmo arquivo:
verifyElectionIsHappening(electionId: number): boolean { const election = this.elections.get(String(electionId)) const now = near.blockTimestamp() const isHappening = election.startsAt < now && election.endsAt > now return isHappening }
Nota que estamos usando el objeto `near`. Se importa del SDK de NEAR y nos da acceso a mucha información, incluido `blockTimestamp`. `blockTimestamp` es el momento en que se está ejecutando el método del contrato, la marca de tiempo.
Ahora creemos nuestra función de voto:
@call({}) vote({ electionId, candidateId }: { electionId: number, candidateId: string }): void { const election = this.elections.get(String(electionId)) assert(election !== null, "Election not found.") const electionIsHappening = this.verifyElectionIsHappening(electionId) assert(electionIsHappening, "Election has not started or has already been finished.") const alreadyVoted = election.voters.filter(({ accountId }) => { return accountId === near.signerAccountId() }).length > 0 assert(!alreadyVoted, "User has already voted. Reverting call.") const candidate = election.candidates.filter(({ accountId }) => { return accountId === candidateId })[0] assert(typeof candidate !== 'undefined', "Candidate not found. Reverting call.") const voter = new Voter({ accountId: near.signerAccountId(), votedCandidateAccountId: candidate.accountId, votedAt: near.blockTimestamp() }) election.voters.push(voter) election.totalVotes += 1 election.candidates.filter((candidateFilter) => { return candidateFilter.accountId === candidate.accountId })[0].totalVotes += 1 this.elections.set(String(electionId), election) }
Novamente utilizamos o *assert* para validações na função. Perceba também que estamos utilizando *near.signerAccountId()* que é o endereço da carteira Near que está chamando a função.
No final da função, basicamente atualizamos o array de eleitores, o número de votos da eleição, o número de votos do candidato votado, o qual receberemos o ID dos parâmetros do método e, por fim, atualizamos a eleição do UnorderedMap com o objeto atualizado.
Além disso, validamos algumas questões no nosso método de voto:
– Se o eleitor já votou.
– Se o candidato existe de fato.
– Se a eleição está ocorrendo.
Start (l)earning with this Guide!
Connect Your Wallet
What is a Wallet?
Safely store and transfer your crypto and NFTs.
No need to create new accounts or credentials. Connect your wallet and you are good to go!