Overview
Price adapters provide USD-denominated pricing for all assets in the Multiliquid Protocol. Each asset RWA has an associated price adapter that the MultiliquidSwap contract queries during swap calculations. Interface:src/interface/IPriceAdapter.sol
Price Adapter Interface
All price adapters implement a simple, standardized interface:- $1.00 =
1000000000000000000(1e18) - $1.05 =
1050000000000000000(1.05e18) - $0.99 =
990000000000000000(0.99e18)
Adapter Types
ULTRAAdapter
Fetches ULTRA (Delta Wellington Ultra Short Treasury On-Chain Fund) price from ULTRA’s manager contract using the last set mint exchange rate. Location:src/PriceAdapters/ULTRAAdapter.sol
Implementation:
- Reads the mint exchange rate from ULTRA’s manager via
lastSetMintExchangeRate() - The exchange rate is denominated in basis points, so the adapter divides by
BPS_DENOMINATOR()to normalize - Multiplies by
1e18first to produce a WAD-format USD price
- ULTRA Manager contract must be deployed and accessible
lastSetMintExchangeRate()must reflect the current exchange rate
JTRSYAdapter
Fetches JTRSY (Janus Henderson Anemoy Treasury Fund) price from JTRSY’s async vault contract. Location:src/PriceAdapters/JTRSYAdapter.sol
Implementation:
- Reads the share price from JTRSY’s
IAsyncVaultviapricePerShare() - JTRSY uses 6-decimal precision, so the adapter scales by
1e12to produce an 18-decimal WAD price
- JTRSY async vault contract must be deployed and accessible
pricePerShare()must return the current share price in 6-decimal format
USTBAdapter
Fetches USTB (Superstate Short Duration US Government Securities Fund) price from a Chainlink price feed. Location:src/PriceAdapters/USTBAdapter.sol
Implementation:
- Reads the latest price from a Chainlink
AggregatorV3Interfaceprice feed vialatestRoundData() - Chainlink feeds for this asset return prices with 6 decimals, so the adapter scales by
1e12to produce an 18-decimal WAD price - Reverts with
InvalidPrice()if the feed returns a non-positive value, guarding against stale or corrupted data
- A Chainlink-compatible price feed must be deployed and accessible
- The price feed must return a positive
int256answer in 6-decimal format
DollarPeggedAdapter
For RWAs with a NAV pegged to $1 USD (e.g., BENJI, WTGXX). Implementation:- BENJI (Franklin OnChain US Gov Money Fund)
- WTGXX (WisdomTree US Dollar Digital Fund)
- Other RWAs with $1.00 target NAV
- No external dependencies
- Zero gas cost (pure function)
- Deterministic pricing
ThirdPartySetterPriceAdapter
A generic, role-controlled price adapter for assets whose price is set off-chain by an authorized party. Used when no on-chain oracle or direct contract query is available for an asset’s NAV. Location:src/PriceAdapters/ThirdPartySetterPriceAdapter.sol
Implementation:
- An admin grants
PRICE_SETTER_ROLEto one or more authorized addresses - Authorized setters call
setPrice()with a WAD-format USD price (18 decimals) getPrice()returns the most recently set price, reverting withPriceNotSet()if no price has been configured- Emits a
PriceUpdatedevent on every price change for off-chain monitoring
DEFAULT_ADMIN_ROLE: Manages role assignments (grant/revokePRICE_SETTER_ROLE)PRICE_SETTER_ROLE: Authorized to callsetPrice()
- VBILL (VanEck Treasury Fund) — see below
- Any future RWA whose pricing relies on off-chain NAV reporting
VBILLAdapter
VBILL (VanEck Treasury Fund) uses theThirdPartySetterPriceAdapter described above. There is no dedicated VBILLAdapter contract; instead, a ThirdPartySetterPriceAdapter instance is deployed and configured with an authorized price setter that periodically updates the VBILL NAV on-chain.
Characteristics:
- NAV accrues to token (not pegged to $1.00)
- Price is updated off-chain by an authorized
PRICE_SETTER_ROLEaddress - Reverts if queried before the initial price is set
Next: Integration Guide
Learn how to integrate Multiliquid into your application