B20 data is available once the Beryl upgrade activates on each network:
| Network | Activation |
|---|---|
| Base Sepolia | June 18, 2026 |
| Base Mainnet | June 25, 2026 at 18:00 UTC |
Where B20 data lives
B20 events are decoded into the existingbase.events table (or base_sepolia.events on testnet). Each row uses the same schema as other decoded logs: event_name, event_signature, parameters, address, block_timestamp, and more.
Query B20 activity by filtering on:
event_signature— the canonical event ABI (preferred overevent_namefor performance; put this first inWHEREclauses for best query performance)address— a specific B20 token contract, or the singleton B20 Factory / Policy Registry contract when querying factory or policy-registry events
Indexed event types
B20 token events
These events are emitted by individual B20 token precompiles:| Event | Signature |
|---|---|
| Transfer | Transfer(address,address,uint256) |
| Approval | Approval(address,address,uint256) |
| Memo | Memo(address,bytes32) |
| BurnedBlocked | BurnedBlocked(address,address,uint256) |
| RoleGranted | RoleGranted(bytes32,address,address) |
| RoleRevoked | RoleRevoked(bytes32,address,address) |
| RoleAdminChanged | RoleAdminChanged(bytes32,bytes32,bytes32) |
| LastAdminRenounced | LastAdminRenounced(address) |
| Paused | Paused(address,uint8[]) |
| Unpaused | Unpaused(address,uint8[]) |
| PolicyUpdated | PolicyUpdated(bytes32,uint64,uint64) |
| SupplyCapUpdated | SupplyCapUpdated(address,uint256,uint256) |
| ContractURIUpdated | ContractURIUpdated() |
| NameUpdated | NameUpdated(address,string) |
| SymbolUpdated | SymbolUpdated(address,string) |
| EIP712DomainChanged | EIP712DomainChanged() |
| Event | Signature |
|---|---|
| MultiplierUpdated | MultiplierUpdated(uint256) |
| ExtraMetadataUpdated | ExtraMetadataUpdated(string,string) |
| Announcement | Announcement(address,string,string,string) |
| EndAnnouncement | EndAnnouncement(string) |
B20 Factory events
Token creation events are emitted by the singleton B20 Factory precompile:| Event | Signature |
|---|---|
| B20Created | B20Created(address,uint8,string,string,uint8,bytes) |
Policy Registry events
B20 transfer policies are managed through the Policy Registry precompile at0x8453000000000000000000000000000000000002. Query these events with that address and the matching event_signature:
| Event | Signature |
|---|---|
| PolicyCreated | PolicyCreated(uint64,address,uint8) |
| PolicyAdminStaged | PolicyAdminStaged(uint64,address,address) |
| PolicyAdminUpdated | PolicyAdminUpdated(uint64,address,address) |
| AllowlistUpdated | AllowlistUpdated(uint64,address,bool,address[]) |
| BlocklistUpdated | BlocklistUpdated(uint64,address,bool,address[]) |
Example queries
Recent B20 token transfers
Replace{token_address} with the B20 token you are tracking:
New B20 tokens created
Track deployments from the B20 Factory precompile at0xB20f000000000000000000000000000000000000:
Transfers with payment memos
B20 memo operations emit aMemo event immediately after the primary operation event. Join adjacent logs in the same transaction:
Policy and compliance activity
Monitor when an issuer updates transfer policies on a token:Query tips
Follow the SQL API best practices when querying B20 data:- Filter on indexed columns — use
event_signature,address, andblock_timestampin yourWHEREclause. - Scope to active logs — add
action = 'added'to exclude re-orged events, or aggregate bylog_idif you need re-org-safe totals. - Use network prefixes — query
base_sepolia.eventson testnet andbase.eventson mainnet. - Join memos by log index — memo events follow their parent operation at
log_index + 1within the same transaction and contract (m.address = t.address).
Learn more
- B20 specification — Base docs for the token standard
- Accept B20 payments — match payments to orders with onchain memos
- Schema reference — full
base.eventscolumn definitions - Quickstart — run your first SQL API query