Skip to content
BaseHub by wbnns Updated

Tokenized Stocks

Tokenized equities on Base are not a bespoke contract family. They are ordinary B20 tokens — Base’s native token standard — configured for a real-world underlying. B20 itself takes no position on what backs a token, so equities are one application of it among several. Product-level questions about the Coinbase offering are answered at coinbase.com/tokenize, not here; this page covers what an integrator has to handle onchain.

From a wallet or indexer’s point of view these behave like any ERC-20. Name, symbol, and icon come from the places you already look, and the standard ERC-20 call and event surface works natively. Two details are specific to B20:

  • Read metadata onchain through name, symbol, decimals, and contractURI — the last being ERC-7572 collection metadata. Logos are also carried in the canonical token list and by the usual market-data aggregators.
  • Watch the B20Created event to pick up new tokens as they appear.

Corporate actions on the underlying share change how much equity one token redeems for. Dividends and splits are the common cases, and both have to reach the holder onchain. B20 handles this with a multiplier: a single value that restates the redemption ratio, so every holder’s position tracks the corporate action without any balance moving.

Say a dividend lands. The multiplier moves to 1.02, and one token now redeems for 1.02 shares. Cash dividends, for the present, get converted into shares of the underlying and expressed the same way, rather than reaching the token holder as cash.

Three calls manage it:

CallWhen to use it
updateUIMultiplierThe normal path. Schedules a change for a future timestamp under ERC-8056, so the market gets advance onchain notice. Use it for routine corporate actions.
updateMultiplierDeprecated, and kept only as an emergency failsafe. Applies at once and discards any scheduled change that was pending.
cancelUIMultiplierUpdateWithdraws a pending scheduled update.

For the arithmetic, the contract exposes helpers rather than making you replicate it. raw is the token-unit balance; scaled is the redeemable share quantity.

FunctionResult
scaledBalanceOf(account)Raw balance × multiplier
toScaledBalance(raw)Raw amount converted to scaled
toRawBalance(scaled)Scaled amount converted to raw

Where an asset carries regulatory obligations, the issuer can attach policies — allowlists and blocklists that decide, per transfer, whether it proceeds or reverts. To check an account ahead of time, call isAuthorized(policyID, account).

B20 allows individual functions inside a contract to be paused. Triggering one is unlikely, but an integrator that wants a truthful answer to “can this move right now” has to watch pause state rather than assume it.

Sensitive operations are bracketed by onchain disclosure events. announce emits Announcement (id, description, uri), the operation runs, then EndAnnouncement closes the window. Indexing this pair is how you catch corporate actions at the moment they execute. Two properties are worth knowing:

  • The announcement can be bundled atomically with the change it describes — the multiplier update for a split, say — so the onchain record stays coherent.
  • Descriptions are deliberately human-readable onchain, which is what makes them usable for public reporting.

Issuers can attach arbitrary key/value pairs onchain through extraMetadata(key). Securities identifiers such as ISIN and CUSIP are the obvious use.

transferWithMemo and transferFromWithMemo carry a bytes32 reference alongside a single transfer, surfaced as a Memo event. It gives you somewhere to hang an offchain reference for reconciliation and reporting.

Total supply can be bounded by an optional cap, which limits the damage from an operational mistake or a compromised role holder over-minting.

Secondary trading is permissionless — holding and trading require no gating. KYC applies at the edges instead, on the mint and redeem flows, which only Authorized Participants (APs) can perform.

  • Policies can reject specific addresses onchain, sanctioned ones being the clear case, and a blocked transfer reverts. See Policies above.
  • Creating and destroying the underlying shares runs through its own gated flow, open to APs alone.

Whichever source you use, the price resolves from one relationship — the underlying’s market price, restated by the token’s multiplier:

Token Price = Underlying Equity Market Price × Multiplier

Multipliers are read per token and are WAD-scaled, meaning fixed-point with 18 decimals. Divide the onchain value by that scale to recover the real factor; WAD_PRECISION() returns the scale, which is 1e18.

At launch, Chainlink covers the onchain side. Every tokenized equity gets its own feed. It runs 24/5, carries the last close through weekends and holidays, and halts during corporate actions. Each one presents the usual Chainlink V3 aggregator interface, so you read it off the proxy with latestRoundData(), no differently from a crypto feed.

One difference from a standard market-rate feed matters: Coinbase feeds publish Total Return Values rather than bare equity prices, so the figure already accounts for corporate actions. Chainlink applies the same treatment to other tokenized-equity issuers, Ondo and Robinhood among them. The underlying price comes from Chainlink’s traditional equity feeds — the token’s own DEX price is not an input to the oracle.

Two inputs come from Coinbase’s onchain oracle registry: the multiplier, and a pause flag. That registry is one contract, distinct from the tokens themselves, and a single call returns both:

  • paused = false — the feed publishes the underlying price multiplied by the multiplier.
  • paused = true — the feed stops publishing and holds its last good value.

During a corporate action the pieces move separately:

  • Minting and redemption halt offchain. Onchain the token stays unpaused, so transfers continue.
  • The registry pause flag is set, the feed freezes, and its price goes stale.
  • No price discontinuity appears, because the feed is total-return: multiplier and underlying price move opposite each other and cancel. A 10:1 split cuts the price by roughly ten and lifts the multiplier by roughly ten.
  • Resumption waits on Coinbase confirming both halves, the new price and the new multiplier. If only one has landed, the feed holds its pre-pause value instead of publishing something half-applied. That is a deliberate fail-safe.

Read each of the following through latestRoundData() on the proxy address given. Each returns 8 decimals across US equity hours of 24/5, republishing on a 0.5% move or the 24-hour heartbeat. Because the values are total-return, the pause and staleness rules above apply to every one of them.

FeedAddress
Coinbase AAPL0x787f13dEa48Db0897CbCDD985de77809D837F988
Coinbase AMZN0x06A8E4b3aBB3B7543d8396FB2B763d22820cB295
Coinbase COIN0x408e44f504A7371a345F03a73dDC96A4b48e8aa7
Coinbase CRCL0x0231cF2635D1E17bB5c2462cc7504Ba1fBd61f33
Coinbase GOOGL0x5bF49E0ffA937CE2FfF033c739aD7C634c4D34F2
Coinbase INTC0xAB657C39bac0D5886250D70849e2E3E008F2EECB
Coinbase META0x6526aE6797A76123638b863AeE4dD27Ba4E4b27D
Coinbase MSFT0xeB10A6c9aa7E537aEd766C08c35Dae35B321b18c
Coinbase MSTR0xB3cE282CD188b35DA0E38D8Bc7d58e33173D202a
Coinbase NVDA0x04689a41629776563E6822F76f2e57D148d28513
Coinbase SNDK0x388b0dC46C0Fb05A74BeE0994fa5b02c6Fcca2eA
Coinbase SPCX0x6A634B235903C4ad6376892180d6fF8612e3Fa68
Coinbase TSLA0xFaf869185383a24F8cb00e27BdA6b63B9905DCb4

Aggregators such as CoinGecko, CoinMarketCap, and RWA are the offchain route. Each one follows the live market price on whichever DEXs carry the token, which means coverage runs 24/7 while the secondary market stays active. Two patterns are common:

  • Read the token’s market price straight from a provider that already tracks the B20.
  • Read the underlying reference price and apply the multiplier calculation yourself.

For OHLC and time series, either use a market-data provider or walk Chainlink’s round history by roundId.

TickerContract address
Onchain Registry0x3f3E8cf41cdd3b1D118c16471aB0113DfDDd5CaD
AAPLc0xb200000000000000000000C2e324d24d7eEcd1fb
AMZNc0xb200000000000000000000d9192b6B456483C2E8
COINc0xb200000000000000000000c85a31389D71F3ecfb
CRCLc0xB20000000000000000000019f6E7C675b73C2e4D
GOOGLc0xb2000000000000000000002D0BA3164cc74f58B7
INTCc0xB2000000000000000000004AFF16039bA04bdFBc
METAc0xb2000000000000000000008bC8786B856E61707C
MSFTc0xB200000000000000000000Ab99cFa739E253872B
MSTRc0xb2000000000000000000004884b426556b92883d
NVDAc0xb20000000000000000000078ee7ce2fE4908108C
SNDKc0xb200000000000000000000397293Cb8cda9a10c5
SPCXc0xb2000000000000000000007b9fcbd005511aCBd5
TSLAc0xb2000000000000000000001e800a7f5189430cD0