Dunia launching eXOF on CELO

Hello Celo community, my name is SERGE KIEMA and I am the Founder and CEO of Dunia.

After almost 2 years of research, we are ready to launch eXOF on Celo via the Mento Platform, a stablecoin tied to the CFA franc which is shared by 14 countries in Africa.

As a part of the connect the world initiative, Dunia will support on/off ramping of eXOF once it’s launched on chain. With eXOF launching, we want to share our vision of a Decentralized mobile money service leveraging eXOF, Valora & Dunia. Our users will now be able to cash in/out of Valora and access the broader DeFi ecosystem through eXOF and Dunia’s cash network across francophone Africa (integrated with fiat connect).

Team Background :

We built DuniaPay, a mobile app that grew to 45k monthly active users across Francophone Africa with +6m$ in monthly volume. The company recently pivoted to focus on building their payment infrastructure and grow an ecosystem around eXOF. Specifically we offer payment API to businesses looking for cash in/out services across Francophone Africa
We are active in all major markets across Francophone Africa (Burkina, Côte d’Ivoire, Senegal, MALI, Togo, Benin, Guinea, Cameroon) and are aggressively working on growing our cash network.

Context around eXOF :

Originally envisaged as cXOF, the stablecoin will be denominated eXOF. Dunia as a company is transitioning into a lab called ECOLab with the goal of supporting an ecosystem around eXOF. The XOF is a currency shared by 14 countries in francophone Africa and they also share common regulation frameworks around e money or mobile money. With the growth around mobile money in francophone Africa, Dunia is proposing a mobile friendly crypto solution combining a wallet + a native stablecoin that could unlock a range of use cases for locals in Francophone Africa. With Dunia access to cash networks around francophone Africa, we will be serving as the main on/off Ramp providers for eXOF through Valora & fiat connect. The goal is to give users an experience that would be similar to mobile money where they can on/off ramp through cash agents and access a range of services (Dapps) through Valora.

We started work on eXOF 2 years ago with the launch of the DuniaPay wallet. The goal was to build a stablecoin that would power a mobile money ecosystem with merchants, agents and end users interacting seamlessly on the Celo blockchain. Fast forward 2 years now we have grown our cash network to more than +25k merchants and +10 banks & micro finance institutions across francophone Africa. Our goal is to progressively transition to eXOF as the base currency for our cash network. With fiat connect, Valora, eXOF and Dunia (soon EcoLabs), we are launching a stablecoin powered mobile money service. For this, we partnered with Mento Labs, who helped us with the technical setup and the overall integration into the Mento Platform.

TIMELINE.

Once the development part is completed by Mento Labs (expected September), we will start the deployment stage that consists of series Celo Governance Proposals:

CGP to add XOF/EUR exchange rates to Sorted Oracles
Deployment of eXOF smart contract;
Main CGP that will propose:
Enabling axlEUROC as new Reserve collateral;
Adding eXOF/EUROC constant sum and eXOF/CELO exchange pairs to the Broker

We welcome any feedback from the community and would love to also hear from partners interested in integrating our solution!

19 Likes

Very excited about this @Kiems1 and congratulations to everyone involved!

4 Likes

Super stoked about this launch - congrats @Kiems1 and team! We at Mento Labs are looking forward to supporting you with all the tech necessary to make the eXOF a big success!

4 Likes

Thrilled for this milestone, @Kiems1. Our full support is with you!

4 Likes

Great partnership with Dunia on the ground and Mento Labs as a development partner!! Offering an additional currency to users in Africa sounds amazing, and excited to learn more about the decentralized mobile money initiative with Dunia and Valora.

2 Likes

Thanks for the support guys really excited about this !

1 Like

Congrats on the launch! Really exciting progress and would love to see more regional stablecoins develop. Very cool

2 Likes

Congratulations, friends!

1 Like

I think this proposal is very interesting and could help in the Celo adoption in the long term.

I am working together with @pin0x1611 and @0xj4an in a similar proposal to move forward in the launch and mass adoption of a stable currency associated with the Colombian Peso (Proposal to introduce Colombian Peso (cCOP) Stable Coin)

This idea is supported by the fact that Colombia isone of the 15 countries with the highest crypto adoption, but Colombian people is used to think in local currency and the adoption of more Crypto depend of the fact of have one StableCoin pegged to the Local Currency, So we need to move forward with this proposal and crypto adoption could begin to grow based on the Colombian Peso.

I think mento labs team is very suportive with this type of proposals and @bowd head of Product at Mento @olektronisch and @marek are also supportive with new stablecoins being alive in Celo Ecosystem.

Only for curiosity, I want to know about regulations in theses countries where the idea is to use this stablecoin. I am a lawyer and this topic interests me very much.

2 Likes

A more comprehensive documents on the motivations behind eXOF

1 Like

Hello everyone!

For the last few months we at Mento Labs have been working together with Dunia as their tech partner for the launch of eXOF: a stable coin pegged to the CFA Franc.

This post outlines the transactions that will be part of the eXOF activation CGP to be proposed by Dunia. As with previous proposals, the Celo community will have the opportunity to verify them. In preparation for the upcoming CGP, we have done the following:

  • Tested the proposal on Baklava and Alfajores
  • Simulated the proposal on top of a fork of Celo Mainnet, in addition to running tests against the fork

Some pre-requisite work for the eXOF activation was already done in recent proposals:

  • Addition of CELO/XOF, EUROC/XOF and EUR/XOF Oracles (CGP 94, CGP 98)
  • Registration of the StableTokenProxyXOF contract in the Celo Registry (CGP 94)

The transactions in the upcoming CGP will be broken down into the following sections, noted here with transaction indices in brackets:

  1. Initialization of the eXOF stable token (0-7)
  2. Configure the new exchanges (8-9)
  3. Configure trading limits (10-13)
  4. Configure BreakerBox (14-19)
  5. Configure the MedianDeltaBreaker (20-21)
  6. Configure the ValueDeltaBreaker (22-24)

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 eXOF stable token

This includes all the transactions related to registering eXOF 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 eXOF proxy token contract and sets its implementation address
This proxy contract was deployed and verified on Celo mainnet, followed by its implementation contract. Both contracts ownership was transferred to governance immediately after. See CGP 94 for more.

  • Verify the StableTokenXOFProxy address
  • Verify the StableTokenXOF implementation address
  • Verify the initialization parameters for the new stable token:
    • name: ECO CFA
    • symbol: eXOF
    • decimals: 18
    • registryAddress: 0x000000000000000000000000000000000000ce10 (the Celo registry address)
    • inflationRate: 1e24 (not used in practice, but same as existing stables for consistency)
    • inflationFactorUpdatePeriod: 47304000 (not used in practice, but same as existing stables for consistency)
    • initialBalanceAddresses: [] (no pre-mint)
    • initialBalanceValues: [] (no pre-mint)
    • exchangeIdentifier: Broker

TX#1 - set constitution parameters for setRegistry(address)

  • Verify the GovernanceProxy address
  • Verify the function selector: bytes4(keccak256(bytes("setRegistry(address)")))
  • Verify the threshold: 0.9 * 1e24 (same as existing stables)

TX#2 - set constitution parameters for setInflationParameters(uint256,uint256)

  • Verify the GovernanceProxy address
  • Verify the function selector: bytes4(keccak256(bytes("setInflationParameters(uint256,uint256)")))
  • Verify the threshold: 0.6 * 1e24 (same as existing stables)

TX#3 - set constitution parameters for transfer(address,uint256)

  • Verify the GovernanceProxy address
  • Verify the function selector: bytes4(keccak256(bytes("transfer(address,uint256)")))
  • Verify the threshold: 0.6 * 1e24 (same as existing stables)

TX#4 - set constitution parameters for transferWithComment(address,uint256,string)

  • Verify the GovernanceProxy address
  • Verify the function selector: bytes4(keccak256(bytes("transferWithComment(address,uint256,string)")))
  • Verify the threshold: 0.6 * 1e24 (same as existing stables)

TX#5 - set constitution parameters for approve(address,uint256)

  • Verify the GovernanceProxy address
  • Verify the function selector: bytes4(keccak256(bytes("approve(address,uint256)")))
  • Verify the threshold: 0.6 * 1e24 (same as existing stables)

TX#6 - add eXOF as a stable token to the PartialReserve

  • Verify the PartialReserveProxy address
  • Verify the eXOF proxy address

TX#7 - whitelist eXOF as a gas currency

  • Verify the FeeCurrencyWhitelistProxy address
  • Verify the eXOF proxy address

2. Configure the new exchanges

:warning: 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: BiPoolManager - Mento Protocol

TX#8 - create the eXOF/CELO exchange

  • Verify the BiPoolManagerProxy address
  • Verify the exchange configuration

TX#9 - create the eXOF/axlEUROC 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#10 - configure trading limits on eXOF for the eXOF/CELO exchange

  • Verify Broker address
  • Verify the arguments:
    • exchangeId: the deterministic id of the eXOF/CELO exchange
    • token: which asset in the pair to target, in this case, the eXOF token address
    • config: the trading limit configuration

TX#11 - Configure trading limits on CELO for the eXOF/CELO exchange

  • Verify Broker address
  • Verify the arguments:
    • exchangeId: the deterministic id of the eXOF/CELO exchange
    • token: which asset in the pair to target, in this case, the CELO token address
    • config: the trading limit configuration

TX#12 - Configure trading limits on eXOF for the eXOF/axlEUROC exchange

  • Verify Broker address
  • Verify the arguments:
    • exchangeId: the deterministic id of the eXOF/axlEUROC exchange
    • token: which asset in the pair to target, in this case, the eXOF token address
    • config: the trading limit configuration

TX#13 - Configure trading limits on axlEUROC for the eXOF/axlEUROC exchange

  • Verify Broker address
  • Verify the arguments:
    • exchangeId: the deterministic id of the eXOF/axlEUROC exchange
    • token: which asset in the pair to target, in this case, the axlEUROC token address
    • config: the trading limit configuration

4. Configure BreakerBox

TX#14 - adding all rate feeds to the BreakerBox:

  • Verify the BreakerBox address
  • Verify the arguments:
    • newRateFeedIDs an array of oracle feed ids
      • EUR/XOF - address(uint160(uint256(keccak256("EURXOF"))))
      • EUROC/XOF - address(uint160(uint256(keccak256("EUROCXOF"))))
      • CELO/XOF - the eXOF token address

TX#15 - set CELO/XOF rate feed dependencies to EUR/XOF and EUROC/XOF

  • Verify the BreakerBox address
  • Verify the arguments
    • rateFeedID: the identifier for the CELO/XOF rate, i.e. the eXOF token address
    • dependencies: an array of oracle rate feed ids
      • EUR/XOF - address(uint160(uint256(keccak256("EURXOF"))))
      • EUROC/XOF - address(uint160(uint256(keccak256("EUROCXOF"))))

TX#16 - set EUROC/XOF rate feed dependencies to EUR/XOF and EUROC/EUR

  • Verify the BreakerBox address
  • Verify the arguments
    • rateFeedID: the identifier for the EUROC/XOF rate, address(uint160(uint256(keccak256("EUROCXOF"))))
    • dependencies: an array of oracle rate feed ids
      • EUR/XOF - address(uint160(uint256(keccak256("EURXOF"))))
      • EUROC/EUR - address(uint160(uint256(keccak256("EUROCEUR"))))

TX#17 - enable the MedianDeltaBreaker on the CELO/XOF rate feed

  • Verify the BreakerBox address
  • Verify the arguments:
    • breakerAddress should be the MedianDeltaBreaker
    • rateFeedID should be the identifier for the CELO/XOF rate, i.e. the eXOF token address
    • enable true

TX#18 - enable the ValueDeltaBreaker on the EUR/XOF rate feed

  • Verify the BreakerBox address
  • Verify the arguments:
    • breakerAddress should be the MedianDeltaBreaker
    • rateFeedID should be the identifier for the EUR/XOF rate, address(uint160(uint256(keccak256("EURXOF"))))
    • enable true

TX#19 - Enable the ValueDeltaBreaker on the EUROC/XOF rate feed

  • Verify the BreakerBox address
  • Verify the arguments:
    • breakerAddress should be the MedianDeltaBreaker
    • rateFeedID should be the identifier for the EUROC/XOF rate, address(uint160(uint256(keccak256("EUROCXOF"))))
    • enable true

5. Configure the MedianDeltaBreaker

TX#20 - set the cooldown time on the MedianDeltaBreaker for the CELO/XOF rate feed

  • Verify the MedianDeltaBreaker address
  • Verify the arguments:
    • rateFeedIDs: the array of rate feeds to configure:
      • CELO/XOF: the eXOF token address
    • cooldownTimes: the array of cooldown times to be configured per rate feed. The values are in seconds.
      • CELO/XOF: 30 minutes = 1800s

TX#21 - set the rate change thresholds on the MedianDeltaBreaker for the CELO/XOF rate feed

  • Verify the MedianDeltaBreaker address
  • Verify the arguments:
    • rateFeedIDs: the array of rate feeds to configure:
      • CELO/XOF: the eXOF token address
    • 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.
      • CELO/XOF: 3e22 = 3%

6. Configure the ValueDeltaBreaker

During the initial launch, a non-recoverable ValueDeltaBreaker will be configured on the EUR/XOF rate feed. When triggered, it will disable the eXOF exchanges and require manual governance intervention in order to re-enable them. This breaker will only trigger if the EUR/XOF exchange rate changes more than 10% from the official exchange rate to the EUR: €1 = F.CFA 655.957.

TX#22 - set the cooldown times on the ValueDeltaBreaker for the EUR/XOF and EUROC/XOF rate feeds

  • Verify the ValueDeltaBreaker address
  • Verify the arguments:
    • rateFeedIDs: the array of rate feeds to configure. Should contain the rate feed identifiers for:
      • EUR/XOF address(uint160(uint256(keccak256("EURXOF"))))
      • EUROC/XOF address(uint160(uint256(keccak256("EUROCXOF"))))
    • cooldownTimes: the array of cooldown times to be configured, the indices will match with the rateFeedIDs array. The values are seconds.
      • EUR/XOF: 0 (unrecoverable breaker which requires manual intervention)
      • EUROC/XOF: 15 minutes = 900s

TX#23 - set the rate change thresholds on the ValueDeltaBreaker for the EUR/XOF and EUROC/XOF rate feeds

  • Verify the ValueDeltaBreaker address
  • Verify the parameters:
    • rateFeedIDs: the array of rate feeds to configure, should contain the rate feed identifiers for:
    • EUR/XOF - address(uint160(uint256(keccak256("EURXOF"))))
    • EUROC/XOF - address(uint160(uint256(keccak256("EUROCXOF"))))
      • rateChangeThresholds: The array of rate change thresholds to be configured, the indices will match with the rateFeedIDs array. The values are fixed-point numbers – a number with 24 decimals, i.e. 1 is written as 1e24.
        • EUR/XOF: 1e23 = 10%
        • EUROC/XOF: 5e21 = 0.5%

TX#24 - set the rate reference value on the ValueDeltaBreaker for the EUR/XOF and EUROC/XOF rate feeds

  • Verify the ValueDeltaBreaker address
  • Verify the parameters:
    • rateFeedIDs: the array of rate feeds to configure, should contain the rate feed identifiers for:
    • EUR/XOF - address(uint160(uint256(keccak256("EURXOF"))))
    • EUROC/XOF - address(uint160(uint256(keccak256("EUROCXOF"))))
      • _referenceValues: the array of reference values to set, indices will match the rateFeedIDs array. The values are fixed point numbers – a number with 24 decimals, i.e. 1 is written as 1e24.
        • EUR/XOF: 6.55957e26 = 655.957 * 10 ** 24
        • EUROC/XOF: 6.55957e26 = 655.957 * 10 ** 24

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(”USDCEUR”)))
    • 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?
  • Is it a Core Celo contract?
    • Yes:
      • It’s probably GoldToken or FeeCurrencyWhiteList which can be both verified in the Celo Registry
    • No:

One more thing

Just kidding, that’s it! We are very excited to have partnered with Dunia and look forward to the use cases that eXOF 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.

3 Likes

Hello Everyone! The proposal just went live !

You can find it at the link bellow or through the celocli with the command bellow !

celocli governance:show --proposalID 139 --node https://forno.celo.org

3 Likes

Really happy to see this coming to Celo!

1 Like