Ethena UStb token and minting

QuantstampFiles named in the report

Quantstamp reviewed Ethena (Ethena UStb token and minting) on 31 Oct 2024: 5 findings, 0 critical; all acknowledged, none fixed.

No open critical findings
Open the reportOpen Ethena’s security record

Report hosted on certificate.quantstamp.com.

Trustblock does not review code.

Findings5

Statuses are the security firm’s own, from its report.

SeverityOpenAcknowledgedFixed
Critical000
High000
Medium000
Low050
LowConsiderations about EventsAcknowledged

<br> 1. The initial limits of a new asset added to `UStbMinting` (max mint and max redeem limits per block per asset) are not accessible to off-chain observers via events because the event `AssetAdded` has only one field: `AssetAdded(address indexed asset)`. 2. Updates made via the function `setStablesDeltaLimit()` are not logged.

LowDepending on How Nonces Are Calculated Off-Chain, Nonce Verification May Reject Valid NoncesAcknowledged

When orders are submitted to the functions `mint()` and `redeem()`, their field `uint128 nonce` is checked via the function `verifyNonce()`. That function uses the data structure `_orderBitmaps` to check if a sender already used or not a given nonce. In detail, it is a mapping storing for a given address a `uint256` bitmap called `invalidator` at the `uint128` keys called `invalidatorSlot`. However, the following line could lead to an issue: ``` uint128 invalidatorSlot = uint64(nonce) >> 8; ``` Casting `nonce` to `uint64` seems too restrictive. If any value of `uint128 nonce` is valid, it is possible to have two different values of `nonce` that will be stored at the same bit in the data structure `_orderBitmaps`. For instance, the two values: `nonce_a = (1 << 125) + (1 << 60)` and `nonce_b = (1 << 60)`, since any non-matching bit higher than the 64th bit will be ignored because of the cast `uint64(nonce)`. Ultimately, this could prevent valid Orders from being accepted by the contract.

LowMissing Input ValidationsAcknowledged

It is important to validate inputs, even if they only come from trusted addresses, to avoid human error: 1. In `UStb.sol`, function `initialize()`, the address `minterContract` may not be a contract; 2. In `UStb.sol`, function `addBlacklistAddress()`, it is possible to blacklist: <br>- the minter contract and this could temporarily disrupt the mint and redeem operations; <br>- the address with the role `DEFAULT_ADMIN_ROLE`, and this could temporarily disrupt the operation to redistribute locked amounts; 3. In `UStbMinting.sol`, function `verifyOrder() `, the uniqueness and the size of `Order.order_id` is not checked; 4. In `UStbMinting.sol`, function `setUStb() `, the value of `_ustb` is not checked to be: <br>- Different from `address(0x0)`; <br>- Different from existing supported assets; <br>- Different from existing custodian;

LowMissing Storage Gaps in Inherited ContractAcknowledged

The `UStb` and `SingleAdminAccessControlUpgradeable` contracts are designed to be upgradable. Upgradable contracts usually have reserved space to allow future versions to add new state variables to the contract without shifting down storage in the inheritance chain. As `SingleAdminAccessControlUpgradeable` is inherited by `UStb`, adding a storage gap can be done to prevent storage collisions in future updates where storage slots could be added to `SingleAdminAccessControlUpgradeable`. For instance, if in a future update, `SingleAdminAccessControlUpgradeable` is modified to include a new variable, and the `UStb` contract were upgraded to use the new version, this new variable would likely collide with the `transferState` variable in `UStb` (except in the special case where the new variable is given a custom slot).

LowRisks of Supporting Non-Standard ERC-20 TokensAcknowledged

Supporting tokens with specific features such as fees, rebasing, pausable, upgradeable, blacklist-able, or hooks on transfers could negatively impact the main flows of the system (deposits via `mint()`, transfer to custody, redeems via `redeem()`) if no specific mitigation measure is enforced to limit the consequences. For instance, in the function `_transferCollateral()` if `asset` represents an asset where the amount transferred is different than the amount requested to be transferred (ex: if fees are enforced), the actual amount transferred to custodians may differ from the expected transferred amount.

Contracts in scope

No deployed address is recorded for this audit.

The report names a repository or files. Open the report to see its scope.

Repository and files the report names (4)

  • contracts/contracts/SingleAdminAccessControlUpgradeable.sol
  • contracts/contracts/ustb/UStbMinting.sol
  • contracts/contracts/ustb/UStb.sol
  • contracts/contracts/SingleAdminAccessControl.sol

Part of Ethena’s security record

Ethena
Audits14 audits by 6 firmsLast audit Aug 2026, by Guardian Audits.
Critical findingsNo open critical findingsAcross 14 reports.
Open Ethena’s security record

Security firm

Quantstamp

236 projects reviewed · 332 reports · latest Oct 2026

See Quantstamp’s audits

Something wrong on this page? A missing report, a wrong date, a finding that was fixed since. Tell us and we check it against its source.

Tell us