Deposit and Withdrawal Flows
These are the flows of how CELO is deposited and withdrawn from the protocol, detailing specific contract functions that need to be called.
msg.valueto the amount of CELO one wants to deposit. stCELO is minted to the user, and Manager schedules votes according to the voting strategy.
At some point,
Account.activateAndVoteshould be called for each validator group that has had votes scheduled recently. Note that this does not need to be called for every deposit call, but ideally should be called before the epoch during which the deposit was made ends. This is because voting CELO doesn't start receiving epoch rewards until the next epoch after it was used for voting. The function can be called by any address, whether or not it had previously deposited into the protocol (in particular, there could be a bot that calls it once a day per validator group).
Manager.withdraw. stCELO is burned from the user, and Manager schedules withdrawals according to the voting strategy. The following steps are necessary to unlock Account's CELO from the
LockedGoldcontract and actually distribute them to the user.
Account.withdrawfor each group that was scheduled to be withdrawn from in the previous step (can be called by anyone, e.g. a bot). Some CELO might be available for immediate withdrawal, if it hadn't yet been locked and used for voting, and will be transferred to the user. For the rest of the withdrawal amount, it will be unvoted from the specified group and the
LockedGoldunlocking process will begin.
- After the 3 day unlocking period has passed,
Account.finishPendingWithdrawalshould be called (can be called by anyone, e.g. a bot), specifying the pending withdrawal that was created in the previous step. This will finalize the
LockedGoldwithdrawal and return the remaining CELO to the user.