Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
137 changes: 137 additions & 0 deletions CGPs/cgp-0232.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
---
cgp: 232
title: "Celo's Next Chapter: Opera Transition from Distribution Partner to Network Stakeholder"
date-created: 2026-03-18
author: "Pavel Hornak"
status: DRAFT
discussions-to: https://forum.celo.org/t/celos-next-chapter-opera-proposal-to-transition-from-distribution-partner-to-network-stakeholder/13124
governance-proposal-id:
date-executed:
---

## Overview

This governance proposal transfers 160,000,000 CELO from the `CeloUnreleasedTreasury` contract to an Opera-controlled Safe, transitioning Opera from a distribution partner to a long-term network stakeholder. The transfer uses a temporary registry swap pattern (same as [CGP-0207](https://github.com/celo-org/governance/blob/main/CGPs/cgp-0207.md)).

This proposal marks the first joint initiative from Celo Core Co. following the recent unification of cLabs and the Celo Foundation ([Celomorphosis](https://x.com/Celo/status/2013627730227519755)).

## Motivation

Opera has driven meaningful user adoption of Celo through MiniPay, the self-custodial stablecoin wallet that has surpassed 13M users across 66 geographies, with over 40 Mini Apps and real-world use cases. The partnership has produced all-time highs in network activity with 700K+ DAUs and 4.23M+ WAUs of USDT — more than any other chain.

The current structure of recurring governance proposals limits long-term planning. This proposal shifts the partnership from a short-term, proposal-based funding model to a long-term, aligned partnership by:

- Transitioning Opera from a distribution partner to a full network stakeholder and CELO holder
- Replacing the quarterly proposal model with a one-time lump-sum transfer of 160M CELO
- Removing recurring governance overhead while preserving the Community Fund
- Capping Opera's governance voting power at 10% of total staked CELO (as reported by [mondo.celo.org](https://mondo.celo.org/)), with the exception of protocol emergencies

Opera also brings access to hundreds of millions of users globally, including 60M Opera Mini users with access to points ready to potentially convert to cash redemption within MiniPay.

## Specification

This proposal requests a one-time transfer of 160,000,000 CELO from the unreleased treasury to an Opera-controlled Safe to support a three-year partnership.

### Payment Terms

| Milestone | CELO | $ Value at 30d-avg of $0.0771 |
| --- | --- | --- |
| Community Grants (2026 – Q3 2029) | 95,802,412.45 | $7,386,366 |
| CELO Native Token Integration | 3,242,542.15 | $250,000 |
| Ramp Infrastructure & Maintenance | 3,242,542.15 | $250,000 |
| Expanded Asset Support and Forthcoming Product Launches | 10,700,389.11 | $650,000 |
| Additional Growth Budget | 46,368,352.79 | $3,575,000 |
| **TOTAL** | **159,356,238.65** | **$12,286,366** |

The requested CELO will be transferred in a single transaction to an Opera-controlled Safe upon approval of the proposal.

### Metrics

Success will be evaluated across adoption, ecosystem growth, and engagement metrics including: MiniPay active user growth, Mini App launches and usage, transaction volume, onchain activity driven through Opera-integrated products, and geographic expansion across priority markets (LATAM, Southeast Asia, APAC, Sub-Saharan Africa).

Quarterly reporting will continue as established:

- [Season 2 Funding Request](https://forum.celo.org/t/sustaining-and-expanding-minipay-as-celo-s-global-stablecoin-distribution-layer/)
- [Q4 2025](https://forum.celo.org/t/minipay-update-q4-2025/)
- [Q3 2025](https://forum.celo.org/t/minipay-update-q3-2025/)
- [Q2 2025](https://forum.celo.org/t/minipay-update-q2-2025/)
- [Q1 2025](https://forum.celo.org/t/minipay-update-q1-2025)

## Background — Technical Mechanism

The `CeloUnreleasedTreasury` contract holds unreleased CELO tokens and exposes a `release(address to, uint256 amount)` function restricted to the `EpochManager` via the `onlyEpochManager` modifier. Since governance cannot directly call `release()`, a temporary registry swap is required to authorize the transfer.

The contract's internal accounting (`remainingBalanceToRelease`) matches the actual balance (~287.7M CELO), so no storage correction is needed — the `release()` call will succeed as-is.

This is the same registry swap pattern used in [CGP-0207](https://github.com/celo-org/governance/blob/main/CGPs/cgp-0207.md), with a different amount and recipient.

### Current On-Chain State

| Field | Value |
| ------------------------- | -------------------------------------------- |
| Proxy address | `0x7A8c7a833565fc428cdFBa20FE03fAfb178A434f` |
| remainingBalanceToRelease | ~287,713,538 CELO |
| Actual balance | ~287,713,538 CELO |
| EpochManager (registry) | `0xF424B5e85B290b66aC20f8A9EAB75E25a526725E` |
| Governance | `0xD533Ca259b330c7A88f74E000a3FaEa2d63B7972` |

## Proposed Changes

This proposal executes 3 transactions atomically:

### Transaction 1: Temporarily set Governance as EpochManager

- **Destination**: `Registry.setAddressFor`
- **Data**: Sets `EpochManager` registry entry to the Governance contract (`0xD533Ca259b330c7A88f74E000a3FaEa2d63B7972`)
- **Value**: 0
- **Effect**: Allows the Governance contract (executing this proposal) to pass the `onlyEpochManager` check

### Transaction 2: Transfer 160,000,000 CELO

- **Destination**: `CeloUnreleasedTreasury.release`
- **Data**: Calls `release(0xF2eb5933F4585625157Fa8624a9AB91152aBD751, 160000000000000000000000000)`
- **Value**: 0

### Transaction 3: Restore EpochManager in Registry

- **Destination**: `Registry.setAddressFor`
- **Data**: Restores `EpochManager` to `0xF424B5e85B290b66aC20f8A9EAB75E25a526725E`
- **Value**: 0

### Json Script

See [mainnet.json](cgp-0232/mainnet.json).

## Verification

Verify the proposal transactions:

```bash
celocli governance:show --proposalID <PROPOSAL_ID> --jsonTransactions cgp-0232-proposal.json --node https://forno.celo.org
```

Verify the EpochManager address is correctly restored after execution:

```bash
cast call 0x000000000000000000000000000000000000ce10 "getAddressForStringOrDie(string)(address)" "EpochManager" --rpc-url https://forno.celo.org
# Should return 0xF424B5e85B290b66aC20f8A9EAB75E25a526725E
```

Verify the treasury accounting is consistent:

```bash
cast call 0x7A8c7a833565fc428cdFBa20FE03fAfb178A434f "getRemainingBalanceToRelease()(uint256)" --rpc-url https://forno.celo.org
# Should be ~127.7M CELO (287.7M - 160M)
```

## Risks

- **Registry swap window**: Between transactions 1 and 3, the Governance contract is registered as `EpochManager`. Any contract querying the registry for `EpochManager` during this window would get the Governance address. Since all transactions execute atomically within a single governance execution, there is no window for external exploitation.
- **Balance sufficiency**: The treasury currently holds ~287.7M CELO with matching `remainingBalanceToRelease`. The 160M transfer is well within bounds.
- **Post-execution accounting**: After execution, `remainingBalanceToRelease` will equal ~127.7M CELO. Future `release()` calls by EpochManager will continue to work correctly.
- **Governance concentration**: Opera's CELO holdings could give significant governance weight. This is mitigated by the agreed cap of 10% of total staked CELO for governance voting, with the exception of protocol emergencies.

## Useful Links

- [Forum Discussion](https://forum.celo.org/t/celos-next-chapter-opera-proposal-to-transition-from-distribution-partner-to-network-stakeholder/13124)
- [CeloUnreleasedTreasury Contract](https://github.com/celo-org/celo-monorepo/blob/master/packages/protocol/contracts-0.8/common/CeloUnreleasedTreasury.sol)
29 changes: 29 additions & 0 deletions CGPs/cgp-0232/mainnet.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
[
{
"contract": "Registry",
"address": "0x000000000000000000000000000000000000ce10",
"function": "setAddressFor",
"args": ["EpochManager", "0xD533Ca259b330c7A88f74E000a3FaEa2d63B7972"],
"value": "0",
"description": "Temporarily set Governance as EpochManager in Registry"
},
{
"contract": "CeloUnreleasedTreasury",
"address": "0x7A8c7a833565fc428cdFBa20FE03fAfb178A434f",
"function": "release",
"args": [
"0xF2eb5933F4585625157Fa8624a9AB91152aBD751",
"160000000000000000000000000"
],
"value": "0",
"description": "Transfer 160,000,000 CELO to Opera Safe (0xF2eb5933F4585625157Fa8624a9AB91152aBD751)"
},
{
"contract": "Registry",
"address": "0x000000000000000000000000000000000000ce10",
"function": "setAddressFor",
"args": ["EpochManager", "0xF424B5e85B290b66aC20f8A9EAB75E25a526725E"],
"value": "0",
"description": "Restore EpochManager in Registry to original address"
}
]
Loading