Gas fees paid in USA₮ are stuck in FeeHandler today. CGP-0240 registered the USA₮ and XAU₮0 fee currency adapters in FeeHandler. It should have registered the underlying tokens. The adapters are the right entries for FeeCurrencyDirectory (gas payment), but when gas is paid the adapter credits the underlying token to FeeHandler. FeeHandler.distribute(token) reads balanceOf and then calls transfer on the registered address, and the adapters have no transfer. Result at block 80,180,727:
FeeHandler holds 38.403690 USA₮ (0xD2ab…F771), growing with every USA₮ gas payment. XAU₮0 balance is 0 so far.distribute(USA₮) reverts Token needs to be active (underlying never added).distribute(USA₮ adapter) reverts (adapter balanceOf returns the scaled balance, then transfer does not exist).distribute(XAU₮0 adapter) and handleAll() only pass because the XAU₮0 balance is 0 and handleAll skips zero amounts.This proposal registers the two underlying tokens and removes the two adapters. Four onlyOwner calls on FeeHandler (owner is Governance), so a full governance vote is required; no contract upgrade, no Tether action. Once executed, anyone calls distribute(USA₮) and the whole accumulated balance is paid out through the normal beneficiary flow. FeeCurrencyDirectory is untouched, so paying gas in USA₮ and XAU₮0 keeps working.
All calls target FeeHandler (0xcD437749E43A154C07F3553504c68fBfD56B8778). Handler is the canonical UniswapFeeHandlerSeller (0xD3ae…0a97) already used for USDC, USDT and WETH (CGP-0196, CGP-0203).
addToken(0xD2ab3C9A02DBBAB236BfEC45D1d755DF4267F771, 0xD3aeE28548Dbb65DF03981f0dC0713BfCBd10a97) — USA₮ underlyingaddToken(0xaf37E8B6C9ED7f6318979f56Fc287d76c30847ff, 0xD3aeE28548Dbb65DF03981f0dC0713BfCBd10a97) — XAU₮0 underlyingremoveToken(0x0357EE22278c922e1D36cFe6b899269b161880C4) — USA₮ adapterremoveToken(0x857BF24e29da0773687E804a743c2E421a394C16) — XAU₮0 adapterValue: 0 for all. Order matters only in that 1–2 run before anyone calls distribute; 3–4 are cleanup.
See mainnet.json.
Current state (block 80,180,727, FeeHandler v1.2.0.0):
RPC=https://forno.celo.org
FH=0xcD437749E43A154C07F3553504c68fBfD56B8778
USAT=0xD2ab3C9A02DBBAB236BfEC45D1d755DF4267F771
cast call $FH "getActiveTokens()(address[])" --rpc-url $RPC
# [... 0x0357EE22…80C4, 0x857BF24e…4C16] (adapters active, underlying absent)
cast call $USAT "balanceOf(address)(uint256)" $FH --rpc-url $RPC
# 38403690 (38.403690 USA₮, 6 decimals)
cast call $FH "distribute(address)" $USAT --rpc-url $RPC
# execution reverted: Token needs to be active
cast call $FH "getBurnFraction()(uint256)" --rpc-url $RPC
# 0 (no selling; handler only has to be non-zero)
After execution: getActiveTokens() lists 0xD2ab…F771 and 0xaf37…47ff and neither adapter. getTokenHandler is 0xD3ae…0a97 for both underlying tokens and 0x0 for both adapters. distribute(USA₮) transfers the full FeeHandler USA₮ balance to the beneficiaries; today that is 100% to 0x7A1E98FC9a008107DbD1f430a05Ace8cf6f3FE19 (cLabs, carbon fraction 0 since CGP-0236).
Fork test: test-cgp-0256.sh forks mainnet with anvil, confirms the reverts above, runs the full propose/dequeue/approve/vote/execute lifecycle on mainnet.json, then shows distribute(USA₮) emits Transfer(FeeHandler → beneficiary, full balance) and leaves FeeHandler at 0 USA₮, distribute(XAU₮0), handleAll() and distributeAll() succeed, FeeCurrencyDirectory entries for both adapters are unchanged, and a second round of USA₮ sent to FeeHandler distributes again. 43 checks, all passing at block 80,180,905.
Note: with burnFraction = 0, handleAll() does not refresh the distributable amount for non-CELO tokens, so the call that actually pays out is distribute(token) (permissionless). This is existing behaviour for cUSD, USDC and the other active tokens.
celocli governance:view --proposalID <ID> -n https://forno.celo.org
Low. Only FeeHandler's token list changes. Gas payment goes through FeeCurrencyDirectory and the adapters, which this proposal does not touch. The two new entries are plain 6-decimal ERC-20s, same pattern as USDC and USDT, so handleAll() keeps working. Removing the adapters drops their stale FeeHandler entries; nothing else references them there.
distribute, _executePayment, addToken, removeToken)