Guardian's review of Celo XAUT0 Upgrade and USAT Deployment for USDT0, published March 2026. The report records 3 findings, including 2 low and 1 informational.
- Published
- Review window
- March 25 to 31, 2026
- Language
- Solidity
- Chains
- Celo
- Sector
- Stablecoins, Cross-chain
- 0 Critical
- 0 High
- 0 Medium
- 2 Low
- 1 Informational
Scope
Findings 3
-
L-01 Low Misleading Modifier Name Best Practices Pending
Description
The
onlyFeeWrappermodifier in CeloExtension.sol:27 permits calls from bothaddress(0)(the VM) and thefeeCurrencyWrapper. The nameonlyFeeWrappersuggests only the fee wrapper is authorized, omitting the fact that the VM (address(0)) is also an allowed caller. Location: CeloExtension.sol:27-30modifier onlyFeeWrapper() { require(msg.sender == address(0) || msg.sender == feeCurrencyWrapper, "Only VM can call"); _; }Recommendation
Rename the modifier to
onlyFeeWrapperOrVM(oronlyVMOrFeeWrapper) to accurately describe both permitted callers. -
L-02 Low Incomplete Error Message Best Practices Pending
Description
The require statement's revert string is
"Only VM can call", but the condition also allowsfeeCurrencyWrapper. If a call reverts, the error message misleads the caller into thinking only the VM is authorized, when in reality the fee currency wrapper is also a valid caller. Location: CeloExtension.sol:28require(msg.sender == address(0) || msg.sender == feeCurrencyWrapper, "Only VM can call");Recommendation
Update the error message to reflect both allowed callers, e.g.:
"Only VM or FeeCurrencyWrapper can call" -
I-01 Informational Potentially Outdated creditGasFees Interface Informational Pending
Description
The
creditGasFeesfunction in CeloExtension.sol:52-72 uses the old 8-parameter signature (with the unusedgatewayFeeRecipientandgatewayFeeAmountparameters). Celo's fee-currency-example repository indicates they are moving to a simplified signature that removes these legacy gateway fee parameters. This comment is ~2 years old, and the timeline for enforcement is unclear. If Celo proceeds with this change at the protocol level, contracts using the old signature may break or become incompatible with the fee currency system. Location: CeloExtension.sol:52-72function creditGasFees( address refundRecipient, address tipRecipient, address , // gateWayFeeRecipient is not used anymore address baseFeeRecipient, uint256 refundAmount, uint256 tipAmount, uint256 , uint256 baseFeeAmount ) external onlyFeeWrapper {Recommendation
Confirm with the Celo team whether and when they plan to enforce the new
creditGasFeessignature at the protocol level. If the migration is imminent, consider adopting the new interface for USDT/USAT now (since these are fresh deployments), while keeping backward compatibility for already-deployed contracts like XAUT0. If the timeline is distant or uncertain, the current approach is acceptable but should be revisited before Celo's migration goes live.
No findings match.
More from USDT0
All 34 reportsPut your code through the same review.
This review started with a conversation about scope. Tell us what you are building and we will plan yours with you.
