> ## Documentation Index
> Fetch the complete documentation index at: https://base-a060aa97-roethke-b20-upgrade-pages.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# IB20 Reference

> Generated B20 reference for IB20 functions, events, and errors.

## Functions

| Function | Selector | Summary |
| - | - | - |
| [`DEFAULT_ADMIN_ROLE`](/specifications/b20/reference/interfaces/ib20/default-admin-role) | `0xa217fddf` | The default top-level admin role (`bytes32(0)`). Required to call `grantRole`, `revokeRole`, |
| [`MINT_ROLE`](/specifications/b20/reference/interfaces/ib20/mint-role) | `0xe9a9c850` | Required to call `mint` and `mintWithMemo`. |
| [`BURN_ROLE`](/specifications/b20/reference/interfaces/ib20/burn-role) | `0xb930908f` | Required to call `burn` and `burnWithMemo`. |
| [`BURN_BLOCKED_ROLE`](/specifications/b20/reference/interfaces/ib20/burn-blocked-role) | `0x32ad9be8` | Required to call the deprecated `burnBlocked` (retained for |
| [`SEIZE_ROLE`](/specifications/b20/reference/interfaces/ib20/seize-role) | `0x3c7e9ba5` | Required to call `seizeWithMemo`. |
| [`PAUSE_ROLE`](/specifications/b20/reference/interfaces/ib20/pause-role) | `0x389ed267` | Required to call `pause`. |
| [`UNPAUSE_ROLE`](/specifications/b20/reference/interfaces/ib20/unpause-role) | `0x309756fb` | Required to call `unpause`. |
| [`METADATA_ROLE`](/specifications/b20/reference/interfaces/ib20/metadata-role) | `0x38841782` | Required to call `updateName`, `updateSymbol`, and `updateContractURI`. |
| [`TRANSFER_SENDER_POLICY`](/specifications/b20/reference/interfaces/ib20/transfer-sender-policy) | `0xd116fc21` | Policy slot consulted against `from` on every transfer (including `transferFrom`). |
| [`TRANSFER_RECEIVER_POLICY`](/specifications/b20/reference/interfaces/ib20/transfer-receiver-policy) | `0x210f521b` | Policy slot consulted against `to` on every transfer. |
| [`TRANSFER_EXECUTOR_POLICY`](/specifications/b20/reference/interfaces/ib20/transfer-executor-policy) | `0x724e9c53` | Policy slot consulted against `msg.sender` on `transferFrom` when distinct from `from`. |
| [`MINT_RECEIVER_POLICY`](/specifications/b20/reference/interfaces/ib20/mint-receiver-policy) | `0x6e5b013d` | Policy slot consulted against `to` on every mint. |
| [`SEIZE_EXEMPT_POLICY`](/specifications/b20/reference/interfaces/ib20/seize-exempt-policy) | `0xfeb346ec` | Policy slot consulted against `from` by `seizeWithMemo`. |
| [`SEIZE_RECEIVER_POLICY`](/specifications/b20/reference/interfaces/ib20/seize-receiver-policy) | `0xb31da27f` | Policy slot consulted against `to` by `seizeWithMemo`. |
| [`name`](/specifications/b20/reference/interfaces/ib20/name) | `0x06fdde03` | Token name. Set at creation, mutable via `updateName`. |
| [`symbol`](/specifications/b20/reference/interfaces/ib20/symbol) | `0x95d89b41` | Token symbol. Set at creation, mutable via `updateSymbol`. |
| [`decimals`](/specifications/b20/reference/interfaces/ib20/decimals) | `0x313ce567` | Number of decimal places. Immutable per token variant. |
| [`totalSupply`](/specifications/b20/reference/interfaces/ib20/total-supply) | `0x18160ddd` | Total token supply currently in circulation. |
| [`balanceOf`](/specifications/b20/reference/interfaces/ib20/balance-of) | `0x70a08231` | Balance of `account`. |
| [`allowance`](/specifications/b20/reference/interfaces/ib20/allowance) | `0xdd62ed3e` | Allowance granted by `owner` to `spender`. |
| [`transfer`](/specifications/b20/reference/interfaces/ib20/transfer) | `0xa9059cbb` | Transfers `amount` from `msg.sender` to `to`. Emits `Transfer`. |
| [`transferFrom`](/specifications/b20/reference/interfaces/ib20/transfer-from) | `0x23b872dd` | Transfers `amount` from `from` to `to` using `msg.sender`'s allowance. Emits `Transfer`. |
| [`approve`](/specifications/b20/reference/interfaces/ib20/approve) | `0x095ea7b3` | Sets `spender`'s allowance to `amount`. Not gated by any policy or by pause. Emits `Approval`. |
| [`updateName`](/specifications/b20/reference/interfaces/ib20/update-name) | `0x84da92a7` | Updates the token's `name`. Emits `NameUpdated` followed by `EIP712DomainChanged`. |
| [`updateSymbol`](/specifications/b20/reference/interfaces/ib20/update-symbol) | `0x537f5312` | Updates the token's `symbol`. Emits `SymbolUpdated`. |
| [`transferWithMemo`](/specifications/b20/reference/interfaces/ib20/transfer-with-memo) | `0x95777d59` | Same as `transfer`, plus emits `Memo` immediately after the standard `Transfer` event. |
| [`transferFromWithMemo`](/specifications/b20/reference/interfaces/ib20/transfer-from-with-memo) | `0x929c2539` | Same as `transferFrom`, plus emits `Memo` immediately after the standard `Transfer` event. |
| [`mint`](/specifications/b20/reference/interfaces/ib20/mint) | `0x40c10f19` | Mints `amount` to `to`. Emits `Transfer(address(0), to, amount)`. |
| [`mintWithMemo`](/specifications/b20/reference/interfaces/ib20/mint-with-memo) | `0xe44f0b12` | Same as `mint`, plus emits `Memo` immediately after the standard `Transfer` event. |
| [`burn`](/specifications/b20/reference/interfaces/ib20/burn) | `0x42966c68` | Burns `amount` from the caller's own balance. Not subject to any policy. |
| [`burnWithMemo`](/specifications/b20/reference/interfaces/ib20/burn-with-memo) | `0x38f23b0b` | Same as `burn`, plus emits `Memo` immediately after the standard `Transfer` event. |
| [`burnBlocked`](/specifications/b20/reference/interfaces/ib20/burn-blocked) | `0xec0cf3dc` | DEPRECATED. Burns `amount` from a `from` account that is blocked under `TRANSFER_SENDER_POLICY`. |
| [`seizeWithMemo`](/specifications/b20/reference/interfaces/ib20/seize-with-memo) | `0xf916d81b` | Seizes `amount` of `from`'s balance and reassigns it to `to` in a single admin operation. |
| [`hasRole`](/specifications/b20/reference/interfaces/ib20/has-role) | `0x91d14854` | Whether `account` is a member of `role`. User-defined roles are supported and have no |
| [`getRoleAdmin`](/specifications/b20/reference/interfaces/ib20/get-role-admin) | `0x248a9ca3` | The role required to grant or revoke `role`. Defaults to `DEFAULT_ADMIN_ROLE` if not |
| [`grantRole`](/specifications/b20/reference/interfaces/ib20/grant-role) | `0x2f2ff15d` | Grants `role` to `account`. Emits `RoleGranted`. |
| [`revokeRole`](/specifications/b20/reference/interfaces/ib20/revoke-role) | `0xd547741f` | Revokes `role` from `account`. Emits `RoleRevoked`. |
| [`renounceRole`](/specifications/b20/reference/interfaces/ib20/renounce-role) | `0x36568abe` | Caller renounces `role` for themselves. Emits `RoleRevoked`. |
| [`renounceLastAdmin`](/specifications/b20/reference/interfaces/ib20/renounce-last-admin) | `0x6f79e3d7` | Permanently transitions the token to a zero-admin state. Revokes `DEFAULT_ADMIN_ROLE` |
| [`setRoleAdmin`](/specifications/b20/reference/interfaces/ib20/set-role-admin) | `0x1e4e0091` | Sets the admin role for `role`. Emits `RoleAdminChanged`. |
| [`pausedFeatures`](/specifications/b20/reference/interfaces/ib20/paused-features) | `0xde9997e3` | The `PausableFeature`s currently paused on this token. Order is implementation-defined; |
| [`isPaused`](/specifications/b20/reference/interfaces/ib20/is-paused) | `0xbc61e733` | Whether `feature` is currently paused. O(1). |
| [`pause`](/specifications/b20/reference/interfaces/ib20/pause) | `0xa290249c` | Pauses each of `features`. Additive: features already paused remain paused; duplicates |
| [`unpause`](/specifications/b20/reference/interfaces/ib20/unpause) | `0x8b93dd63` | Unpauses each of `features`. Features not listed are unaffected; duplicates are idempotent. |
| [`policyId`](/specifications/b20/reference/interfaces/ib20/policy-id) | `0xdb3de624` | The current policy ID configured for `policyScope`. Returns `0` (always-allow built-in) |
| [`updatePolicy`](/specifications/b20/reference/interfaces/ib20/update-policy) | `0xadf9c4ea` | Updates the policy ID assigned to `policyScope`. Takes effect immediately for the next |
| [`supplyCap`](/specifications/b20/reference/interfaces/ib20/supply-cap) | `0x8f770ad0` | The maximum total supply enforced on `mint`. Capped at `type(uint128).max`, which |
| [`updateSupplyCap`](/specifications/b20/reference/interfaces/ib20/update-supply-cap) | `0xe5a97f07` | Sets a new supply cap. May be raised or lowered freely, but never below current |
| [`DOMAIN_SEPARATOR`](/specifications/b20/reference/interfaces/ib20/domain-separator) | `0x3644e515` | The current EIP-712 domain separator for this token. Recomputed on each call so it |
| [`nonces`](/specifications/b20/reference/interfaces/ib20/nonces) | `0x7ecebe00` | The current EIP-2612 permit nonce for `owner`. Incremented by 1 on each successful `permit`. |
| [`permit`](/specifications/b20/reference/interfaces/ib20/permit) | `0xd505accf` | EIP-2612 permit. Recovers `owner` via ECDSA from `(v, r, s)`. EOA signatures only; |
| [`eip712Domain`](/specifications/b20/reference/interfaces/ib20/eip712-domain) | `0x84b0196e` | ERC-5267 EIP-712 domain introspection. |
| [`contractURI`](/specifications/b20/reference/interfaces/ib20/contract-uri) | `0xe8a3d485` | Off-chain URI pointing at contract-level metadata for this token, per ERC-7572. |
| [`updateContractURI`](/specifications/b20/reference/interfaces/ib20/update-contract-uri) | `0x7e5b1e24` | Updates `contractURI`. Emits the parameterless `ContractURIUpdated` event per ERC-7572; |

## Events

| Event | Topic0 | Summary |
| - | - | - |
| `Transfer` | `0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef` | ERC-20 transfer event. Emitted on every successful transfer (including memo'd variants), |
| `Approval` | `0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925` | ERC-20 approval event. Emitted by `approve` and `permit`. |
| `Memo` | `0x6989f5818dcfd11f8cd53b27c94cec33dae1589735f03e639cba54553a1825e8` | Emitted by `transferWithMemo`, `transferFromWithMemo`, `mintWithMemo`, and `burnWithMemo` |
| `BurnedBlocked` | `0x0b552e96653fd6842da37c477005d3b5c08a8c7d3631b1f43787b2dc9a1006a3` | Emitted by the deprecated `burnBlocked` in addition to `Transfer(from, address(0), amount)`. |
| `Seized` | `0xa9aec5d8b86e2fa2fd6ac3af62f2622e3dfdab1967d4cbbb56a5df7d74cb887c` | Emitted by `seizeWithMemo` in addition to `Transfer(from, to, amount)` (and the |
| `RoleGranted` | `0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d` | Emitted when `account` is granted `role`. `sender` is the originating caller. |
| `RoleRevoked` | `0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b` | Emitted when `role` is revoked from `account`. `sender` is the originating caller |
| `RoleAdminChanged` | `0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff` | Emitted by `setRoleAdmin` when the admin role for `role` changes. |
| `LastAdminRenounced` | `0xe8d3a9872e7ca325571ff1e4c51ddd69090a0345240cc605ccde365ec867cc67` | Emitted by `renounceLastAdmin` in addition to the standard |
| `Paused` | `0x43e072977b8112813d7c2aa0b63d3c121c1fe3e714e6d2eacb5735fe4027e976` | Emitted by `pause`. `features` is the argument to the call (not the resulting paused state). |
| `Unpaused` | `0xdc6281474ea3dea2a856e225c7ba3edf427de9164495817c4d49a595e683fed4` | Emitted by `unpause`. `features` is the argument to the call (not the resulting paused state). |
| `PolicyUpdated` | `0x8b4790f7ff717fc8f60f07ae099e47ef318dc04b37ae98056b50a22b79056626` | Emitted by `updatePolicy` when a token's policy slot is changed. Initial slot assignment at |
| `SupplyCapUpdated` | `0x6d14f44808ce024f263432bc38d019a9951fbe674e9898b54844dbc8dc09c23a` | Emitted by `updateSupplyCap`. |
| `ContractURIUpdated` | `0xa5d4097edda6d87cb9329af83fb3712ef77eeb13738ffe43cc35a4ce305ad962` | Emitted by `updateContractURI`. Per ERC-7572, parameterless: integrators re-fetch `contractURI()`. |
| `NameUpdated` | `0x74321da206c1b9fa34367f7ece59ca49371dcd13820b9a5c3767ae1ecceed51a` | Emitted by `updateName`. Carries the new name string. |
| `SymbolUpdated` | `0x64e8b5c6dcea43dd79766bb3b8af7c45968d12b68c960cf2da23856f34d598d4` | Emitted by `updateSymbol`. Carries the new symbol string. |
| `EIP712DomainChanged` | `0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31` | ERC-5267 domain-change signal. Emitted exactly once per successful `updateName` call, |

## Errors

| Error | Selector | Summary |
| - | - | - |
| `NonPayable` | `0x6fb1b0e9` | ETH was attached to a call targeting a nonpayable token selector. |
| `AccessControlUnauthorizedAccount` | `0xe2517d3f` | `account` does not hold `neededRole`. |
| `Unauthorized` | `0x82b42900` | Caller failed a positional authorization check that is not expressible as "missing role X". |
| `ContractPaused` | `0xf9df5ac9` | The `PausableFeature` covering this operation is currently paused. |
| `InsufficientAllowance` | `0x192b9e4e` | `spender`'s allowance is less than `needed` for the requested `transferFrom`. |
| `InsufficientBalance` | `0xdb42144d` | `sender`'s balance is less than `needed` for the requested transfer or burn. |
| `InvalidSender` | `0x4c14f64c` | The transfer's source address is invalid (typically `address(0)`). |
| `InvalidReceiver` | `0x9cfea583` | The transfer's destination address is invalid (typically `address(0)`). |
| `InvalidApprover` | `0x8bc146c4` | The approval's `owner` address is invalid (typically `address(0)`). |
| `InvalidSpender` | `0x4e15efda` | The approval's `spender` address is invalid (typically `address(0)`). |
| `InvalidAmount` | `0x2c5211c6` | An amount argument was zero where a non-zero value is required. Not used for ERC-20 amount arguments. |
| `EmptyFeatureSet` | `0x4861ff45` | An empty array was passed to a function that requires at least one element. |
| `InvalidSupplyCap` | `0x0a3780ce` | The proposed supply cap is outside the permitted range: below the current |
| `SupplyCapExceeded` | `0x4b344b11` | The mint would push `totalSupply` past the configured cap. |
| `PolicyForbids` | `0xa43fec12` | A policy slot denied the operation. |
| `PolicyNotFound` | `0xcccad523` | The provided policy ID does not exist in the policy registry. |
| `UnsupportedPolicyType` | `0xcdd98a4a` | `policyScope` is not a slot this token (or its variant) supports. |
| `AccountNotSeizable` | `0x91dbbc8d` | `seizeWithMemo` was called against a `from` that is currently authorized under |
| `AccountNotBlocked` | `0x64a5cb46` | The deprecated `burnBlocked` was called against a `from` that is currently authorized under |
| `ExpiredSignature` | `0xbd2a913c` | An EIP-2612 `permit` was submitted with a `deadline` strictly less than `block.timestamp`. |
| `InvalidSigner` | `0x7ba5ffb5` | ECDSA recovery on an EIP-2612 `permit` returned `signer`, which does not match the claimed `owner`. |
| `LastAdminCannotRenounce` | `0x361513e7` | `renounceRole(DEFAULT_ADMIN_ROLE, ...)` was called by the sole remaining admin. |
| `NotSoleAdmin` | `0x2a98e73b` | `renounceLastAdmin()` was called when other accounts also hold `DEFAULT_ADMIN_ROLE`. |
| `AccessControlBadConfirmation` | `0x6697b232` | The `callerConfirmation` argument to `renounceRole` was not `msg.sender`. |
