seizeWithMemo, then decide what happens to them. This guide seizes to the issuer’s treasury and cancels the units with burnWithMemo. The same first step also covers freeze-and-reissue: seize, then transfer from the treasury to a new address.
Real-world asset (RWA) tokenization is one of many use cases for the B20 Asset standard. The examples on this page use a stock token for illustration; the same flows apply to other asset types.Tokenized securities examples shown for illustration. Base is a general-purpose blockchain; issuance and compliance are the responsibility of the issuer under applicable law.
Demo
New to B20? See the B20 Token Standard for the concepts and a full launch walkthrough. These samples target
base-std@1505323, viem@2.55.11, and Base Foundry v1.1.1.Before You Start
You need all of the following:- A B20 Asset you administer, with
DEFAULT_ADMIN_ROLEso you can grant roles and attach policies. - An account that will call
seizeWithMemoandburnWithMemo. Grant itSEIZE_ROLEandBURN_ROLE. The Create an Asset Token walkthrough grants roles in the factory call; add these two if you did not. - A blocklist policy in the Policy Registry with the holder on it. If you gate eligibility with an allowlist, as in Restrict Eligible Holders, removing the holder from that allowlist freezes their transfers but does not make them seizable. Seize reads its own scope.
SEIZEandBURNnot paused. PausingTRANSFERorMINTleaves seize live.
Because the holder check is inverted, attach a blocklist to
SEIZE_EXEMPT_POLICY. Accounts on the list are unauthorized and therefore seizable; every other holder stays exempt. Never attach an allowlist or ALWAYS_BLOCK to this scope: an empty allowlist authorizes nobody, so every holder would be seizable.
Seize, Cancel, and Verify
Grant the roles once per token:Grant SEIZE_ROLE and BURN_ROLE
Transfer(holder, treasury, amount), Memo(caller, memo), and Seized(caller, holder, treasury, amount). totalSupply is unchanged at this point. The burn then emits Transfer(treasury, address(0), amount) and Memo, and totalSupply falls. Using the same memo on both calls lets reconciliation tie the two steps to one case.
burnWithMemo burns the caller’s own balance, so the account that seized must also be the destination, or you transfer from the treasury to the burner first. Recipients of a later reissue must pass TRANSFER_RECEIVER_POLICY like any other transfer.
To announce the cancellation to holders and indexers, wrap the burnWithMemo in announce; see Announce a Change to Holders.
Seized appears on the first transaction and the holder balance falls by 100 EXM. After the burn, totalSupply also falls by 100 EXM.Common Errors
These errors follow the orderseizeWithMemo checks them, then the burn.
A balance already sitting at the token’s own address can still be recovered:
seizeWithMemo(address(token), treasury, amount, memo) is allowed. Seizing to the token’s address is not.
See Also
Restrict Eligible Holders
Gate who can hold with policies.
Announce a Change to Holders
Disclose a treasury burn or other holder-impacting action.