Contrato – Parte 7

To Share and +4 nLEARNs

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.

Generate comment with AI 2 nL
Scroll to Top