Stock tokens on Base: field notes

Kerne, 13 November 2026. Every chain figure below comes from a read of Base mainnet, most of them at a stated block, and the raw files are linked at the end.

Coinbase tokenized stocks live on Base as B20 tokens. We have been building a covered call vault on TSLAc for Base Stocks Maxxing. Most of what slowed us down was not in the vault. It was in four places where these tokens behave differently from the ERC-20s and price feeds the usual tooling expects. These notes are what we measured, so the next builder can plan for it instead of finding it.

1. The token is a precompile, so a stock fork cannot run it

A B20 token is implemented inside the Base node, not deployed as contract bytecode. Ask for the code at the TSLAc address, 0xb2000000000000000000001e800a7f5189430cD0, and eth_getCode returns a single byte: 0xef. That byte is a marker, not a program.

On a local fork made with stock Foundry, the marker is all there is. A call to the token on anvil 1.5.1 fails with OpcodeNotFound. Inside forge test the same call simply burns all the gas it is given, which looks like an out of gas bug in your own contract until you know. Base ships its own Foundry build, base-anvil, which hosts the precompiles locally, and base-std with the interfaces and reference mocks. Use those when you need the full token.

What worked for us, with stock tools and a public RPC, was an eth_call with a state override. The override swaps the code at chosen addresses for the length of one call. We put a small executor at a real TSLAc holder and at a few unused addresses, put an orchestrator at one more, and sent one read only call. The node ran the real precompile; nothing was signed and the chain did not change. mainnet.base.org, base-rpc.publicnode.com and base.drpc.org all accepted the override and returned identical bytes.

2. What the real token does, and what an approval does not tell you

At block 57048991 we ran a 41 step probe against live TSLAc this way, then wrote a one file mock that has to return the same bytes at every step. A few results worth knowing before you write error handling:

The point that matters most for contract design is in Base's own IB20 reference: approve is not gated by any policy or by pause. Transfers are checked against the sender and receiver policy slots, and transferFrom also checks the caller as executor when the caller is not the owner. So an approval to your vault can succeed while the deposit that spends it would fail. A successful approve tells you nothing about whether the transfer will go through. If your flow approves in one step and pulls in another, handle PolicyForbids and ContractPaused on the pull, and test both. We could not trigger those two paths live, because only the issuer can block or pause, so our mock follows the docs for them and says so.

3. The price feed was silent on 14 of 14 weekends

We read every round of the Coinbase TSLA Chainlink feed (0xFaf869185383a24F8cb00e27BdA6b63B9905DCb4) at Base block 57036280: 1,554 rounds across two aggregator phases, from 3 August to 13 November 2026. The figures here use the current phase only, 1,407 rounds over 99.8 days, so nothing is counted twice.

We ran the same scripts on the Coinbase AAPL feed (0x787f13dEa48Db0897CbCDD985de77809D837F988, block 57042108) and saw the same shape: 14 of 14 weekends silent. This is not a fault in the feed. Base's docs describe these feeds as 24/5, with the value held off hours, and the rounds match that. What the docs do not tell you is what that schedule does to contract logic, so here it is in numbers.

FridayLast round before (UTC)First round after (UTC)Gap hRound after close?Move
08-07Fri 16:49Mon 00:0055.2no+37.5 bps
08-14Fri 18:19Mon 00:0053.7no+17.5 bps
08-21Fri 23:00Mon 00:0049.0yes+51.9 bps
08-28Fri 19:54Mon 00:0052.1no−25.3 bps
09-04Fri 20:02Tue 00:0076.0yes+23.3 bps
09-11Fri 15:47Mon 00:0056.2no−101.2 bps
09-18Fri 19:49Mon 00:0052.2no+23.1 bps
09-25Fri 18:52Mon 00:0053.1no+10.0 bps
10-02Fri 19:55Mon 00:0052.1no+52.1 bps
10-09Fri 16:05Mon 00:0055.9no+16.5 bps
10-16Fri 20:44Mon 00:0051.3yes+123.8 bps
10-23Fri 20:05Mon 00:0051.9yes+39.8 bps
10-30Fri 19:08Mon 01:0053.9no+48.7 bps
11-06Fri 21:42Mon 01:0051.3yes−22.7 bps

What this means in code:

Our own vault sells options only against a round under four hours old, so it cannot open a sale over a weekend, and a Friday evening expiry may not settle until the Monday reopen.

4. A venue withheld the swap button

To run the vault's first epoch with our own funds, we needed about $20 of TSLAc. On 13 November we connected our wallet to the Aerodrome swap page and selected USDC to TSLAc. The page returned a quote, so routing and liquidity were fine. Where the swap button normally sits, it showed a notice headed "Restricted Tokenized Security" pointing to the issuer's information, and the buy field was disabled. With the same wallet, USDC to AERO showed the button as usual.

We do not know whether the notice depends on the visitor's location or applies to everyone, and we are not going to guess. We did not try any other route. We stopped, and ran the epoch on the Base Sepolia testnet instead: the same vault creation code as our mainnet deploy, a substitute token with no value, and a feed that copies the real Chainlink TSLA rounds. Both wallets in that epoch are ours. It is a test of the mechanics, not usage.

The design lesson is plain. Do not assume your users can acquire the asset your contract holds. These tokens are restricted securities, and the issuer's published terms exclude several groups of buyers. A vault, a lending market or an options product on these tokens depends on someone being allowed to buy the underlying, and that is decided outside your contract. Plan your launch, your test runs and your own seed deposit around it, and say clearly in your interface who can and cannot take part.

A short checklist

Sources and raw data

Everything above can be read again from public RPCs. The files are hosted with this page:

One feed and one token, measured as a snapshot. A feed's deviation threshold and schedule can change, and other B20 tokens can carry different policies and decimals. Read the data again before you rely on a number. Not affiliated with Base, Coinbase or Chainlink.