Hi folks,
As announced, the team at Mento Labs will be supporting the launch of cKES(Celo Kenyan Shilling) proposed by the Celo Africa DAO.
This post outlines the transactions that will be part of the activation of cKES and the creation of a new Mento pair cKES/cUSD, to be proposed by Celo Africa Dao. As with previous proposals, the Celo community will have the opportunity to verify these transactions. In preparation for the upcoming CGP, we have done the following:
- Tested the proposal on Baklava and Alfajores
- Simulated the proposal on a fork of Celo Mainnet, in addition to running tests against the fork
The prerequisite work for cKES activation has been done in a recent proposal:
The transactions that will be in the upcoming CGP will be broken down into the following sections, noted here with transaction indices in brackets:
- Initialization of the cKES stable token (0-6)
- Configure the new exchanges (7)
- Configure trading limits (8-9)
- Configure BreakerBox (10-11)
- Configure the MedianDeltaBreaker (12-14)
Before we dive deep into each section and transaction, we recommend you have celocli
set up to follow along. For the tech savvy, you can find everything we are describing here in our deployment tooling repository as code. For verifying that addresses included in the proposal are correct, please refer to the Appendix at the bottom for some handy tips.
1. Initialization of the cKES stable token
This includes all the transactions related to registering cKES as an official mento stable token: initializing the token contract, configuring its constitution parameters, adding it to the reserve, and whitelisting it as a gas currency.
TX#0 - initialize the cKES proxy token contract and sets its implementation address
This proxy contract was deployed and verified on Celo’s mainnet and points to the new StableTokenV2 implementation contract. Immediately after, ownership of the proxy contract was transferred to governance.
- Verify the StableTokenKESProxy address
- Verify the StableTokenV2 implementation address
- Verify the initialization parameters for the new stable token:
- name:
Celo Kenyan Shilling
- symbol:
cKES
- initialBalanceAddresses:
[]
(no pre-mint)
- initialBalanceValues:
[]
(no pre-mint)
TX#1 - Call StableTokenV2 initializer
- Verify the StableTokenKESProxy address
- Verify the StableTokenV2 implementation address
- Verify the initialization parameters:
- broker: - Verify the broker proxy address
- validators: - Verify the validators address
- exchange:
address(0)
- Exchanges have been deprecated and replaced by the broker
TX#2 - set constitution parameters for transfer(address,uint256)
- Verify the GovernanceProxy address
- Verify the StableTokenKES proxy address
- Verify the function selector:
bytes4(keccak256(bytes("transfer(address,uint256)")))
- Verify the threshold:
0.9 * 1e24
(same as existing stables)
TX#3 - set constitution parameters for transferWithComment(address,uint256,string)
- Verify the GovernanceProxy address
- Verify the StableTokenKES proxy address
- Verify the function selector:
bytes4(keccak256(bytes("transferWithComment(address,uint256,string)")))
- Verify the threshold:
0.6 * 1e24
(same as existing stables)
TX#4 - set constitution parameters for approve(address,uint256)
- Verify the GovernanceProxy address
- Verify the StableTokenKES proxy address
- Verify the function selector:
bytes4(keccak256(bytes("approve(address,uint256)")))
- Verify the threshold:
0.6 * 1e24
(same as existing stables)
TX#5 - add cKES as a stable token to the Reserve
- Verify the ReserveProxy address
- Verify the cKES proxy address
TX#6 - whitelist cKES as a gas currency
- Verify the FeeCurrencyWhitelistProxy address
- Verify the cKES proxy address
2. Configure the new exchange
Verification tip: As in previous proposals, we recommend ignoring the args field from celocli and focusing on params, as well as ignoring the numbered fields and instead focusing only on the named fields. This is due to how nested structs are serialized by celocli, which might make the payload look confusing.
The pool configuration structures are documented here: https://docs.mento.org/mento/developers/smart-contracts/bipoolmanager
TX#7 - create the cKES/cUSD exchange
- Verify the BiPoolManagerProxy address
- Verify the exchange configuration
3. Configure trading limits
Similar to the previous section, the output of celocli is too verbose when dealing with arguments and structs, so it’s recommended to ignore args and numbered fields and to focus instead on params and named fields.
The TradingLimit.Config structure is documented here: TradingLimits | Mento Protocol
TX#8 - configure trading limits on cUSD for the cKES/cUSD exchange
- Verify BrokerProxy address
- Verify the arguments:
- exchangeId: the deterministic id of the cKES/cUSD exchange
- token: which asset in the pair to target, in this case, the cUSD token address
- config: the trading limit configuration
TX#9 - Configure trading limits on cKES for the cKES/cUSD exchange
- Verify Broker address
- Verify the arguments:
- exchangeId: the deterministic id of the cKES/cUSD exchange
- token: which asset in the pair to target, in this case, the cKES token address
- config: the trading limit configuration
4. Configure BreakerBox
Here we configure the BreakerBox to ensure it monitors changes to the new KES/USD rate.
TX#10 - adding rate feeds to the BreakerBox:
- Verify the BreakerBox address
- Verify the arguments:
- newRateFeedIDs an array of oracle feed ids. In this case the array only contains the id of KES/USD
- KES/USD -
address(uint160(uint256(keccak256("KESUSD"))))
TX#11 - enable the MedianDeltaBreaker on the cKES/cUSD rate feed
- Verify the BreakerBox address
- Verify the arguments:
- breakerAddress should be the MedianDeltaBreaker
- rateFeedID should be the identifier for the KES/USD rate, i.e.
address(uint160(uint256(keccak256("KESUSD"))))
- enable true
5. Configure the MedianDeltaBreaker
These transactions configure the MedianDeltaBreaker with the appropriate values needed to determine when the breaker should trip for the KES/USD rate feed and how much time should pass before the breakers can be reset.
TX#12 - set the cooldown time on the MedianDeltaBreaker for the KES/USD rate feed
- Verify the MedianDeltaBreaker address
- Verify the arguments:
- rateFeedIDs: the array of rate feeds to configure:
- KES/USD:
address(uint160(uint256(keccak256("KESUSD"))))
- cooldownTimes: the array of cooldown times to be configured per rate feed. The values are in seconds.
- KES/USD: 15 minutes = 900s
TX#13 - set the rate change thresholds on the MedianDeltaBreaker for the KES/USD rate feed
- Verify the MedianDeltaBreaker address
- Verify the arguments:
- rateFeedIDs: the array of rate feeds to configure:
- KES/USD:
address(uint160(uint256(keccak256("KESUSD"))))
- rateChangeThresholds: The array of rate change thresholds to be configured per rate feed. The values are fixed-point numbers – a number with 24 decimals, i.e. 1 is written as 1e24.
TX#14 - set the smoothing factor on the MedianDeltaBreaker for the KES/USD rate feed
- Verify the MedianDeltaBreaker address
- Verify the arguments:
- rateFeedID: The id of the rate feed to be updated
- KES/USD:
address(uint160(uint256(keccak256("KESUSD"))))
- newSmoothingFactor: The new smoothing factor value. The value is a fixed point number, similar to the rate change threshold.
Appendix: Verifying an address
Verifying that an address in the CGP is correct requires a few different strategies depending on what that address is (see the mento docs for some additional information). Here are common situations:
- Is it a rate feed identifier like:
address(uint160(keccack256(”KESUSD”)))
- Use Keccak-256 Online 2 to compute the keccak
- Take the last 40 characters (20 bytes) of the keccak and compare with the value
- Is it a Mento contract?
- Did it exist prior to MU01? (e.g. SortedOracles, StableToken, etc)
- Yes:
- It’s probably a proxy so you can check the addresses in the docs: Addresses - Mento Protocol 1
- You can also query the Registry contract on the target network
- No:
- Is it a Core Celo contract?
- Yes:
- It’s probably GoldToken or FeeCurrencyWhiteList which can be both verified in the Celo Registry
We are very excited to have partnered with Celo Africa DAO and look forward to the use cases that cKES will enable. If you would like to deploy a stable token on the Mento Platform we would love to hear from you as well. Please join our discord and reach out.