gitstock
tokens / SGOV

SGOVETF

iShares 0-3 Month Treasury Bond • Robinhood Token

$100.67
live · ▲ +0.00% 24h · feed 12h ago · US market closed
Contract
0x92FD66527192E3e61d4DDd13322Aa222DE86F9B5 explorer ↗
Price feed
0xa0DF4ee0fFf975306345875E3548Fcc519577A11 explorer ↗ · +1 alt proxy
Holders
98
Pool TVL
$202 across 2 pools · main USDG/SGOV (v3)
Dependents
none found — no third-party token pairs against SGOV yet
Multiplier
1.000958 (uiMultiplier · price = stock × this)
✓ Canonical · factory-verified✓ Chainlink feed · proxy confirmed98 holdersTVL $202

Price

Pools

PoolPairDEXTVL
0xFfb376Bf…dBc4f1USDG/SGOVv3$202

+1 more pool with dust liquidity (<$1).

README

SGOV wraps the iShares 0-3 Month Treasury Bond ETF — short T-bill exposure. BeaconProxy (ERC-20, 18 decimals) on the shared Stock implementation.

It's the clearest multiplier-drift example on gitstock: as the fund accrues yield, uiMultiplier() climbs above 1.0, so the feed price sits above the plain NAV. That's total-return tracking, not a bug. Feed: “Robinhood SGOV-USD”.

Integrated SGOV? Hit a quirk these notes miss?Add a field note →

Read the price

// Read SGOV correctly on Robinhood Chain (chain 4663). ethers v6.import { ethers } from "ethers";
const provider = new ethers.JsonRpcProvider(RPC);
const feed = new ethers.Contract(
  "0xa0DF4ee0fFf975306345875E3548Fcc519577A11",
  ["function latestRoundData() view returns (uint80,int256,uint256,uint256,uint80)",
   "function decimals() view returns (uint8)"],
  provider
);

// price = stock × uiMultiplier already — do NOT multiply again
const dec = await feed.decimals();
const rd  = await feed.latestRoundData();
const priceUSD = Number(ethers.formatUnits(rd.answer, dec));

// the real guard: reject a stale answer (feed is 24/5, market-aware)
const now = (await provider.getBlock("latest")).timestamp;
const stale = Number(now) - Number(rd.updatedAt) > 6*3600;
// NOTE: do NOT gate on the L2 sequencer feed — it's hardwired to 'down' here.

Or just fetch the record

No RPC, no ABIs, no guard logic — gitstock already resolved and guarded everything.

// No RPC or ABIs needed — fetch the whole resolved record.
const r = await fetch("https://gitstock.io/SGOV/stock.json");
const s = await r.json();

s.price.usd     // live price (already stock × multiplier)
s.holders       // holder count
s.tvlUsd        // pool TVL in USD
s.dependents    // tokens paired against SGOV
s.feed.proxy    // the Chainlink proxy gitstock reads
s.fieldNotes     // the quirks that break integrations

Field notes — what the docs don't tell you

SGOV's multiplier has already drifted

uiMultiplier() reads 1.000958 — the feed price sits about 0.10% above the headline quote. That's total-return tracking (dividends/yield reinvested through the multiplier), not a feed error. Expected for a yield-bearing ETF wrapper like this one.

SGOV has a primary and a secondary feed proxy

Chainlink registers two proxies for this feed, both resolving to the same aggregator with identical data. gitstock publishes Chainlink's canonical primary (proxyAddress) as feedProxy and keeps the secondary under feedProxyAlt. Either reads correctly — use the primary.

The price feed is not on the token

The Stock token carries no price and no feed pointer on-chain — no latestRoundData(), no priceFeed(). The Chainlink feed is a separate, unlinked contract, and the token→feed mapping isn't published anywhere. gitstock resolves it for you (verified via the token factory's own creation events, not by symbol).

The L2 sequencer gate is hardwired to “down”

Robinhood ships a custom SequencerGate whose source() is currently the zero address — so latestRoundData() returns answer = 1 (down) forever, while the price feeds are healthy. Copy the standard Chainlink pattern require(sequencerUp == 0) and your app will never render a price here. Read the gate for transparency, but don't hard-gate on it yet.

Staleness is the real guard — and it's market-aware

Because the sequencer gate is unusable, freshness on the feed itself is the actual safety check. During US market hours the feed updates every ~17min–1h on deviation; off-hours it slows to a few hours but keeps moving (24/5). A single tight threshold false-flags overnight reads. Weekend-flat is normal, not stale.

Feed price is the TOKEN price, not the stock price

latestRoundData() already returns stock_price × uiMultiplier() — don't apply the multiplier again. Dividends reinvest through the multiplier, so the token tracks total return and drifts above the headline stock price over time. That's why the number here won't match Google Finance.

oraclePaused() is advisory, not enforced

During corporate actions the token oracle is paused. oraclePaused() == true means “price temporarily unavailable”, not zero/error — and it isn't enforced on-chain, so a paused oracle can still return a value. Treat it as a display state; rely on staleness for protection.

Read decimals() on-chain; don't hardcode

Feed answers use the feed's own decimals (8 for these USD feeds). Read decimals() from the proxy every time rather than assuming.

Community notes

No community notes yet — be the first.

SGOV/stock.json — machine-readable record · SGOV/history.json — indexed price series · SGOV/badge.svg — README badge