Granda Mento
Granda Mento, described in CIP 38, is a mechanism for exchanging large amounts of CELO for Celo stable tokens that aren't suitable for Mento or over-the-counter (OTC).
Mento has proven effective at maintaining the stability of Celo's stable tokens, but the intentionally limited liquidity of its constant-product market maker results in meaningful slippage when exchanging tens of thousands of tokens at a time. Slippage is the price movement experienced by a trade. Generally speaking, larger volume trades will incur more slippage and execute at a less favorable price for the trader.
Similar to Mento, exchanges through Granda Mento are effectively made against the reserve. Purchased stable tokens are created into existence ("minted"), and sold stable tokens are destroyed ("burned"). Purchased CELO is taken from the reserve, and sold CELO is given to the reserve. For example, a sale of 50,000 CELO in exchange for 100,000 cUSD would involve the 50,000 CELO being transferred to the reserve and the 100,000 cUSD being created and given to the exchanger.
At the time of writing, exchanging about 50,000 cUSD via Mento results in a slippage of about 2%. Without Granda Mento, all launched Celo stable tokens can only be minted and burned using Mento, with the exception of cUSD that is minted as validator rewards each epoch. Granda Mento was created to enable institutional-grade liquidity to mint or burn millions of stable tokens at a time.
The mainnet Granda Mento contract address is 0x03f6842B82DD2C9276931A17dd23D73C16454a49
(link), was introduced in Contract Release 5, and activated in CGP 31.
#
How it worksA Granda Mento exchange requires rough consensus from the Celo community and, unlike the instant and atomic Mento exchanges, involves the exchanger locking their funds to be sold for multiple days before they are exchanged.
#
DesignAt a high level, the life of an exchange is:
- Exchanger creates an "exchange proposal" on-chain that locks their funds to be sold and calculates the amount of the asset being purchased according the current oracle price and a configurable spread.
- If rough consensus from the community is achieved, a multi-sig (the "approver") that has been set by Governance approves the exchange proposal on-chain.
- To reduce trust in the approver multi-sig, a veto period takes place where any community member can create a governance proposal to "veto" an approved exchange proposal.
- After the veto period has elapsed, the exchange is executable by any account. The exchange occurs with the price locked in at stage (1).
#
ProcessesProcesses surrounding Granda Mento exchanges, like how to achieve rough consensus from the community, are outlined in CIP 46. At the minimum, it takes about 7 days to achieve rough consensus.
The approver multi-sig that is ultimately responsible for approving an exchange proposal that has achieved rough consensus from the community is 0xf10011424A0F35B8411e9abcF120eCF067E4CF27
(link) and has the following signers:
Name | Affiliation | Discord Handle | Address |
---|---|---|---|
Andrew Shen | Bi23 Labs | Shen \| Bi23 Labs #6675 | 0xBecc041a5090cD08AbD3940ab338d4CC94d2Ed3c |
Pinotio | Pinotio | Pinotio.com #5357 | 0x802FE32083fD341D8e9A35E3a351291d948a83E6 |
Serge Kiema | DuniaPay | serge_duniapay #5152 | 0xdcac99458a3c5957d8ae7b92e4bafc88a32b80e4 |
Will Kraft | Celo Governance Working Group | Will Kraft #2508 | 0x169E992b3c4BE08c42582DAb1DCFb2549d9C23E1 |
Zviad Metreveli | WOTrust | zm #1073 | 0xE267D978037B89db06C6a5FcF82fAd8297E290ff |
human | OpenCelo | human #6811 | 0x91f2437f5C8e7A3879e14a75a7C5b4CccC76023a |
Deepak Nuli | Kresko | Deepak \| Kresko#3647 | 0x099f3F5527671594351E30B48ca822cc90778a11 |
#
How to create an exchange proposalRefer to CIP 46 for information surrounding processes.
The easiest way create an exchange proposal on-chain is using the celocli grandamento:propose
command (docs). For example:
celocli grandamento:propose --from=0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d --sellCelo=true --stableToken=cUSD --value=20000000000000000000000
#
How to view exchange proposalsExchange proposal information, including the tokens and quantities being sold and bought, can be easily viewed using celocli.
To list all exchange proposals that have been proposed and are not yet cancelled, vetoed, or executed, use the celocli grandamento:list
command (docs). For example:
celocli grandamento:list
To show a specific exchange proposal regardless of it being proposed, cancelled, vetoed, or executed, use the celocli grandamento:show
command (docs). For example:
celocli grandamento:show --proposalID 1
#
How to cancel an exchange proposalThe exchanger of an exchange proposal can cancel the exchange proposal if the proposal has not yet been approved. This can be done using the celocli grandamento:cancel
command (docs). For example:
celocli grandamento:cancel --proposalID 1
If an exchange proposal has already been approved or someone other than the exchanger wishes to cancel (or "veto") an exchange proposal, this must be done by a governance proposal. CIP 46 provides information on the exact details of the governance proposal.
#
How to execute an exchange proposalAnyone is able to execute an exchange proposal that has been approved as long as the veto period has elapsed since the time of approval. This can be done using the celocli grandamento:execute
command (docs). For example:
celocli grandamento:execute --proposalID 1
#
How to view the buy amount for a hypothetical exchange proposalThe amount of the token being bought in an exchange proposal is calculated when the exchange proposal is created according to the current oracle price and the spread. To view the amount of the token being bought that a hypothetical exchange proposal would receive for a provided amount of the token sold, celocli grandamento:get-buy-amount
can be used (docs). For example:
celocli grandamento:get-buy-amount --stableToken cUSD --sellCelo true --value 20000000000000000000000
#
How to view current Granda Mento parametersGranda Mento's governable parameters can be viewed using the celocli network:parameters
command (docs). For example:
celocli network:parameters