Hi folks,
As announced, the team at Mento Labs will be supporting the launch of $PUSO proposed by the Celo Philippines DAO.
This post outlines the transactions that will be part of the activation of $PUSO and the creation of a new Mento pair cUSD/PUSO, to be proposed by Celo Philippines 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 $PUSO activation has been done in a recent proposal:
- Addition of
PHP/USD
and CELO/PHP
oracles (CGP 146)
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 PUSO stable token (0-6)
- Configure the new exchange (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 PUSO stable token
This includes all the transactions related to registering PUSO 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 PUSO proxy token contract and set 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 StableTokenPHPProxy address
- Verify the StableTokenV2 implementation address
- Verify the initialization parameters for the new stable token:
- name:
PUSO
- symbol:
PUSO
- initialBalanceAddresses:
[]
(no pre-mint)
- initialBalanceValues:
[]
(no pre-mint)
TX#1 - Call StableTokenV2 initializer
- Verify the StableTokenPHPProxy 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 StableTokenPHPProxy 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 StableTokenPHPProxy 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 StableTokenPHPProxy address
- Verify the function selector:
bytes4(keccak256(bytes("approve(address,uint256)")))
- Verify the threshold:
0.6 * 1e24
(same as existing stables)
TX#5 - add PUSO as a stable token to the Reserve
- Verify the ReserveProxy address
- Verify the StableTokenPHPProxy address
TX#6 - whitelist PUSO as a gas currency
- Verify the FeeCurrencyWhitelistProxy address
- Verify the StableTokenPHPProxy 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 cUSD/PUSO 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 cUSD/PUSO exchange
- Verify BrokerProxy address
- Verify the arguments:
- exchangeId: the deterministic id of the cUSD/PUSO 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 PUSO for the cUSD/PUSO exchange
- Verify Broker address
- Verify the arguments:
- exchangeId: the deterministic id of the cUSD/PUSO exchange
- token: which asset in the pair to target, in this case, the PUSO token address
- config: the trading limit configuration
4. Configure BreakerBox
Here we configure the BreakerBox to ensure it monitors changes to the new PHP/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 PHP/USD
- PHP/USD -
address(uint160(uint256(keccak256("relayed:PHPUSD"))))
TX#11 - enable the MedianDeltaBreaker on the PHP/USD rate feed
- Verify the BreakerBox address
- Verify the arguments:
- breakerAddress should be the MedianDeltaBreaker
- rateFeedID should be the identifier for the PHP/USD rate, i.e.
address(uint160(uint256(keccak256("relayed:PHPUSD"))))
- 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 PHP/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 PHP/USD rate feed
- Verify the MedianDeltaBreaker address
- Verify the arguments:
- rateFeedIDs: the array of rate feeds to configure:
- PHP/USD:
address(uint160(uint256(keccak256("relayed:PHPUSD"))))
- cooldownTimes: the array of cooldown times to be configured per rate feed. The values are in seconds.
- PHP/USD: 15 minutes = 900s
TX#13 - set the rate change thresholds on the MedianDeltaBreaker for the PHP/USD rate feed
- Verify the MedianDeltaBreaker address
- Verify the arguments:
- rateFeedIDs: the array of rate feeds to configure:
- PHP/USD:
address(uint160(uint256(keccak256("relayed:PHPUSD"))))
- 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 PHP/USD rate feed
- Verify the MedianDeltaBreaker address
- Verify the arguments:
- rateFeedID: The id of the rate feed to be updated
- PHP/USD:
address(uint160(uint256(keccak256("relayedPHPUSD"))))
- 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(”relayed:PHPUSD”)))
- 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 Philippines DAO and look forward to the use cases that $PUSO will enable. If you would like to deploy a stable token on top of the Mento Platform we would love to hear from you as well. Please join our discord and reach out.