Building with Slate
SlateFeed
One feed per token. Chainlink's interface, Slate's rules.
SlateFeed prices one stock token in USD with 8 decimals. It implements AggregatorV3Interface plus:
function latestQuote() external view returns (Quote memory); // (status, answer, observedAt); never reverts
function latestDetail() external view returns (Quote memory, int256 sharePrice, uint256 multiplier);
function status() external view returns (FeedStatus);
function poke() external returns (bool); // record a staged multiplier change
function token() external view returns (address);
getRoundData reverts with NoHistory(): a Slate feed is a current price, not an archive.
Configuration
Each feed is immutable once deployed:
| Field | Meaning | Testnet value |
|---|---|---|
token |
The stock token | e.g. TSLA 0xC9f9…Bd4E |
model |
ERC8056, REBASING (Robinhood's legacy Arbitrum One tokens) or NONE |
ERC8056 |
source |
Where share prices come from (SignedSource, ChainlinkSource) |
SignedSource |
feedId |
The source's key, e.g. bytes32("TSLA/USD") |
|
maxAge |
Oldest usable price while the market is open | 20 minutes |
corporateActionGrace |
Refusal window after a large multiplier change | 30 minutes |
largeChangeBps |
What counts as large | 500 (5%) |
allowMarketClosed |
Whether latestRoundData() serves MARKET_CLOSED prices |
true |
calendar, session |
Trading calendar and session | USMarketCalendar, EXTENDED |
On Robinhood Chain mainnet, CRWD's feed accepts prices up to 40 minutes old, because the publisher signs it on a 0.5% move or every 30 minutes to keep mainnet gas low.
Models
- ERC8056 (Robinhood Chain): token price = share price × the multiplier in force when the price was observed. See The multiplier problem.
- REBASING (Robinhood's earlier tokens on Arbitrum One):
balanceOfalready includesmultiplier(), so one token is one share-equivalent and the price is the share price. Applying the multiplier here would be the double count. - NONE: a plain ERC-20; one token is one share.
Sources
| Source | Kind | Used for |
|---|---|---|
SignedSource |
RAW_UNDERLYING |
Tokens with no Chainlink feed. See Signed prices |
ChainlinkSource over Robinhood's feeds |
TOTAL_RETURN |
The 35 tokens Chainlink covers on Robinhood Chain |
ChainlinkSource over raw equity feeds |
RAW_UNDERLYING |
Chainlink's 9 raw equity feeds on Arbitrum One |
A Chainlink answer that reverts or is non-positive reads as NO_DATA; it never reaches a caller.
Deploying
SlateFeedFactory.deploy(config, salt) deploys at a CREATE2 address salted by the caller, so nobody can squat your address. deployCalibrated(config, salt, reference, maxDiffBps) deploys and then reverts unless the new feed agrees with an independent reference. This is the deploy-time guard against a source declared with the wrong price kind.