Ondo Short-Term US Government Treasuries
Tokenized LP interest in a Delaware fund of tokenized Treasury and money-market funds (State Street SWEEP, BlackRock BUIDL, Franklin BENJI, Fidelity FYOXX) plus USDC. Eligible holders can mint and redeem against USDC instantly, 24/7.
Control
Who can freeze, mint, pause or upgrade, and what stops them?
A single key can freeze a holder's tokens.
A single key can freeze a holder's tokens.
Multisig signers aren't named, so their independence can't be checked.
A 4-of-7 multisig can replace the contract code with no timelock.
A 3-of-5 multisig can create new tokens with no timelock.
A 2-of-6 multisig can change the onchain price: few signers need to agree.
A 3-of-5 multisig can change the onchain price with no timelock.
A 3-of-5 multisig can move the assets backing the token with no timelock.
A 3-of-5 multisig can grant or revoke every other role with no timelock.
A single key can pause all transfers.
The issuer doesn't document its admin powers; they're only visible onchain.
Audited by Spearbit (2025-03).
- Bug bounty on Immunefi, up to $1,000,000.
- Transfers are limited to allowlisted wallets.
Audits and bug bounty
- Spearbit · Ondo Funds and USDY (Ethereum)1 Mar 2025
Bug bounty on Immunefi, up to $1,000,000.
Chains and bridges
Holders on a bridged chain also depend on the bridge.
- ethereum, polygon, solana, xrplIssued natively · Ondo
Who controls OUSG on Ethereum
Token and service contracts on the left, the accounts holding their powers on the right. Edge color is the risk status of that power.
RWAOracleExternalComparisonCheck
Service · verified
0x0502…6abe
OUSG token
CashKYCSenderReceiver · EIP1967 proxy
0x1B19…ee92
OndoIDRegistryView
Service · verified
0x56A5…63e7
OUSG_InstantManager
Service · verified
0x9335…643a
OndoTokenRouter
Service · verified
0x99B8…D7bC
OndoOracle
Service · verified
0x9Cad…4094
OUSGOracleWrapper
Service · verified
0xADC4…cDf3
OndoIDRegistry
Service · verified
0xcf69…97df
ProxyAdmin
0xBA80…F6d5
Ondo token admin Safe
Safe 4/7
0xAEd4…8367
- ├ 0x74a4…173D
- ├ 0x189D…7607
- ├ 0x5970…9893
- └ +4 more signers
ProxyAdmin
0x988D…07fF
Ondo oracle and registry Safe
Safe 3/5
0x5AE2…78eF
- ├ 0x6264…172B
- ├ 0x60F0…FB02
- ├ 0x4048…DbB4
- └ +2 more signers
OUSG price setter Safe
Safe 3/6
0x682d…20C4
- ├ 0xe2Cb…5cAE
- ├ 0xD16E…D579
- ├ 0x8196…1d15
- └ +3 more signers
OUSG price setter Safe (shares all 6 owners with 0x682d…20c4)
Safe 2/6
0xeAEf…BeFE
- ├ 0xe2Cb…5cAE
- ├ 0x5841…1504
- ├ 0x8196…1d15
- └ +3 more signers
OUSG price setter Safe
Safe 3/5
0x1189…9452
- ├ 0x736D…be1b
- ├ 0x60F0…FB02
- ├ 0x2373…50c2
- └ +2 more signers
OUSG registrar key (rwaRole in OndoIDRegistry)
EOA
0x059b…61a9
Ondo pauser Safe
Safe 1/9
0x2e55…A2CC
- ├ 0x7D72…C8d2
- ├ 0x74a4…173D
- ├ 0x7565…580b
- └ +6 more signers
Powers
Every privileged power we found, normalized to canonical power types.
- UpgradeCriticalYellowProxyAdmin0xBA80…F6d5
→ Safe 4/7
No delay · via
Proxy upgrade · eip1967 admin - UpgradeCriticalYellowProxyAdmin0x988D…07fF
→ Safe 3/5
No delay · via
Proxy upgrade · eip1967 admin - MintCriticalYellowOUSG InstantManagerOUSG_InstantManager0x9335…643a
→ Safe 3/5
No delay · via
CashKYCSenderReceiver.mint · onlyRole(MINTER_ROLE) - MintCriticalYellowOndo token admin SafeSafe 4/70xAEd4…8367
No delay · via
CashKYCSenderReceiver.mint · onlyRole(MINTER_ROLE) - MintCriticalYellowOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OUSG_InstantManager.setAdminSubscriptionChecker · onlyRole(DEFAULT_ADMIN_ROLE) - MintCriticalYellowOUSG price setter SafeSafe 3/60x682d…20C4
No delay · via
OUSG_InstantManager.adminSubscribe · ADMIN_SUBSCRIPTION_ROLE (capped by AdminSubscriptionChecker allowance) - Set priceCriticalYellowOUSG price setter Safe (shares all 6 owners with 0x682d…20c4)Safe 2/60xeAEf…BeFE
No delay · via
RWAOracleExternalComparisonCheck.setPrice · onlyRole(SETTER_ROLE) - Set priceCriticalYellowOUSG price setter SafeSafe 3/50x1189…9452
No delay · via
RWAOracleExternalComparisonCheck.setPrice · onlyRole(SETTER_ROLE) - Set priceCriticalYellowOUSG price setter SafeSafe 3/60x682d…20C4
No delay · via
RWAOracleExternalComparisonCheck.setPrice · onlyRole(SETTER_ROLE) - Set priceCriticalYellowOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OUSG_InstantManager.setMinimumRwaPrice · onlyRole(CONFIGURER_ROLE) - Set priceCriticalYellowOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OUSG_InstantManager.setOndoOracle · onlyRole(DEFAULT_ADMIN_ROLE) - Set priceCriticalYellowOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OndoTokenRouter.setMinimumTokenPriceAndOracle · onlyRole(DEFAULT_ADMIN_ROLE) - Set priceCriticalYellowOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OndoOracle.setHardcodedPrice · onlyRole(HARDCODED_SETTER_ROLE) - Set priceCriticalYellowOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OndoOracle.setTokenToAggregatorV3Oracle · onlyRole(AGGREGATOR_V3_ORACLE_SETTER_ROLE) - Set priceCriticalYellowOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OndoOracle.setTokenToOracleType · onlyRole(DEFAULT_ADMIN_ROLE) - Set priceCriticalYellowOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OndoOracle.setTokenToRWAOracle · onlyRole(RWA_ORACLE_SETTER_ROLE) - Set priceCriticalYellowOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OUSGOracleWrapper.setRwaOracle · onlyOwner (owner()) - Allocate fundsCriticalYellowOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OUSG_InstantManager.retrieveTokens, setOndoTokenRouter · onlyRole(DEFAULT_ADMIN_ROLE) - Allocate fundsCriticalYellowOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OndoTokenRouter.setDepositTokenRecipient, setUserWithdrawTokenSources, setWithdrawTokenSources · onlyRole(DEFAULT_ADMIN_ROLE) - Grant rolesCriticalYellowOUSG price setter SafeSafe 3/50x1189…9452
No delay · via
RWAOracleExternalComparisonCheck.grantRole, revokeRole · DEFAULT_ADMIN_ROLE - Grant rolesCriticalYellowOndo token admin SafeSafe 4/70xAEd4…8367
No delay · via
CashKYCSenderReceiver.grantRole, revokeRole · DEFAULT_ADMIN_ROLE - Grant rolesCriticalYellowOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OndoIDRegistryView.grantRole, revokeRole · DEFAULT_ADMIN_ROLE - Grant rolesCriticalYellowOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OUSG_InstantManager.grantRole, revokeRole · DEFAULT_ADMIN_ROLE - Grant rolesCriticalYellowOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OndoTokenRouter.grantRole, revokeRole · DEFAULT_ADMIN_ROLE - Grant rolesCriticalYellowOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OndoOracle.grantRole, revokeRole · DEFAULT_ADMIN_ROLE - Grant rolesCriticalYellowOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OUSGOracleWrapper.transferOwnership · onlyOwner (owner()) - Grant rolesCriticalYellowOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OndoIDRegistry.grantRole, revokeRole · DEFAULT_ADMIN_ROLE - Grant rolesCriticalYellowOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OndoIDRegistry.setRWARole · onlyRole(RWA_ROLE_MANAGER) - FreezeHighRedOUSG registrar key (rwaRole in OndoIDRegistry)EOA0x059b…61a9
None · via
OndoIDRegistry.setUserID, removeUserAddresses · rwaRole(OUSG) or MASTER_CONFIGURER_ROLE - FreezeHighGreenOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OndoIDRegistry.setUserID, removeUserAddresses · rwaRole(OUSG) or MASTER_CONFIGURER_ROLE - FreezeHighGreenOUSG price setter Safe (shares all 6 owners with 0x682d…20c4)Safe 2/60xeAEf…BeFE
No delay · via
OndoIDRegistry.setUserID, removeUserAddresses · rwaRole(OUSG) or MASTER_CONFIGURER_ROLE - PauseHighYellowOndo pauser SafeSafe 1/90x2e55…A2CC
None · via
CashKYCSenderReceiver.pause, unpause · onlyRole(PAUSER_ROLE) - PauseHighYellowOndo pauser SafeSafe 1/90x2e55…A2CC
None · via
OUSG_InstantManager.pauseRedeem, pauseSubscribe · onlyRole(PAUSER_ROLE) - PauseHighGreenOndo token admin SafeSafe 4/70xAEd4…8367
No delay · via
CashKYCSenderReceiver.pause, unpause · onlyRole(PAUSER_ROLE) - PauseHighGreenOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OUSG_InstantManager.unpauseRedeem, unpauseSubscribe · onlyRole(DEFAULT_ADMIN_ROLE) - Set complianceHighGreenOndo token admin SafeSafe 4/70xAEd4…8367
No delay · via
CashKYCSenderReceiver.setKYCRegistry, setKYCRequirementGroup · onlyRole(KYC_CONFIGURER_ROLE) - Set complianceHighGreenOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OndoIDRegistryView.setKYCRequirementGroupToRwaToken, setOndoRegistry · onlyRole(DEFAULT_ADMIN_ROLE) - Set complianceHighGreenOndo oracle and registry SafeSafe 3/50x5AE2…78eF
No delay · via
OUSG_InstantManager.setAcceptedRedemptionToken, setAcceptedSubscriptionToken, setOndoCompliance +1 more · onlyRole(DEFAULT_ADMIN_ROLE)
| Power | Criticality | Held by | Checks | Status | Found via |
|---|---|---|---|---|---|
| Upgrade | Critical | No delay | Yellow | Proxy upgrade · eip1967 admin | |
| Upgrade | Critical | No delay | Yellow | Proxy upgrade · eip1967 admin | |
| Mint | Critical | No delay | Yellow | CashKYCSenderReceiver.mint · onlyRole(MINTER_ROLE) | |
| Mint | Critical | No delay | Yellow | CashKYCSenderReceiver.mint · onlyRole(MINTER_ROLE) | |
| Mint | Critical | No delay | Yellow | OUSG_InstantManager.setAdminSubscriptionChecker · onlyRole(DEFAULT_ADMIN_ROLE) | |
| Mint | Critical | No delay | Yellow | OUSG_InstantManager.adminSubscribe · ADMIN_SUBSCRIPTION_ROLE (capped by AdminSubscriptionChecker allowance) | |
| Set price | Critical | No delay | Yellow | RWAOracleExternalComparisonCheck.setPrice · onlyRole(SETTER_ROLE) | |
| Set price | Critical | No delay | Yellow | RWAOracleExternalComparisonCheck.setPrice · onlyRole(SETTER_ROLE) | |
| Set price | Critical | No delay | Yellow | RWAOracleExternalComparisonCheck.setPrice · onlyRole(SETTER_ROLE) | |
| Set price | Critical | No delay | Yellow | OUSG_InstantManager.setMinimumRwaPrice · onlyRole(CONFIGURER_ROLE) | |
| Set price | Critical | No delay | Yellow | OUSG_InstantManager.setOndoOracle · onlyRole(DEFAULT_ADMIN_ROLE) | |
| Set price | Critical | No delay | Yellow | OndoTokenRouter.setMinimumTokenPriceAndOracle · onlyRole(DEFAULT_ADMIN_ROLE) | |
| Set price | Critical | No delay | Yellow | OndoOracle.setHardcodedPrice · onlyRole(HARDCODED_SETTER_ROLE) | |
| Set price | Critical | No delay | Yellow | OndoOracle.setTokenToAggregatorV3Oracle · onlyRole(AGGREGATOR_V3_ORACLE_SETTER_ROLE) | |
| Set price | Critical | No delay | Yellow | OndoOracle.setTokenToOracleType · onlyRole(DEFAULT_ADMIN_ROLE) | |
| Set price | Critical | No delay | Yellow | OndoOracle.setTokenToRWAOracle · onlyRole(RWA_ORACLE_SETTER_ROLE) | |
| Set price | Critical | No delay | Yellow | OUSGOracleWrapper.setRwaOracle · onlyOwner (owner()) | |
| Allocate funds | Critical | No delay | Yellow | OUSG_InstantManager.retrieveTokens, setOndoTokenRouter · onlyRole(DEFAULT_ADMIN_ROLE) | |
| Allocate funds | Critical | No delay | Yellow | OndoTokenRouter.setDepositTokenRecipient, setUserWithdrawTokenSources, setWithdrawTokenSources · onlyRole(DEFAULT_ADMIN_ROLE) | |
| Grant roles | Critical | No delay | Yellow | RWAOracleExternalComparisonCheck.grantRole, revokeRole · DEFAULT_ADMIN_ROLE | |
| Grant roles | Critical | No delay | Yellow | CashKYCSenderReceiver.grantRole, revokeRole · DEFAULT_ADMIN_ROLE | |
| Grant roles | Critical | No delay | Yellow | OndoIDRegistryView.grantRole, revokeRole · DEFAULT_ADMIN_ROLE | |
| Grant roles | Critical | No delay | Yellow | OUSG_InstantManager.grantRole, revokeRole · DEFAULT_ADMIN_ROLE | |
| Grant roles | Critical | No delay | Yellow | OndoTokenRouter.grantRole, revokeRole · DEFAULT_ADMIN_ROLE | |
| Grant roles | Critical | No delay | Yellow | OndoOracle.grantRole, revokeRole · DEFAULT_ADMIN_ROLE | |
| Grant roles | Critical | No delay | Yellow | OUSGOracleWrapper.transferOwnership · onlyOwner (owner()) | |
| Grant roles | Critical | No delay | Yellow | OndoIDRegistry.grantRole, revokeRole · DEFAULT_ADMIN_ROLE | |
| Grant roles | Critical | No delay | Yellow | OndoIDRegistry.setRWARole · onlyRole(RWA_ROLE_MANAGER) | |
| Freeze | High | None | Red | OndoIDRegistry.setUserID, removeUserAddresses · rwaRole(OUSG) or MASTER_CONFIGURER_ROLE | |
| Freeze | High | No delay | Green | OndoIDRegistry.setUserID, removeUserAddresses · rwaRole(OUSG) or MASTER_CONFIGURER_ROLE | |
| Freeze | High | No delay | Green | OndoIDRegistry.setUserID, removeUserAddresses · rwaRole(OUSG) or MASTER_CONFIGURER_ROLE | |
| Pause | High | None | Yellow | CashKYCSenderReceiver.pause, unpause · onlyRole(PAUSER_ROLE) | |
| Pause | High | None | Yellow | OUSG_InstantManager.pauseRedeem, pauseSubscribe · onlyRole(PAUSER_ROLE) | |
| Pause | High | No delay | Green | CashKYCSenderReceiver.pause, unpause · onlyRole(PAUSER_ROLE) | |
| Pause | High | No delay | Green | OUSG_InstantManager.unpauseRedeem, unpauseSubscribe · onlyRole(DEFAULT_ADMIN_ROLE) | |
| Set compliance | High | No delay | Green | CashKYCSenderReceiver.setKYCRegistry, setKYCRequirementGroup · onlyRole(KYC_CONFIGURER_ROLE) | |
| Set compliance | High | No delay | Green | OndoIDRegistryView.setKYCRequirementGroupToRwaToken, setOndoRegistry · onlyRole(DEFAULT_ADMIN_ROLE) | |
| Set compliance | High | No delay | Green | OUSG_InstantManager.setAcceptedRedemptionToken, setAcceptedSubscriptionToken, setOndoCompliance +1 more · onlyRole(DEFAULT_ADMIN_ROLE) |
For regulated securities, freeze and force-transfer powers are often legally required. Control rates who holds them and what checks exist, not whether they exist. A single key holding a critical power or freeze is red; a multisig with no timelock is yellow.
Discovered at block 26,183,453 · 13 Oct 2026 · tool discovery-0.2.0 · View raw JSON on GitHub ↗