spUSDC
Custom price feed for Spark Savings USDC (spUSDC).
Custom price feed for Spark Savings USDC (spUSDC). spUSDC is an ERC-4626 vault share that accrues value as savings yield accumulates. The price is derived from the vault's current share-to-asset conversion rate multiplied by the NAV's USDC/USD price.
Source: spUSDC_CustomPriceFeed.sol
Approach
spUSDC.convertToAssets(1 spUSDC) × USDC/USD (from the NAV's primary feed)
Spark shipped this savings family twice — pin the vault by address, never by symbol(). A dead earlier generation answers the same symbol() at a different address with totalSupply == 0. An empty ERC-4626 answers convertToAssets at the 1:1 default instead of reverting, so wiring the dead one prices plausibly and wrongly. Note that spETH is 18-decimal in both generations, so decimals alone does not disambiguate it — only the address does.
Price calculation
decimals = spUSDC.decimals() // vault share decimals
rate = spUSDC.convertToAssets(10^decimals) // USDC per 1 spUSDC
price = rate × USDC_USD / 10^assetDecimalsconvertToAssets()
IERC4626(spUSDC)
USDC backing per 1 spUSDC share at the current accrued rate
USDC_USD
NAV base — getPriceDataNoDivergence(USDC) (8 dec)
the NAV's primary USDC/USD price
The divisor is 10^assetDecimals (the underlying's decimals), not the share decimals — they differ whenever a vault uses a decimals offset. Result carries the feed's 8 decimals.
Constructor
vault_
The spUSDC vault address (also used to read vault decimals)
nav_
NAVCalculator (proxy) — supplies the base asset's USD price via getPriceDataNoDivergence
baseAsset_
The registered base asset whose USD price is read (USDC); must equal the vault's asset() — reverts BaseAssetMismatch otherwise
Staleness
The price is stale if the NAV reports the base asset (USDC) stale — all its feeds stale. The base leg's updatedAt comes from the NAV's selected USDC feed. The convertToAssets rate has no heartbeat — it is a live view on the ERC-4626 vault.
Chains
Deployed on Ethereum mainnet only.
Last updated