Notes / Findings

Finding (2026-09-20): the Ethena target was USDe's retired minter, and the live minter now scores 65/100/55

Findings2026-09-20Chain: EthereumLinked: Ethena EthenaMinting (retired minter), Ethena EthenaMinting (USDe live minter)

Source: data/finding_2026-09-20-ethena-live-minter.md in the repository, rendered here without changes. Source file

Status: corrected in the scorer (chains/ethereum-l1/scorers.py::score_ethena_minting, commit 042f805) and pushed on-chain 2026-09-20 as a new Ethereum L1 target, index 14 (transaction 0x14b0466ab52a7bf6cab54253cda92c73d52ca1b88957632911d79136b99b7a98, block 11,740,952, read back 65/100/55/100/20/73; the full transaction table is in data/finding_2026-09-20-cross-exposure-convention-and-score-adjustments.md section 9). The old target, index 3, is retired. Found by the unscored-role sweep (data/finding_2026-09-20-unscored-role-sweep.md, section 2), traced and then adversarially re-verified on two public RPCs with a third RPC for event logs. No transaction, key or repository edit was used by the verification.

1. What was wrong#

score_ethena_minting scored 0x2CC440b721d2CaFd6D64908D6d8C4aCC57F8Afc3 as "USDe's minting authority" and concluded that a 5-of-10 Safe controls minting directly with no delay (55/100/0/100/20/52). That reading was correct for that contract and irrelevant to USDe:

The oracle contract has no removal function, so the old target is retired by ceasing to refresh it (see section 9 of the cross-exposure finding for what its on-chain entry does until it goes stale).

2. The live minter's verified authority#

EthenaMinting 0xe3490297...b62D3: deployed 2024-06-21 (block 20,142,841), not a proxy (Sourcify isProxy false, EIP-1967 implementation slot empty), Sourcify exact match (solc 0.8.20, 25 sources). Single-admin AccessControl.

What the first trace got wrong, kept as a record. The first draft of this trace said three collateral assets (USDC, USDT, DAI) and about 62M USD held. The verification pass corrected both: seven active assets (the constructor set plus USDtb, PYUSD, USDm and USDG added in blocks 21,418,032, 23,397,891, 24,989,129 and 25,066,153, all before the admin moved to the timelock) and about 93.1M USD (the earlier figure omitted USDtb). It also added the Safe guard, which the first draft did not know about. The scorer's notes already carry the corrected figures.

3. The score#

65/100/55/100/20, composite 73, target 0xe3490297...b62D3, root group ethena-safe-0x3b0aaf6e. Same convention as score_usdtb_psm(), which uses the same Safe and the same timelock.

FieldValueWhy
adminKey65The convention's test is "redirect-class setters genuinely delayed", re-verified three ways (isWhitelisted, event replay, simulation). Drops to 30 if any redirect-class selector or USDe.setMinter becomes whitelisted, and reverts to 55 if the Safe is DEFAULT_ADMIN directly again.
multisig100min(5*15 + 5*5, 100), 5-of-10, 10 bare-EOA owners. The guard does not move it, it is already at the cap.
timelock55Real 24h delay (getMinDelay 86400 on both RPCs), capped by the three disclosed instant lanes, and the same Safe is the only canceller.
oracle100No price-report authority applies.
cross20Same root group as USDtb PSM and the three Ethena LayerZero OFTAdapters, 4 other tracked L1 targets, so 100 - 4*20. Unchanged from the retired target.
composite73floor(0.4*65 + 0.3*100 + 0.3*55 + 0.5). The retired target read 52.

Any unread or inconsistent guard (USDe.minter(), admin holders, timelock delay or proposer, the Safe, the whitelist reads) degrades to 20/20/0 rather than keeping a confident number.

Why 65/55 and not a harsher reading. The instant path to move about 93M USD is real, and a harsher reading of it is defensible: adminKey 55 to 60, which with the same other fields gives a composite of 69 to 71 (computed, not pushed). 65 was kept because (1) the convention's own test, that every fund-redirect and unbacked-mint selector is delayed, passes and nothing found refutes it; (2) the instant sweep can only reach one of 5 already-registered custodians, and adding a custodian is delayed; and (3) it is the same convention as score_usdtb_psm(), which sits behind the same Safe and timelock, and nothing about this contract differs in the way the convention tests. The instant sweep is disclosed in the scorer notes next to the score rather than folded into it, the same treatment Aave's guardian and Compound's pause guardian get.

4. What is NOT settled#

Not an audit, not investment advice. All notes · Back to the dashboard.