Once a proposal is submitted, if
Proposal.TotalDeposit < ActiveParam.MinDeposit, Atom holders can send
MsgDeposit transactions to increase the proposal's deposit.
Increase proposal.TotalDeposit by sender's deposit
If MinDeposit is reached:
Push proposalID in ProposalProcessingQueueEnd
Transfer Deposit from the proposer to the governance ModuleAccount
A MsgDeposit transaction has to go through a number of checks to be valid.
These checks are outlined in the following pseudocode.
Copy
// PSEUDOCODE //// Check if MsgDeposit is valid. If it is, increase deposit and check if MinDeposit is reached
upon receiving txGovDeposit from sender do
// check if proposal is correctly formatted. Includes fee payment.if!correctlyFormatted(txGovDeposit)
throw
proposal =load(Proposals,<txGovDeposit.ProposalID|'proposal'>)// proposal is a const key, proposalID is variableif(proposal ==nil)// There is no proposal for this proposalID
throw
if(txGovDeposit.Deposit.Atoms <=0) OR (sender.AtomBalance < txGovDeposit.Deposit.Atoms) OR (proposal.CurrentStatus != ProposalStatusOpen)// deposit is negative or null// OR sender has insufficient funds// OR proposal is not open for deposit anymore
throw
depositParam =load(GlobalParams,'DepositParam')if(CurrentBlock >= proposal.SubmitBlock + depositParam.MaxDepositPeriod)
proposal.CurrentStatus = ProposalStatusClosed
else// sender can deposit
sender.AtomBalance -= txGovDeposit.Deposit.Atoms
proposal.Deposits.append({txGovVote.Deposit, sender})
proposal.TotalDeposit.Plus(txGovDeposit.Deposit)if(proposal.TotalDeposit >= depositParam.MinDeposit)// MinDeposit is reached, vote opens
proposal.VotingStartBlock = CurrentBlock
proposal.CurrentStatus = ProposalStatusActive
ProposalProcessingQueue.push(txGovDeposit.ProposalID)store(Proposals,<txGovVote.ProposalID|'proposal'>, proposal)
Once ActiveParam.MinDeposit is reached, voting period starts. From there,
bonded Atom holders are able to send MsgVote transactions to cast their
vote on the proposal.
Note: Gas cost for this message has to take into account the future tallying of the vote in EndBlocker
Next is a pseudocode outline of the way MsgVote transactions are
handled:
Copy
// PSEUDOCODE //// Check if MsgVote is valid. If it is, count vote//
upon receiving txGovVote from sender do
// check if proposal is correctly formatted. Includes fee payment.if!correctlyFormatted(txGovDeposit)
throw
proposal =load(Proposals,<txGovDeposit.ProposalID|'proposal'>)if(proposal ==nil)// There is no proposal for this proposalID
throw
if(proposal.CurrentStatus == ProposalStatusActive)// Sender can vote if// Proposal is active// Sender has some bondsstore(Governance,<txGovVote.ProposalID|'addresses'|sender>, txGovVote.Vote)// Voters can vote multiple times. Re-voting overrides previous vote. This is ok because tallying is done once at the end.