Skip to main content
TLDR:
  • You’ll deploy a Chainstack Base node and install Base’s Foundry build (base-forge).
  • You’ll create a B20 Asset token by calling the B20 factory precompile in a single transaction, with admin, minter, and supply cap set atomically.
  • You’ll mint the initial supply and verify the balance on-chain through your Chainstack endpoint.
  • B20 is an ERC-20 superset, so the result works with any ERC-20 tooling.

Main article

B20 is Base’s native token standard, introduced with the Beryl upgrade. Instead of writing and deploying an ERC-20 contract, you create a token by calling the singleton B20 factory precompile — roles, supply caps, pausing, transfer policies, memos, and permit are built into the chain. This tutorial creates an Asset token, mints its initial supply, and verifies the balance, all through a Chainstack Base node. It supports Base mainnet and Base Sepolia. Start on Base Sepolia to test the full flow without risking real funds, then use the same factory call on mainnet.

Prerequisites

  • A Chainstack account and a Base node for your target network — see deploy a node. Copy the node’s HTTPS endpoint from its access and credentials.
  • Base’s Foundry build (base-forge, base-cast). Standard forge can’t simulate the B20 precompiles locally and aborts with call to non-contract address.
  • ETH for gas on your target network. For Base Sepolia, see Base network faucets.

Step 1. Install Base’s Foundry build

base-forge installs alongside standard Foundry without overwriting it. Use base-forge and base-cast for the commands below.

Step 2. Set up the project

Add the remappings and the base = true flag to foundry.toml, under [profile.default]. The base = true flag tells base-forge to run the B20 precompiles inside its local EVM, so the deploy script can simulate the factory call:

Step 3. Choose a network

Create a .env file in the project directory with the Chainstack endpoint for your target network:
Mainnet transactions spend real ETH and create permanent state. Verify the token name, symbol, admin, roles, supply cap, and salt before broadcasting.
Confirm the node is reachable and the account is funded:
The command prints a non-zero balance. This account signs the deploy and the mint, and receives the minted supply.

Step 4. Verify B20 activation

B20 token creation is gated by the Activation Registry at runtime. Check the Asset feature on the selected network before broadcasting:
For the Stablecoin variant, check base.b20_stablecoin instead. A false result means a factory call for that variant will revert with FeatureNotActivated.

Step 5. Write the create script

The factory’s single entry point is createB20(variant, salt, params, initCalls). Use B20FactoryLib to encode params and initCalls in the canonical form the precompile expects. Create script/CreateToken.s.sol:
Asset decimals are fixed at creation and must be in [6, 18]. The supply cap is optional; the no-cap sentinel is type(uint128).max.
Use the STABLECOIN variant and its params encoder. A stablecoin fixes decimals at 6 and carries an immutable ISO currency code (uppercase AZ):
Roles, supply cap, minting, and verification work identically.

Step 6. Deploy through your Chainstack node

On success the script logs the new token’s address, which starts 0xB200…:
Save the address for the next step:

Step 7. Mint and verify

Minting requires MINT_ROLE, which initCalls granted to your account:
The token holds minted supply on-chain. Search $TOKEN_ADDRESS on basescan.org for mainnet or sepolia.basescan.org for Base Sepolia.

Alternative: deploy directly with cast

Because your Chainstack Base node runs the B20 precompiles, you can create a basic token without base-forge — standard Foundry’s cast is enough, since the factory call executes on the node rather than in a local simulation:
Predict the token’s address with a read call (no gas):
The cast path creates a minimal token (no roles or supply cap). To configure roles, the supply cap, and policies atomically at creation, use the base-forge script above with B20FactoryLib, which also guarantees the canonical encoding the precompile requires.

What you built

In this tutorial you:
  • Created a B20 Asset token with a single createB20 call through your Chainstack Base node
  • Configured its admin, minter, and supply cap atomically with initCalls
  • Minted supply and verified the balance on-chain
You did all of this without writing, deploying, or auditing a token contract.

Next steps

  • Learn the full standard in Base B20 token standard.
  • Gate transfers or mints with policy registry allowlists and blocklists, add granular pause, or issue a stablecoin variant. See the B20 specification.
Last modified on July 9, 2026