From 559e8636bf6ca0fd1df55ae6d462bae8de16cd79 Mon Sep 17 00:00:00 2001 From: sohey Date: Mon, 3 Aug 2026 15:25:00 +0200 Subject: [PATCH 1/5] changed b20 spec to reflect all policies --- docs/AGENTS.md | 15 +- docs/apps/guides/accept-b20-payments.mdx | 2 +- docs/base-chain/llms-full.txt | 9 + docs/base-chain/llms.txt | 7 + .../specs/upgrades/beryl/b20-playground.mdx | 8 +- docs/base-chain/specs/upgrades/beryl/b20.mdx | 269 ------------------ .../concepts/architecture-and-precompiles.mdx | 57 ++++ .../concepts/policies-and-scopes.mdx | 94 ++++++ .../concepts/roles-and-access-control.mdx | 67 +++++ .../concepts/token-lifecycle.mdx | 102 +++++++ .../concepts/variants-asset-vs-stablecoin.mdx | 58 ++++ .../deployment-and-initcalls-encoding.mdx | 93 ++++++ .../policy-configuration-in-code.mdx | 129 +++++++++ .../testing-against-precompiles.mdx | 62 ++++ .../implementation/working-with-base-std.mdx | 71 +++++ .../beryl/b20/specification/index.mdx | 223 +++++++++++++++ .../beryl/b20/specification/overview.mdx | 46 +++ .../reference/constants-and-addresses.mdx | 90 ++++++ .../reference/errors-and-events-index.mdx | 101 +++++++ .../interfaces/IActivationRegistry.mdx | 40 +++ .../IActivationRegistry/activate.mdx | 49 ++++ .../interfaces/IActivationRegistry/admin.mdx | 45 +++ .../IActivationRegistry/checkActivated.mdx | 47 +++ .../IActivationRegistry/deactivate.mdx | 49 ++++ .../IActivationRegistry/isActivated.mdx | 46 +++ .../reference/interfaces/IB20.mdx | 121 ++++++++ .../interfaces/IB20/BURN_BLOCKED_ROLE.mdx | 46 +++ .../reference/interfaces/IB20/BURN_ROLE.mdx | 45 +++ .../interfaces/IB20/DEFAULT_ADMIN_ROLE.mdx | 46 +++ .../interfaces/IB20/DOMAIN_SEPARATOR.mdx | 46 +++ .../interfaces/IB20/METADATA_ROLE.mdx | 45 +++ .../interfaces/IB20/MINT_RECEIVER_POLICY.mdx | 48 ++++ .../reference/interfaces/IB20/MINT_ROLE.mdx | 45 +++ .../reference/interfaces/IB20/PAUSE_ROLE.mdx | 45 +++ .../interfaces/IB20/SEIZE_HOLDER_POLICY.mdx | 47 +++ .../reference/interfaces/IB20/SEIZE_ROLE.mdx | 45 +++ .../IB20/TRANSFER_EXECUTOR_POLICY.mdx | 48 ++++ .../IB20/TRANSFER_RECEIVER_POLICY.mdx | 47 +++ .../IB20/TRANSFER_SENDER_POLICY.mdx | 47 +++ .../interfaces/IB20/UNPAUSE_ROLE.mdx | 45 +++ .../reference/interfaces/IB20/allowance.mdx | 47 +++ .../reference/interfaces/IB20/approve.mdx | 49 ++++ .../reference/interfaces/IB20/balanceOf.mdx | 46 +++ .../reference/interfaces/IB20/burn.mdx | 49 ++++ .../interfaces/IB20/burnWithMemo.mdx | 47 +++ .../reference/interfaces/IB20/contractURI.mdx | 45 +++ .../reference/interfaces/IB20/decimals.mdx | 45 +++ .../interfaces/IB20/eip712Domain.mdx | 51 ++++ .../interfaces/IB20/getRoleAdmin.mdx | 47 +++ .../reference/interfaces/IB20/grantRole.mdx | 48 ++++ .../reference/interfaces/IB20/hasRole.mdx | 48 ++++ .../reference/interfaces/IB20/isPaused.mdx | 46 +++ .../reference/interfaces/IB20/mint.mdx | 51 ++++ .../interfaces/IB20/mintWithMemo.mdx | 48 ++++ .../reference/interfaces/IB20/name.mdx | 45 +++ .../reference/interfaces/IB20/nonces.mdx | 46 +++ .../reference/interfaces/IB20/pause.mdx | 48 ++++ .../interfaces/IB20/pausedFeatures.mdx | 46 +++ .../reference/interfaces/IB20/permit.mdx | 55 ++++ .../reference/interfaces/IB20/policyId.mdx | 48 ++++ .../interfaces/IB20/renounceLastAdmin.mdx | 48 ++++ .../interfaces/IB20/renounceRole.mdx | 48 ++++ .../reference/interfaces/IB20/revokeRole.mdx | 50 ++++ .../interfaces/IB20/seizeWithMemo.mdx | 59 ++++ .../interfaces/IB20/setRoleAdmin.mdx | 48 ++++ .../reference/interfaces/IB20/supplyCap.mdx | 47 +++ .../reference/interfaces/IB20/symbol.mdx | 45 +++ .../reference/interfaces/IB20/totalSupply.mdx | 45 +++ .../reference/interfaces/IB20/transfer.mdx | 53 ++++ .../interfaces/IB20/transferFrom.mdx | 56 ++++ .../interfaces/IB20/transferFromWithMemo.mdx | 50 ++++ .../interfaces/IB20/transferWithMemo.mdx | 49 ++++ .../reference/interfaces/IB20/unpause.mdx | 48 ++++ .../interfaces/IB20/updateContractURI.mdx | 47 +++ .../reference/interfaces/IB20/updateName.mdx | 46 +++ .../interfaces/IB20/updatePolicy.mdx | 50 ++++ .../interfaces/IB20/updateSupplyCap.mdx | 48 ++++ .../interfaces/IB20/updateSymbol.mdx | 46 +++ .../reference/interfaces/IB20Asset.mdx | 58 ++++ .../interfaces/IB20Asset/OPERATOR_ROLE.mdx | 47 +++ .../interfaces/IB20Asset/WAD_PRECISION.mdx | 45 +++ .../interfaces/IB20Asset/announce.mdx | 58 ++++ .../interfaces/IB20Asset/batchMint.mdx | 55 ++++ .../IB20Asset/cancelScheduledMultiplier.mdx | 47 +++ .../interfaces/IB20Asset/extraMetadata.mdx | 48 ++++ .../IB20Asset/isAnnouncementIdUsed.mdx | 46 +++ .../interfaces/IB20Asset/multiplier.mdx | 48 ++++ .../interfaces/IB20Asset/scaledBalanceOf.mdx | 46 +++ .../interfaces/IB20Asset/setUIMultiplier.mdx | 52 ++++ .../interfaces/IB20Asset/toRawBalance.mdx | 50 ++++ .../interfaces/IB20Asset/toScaledBalance.mdx | 46 +++ .../IB20Asset/updateExtraMetadata.mdx | 49 ++++ .../interfaces/IB20Asset/updateMultiplier.mdx | 49 ++++ .../reference/interfaces/IB20Factory.mdx | 41 +++ .../interfaces/IB20Factory/createB20.mdx | 73 +++++ .../interfaces/IB20Factory/getB20Address.mdx | 48 ++++ .../interfaces/IB20Factory/isB20.mdx | 46 +++ .../IB20Factory/isB20Initialized.mdx | 47 +++ .../reference/interfaces/IB20Stablecoin.mdx | 31 ++ .../interfaces/IB20Stablecoin/currency.mdx | 45 +++ .../reference/interfaces/IPolicyRegistry.mdx | 57 ++++ .../compositePolicyChildIds.mdx | 52 ++++ .../IPolicyRegistry/createCompositePolicy.mdx | 58 ++++ .../IPolicyRegistry/createPolicy.mdx | 49 ++++ .../createPolicyWithAccounts.mdx | 52 ++++ .../IPolicyRegistry/finalizeUpdateAdmin.mdx | 48 ++++ .../IPolicyRegistry/isAuthorized.mdx | 50 ++++ .../IPolicyRegistry/pendingPolicyAdmin.mdx | 48 ++++ .../IPolicyRegistry/policyAdmin.mdx | 47 +++ .../IPolicyRegistry/policyExists.mdx | 46 +++ .../IPolicyRegistry/renounceAdmin.mdx | 48 ++++ .../IPolicyRegistry/stageUpdateAdmin.mdx | 49 ++++ .../IPolicyRegistry/updateAllowlist.mdx | 51 ++++ .../IPolicyRegistry/updateBlocklist.mdx | 51 ++++ .../IPolicyRegistry/updateComposite.mdx | 55 ++++ .../specs/upgrades/beryl/overview.mdx | 20 +- docs/docs.json | 99 ++++++- docs/get-started/launch-b20-token.mdx | 5 +- .../b20/b20-architecture-precompiles.png | Bin 0 -> 54390 bytes docs/images/b20/b20-policies-and-scopes.png | Bin 0 -> 69271 bytes docs/llms-full.txt | 114 +++++++- docs/llms.txt | 116 +++++++- 122 files changed, 6269 insertions(+), 304 deletions(-) delete mode 100644 docs/base-chain/specs/upgrades/beryl/b20.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/architecture-and-precompiles.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/implementation/deployment-and-initcalls-encoding.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/implementation/policy-configuration-in-code.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/implementation/testing-against-precompiles.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/implementation/working-with-base-std.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/index.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/overview.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/errors-and-events-index.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/activate.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/admin.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/checkActivated.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/deactivate.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/isActivated.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_BLOCKED_ROLE.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_ROLE.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DEFAULT_ADMIN_ROLE.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DOMAIN_SEPARATOR.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/METADATA_ROLE.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_RECEIVER_POLICY.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_ROLE.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/PAUSE_ROLE.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_HOLDER_POLICY.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_ROLE.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_EXECUTOR_POLICY.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_RECEIVER_POLICY.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_SENDER_POLICY.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/UNPAUSE_ROLE.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/allowance.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/approve.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/balanceOf.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burn.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burnWithMemo.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/contractURI.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/decimals.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/eip712Domain.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/getRoleAdmin.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/grantRole.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/hasRole.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/isPaused.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mint.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mintWithMemo.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/name.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/nonces.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pause.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pausedFeatures.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/permit.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/policyId.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceLastAdmin.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceRole.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/revokeRole.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/seizeWithMemo.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/setRoleAdmin.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/supplyCap.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/symbol.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/totalSupply.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transfer.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFrom.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFromWithMemo.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferWithMemo.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/unpause.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateContractURI.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateName.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updatePolicy.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSupplyCap.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSymbol.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/OPERATOR_ROLE.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/WAD_PRECISION.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/announce.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/batchMint.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/cancelScheduledMultiplier.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/extraMetadata.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/isAnnouncementIdUsed.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/multiplier.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/scaledBalanceOf.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/setUIMultiplier.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toRawBalance.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toScaledBalance.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateExtraMetadata.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateMultiplier.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/createB20.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/getB20Address.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20Initialized.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin/currency.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/compositePolicyChildIds.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createCompositePolicy.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicy.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicyWithAccounts.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/finalizeUpdateAdmin.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/isAuthorized.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/pendingPolicyAdmin.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyAdmin.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyExists.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/renounceAdmin.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/stageUpdateAdmin.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateAllowlist.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateBlocklist.mdx create mode 100644 docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateComposite.mdx create mode 100644 docs/images/b20/b20-architecture-precompiles.png create mode 100644 docs/images/b20/b20-policies-and-scopes.png diff --git a/docs/AGENTS.md b/docs/AGENTS.md index e4c635ced..5e43bf6b1 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -49,7 +49,7 @@ npx skills add base/base-skills |apps:index |apps/builder-codes:agent-developers,app-developers,builder-codes,wallet-developers |apps/growth:rewards -|apps/guides:accept-b20-payments,migrate-to-standard-web-app +|apps/guides:accept-b20-payments,migrate-to-standard-web-app,verify-onchain |apps/quickstart:build-app,deploy-on-base |apps/resources:design-resources,templates |apps/technical-guides:base-notifications @@ -93,7 +93,18 @@ npx skills add base/base-skills |base-chain/specs/protocol/proofs:challenger,contracts,index,proposer,registrar,tee-prover,zk-prover |base-chain/specs/reference:configurability,glossary |base-chain/specs/upgrades/azul:exec-engine,node-upgrade,overview,proofs -|base-chain/specs/upgrades/beryl:b20-playground,b20,overview +|base-chain/specs/upgrades/beryl:b20-playground,overview +|base-chain/specs/upgrades/beryl/b20/specification:index,overview +|base-chain/specs/upgrades/beryl/b20/specification/concepts:architecture-and-precompiles,policies-and-scopes,roles-and-access-control,token-lifecycle,variants-asset-vs-stablecoin +|base-chain/specs/upgrades/beryl/b20/specification/implementation:deployment-and-initcalls-encoding,policy-configuration-in-code,testing-against-precompiles,working-with-base-std +|base-chain/specs/upgrades/beryl/b20/specification/reference:constants-and-addresses,errors-and-events-index +|base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces:IActivationRegistry,IB20,IB20Asset,IB20Factory,IB20Stablecoin,IPolicyRegistry +|base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry:activate,admin,checkActivated,deactivate,isActivated +|base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20:BURN_BLOCKED_ROLE,BURN_ROLE,DEFAULT_ADMIN_ROLE,DOMAIN_SEPARATOR,METADATA_ROLE,MINT_RECEIVER_POLICY,MINT_ROLE,PAUSE_ROLE,SEIZE_HOLDER_POLICY,SEIZE_ROLE,TRANSFER_EXECUTOR_POLICY,TRANSFER_RECEIVER_POLICY,TRANSFER_SENDER_POLICY,UNPAUSE_ROLE,allowance,approve,balanceOf,burn,burnWithMemo,contractURI,decimals,eip712Domain,getRoleAdmin,grantRole,hasRole,isPaused,mint,mintWithMemo,name,nonces,pause,pausedFeatures,permit,policyId,renounceLastAdmin,renounceRole,revokeRole,seizeWithMemo,setRoleAdmin,supplyCap,symbol,totalSupply,transfer,transferFrom,transferFromWithMemo,transferWithMemo,unpause,updateContractURI,updateName,updatePolicy,updateSupplyCap,updateSymbol +|base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset:OPERATOR_ROLE,WAD_PRECISION,announce,batchMint,cancelScheduledMultiplier,extraMetadata,isAnnouncementIdUsed,multiplier,scaledBalanceOf,setUIMultiplier,toRawBalance,toScaledBalance,updateExtraMetadata,updateMultiplier +|base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory:createB20,getB20Address,isB20,isB20Initialized +|base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin:currency +|base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry:compositePolicyChildIds,createCompositePolicy,createPolicy,createPolicyWithAccounts,finalizeUpdateAdmin,isAuthorized,pendingPolicyAdmin,policyAdmin,policyExists,renounceAdmin,stageUpdateAdmin,updateAllowlist,updateBlocklist,updateComposite |base-chain/specs/upgrades/canyon:overview |base-chain/specs/upgrades/cobalt:eip-8130 |base-chain/specs/upgrades/delta:overview,span-batches diff --git a/docs/apps/guides/accept-b20-payments.mdx b/docs/apps/guides/accept-b20-payments.mdx index 88a14ac0e..7c20bc559 100644 --- a/docs/apps/guides/accept-b20-payments.mdx +++ b/docs/apps/guides/accept-b20-payments.mdx @@ -56,6 +56,6 @@ Call `publicClient.simulateContract` with the same arguments before sending. It ## Related pages -- [B20 token standard](/base-chain/specs/upgrades/beryl/b20): the full interface, including memos, policies, pausing, and roles. +- [B20 token standard](/base-chain/specs/upgrades/beryl/b20/specification/overview): the full interface, including memos, policies, pausing, and roles. - [Query B20 events](https://docs.cdp.coinbase.com/data/sql-api/b20-events): index `Transfer` and `Memo` events with the CDP SQL API to reconcile payments against orders at scale. - [Launch a B20 token](/get-started/launch-b20-token): create your own B20 token. \ No newline at end of file diff --git a/docs/base-chain/llms-full.txt b/docs/base-chain/llms-full.txt index ee157a89e..8d9e64a02 100644 --- a/docs/base-chain/llms-full.txt +++ b/docs/base-chain/llms-full.txt @@ -17,6 +17,15 @@ ### Introduction - [Chain Overview](https://docs.base.org/base-chain/overview.md) — Entry point for Base Chain docs +### B20 Token Standard +- [B20 token standard](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/overview.md) — Base-native ERC-20 superset implemented as Rust precompiles +- [Architecture & precompiles](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/concepts/architecture-and-precompiles.md) — Fixed precompiles, activation gates, and deterministic token addresses +- [Policies & scopes](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes.md) — Token policy slots, PolicyRegistry pointers, built-ins, and composite policies +- [Roles & access control](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control.md) — Built-in roles, user-defined role limits, and admin renunciation +- [Token lifecycle](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle.md) — Creation, initCalls, operation, memos, pausing, seizure, and admin renunciation +- [Variants: Asset vs Stablecoin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin.md) — Variant choice, Asset extras, and Stablecoin currency +- [B20 reference](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20.md) — Generated interface reference from base-std NatSpec + ### Core Concepts - [Transaction Ordering](https://docs.base.org/base-chain/network-information/transaction-ordering.md) — How blocks are ordered on Base - [Transaction Finality](https://docs.base.org/base-chain/network-information/transaction-finality.md) — Detailed information about transaction finality on Base diff --git a/docs/base-chain/llms.txt b/docs/base-chain/llms.txt index 33e7a8237..4226141b5 100644 --- a/docs/base-chain/llms.txt +++ b/docs/base-chain/llms.txt @@ -7,6 +7,13 @@ ## Introduction - [Chain Overview](https://docs.base.org/base-chain/overview.md) — Start here for Base Chain docs, including concepts, network reference, node operation, APIs, and protocol specifications. +## B20 Token Standard +- [B20 token standard](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/overview.md) — ERC-20-compatible native token standard with policy scopes, roles, memos, pausing, supply caps, and variants +- [Policies & scopes](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes.md) — How B20 token scopes point to PolicyRegistry policy IDs +- [Policy configuration in code](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/implementation/policy-configuration-in-code.md) — Read, audit, create, and bind policies from Solidity +- [Deployment & initCalls encoding](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/implementation/deployment-and-initcalls-encoding.md) — Use B20FactoryLib to deploy and bootstrap tokens atomically +- [B20 constants & addresses](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses.md) — Fixed precompile addresses, roles, scopes, variant bytes, and policy IDs + ## Core Concepts - [Transaction Ordering](https://docs.base.org/base-chain/network-information/transaction-ordering.md) — How blocks are ordered on Base - [Transaction Finality](https://docs.base.org/base-chain/network-information/transaction-finality.md) — Detailed information about transaction finality on Base diff --git a/docs/base-chain/specs/upgrades/beryl/b20-playground.mdx b/docs/base-chain/specs/upgrades/beryl/b20-playground.mdx index 88d70ca4d..4561e6c37 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20-playground.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20-playground.mdx @@ -16,7 +16,7 @@ B20 is a superset of ERC-20: every ERC-20 call works unchanged, so there's no co ## A compliance order arrives -A court order targets one account. Freeze it so it can't send, then seize the balance with one call. Seizure only works on an account that is already frozen. Every other holder is untouched and the token keeps trading. See [transfer policies](/base-chain/specs/upgrades/beryl/b20#policy-integration) and [burn](/base-chain/specs/upgrades/beryl/b20#burn) in the spec. +A court order targets one account. Freeze it so it can't send, then seize the balance with one call. Seizure only works on an account that is already frozen. Every other holder is untouched and the token keeps trading. See [transfer policies](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) and [freeze-and-seize](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle#freeze-and-seize) in the docs. @@ -32,7 +32,7 @@ Your customer pays to one address. The transfer carries the invoice reference, s ## A new user approves without gas -A new user shouldn't have to buy ETH first. With `permit`, they sign an approval offchain and your platform relays it. They start transacting with zero gas, and nonces stop signature replay. See [permit](/base-chain/specs/upgrades/beryl/b20#erc-2612-permit--eip-712) in the spec. +A new user shouldn't have to buy ETH first. With `permit`, they sign an approval offchain and your platform relays it. They start transacting with zero gas, and nonces stop signature replay. See [permit](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/permit) in the spec. @@ -40,7 +40,7 @@ A new user shouldn't have to buy ETH first. With `permit`, they sign an approval ## The stock splits -A 2-for-1 split is one call. Every balance doubles without a migration or a new contract. Dividends run inside a public announcement window, so the disclosure lives onchain next to the action. The token also stores identifiers like a CUSIP. See the [Asset variant](/base-chain/specs/upgrades/beryl/b20#asset) in the spec. +A 2-for-1 split is one call. Every balance doubles without a migration or a new contract. Dividends run inside a public announcement window, so the disclosure lives onchain next to the action. The token also stores identifiers like a CUSIP. See the [Asset variant](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin#asset-extras) in the spec. @@ -55,7 +55,7 @@ A 2-for-1 split is one call. Every balance doubles without a migration or a new Integration code for memo-tagged payments and B20-specific reverts. - + Every method, event, role, and policy in the standard. diff --git a/docs/base-chain/specs/upgrades/beryl/b20.mdx b/docs/base-chain/specs/upgrades/beryl/b20.mdx deleted file mode 100644 index 2daaf3aa5..000000000 --- a/docs/base-chain/specs/upgrades/beryl/b20.mdx +++ /dev/null @@ -1,269 +0,0 @@ ---- -title: "B20 native token standard" -description: "Learn how B20, Base's native token standard, serves stablecoin issuers, real-world asset (RWA) and equity issuers, and long-tail token creators." ---- - -B20 is the Base ecosystem's own version of [ERC-20](https://eips.ethereum.org/EIPS/eip-20). It ships with a built-in compliance toolkit: transfer policies, freeze-and-seize, role-based access control, memos, and supply caps. The full interface specs are available in the [Base Standard Library](https://github.com/base/base-std/tree/main) repository. - -To deploy your first B20 token, see the [Launch a B20 token](/get-started/launch-b20-token) quickstart. - - -[Verify the Activation Registry is enabled](/get-started/launch-b20-token#verify-the-activation-registry-is-enabled) before attempting to deploy. - - -B20 supports two variants: - -| Variant | Decimals | Additional Features | -|---------|----------|---------------------| -| **Asset** | 6–18 (configurable) | Rebase multiplier, onchain announcements, batched issuance | -| **Stablecoin** | 6 (fixed) | Self-declared fiat currency code | - -## ERC-20 Compatibility - -B20 tokens are implemented as **Rust precompiles** rather than EVM smart contracts, making them faster, cheaper, and more native to the chain. All tokens are deployed via the singleton B20Factory precompile. - - -B20 is a superset of ERC-20. Every ERC-20 call (`transfer`, `transferFrom`, `approve`, `balanceOf`, `allowance`, and the standard events) behaves exactly as the standard specifies, so existing ERC-20 tooling and integrations work against B20 with no changes. - - -B20 adds methods that ERC-20 does not include: memos, mint/burn, policy gating, granular pause, and ERC-2612 `permit`. These extend ERC-20 without altering it - every ERC-20 method exists on B20, but the reverse does not hold. For the complete ABIs, see the [interface definitions](https://github.com/base/base-std/tree/main/src/interfaces) in the Base Standard Library. - -## Roles Model - -B20 role-based access control extends OpenZeppelin `AccessControl` with a fixed set of roles and one behavioral override on admin renunciation. - -| Role | Gates | -|------|-------| -| `DEFAULT_ADMIN_ROLE` | All admin operations: role grants, policy updates, supply-cap changes | -| `MINT_ROLE` | `mint`, `mintWithMemo` | -| `BURN_ROLE` | Caller-side burns: `burn`, `burnWithMemo` | -| `BURN_BLOCKED_ROLE` | Third-party burns against policy-blocked accounts: `burnBlocked` | -| `PAUSE_ROLE` | `pause` | -| `UNPAUSE_ROLE` | `unpause` | -| `METADATA_ROLE` | `updateName`, `updateSymbol`, `updateContractURI` | - -User-defined roles are supported via `setRoleAdmin` and `grantRole`. They carry no built-in effect - B20 only enforces gates against the seven base-surface roles above. The Asset variant adds an eighth role, `OPERATOR_ROLE` (see [Variants](#variants)). - -### Admin Renunciation - -The last `DEFAULT_ADMIN_ROLE` holder cannot be removed via `renounceRole` or `revokeRole` (both revert with `LastAdminCannotRenounce`). The dedicated `renounceLastAdmin()` is the only path to permanently transition a token to admin-less. - -Tokens that intend to launch admin-less from the start pass `initialAdmin == address(0)` at creation, which never grants the role and skips the `renounceLastAdmin` step entirely. - -After `renounceLastAdmin()` (or for tokens deployed with `initialAdmin == address(0)`): - -- Operations gated by `DEFAULT_ADMIN_ROLE` become permanently uncallable. -- Roles already granted to other addresses (`MINT_ROLE`, `BURN_ROLE`, etc.) continue to function independently. -- Admin resurrection is blocked: `grantRole`, `revokeRole`, and `setRoleAdmin` all revert with `AccessControlUnauthorizedAccount` even if the caller holds a custom role. - -## Policy Registry - -The PolicyRegistry is a singleton precompile that manages allowlists and blocklists. B20 tokens reference policies by `uint64` ID. Any caller can create a policy and nominate its admin. - - -State-changing functions on the PolicyRegistry are gated by the ActivationRegistry, which tracks which Base features are live. Read functions (`isAuthorized`, `policyExists`, `policyAdmin`, `pendingPolicyAdmin`) are always callable. - - -### Policy Types - -| Type | Default | Behavior | -|------|---------|----------| -| `BLOCKLIST` | Authorized | All accounts authorized by default; explicitly listed accounts are denied. | -| `ALLOWLIST` | Denied | All accounts denied by default; explicitly listed accounts are authorized. | - -### Policy IDs - -Policy IDs are `uint64` values. The top byte encodes the `PolicyType`; the low 56 bits are a global counter starting at `2`. - -Two built-in IDs require no creation: - -| Constant | ID | Behavior | -|----------|----|----------| -| `ALWAYS_ALLOW` | `0` | Authorizes every account unconditionally. Default scope value on new B20 tokens. | -| `ALWAYS_BLOCK` | `(uint64(ALLOWLIST) << 56) \| 1` | Denies every account unconditionally. | - -`isAuthorized` never reverts on a non-existent policy ID - it collapses to empty-member-set semantics (non-existent `BLOCKLIST` authorizes everyone; non-existent `ALLOWLIST` denies everyone). - - -Consumers that write a policy ID (e.g. `updatePolicy`) MUST validate `policyExists(policyId)` at write time to avoid silently binding to an unintended empty-set policy. - - -### Admin Model - -Each policy has one admin. Admin transfers are two-step: the current admin calls `stageUpdateAdmin(policyId, newAdmin)`, then the pending admin calls `finalizeUpdateAdmin(policyId)`. `renounceAdmin(policyId)` permanently freezes the policy - membership can never be changed again. - -### Creating and Managing Policies - -```solidity -// Create a policy (admin first, then type) -uint64 policyId = policyRegistry.createPolicy(adminAddress, PolicyType.BLOCKLIST); -// Or seed the initial member set in one call: -// uint64 policyId = policyRegistry.createPolicyWithAccounts(adminAddress, PolicyType.BLOCKLIST, accounts); - -// Update membership (batched). The setter is type-specific; the bool sets membership state. -policyRegistry.updateBlocklist(policyId, true, accounts); // block these accounts -policyRegistry.updateBlocklist(policyId, false, accounts); // unblock these accounts -// For ALLOWLIST policies: policyRegistry.updateAllowlist(policyId, allowed, accounts) -``` - -### Read Interface - -| Method | Description | -|--------|-------------| -| `isAuthorized(policyId, account)` | Whether `account` is authorized under `policyId`. Never reverts. | -| `policyExists(policyId)` | Whether a policy with this ID has been created. | -| `policyAdmin(policyId)` | Current admin address. | -| `pendingPolicyAdmin(policyId)` | Pending admin during a two-step transfer. | - -## Policy Integration - -B20 declares a fixed set of policy scopes. Each scope stores a `uint64` policy ID pointing into the PolicyRegistry. On every gated operation, B20 calls `isAuthorized` against the relevant scope and reverts with `PolicyForbids` if the account is not authorized. - -| Scope | Gates | -|-------|-------| -| `TRANSFER_SENDER_POLICY` | The `from` of `transfer` / `transferFrom` | -| `TRANSFER_RECEIVER_POLICY` | The `to` of `transfer` / `transferFrom` | -| `TRANSFER_EXECUTOR_POLICY` | The `msg.sender` of `transferFrom`, when distinct from `from` (not checked on `transfer`) | -| `MINT_RECEIVER_POLICY` | The `to` of `mint` | - -`approve` is not policy-gated - only actual balance movement via `transfer` / `transferFrom` is checked. - - -Every scope defaults to `ALWAYS_ALLOW` at token creation unless overridden in the bootstrap `initCalls`. An unattended B20 deployment is fully open - token behavior must be intentionally constrained. - - -Scopes are read via `policyId(scope)` and written via `updatePolicy(scope, policyId)`. `updatePolicy` is admin-gated and reverts if the scope is not recognized. - -## Mint - -New supply is created via `mint` / `mintWithMemo`, gated by `MINT_ROLE`. The recipient is policy-checked against `MINT_RECEIVER_POLICY`. The operation reverts with `SupplyCapExceeded` if it would push `totalSupply` past the cap. - -## Burn - -Two burn paths exist: - -- **`burn` / `burnWithMemo`** - caller burns from their own balance. Gated by `BURN_ROLE`. -- **`burnBlocked`** - burns from a third party's balance. Gated by `BURN_BLOCKED_ROLE`. The target account MUST be denied by `TRANSFER_SENDER_POLICY` - this is the freeze-and-seize path for regulated issuers. - -## Supply Cap - -The supply cap is optional. The sentinel `type(uint128).max` indicates no cap (the default at creation); it is also the maximum permitted cap, so `totalSupply` can never exceed it. `updateSupplyCap(newCap)` is admin-gated and emits `SupplyCapUpdated`. It reverts with `InvalidSupplyCap` if `newCap` is below the current `totalSupply` or above `type(uint128).max`. - -## Memos - -A memo is an optional `bytes32` payload attached to a token operation for off-chain reference. Every memo-emitting operation emits `Memo(address indexed caller, bytes32 indexed memo)` immediately after the operation's primary event. Indexers join via `(transactionHash, logIndex − 1)`. - -Memo-emitting entrypoints: `transferWithMemo`, `transferFromWithMemo`, `mintWithMemo`, `burnWithMemo`. - -## Pause - -Pauses are granular: the `PausableFeature` enum partitions the token surface into independently pausable operations - `TRANSFER`, `MINT`, and `BURN`. The enum is append-only. `pause(features)` and `unpause(features)` are gated by separate roles (`PAUSE_ROLE` and `UNPAUSE_ROLE`) by design. - -## ERC-2612 Permit / EIP-712 - -B20 implements ERC-2612 (signed approvals) using an EIP-712 domain shaped as `(name, version, chainId, verifyingContract)`, with `version` fixed at `"1"`. `updateName` rotates the domain separator and emits `EIP712DomainChanged` (ERC-5267). ERC-1271 contract signatures are not accepted - ECDSA only. - -## Contract URI (ERC-7572) - -`contractURI()` returns a string pointing to off-chain metadata per ERC-7572. `updateContractURI(newUri)` is gated by `METADATA_ROLE`. - -## Metadata Updates - -`METADATA_ROLE` gates: - -- `updateName(newName)` - updates `name` and rotates the EIP-712 domain separator. Emits `NameUpdated` and `EIP712DomainChanged`. -- `updateSymbol(newSymbol)` - updates `symbol` only. Emits `SymbolUpdated`. - -## Factory - -All B20 tokens are created through the singleton B20Factory precompile via `createB20(variant, salt, params, initCalls)`. In `base-std` it is exposed as `StdPrecompiles.B20_FACTORY`. - -| Parameter | Description | -|-----------|-------------| -| `variant` | `ASSET` or `STABLECOIN` | -| `salt` | Caller-chosen entropy for address derivation | -| `params` | ABI-encoded, variant-specific creation struct (versioned by leading byte) | -| `initCalls` | Optional array of ABI-encoded calls dispatched post-creation; factory-originated calls bypass role gates and transfer-side policy gates during this window | - -`createB20` reverts with `IActivationRegistry.FeatureNotActivated` if the requested variant's feature is not yet activated on the chain. - -### Address Derivation - -B20 addresses are deterministic and encode the variant directly: - -```text -[10-byte B20 prefix][1-byte variant][9-byte keccak256(deployer, salt)] -``` - -The variant is recoverable from the address alone without an RPC call — inspect byte 10 (zero-indexed) to identify the token type. Helper functions `getB20Address(variant, deployer, salt)`, `isB20(addr)`, and `isB20Initialized(addr)` are available on the factory. - -### initCalls Semantics - -`initCalls` are dispatched after token creation. During this bootstrap window, factory-originated calls bypass the token's role gates and its transfer-side policy gates (`TRANSFER_SENDER_POLICY`, `TRANSFER_RECEIVER_POLICY`, `TRANSFER_EXECUTOR_POLICY`), allowing admin-gated configuration (e.g. setting policies, granting roles) and bootstrap transfers in the same transaction as deployment. The bypass is deliberately not total: - -- `MINT_RECEIVER_POLICY` is always enforced even during `initCalls`. -- Pause state is never bypassed. -- Token invariants (supply cap, etc.) are never bypassed. - -## Variants - -Each variant is identified by a 1-byte value encoded directly in the token's address (see [Address Derivation](#address-derivation)): - -| Variant | Byte | -|---------|------| -| `ASSET` | `0x00` | -| `STABLECOIN` | `0x01` | - -### Asset - -The general-purpose variant for assets of all kinds. Decimals are configurable between 6 and 18 at deployment time and are immutable after creation. - -In addition to the base B20 surface, Asset tokens add several capabilities. A new `OPERATOR_ROLE` gates the multiplier and announcements; batch mint and extra metadata reuse the existing `MINT_ROLE` and `METADATA_ROLE` respectively. - -#### Multiplier - -A WAD-precision rebase multiplier applied to all balance reads. Raw balances are stored unchanged; the multiplier scales the view returned to callers. - -| Method | Description | -|--------|-------------| -| `multiplier()` | Current WAD-precision multiplier | -| `scaledBalanceOf(account)` | Raw balance × multiplier | -| `toScaledBalance(raw)` | Convert raw amount to scaled | -| `toRawBalance(scaled)` | Convert scaled amount to raw | -| `updateMultiplier(newMultiplier)` | Update the multiplier. Gated by `OPERATOR_ROLE`. | - -#### Announcements - -On-chain disclosure brackets that wrap sensitive operations (e.g. batch mints, multiplier updates) with a public notice period. Gated by `OPERATOR_ROLE`. - -`announce(internalCalls, id, description, uri)` emits an `Announcement` event, executes `internalCalls`, then emits `EndAnnouncement`. The `id` must be unique and is enforced forever. Inner call reverts are wrapped in `InternalCallFailed`. - -#### Batch Mint - -`batchMint(recipients, amounts)` mints to multiple recipients in a single call. Gated by `MINT_ROLE`. Should be wrapped in `announce()` for transparency. - -#### Extra Metadata - -An arbitrary key/value store for issuer-defined on-chain metadata. - -| Method | Description | -|--------|-------------| -| `extraMetadata(key)` | Read a value by key | -| `updateExtraMetadata(key, value)` | Write a value. Gated by `METADATA_ROLE`. Setting an empty value removes the entry. | - -### Stablecoin - -The fixed-decimals, fiat-backed carveout. Decimals are hard-wired to `6` and are not configurable. - -Adds `currency()`, which returns an ISO-style currency code string (e.g. `"USD"`, `"EUR"`). The code is set once at creation via `B20StablecoinCreateParams.currency`, restricted to characters `A`-`Z` only. It is self-declared and not verified against any external registry. - -## Precompile addresses - -These addresses are identical on every network where B20 is active (Mainnet, Base Sepolia, Vibenet, and local `base-anvil`). - -| Precompile | Address | -|---|---| -| [B20Factory](#factory) | `0xB20f000000000000000000000000000000000000` | -| Activation Registry | `0x8453000000000000000000000000000000000001` | -| [Policy Registry](#policy-registry) | `0x8453000000000000000000000000000000000002` | - diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/architecture-and-precompiles.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/architecture-and-precompiles.mdx new file mode 100644 index 000000000..f49694f84 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/architecture-and-precompiles.mdx @@ -0,0 +1,57 @@ +--- +title: "Architecture & precompiles" +description: "Understand the B20 precompile architecture, fixed addresses, activation gates, and deterministic token addresses." +--- + +A B20 token is not a contract you deploy. It is a chain-native token surface implemented as a Rust precompile and created through the singleton B20 Factory. Solidity and offchain clients still call normal ABI methods, but there is no token bytecode to verify on an explorer. + +## System map + + +![B20 architecture swimlane: issuer or app calls the B20 Factory, the factory checks ActivationRegistry and creates a B20 token, and token operations consult PolicyRegistry.](/images/b20/b20-architecture-precompiles.png) + + +| Surface | Address | +|---|---| +| B20 Factory | `0xB20f000000000000000000000000000000000000` | +| ActivationRegistry | `0x8453000000000000000000000000000000000001` | +| PolicyRegistry | `0x8453000000000000000000000000000000000002` | + +These addresses are identical on every network where B20 is active. + +## Activation gates + +The ActivationRegistry is the chain-level feature flag surface. The factory checks activation before creating a token variant, and state-changing PolicyRegistry calls are activation-gated. + + +PolicyRegistry read functions are always callable. Integrations can safely call `isAuthorized`, `policyExists`, `policyAdmin`, and `pendingPolicyAdmin` without an activation write path. + + +## Address derivation + +B20 token addresses are deterministic and include the variant byte: + +```text +[10-byte B20 prefix][1-byte variant][9-byte keccak256(deployer, salt)] +``` + +You can identify a token's variant from the address without an RPC call by inspecting byte 10, zero-indexed: + +| Variant | Byte | Address shape | +|---|---:|---| +| Asset | `0x00` | `0xB200...` | +| Stablecoin | `0x01` | `0xB201...` | + +Use `IB20Factory.getB20Address(variant, deployer, salt)` to precompute the address and `isB20` / `isB20Initialized` to verify it. + +## What precompiles change for developers + +- Import interfaces from `base-std` instead of copying ABIs by hand. +- Use `StdPrecompiles` handles for the factory and registries. +- Do not expect explorer bytecode verification for token or registry addresses. +- Test with base-std mocks, `base-forge`, or `base-anvil` because stock EVM tooling does not know these precompiles by default. + + + + + diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes.mdx new file mode 100644 index 000000000..0fb26fe9d --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes.mdx @@ -0,0 +1,94 @@ +--- +title: "Policies & scopes" +description: "Learn how B20 policy scopes point to PolicyRegistry policies and gate transfers, mints, and seizures." +--- + +A B20 token does **not** hold a list of policy IDs. It has fixed policy scopes. Each scope stores exactly one `uint64` pointer into the singleton PolicyRegistry. + + +![B20 policies and scopes diagram: fixed token policy scopes store uint64 pointers to PolicyRegistry policies, and gated operations call isAuthorized before continuing or reverting.](/images/b20/b20-policies-and-scopes.png) + + +On a gated operation, the token reads the relevant scope, calls `PolicyRegistry.isAuthorized(policyId, account)`, and reverts with `PolicyForbids` or a seize-specific error when the policy result does not permit the action. + +## Policy scopes + +| Scope | Checked account | Gated operation | +|---|---|---| +| `TRANSFER_SENDER_POLICY` | `from` | `transfer`, `transferFrom`, and memo variants | +| `TRANSFER_RECEIVER_POLICY` | `to` | `transfer`, `transferFrom`, and memo variants | +| `TRANSFER_EXECUTOR_POLICY` | `msg.sender` | `transferFrom` only when `msg.sender != from` | +| `MINT_RECEIVER_POLICY` | `to` | `mint` and `mintWithMemo` | +| `SEIZE_HOLDER_POLICY` | `from` | `seizeWithMemo`; the holder is seizable only when not authorized by this policy | + +`approve` and `permit` are not policy-gated. Only balance movement is checked. + + +Every scope defaults to `ALWAYS_ALLOW` (`0`) at creation. An unattended B20 deployment is fully open, and no account is seizable until `SEIZE_HOLDER_POLICY` is intentionally configured. + + +## Policy types + +| Type | Behavior | +|---|---| +| `BLOCKLIST` | Accounts are authorized by default; listed accounts are denied. | +| `ALLOWLIST` | Accounts are denied by default; listed accounts are authorized. | +| `UNION` | Composite policy: account is authorized if any child policy authorizes it. | +| `INTERSECT` | Composite policy: account is authorized only if every child policy authorizes it. | + +Composite policies combine existing simple `ALLOWLIST` and `BLOCKLIST` policies. Child policies must be simple policies, not other composites or built-ins. + +## Built-ins and ID anatomy + +Policy IDs are `uint64` values. The top byte is the `PolicyType`; the low 56 bits are a global counter. Counters `0` and `1` are reserved for built-ins, and custom policy creation starts at counter `2`. + +| Constant | ID | Behavior | +|---|---:|---| +| `ALWAYS_ALLOW` | `0` | Authorizes every account. Default value for every scope. | +| `ALWAYS_BLOCK` | `(uint64(ALLOWLIST) << 56) \| 1` | Denies every account. | + + +`isAuthorized` never reverts on a non-existent policy ID. Malformed or uncreated IDs collapse to empty-set semantics: `ALLOWLIST` denies and `BLOCKLIST` allows. Validate `policyExists(policyId)` before binding a token scope. + + +```solidity +uint64 policyId = 0x0100000000000002; +require(StdPrecompiles.POLICY_REGISTRY.policyExists(policyId), "policy missing"); +IB20(token).updatePolicy(B20Constants.MINT_RECEIVER_POLICY, policyId); +``` + +## Registry administration + +Each policy has one admin. The current admin can: + +- Update allowlist, blocklist, or composite membership. +- Stage a two-step admin transfer with `stageUpdateAdmin`. +- Permanently renounce policy administration with `renounceAdmin`. + + +`renounceAdmin(policyId)` freezes the policy forever. Membership and child-policy updates become impossible. + + +## Read a token's configured policies + +```solidity +bytes32[5] memory scopes = [ + B20Constants.TRANSFER_SENDER_POLICY, + B20Constants.TRANSFER_RECEIVER_POLICY, + B20Constants.TRANSFER_EXECUTOR_POLICY, + B20Constants.MINT_RECEIVER_POLICY, + B20Constants.SEIZE_HOLDER_POLICY +]; + +for (uint256 i; i < scopes.length; i++) { + uint64 id = IB20(token).policyId(scopes[i]); + bool exists = id == 0 || id == ((uint64(uint8(IPolicyRegistry.PolicyType.ALLOWLIST)) << 56) | 1) + || StdPrecompiles.POLICY_REGISTRY.policyExists(id); + require(exists, "scope points to missing policy"); +} +``` + + + + + diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control.mdx new file mode 100644 index 000000000..c8114d294 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control.mdx @@ -0,0 +1,67 @@ +--- +title: "Roles & access control" +description: "Understand B20 roles, access-control gates, user-defined roles, and irreversible admin renunciation." +--- + +B20 extends the OpenZeppelin `AccessControl` model with a fixed base surface. User-defined roles can exist, but B20 only enforces the built-in roles listed here. + +## Base roles + +| Role | Gates | +|---|---| +| `DEFAULT_ADMIN_ROLE` | Role grants/revokes, `setRoleAdmin`, `updatePolicy`, `updateSupplyCap` | +| `MINT_ROLE` | `mint`, `mintWithMemo` | +| `BURN_ROLE` | `burn`, `burnWithMemo` | +| `BURN_BLOCKED_ROLE` | Deprecated back-compat `burnBlocked` implementation only | +| `SEIZE_ROLE` | `seizeWithMemo` | +| `PAUSE_ROLE` | `pause` | +| `UNPAUSE_ROLE` | `unpause` | +| `METADATA_ROLE` | `updateName`, `updateSymbol`, `updateContractURI` | +| `OPERATOR_ROLE` | Asset-only multiplier and announcement operations | + + +User-defined roles have no built-in enforcement. You can create them with `setRoleAdmin` and grant them with `grantRole`, but B20 token functions only check the built-in roles. + + +## Admin renunciation + +B20 intentionally diverges from the default OpenZeppelin last-admin behavior. The last `DEFAULT_ADMIN_ROLE` holder cannot renounce or be revoked through normal role methods; those calls revert with `LastAdminCannotRenounce`. + +Use `renounceLastAdmin()` to permanently move the token to an admin-less state. A token can also launch admin-less by passing `initialAdmin == address(0)` at creation. + +After admin renunciation: + +- `DEFAULT_ADMIN_ROLE`-gated operations are permanently uncallable. +- Existing operational role grants continue to work. +- Admin resurrection is blocked; `grantRole`, `revokeRole`, and `setRoleAdmin` revert even through custom admin-role chains. + +## Pre-renunciation checklist + +Configure every surviving operational path before renouncing the last admin. + +```solidity +IB20 token = IB20(tokenAddress); + +// 1. Grant roles that must survive admin renunciation. +token.grantRole(B20Constants.MINT_ROLE, issuerOps); +token.grantRole(B20Constants.PAUSE_ROLE, incidentResponder); +token.grantRole(B20Constants.UNPAUSE_ROLE, governanceSafe); +token.grantRole(B20Constants.SEIZE_ROLE, complianceSafe); + +// 2. Bind policies and supply cap while DEFAULT_ADMIN_ROLE still exists. +token.updatePolicy(B20Constants.MINT_RECEIVER_POLICY, mintAllowlistPolicyId); +token.updatePolicy(B20Constants.SEIZE_HOLDER_POLICY, seizeHolderPolicyId); +token.updateSupplyCap(1_000_000e18); + +// 3. Permanently remove token administration. +token.renounceLastAdmin(); +``` + + +For an admin-less launch from creation, put the required grants and policy updates in `initCalls`, then set `initialAdmin` to `address(0)` in the create params. + + + + + + diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle.mdx new file mode 100644 index 000000000..042adf71c --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle.mdx @@ -0,0 +1,102 @@ +--- +title: "Token lifecycle" +description: "Follow a B20 token from factory creation through initCalls, operation, pausing, memos, seizures, and admin renunciation." +--- + +A B20 token moves through four practical phases: create, bootstrap, operate, and optionally renounce administration. + +## Create + +All B20 tokens are created through the singleton factory: + +```solidity +address token = StdPrecompiles.B20_FACTORY.createB20(variant, salt, params, initCalls); +``` + +- `variant` is `ASSET` or `STABLECOIN`. +- `salt` contributes to deterministic address derivation. +- `params` are versioned by a leading byte and encoded with `B20FactoryLib`. +- `initCalls` are ABI-encoded calls that run on the new token before the factory returns. + +The factory reverts with `FeatureNotActivated` if the requested token variant is not active on the chain. + +## Bootstrap with initCalls + +During the creation transaction, factory-originated initCalls bypass token role gates and transfer-side policy gates. This lets you configure policy scopes, grant roles, set caps, and seed balances atomically. + +The bypass is deliberately limited: + +- `MINT_RECEIVER_POLICY` is always enforced, including during initCalls. +- Pause state is never bypassed. +- Token invariants such as supply cap and balance accounting are never bypassed. + + +If you start the token paused, put `pause(...)` late in the initCalls array so earlier bootstrap operations are not blocked by your own pause. + + +## Operate + +Common issuer operations include: + +- Minting with `MINT_ROLE`, subject to `MINT_RECEIVER_POLICY` and `supplyCap`. +- Burning from the caller with `BURN_ROLE`. +- Seizing with `SEIZE_ROLE` through `seizeWithMemo` when the holder is denied by `SEIZE_HOLDER_POLICY`. +- Pausing `TRANSFER`, `MINT`, `BURN`, or `SEIZE` independently. +- Updating name, symbol, and contract URI with `METADATA_ROLE`. + +The `PausableFeature` enum is append-only. Integrators should handle unknown future values defensively when switch-casing over returned pause data. + +## Freeze and seize + +`seizeWithMemo` transfers a holder's balance to a destination in one admin operation. It skips allowance and transfer policies; its membership check is `SEIZE_HOLDER_POLICY`. + +```solidity +// Configure this policy so denied accounts are eligible for seizure. +token.updatePolicy(B20Constants.SEIZE_HOLDER_POLICY, seizeHolderPolicyId); + +// Later, an authorized operator seizes from a holder denied by SEIZE_HOLDER_POLICY. +vm.prank(complianceOperator); +token.seizeWithMemo(holder, destination, amount, bytes32("case-2026-08")); +``` + +The transaction emits `Transfer`, `Memo`, and `Seized` in order. + +## Pause and unpause + +```solidity +IB20.PausableFeature[] memory features = new IB20.PausableFeature[](2); +features[0] = IB20.PausableFeature.TRANSFER; +features[1] = IB20.PausableFeature.SEIZE; + +token.pause(features); // requires PAUSE_ROLE +token.unpause(features); // requires UNPAUSE_ROLE +``` + +Paused operations revert with `ContractPaused(feature)`. + +## Memos + +Memos are `bytes32` payloads emitted immediately after the primary event of a memo-enabled operation. + +Memo entrypoints: + +- `transferWithMemo` +- `transferFromWithMemo` +- `mintWithMemo` +- `burnWithMemo` +- `seizeWithMemo` + +Indexers join a `Memo` log to the operation it annotates with `(transactionHash, logIndex - 1)`. + +```ts +const memoLogs = parseEventLogs({ abi, logs: receipt.logs, eventName: 'Memo' }); +for (const memoLog of memoLogs) { + const parentLog = receipt.logs[memoLog.logIndex - 1]; + console.log({ memo: memoLog.args.memo, parentTopic0: parentLog.topics[0] }); +} +``` + +## Admin renunciation + +If an issuer wants an admin-less token, it must grant surviving operational roles, bind required policies, and set the supply cap before calling `renounceLastAdmin()`. After renunciation, admin-gated configuration cannot be restored. + diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin.mdx new file mode 100644 index 000000000..f1e8d6d49 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin.mdx @@ -0,0 +1,58 @@ +--- +title: "Variants: Asset vs Stablecoin" +description: "Choose between B20 Asset and Stablecoin variants and understand their variant-specific behavior." +--- + +B20 has two variants. Both share the base ERC-20-compatible B20 surface, roles, policy scopes, memos, pausing, supply caps, and permit. + +## Decision table + +| Capability | Asset | Stablecoin | +|---|---|---| +| Decimals | Configurable 6-18 at creation | Fixed `6` | +| Variant byte | `0x00` | `0x01` | +| Address shape | `0xB200...` | `0xB201...` | +| Extra metadata | Yes | No | +| Scaled balance multiplier | Yes | No | +| Announcements | Yes | No | +| Batch mint | Yes | No | +| Currency code | No | Yes | + +## Asset extras + +### Multiplier + +Asset tokens expose a WAD-precision multiplier for scaled UI balances. Raw balances remain unchanged; scaled balances are derived at read time. + + +Do not assume `balanceOf(account)` and `scaledBalanceOf(account)` are the same display unit. Integrations that show asset balances must decide whether they use raw ERC-20 balances or the scaled UI view. + + +Routine corporate actions should use scheduled multiplier updates when possible. Instant `updateMultiplier` is an emergency override. + +### Announcements + +`announce(internalCalls, id, description, uri)` emits `Announcement`, executes internal calls, then emits `EndAnnouncement`. Announcement IDs are unique forever. Non-panic inner reverts are wrapped in `InternalCallFailed`. + +Use announcements to wrap holder-impacting operations such as batch minting or multiplier changes. + +### Batch mint + +`batchMint(recipients, amounts)` mints to multiple recipients atomically. Any failing element reverts the whole batch. It is gated by `MINT_ROLE` and should be wrapped in `announce` when disclosure is required. + +### Extra metadata + +Asset tokens can store issuer-defined string key/value metadata. Setting an empty value deletes the entry. + +## Stablecoin currency + +Stablecoin tokens expose `currency()`, set once at creation. The code must contain uppercase `A`-`Z` characters only. + + +The currency code is self-declared and not verified against any external registry. + + + + + + diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/implementation/deployment-and-initcalls-encoding.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/implementation/deployment-and-initcalls-encoding.mdx new file mode 100644 index 000000000..99d47ca4c --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/implementation/deployment-and-initcalls-encoding.mdx @@ -0,0 +1,93 @@ +--- +title: "Deployment & initCalls encoding" +description: "Use B20FactoryLib to encode createB20 params and initCalls for atomic B20 token deployment." +--- + +Use `B20FactoryLib` to produce canonical factory params and initCalls. The factory rejects malformed or unsupported params, so avoid hand-encoding unless you are testing decoder failures. + +## Deploy an Asset token + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import {Script} from "forge-std/Script.sol"; +import {IB20Factory} from "base-std/interfaces/IB20Factory.sol"; +import {B20Constants} from "base-std/lib/B20Constants.sol"; +import {B20FactoryLib} from "base-std/lib/B20FactoryLib.sol"; +import {StdPrecompiles} from "base-std/StdPrecompiles.sol"; + +contract DeployB20 is Script { + function run() external returns (address token) { + address admin = vm.envAddress("ADMIN"); + address minter = vm.envAddress("MINTER"); + bytes32 salt = keccak256("my-token-v1"); + + bytes memory params = B20FactoryLib.encodeAssetCreateParams("My Token", "MYT", admin, 18); + + bytes[] memory initCalls = new bytes[](3); + initCalls[0] = B20FactoryLib.encodeGrantRole(B20Constants.MINT_ROLE, minter); + initCalls[1] = B20FactoryLib.encodeGrantRole(B20Constants.PAUSE_ROLE, admin); + initCalls[2] = B20FactoryLib.encodeUpdateSupplyCap(1_000_000e18); + + vm.broadcast(); + token = StdPrecompiles.B20_FACTORY.createB20( + IB20Factory.B20Variant.ASSET, + salt, + params, + initCalls + ); + } +} +``` + +## Pre-derive the token address + +Some initCalls or offchain systems need the token address before deployment. + +```solidity +address predicted = StdPrecompiles.B20_FACTORY.getB20Address( + IB20Factory.B20Variant.ASSET, + deployer, + salt +); +``` + +After creation, verify with: + +```solidity +require(StdPrecompiles.B20_FACTORY.isB20(predicted), "not B20-shaped"); +require(StdPrecompiles.B20_FACTORY.isB20Initialized(predicted), "not initialized"); +``` + +## initCalls rules + +During initCalls, factory-originated calls bypass role gates and transfer-side policy gates. They do not bypass: + +- `MINT_RECEIVER_POLICY` +- Pause state +- Supply cap or other accounting invariants + +That means ordering matters. Configure mint receiver policy before minting only if the mint recipient is authorized by that policy. + +## Admin-less deployment + +To deploy admin-less from block one, set `initialAdmin` to `address(0)` and put all required role grants, policy bindings, and cap configuration into initCalls. + +```solidity +bytes memory params = B20FactoryLib.encodeAssetCreateParams("Adminless", "ADL", address(0), 18); + +bytes[] memory initCalls = new bytes[](3); +initCalls[0] = B20FactoryLib.encodeGrantRole(B20Constants.MINT_ROLE, minter); +initCalls[1] = B20FactoryLib.encodeUpdatePolicy(B20Constants.MINT_RECEIVER_POLICY, mintPolicyId); +initCalls[2] = B20FactoryLib.encodeUpdateSupplyCap(1_000_000e18); +``` + + +There is no later admin recovery path for an admin-less token. Missing policies or roles cannot be added after deployment. + + + + + + diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/implementation/policy-configuration-in-code.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/implementation/policy-configuration-in-code.mdx new file mode 100644 index 000000000..2d3de5f7a --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/implementation/policy-configuration-in-code.mdx @@ -0,0 +1,129 @@ +--- +title: "Policy configuration in code" +description: "Read, audit, create, update, and bind B20 PolicyRegistry policies from Solidity." +--- + +B20 policy configuration has two parts: + +1. Read each token scope with `token.policyId(scope)`. +2. Read or write the pointed-to policy in the singleton PolicyRegistry. + +## Audit a token's policy scopes + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import {Script, console2} from "forge-std/Script.sol"; +import {IB20} from "base-std/interfaces/IB20.sol"; +import {IPolicyRegistry} from "base-std/interfaces/IPolicyRegistry.sol"; +import {B20Constants} from "base-std/lib/B20Constants.sol"; +import {StdPrecompiles} from "base-std/StdPrecompiles.sol"; + +contract AuditB20Policies is Script { + bytes32[5] internal scopes = [ + B20Constants.TRANSFER_SENDER_POLICY, + B20Constants.TRANSFER_RECEIVER_POLICY, + B20Constants.TRANSFER_EXECUTOR_POLICY, + B20Constants.MINT_RECEIVER_POLICY, + B20Constants.SEIZE_HOLDER_POLICY + ]; + + function run(address tokenAddress, address accountToCheck) external view { + IB20 token = IB20(tokenAddress); + IPolicyRegistry registry = StdPrecompiles.POLICY_REGISTRY; + + for (uint256 i; i < scopes.length; i++) { + uint64 id = token.policyId(scopes[i]); + console2.logBytes32(scopes[i]); + console2.log("policyId", id); + console2.log("exists", id == 0 || registry.policyExists(id)); + console2.log("authorized", registry.isAuthorized(id, accountToCheck)); + console2.log("admin", registry.policyAdmin(id)); + console2.log("pendingAdmin", registry.pendingPolicyAdmin(id)); + } + } +} +``` + +Interpretation: + +| Value | Meaning | +|---|---| +| `0` | `ALWAYS_ALLOW`; the scope is wide open. | +| Top byte `0` | `BLOCKLIST`; empty/uncreated behaves authorized by default. | +| Top byte `1` | `ALLOWLIST`; empty/uncreated behaves denied by default. | +| Top byte `2` | `UNION`; composite policy. | +| Top byte `3` | `INTERSECT`; composite policy. | + + +Validate `policyExists(policyId)` before binding a scope. `isAuthorized` does not revert for missing IDs. + + +## Create and bind a simple policy + +```solidity +IPolicyRegistry registry = StdPrecompiles.POLICY_REGISTRY; +IB20 token = IB20(tokenAddress); + +address[] memory initialMembers = new address[](1); +initialMembers[0] = treasury; + +uint64 mintAllowlist = registry.createPolicyWithAccounts( + policyAdmin, + IPolicyRegistry.PolicyType.ALLOWLIST, + initialMembers +); + +require(registry.policyExists(mintAllowlist), "policy missing"); +token.updatePolicy(B20Constants.MINT_RECEIVER_POLICY, mintAllowlist); +``` + +## Update membership + +```solidity +address[] memory accounts = new address[](2); +accounts[0] = alice; +accounts[1] = bob; + +// ALLOWLIST: true adds authorization; false removes it. +registry.updateAllowlist(mintAllowlist, true, accounts); + +// BLOCKLIST: true blocks; false unblocks. +registry.updateBlocklist(transferBlocklist, true, accounts); +``` + +## Create a composite policy + +```solidity +uint64[] memory children = new uint64[](2); +children[0] = kycAllowlist; +children[1] = sanctionsBlocklist; + +uint64 policyId = registry.createCompositePolicy( + policyAdmin, + IPolicyRegistry.PolicyType.INTERSECT, + children +); + +token.updatePolicy(B20Constants.TRANSFER_RECEIVER_POLICY, policyId); +``` + +## Transfer or freeze policy administration + +```solidity +// Current admin stages a transfer. +registry.stageUpdateAdmin(policyId, newAdmin); + +// Pending admin accepts it. +vm.prank(newAdmin); +registry.finalizeUpdateAdmin(policyId); + +// Irreversible: freezes policy membership forever. +registry.renounceAdmin(policyId); +``` + + + + + diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/implementation/testing-against-precompiles.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/implementation/testing-against-precompiles.mdx new file mode 100644 index 000000000..fbd825d11 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/implementation/testing-against-precompiles.mdx @@ -0,0 +1,62 @@ +--- +title: "Testing against precompiles" +description: "Test B20 code with base-std mocks, base-forge in-process live precompiles, and forked base-anvil nodes." +--- + +B20 precompile tests run in three modes. Pick the lowest-cost mode that catches the behavior you need. + +## Mode 1: Solidity mocks with stock Forge + +Use this for fast unit tests that do not need the Rust precompile backend. + +```bash +forge test +``` + +`base-std` provides mocks under `test/lib/mocks/`. Test bases can etch these mocks at the fixed precompile addresses so calls to `StdPrecompiles` work in stock Foundry. + +## Mode 2: Live precompiles in-process with base-forge + +Use this to run against the Rust precompile implementation without running a node. + +```bash +curl -L https://raw.githubusercontent.com/base/base-anvil/HEAD/foundryup/install | bash +base-foundryup +base-forge test +``` + +`base-forge` hosts the precompiles inside Forge's EVM and seeds gated features active for the no-node path. `BaseTest` in `base-std` auto-detects whether it is running live precompiles or reference mocks. + +## Mode 3: Forked base-anvil node + +Use this when you need genuine RPC/fork behavior against a local node. + +```bash +make smoke-setup +ANVIL_BIN="$HOME/.foundry/versions/base-nightly/anvil" \ +FORGE_BIN="$HOME/.foundry/versions/base-nightly/forge" \ + make fork-tests +``` + +A `base-anvil` node starts with gated features inactive, like a real chain before feature activation. Activate the needed features before testing deployment or state-changing registry paths. + +## Why LIVE_PRECOMPILES matters + +When a test etches mock bytecode at a precompile address, the EVM executes the etched bytecode before consulting native precompile dispatch. If you enable Base precompile dispatch but still etch mocks, tests can falsely pass against Solidity mocks while you think they are using Rust precompiles. + +Use `LIVE_PRECOMPILES=true` in fork profiles that should skip mock etching and call the native backend. + +```bash +LIVE_PRECOMPILES=true FOUNDRY_PROFILE=fork forge test --fork-url http://localhost:8546 +``` + +## Failure diagnosis + +1. **Activation:** Did the chain activate the relevant B20 or registry feature? +2. **Deployment:** Is the target address a fixed precompile or an initialized B20 token? +3. **Divergence:** If mocks pass and live precompiles fail, compare the failing selector, storage slot, and event/revert order against `base-std` tests. + + + + + diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/implementation/working-with-base-std.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/implementation/working-with-base-std.mdx new file mode 100644 index 000000000..a62858b93 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/implementation/working-with-base-std.mdx @@ -0,0 +1,71 @@ +--- +title: "Working with base-std" +description: "Install base-std and use StdPrecompiles, B20Constants, interfaces, and helper libraries for B20 development." +--- + +`base-std` is the Solidity source of truth for B20 interfaces, constants, factory encoders, and test mocks. + +## Install + +```bash +forge install base/base-std +``` + +Add remappings for source and test helpers: + +```toml foundry.toml +remappings = [ + "base-std/=lib/base-std/src/", + "base-std-test/=lib/base-std/test/" +] +``` + +Interfaces target `>=0.8.20 <0.9.0`. Reference implementations and tests in `base-std` pin Solidity `0.8.30`. + +## Use StdPrecompiles + +`StdPrecompiles.sol` exposes fixed precompile addresses and typed handles. + +```solidity +import {StdPrecompiles} from "base-std/StdPrecompiles.sol"; +import {IB20Factory} from "base-std/interfaces/IB20Factory.sol"; + +address predicted = StdPrecompiles.B20_FACTORY.getB20Address( + IB20Factory.B20Variant.ASSET, + deployer, + salt +); +``` + +## Use canonical constants + +Use `B20Constants.sol` instead of redefining role and scope hashes. + +```solidity +import {B20Constants} from "base-std/lib/B20Constants.sol"; + +bytes32 mintRole = B20Constants.MINT_ROLE; +bytes32 mintScope = B20Constants.MINT_RECEIVER_POLICY; +``` + +## Where things live + +| Path | Purpose | +|---|---| +| `src/StdPrecompiles.sol` | Fixed precompile addresses and typed handles | +| `src/interfaces/` | Solidity interfaces for B20, variants, factory, and registries | +| `src/lib/B20Constants.sol` | Role, policy-scope, feature, decimal, and supply-cap constants | +| `src/lib/B20FactoryLib.sol` | Pure encoders for factory params and initCalls | +| `test/lib/mocks/` | Solidity mocks for stock Foundry tests | + +## What not to do + +- Do not hardcode precompile addresses in application code when `StdPrecompiles` is available. +- Do not copy interface files into your repo; import them to avoid version skew. +- Do not assume explorer verification exists for B20 precompile token addresses. +- Do not use stock `forge` alone when your test expects live precompile behavior. + + + + + diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/index.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/index.mdx new file mode 100644 index 000000000..1107e9b2c --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/index.mdx @@ -0,0 +1,223 @@ +--- +title: "B20 specification" +description: "Normative Beryl specification for Base's B20 native token standard, precompile registries, policy scopes, factory, and variants." +--- + + +This is the normative Beryl specification for B20. For developer-oriented concepts, implementation guides, and generated interface reference, start with the [B20 token standard docs](/base-chain/specs/upgrades/beryl/b20/specification/overview). + + +B20 is Base's native ERC-20-compatible token standard implemented as Rust precompiles. It adds chain-native roles, policy scopes, memos, pausing, supply caps, ERC-2612 `permit`, deterministic factory creation, and variant-specific surfaces for Asset and Stablecoin tokens. + +## ERC-20 Compatibility + +B20 is a superset of ERC-20. Standard ERC-20 calls and events keep selector and behavior parity for `transfer`, `transferFrom`, `approve`, `allowance`, `balanceOf`, `totalSupply`, `name`, `symbol`, `decimals`, `Transfer`, and `Approval`. + +B20-specific methods extend the standard without changing the ERC-20 surface. + +## Roles Model + +B20 uses an OpenZeppelin-style access-control model with fixed built-in roles. + +| Role | Gates | +|---|---| +| `DEFAULT_ADMIN_ROLE` | `grantRole`, `revokeRole`, `setRoleAdmin`, `updatePolicy`, `updateSupplyCap` | +| `MINT_ROLE` | `mint`, `mintWithMemo` | +| `BURN_ROLE` | `burn`, `burnWithMemo` | +| `BURN_BLOCKED_ROLE` | Deprecated back-compat `burnBlocked` path | +| `SEIZE_ROLE` | `seizeWithMemo` | +| `PAUSE_ROLE` | `pause` | +| `UNPAUSE_ROLE` | `unpause` | +| `METADATA_ROLE` | `updateName`, `updateSymbol`, `updateContractURI` | +| `OPERATOR_ROLE` | Asset-only multiplier and announcement operations | + +User-defined roles are supported by the role graph but have no built-in enforcement by B20 token functions. + +### Admin Renunciation + +The final `DEFAULT_ADMIN_ROLE` holder cannot be removed with normal `renounceRole` or `revokeRole`; both revert with `LastAdminCannotRenounce`. `renounceLastAdmin()` is the only normal path to permanently transition to admin-less operation. + +A token can launch admin-less by setting `initialAdmin == address(0)` at creation. After admin renunciation, `DEFAULT_ADMIN_ROLE`-gated functions are permanently uncallable and admin resurrection is blocked. + +## Policy Registry + +The PolicyRegistry is a singleton precompile that stores policies addressed by `uint64 policyId`. B20 tokens store policy IDs in fixed scopes and call `isAuthorized(policyId, account)` during gated operations. + +State-changing PolicyRegistry calls are ActivationRegistry-gated. Read functions are always callable. + +### Policy Types + +| PolicyType | Behavior | +|---|---| +| `BLOCKLIST` | Account is authorized unless listed. | +| `ALLOWLIST` | Account is authorized only if listed. | +| `UNION` | Composite: account is authorized if any child simple policy authorizes it. | +| `INTERSECT` | Composite: account is authorized only if every child simple policy authorizes it. | + +Composite policies reference existing simple `ALLOWLIST` or `BLOCKLIST` child policies. They cannot reference composites or built-ins as children. + +### Policy IDs + +Policy IDs are laid out as: + +```text +[top 8 bits: PolicyType][low 56 bits: counter] +``` + +Counters `0` and `1` are reserved for built-ins: + +| Built-in | Value | Behavior | +|---|---:|---| +| `ALWAYS_ALLOW` | `0` | Authorizes every account. | +| `ALWAYS_BLOCK` | `(uint64(ALLOWLIST) << 56) \| 1` | Denies every account. | + +Custom policy creation starts at counter `2`. + +### Admin Model + +Each policy has one admin. Admin transfer is two-step: `stageUpdateAdmin(policyId, newAdmin)` followed by `finalizeUpdateAdmin(policyId)` from the pending admin. `renounceAdmin(policyId)` permanently freezes membership or child-policy updates for that policy. + +### Read Interface + +| Method | Description | +|---|---| +| `isAuthorized(policyId, account)` | Returns authorization and never reverts for uncreated IDs. | +| `policyExists(policyId)` | Returns whether a policy exists. | +| `policyAdmin(policyId)` | Returns the current admin or zero. | +| `pendingPolicyAdmin(policyId)` | Returns the staged admin or zero. | +| `compositePolicyChildIds(policyId)` | Returns child policy IDs for composite policies. | + +`isAuthorized` collapses uncreated IDs to empty-set semantics. Callers that write policy IDs into token scopes must validate `policyExists` unless writing a built-in. + +## Policy Integration + +B20 tokens store one `uint64 policyId` per supported policy scope. + +| Scope | Checked account | Operation | +|---|---|---| +| `TRANSFER_SENDER_POLICY` | `from` | `transfer`, `transferFrom`, and memo variants | +| `TRANSFER_RECEIVER_POLICY` | `to` | `transfer`, `transferFrom`, and memo variants | +| `TRANSFER_EXECUTOR_POLICY` | `msg.sender` | `transferFrom` when `msg.sender != from` | +| `MINT_RECEIVER_POLICY` | `to` | `mint`, `mintWithMemo` | +| `SEIZE_HOLDER_POLICY` | `from` | `seizeWithMemo`; holder is seizable only when not authorized | + +All scopes default to `ALWAYS_ALLOW` at creation. `approve` and `permit` are not policy-gated. + +## Mint + +`mint` and `mintWithMemo` are gated by `MINT_ROLE`, checked against `MINT_RECEIVER_POLICY`, and bounded by `supplyCap`. + +## Burn + +`burn` and `burnWithMemo` burn from the caller and are gated by `BURN_ROLE`. + +The legacy `burnBlocked` path is deprecated and retained for backwards compatibility. New seizure flows use `seizeWithMemo`. + +## Seize + +`seizeWithMemo(from, to, amount, memo)` transfers balance from `from` to `to` and emits `Transfer`, `Memo`, and `Seized`. It is gated by `SEIZE_ROLE`, skips allowance and transfer policies, and requires `from` to be denied by `SEIZE_HOLDER_POLICY`. + +## Supply Cap + +The supply cap is optional. The sentinel `type(uint128).max` indicates no practical cap and is also the maximum permitted `totalSupply`. `updateSupplyCap` is admin-gated and reverts with `InvalidSupplyCap` if the proposed cap is below current supply or above the maximum. + +## Memos + +Memo-enabled operations emit `Memo(address indexed caller, bytes32 indexed memo)` immediately after the primary operation event. Indexers join memo logs to the parent log with `(transactionHash, logIndex - 1)`. + +Memo entrypoints include `transferWithMemo`, `transferFromWithMemo`, `mintWithMemo`, `burnWithMemo`, and `seizeWithMemo`. + +## Pause + +B20 supports granular pausing by `PausableFeature`: `TRANSFER`, `MINT`, `BURN`, and `SEIZE`. The enum is append-only. `pause` is gated by `PAUSE_ROLE`; `unpause` is gated by `UNPAUSE_ROLE`. + +## ERC-2612 Permit / EIP-712 + +B20 implements ERC-2612 signed approvals with an EIP-712 domain shaped as `(name, version, chainId, verifyingContract)`, with `version` fixed at `"1"`. `updateName` rotates the domain separator and emits `EIP712DomainChanged`. ERC-1271 contract signatures are not accepted. + +## Contract URI (ERC-7572) + +`contractURI()` returns offchain token metadata per ERC-7572. `updateContractURI(newURI)` is gated by `METADATA_ROLE`. + +## Metadata Updates + +`updateName` and `updateSymbol` are gated by `METADATA_ROLE`. `updateName` also rotates the EIP-712 domain separator. + +## Factory + +All B20 tokens are created through the singleton factory precompile: + +```solidity +createB20(B20Variant variant, bytes32 salt, bytes params, bytes[] initCalls) +``` + +| Parameter | Description | +|---|---| +| `variant` | `ASSET` or `STABLECOIN` | +| `salt` | Caller-chosen entropy for deterministic address derivation | +| `params` | Versioned, variant-specific create params | +| `initCalls` | ABI-encoded bootstrap calls dispatched to the new token | + +The factory reverts with `FeatureNotActivated` if the requested variant is not activated. + +### Address Derivation + +B20 token addresses are deterministic and encode the variant: + +```text +[10-byte B20 prefix][1-byte variant][9-byte keccak256(deployer, salt)] +``` + +`getB20Address`, `isB20`, and `isB20Initialized` are available on the factory. + +### initCalls Semantics + +During initCalls, factory-originated calls bypass token role gates and transfer-side policy gates: `TRANSFER_SENDER_POLICY`, `TRANSFER_RECEIVER_POLICY`, and `TRANSFER_EXECUTOR_POLICY`. + +The bypass does not apply to `MINT_RECEIVER_POLICY`, pause state, supply cap, or balance accounting invariants. The bootstrap window closes when `createB20` returns. + +## Variants + +| Variant | Byte | Decimals | Additional surface | +|---|---:|---|---| +| `ASSET` | `0x00` | 6-18, configured at creation | Multiplier, announcements, batch mint, extra metadata | +| `STABLECOIN` | `0x01` | Fixed 6 | `currency()` | + +### Asset + +Asset tokens add `OPERATOR_ROLE`, scaled UI balance support, scheduled and instant multiplier updates, announcements, batch minting, and extra metadata. + +#### Multiplier + +The multiplier is WAD-precision and scales UI balance reads while raw balances remain unchanged. + +#### Announcements + +`announce` emits `Announcement`, dispatches internal calls, and emits `EndAnnouncement`. Announcement IDs are unique forever. Non-panic inner reverts are wrapped in `InternalCallFailed`. + +#### Batch Mint + +`batchMint` mints to parallel recipient and amount arrays atomically and is gated by `MINT_ROLE`. + +#### Extra Metadata + +`extraMetadata(key)` reads issuer-defined metadata. `updateExtraMetadata(key, value)` writes it and deletes the entry when `value` is empty. + +### Stablecoin + +Stablecoin tokens add `currency()`, set once at creation. The value must contain uppercase `A`-`Z` characters only and is self-declared, not externally verified. + +## Precompile addresses + +| Precompile | Address | +|---|---| +| B20Factory | `0xB20f000000000000000000000000000000000000` | +| ActivationRegistry | `0x8453000000000000000000000000000000000001` | +| PolicyRegistry | `0x8453000000000000000000000000000000000002` | + +## Developer documentation + +- [B20 overview](/base-chain/specs/upgrades/beryl/b20/specification/overview) +- [Policies & scopes](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) +- [Policy configuration in code](/base-chain/specs/upgrades/beryl/b20/specification/implementation/policy-configuration-in-code) +- [Generated reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/overview.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/overview.mdx new file mode 100644 index 000000000..e698b3af2 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/overview.mdx @@ -0,0 +1,46 @@ +--- +title: "B20 token standard" +description: "Build with Base-native B20 tokens: ERC-20 compatible precompile tokens with roles, policy scopes, memos, supply caps, pausing, and variants." +--- + +B20 is Base's native token standard: an ERC-20 superset implemented as Rust precompiles. Standard ERC-20 calls such as `transfer`, `transferFrom`, `approve`, `balanceOf`, and `allowance` work unchanged, so existing wallets, indexers, and app integrations can treat a B20 token like an ERC-20 token. + +B20 adds issuer-grade controls at the chain level: policy-gated transfers and mints, role-based administration, granular pausing, supply caps, memos, ERC-2612 `permit`, and variant-specific features for assets and stablecoins. + +```mermaid +flowchart LR + Factory[B20 Factory\n0xB20f...0000] -->|createB20| Token[B20 token\n0xB200... or 0xB201...] + Token -->|policyId(scope)| Policy[PolicyRegistry\n0x8453...0002] + Policy -->|writes gated by| Activation[ActivationRegistry\n0x8453...0001] + Factory -->|feature check| Activation +``` + +## Choose your path + + + + Create a B20 token with the factory and mint the first supply. + + + Learn how token policy scopes point to PolicyRegistry entries. + + + Copy precompile addresses, role IDs, policy scopes, variant bytes, and sentinels. + + + +## Variants + +| Variant | Decimals | Address byte | Use when | +|---|---:|---:|---| +| Asset | 6-18, configured at creation | `0x00` | You need asset features such as scaled balances, announcements, batch minting, or extra metadata. | +| Stablecoin | Fixed `6` | `0x01` | You need a fixed-decimal token with a self-declared currency code. | + +## Learn the model + +- [Architecture & precompiles](/base-chain/specs/upgrades/beryl/b20/specification/concepts/architecture-and-precompiles): why B20 is configured through fixed precompile surfaces instead of deployed bytecode. +- [Policies & scopes](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes): how token scopes point to registry policies and gate operations. +- [Roles & access control](/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control): who can mint, pause, seize, change metadata, and renounce administration. +- [Token lifecycle](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle): how creation, initCalls, operation, and admin renunciation fit together. +- [Variants: Asset vs Stablecoin](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin): how to choose a token variant. + diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses.mdx new file mode 100644 index 000000000..9e9b7832f --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses.mdx @@ -0,0 +1,90 @@ +--- +title: "Constants & addresses" +description: "Copy B20 precompile addresses, roles, policy scopes, variant bytes, policy IDs, and supply-cap constants." +--- + +Use `StdPrecompiles.sol` and `B20Constants.sol` from `base-std` as the canonical Solidity source. This page lists the same values for quick reference. + +## Precompile addresses + +These addresses are identical on every network where B20 is active. + +| Surface | Address | +|---|---| +| B20 Factory | `0xB20f000000000000000000000000000000000000` | +| ActivationRegistry | `0x8453000000000000000000000000000000000001` | +| PolicyRegistry | `0x8453000000000000000000000000000000000002` | + +## Roles + +| Role | Solidity constant | +|---|---| +| Default admin | `bytes32(0)` | +| Mint | `keccak256("MINT_ROLE")` | +| Burn | `keccak256("BURN_ROLE")` | +| Deprecated blocked burn | `keccak256("BURN_BLOCKED_ROLE")` | +| Seize | `keccak256("SEIZE_ROLE")` | +| Pause | `keccak256("PAUSE_ROLE")` | +| Unpause | `keccak256("UNPAUSE_ROLE")` | +| Metadata | `keccak256("METADATA_ROLE")` | +| Asset operator | `keccak256("OPERATOR_ROLE")` | + +## Policy scopes + +| Scope | Solidity constant | +|---|---| +| Transfer sender | `keccak256("TRANSFER_SENDER_POLICY")` | +| Transfer receiver | `keccak256("TRANSFER_RECEIVER_POLICY")` | +| Transfer executor | `keccak256("TRANSFER_EXECUTOR_POLICY")` | +| Mint receiver | `keccak256("MINT_RECEIVER_POLICY")` | +| Seize holder | `keccak256("SEIZE_HOLDER_POLICY")` | + +## Policy IDs + +| Name | Value | +|---|---| +| `ALWAYS_ALLOW` | `0` | +| `ALWAYS_BLOCK` | `(uint64(uint8(IPolicyRegistry.PolicyType.ALLOWLIST)) << 56) \| 1` | + +Custom policy IDs use this layout: + +```text +[8-bit PolicyType][56-bit counter] +``` + +Policy type bytes: + +| PolicyType | Byte | +|---|---:| +| `BLOCKLIST` | `0x00` | +| `ALLOWLIST` | `0x01` | +| `UNION` | `0x02` | +| `INTERSECT` | `0x03` | + +## Variant bytes + +| Variant | Byte | Address shape | +|---|---:|---| +| `ASSET` | `0x00` | `0xB200...` | +| `STABLECOIN` | `0x01` | `0xB201...` | + +## Supply and decimals + +| Constant | Value | +|---|---:| +| Minimum Asset decimals | `6` | +| Maximum Asset decimals | `18` | +| Maximum supply cap / no-cap sentinel | `type(uint128).max` | +| All features paused bitmask | `15` (`TRANSFER | MINT | BURN | SEIZE`) | + +## Imports + +```solidity +import {StdPrecompiles} from "base-std/StdPrecompiles.sol"; +import {B20Constants} from "base-std/lib/B20Constants.sol"; +``` + + + + + diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/errors-and-events-index.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/errors-and-events-index.mdx new file mode 100644 index 000000000..4ed912779 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/errors-and-events-index.mdx @@ -0,0 +1,101 @@ +--- +title: "Errors & events index" +description: "Reverse lookup B20 errors and events by selector or topic." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Error selectors are 4 bytes; event topics are 32 bytes. + + +## Index + +| Type | Name | Selector / topic0 | Interface | Meaning | +|---|---|---|---|---| +| error | `AccessControlBadConfirmation` | `0x6697b232` | `IB20` | The `callerConfirmation` argument to `renounceRole` was not `msg.sender`. | +| error | `AccessControlUnauthorizedAccount` | `0xe2517d3f` | `IB20` | `account` does not hold `neededRole`. | +| error | `AccountNotBlocked` | `0x64a5cb46` | `IB20` | The deprecated `burnBlocked` was called against a `from` that is currently authorized under | +| error | `AccountNotSeizable` | `0x91dbbc8d` | `IB20` | `seizeWithMemo` was called against a `from` that is currently authorized under | +| event | `AllowlistUpdated` | `0x18c46532f90187ba11e436e21da087b684801d7f0787f2043f26f079c91e9ef0` | `IPolicyRegistry` | One or more accounts had their ALLOWLIST membership set to `allowed` in a single batch. | +| error | `AlreadyActivated` | `0x866b0041` | `IActivationRegistry` | Feature is already activated. | +| event | `Announcement` | `0xccebf8218a62875909564adef86a6f4df81503cb617221e793357d62f8e813f7` | `IB20Asset` | Emitted by `announce` to open an announcement bracket. | +| error | `AnnouncementIdAlreadyUsed` | `0xd10b3c9e` | `IB20Asset` | `announce` was called with an `id` that has already been consumed. | +| error | `AnnouncementInProgress` | `0x5c5f0829` | `IB20Asset` | An inner call dispatched by `announce` tried to re-invoke `announce`. | +| event | `Approval` | `0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925` | `IB20` | ERC-20 approval event. Emitted by `approve` and `permit`. | +| event | `B20Created` | `0x86ee7a93da43b07286ea4c925a31ba17c41eb00c5ea396883bf32abfe5e73cfc` | `IB20Factory` | Emitted once per `createB20` invocation, after the token's identity is sealed | +| error | `BatchSizeTooLarge` | `0x083e2f67` | `IPolicyRegistry` | A membership batch exceeded the registry limit. | +| event | `BlocklistUpdated` | `0x2ff63c102b1b9fd7f5d39f83039c5d6aaf50a414a4f2def2704e41be2628f1e3` | `IPolicyRegistry` | One or more accounts had their BLOCKLIST membership set to `blocked` in a single batch. | +| event | `BurnedBlocked` | `0x0b552e96653fd6842da37c477005d3b5c08a8c7d3631b1f43787b2dc9a1006a3` | `IB20` | Emitted by the deprecated `burnBlocked` in addition to `Transfer(from, address(0), amount)`. | +| error | `ChildPoliciesOutsideOfRange` | `0xcbdee0f6` | `IPolicyRegistry` | A composite policy was created or updated with a child-policy count outside the | +| event | `CompositePolicyUpdated` | `0x4ff6adaab31b0df87aa7b8b7320c52b8b3b5eede3bf28a6baaaa8b8b7e1d6363` | `IPolicyRegistry` | A composite policy's child set was set or replaced in full with `childPolicyIds`. Emitted | +| error | `ContractPaused` | `0xf9df5ac9` | `IB20` | The `PausableFeature` covering this operation is currently paused. | +| event | `ContractURIUpdated` | `0xa5d4097edda6d87cb9329af83fb3712ef77eeb13738ffe43cc35a4ce305ad962` | `IB20` | Emitted by `updateContractURI`. Per ERC-7572, parameterless: integrators re-fetch `contractURI()`. | +| error | `DelegateCallNotAllowed` | `0x0d89438e` | `IActivationRegistry` | The precompile was invoked via `DELEGATECALL` or `CALLCODE`. | +| error | `EffectiveAtInPast` | `0x14119cf6` | `IB20Asset` | `setUIMultiplier` was called with an `effectiveAt` that is not in the future | +| error | `EffectiveAtTooFar` | `0x1ce214fa` | `IB20Asset` | `setUIMultiplier` was called with an `effectiveAt` above `type(uint64).max`, the | +| event | `EIP712DomainChanged` | `0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31` | `IB20` | ERC-5267 domain-change signal. Emitted exactly once per successful `updateName` call, | +| error | `EmptyBatch` | `0xc2e5347d` | `IB20Asset` | A batched function was called with empty arrays. | +| error | `EmptyFeatureSet` | `0x4861ff45` | `IB20` | An empty array was passed to a function that requires at least one element. | +| event | `EndAnnouncement` | `0x96d64dafe2c790596430196b982ad1da3221cb3b0f4e6e2df77f2e4f71a90037` | `IB20Asset` | Emitted by `announce` to close the bracket opened by the paired `Announcement` with the same `id`. | +| error | `ExpiredSignature` | `0xbd2a913c` | `IB20` | An EIP-2612 `permit` was submitted with a `deadline` strictly less than `block.timestamp`. | +| event | `ExtraMetadataUpdated` | `0xd7bb345be29e78d635203d40fe0567e7ef19d5cd5cc5fcd25f768b8063e82aa1` | `IB20Asset` | Emitted by `updateExtraMetadata`. An empty `value` indicates removal. | +| event | `FeatureActivated` | `0x8c7a0ecdbb8d96e867e43ec1aef80027976ee493c18bef399fa799ed19752451` | `IActivationRegistry` | Emitted when `feature` is activated. | +| event | `FeatureDeactivated` | `0x15bf65a782c3258c63268ba9d7aed710cf9f9315d3687d9a4632ccdad7926c84` | `IActivationRegistry` | Emitted when `feature` is deactivated. | +| error | `FeatureNotActivated` | `0xb9b2a425` | `IActivationRegistry` | Feature is not activated. | +| error | `IncompatiblePolicyType` | `0xf1011ef5` | `IPolicyRegistry` | The operation is incompatible with the policy's type. | +| error | `InitCallFailed` | `0x4eae0860` | `IB20Factory` | One of the `initCalls` reverted. The factory bubbles the underlying revert reason | +| error | `InsufficientAllowance` | `0x192b9e4e` | `IB20` | `spender`'s allowance is less than `needed` for the requested `transferFrom`. | +| error | `InsufficientBalance` | `0xdb42144d` | `IB20` | `sender`'s balance is less than `needed` for the requested transfer or burn. | +| error | `InternalCallFailed` | `0xb288a127` | `IB20Asset` | An inner call dispatched by `announce` reverted with an ordinary revert; its reason is | +| error | `InternalCallMalformed` | `0x4e2f143e` | `IB20Asset` | An inner call dispatched by `announce` was shorter than four bytes. | +| error | `InvalidAmount` | `0x2c5211c6` | `IB20` | An amount argument was zero where a non-zero value is required. Not used for ERC-20 amount arguments. | +| error | `InvalidApprover` | `0x8bc146c4` | `IB20` | The approval's `owner` address is invalid (typically `address(0)`). | +| error | `InvalidChildPolicy` | `0x46508ef6` | `IPolicyRegistry` | Composite policies are not simple policies. Child policies must be existing | +| error | `InvalidCurrency` | `0x997c1de8` | `IB20Factory` | The stablecoin `currency` was non-empty but contained a non-`A`-`Z` byte. | +| error | `InvalidDecimals` | `0xca950391` | `IB20Factory` | The asset `decimals` was outside the allowed inclusive range | +| error | `InvalidMetadataKey` | `0x86ea3abb` | `IB20Asset` | `updateExtraMetadata` was called with an empty `key`. | +| error | `InvalidMultiplier` | `0x6f12f3dc` | `IB20Asset` | A multiplier setter (`setUIMultiplier` or `updateMultiplier`) was called with a | +| error | `InvalidReceiver` | `0x9cfea583` | `IB20` | The transfer's destination address is invalid (typically `address(0)`). | +| error | `InvalidSender` | `0x4c14f64c` | `IB20` | The transfer's source address is invalid (typically `address(0)`). | +| error | `InvalidSigner` | `0x7ba5ffb5` | `IB20` | ECDSA recovery on an EIP-2612 `permit` returned `signer`, which does not match the claimed `owner`. | +| error | `InvalidSpender` | `0x4e15efda` | `IB20` | The approval's `spender` address is invalid (typically `address(0)`). | +| error | `InvalidSupplyCap` | `0x0a3780ce` | `IB20` | The proposed supply cap is outside the permitted range: below the current | +| error | `InvalidVariant` | `0xf10e8e43` | `IB20Factory` | `variant` is not a recognized `B20Variant`. | +| error | `LastAdminCannotRenounce` | `0x361513e7` | `IB20` | `renounceRole(DEFAULT_ADMIN_ROLE, ...)` was called by the sole remaining admin. | +| event | `LastAdminRenounced` | `0xe8d3a9872e7ca325571ff1e4c51ddd69090a0345240cc605ccde365ec867cc67` | `IB20` | Emitted by `renounceLastAdmin` in addition to the standard | +| error | `LengthMismatch` | `0xab8b67c6` | `IB20Asset` | A batched function was called with parallel arrays of differing lengths. | +| event | `Memo` | `0x6989f5818dcfd11f8cd53b27c94cec33dae1589735f03e639cba54553a1825e8` | `IB20` | Emitted by `transferWithMemo`, `transferFromWithMemo`, `mintWithMemo`, and `burnWithMemo` | +| error | `MissingRequiredField` | `0x4a43ae87` | `IB20Factory` | A required string argument was the empty string. | +| event | `MultiplierUpdateCancelled` | `0xf8929975f3e67bbd1e5ec70d4cceaa7cce7ea0e811720f29c96cf1724de09397` | `IB20Asset` | A scheduled multiplier update was cancelled. Emitted by `cancelScheduledMultiplier`, | +| event | `NameUpdated` | `0x74321da206c1b9fa34367f7ece59ca49371dcd13820b9a5c3767ae1ecceed51a` | `IB20` | Emitted by `updateName`. Carries the new name string. | +| error | `NonPayable` | `0x6fb1b0e9` | `IB20` | ETH was attached to a call targeting a nonpayable token selector. | +| error | `NonPayable` | `0x6fb1b0e9` | `IB20Factory` | ETH was attached to a call targeting a nonpayable factory selector. | +| error | `NonPayable` | `0x6fb1b0e9` | `IPolicyRegistry` | ETH was attached to a call targeting a nonpayable policy registry selector. | +| error | `NoPendingAdmin` | `0xb4539afa` | `IPolicyRegistry` | `finalizeUpdateAdmin` was called with no pending admin staged. | +| error | `NoScheduledMultiplier` | `0x002e806f` | `IB20Asset` | `cancelScheduledMultiplier` was called when there is no live pending update | +| error | `NotSoleAdmin` | `0x2a98e73b` | `IB20` | `renounceLastAdmin()` was called when other accounts also hold `DEFAULT_ADMIN_ROLE`. | +| event | `Paused` | `0x43e072977b8112813d7c2aa0b63d3c121c1fe3e714e6d2eacb5735fe4027e976` | `IB20` | Emitted by `pause`. `features` is the argument to the call (not the resulting paused state). | +| event | `PolicyAdminStaged` | `0xdbf3b34a4c956c56ca05cd4b8f9293a4347ad61994445a4b89817d4a19561136` | `IPolicyRegistry` | A new admin was staged. `pendingAdmin == address(0)` clears a prior nomination. | +| event | `PolicyAdminUpdated` | `0x98925cfb1bc09c5b43dd0dd56d3d95aa04fb3300927580cc588c3f5dd58c15e1` | `IPolicyRegistry` | The active admin changed. `newAdmin == address(0)` indicates renunciation; | +| event | `PolicyCreated` | `0xdc870ce85be577234b8548f42b93f84bbff6d0c1f38ee725c809c49932a13885` | `IPolicyRegistry` | A new policy was created. | +| error | `PolicyForbids` | `0xa43fec12` | `IB20` | A policy slot denied the operation. | +| error | `PolicyNotFound` | `0xcccad523` | `IB20` | The provided policy ID does not exist in the policy registry. | +| error | `PolicyNotFound` | `0x720caa4f` | `IPolicyRegistry` | The referenced policy ID does not exist. | +| event | `PolicyUpdated` | `0x8b4790f7ff717fc8f60f07ae099e47ef318dc04b37ae98056b50a22b79056626` | `IB20` | Emitted by `updatePolicy` when a token's policy slot is changed. Initial slot assignment at | +| event | `RoleAdminChanged` | `0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff` | `IB20` | Emitted by `setRoleAdmin` when the admin role for `role` changes. | +| event | `RoleGranted` | `0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d` | `IB20` | Emitted when `account` is granted `role`. `sender` is the originating caller. | +| event | `RoleRevoked` | `0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b` | `IB20` | Emitted when `role` is revoked from `account`. `sender` is the originating caller | +| error | `ScheduleOverlap` | `0x91a52665` | `IB20Asset` | `setUIMultiplier` was called while a live pending update already exists | +| event | `Seized` | `0xa9aec5d8b86e2fa2fd6ac3af62f2622e3dfdab1967d4cbbb56a5df7d74cb887c` | `IB20` | Emitted by `seizeWithMemo` in addition to `Transfer(from, to, amount)` (and the | +| error | `StaticCallNotAllowed` | `0xbeaba5b7` | `IActivationRegistry` | A state-mutating entry point was invoked from a `STATICCALL` frame. | +| error | `SupplyCapExceeded` | `0x4b344b11` | `IB20` | The mint would push `totalSupply` past the configured cap. | +| event | `SupplyCapUpdated` | `0x6d14f44808ce024f263432bc38d019a9951fbe674e9898b54844dbc8dc09c23a` | `IB20` | Emitted by `updateSupplyCap`. | +| event | `SymbolUpdated` | `0x64e8b5c6dcea43dd79766bb3b8af7c45968d12b68c960cf2da23856f34d598d4` | `IB20` | Emitted by `updateSymbol`. Carries the new symbol string. | +| error | `TokenAlreadyExists` | `0x15ef3a57` | `IB20Factory` | A token already exists at the deterministic address derived from | +| event | `Transfer` | `0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef` | `IB20` | ERC-20 transfer event. Emitted on every successful transfer (including memo'd variants), | +| error | `Unauthorized` | `0x8e4a23d6` | `IActivationRegistry` | Caller is not the activation admin. | +| error | `Unauthorized` | `0x82b42900` | `IB20` | Caller failed a positional authorization check that is not expressible as "missing role X". | +| error | `Unauthorized` | `0x82b42900` | `IPolicyRegistry` | Caller is not the admin required by the attempted operation. | +| event | `Unpaused` | `0xdc6281474ea3dea2a856e225c7ba3edf427de9164495817c4d49a595e683fed4` | `IB20` | Emitted by `unpause`. `features` is the argument to the call (not the resulting paused state). | +| error | `UnsupportedPolicyType` | `0xcdd98a4a` | `IB20` | `policyScope` is not a slot this token (or its variant) supports. | +| error | `UnsupportedVersion` | `0x6f3c1955` | `IB20Factory` | The leading `version` byte in `params` does not match any known encoding for the requested variant. | +| error | `ZeroAddress` | `0xd92e233d` | `IPolicyRegistry` | A required address argument was the zero address. | diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry.mdx new file mode 100644 index 000000000..0eebc1578 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry.mdx @@ -0,0 +1,40 @@ +--- +title: "IActivationRegistry reference" +description: "Generated B20 reference for IActivationRegistry functions, events, and errors." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Function child pages include selectors, access notes, policy notes, and examples. + + +## Functions + +| Function | Selector | Summary | +|---|---|---| +| [`isActivated`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/isActivated) | `0xba87af80` | Whether `feature` is currently activated. Never reverts. | +| [`checkActivated`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/checkActivated) | `0xde5bfd9b` | Reverts with `FeatureNotActivated(feature)` if `feature` is not currently activated. | +| [`admin`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/admin) | `0xf851a440` | The address authorized to call `activate` and `deactivate`. | +| [`activate`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/activate) | `0x59db6e85` | Activates `feature`. Emits `FeatureActivated`. | +| [`deactivate`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/deactivate) | `0x22eee84c` | Deactivates `feature`. Emits `FeatureDeactivated`. | + +## Events + +| Event | Topic0 | Summary | +|---|---|---| +| `FeatureActivated` | `0x8c7a0ecdbb8d96e867e43ec1aef80027976ee493c18bef399fa799ed19752451` | Emitted when `feature` is activated. | +| `FeatureDeactivated` | `0x15bf65a782c3258c63268ba9d7aed710cf9f9315d3687d9a4632ccdad7926c84` | Emitted when `feature` is deactivated. | + +## Errors + +| Error | Selector | Summary | +|---|---|---| +| `Unauthorized` | `0x8e4a23d6` | Caller is not the activation admin. | +| `AlreadyActivated` | `0x866b0041` | Feature is already activated. | +| `FeatureNotActivated` | `0xb9b2a425` | Feature is not activated. | +| `DelegateCallNotAllowed` | `0x0d89438e` | The precompile was invoked via `DELEGATECALL` or `CALLCODE`. | +| `StaticCallNotAllowed` | `0xbeaba5b7` | A state-mutating entry point was invoked from a `STATICCALL` frame. | + + + + + diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/activate.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/activate.mdx new file mode 100644 index 000000000..c91903625 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/activate.mdx @@ -0,0 +1,49 @@ +--- +title: "IActivationRegistry.activate" +description: "Generated B20 reference for activate(bytes32)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/architecture-and-precompiles) + +## Signature + +```solidity +function activate(bytes32 feature) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x59db6e85` | +| Canonical signature | `activate(bytes32)` | + +## Description + +Activates `feature`. Emits `FeatureActivated`. +Dev: Reverts with `DelegateCallNotAllowed` when invoked via `DELEGATECALL` or `CALLCODE`. +Dev: Reverts with `StaticCallNotAllowed` when invoked under `STATICCALL`. +Dev: Reverts with `Unauthorized` when the caller is not the activation admin. +Dev: Reverts with `AlreadyActivated` when `feature` is already activated. +Param: feature Feature to activate. + +## Access control + +Callable by the ActivationRegistry admin. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IActivationRegistry(target).activate(arg0); +``` + +## Related + +- [IActivationRegistry reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/admin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/admin.mdx new file mode 100644 index 000000000..c934f9a21 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/admin.mdx @@ -0,0 +1,45 @@ +--- +title: "IActivationRegistry.admin" +description: "Generated B20 reference for admin()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/architecture-and-precompiles) + +## Signature + +```solidity +function admin() external view returns (address); +``` + +| Field | Value | +|---|---| +| Selector | `0xf851a440` | +| Canonical signature | `admin()` | + +## Description + +The address authorized to call `activate` and `deactivate`. +Return: Current activation admin. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IActivationRegistry(target).admin(); +``` + +## Related + +- [IActivationRegistry reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/checkActivated.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/checkActivated.mdx new file mode 100644 index 000000000..fe27a5040 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/checkActivated.mdx @@ -0,0 +1,47 @@ +--- +title: "IActivationRegistry.checkActivated" +description: "Generated B20 reference for checkActivated(bytes32)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/architecture-and-precompiles) + +## Signature + +```solidity +function checkActivated(bytes32 feature) external view; +``` + +| Field | Value | +|---|---| +| Selector | `0xde5bfd9b` | +| Canonical signature | `checkActivated(bytes32)` | + +## Description + +Reverts with `FeatureNotActivated(feature)` if `feature` is not currently activated. +A pure assertion entry point so callers don't have to redefine the error. +Dev: Reverts with `FeatureNotActivated` when `feature` is not activated. +Param: feature Feature to assert is active. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IActivationRegistry(target).checkActivated(arg0); +``` + +## Related + +- [IActivationRegistry reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/deactivate.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/deactivate.mdx new file mode 100644 index 000000000..95fe33048 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/deactivate.mdx @@ -0,0 +1,49 @@ +--- +title: "IActivationRegistry.deactivate" +description: "Generated B20 reference for deactivate(bytes32)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/architecture-and-precompiles) + +## Signature + +```solidity +function deactivate(bytes32 feature) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x22eee84c` | +| Canonical signature | `deactivate(bytes32)` | + +## Description + +Deactivates `feature`. Emits `FeatureDeactivated`. +Dev: Reverts with `DelegateCallNotAllowed` when invoked via `DELEGATECALL` or `CALLCODE`. +Dev: Reverts with `StaticCallNotAllowed` when invoked under `STATICCALL`. +Dev: Reverts with `Unauthorized` when the caller is not the activation admin. +Dev: Reverts with `AlreadyDeactivated` when `feature` is already deactivated. +Param: feature Feature to deactivate. + +## Access control + +Callable by the ActivationRegistry admin. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IActivationRegistry(target).deactivate(arg0); +``` + +## Related + +- [IActivationRegistry reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/isActivated.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/isActivated.mdx new file mode 100644 index 000000000..93bca59cd --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/isActivated.mdx @@ -0,0 +1,46 @@ +--- +title: "IActivationRegistry.isActivated" +description: "Generated B20 reference for isActivated(bytes32)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/architecture-and-precompiles) + +## Signature + +```solidity +function isActivated(bytes32 feature) external view returns (bool); +``` + +| Field | Value | +|---|---| +| Selector | `0xba87af80` | +| Canonical signature | `isActivated(bytes32)` | + +## Description + +Whether `feature` is currently activated. Never reverts. +Param: feature Feature to query. +Return: Whether `feature` is activated. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IActivationRegistry(target).isActivated(arg0); +``` + +## Related + +- [IActivationRegistry reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20.mdx new file mode 100644 index 000000000..a0f9c4236 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20.mdx @@ -0,0 +1,121 @@ +--- +title: "IB20 reference" +description: "Generated B20 reference for IB20 functions, events, and errors." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Function child pages include selectors, access notes, policy notes, and examples. + + +## Functions + +| Function | Selector | Summary | +|---|---|---| +| [`DEFAULT_ADMIN_ROLE`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DEFAULT_ADMIN_ROLE) | `0xa217fddf` | The default top-level admin role (`bytes32(0)`). Required to call `grantRole`, `revokeRole`, | +| [`MINT_ROLE`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_ROLE) | `0xe9a9c850` | Required to call `mint` and `mintWithMemo`. | +| [`BURN_ROLE`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_ROLE) | `0xb930908f` | Required to call `burn` and `burnWithMemo`. | +| [`BURN_BLOCKED_ROLE`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_BLOCKED_ROLE) | `0x32ad9be8` | Required to call the deprecated `burnBlocked` (no longer part of this interface; retained for | +| [`SEIZE_ROLE`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_ROLE) | `0x3c7e9ba5` | Required to call `seizeWithMemo`. | +| [`PAUSE_ROLE`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/PAUSE_ROLE) | `0x389ed267` | Required to call `pause`. | +| [`UNPAUSE_ROLE`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/UNPAUSE_ROLE) | `0x309756fb` | Required to call `unpause`. | +| [`METADATA_ROLE`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/METADATA_ROLE) | `0x38841782` | Required to call `updateName`, `updateSymbol`, and `updateContractURI`. | +| [`TRANSFER_SENDER_POLICY`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_SENDER_POLICY) | `0xd116fc21` | Policy slot consulted against `from` on every transfer (including `transferFrom`). | +| [`TRANSFER_RECEIVER_POLICY`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_RECEIVER_POLICY) | `0x210f521b` | Policy slot consulted against `to` on every transfer. | +| [`TRANSFER_EXECUTOR_POLICY`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_EXECUTOR_POLICY) | `0x724e9c53` | Policy slot consulted against `msg.sender` on `transferFrom` when distinct from `from`. | +| [`MINT_RECEIVER_POLICY`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_RECEIVER_POLICY) | `0x6e5b013d` | Policy slot consulted against `to` on every mint. | +| [`SEIZE_HOLDER_POLICY`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_HOLDER_POLICY) | `0xb279d311` | Policy slot consulted against `from` by `seizeWithMemo`. | +| [`name`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/name) | `0x06fdde03` | Token name. Set at creation, mutable via `updateName`. | +| [`symbol`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/symbol) | `0x95d89b41` | Token symbol. Set at creation, mutable via `updateSymbol`. | +| [`decimals`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/decimals) | `0x313ce567` | Number of decimal places. Immutable per token variant. | +| [`totalSupply`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/totalSupply) | `0x18160ddd` | Total token supply currently in circulation. | +| [`balanceOf`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/balanceOf) | `0x70a08231` | Balance of `account`. | +| [`allowance`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/allowance) | `0xdd62ed3e` | Allowance granted by `owner` to `spender`. | +| [`transfer`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transfer) | `0xa9059cbb` | Transfers `amount` from `msg.sender` to `to`. Emits `Transfer`. | +| [`transferFrom`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFrom) | `0x23b872dd` | Transfers `amount` from `from` to `to` using `msg.sender`'s allowance. Emits `Transfer`. | +| [`approve`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/approve) | `0x095ea7b3` | Sets `spender`'s allowance to `amount`. Not gated by any policy or by pause. Emits `Approval`. | +| [`updateName`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateName) | `0x84da92a7` | Updates the token's `name`. Emits `NameUpdated` followed by `EIP712DomainChanged`. | +| [`updateSymbol`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSymbol) | `0x537f5312` | Updates the token's `symbol`. Emits `SymbolUpdated`. | +| [`transferWithMemo`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferWithMemo) | `0x95777d59` | Same as `transfer`, plus emits `Memo` immediately after the standard `Transfer` event. | +| [`transferFromWithMemo`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFromWithMemo) | `0x929c2539` | Same as `transferFrom`, plus emits `Memo` immediately after the standard `Transfer` event. | +| [`mint`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mint) | `0x40c10f19` | Mints `amount` to `to`. Emits `Transfer(address(0), to, amount)`. | +| [`mintWithMemo`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mintWithMemo) | `0xe44f0b12` | Same as `mint`, plus emits `Memo` immediately after the standard `Transfer` event. | +| [`burn`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burn) | `0x42966c68` | Burns `amount` from the caller's own balance. Not subject to any policy. | +| [`burnWithMemo`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burnWithMemo) | `0x38f23b0b` | Same as `burn`, plus emits `Memo` immediately after the standard `Transfer` event. | +| [`seizeWithMemo`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/seizeWithMemo) | `0xf916d81b` | Seizes `amount` of `from`'s balance and reassigns it to `to` in a single admin operation. | +| [`hasRole`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/hasRole) | `0x91d14854` | Whether `account` is a member of `role`. User-defined roles are supported and have no | +| [`getRoleAdmin`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/getRoleAdmin) | `0x248a9ca3` | The role required to grant or revoke `role`. Defaults to `DEFAULT_ADMIN_ROLE` if not | +| [`grantRole`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/grantRole) | `0x2f2ff15d` | Grants `role` to `account`. Emits `RoleGranted`. | +| [`revokeRole`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/revokeRole) | `0xd547741f` | Revokes `role` from `account`. Emits `RoleRevoked`. | +| [`renounceRole`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceRole) | `0x36568abe` | Caller renounces `role` for themselves. Emits `RoleRevoked`. | +| [`renounceLastAdmin`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceLastAdmin) | `0x6f79e3d7` | Permanently transitions the token to a zero-admin state. Revokes `DEFAULT_ADMIN_ROLE` | +| [`setRoleAdmin`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/setRoleAdmin) | `0x1e4e0091` | Sets the admin role for `role`. Emits `RoleAdminChanged`. | +| [`pausedFeatures`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pausedFeatures) | `0xde9997e3` | The `PausableFeature`s currently paused on this token. Order is implementation-defined; | +| [`isPaused`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/isPaused) | `0x165c44bc` | Whether `feature` is currently paused. O(1). | +| [`pause`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pause) | `0x9f98bd2d` | Pauses each of `features`. Additive: features already paused remain paused; duplicates | +| [`unpause`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/unpause) | `0xb61b2ebc` | Unpauses each of `features`. Features not listed are unaffected; duplicates are idempotent. | +| [`policyId`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/policyId) | `0xdb3de624` | The current policy ID configured for `policyScope`. Returns `0` (always-allow built-in) | +| [`updatePolicy`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updatePolicy) | `0xadf9c4ea` | Updates the policy ID assigned to `policyScope`. Takes effect immediately for the next | +| [`supplyCap`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/supplyCap) | `0x8f770ad0` | The maximum total supply enforced on `mint`. Capped at `type(uint128).max`, which | +| [`updateSupplyCap`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSupplyCap) | `0xe5a97f07` | Sets a new supply cap. May be raised or lowered freely, but never below current | +| [`DOMAIN_SEPARATOR`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DOMAIN_SEPARATOR) | `0x3644e515` | The current EIP-712 domain separator for this token. Recomputed on each call so it | +| [`nonces`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/nonces) | `0x7ecebe00` | The current EIP-2612 permit nonce for `owner`. Incremented by 1 on each successful `permit`. | +| [`permit`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/permit) | `0xd505accf` | EIP-2612 permit. Recovers `owner` via ECDSA from `(v, r, s)`. EOA signatures only; | +| [`eip712Domain`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/eip712Domain) | `0x84b0196e` | ERC-5267 EIP-712 domain introspection. | +| [`contractURI`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/contractURI) | `0xe8a3d485` | Off-chain URI pointing at contract-level metadata for this token, per ERC-7572. | +| [`updateContractURI`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateContractURI) | `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`. | + + + + + diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_BLOCKED_ROLE.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_BLOCKED_ROLE.mdx new file mode 100644 index 000000000..95acfcd94 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_BLOCKED_ROLE.mdx @@ -0,0 +1,46 @@ +--- +title: "IB20.BURN_BLOCKED_ROLE" +description: "Generated B20 reference for BURN_BLOCKED_ROLE()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function BURN_BLOCKED_ROLE() external view returns (bytes32); +``` + +| Field | Value | +|---|---| +| Selector | `0x32ad9be8` | +| Canonical signature | `BURN_BLOCKED_ROLE()` | + +## Description + +Required to call the deprecated `burnBlocked` (no longer part of this interface; retained for +the back-compat impl). +Return: Role constant. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).BURN_BLOCKED_ROLE(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_ROLE.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_ROLE.mdx new file mode 100644 index 000000000..a762945fe --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_ROLE.mdx @@ -0,0 +1,45 @@ +--- +title: "IB20.BURN_ROLE" +description: "Generated B20 reference for BURN_ROLE()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function BURN_ROLE() external view returns (bytes32); +``` + +| Field | Value | +|---|---| +| Selector | `0xb930908f` | +| Canonical signature | `BURN_ROLE()` | + +## Description + +Required to call `burn` and `burnWithMemo`. +Return: Role constant. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).BURN_ROLE(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DEFAULT_ADMIN_ROLE.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DEFAULT_ADMIN_ROLE.mdx new file mode 100644 index 000000000..5d54290db --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DEFAULT_ADMIN_ROLE.mdx @@ -0,0 +1,46 @@ +--- +title: "IB20.DEFAULT_ADMIN_ROLE" +description: "Generated B20 reference for DEFAULT_ADMIN_ROLE()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function DEFAULT_ADMIN_ROLE() external view returns (bytes32); +``` + +| Field | Value | +|---|---| +| Selector | `0xa217fddf` | +| Canonical signature | `DEFAULT_ADMIN_ROLE()` | + +## Description + +The default top-level admin role (`bytes32(0)`). Required to call `grantRole`, `revokeRole`, +`setRoleAdmin`, `updatePolicy`, and `updateSupplyCap`. +Return: Role constant. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).DEFAULT_ADMIN_ROLE(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DOMAIN_SEPARATOR.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DOMAIN_SEPARATOR.mdx new file mode 100644 index 000000000..c8db8d499 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DOMAIN_SEPARATOR.mdx @@ -0,0 +1,46 @@ +--- +title: "IB20.DOMAIN_SEPARATOR" +description: "Generated B20 reference for DOMAIN_SEPARATOR()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function DOMAIN_SEPARATOR() external view returns (bytes32); +``` + +| Field | Value | +|---|---| +| Selector | `0x3644e515` | +| Canonical signature | `DOMAIN_SEPARATOR()` | + +## Description + +The current EIP-712 domain separator for this token. Recomputed on each call so it +remains correct after `updateName` or a chain fork that changes `block.chainid`. +Return: Current domain separator. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).DOMAIN_SEPARATOR(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/METADATA_ROLE.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/METADATA_ROLE.mdx new file mode 100644 index 000000000..003d760b9 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/METADATA_ROLE.mdx @@ -0,0 +1,45 @@ +--- +title: "IB20.METADATA_ROLE" +description: "Generated B20 reference for METADATA_ROLE()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function METADATA_ROLE() external view returns (bytes32); +``` + +| Field | Value | +|---|---| +| Selector | `0x38841782` | +| Canonical signature | `METADATA_ROLE()` | + +## Description + +Required to call `updateName`, `updateSymbol`, and `updateContractURI`. +Return: Role constant. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).METADATA_ROLE(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_RECEIVER_POLICY.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_RECEIVER_POLICY.mdx new file mode 100644 index 000000000..7aaee9ec6 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_RECEIVER_POLICY.mdx @@ -0,0 +1,48 @@ +--- +title: "IB20.MINT_RECEIVER_POLICY" +description: "Generated B20 reference for MINT_RECEIVER_POLICY()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function MINT_RECEIVER_POLICY() external view returns (bytes32); +``` + +| Field | Value | +|---|---| +| Selector | `0x6e5b013d` | +| Canonical signature | `MINT_RECEIVER_POLICY()` | + +## Description + +Policy slot consulted against `to` on every mint. +Dev: Unlike the transfer-side policies, this slot is ALWAYS enforced — including for +factory-originated mints during the creation (bootstrap) window — so new supply is never +issued to a policy-denied recipient even at creation. See `IB20Factory.createB20`. +Return: Policy scope constant. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).MINT_RECEIVER_POLICY(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_ROLE.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_ROLE.mdx new file mode 100644 index 000000000..41daf7543 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_ROLE.mdx @@ -0,0 +1,45 @@ +--- +title: "IB20.MINT_ROLE" +description: "Generated B20 reference for MINT_ROLE()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function MINT_ROLE() external view returns (bytes32); +``` + +| Field | Value | +|---|---| +| Selector | `0xe9a9c850` | +| Canonical signature | `MINT_ROLE()` | + +## Description + +Required to call `mint` and `mintWithMemo`. +Return: Role constant. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).MINT_ROLE(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/PAUSE_ROLE.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/PAUSE_ROLE.mdx new file mode 100644 index 000000000..289c83e59 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/PAUSE_ROLE.mdx @@ -0,0 +1,45 @@ +--- +title: "IB20.PAUSE_ROLE" +description: "Generated B20 reference for PAUSE_ROLE()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function PAUSE_ROLE() external view returns (bytes32); +``` + +| Field | Value | +|---|---| +| Selector | `0x389ed267` | +| Canonical signature | `PAUSE_ROLE()` | + +## Description + +Required to call `pause`. +Return: Role constant. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).PAUSE_ROLE(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_HOLDER_POLICY.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_HOLDER_POLICY.mdx new file mode 100644 index 000000000..68dcade05 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_HOLDER_POLICY.mdx @@ -0,0 +1,47 @@ +--- +title: "IB20.SEIZE_HOLDER_POLICY" +description: "Generated B20 reference for SEIZE_HOLDER_POLICY()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function SEIZE_HOLDER_POLICY() external view returns (bytes32); +``` + +| Field | Value | +|---|---| +| Selector | `0xb279d311` | +| Canonical signature | `SEIZE_HOLDER_POLICY()` | + +## Description + +Policy slot consulted against `from` by `seizeWithMemo`. +Dev: A `from` is seizable only when it is NOT authorized by this policy. An unset slot reads as `0` +(always-allow), so no account is seizable until an issuer configures the slot. +Return: Policy scope constant. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).SEIZE_HOLDER_POLICY(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_ROLE.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_ROLE.mdx new file mode 100644 index 000000000..f3b2ab4a4 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_ROLE.mdx @@ -0,0 +1,45 @@ +--- +title: "IB20.SEIZE_ROLE" +description: "Generated B20 reference for SEIZE_ROLE()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function SEIZE_ROLE() external view returns (bytes32); +``` + +| Field | Value | +|---|---| +| Selector | `0x3c7e9ba5` | +| Canonical signature | `SEIZE_ROLE()` | + +## Description + +Required to call `seizeWithMemo`. +Return: Role constant. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).SEIZE_ROLE(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_EXECUTOR_POLICY.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_EXECUTOR_POLICY.mdx new file mode 100644 index 000000000..cbd902c44 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_EXECUTOR_POLICY.mdx @@ -0,0 +1,48 @@ +--- +title: "IB20.TRANSFER_EXECUTOR_POLICY" +description: "Generated B20 reference for TRANSFER_EXECUTOR_POLICY()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function TRANSFER_EXECUTOR_POLICY() external view returns (bytes32); +``` + +| Field | Value | +|---|---| +| Selector | `0x724e9c53` | +| Canonical signature | `TRANSFER_EXECUTOR_POLICY()` | + +## Description + +Policy slot consulted against `msg.sender` on `transferFrom` when distinct from `from`. +Not consulted on `transfer`. +Dev: Bypassed for factory-originated calls during the creation (bootstrap) window; see +`IB20Factory.createB20`. +Return: Policy scope constant. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).TRANSFER_EXECUTOR_POLICY(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_RECEIVER_POLICY.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_RECEIVER_POLICY.mdx new file mode 100644 index 000000000..a092e4d6e --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_RECEIVER_POLICY.mdx @@ -0,0 +1,47 @@ +--- +title: "IB20.TRANSFER_RECEIVER_POLICY" +description: "Generated B20 reference for TRANSFER_RECEIVER_POLICY()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function TRANSFER_RECEIVER_POLICY() external view returns (bytes32); +``` + +| Field | Value | +|---|---| +| Selector | `0x210f521b` | +| Canonical signature | `TRANSFER_RECEIVER_POLICY()` | + +## Description + +Policy slot consulted against `to` on every transfer. +Dev: Bypassed for factory-originated calls during the creation (bootstrap) window; see +`IB20Factory.createB20`. +Return: Policy scope constant. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).TRANSFER_RECEIVER_POLICY(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_SENDER_POLICY.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_SENDER_POLICY.mdx new file mode 100644 index 000000000..4ba79a254 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_SENDER_POLICY.mdx @@ -0,0 +1,47 @@ +--- +title: "IB20.TRANSFER_SENDER_POLICY" +description: "Generated B20 reference for TRANSFER_SENDER_POLICY()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function TRANSFER_SENDER_POLICY() external view returns (bytes32); +``` + +| Field | Value | +|---|---| +| Selector | `0xd116fc21` | +| Canonical signature | `TRANSFER_SENDER_POLICY()` | + +## Description + +Policy slot consulted against `from` on every transfer (including `transferFrom`). +Dev: Bypassed for factory-originated calls during the creation (bootstrap) window; see +`IB20Factory.createB20`. +Return: Policy scope constant. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).TRANSFER_SENDER_POLICY(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/UNPAUSE_ROLE.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/UNPAUSE_ROLE.mdx new file mode 100644 index 000000000..6a23d94c0 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/UNPAUSE_ROLE.mdx @@ -0,0 +1,45 @@ +--- +title: "IB20.UNPAUSE_ROLE" +description: "Generated B20 reference for UNPAUSE_ROLE()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function UNPAUSE_ROLE() external view returns (bytes32); +``` + +| Field | Value | +|---|---| +| Selector | `0x309756fb` | +| Canonical signature | `UNPAUSE_ROLE()` | + +## Description + +Required to call `unpause`. +Return: Role constant. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).UNPAUSE_ROLE(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/allowance.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/allowance.mdx new file mode 100644 index 000000000..92fc6d807 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/allowance.mdx @@ -0,0 +1,47 @@ +--- +title: "IB20.allowance" +description: "Generated B20 reference for allowance(address,address)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function allowance(address owner, address spender) external view returns (uint256); +``` + +| Field | Value | +|---|---| +| Selector | `0xdd62ed3e` | +| Canonical signature | `allowance(address,address)` | + +## Description + +Allowance granted by `owner` to `spender`. +Param: owner Allowance owner. +Param: spender Allowance spender. +Return: Current allowance. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).allowance(arg0, arg1); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/approve.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/approve.mdx new file mode 100644 index 000000000..c6e65b1dd --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/approve.mdx @@ -0,0 +1,49 @@ +--- +title: "IB20.approve" +description: "Generated B20 reference for approve(address,uint256)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function approve(address spender, uint256 amount) external returns (bool); +``` + +| Field | Value | +|---|---| +| Selector | `0x095ea7b3` | +| Canonical signature | `approve(address,uint256)` | + +## Description + +Sets `spender`'s allowance to `amount`. Not gated by any policy or by pause. Emits `Approval`. +Dev: Reverts with `InvalidApprover` when `msg.sender == address(0)`. +Dev: Reverts with `InvalidSpender` when `spender == address(0)`. +Param: spender Account being granted the allowance. +Param: amount Allowance amount. +Return: Always `true` on success. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).approve(arg0, arg1); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/balanceOf.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/balanceOf.mdx new file mode 100644 index 000000000..6e6cc9f6a --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/balanceOf.mdx @@ -0,0 +1,46 @@ +--- +title: "IB20.balanceOf" +description: "Generated B20 reference for balanceOf(address)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function balanceOf(address account) external view returns (uint256); +``` + +| Field | Value | +|---|---| +| Selector | `0x70a08231` | +| Canonical signature | `balanceOf(address)` | + +## Description + +Balance of `account`. +Param: account Account whose balance is being queried. +Return: Current balance. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).balanceOf(arg0); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burn.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burn.mdx new file mode 100644 index 000000000..4327e2ba1 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burn.mdx @@ -0,0 +1,49 @@ +--- +title: "IB20.burn" +description: "Generated B20 reference for burn(uint256)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) + +## Signature + +```solidity +function burn(uint256 amount) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x42966c68` | +| Canonical signature | `burn(uint256)` | + +## Description + +Burns `amount` from the caller's own balance. Not subject to any policy. +Emits `Transfer(caller, address(0), amount)`. +Dev: Reverts with `ContractPaused(BURN)` when `BURN` is paused. +Dev: Reverts with `AccessControlUnauthorizedAccount` when the caller does not hold `BURN_ROLE`. +Dev: Reverts with `InsufficientBalance` when the caller's balance is below `amount`. +Param: amount Amount to burn. + +## Access control + +`BURN_ROLE` gates self-burn calls. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).burn(arg0); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burnWithMemo.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burnWithMemo.mdx new file mode 100644 index 000000000..e559f722a --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burnWithMemo.mdx @@ -0,0 +1,47 @@ +--- +title: "IB20.burnWithMemo" +description: "Generated B20 reference for burnWithMemo(uint256,bytes32)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) + +## Signature + +```solidity +function burnWithMemo(uint256 amount, bytes32 memo) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x38f23b0b` | +| Canonical signature | `burnWithMemo(uint256,bytes32)` | + +## Description + +Same as `burn`, plus emits `Memo` immediately after the standard `Transfer` event. +A memo of `bytes32(0)` is permitted. +Param: amount Amount to burn. +Param: memo Off-chain memo payload. + +## Access control + +`BURN_ROLE` gates self-burn calls. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).burnWithMemo(arg0, arg1); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/contractURI.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/contractURI.mdx new file mode 100644 index 000000000..1b8f36ae1 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/contractURI.mdx @@ -0,0 +1,45 @@ +--- +title: "IB20.contractURI" +description: "Generated B20 reference for contractURI()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function contractURI() external view returns (string memory); +``` + +| Field | Value | +|---|---| +| Selector | `0xe8a3d485` | +| Canonical signature | `contractURI()` | + +## Description + +Off-chain URI pointing at contract-level metadata for this token, per ERC-7572. +Return: Current contract URI. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).contractURI(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/decimals.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/decimals.mdx new file mode 100644 index 000000000..b1a7adb07 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/decimals.mdx @@ -0,0 +1,45 @@ +--- +title: "IB20.decimals" +description: "Generated B20 reference for decimals()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function decimals() external view returns (uint8); +``` + +| Field | Value | +|---|---| +| Selector | `0x313ce567` | +| Canonical signature | `decimals()` | + +## Description + +Number of decimal places. Immutable per token variant. +Return: Number of decimal places. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).decimals(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/eip712Domain.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/eip712Domain.mdx new file mode 100644 index 000000000..516084bcd --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/eip712Domain.mdx @@ -0,0 +1,51 @@ +--- +title: "IB20.eip712Domain" +description: "Generated B20 reference for eip712Domain()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function eip712Domain() external view returns ( bytes1 fields, string memory name, string memory version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] memory extensions ); +``` + +| Field | Value | +|---|---| +| Selector | `0x84b0196e` | +| Canonical signature | `eip712Domain()` | + +## Description + +ERC-5267 EIP-712 domain introspection. +Return: fields Bitmap of populated domain fields (`0x0f`: `name`, `version`, `chainId`, `verifyingContract`). +Return: name Live `name()` value. +Return: version Constant `"1"`. +Return: chainId Current `block.chainid`. +Return: verifyingContract This token's address. +Return: salt Unused (zero). +Return: extensions Empty. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).eip712Domain(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/getRoleAdmin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/getRoleAdmin.mdx new file mode 100644 index 000000000..f0b1619e0 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/getRoleAdmin.mdx @@ -0,0 +1,47 @@ +--- +title: "IB20.getRoleAdmin" +description: "Generated B20 reference for getRoleAdmin(bytes32)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control) + +## Signature + +```solidity +function getRoleAdmin(bytes32 role) external view returns (bytes32); +``` + +| Field | Value | +|---|---| +| Selector | `0x248a9ca3` | +| Canonical signature | `getRoleAdmin(bytes32)` | + +## Description + +The role required to grant or revoke `role`. Defaults to `DEFAULT_ADMIN_ROLE` if not +explicitly set via `setRoleAdmin`. +Param: role Role whose admin is being queried. +Return: Admin role. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).getRoleAdmin(arg0); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/grantRole.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/grantRole.mdx new file mode 100644 index 000000000..8d1559072 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/grantRole.mdx @@ -0,0 +1,48 @@ +--- +title: "IB20.grantRole" +description: "Generated B20 reference for grantRole(bytes32,address)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control) + +## Signature + +```solidity +function grantRole(bytes32 role, address account) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x2f2ff15d` | +| Canonical signature | `grantRole(bytes32,address)` | + +## Description + +Grants `role` to `account`. Emits `RoleGranted`. +Dev: Reverts with `AccessControlUnauthorizedAccount` when the caller does not hold the admin role for `role`, +or when the token has been transitioned to admin-less via `renounceLastAdmin` (admin-resurrection guard). +Param: role Role to grant. +Param: account Recipient. + +## Access control + +Uses the B20 access-control role graph. Factory initCalls bypass role gates during creation. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).grantRole(arg0, arg1); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/hasRole.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/hasRole.mdx new file mode 100644 index 000000000..de27162ba --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/hasRole.mdx @@ -0,0 +1,48 @@ +--- +title: "IB20.hasRole" +description: "Generated B20 reference for hasRole(bytes32,address)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control) + +## Signature + +```solidity +function hasRole(bytes32 role, address account) external view returns (bool); +``` + +| Field | Value | +|---|---| +| Selector | `0x91d14854` | +| Canonical signature | `hasRole(bytes32,address)` | + +## Description + +Whether `account` is a member of `role`. User-defined roles are supported and have no +built-in effect on the token's own functions. +Param: role Role to check. +Param: account Account to check. +Return: Whether `account` holds `role`. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).hasRole(arg0, arg1); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/isPaused.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/isPaused.mdx new file mode 100644 index 000000000..ce4e1cb21 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/isPaused.mdx @@ -0,0 +1,46 @@ +--- +title: "IB20.isPaused" +description: "Generated B20 reference for isPaused(PausableFeature)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function isPaused(PausableFeature feature) external view returns (bool); +``` + +| Field | Value | +|---|---| +| Selector | `0x165c44bc` | +| Canonical signature | `isPaused(PausableFeature)` | + +## Description + +Whether `feature` is currently paused. O(1). +Param: feature Feature to query. +Return: Whether `feature` is paused. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).isPaused(arg0); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mint.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mint.mdx new file mode 100644 index 000000000..c181110c9 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mint.mdx @@ -0,0 +1,51 @@ +--- +title: "IB20.mint" +description: "Generated B20 reference for mint(address,uint256)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) + +## Signature + +```solidity +function mint(address to, uint256 amount) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x40c10f19` | +| Canonical signature | `mint(address,uint256)` | + +## Description + +Mints `amount` to `to`. Emits `Transfer(address(0), to, amount)`. +Dev: Reverts with `ContractPaused(MINT)` when `MINT` is paused. +Dev: Reverts with `AccessControlUnauthorizedAccount` when the caller does not hold `MINT_ROLE`. +Dev: Reverts with `InvalidReceiver` when `to == address(0)`. +Dev: Reverts with `PolicyForbids(MINT_RECEIVER_POLICY, ...)` when `to` is not authorized. +Dev: Reverts with `SupplyCapExceeded` when `totalSupply + amount > supplyCap`. +Param: to Mint recipient. +Param: amount Amount to mint. + +## Access control + +`MINT_ROLE` gates state-changing mint calls. + +## Policy interaction + +Checks `MINT_RECEIVER_POLICY`, including during factory initCalls. + +## Example + +```solidity +IB20(target).mint(arg0, arg1); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mintWithMemo.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mintWithMemo.mdx new file mode 100644 index 000000000..415e20897 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mintWithMemo.mdx @@ -0,0 +1,48 @@ +--- +title: "IB20.mintWithMemo" +description: "Generated B20 reference for mintWithMemo(address,uint256,bytes32)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) + +## Signature + +```solidity +function mintWithMemo(address to, uint256 amount, bytes32 memo) external; +``` + +| Field | Value | +|---|---| +| Selector | `0xe44f0b12` | +| Canonical signature | `mintWithMemo(address,uint256,bytes32)` | + +## Description + +Same as `mint`, plus emits `Memo` immediately after the standard `Transfer` event. +A memo of `bytes32(0)` is permitted. +Param: to Mint recipient. +Param: amount Amount to mint. +Param: memo Off-chain memo payload. + +## Access control + +`MINT_ROLE` gates state-changing mint calls. + +## Policy interaction + +Checks `MINT_RECEIVER_POLICY`, including during factory initCalls. + +## Example + +```solidity +IB20(target).mintWithMemo(arg0, arg1, arg2); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/name.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/name.mdx new file mode 100644 index 000000000..6ae8d6aa1 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/name.mdx @@ -0,0 +1,45 @@ +--- +title: "IB20.name" +description: "Generated B20 reference for name()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function name() external view returns (string memory); +``` + +| Field | Value | +|---|---| +| Selector | `0x06fdde03` | +| Canonical signature | `name()` | + +## Description + +Token name. Set at creation, mutable via `updateName`. +Return: Current token name. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).name(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/nonces.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/nonces.mdx new file mode 100644 index 000000000..d08cc643f --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/nonces.mdx @@ -0,0 +1,46 @@ +--- +title: "IB20.nonces" +description: "Generated B20 reference for nonces(address)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function nonces(address owner) external view returns (uint256); +``` + +| Field | Value | +|---|---| +| Selector | `0x7ecebe00` | +| Canonical signature | `nonces(address)` | + +## Description + +The current EIP-2612 permit nonce for `owner`. Incremented by 1 on each successful `permit`. +Param: owner Account whose nonce is being queried. +Return: Current nonce. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).nonces(arg0); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pause.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pause.mdx new file mode 100644 index 000000000..ff2eff887 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pause.mdx @@ -0,0 +1,48 @@ +--- +title: "IB20.pause" +description: "Generated B20 reference for pause(PausableFeature[])." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) + +## Signature + +```solidity +function pause(PausableFeature[] calldata features) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x9f98bd2d` | +| Canonical signature | `pause(PausableFeature[])` | + +## Description + +Pauses each of `features`. Additive: features already paused remain paused; duplicates +within the call are idempotent. Emits `Paused`. +Dev: Reverts with `AccessControlUnauthorizedAccount` when the caller does not hold `PAUSE_ROLE`. +Dev: Reverts with `EmptyFeatureSet` when `features.length == 0`. +Param: features Features to pause. + +## Access control + +`PAUSE_ROLE` gates this call. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).pause(arg0); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pausedFeatures.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pausedFeatures.mdx new file mode 100644 index 000000000..6c26a2300 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pausedFeatures.mdx @@ -0,0 +1,46 @@ +--- +title: "IB20.pausedFeatures" +description: "Generated B20 reference for pausedFeatures()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) + +## Signature + +```solidity +function pausedFeatures() external view returns (PausableFeature[] memory); +``` + +| Field | Value | +|---|---| +| Selector | `0xde9997e3` | +| Canonical signature | `pausedFeatures()` | + +## Description + +The `PausableFeature`s currently paused on this token. Order is implementation-defined; +callers should treat the result as a set. +Return: Currently-paused features. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).pausedFeatures(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/permit.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/permit.mdx new file mode 100644 index 000000000..3c6b21c1b --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/permit.mdx @@ -0,0 +1,55 @@ +--- +title: "IB20.permit" +description: "Generated B20 reference for permit(address,address,uint256,uint256,uint8,bytes32,bytes32)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; +``` + +| Field | Value | +|---|---| +| Selector | `0xd505accf` | +| Canonical signature | `permit(address,address,uint256,uint256,uint8,bytes32,bytes32)` | + +## Description + +EIP-2612 permit. Recovers `owner` via ECDSA from `(v, r, s)`. EOA signatures only; +ERC-1271 contract signatures are NOT supported. Emits `Approval`. +Dev: Reverts with `ExpiredSignature` when `block.timestamp > deadline`. +Dev: Reverts with `InvalidSigner` when ECDSA recovery does not yield `owner`. +Dev: Reverts with `InvalidSpender` when `spender == address(0)`. +Param: owner Token holder granting the allowance. +Param: spender Account being granted the allowance. +Param: value Allowance amount. +Param: deadline Unix timestamp after which the signature is invalid. +Param: v ECDSA recovery byte. +Param: r ECDSA signature r component. +Param: s ECDSA signature s component. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).permit(arg0, arg1, arg2, arg3, arg4, arg5, arg6); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/policyId.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/policyId.mdx new file mode 100644 index 000000000..acde7a691 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/policyId.mdx @@ -0,0 +1,48 @@ +--- +title: "IB20.policyId" +description: "Generated B20 reference for policyId(bytes32)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) + +## Signature + +```solidity +function policyId(bytes32 policyScope) external view returns (uint64); +``` + +| Field | Value | +|---|---| +| Selector | `0xdb3de624` | +| Canonical signature | `policyId(bytes32)` | + +## Description + +The current policy ID configured for `policyScope`. Returns `0` (always-allow built-in) +for any slot that has never been assigned. +Dev: Reverts with `UnsupportedPolicyType` when `policyScope` is not recognized by this token. +Param: policyScope Policy slot scope. +Return: Configured policy ID. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +Reads or writes a token policy-scope pointer into the PolicyRegistry. + +## Example + +```solidity +uint64 id = IB20(token).policyId(B20Constants.MINT_RECEIVER_POLICY); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceLastAdmin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceLastAdmin.mdx new file mode 100644 index 000000000..9b57cbaa7 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceLastAdmin.mdx @@ -0,0 +1,48 @@ +--- +title: "IB20.renounceLastAdmin" +description: "Generated B20 reference for renounceLastAdmin()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control) + +## Signature + +```solidity +function renounceLastAdmin() external; +``` + +| Field | Value | +|---|---| +| Selector | `0x6f79e3d7` | +| Canonical signature | `renounceLastAdmin()` | + +## Description + +Permanently transitions the token to a zero-admin state. Revokes `DEFAULT_ADMIN_ROLE` +from `msg.sender`. Emits `RoleRevoked(DEFAULT_ADMIN_ROLE, msg.sender, msg.sender)` and +`LastAdminRenounced(msg.sender)`. +Dev: Reverts with `AccessControlUnauthorizedAccount` when `msg.sender` does not hold `DEFAULT_ADMIN_ROLE`. +Dev: Reverts with `NotSoleAdmin` when other accounts also hold `DEFAULT_ADMIN_ROLE`. + +## Access control + +Uses the B20 access-control role graph. Factory initCalls bypass role gates during creation. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).renounceLastAdmin(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceRole.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceRole.mdx new file mode 100644 index 000000000..b5e580e13 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceRole.mdx @@ -0,0 +1,48 @@ +--- +title: "IB20.renounceRole" +description: "Generated B20 reference for renounceRole(bytes32,address)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control) + +## Signature + +```solidity +function renounceRole(bytes32 role, address callerConfirmation) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x36568abe` | +| Canonical signature | `renounceRole(bytes32,address)` | + +## Description + +Caller renounces `role` for themselves. Emits `RoleRevoked`. +Dev: Reverts with `AccessControlBadConfirmation` when `callerConfirmation != msg.sender`. +Dev: Reverts with `LastAdminCannotRenounce` when `role == DEFAULT_ADMIN_ROLE` and the caller is the last default admin. +Param: role Role to renounce. +Param: callerConfirmation MUST equal `msg.sender`. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).renounceRole(arg0, arg1); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/revokeRole.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/revokeRole.mdx new file mode 100644 index 000000000..034eb9c80 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/revokeRole.mdx @@ -0,0 +1,50 @@ +--- +title: "IB20.revokeRole" +description: "Generated B20 reference for revokeRole(bytes32,address)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control) + +## Signature + +```solidity +function revokeRole(bytes32 role, address account) external; +``` + +| Field | Value | +|---|---| +| Selector | `0xd547741f` | +| Canonical signature | `revokeRole(bytes32,address)` | + +## Description + +Revokes `role` from `account`. Emits `RoleRevoked`. +Dev: Reverts with `AccessControlUnauthorizedAccount` when the caller does not hold the admin role for `role`, +or when the token has been transitioned to admin-less via `renounceLastAdmin`. +Dev: Reverts with `LastAdminCannotRenounce` when `role == DEFAULT_ADMIN_ROLE` and `account` is the last default admin. +Use `renounceLastAdmin` to clear the final admin. +Param: role Role to revoke. +Param: account Account to revoke from. + +## Access control + +Uses the B20 access-control role graph. Factory initCalls bypass role gates during creation. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).revokeRole(arg0, arg1); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/seizeWithMemo.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/seizeWithMemo.mdx new file mode 100644 index 000000000..abd382420 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/seizeWithMemo.mdx @@ -0,0 +1,59 @@ +--- +title: "IB20.seizeWithMemo" +description: "Generated B20 reference for seizeWithMemo(address,address,uint256,bytes32)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) + +## Signature + +```solidity +function seizeWithMemo(address from, address to, uint256 amount, bytes32 memo) external returns (bool); +``` + +| Field | Value | +|---|---| +| Selector | `0xf916d81b` | +| Canonical signature | `seizeWithMemo(address,address,uint256,bytes32)` | + +## Description + +Seizes `amount` of `from`'s balance and reassigns it to `to` in a single admin operation. +Emits, in order, `Transfer(from, to, amount)`, `Memo(caller, memo)`, and +`Seized(caller, from, to, amount)`. A memo of `bytes32(0)` is permitted. +Dev: Admin operation: skips allowance and the transfer policies. The only membership check is that +`from` is blocked under `SEIZE_HOLDER_POLICY`. +Dev: `to` is not policy-checked; the destination need not be allowlisted. +Dev: Reverts with `ContractPaused(SEIZE)` when `SEIZE` is paused. +Dev: Reverts with `AccessControlUnauthorizedAccount` when the caller does not hold `SEIZE_ROLE`. +Dev: Reverts with `InvalidReceiver` when `to == address(0)`. +Dev: Reverts with `AccountNotSeizable` when `from` is currently authorized under `SEIZE_HOLDER_POLICY`. +Dev: Reverts with `InsufficientBalance` when `from`'s balance is below `amount`. +Param: from Account whose balance is being seized. +Param: to Destination address for the seized balance. +Param: amount Amount to seize. +Param: memo Memo payload. +Return: Always `true` on success. + +## Access control + +`SEIZE_ROLE` gates seizure calls. + +## Policy interaction + +Checks `SEIZE_HOLDER_POLICY`; the holder is seizable only when not authorized. + +## Example + +```solidity +IB20(token).seizeWithMemo(holder, destination, amount, memo); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/setRoleAdmin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/setRoleAdmin.mdx new file mode 100644 index 000000000..860a166c9 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/setRoleAdmin.mdx @@ -0,0 +1,48 @@ +--- +title: "IB20.setRoleAdmin" +description: "Generated B20 reference for setRoleAdmin(bytes32,bytes32)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control) + +## Signature + +```solidity +function setRoleAdmin(bytes32 role, bytes32 newAdminRole) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x1e4e0091` | +| Canonical signature | `setRoleAdmin(bytes32,bytes32)` | + +## Description + +Sets the admin role for `role`. Emits `RoleAdminChanged`. +Dev: Reverts with `AccessControlUnauthorizedAccount` when the caller does not hold the current admin role for `role`, +or when the token has been transitioned to admin-less via `renounceLastAdmin`. +Param: role Role whose admin is being updated. +Param: newAdminRole New admin role. + +## Access control + +Uses the B20 access-control role graph. Factory initCalls bypass role gates during creation. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).setRoleAdmin(arg0, arg1); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/supplyCap.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/supplyCap.mdx new file mode 100644 index 000000000..19ddd4868 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/supplyCap.mdx @@ -0,0 +1,47 @@ +--- +title: "IB20.supplyCap" +description: "Generated B20 reference for supplyCap()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function supplyCap() external view returns (uint256); +``` + +| Field | Value | +|---|---| +| Selector | `0x8f770ad0` | +| Canonical signature | `supplyCap()` | + +## Description + +The maximum total supply enforced on `mint`. Capped at `type(uint128).max`, which +indicates no cap (the unbounded sentinel). `totalSupply` can therefore never exceed +`type(uint128).max`. +Return: Current supply cap. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).supplyCap(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/symbol.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/symbol.mdx new file mode 100644 index 000000000..c42af872e --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/symbol.mdx @@ -0,0 +1,45 @@ +--- +title: "IB20.symbol" +description: "Generated B20 reference for symbol()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function symbol() external view returns (string memory); +``` + +| Field | Value | +|---|---| +| Selector | `0x95d89b41` | +| Canonical signature | `symbol()` | + +## Description + +Token symbol. Set at creation, mutable via `updateSymbol`. +Return: Current token symbol. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).symbol(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/totalSupply.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/totalSupply.mdx new file mode 100644 index 000000000..15f69a2ea --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/totalSupply.mdx @@ -0,0 +1,45 @@ +--- +title: "IB20.totalSupply" +description: "Generated B20 reference for totalSupply()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function totalSupply() external view returns (uint256); +``` + +| Field | Value | +|---|---| +| Selector | `0x18160ddd` | +| Canonical signature | `totalSupply()` | + +## Description + +Total token supply currently in circulation. +Return: Current total supply. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).totalSupply(); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transfer.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transfer.mdx new file mode 100644 index 000000000..b2fd671a1 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transfer.mdx @@ -0,0 +1,53 @@ +--- +title: "IB20.transfer" +description: "Generated B20 reference for transfer(address,uint256)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) + +## Signature + +```solidity +function transfer(address to, uint256 amount) external returns (bool); +``` + +| Field | Value | +|---|---| +| Selector | `0xa9059cbb` | +| Canonical signature | `transfer(address,uint256)` | + +## Description + +Transfers `amount` from `msg.sender` to `to`. Emits `Transfer`. +Dev: Reverts with `ContractPaused(TRANSFER)` when `TRANSFER` is paused. +Dev: Reverts with `InvalidReceiver` when `to == address(0)`. +Dev: Reverts with `InvalidSender` when `msg.sender == address(0)`. +Dev: Reverts with `PolicyForbids(TRANSFER_SENDER_POLICY, ...)` when `msg.sender` is not authorized. +Dev: Reverts with `PolicyForbids(TRANSFER_RECEIVER_POLICY, ...)` when `to` is not authorized. +Dev: Reverts with `InsufficientBalance` when `msg.sender`'s balance is below `amount`. +Param: to Destination address. +Param: amount Amount to transfer. +Return: Always `true` on success. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +Checks `TRANSFER_SENDER_POLICY` and `TRANSFER_RECEIVER_POLICY`; `approve` and `permit` are not policy-gated. + +## Example + +```solidity +IB20(target).transfer(arg0, arg1); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFrom.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFrom.mdx new file mode 100644 index 000000000..711d33caf --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFrom.mdx @@ -0,0 +1,56 @@ +--- +title: "IB20.transferFrom" +description: "Generated B20 reference for transferFrom(address,address,uint256)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) + +## Signature + +```solidity +function transferFrom(address from, address to, uint256 amount) external returns (bool); +``` + +| Field | Value | +|---|---| +| Selector | `0x23b872dd` | +| Canonical signature | `transferFrom(address,address,uint256)` | + +## Description + +Transfers `amount` from `from` to `to` using `msg.sender`'s allowance. Emits `Transfer`. +Dev: Reverts with `ContractPaused(TRANSFER)` when `TRANSFER` is paused. +Dev: Reverts with `InvalidReceiver` when `to == address(0)`. +Dev: Reverts with `InvalidSender` when `from == address(0)`. +Dev: Reverts with `InsufficientAllowance` when the caller's allowance from `from` is below `amount`. +Dev: Reverts with `PolicyForbids(TRANSFER_EXECUTOR_POLICY, ...)` when `msg.sender != from` and `msg.sender` is not authorized. +Dev: Reverts with `PolicyForbids(TRANSFER_SENDER_POLICY, ...)` when `from` is not authorized. +Dev: Reverts with `PolicyForbids(TRANSFER_RECEIVER_POLICY, ...)` when `to` is not authorized. +Dev: Reverts with `InsufficientBalance` when `from`'s balance is below `amount`. +Param: from Source address. +Param: to Destination address. +Param: amount Amount to transfer. +Return: Always `true` on success. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +Checks `TRANSFER_EXECUTOR_POLICY` when `msg.sender != from`, plus sender and receiver transfer scopes. + +## Example + +```solidity +IB20(target).transferFrom(arg0, arg1, arg2); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFromWithMemo.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFromWithMemo.mdx new file mode 100644 index 000000000..30d2ee09f --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFromWithMemo.mdx @@ -0,0 +1,50 @@ +--- +title: "IB20.transferFromWithMemo" +description: "Generated B20 reference for transferFromWithMemo(address,address,uint256,bytes32)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) + +## Signature + +```solidity +function transferFromWithMemo(address from, address to, uint256 amount, bytes32 memo) external returns (bool); +``` + +| Field | Value | +|---|---| +| Selector | `0x929c2539` | +| Canonical signature | `transferFromWithMemo(address,address,uint256,bytes32)` | + +## Description + +Same as `transferFrom`, plus emits `Memo` immediately after the standard `Transfer` event. +A memo of `bytes32(0)` is permitted. +Param: from Source address. +Param: to Destination address. +Param: amount Amount to transfer. +Param: memo Off-chain memo payload. +Return: Always `true` on success. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +Checks `TRANSFER_EXECUTOR_POLICY` when `msg.sender != from`, plus sender and receiver transfer scopes. + +## Example + +```solidity +IB20(target).transferFromWithMemo(arg0, arg1, arg2, arg3); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferWithMemo.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferWithMemo.mdx new file mode 100644 index 000000000..e592e5f08 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferWithMemo.mdx @@ -0,0 +1,49 @@ +--- +title: "IB20.transferWithMemo" +description: "Generated B20 reference for transferWithMemo(address,uint256,bytes32)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) + +## Signature + +```solidity +function transferWithMemo(address to, uint256 amount, bytes32 memo) external returns (bool); +``` + +| Field | Value | +|---|---| +| Selector | `0x95777d59` | +| Canonical signature | `transferWithMemo(address,uint256,bytes32)` | + +## Description + +Same as `transfer`, plus emits `Memo` immediately after the standard `Transfer` event. +A memo of `bytes32(0)` is permitted. +Param: to Destination address. +Param: amount Amount to transfer. +Param: memo Off-chain memo payload. +Return: Always `true` on success. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +Checks `TRANSFER_SENDER_POLICY` and `TRANSFER_RECEIVER_POLICY`; `approve` and `permit` are not policy-gated. + +## Example + +```solidity +IB20(target).transferWithMemo(arg0, arg1, arg2); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/unpause.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/unpause.mdx new file mode 100644 index 000000000..de025d586 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/unpause.mdx @@ -0,0 +1,48 @@ +--- +title: "IB20.unpause" +description: "Generated B20 reference for unpause(PausableFeature[])." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) + +## Signature + +```solidity +function unpause(PausableFeature[] calldata features) external; +``` + +| Field | Value | +|---|---| +| Selector | `0xb61b2ebc` | +| Canonical signature | `unpause(PausableFeature[])` | + +## Description + +Unpauses each of `features`. Features not listed are unaffected; duplicates are idempotent. +Emits `Unpaused`. +Dev: Reverts with `AccessControlUnauthorizedAccount` when the caller does not hold `UNPAUSE_ROLE`. +Dev: Reverts with `EmptyFeatureSet` when `features.length == 0`. +Param: features Features to unpause. + +## Access control + +`UNPAUSE_ROLE` gates this call. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).unpause(arg0); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateContractURI.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateContractURI.mdx new file mode 100644 index 000000000..26bca6982 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateContractURI.mdx @@ -0,0 +1,47 @@ +--- +title: "IB20.updateContractURI" +description: "Generated B20 reference for updateContractURI(string)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function updateContractURI(string calldata newURI) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x7e5b1e24` | +| Canonical signature | `updateContractURI(string)` | + +## Description + +Updates `contractURI`. Emits the parameterless `ContractURIUpdated` event per ERC-7572; +integrators re-fetch `contractURI()` after observing it. +Dev: Reverts with `AccessControlUnauthorizedAccount` when the caller does not hold `METADATA_ROLE`. +Param: newURI New contract URI. + +## Access control + +`METADATA_ROLE` gates this call. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).updateContractURI(arg0); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateName.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateName.mdx new file mode 100644 index 000000000..6b3b3a2b5 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateName.mdx @@ -0,0 +1,46 @@ +--- +title: "IB20.updateName" +description: "Generated B20 reference for updateName(string)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function updateName(string calldata newName) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x84da92a7` | +| Canonical signature | `updateName(string)` | + +## Description + +Updates the token's `name`. Emits `NameUpdated` followed by `EIP712DomainChanged`. +Dev: Reverts with `AccessControlUnauthorizedAccount` when the caller does not hold `METADATA_ROLE`. +Param: newName New token name. + +## Access control + +`METADATA_ROLE` gates this call. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).updateName(arg0); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updatePolicy.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updatePolicy.mdx new file mode 100644 index 000000000..333d6a98c --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updatePolicy.mdx @@ -0,0 +1,50 @@ +--- +title: "IB20.updatePolicy" +description: "Generated B20 reference for updatePolicy(bytes32,uint64)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) + +## Signature + +```solidity +function updatePolicy(bytes32 policyScope, uint64 newPolicyId) external; +``` + +| Field | Value | +|---|---| +| Selector | `0xadf9c4ea` | +| Canonical signature | `updatePolicy(bytes32,uint64)` | + +## Description + +Updates the policy ID assigned to `policyScope`. Takes effect immediately for the next +operation that consults this slot. Emits `PolicyUpdated`. +Dev: Reverts with `AccessControlUnauthorizedAccount` when the caller does not hold `DEFAULT_ADMIN_ROLE`. +Dev: Reverts with `UnsupportedPolicyType` when `policyScope` is not recognized by this token. +Dev: Reverts with `PolicyNotFound` when `newPolicyId` is not a built-in sentinel and does not exist in the registry. +Param: policyScope Policy slot scope. +Param: newPolicyId Policy ID to assign to the slot. + +## Access control + +`DEFAULT_ADMIN_ROLE` gates this call. Factory initCalls bypass the role gate during creation. + +## Policy interaction + +Reads or writes a token policy-scope pointer into the PolicyRegistry. + +## Example + +```solidity +IB20(token).updatePolicy(B20Constants.MINT_RECEIVER_POLICY, policyId); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSupplyCap.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSupplyCap.mdx new file mode 100644 index 000000000..7f48163a5 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSupplyCap.mdx @@ -0,0 +1,48 @@ +--- +title: "IB20.updateSupplyCap" +description: "Generated B20 reference for updateSupplyCap(uint256)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function updateSupplyCap(uint256 newSupplyCap) external; +``` + +| Field | Value | +|---|---| +| Selector | `0xe5a97f07` | +| Canonical signature | `updateSupplyCap(uint256)` | + +## Description + +Sets a new supply cap. May be raised or lowered freely, but never below current +`totalSupply` and never above `type(uint128).max`. Emits `SupplyCapUpdated`. +Dev: Reverts with `AccessControlUnauthorizedAccount` when the caller does not hold `DEFAULT_ADMIN_ROLE`. +Dev: Reverts with `InvalidSupplyCap` when `newSupplyCap < totalSupply()` or `newSupplyCap > type(uint128).max`. +Param: newSupplyCap New supply cap. Must not exceed `type(uint128).max`. + +## Access control + +`DEFAULT_ADMIN_ROLE` gates this call. Factory initCalls bypass the role gate during creation. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).updateSupplyCap(arg0); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSymbol.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSymbol.mdx new file mode 100644 index 000000000..ae4eecba3 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSymbol.mdx @@ -0,0 +1,46 @@ +--- +title: "IB20.updateSymbol" +description: "Generated B20 reference for updateSymbol(string)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20) + +## Signature + +```solidity +function updateSymbol(string calldata newSymbol) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x537f5312` | +| Canonical signature | `updateSymbol(string)` | + +## Description + +Updates the token's `symbol`. Emits `SymbolUpdated`. +Dev: Reverts with `AccessControlUnauthorizedAccount` when the caller does not hold `METADATA_ROLE`. +Param: newSymbol New token symbol. + +## Access control + +`METADATA_ROLE` gates this call. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20(target).updateSymbol(arg0); +``` + +## Related + +- [IB20 reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset.mdx new file mode 100644 index 000000000..3f2bd2f6d --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset.mdx @@ -0,0 +1,58 @@ +--- +title: "IB20Asset reference" +description: "Generated B20 reference for IB20Asset functions, events, and errors." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Function child pages include selectors, access notes, policy notes, and examples. + + +## Functions + +| Function | Selector | Summary | +|---|---|---| +| [`OPERATOR_ROLE`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/OPERATOR_ROLE) | `0xf5b541a6` | Required to call `announce`, `setUIMultiplier`, `cancelScheduledMultiplier`, and | +| [`WAD_PRECISION`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/WAD_PRECISION) | `0x664808a8` | Fixed-point precision used to scale `multiplier`. Equal to `1e18`. | +| [`announce`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/announce) | `0x595135dd` | Posts a holder-impacting announcement and atomically dispatches each entry in | +| [`isAnnouncementIdUsed`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/isAnnouncementIdUsed) | `0xc0da474e` | Whether `id` has previously been consumed by `announce`. | +| [`multiplier`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/multiplier) | `0x1b3ed722` | The current multiplier, scaled to `WAD_PRECISION`. Holder balances are stored | +| [`toScaledBalance`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toScaledBalance) | `0x04f04c99` | Converts a raw balance to its scaled view: `rawBalance * multiplier / WAD_PRECISION`. | +| [`toRawBalance`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toRawBalance) | `0x0ca06c44` | Converts a scaled balance back to its raw representation: | +| [`scaledBalanceOf`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/scaledBalanceOf) | `0x1da24f3e` | Convenience for `toScaledBalance(balanceOf(account))`. | +| [`setUIMultiplier`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/setUIMultiplier) | `0x93d32890` | Schedules a multiplier update to take effect at `effectiveAt` — the standard path | +| [`cancelScheduledMultiplier`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/cancelScheduledMultiplier) | `0xc4b1e3e7` | Cancels the single live pending update, restoring the no-pending state | +| [`updateMultiplier`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateMultiplier) | `0x5ffe6146` | Instant failsafe / emergency override — sets the current multiplier immediately and | +| [`batchMint`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/batchMint) | `0x68573107` | Mints `amounts[i]` to `recipients[i]` in one call. All-or-nothing: any element | +| [`extraMetadata`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/extraMetadata) | `0x4ddf9da0` | The value of the named metadata entry, or the empty string if not set. A | +| [`updateExtraMetadata`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateExtraMetadata) | `0xb2851ef5` | Sets, updates, or removes an extra-metadata entry. An empty `value` removes the | + +## Events + +| Event | Topic0 | Summary | +|---|---|---| +| `MultiplierUpdateCancelled` | `0xf8929975f3e67bbd1e5ec70d4cceaa7cce7ea0e811720f29c96cf1724de09397` | A scheduled multiplier update was cancelled. Emitted by `cancelScheduledMultiplier`, | +| `ExtraMetadataUpdated` | `0xd7bb345be29e78d635203d40fe0567e7ef19d5cd5cc5fcd25f768b8063e82aa1` | Emitted by `updateExtraMetadata`. An empty `value` indicates removal. | +| `Announcement` | `0xccebf8218a62875909564adef86a6f4df81503cb617221e793357d62f8e813f7` | Emitted by `announce` to open an announcement bracket. | +| `EndAnnouncement` | `0x96d64dafe2c790596430196b982ad1da3221cb3b0f4e6e2df77f2e4f71a90037` | Emitted by `announce` to close the bracket opened by the paired `Announcement` with the same `id`. | + +## Errors + +| Error | Selector | Summary | +|---|---|---| +| `AnnouncementIdAlreadyUsed` | `0xd10b3c9e` | `announce` was called with an `id` that has already been consumed. | +| `InvalidMetadataKey` | `0x86ea3abb` | `updateExtraMetadata` was called with an empty `key`. | +| `InvalidMultiplier` | `0x6f12f3dc` | A multiplier setter (`setUIMultiplier` or `updateMultiplier`) was called with a | +| `EffectiveAtInPast` | `0x14119cf6` | `setUIMultiplier` was called with an `effectiveAt` that is not in the future | +| `EffectiveAtTooFar` | `0x1ce214fa` | `setUIMultiplier` was called with an `effectiveAt` above `type(uint64).max`, the | +| `ScheduleOverlap` | `0x91a52665` | `setUIMultiplier` was called while a live pending update already exists | +| `NoScheduledMultiplier` | `0x002e806f` | `cancelScheduledMultiplier` was called when there is no live pending update | +| `LengthMismatch` | `0xab8b67c6` | A batched function was called with parallel arrays of differing lengths. | +| `EmptyBatch` | `0xc2e5347d` | A batched function was called with empty arrays. | +| `AnnouncementInProgress` | `0x5c5f0829` | An inner call dispatched by `announce` tried to re-invoke `announce`. | +| `InternalCallMalformed` | `0x4e2f143e` | An inner call dispatched by `announce` was shorter than four bytes. | +| `InternalCallFailed` | `0xb288a127` | An inner call dispatched by `announce` reverted with an ordinary revert; its reason is | + + + + + diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/OPERATOR_ROLE.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/OPERATOR_ROLE.mdx new file mode 100644 index 000000000..fec489e0c --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/OPERATOR_ROLE.mdx @@ -0,0 +1,47 @@ +--- +title: "IB20Asset.OPERATOR_ROLE" +description: "Generated B20 reference for OPERATOR_ROLE()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) + +## Signature + +```solidity +function OPERATOR_ROLE() external view returns (bytes32); +``` + +| Field | Value | +|---|---| +| Selector | `0xf5b541a6` | +| Canonical signature | `OPERATOR_ROLE()` | + +## Description + +Required to call `announce`, `setUIMultiplier`, `cancelScheduledMultiplier`, and +`updateMultiplier`. The metadata setters (`updateName`, `updateSymbol`, +`updateExtraMetadata`) are gated by the inherited `METADATA_ROLE` instead. +Return: Role constant. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20Asset(target).OPERATOR_ROLE(); +``` + +## Related + +- [IB20Asset reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/WAD_PRECISION.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/WAD_PRECISION.mdx new file mode 100644 index 000000000..ef8b79dc5 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/WAD_PRECISION.mdx @@ -0,0 +1,45 @@ +--- +title: "IB20Asset.WAD_PRECISION" +description: "Generated B20 reference for WAD_PRECISION()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) + +## Signature + +```solidity +function WAD_PRECISION() external view returns (uint256); +``` + +| Field | Value | +|---|---| +| Selector | `0x664808a8` | +| Canonical signature | `WAD_PRECISION()` | + +## Description + +Fixed-point precision used to scale `multiplier`. Equal to `1e18`. +Return: Precision constant. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20Asset(target).WAD_PRECISION(); +``` + +## Related + +- [IB20Asset reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/announce.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/announce.mdx new file mode 100644 index 000000000..4cde5a2df --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/announce.mdx @@ -0,0 +1,58 @@ +--- +title: "IB20Asset.announce" +description: "Generated B20 reference for announce(bytes[],string,string,string)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) + +## Signature + +```solidity +function announce( bytes[] calldata internalCalls, string calldata id, string calldata description, string calldata uri ) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x595135dd` | +| Canonical signature | `announce(bytes[],string,string,string)` | + +## Description + +Posts a holder-impacting announcement and atomically dispatches each entry in +`internalCalls` via self-`delegatecall` (preserving `msg.sender`). Emits +`Announcement` then `EndAnnouncement` with the same `id`. Pass an empty +`internalCalls` for a pure disclosure. +Dev: Reverts with `AccessControlUnauthorizedAccount` when the caller does not hold `OPERATOR_ROLE`. +Dev: Reverts with `AnnouncementIdAlreadyUsed` when `id` has previously been consumed. +Dev: Reverts with `InternalCallMalformed` when an entry in `internalCalls` is shorter than four bytes. +Dev: Reverts with `AnnouncementInProgress` when an entry in `internalCalls` targets `announce` itself. +Dev: An inner call that raises a Solidity `Panic` (e.g. arithmetic overflow) propagates the +raw Panic unchanged; any other inner revert wraps as `InternalCallFailed(call)`. An inner +out-of-gas halts the whole call. +Param: internalCalls ABI-encoded calldata blobs executed in order via self-`delegatecall`; may be empty. +Param: id Caller-chosen announcement id; single-use over the token's lifetime. +Param: description Human-readable summary of the announcement. +Param: uri Off-chain URI containing the full announcement contents. + +## Access control + +`OPERATOR_ROLE` gates this Asset call. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20Asset(target).announce(arg0, arg1, arg2, arg3); +``` + +## Related + +- [IB20Asset reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/batchMint.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/batchMint.mdx new file mode 100644 index 000000000..39af8b60e --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/batchMint.mdx @@ -0,0 +1,55 @@ +--- +title: "IB20Asset.batchMint" +description: "Generated B20 reference for batchMint(address[],uint256[])." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) + +## Signature + +```solidity +function batchMint(address[] calldata recipients, uint256[] calldata amounts) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x68573107` | +| Canonical signature | `batchMint(address[],uint256[])` | + +## Description + +Mints `amounts[i]` to `recipients[i]` in one call. All-or-nothing: any element +revert unwinds the whole transaction. Emits `Transfer(address(0), recipients[i], amounts[i])` +per element. +Dev: Reverts with `ContractPaused(MINT)` when `MINT` is paused. +Dev: Reverts with `AccessControlUnauthorizedAccount` when the caller does not hold `MINT_ROLE`. +Dev: Reverts with `LengthMismatch` when `recipients.length != amounts.length`. +Dev: Reverts with `EmptyBatch` when either array is empty. +Dev: Reverts with `InvalidReceiver` when any `recipients[i] == address(0)`. +Dev: Reverts with `PolicyForbids(MINT_RECEIVER_POLICY, ...)` when any recipient is not authorized. +Dev: Reverts with `SupplyCapExceeded` when the cumulative mint would exceed the cap. +Param: recipients Accounts receiving the minted tokens. +Param: amounts Per-recipient amounts, parallel to `recipients`. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20Asset(target).batchMint(arg0, arg1); +``` + +## Related + +- [IB20Asset reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/cancelScheduledMultiplier.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/cancelScheduledMultiplier.mdx new file mode 100644 index 000000000..f154b7a78 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/cancelScheduledMultiplier.mdx @@ -0,0 +1,47 @@ +--- +title: "IB20Asset.cancelScheduledMultiplier" +description: "Generated B20 reference for cancelScheduledMultiplier()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) + +## Signature + +```solidity +function cancelScheduledMultiplier() external; +``` + +| Field | Value | +|---|---| +| Selector | `0xc4b1e3e7` | +| Canonical signature | `cancelScheduledMultiplier()` | + +## Description + +Cancels the single live pending update, restoring the no-pending state +(`effectiveAt` resets to 0). +Dev: Reverts with `AccessControlUnauthorizedAccount` when the caller does not hold `OPERATOR_ROLE`. +Dev: Reverts with `NoScheduledMultiplier` when there is no live pending update. + +## Access control + +`OPERATOR_ROLE` gates this Asset call. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20Asset(target).cancelScheduledMultiplier(); +``` + +## Related + +- [IB20Asset reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/extraMetadata.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/extraMetadata.mdx new file mode 100644 index 000000000..d500df3a3 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/extraMetadata.mdx @@ -0,0 +1,48 @@ +--- +title: "IB20Asset.extraMetadata" +description: "Generated B20 reference for extraMetadata(string)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) + +## Signature + +```solidity +function extraMetadata(string calldata key) external view returns (string memory); +``` + +| Field | Value | +|---|---| +| Selector | `0x4ddf9da0` | +| Canonical signature | `extraMetadata(string)` | + +## Description + +The value of the named metadata entry, or the empty string if not set. A +variant-agnostic key/value store; the issuer chooses the key namespace +(e.g. `"category"`, `"region"`, `"reference"`). +Param: key Metadata entry key. +Return: Current value, or the empty string. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20Asset(target).extraMetadata(arg0); +``` + +## Related + +- [IB20Asset reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/isAnnouncementIdUsed.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/isAnnouncementIdUsed.mdx new file mode 100644 index 000000000..ae60fb89a --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/isAnnouncementIdUsed.mdx @@ -0,0 +1,46 @@ +--- +title: "IB20Asset.isAnnouncementIdUsed" +description: "Generated B20 reference for isAnnouncementIdUsed(string)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) + +## Signature + +```solidity +function isAnnouncementIdUsed(string calldata id) external view returns (bool); +``` + +| Field | Value | +|---|---| +| Selector | `0xc0da474e` | +| Canonical signature | `isAnnouncementIdUsed(string)` | + +## Description + +Whether `id` has previously been consumed by `announce`. +Param: id Announcement id to query. +Return: Whether `id` is used. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20Asset(target).isAnnouncementIdUsed(arg0); +``` + +## Related + +- [IB20Asset reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/multiplier.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/multiplier.mdx new file mode 100644 index 000000000..864e64468 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/multiplier.mdx @@ -0,0 +1,48 @@ +--- +title: "IB20Asset.multiplier" +description: "Generated B20 reference for multiplier()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) + +## Signature + +```solidity +function multiplier() external view returns (uint256); +``` + +| Field | Value | +|---|---| +| Selector | `0x1b3ed722` | +| Canonical signature | `multiplier()` | + +## Description + +The current multiplier, scaled to `WAD_PRECISION`. Holder balances are stored +as raw units; the multiplier scales them into a derived "scaled" view, similar +in shape to wstETH wrapping stETH. +Dev: Alias of the ERC-8056 `uiMultiplier()`. +Return: Current (effective) multiplier. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20Asset(target).multiplier(); +``` + +## Related + +- [IB20Asset reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/scaledBalanceOf.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/scaledBalanceOf.mdx new file mode 100644 index 000000000..bfb0214cd --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/scaledBalanceOf.mdx @@ -0,0 +1,46 @@ +--- +title: "IB20Asset.scaledBalanceOf" +description: "Generated B20 reference for scaledBalanceOf(address)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) + +## Signature + +```solidity +function scaledBalanceOf(address account) external view returns (uint256); +``` + +| Field | Value | +|---|---| +| Selector | `0x1da24f3e` | +| Canonical signature | `scaledBalanceOf(address)` | + +## Description + +Convenience for `toScaledBalance(balanceOf(account))`. +Param: account Account whose scaled balance is being queried. +Return: Scaled balance. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20Asset(target).scaledBalanceOf(arg0); +``` + +## Related + +- [IB20Asset reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/setUIMultiplier.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/setUIMultiplier.mdx new file mode 100644 index 000000000..b39f7db35 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/setUIMultiplier.mdx @@ -0,0 +1,52 @@ +--- +title: "IB20Asset.setUIMultiplier" +description: "Generated B20 reference for setUIMultiplier(uint256,uint256)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) + +## Signature + +```solidity +function setUIMultiplier(uint256 newMultiplier, uint256 effectiveAt) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x93d32890` | +| Canonical signature | `setUIMultiplier(uint256,uint256)` | + +## Description + +Schedules a multiplier update to take effect at `effectiveAt` — the standard path +for corporate actions (splits, reinvested dividends). +Dev: Reverts with `AccessControlUnauthorizedAccount` when the caller does not hold `OPERATOR_ROLE`. +Dev: Reverts with `InvalidMultiplier` when `newMultiplier` is zero or above `type(uint128).max`. +Dev: Reverts with `EffectiveAtInPast` when `effectiveAt` is not in the future. +Dev: Reverts with `EffectiveAtTooFar` when `effectiveAt` exceeds `type(uint64).max`. +Dev: Reverts with `ScheduleOverlap` when a live pending update already exists. +Param: newMultiplier New multiplier scaled to `WAD_PRECISION`. +Param: effectiveAt Timestamp at which `newMultiplier` becomes effective; must be in the future. + +## Access control + +`OPERATOR_ROLE` gates this Asset call. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20Asset(target).setUIMultiplier(arg0, arg1); +``` + +## Related + +- [IB20Asset reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toRawBalance.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toRawBalance.mdx new file mode 100644 index 000000000..e40959b61 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toRawBalance.mdx @@ -0,0 +1,50 @@ +--- +title: "IB20Asset.toRawBalance" +description: "Generated B20 reference for toRawBalance(uint256)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) + +## Signature + +```solidity +function toRawBalance(uint256 scaledBalance) external view returns (uint256 rawBalance); +``` + +| Field | Value | +|---|---| +| Selector | `0x0ca06c44` | +| Canonical signature | `toRawBalance(uint256)` | + +## Description + +Converts a scaled balance back to its raw representation: +`scaledBalance * WAD_PRECISION / multiplier`. +Dev: Integer division rounds toward zero; conversions are not exactly reversible when +`multiplier != WAD_PRECISION`. `toRawBalance(toScaledBalance(x))` may return a +value slightly less than `x`. +Param: scaledBalance Scaled token amount to convert back. +Return: rawBalance Raw balance at the current multiplier. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20Asset(target).toRawBalance(arg0); +``` + +## Related + +- [IB20Asset reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toScaledBalance.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toScaledBalance.mdx new file mode 100644 index 000000000..1ca67005e --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toScaledBalance.mdx @@ -0,0 +1,46 @@ +--- +title: "IB20Asset.toScaledBalance" +description: "Generated B20 reference for toScaledBalance(uint256)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) + +## Signature + +```solidity +function toScaledBalance(uint256 rawBalance) external view returns (uint256); +``` + +| Field | Value | +|---|---| +| Selector | `0x04f04c99` | +| Canonical signature | `toScaledBalance(uint256)` | + +## Description + +Converts a raw balance to its scaled view: `rawBalance * multiplier / WAD_PRECISION`. +Param: rawBalance Raw token amount to scale. +Return: Scaled balance at the current multiplier. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20Asset(target).toScaledBalance(arg0); +``` + +## Related + +- [IB20Asset reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateExtraMetadata.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateExtraMetadata.mdx new file mode 100644 index 000000000..4b2650ae6 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateExtraMetadata.mdx @@ -0,0 +1,49 @@ +--- +title: "IB20Asset.updateExtraMetadata" +description: "Generated B20 reference for updateExtraMetadata(string,string)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) + +## Signature + +```solidity +function updateExtraMetadata(string calldata key, string calldata value) external; +``` + +| Field | Value | +|---|---| +| Selector | `0xb2851ef5` | +| Canonical signature | `updateExtraMetadata(string,string)` | + +## Description + +Sets, updates, or removes an extra-metadata entry. An empty `value` removes the +entry. Emits `ExtraMetadataUpdated`. +Dev: Reverts with `AccessControlUnauthorizedAccount` when the caller does not hold `METADATA_ROLE`. +Dev: Reverts with `InvalidMetadataKey` when `key` is the empty string. +Param: key Metadata entry key (e.g. `"category"`). +Param: value New value, or empty string to remove. + +## Access control + +`METADATA_ROLE` gates this call. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20Asset(target).updateExtraMetadata(arg0, arg1); +``` + +## Related + +- [IB20Asset reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateMultiplier.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateMultiplier.mdx new file mode 100644 index 000000000..9853df16b --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateMultiplier.mdx @@ -0,0 +1,49 @@ +--- +title: "IB20Asset.updateMultiplier" +description: "Generated B20 reference for updateMultiplier(uint256)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) + +## Signature + +```solidity +function updateMultiplier(uint256 newMultiplier) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x5ffe6146` | +| Canonical signature | `updateMultiplier(uint256)` | + +## Description + +Instant failsafe / emergency override — sets the current multiplier immediately and +cancels any live pending update without a scheduling window. +Prefer `setUIMultiplier` for routine corporate actions. +Dev: Reverts with `AccessControlUnauthorizedAccount` when the caller does not hold `OPERATOR_ROLE`. +Dev: Reverts with `InvalidMultiplier` when `newMultiplier` is zero or above `type(uint128).max`. +Param: newMultiplier New multiplier scaled to `WAD_PRECISION`; must be in `(0, type(uint128).max]`. + +## Access control + +`OPERATOR_ROLE` gates this Asset call. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20Asset(target).updateMultiplier(arg0); +``` + +## Related + +- [IB20Asset reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory.mdx new file mode 100644 index 000000000..4c9fe0854 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory.mdx @@ -0,0 +1,41 @@ +--- +title: "IB20Factory reference" +description: "Generated B20 reference for IB20Factory functions, events, and errors." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Function child pages include selectors, access notes, policy notes, and examples. + + +## Functions + +| Function | Selector | Summary | +|---|---|---| +| [`createB20`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/createB20) | `0xb263cb84` | Creates a B-20 token of the given `variant` at the deterministic address derived | +| [`getB20Address`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/getB20Address) | `0x51038444` | Returns the deterministic address `createB20` would assign for `(variant, sender, salt)`. Never reverts. | +| [`isB20`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20) | `0xfa19b927` | Returns whether `token` was created by this factory, recovered from the address prefix. Never reverts. | +| [`isB20Initialized`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20Initialized) | `0x6a45ba98` | Returns whether `createB20` has run to completion at `token`. Flips exactly once, | + +## Events + +| Event | Topic0 | Summary | +|---|---|---| +| `B20Created` | `0x86ee7a93da43b07286ea4c925a31ba17c41eb00c5ea396883bf32abfe5e73cfc` | Emitted once per `createB20` invocation, after the token's identity is sealed | + +## Errors + +| Error | Selector | Summary | +|---|---|---| +| `NonPayable` | `0x6fb1b0e9` | ETH was attached to a call targeting a nonpayable factory selector. | +| `TokenAlreadyExists` | `0x15ef3a57` | A token already exists at the deterministic address derived from | +| `InvalidVariant` | `0xf10e8e43` | `variant` is not a recognized `B20Variant`. | +| `UnsupportedVersion` | `0x6f3c1955` | The leading `version` byte in `params` does not match any known encoding for the requested variant. | +| `MissingRequiredField` | `0x4a43ae87` | A required string argument was the empty string. | +| `InvalidCurrency` | `0x997c1de8` | The stablecoin `currency` was non-empty but contained a non-`A`-`Z` byte. | +| `InvalidDecimals` | `0xca950391` | The asset `decimals` was outside the allowed inclusive range | +| `InitCallFailed` | `0x4eae0860` | One of the `initCalls` reverted. The factory bubbles the underlying revert reason | + + + + + diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/createB20.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/createB20.mdx new file mode 100644 index 000000000..fe3ea7ed7 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/createB20.mdx @@ -0,0 +1,73 @@ +--- +title: "IB20Factory.createB20" +description: "Generated B20 reference for createB20(B20Variant,bytes32,bytes,bytes[])." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/implementation/deployment-and-initcalls-encoding) + +## Signature + +```solidity +function createB20(B20Variant variant, bytes32 salt, bytes calldata params, bytes[] calldata initCalls) external payable returns (address token); +``` + +| Field | Value | +|---|---| +| Selector | `0xb263cb84` | +| Canonical signature | `createB20(B20Variant,bytes32,bytes,bytes[])` | + +## Description + +Creates a B-20 token of the given `variant` at the deterministic address derived +from `(variant, msg.sender, salt)`, then dispatches each entry in `initCalls` on +the new token. Emits `B20Created`. +Dev: Reverts with `NonPayable` when ETH is attached to the call. +Dev: Reverts with IActivationRegistry.FeatureNotActivated when the variant feature is not activated. +Dev: Reverts with `InvalidVariant` when `variant` is outside the `B20Variant` range. +Dev: Reverts with `UnsupportedVersion` when the leading `version` byte in `params` is unrecognized for `variant`. +Dev: Reverts with `MissingRequiredField` when a required string field is empty (e.g. stablecoin `currency`). +Dev: Reverts with `InvalidCurrency` when a stablecoin `currency` is non-empty but contains a non-`A`-`Z` byte. +Dev: Reverts with `InvalidDecimals` when an asset `decimals` is outside `[B20Constants.MIN_ASSET_DECIMALS, B20Constants.MAX_ASSET_DECIMALS]`. +Dev: Reverts with `TokenAlreadyExists` when a token already exists at the derived address. +Dev: Reverts with `InitCallFailed` (or the bubbled inner reason) when any entry in `initCalls` reverts. +Dev: Each `initCall` executes on the new token within the creation (bootstrap) window, during which +factory-originated calls bypass the token's role gates and its transfer-side policy gates +(`TRANSFER_SENDER_POLICY`, `TRANSFER_RECEIVER_POLICY`, `TRANSFER_EXECUTOR_POLICY`) — so admin-gated +setup (e.g. `grantRole`, `updatePolicy`, `updateSupplyCap`) and bootstrap transfers succeed without +the factory holding any role. The bypass is deliberately NOT total: +- `MINT_RECEIVER_POLICY` is ALWAYS enforced, including for factory-originated mints, so new supply is +never issued to a policy-denied recipient even at creation. An `initCalls` bundle that sets a +restrictive `MINT_RECEIVER_POLICY` and then mints to a non-authorized account reverts +`PolicyForbids(MINT_RECEIVER_POLICY, ...)` (bubbled out of `createB20`). +- Pause is never bypassed. It defaults to nothing-paused at creation, so a start-paused +configuration must sequence its `pause(...)` call last among the `initCalls`. +- Token invariants (supply-cap math, balance accounting) are never bypassed. +The window closes when `createB20` returns; the factory retains no persisted access. +Param: variant Which variant struct `params` decodes as. +Param: salt Caller-chosen salt for deterministic address derivation. +Param: params ABI-encoded variant-specific creation struct, leading with the version byte. +Param: initCalls Bootstrap calls invoked on the new token after identity is sealed. +Return: token The address of the newly created token. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +address token = StdPrecompiles.B20_FACTORY.createB20(variant, salt, params, initCalls); +``` + +## Related + +- [IB20Factory reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/getB20Address.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/getB20Address.mdx new file mode 100644 index 000000000..517afeed9 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/getB20Address.mdx @@ -0,0 +1,48 @@ +--- +title: "IB20Factory.getB20Address" +description: "Generated B20 reference for getB20Address(B20Variant,address,bytes32)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/implementation/deployment-and-initcalls-encoding) + +## Signature + +```solidity +function getB20Address(B20Variant variant, address sender, bytes32 salt) external view returns (address); +``` + +| Field | Value | +|---|---| +| Selector | `0x51038444` | +| Canonical signature | `getB20Address(B20Variant,address,bytes32)` | + +## Description + +Returns the deterministic address `createB20` would assign for `(variant, sender, salt)`. Never reverts. +Param: variant Variant of the token whose address is being predicted. +Param: sender Account that would call `createB20`. +Param: salt Caller-chosen salt. +Return: The deterministic token address. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20Factory(target).getB20Address(arg0, arg1, arg2); +``` + +## Related + +- [IB20Factory reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20.mdx new file mode 100644 index 000000000..a6b13de6a --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20.mdx @@ -0,0 +1,46 @@ +--- +title: "IB20Factory.isB20" +description: "Generated B20 reference for isB20(address)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/implementation/deployment-and-initcalls-encoding) + +## Signature + +```solidity +function isB20(address token) external view returns (bool); +``` + +| Field | Value | +|---|---| +| Selector | `0xfa19b927` | +| Canonical signature | `isB20(address)` | + +## Description + +Returns whether `token` was created by this factory, recovered from the address prefix. Never reverts. +Param: token Address to check. +Return: Whether `token` matches the B-20 address prefix. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20Factory(target).isB20(arg0); +``` + +## Related + +- [IB20Factory reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20Initialized.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20Initialized.mdx new file mode 100644 index 000000000..7364b4da4 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20Initialized.mdx @@ -0,0 +1,47 @@ +--- +title: "IB20Factory.isB20Initialized" +description: "Generated B20 reference for isB20Initialized(address)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/implementation/deployment-and-initcalls-encoding) + +## Signature + +```solidity +function isB20Initialized(address token) external view returns (bool); +``` + +| Field | Value | +|---|---| +| Selector | `0x6a45ba98` | +| Canonical signature | `isB20Initialized(address)` | + +## Description + +Returns whether `createB20` has run to completion at `token`. Flips exactly once, +the moment the creating `createB20` call returns. Never reverts. +Param: token Address to check. +Return: Whether `token` is an initialized B-20. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20Factory(target).isB20Initialized(arg0); +``` + +## Related + +- [IB20Factory reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin.mdx new file mode 100644 index 000000000..c587e6ac3 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin.mdx @@ -0,0 +1,31 @@ +--- +title: "IB20Stablecoin reference" +description: "Generated B20 reference for IB20Stablecoin functions, events, and errors." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Function child pages include selectors, access notes, policy notes, and examples. + + +## Functions + +| Function | Selector | Summary | +|---|---|---| +| [`currency`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin/currency) | `0xe5a6b10f` | The currency code this stablecoin tracks (e.g. `"USD"`, `"EUR"`, `"JPY"`). | + +## Events + +| Event | Topic0 | Summary | +|---|---|---| +| — | — | — | + +## Errors + +| Error | Selector | Summary | +|---|---|---| +| — | — | — | + + + + + diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin/currency.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin/currency.mdx new file mode 100644 index 000000000..7ddb33b44 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin/currency.mdx @@ -0,0 +1,45 @@ +--- +title: "IB20Stablecoin.currency" +description: "Generated B20 reference for currency()." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) + +## Signature + +```solidity +function currency() external view returns (string memory); +``` + +| Field | Value | +|---|---| +| Selector | `0xe5a6b10f` | +| Canonical signature | `currency()` | + +## Description + +The currency code this stablecoin tracks (e.g. `"USD"`, `"EUR"`, `"JPY"`). +Return: Currency code. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +No direct policy interaction. + +## Example + +```solidity +IB20Stablecoin(target).currency(); +``` + +## Related + +- [IB20Stablecoin reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry.mdx new file mode 100644 index 000000000..dc40d85a7 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry.mdx @@ -0,0 +1,57 @@ +--- +title: "IPolicyRegistry reference" +description: "Generated B20 reference for IPolicyRegistry functions, events, and errors." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Function child pages include selectors, access notes, policy notes, and examples. + + +## Functions + +| Function | Selector | Summary | +|---|---|---| +| [`createPolicy`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicy) | `0xe494a1f6` | Creates a new simple policy with no initial members. Permissionless. | +| [`createPolicyWithAccounts`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicyWithAccounts) | `0xffd4931c` | Creates a new simple policy seeded with `accounts` as initial members. Permissionless. | +| [`createCompositePolicy`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createCompositePolicy) | `0xc341f3f0` | Creates a new composite policy that combines existing simple policies under a logic | +| [`stageUpdateAdmin`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/stageUpdateAdmin) | `0x1d7ae695` | Stages a proposed new admin for `policyId`. The active admin does not change | +| [`finalizeUpdateAdmin`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/finalizeUpdateAdmin) | `0x33031a9c` | Completes a two-step admin transfer. Promotes the caller to active admin and clears the pending slot. | +| [`renounceAdmin`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/renounceAdmin) | `0xefdb7fa3` | Permanently relinquishes administration of `policyId`. The member set is frozen | +| [`updateAllowlist`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateAllowlist) | `0x3388fb5b` | Sets `accounts` membership in an ALLOWLIST policy to `allowed` in one batch. | +| [`updateBlocklist`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateBlocklist) | `0x5c4e51b8` | Sets `accounts` membership in a BLOCKLIST policy to `blocked` in one batch. | +| [`updateComposite`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateComposite) | `0xbfe142c0` | Replaces a composite policy's child-policy set in full with `childPolicyIds`. | +| [`isAuthorized`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/isAuthorized) | `0x55a1179e` | Returns whether `account` is authorized under `policyId`. Never reverts; unknown | +| [`policyExists`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyExists) | `0x330f5637` | Returns whether `policyId` is a built-in sentinel or a previously-assigned custom ID. Never reverts. | +| [`policyAdmin`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyAdmin) | `0x09dd0a47` | Returns the current admin of `policyId`, or `address(0)` for built-in sentinels, | +| [`pendingPolicyAdmin`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/pendingPolicyAdmin) | `0x017548b7` | Returns the currently-staged pending admin for `policyId`, or `address(0)` when | +| [`compositePolicyChildIds`](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/compositePolicyChildIds) | `0x7c40df74` | Returns the child-policy set of the composite `policyId`. | + +## Events + +| Event | Topic0 | Summary | +|---|---|---| +| `PolicyCreated` | `0xdc870ce85be577234b8548f42b93f84bbff6d0c1f38ee725c809c49932a13885` | A new policy was created. | +| `PolicyAdminStaged` | `0xdbf3b34a4c956c56ca05cd4b8f9293a4347ad61994445a4b89817d4a19561136` | A new admin was staged. `pendingAdmin == address(0)` clears a prior nomination. | +| `PolicyAdminUpdated` | `0x98925cfb1bc09c5b43dd0dd56d3d95aa04fb3300927580cc588c3f5dd58c15e1` | The active admin changed. `newAdmin == address(0)` indicates renunciation; | +| `AllowlistUpdated` | `0x18c46532f90187ba11e436e21da087b684801d7f0787f2043f26f079c91e9ef0` | One or more accounts had their ALLOWLIST membership set to `allowed` in a single batch. | +| `BlocklistUpdated` | `0x2ff63c102b1b9fd7f5d39f83039c5d6aaf50a414a4f2def2704e41be2628f1e3` | One or more accounts had their BLOCKLIST membership set to `blocked` in a single batch. | +| `CompositePolicyUpdated` | `0x4ff6adaab31b0df87aa7b8b7320c52b8b3b5eede3bf28a6baaaa8b8b7e1d6363` | A composite policy's child set was set or replaced in full with `childPolicyIds`. Emitted | + +## Errors + +| Error | Selector | Summary | +|---|---|---| +| `NonPayable` | `0x6fb1b0e9` | ETH was attached to a call targeting a nonpayable policy registry selector. | +| `Unauthorized` | `0x82b42900` | Caller is not the admin required by the attempted operation. | +| `PolicyNotFound` | `0x720caa4f` | The referenced policy ID does not exist. | +| `IncompatiblePolicyType` | `0xf1011ef5` | The operation is incompatible with the policy's type. | +| `ZeroAddress` | `0xd92e233d` | A required address argument was the zero address. | +| `BatchSizeTooLarge` | `0x083e2f67` | A membership batch exceeded the registry limit. | +| `NoPendingAdmin` | `0xb4539afa` | `finalizeUpdateAdmin` was called with no pending admin staged. | +| `ChildPoliciesOutsideOfRange` | `0xcbdee0f6` | A composite policy was created or updated with a child-policy count outside the | +| `InvalidChildPolicy` | `0x46508ef6` | Composite policies are not simple policies. Child policies must be existing | + + + + + diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/compositePolicyChildIds.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/compositePolicyChildIds.mdx new file mode 100644 index 000000000..513607cb7 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/compositePolicyChildIds.mdx @@ -0,0 +1,52 @@ +--- +title: "IPolicyRegistry.compositePolicyChildIds" +description: "Generated B20 reference for compositePolicyChildIds(uint64)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) + +## Signature + +```solidity +function compositePolicyChildIds(uint64 policyId) external view returns (uint64[] memory); +``` + +| Field | Value | +|---|---| +| Selector | `0x7c40df74` | +| Canonical signature | `compositePolicyChildIds(uint64)` | + +## Description + +Returns the child-policy set of the composite `policyId`. +Dev: Child-policies are listed in the order they were last written. +Dev: Returns an empty array for simple policies, built-in sentinels, unknown IDs, and +malformed IDs. Never reverts. +Dev: An empty return unambiguously means "not a composite". +Dev: The registry preserves the caller's ordering verbatim and neither sorts nor +de-duplicates. +Param: policyId Policy to query. +Return: Child policy IDs, or an empty array. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +This is part of the singleton PolicyRegistry surface used by B20 policy scopes. + +## Example + +```solidity +IPolicyRegistry(target).compositePolicyChildIds(arg0); +``` + +## Related + +- [IPolicyRegistry reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createCompositePolicy.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createCompositePolicy.mdx new file mode 100644 index 000000000..dab77614e --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createCompositePolicy.mdx @@ -0,0 +1,58 @@ +--- +title: "IPolicyRegistry.createCompositePolicy" +description: "Generated B20 reference for createCompositePolicy(address,PolicyType,uint64[])." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) + +## Signature + +```solidity +function createCompositePolicy(address admin, PolicyType policyType, uint64[] calldata childPolicyIds) external returns (uint64 newPolicyId); +``` + +| Field | Value | +|---|---| +| Selector | `0xc341f3f0` | +| Canonical signature | `createCompositePolicy(address,PolicyType,uint64[])` | + +## Description + +Creates a new composite policy that combines existing simple policies under a logic +gate. +Dev: Child policies must be simple policies (ALLOWLIST or BLOCKLIST), never another composite. +The child-policy set is capped at 4. +Dev: Reverts with `IncompatiblePolicyType` when `policyType` is not UNION or INTERSECT. +Dev: Reverts with `ZeroAddress` when `admin` is `address(0)`. +Dev: Reverts with `ChildPoliciesOutsideOfRange(2, 4)` when `childPolicyIds.length` is not in `[2, 4]`. +Dev: Reverts with `PolicyNotFound` when any child policy does not exist. +Dev: Reverts with `InvalidChildPolicy` when any child policy is not a simple policy or a built-in policy. +Dev: Panics with arithmetic overflow (Panic 0x11) when the policy counter has reached its maximum value. +Param: admin Initial admin authorized to update child policies and transfer or renounce +administration. +Param: policyType UNION or INTERSECT. +Param: childPolicyIds Existing simple policy IDs to combine. +Return: newPolicyId The newly assigned composite policy ID. + +## Access control + +Permissionless creation, but state-changing registry calls require the feature to be active. + +## Policy interaction + +This is part of the singleton PolicyRegistry surface used by B20 policy scopes. + +## Example + +```solidity +IPolicyRegistry(target).createCompositePolicy(arg0, arg1, arg2); +``` + +## Related + +- [IPolicyRegistry reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicy.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicy.mdx new file mode 100644 index 000000000..950e4f957 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicy.mdx @@ -0,0 +1,49 @@ +--- +title: "IPolicyRegistry.createPolicy" +description: "Generated B20 reference for createPolicy(address,PolicyType)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) + +## Signature + +```solidity +function createPolicy(address admin, PolicyType policyType) external returns (uint64 newPolicyId); +``` + +| Field | Value | +|---|---| +| Selector | `0xe494a1f6` | +| Canonical signature | `createPolicy(address,PolicyType)` | + +## Description + +Creates a new simple policy with no initial members. Permissionless. +Dev: Reverts with `ZeroAddress` when `admin` is `address(0)`. +Dev: Reverts with `IncompatiblePolicyType` when `policyType` is a composite gate. +Param: admin Initial admin authorized to modify membership and transfer or renounce administration. +Param: policyType BLOCKLIST or ALLOWLIST. +Return: newPolicyId The newly assigned policy ID. + +## Access control + +Permissionless creation, but state-changing registry calls require the feature to be active. + +## Policy interaction + +This is part of the singleton PolicyRegistry surface used by B20 policy scopes. + +## Example + +```solidity +uint64 policyId = StdPrecompiles.POLICY_REGISTRY.createPolicy(admin, IPolicyRegistry.PolicyType.ALLOWLIST); +``` + +## Related + +- [IPolicyRegistry reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicyWithAccounts.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicyWithAccounts.mdx new file mode 100644 index 000000000..00d85293d --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicyWithAccounts.mdx @@ -0,0 +1,52 @@ +--- +title: "IPolicyRegistry.createPolicyWithAccounts" +description: "Generated B20 reference for createPolicyWithAccounts(address,PolicyType,address[])." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) + +## Signature + +```solidity +function createPolicyWithAccounts(address admin, PolicyType policyType, address[] calldata accounts) external returns (uint64 newPolicyId); +``` + +| Field | Value | +|---|---| +| Selector | `0xffd4931c` | +| Canonical signature | `createPolicyWithAccounts(address,PolicyType,address[])` | + +## Description + +Creates a new simple policy seeded with `accounts` as initial members. Permissionless. +Dev: Reverts with `ZeroAddress` when `admin` is `address(0)`. Takes precedence over `BatchSizeTooLarge`. +Dev: Reverts with `IncompatiblePolicyType` when `policyType` is a composite policyType. +Dev: Reverts with `BatchSizeTooLarge` when `accounts.length` exceeds the registry limit. +Dev: Panics with arithmetic overflow (Panic 0x11) when the policy counter has reached its maximum value. +Param: admin Initial admin authorized to modify membership and transfer or renounce administration. +Param: policyType BLOCKLIST or ALLOWLIST. +Param: accounts Initial member set. +Return: newPolicyId The newly assigned policy ID. + +## Access control + +Permissionless creation, but state-changing registry calls require the feature to be active. + +## Policy interaction + +This is part of the singleton PolicyRegistry surface used by B20 policy scopes. + +## Example + +```solidity +uint64 policyId = StdPrecompiles.POLICY_REGISTRY.createPolicyWithAccounts(admin, IPolicyRegistry.PolicyType.ALLOWLIST, accounts); +``` + +## Related + +- [IPolicyRegistry reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/finalizeUpdateAdmin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/finalizeUpdateAdmin.mdx new file mode 100644 index 000000000..4e3065e05 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/finalizeUpdateAdmin.mdx @@ -0,0 +1,48 @@ +--- +title: "IPolicyRegistry.finalizeUpdateAdmin" +description: "Generated B20 reference for finalizeUpdateAdmin(uint64)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) + +## Signature + +```solidity +function finalizeUpdateAdmin(uint64 policyId) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x33031a9c` | +| Canonical signature | `finalizeUpdateAdmin(uint64)` | + +## Description + +Completes a two-step admin transfer. Promotes the caller to active admin and clears the pending slot. +Dev: Reverts with `PolicyNotFound` when `policyId` does not exist. +Dev: Reverts with `NoPendingAdmin` when no transfer is in flight. +Dev: Reverts with `Unauthorized` when the caller is not the staged pending admin. +Param: policyId Policy whose admin transfer is being finalized. + +## Access control + +Callable by the policy admin for the target policy. + +## Policy interaction + +This is part of the singleton PolicyRegistry surface used by B20 policy scopes. + +## Example + +```solidity +IPolicyRegistry(target).finalizeUpdateAdmin(arg0); +``` + +## Related + +- [IPolicyRegistry reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/isAuthorized.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/isAuthorized.mdx new file mode 100644 index 000000000..f843e04da --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/isAuthorized.mdx @@ -0,0 +1,50 @@ +--- +title: "IPolicyRegistry.isAuthorized" +description: "Generated B20 reference for isAuthorized(uint64,address)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) + +## Signature + +```solidity +function isAuthorized(uint64 policyId, address account) external view returns (bool); +``` + +| Field | Value | +|---|---| +| Selector | `0x55a1179e` | +| Canonical signature | `isAuthorized(uint64,address)` | + +## Description + +Returns whether `account` is authorized under `policyId`. Never reverts; unknown +or malformed IDs collapse to empty-member-set semantics (ALLOWLIST -> false, +BLOCKLIST -> true). +Dev: Callers that store policy IDs MUST validate `policyExists(policyId)` at write time. +Param: policyId Policy to query. +Param: account Account to check. +Return: Whether `account` is authorized. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +This is part of the singleton PolicyRegistry surface used by B20 policy scopes. + +## Example + +```solidity +bool ok = StdPrecompiles.POLICY_REGISTRY.isAuthorized(policyId, account); +``` + +## Related + +- [IPolicyRegistry reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/pendingPolicyAdmin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/pendingPolicyAdmin.mdx new file mode 100644 index 000000000..b2d5a23ce --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/pendingPolicyAdmin.mdx @@ -0,0 +1,48 @@ +--- +title: "IPolicyRegistry.pendingPolicyAdmin" +description: "Generated B20 reference for pendingPolicyAdmin(uint64)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) + +## Signature + +```solidity +function pendingPolicyAdmin(uint64 policyId) external view returns (address); +``` + +| Field | Value | +|---|---| +| Selector | `0x017548b7` | +| Canonical signature | `pendingPolicyAdmin(uint64)` | + +## Description + +Returns the currently-staged pending admin for `policyId`, or `address(0)` when +no transfer is in flight or for built-in sentinels, unknown IDs, and malformed IDs. +Never reverts. +Param: policyId Policy to query. +Return: Pending admin, or `address(0)`. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +This is part of the singleton PolicyRegistry surface used by B20 policy scopes. + +## Example + +```solidity +IPolicyRegistry(target).pendingPolicyAdmin(arg0); +``` + +## Related + +- [IPolicyRegistry reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyAdmin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyAdmin.mdx new file mode 100644 index 000000000..72ad19d0d --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyAdmin.mdx @@ -0,0 +1,47 @@ +--- +title: "IPolicyRegistry.policyAdmin" +description: "Generated B20 reference for policyAdmin(uint64)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) + +## Signature + +```solidity +function policyAdmin(uint64 policyId) external view returns (address); +``` + +| Field | Value | +|---|---| +| Selector | `0x09dd0a47` | +| Canonical signature | `policyAdmin(uint64)` | + +## Description + +Returns the current admin of `policyId`, or `address(0)` for built-in sentinels, +renounced policies, unknown IDs, and malformed IDs. Never reverts. +Param: policyId Policy to query. +Return: Current admin, or `address(0)`. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +This is part of the singleton PolicyRegistry surface used by B20 policy scopes. + +## Example + +```solidity +IPolicyRegistry(target).policyAdmin(arg0); +``` + +## Related + +- [IPolicyRegistry reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyExists.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyExists.mdx new file mode 100644 index 000000000..e02a7aa6a --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyExists.mdx @@ -0,0 +1,46 @@ +--- +title: "IPolicyRegistry.policyExists" +description: "Generated B20 reference for policyExists(uint64)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) + +## Signature + +```solidity +function policyExists(uint64 policyId) external view returns (bool); +``` + +| Field | Value | +|---|---| +| Selector | `0x330f5637` | +| Canonical signature | `policyExists(uint64)` | + +## Description + +Returns whether `policyId` is a built-in sentinel or a previously-assigned custom ID. Never reverts. +Param: policyId Policy to query. +Return: Whether the policy exists. + +## Access control + +Read-only or ERC-20-standard access rules unless the NatSpec states otherwise. + +## Policy interaction + +This is part of the singleton PolicyRegistry surface used by B20 policy scopes. + +## Example + +```solidity +IPolicyRegistry(target).policyExists(arg0); +``` + +## Related + +- [IPolicyRegistry reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/renounceAdmin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/renounceAdmin.mdx new file mode 100644 index 000000000..7867c25ce --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/renounceAdmin.mdx @@ -0,0 +1,48 @@ +--- +title: "IPolicyRegistry.renounceAdmin" +description: "Generated B20 reference for renounceAdmin(uint64)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) + +## Signature + +```solidity +function renounceAdmin(uint64 policyId) external; +``` + +| Field | Value | +|---|---| +| Selector | `0xefdb7fa3` | +| Canonical signature | `renounceAdmin(uint64)` | + +## Description + +Permanently relinquishes administration of `policyId`. The member set is frozen +and the policy can never be re-administered; `isAuthorized` queries continue to work. +Dev: Reverts with `PolicyNotFound` when `policyId` does not exist. +Dev: Reverts with `Unauthorized` when the caller is not the current admin. +Param: policyId Policy whose administration is being renounced. + +## Access control + +Callable by the policy admin for the target policy. + +## Policy interaction + +This is part of the singleton PolicyRegistry surface used by B20 policy scopes. + +## Example + +```solidity +IPolicyRegistry(target).renounceAdmin(arg0); +``` + +## Related + +- [IPolicyRegistry reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/stageUpdateAdmin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/stageUpdateAdmin.mdx new file mode 100644 index 000000000..65fdee2e8 --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/stageUpdateAdmin.mdx @@ -0,0 +1,49 @@ +--- +title: "IPolicyRegistry.stageUpdateAdmin" +description: "Generated B20 reference for stageUpdateAdmin(uint64,address)." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) + +## Signature + +```solidity +function stageUpdateAdmin(uint64 policyId, address newAdmin) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x1d7ae695` | +| Canonical signature | `stageUpdateAdmin(uint64,address)` | + +## Description + +Stages a proposed new admin for `policyId`. The active admin does not change +until `pendingAdmin` calls `finalizeUpdateAdmin`. +Dev: Reverts with `PolicyNotFound` when `policyId` does not exist. +Dev: Reverts with `Unauthorized` when the caller is not the current admin. +Param: policyId Policy whose admin is being staged. +Param: newAdmin Proposed new admin, or `address(0)` to clear any pending nomination. + +## Access control + +Callable by the policy admin for the target policy. + +## Policy interaction + +This is part of the singleton PolicyRegistry surface used by B20 policy scopes. + +## Example + +```solidity +IPolicyRegistry(target).stageUpdateAdmin(arg0, arg1); +``` + +## Related + +- [IPolicyRegistry reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateAllowlist.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateAllowlist.mdx new file mode 100644 index 000000000..e501991df --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateAllowlist.mdx @@ -0,0 +1,51 @@ +--- +title: "IPolicyRegistry.updateAllowlist" +description: "Generated B20 reference for updateAllowlist(uint64,bool,address[])." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) + +## Signature + +```solidity +function updateAllowlist(uint64 policyId, bool allowed, address[] calldata accounts) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x3388fb5b` | +| Canonical signature | `updateAllowlist(uint64,bool,address[])` | + +## Description + +Sets `accounts` membership in an ALLOWLIST policy to `allowed` in one batch. +Dev: Reverts with `PolicyNotFound` when `policyId` does not exist. +Dev: Reverts with `IncompatiblePolicyType` when the policy is not ALLOWLIST. +Dev: Reverts with `Unauthorized` when the caller is not the current admin. +Dev: Reverts with `BatchSizeTooLarge` when `accounts.length` exceeds the registry limit. +Param: policyId Policy to update. +Param: allowed Membership state to apply to every account in the batch. +Param: accounts Accounts to update. + +## Access control + +Callable by the policy admin for the target policy. + +## Policy interaction + +This is part of the singleton PolicyRegistry surface used by B20 policy scopes. + +## Example + +```solidity +IPolicyRegistry(target).updateAllowlist(arg0, arg1, arg2); +``` + +## Related + +- [IPolicyRegistry reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateBlocklist.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateBlocklist.mdx new file mode 100644 index 000000000..f4d90a3fb --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateBlocklist.mdx @@ -0,0 +1,51 @@ +--- +title: "IPolicyRegistry.updateBlocklist" +description: "Generated B20 reference for updateBlocklist(uint64,bool,address[])." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) + +## Signature + +```solidity +function updateBlocklist(uint64 policyId, bool blocked, address[] calldata accounts) external; +``` + +| Field | Value | +|---|---| +| Selector | `0x5c4e51b8` | +| Canonical signature | `updateBlocklist(uint64,bool,address[])` | + +## Description + +Sets `accounts` membership in a BLOCKLIST policy to `blocked` in one batch. +Dev: Reverts with `PolicyNotFound` when `policyId` does not exist. +Dev: Reverts with `IncompatiblePolicyType` when the policy is not BLOCKLIST. +Dev: Reverts with `Unauthorized` when the caller is not the current admin. +Dev: Reverts with `BatchSizeTooLarge` when `accounts.length` exceeds the registry limit. +Param: policyId Policy to update. +Param: blocked Membership state to apply to every account in the batch. +Param: accounts Accounts to update. + +## Access control + +Callable by the policy admin for the target policy. + +## Policy interaction + +This is part of the singleton PolicyRegistry surface used by B20 policy scopes. + +## Example + +```solidity +IPolicyRegistry(target).updateBlocklist(arg0, arg1, arg2); +``` + +## Related + +- [IPolicyRegistry reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateComposite.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateComposite.mdx new file mode 100644 index 000000000..c9a84961d --- /dev/null +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateComposite.mdx @@ -0,0 +1,55 @@ +--- +title: "IPolicyRegistry.updateComposite" +description: "Generated B20 reference for updateComposite(uint64,uint64[])." +--- + + +Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. + + +[Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) + +## Signature + +```solidity +function updateComposite(uint64 policyId, uint64[] calldata childPolicyIds) external; +``` + +| Field | Value | +|---|---| +| Selector | `0xbfe142c0` | +| Canonical signature | `updateComposite(uint64,uint64[])` | + +## Description + +Replaces a composite policy's child-policy set in full with `childPolicyIds`. +Dev: Reverts with `PolicyNotFound` when `policyId` does not exist. +Dev: Reverts with `IncompatiblePolicyType` when `policyId` is not a composite (UNION or INTERSECT). +Dev: Reverts with `Unauthorized` when the caller is not the current admin. A renounced composite +(admin `address(0)`) can never be updated. +Dev: Reverts with `ChildPoliciesOutsideOfRange(2, 4)` when `childPolicyIds.length` is not in `[2, 4]`; +there is no clear-the-list path (the composite child-policy range, not the 64-account batch limit). +Dev: Reverts with `PolicyNotFound` when any child policy does not exist. +Dev: Reverts with `InvalidChildPolicy` when any child policy is itself a composite +(not a simple policy). +Param: policyId Composite policy to update. +Param: childPolicyIds Complete new set of existing simple policy IDs. + +## Access control + +Callable by the policy admin for the target policy. + +## Policy interaction + +This is part of the singleton PolicyRegistry surface used by B20 policy scopes. + +## Example + +```solidity +IPolicyRegistry(target).updateComposite(arg0, arg1); +``` + +## Related + +- [IPolicyRegistry reference](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry) +- [Constants & addresses](/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses) diff --git a/docs/base-chain/specs/upgrades/beryl/overview.mdx b/docs/base-chain/specs/upgrades/beryl/overview.mdx index 3ff77e873..a34289651 100644 --- a/docs/base-chain/specs/upgrades/beryl/overview.mdx +++ b/docs/base-chain/specs/upgrades/beryl/overview.mdx @@ -5,10 +5,10 @@ description: "Overview of the Beryl hardfork, introducing the B20 native token s ## Summary -- Introduce [B20](/base-chain/specs/upgrades/beryl/b20): Base's native token standard for stablecoin, real-world asset (RWA), and long-tail token issuers +- Introduce [B20](/base-chain/specs/upgrades/beryl/b20/specification/overview): Base's native token standard for stablecoin, real-world asset (RWA), and long-tail token issuers - Reduce the single-proof withdrawal finalization period from 7 days to 5 days for increased capital efficiency - Reth V2: up to 50% disk reduction and a rewritten state root pipeline delivering +33% throughput -- Upcoming in a later Beryl phase: [native account abstraction (EIP-8130)](/base-chain/specs/upgrades/beryl/eip-8130), currently previewing on the vibenet devnet +- Upcoming in a later Beryl phase: native account abstraction (EIP-8130), currently previewing on the vibenet devnet ## Activation Timestamps @@ -33,19 +33,19 @@ Action required before activation. Upgrade to the required version before each n B20 is Base's native token standard - ERC-20 compatible tokens implemented as Rust precompiles, designed for stablecoin, real-world asset, and long-tail token issuers. -- [B20 Overview](/base-chain/specs/upgrades/beryl/b20) -- [Roles Model](/base-chain/specs/upgrades/beryl/b20#roles-model) -- [Policy Integration](/base-chain/specs/upgrades/beryl/b20#policy-integration) -- [Factory](/base-chain/specs/upgrades/beryl/b20#factory) -- [Policy Registry](/base-chain/specs/upgrades/beryl/b20#policy-registry) -- [Mint & Burn](/base-chain/specs/upgrades/beryl/b20#mint) -- [Variants](/base-chain/specs/upgrades/beryl/b20#variants) +- [B20 Overview](/base-chain/specs/upgrades/beryl/b20/specification/overview) +- [Roles & access control](/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control) +- [Policy Integration](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) +- [Factory](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory) +- [Policy Registry](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) +- [Token lifecycle](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) +- [Variants](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) ## Native Account Abstraction (EIP-8130) A later Beryl phase brings account abstraction into the protocol. Accounts configure authorized actors and signature validation onchain. Apps get portable smart accounts, scoped session keys, atomic batching, and native gas sponsorship without bundler or relay infrastructure. EIP-8130 is experimental and currently runs only on the vibenet devnet. -- [Native Account Abstraction (EIP-8130)](/base-chain/specs/upgrades/beryl/eip-8130) +- Native Account Abstraction (EIP-8130): planned for a later Beryl phase ## Withdrawals diff --git a/docs/docs.json b/docs/docs.json index f6ddd67f2..1997d74bb 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -9,14 +9,21 @@ }, "favicon": "/logo/favicon.png", "contextual": { - "options": ["copy", "view", "claude", "chatgpt"] + "options": [ + "copy", + "view", + "claude", + "chatgpt" + ] }, "api": { "playground": { "display": "simple" }, "examples": { - "languages": ["javascript"] + "languages": [ + "javascript" + ] } }, "seo": { @@ -32,7 +39,9 @@ "groups": [ { "group": "Introduction", - "pages": ["get-started/base"] + "pages": [ + "get-started/base" + ] }, { "group": "Quickstart", @@ -269,8 +278,46 @@ "group": "Beryl", "pages": [ "base-chain/specs/upgrades/beryl/overview", - "base-chain/specs/upgrades/beryl/b20" - + { + "group": "B20", + "pages": [ + "base-chain/specs/upgrades/beryl/b20/specification/overview", + "get-started/launch-b20-token", + { + "group": "Concepts", + "pages": [ + "base-chain/specs/upgrades/beryl/b20/specification/concepts/architecture-and-precompiles", + "base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes", + "base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control", + "base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle", + "base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin" + ] + }, + { + "group": "Implementation", + "pages": [ + "base-chain/specs/upgrades/beryl/b20/specification/implementation/working-with-base-std", + "base-chain/specs/upgrades/beryl/b20/specification/implementation/policy-configuration-in-code", + "base-chain/specs/upgrades/beryl/b20/specification/implementation/deployment-and-initcalls-encoding", + "base-chain/specs/upgrades/beryl/b20/specification/implementation/testing-against-precompiles" + ] + }, + { + "group": "Reference", + "pages": [ + "base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses", + "base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20", + "base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset", + "base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin", + "base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory", + "base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry", + "base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry", + "base-chain/specs/upgrades/beryl/b20/specification/reference/errors-and-events-index" + ] + }, + "base-chain/specs/upgrades/beryl/b20/specification" + ] + } ] }, { @@ -410,7 +457,9 @@ "groups": [ { "group": "Introduction", - "pages": ["base-account/overview/what-is-base-account"] + "pages": [ + "base-account/overview/what-is-base-account" + ] }, { "group": "Quickstart", @@ -646,7 +695,9 @@ "groups": [ { "group": "Overview", - "pages": ["ledgers/overview"] + "pages": [ + "ledgers/overview" + ] }, { "group": "Ledgers", @@ -679,7 +730,9 @@ }, { "group": "Growth", - "pages": ["apps/growth/rewards"] + "pages": [ + "apps/growth/rewards" + ] }, { "group": "Builder Codes", @@ -697,11 +750,15 @@ "groups": [ { "group": "Overview", - "pages": ["agents/index"] + "pages": [ + "agents/index" + ] }, { "group": "Quickstart", - "pages": ["agents/quickstart"] + "pages": [ + "agents/quickstart" + ] }, { "group": "Guides", @@ -3256,6 +3313,26 @@ { "source": "/ai-agents/:slug*", "destination": "/agents/:slug*" + }, + { + "source": "/base-chain/specs/upgrades/beryl/b20/concepts/*", + "destination": "/base-chain/specs/upgrades/beryl/b20/specification/concepts/*" + }, + { + "source": "/base-chain/specs/upgrades/beryl/b20/implementation/*", + "destination": "/base-chain/specs/upgrades/beryl/b20/specification/implementation/*" + }, + { + "source": "/base-chain/specs/upgrades/beryl/b20/reference/*", + "destination": "/base-chain/specs/upgrades/beryl/b20/specification/reference/*" + }, + { + "source": "/base-chain/b20", + "destination": "/base-chain/specs/upgrades/beryl/b20/specification/overview" + }, + { + "source": "/base-chain/b20/*", + "destination": "/base-chain/specs/upgrades/beryl/b20/specification/*" } ], "integrations": { @@ -3263,4 +3340,4 @@ "measurementId": "G-TKCM02YFWN" } } -} +} \ No newline at end of file diff --git a/docs/get-started/launch-b20-token.mdx b/docs/get-started/launch-b20-token.mdx index 2dc6adbce..383b24e6c 100644 --- a/docs/get-started/launch-b20-token.mdx +++ b/docs/get-started/launch-b20-token.mdx @@ -5,7 +5,7 @@ description: "Launch a B20 token on Base with one call to the B20 Factory precom B20 is an ERC-20 superset that runs as a native precompile on Base, which makes transfers cheaper and higher-throughput than a standard contract token while keeping full ERC-20 compatibility. Roles, supply caps, pausing, policy gating, memos, and `permit` are built into the chain. -A standard ERC-20 leaves that logic for you to build, audit, and maintain. With B20, you call the singleton [**B20 Factory**](/base-chain/specs/upgrades/beryl/b20#factory) to create a token, fully configured, in a single transaction. +A standard ERC-20 leaves that logic for you to build, audit, and maintain. With B20, you call the singleton [**B20 Factory**](/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory) to create a token, fully configured, in a single transaction. This guide creates an Asset token, mints its initial supply, and verifies the balance onchain. To accept the token as payment in an app, continue with [Accept B20 payments](/apps/guides/accept-b20-payments). @@ -327,4 +327,5 @@ All without writing, deploying, or auditing a token contract. ## Next steps * [Accept B20 payments in an app](/apps/guides/accept-b20-payments): wire this token into a checkout flow that tags each payment with an order ID and reconciles it from onchain events. -* Gate transfers or mints with PolicyRegistry policies, add granular pause, or manage roles. See the [B20 token standard](/base-chain/specs/upgrades/beryl/b20). \ No newline at end of file +* Your token currently allows every transfer, by everyone, to anyone. That is a choice, not an accident — [configure policies in code](/base-chain/specs/upgrades/beryl/b20/specification/implementation/policy-configuration-in-code) to change it. +* Learn the full model in the [B20 token standard](/base-chain/specs/upgrades/beryl/b20/specification/overview). \ No newline at end of file diff --git a/docs/images/b20/b20-architecture-precompiles.png b/docs/images/b20/b20-architecture-precompiles.png new file mode 100644 index 0000000000000000000000000000000000000000..3c66e59632d962bfcfdeefae0ccd407fe8affd50 GIT binary patch literal 54390 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�C&Gy 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 literal 0 HcmV?d00001 diff --git a/docs/llms-full.txt b/docs/llms-full.txt index a1c8c522f..598c0e05f 100644 --- a/docs/llms-full.txt +++ b/docs/llms-full.txt @@ -102,7 +102,7 @@ const client = createPublicClient({ chain: base, transport: http() }) - [Static Docs Files](https://docs.base.org/get-started/docs-llms): Use llms.txt and llms-full.txt to give AI assistants access to Base documentation. - [MCP Server](https://docs.base.org/get-started/docs-mcp): Connect your AI coding assistant to Base documentation using Model Context Protocol for real-time access. - [Get Funded](https://docs.base.org/get-started/get-funded): The Base ecosystem offers multiple funding pathways designed specifically for builders at every stage—from weekend experiments to full-scale ventures. -- [Launch a B20 Token](https://docs.base.org/get-started/launch-b20-token): Launch a B20 token on Base by calling the B20 Factory precompile. +- [Launch a B20 token](https://docs.base.org/get-started/launch-b20-token): Launch a B20 token on Base with one call to the B20 Factory precompile, with roles, supply caps, and compliance controls built in. - [Launch a Token](https://docs.base.org/get-started/launch-token) - [Learning Resources](https://docs.base.org/get-started/learning-resources): Find educational content for learning Solidity, Ethereum, and blockchain development - [Developer's Guide to Effective AI Prompting](https://docs.base.org/get-started/prompt-library): Learn practical AI prompting techniques to enhance your coding workflow and get better results from AI coding assistants. @@ -116,6 +116,8 @@ const client = createPublicClient({ chain: base, transport: http() }) - [Overview](https://docs.base.org/base-chain/specs/protocol/overview): High-level overview of the Base Chain protocol, covering rollup architecture, core components, and user flows for deposits, transactions, and withdrawals. - [Proofs](https://docs.base.org/base-chain/specs/protocol/proofs/index): Overview of the offchain services and onchain contracts that make L2 checkpoint proposals verifiable from Ethereum in the Azul proof system. - [Overview](https://docs.base.org/base-chain/specs/upgrades/azul/overview): Overview of the Azul hardfork, introducing Osaka EVM support, a simplified execution client, and a multi-proof system for L2 checkpoints. +- [B20 specification](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/index): Normative Beryl specification for Base's B20 native token standard, precompile registries, policy scopes, factory, and variants. +- [B20 token standard](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/overview): Build with Base-native B20 tokens: ERC-20 compatible precompile tokens with roles, policy scopes, memos, supply caps, pausing, and variants. - [Overview](https://docs.base.org/base-chain/specs/upgrades/beryl/overview): Overview of the Beryl hardfork, introducing the B20 native token standard, reduced withdrawal delays, and Reth V2. - [Canyon](https://docs.base.org/base-chain/specs/upgrades/canyon/overview): Overview of the Canyon hardfork, bringing Ethereum Shanghai EIPs (EIP-3651, EIP-3855, EIP-3860) to the Base execution layer. - [Delta](https://docs.base.org/base-chain/specs/upgrades/delta/overview): Overview of the Delta hardfork, introducing span batches to reduce L1 data costs by compressing multiple L2 blocks into single batcher transactions. @@ -206,7 +208,114 @@ const client = createPublicClient({ chain: base, transport: http() }) - [Execution Engine](https://docs.base.org/base-chain/specs/upgrades/azul/exec-engine): Execution engine changes in the Azul hardfork, including the EIP-7825 transaction gas limit cap and secp256r1 precompile cost updates. - [Node Upgrade Guide](https://docs.base.org/base-chain/specs/upgrades/azul/node-upgrade): Migrate your Base node to base-reth-node and base-consensus for Azul. - [Proof System](https://docs.base.org/base-chain/specs/upgrades/azul/proofs): Specification of the Azul multi-proof system, replacing the single output proposer with an AggregateVerifier contract for L2 checkpoint security. -- [B20 Native Token Standard](https://docs.base.org/base-chain/specs/upgrades/beryl/b20): B20 is Base's native token standard - designed for stablecoin issuers, real-world asset (RWA) and equity issuers, and long-tail token creators. +- [B20 playground](https://docs.base.org/base-chain/specs/upgrades/beryl/b20-playground): Try B20's issuer flows in your browser: freeze-and-seize, payment memos, gasless approvals, and onchain corporate actions on Base. +- [Architecture & precompiles](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/concepts/architecture-and-precompiles): Understand the B20 precompile architecture, fixed addresses, activation gates, and deterministic token addresses. +- [Policies & scopes](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes): Learn how B20 policy scopes point to PolicyRegistry policies and gate transfers, mints, and seizures. +- [Roles & access control](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control): Understand B20 roles, access-control gates, user-defined roles, and irreversible admin renunciation. +- [Token lifecycle](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle): Follow a B20 token from factory creation through initCalls, operation, pausing, memos, seizures, and admin renunciation. +- [Variants: Asset vs Stablecoin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin): Choose between B20 Asset and Stablecoin variants and understand their variant-specific behavior. +- [Deployment & initCalls encoding](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/implementation/deployment-and-initcalls-encoding): Use B20FactoryLib to encode createB20 params and initCalls for atomic B20 token deployment. +- [Policy configuration in code](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/implementation/policy-configuration-in-code): Read, audit, create, update, and bind B20 PolicyRegistry policies from Solidity. +- [Testing against precompiles](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/implementation/testing-against-precompiles): Test B20 code with base-std mocks, base-forge in-process live precompiles, and forked base-anvil nodes. +- [Working with base-std](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/implementation/working-with-base-std): Install base-std and use StdPrecompiles, B20Constants, interfaces, and helper libraries for B20 development. +- [Constants & addresses](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses): Copy B20 precompile addresses, roles, policy scopes, variant bytes, policy IDs, and supply-cap constants. +- [Errors & events index](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/errors-and-events-index): Reverse lookup B20 errors and events by selector or topic. +- [IActivationRegistry reference](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry): Generated B20 reference for IActivationRegistry functions, events, and errors. +- [IActivationRegistry.activate](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/activate): Generated B20 reference for activate(bytes32). +- [IActivationRegistry.admin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/admin): Generated B20 reference for admin(). +- [IActivationRegistry.checkActivated](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/checkActivated): Generated B20 reference for checkActivated(bytes32). +- [IActivationRegistry.deactivate](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/deactivate): Generated B20 reference for deactivate(bytes32). +- [IActivationRegistry.isActivated](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/isActivated): Generated B20 reference for isActivated(bytes32). +- [IB20 reference](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20): Generated B20 reference for IB20 functions, events, and errors. +- [IB20.allowance](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/allowance): Generated B20 reference for allowance(address,address). +- [IB20.approve](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/approve): Generated B20 reference for approve(address,uint256). +- [IB20.balanceOf](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/balanceOf): Generated B20 reference for balanceOf(address). +- [IB20.burn](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burn): Generated B20 reference for burn(uint256). +- [IB20.BURN_BLOCKED_ROLE](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_BLOCKED_ROLE): Generated B20 reference for BURN_BLOCKED_ROLE(). +- [IB20.BURN_ROLE](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_ROLE): Generated B20 reference for BURN_ROLE(). +- [IB20.burnWithMemo](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burnWithMemo): Generated B20 reference for burnWithMemo(uint256,bytes32). +- [IB20.contractURI](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/contractURI): Generated B20 reference for contractURI(). +- [IB20.decimals](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/decimals): Generated B20 reference for decimals(). +- [IB20.DEFAULT_ADMIN_ROLE](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DEFAULT_ADMIN_ROLE): Generated B20 reference for DEFAULT_ADMIN_ROLE(). +- [IB20.DOMAIN_SEPARATOR](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DOMAIN_SEPARATOR): Generated B20 reference for DOMAIN_SEPARATOR(). +- [IB20.eip712Domain](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/eip712Domain): Generated B20 reference for eip712Domain(). +- [IB20.getRoleAdmin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/getRoleAdmin): Generated B20 reference for getRoleAdmin(bytes32). +- [IB20.grantRole](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/grantRole): Generated B20 reference for grantRole(bytes32,address). +- [IB20.hasRole](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/hasRole): Generated B20 reference for hasRole(bytes32,address). +- [IB20.isPaused](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/isPaused): Generated B20 reference for isPaused(PausableFeature). +- [IB20.METADATA_ROLE](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/METADATA_ROLE): Generated B20 reference for METADATA_ROLE(). +- [IB20.mint](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mint): Generated B20 reference for mint(address,uint256). +- [IB20.MINT_RECEIVER_POLICY](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_RECEIVER_POLICY): Generated B20 reference for MINT_RECEIVER_POLICY(). +- [IB20.MINT_ROLE](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_ROLE): Generated B20 reference for MINT_ROLE(). +- [IB20.mintWithMemo](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mintWithMemo): Generated B20 reference for mintWithMemo(address,uint256,bytes32). +- [IB20.name](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/name): Generated B20 reference for name(). +- [IB20.nonces](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/nonces): Generated B20 reference for nonces(address). +- [IB20.pause](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pause): Generated B20 reference for pause(PausableFeature[]). +- [IB20.PAUSE_ROLE](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/PAUSE_ROLE): Generated B20 reference for PAUSE_ROLE(). +- [IB20.pausedFeatures](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pausedFeatures): Generated B20 reference for pausedFeatures(). +- [IB20.permit](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/permit): Generated B20 reference for permit(address,address,uint256,uint256,uint8,bytes32,bytes32). +- [IB20.policyId](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/policyId): Generated B20 reference for policyId(bytes32). +- [IB20.renounceLastAdmin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceLastAdmin): Generated B20 reference for renounceLastAdmin(). +- [IB20.renounceRole](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceRole): Generated B20 reference for renounceRole(bytes32,address). +- [IB20.revokeRole](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/revokeRole): Generated B20 reference for revokeRole(bytes32,address). +- [IB20.SEIZE_HOLDER_POLICY](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_HOLDER_POLICY): Generated B20 reference for SEIZE_HOLDER_POLICY(). +- [IB20.SEIZE_ROLE](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_ROLE): Generated B20 reference for SEIZE_ROLE(). +- [IB20.seizeWithMemo](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/seizeWithMemo): Generated B20 reference for seizeWithMemo(address,address,uint256,bytes32). +- [IB20.setRoleAdmin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/setRoleAdmin): Generated B20 reference for setRoleAdmin(bytes32,bytes32). +- [IB20.supplyCap](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/supplyCap): Generated B20 reference for supplyCap(). +- [IB20.symbol](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/symbol): Generated B20 reference for symbol(). +- [IB20.totalSupply](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/totalSupply): Generated B20 reference for totalSupply(). +- [IB20.transfer](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transfer): Generated B20 reference for transfer(address,uint256). +- [IB20.TRANSFER_EXECUTOR_POLICY](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_EXECUTOR_POLICY): Generated B20 reference for TRANSFER_EXECUTOR_POLICY(). +- [IB20.TRANSFER_RECEIVER_POLICY](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_RECEIVER_POLICY): Generated B20 reference for TRANSFER_RECEIVER_POLICY(). +- [IB20.TRANSFER_SENDER_POLICY](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_SENDER_POLICY): Generated B20 reference for TRANSFER_SENDER_POLICY(). +- [IB20.transferFrom](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFrom): Generated B20 reference for transferFrom(address,address,uint256). +- [IB20.transferFromWithMemo](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFromWithMemo): Generated B20 reference for transferFromWithMemo(address,address,uint256,bytes32). +- [IB20.transferWithMemo](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferWithMemo): Generated B20 reference for transferWithMemo(address,uint256,bytes32). +- [IB20.unpause](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/unpause): Generated B20 reference for unpause(PausableFeature[]). +- [IB20.UNPAUSE_ROLE](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/UNPAUSE_ROLE): Generated B20 reference for UNPAUSE_ROLE(). +- [IB20.updateContractURI](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateContractURI): Generated B20 reference for updateContractURI(string). +- [IB20.updateName](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateName): Generated B20 reference for updateName(string). +- [IB20.updatePolicy](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updatePolicy): Generated B20 reference for updatePolicy(bytes32,uint64). +- [IB20.updateSupplyCap](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSupplyCap): Generated B20 reference for updateSupplyCap(uint256). +- [IB20.updateSymbol](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSymbol): Generated B20 reference for updateSymbol(string). +- [IB20Asset reference](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset): Generated B20 reference for IB20Asset functions, events, and errors. +- [IB20Asset.announce](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/announce): Generated B20 reference for announce(bytes[],string,string,string). +- [IB20Asset.batchMint](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/batchMint): Generated B20 reference for batchMint(address[],uint256[]). +- [IB20Asset.cancelScheduledMultiplier](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/cancelScheduledMultiplier): Generated B20 reference for cancelScheduledMultiplier(). +- [IB20Asset.extraMetadata](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/extraMetadata): Generated B20 reference for extraMetadata(string). +- [IB20Asset.isAnnouncementIdUsed](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/isAnnouncementIdUsed): Generated B20 reference for isAnnouncementIdUsed(string). +- [IB20Asset.multiplier](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/multiplier): Generated B20 reference for multiplier(). +- [IB20Asset.OPERATOR_ROLE](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/OPERATOR_ROLE): Generated B20 reference for OPERATOR_ROLE(). +- [IB20Asset.scaledBalanceOf](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/scaledBalanceOf): Generated B20 reference for scaledBalanceOf(address). +- [IB20Asset.setUIMultiplier](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/setUIMultiplier): Generated B20 reference for setUIMultiplier(uint256,uint256). +- [IB20Asset.toRawBalance](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toRawBalance): Generated B20 reference for toRawBalance(uint256). +- [IB20Asset.toScaledBalance](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toScaledBalance): Generated B20 reference for toScaledBalance(uint256). +- [IB20Asset.updateExtraMetadata](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateExtraMetadata): Generated B20 reference for updateExtraMetadata(string,string). +- [IB20Asset.updateMultiplier](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateMultiplier): Generated B20 reference for updateMultiplier(uint256). +- [IB20Asset.WAD_PRECISION](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/WAD_PRECISION): Generated B20 reference for WAD_PRECISION(). +- [IB20Factory reference](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory): Generated B20 reference for IB20Factory functions, events, and errors. +- [IB20Factory.createB20](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/createB20): Generated B20 reference for createB20(B20Variant,bytes32,bytes,bytes[]). +- [IB20Factory.getB20Address](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/getB20Address): Generated B20 reference for getB20Address(B20Variant,address,bytes32). +- [IB20Factory.isB20](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20): Generated B20 reference for isB20(address). +- [IB20Factory.isB20Initialized](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20Initialized): Generated B20 reference for isB20Initialized(address). +- [IB20Stablecoin reference](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin): Generated B20 reference for IB20Stablecoin functions, events, and errors. +- [IB20Stablecoin.currency](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin/currency): Generated B20 reference for currency(). +- [IPolicyRegistry reference](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry): Generated B20 reference for IPolicyRegistry functions, events, and errors. +- [IPolicyRegistry.compositePolicyChildIds](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/compositePolicyChildIds): Generated B20 reference for compositePolicyChildIds(uint64). +- [IPolicyRegistry.createCompositePolicy](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createCompositePolicy): Generated B20 reference for createCompositePolicy(address,PolicyType,uint64[]). +- [IPolicyRegistry.createPolicy](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicy): Generated B20 reference for createPolicy(address,PolicyType). +- [IPolicyRegistry.createPolicyWithAccounts](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicyWithAccounts): Generated B20 reference for createPolicyWithAccounts(address,PolicyType,address[]). +- [IPolicyRegistry.finalizeUpdateAdmin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/finalizeUpdateAdmin): Generated B20 reference for finalizeUpdateAdmin(uint64). +- [IPolicyRegistry.isAuthorized](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/isAuthorized): Generated B20 reference for isAuthorized(uint64,address). +- [IPolicyRegistry.pendingPolicyAdmin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/pendingPolicyAdmin): Generated B20 reference for pendingPolicyAdmin(uint64). +- [IPolicyRegistry.policyAdmin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyAdmin): Generated B20 reference for policyAdmin(uint64). +- [IPolicyRegistry.policyExists](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyExists): Generated B20 reference for policyExists(uint64). +- [IPolicyRegistry.renounceAdmin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/renounceAdmin): Generated B20 reference for renounceAdmin(uint64). +- [IPolicyRegistry.stageUpdateAdmin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/stageUpdateAdmin): Generated B20 reference for stageUpdateAdmin(uint64,address). +- [IPolicyRegistry.updateAllowlist](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateAllowlist): Generated B20 reference for updateAllowlist(uint64,bool,address[]). +- [IPolicyRegistry.updateBlocklist](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateBlocklist): Generated B20 reference for updateBlocklist(uint64,bool,address[]). +- [IPolicyRegistry.updateComposite](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateComposite): Generated B20 reference for updateComposite(uint64,uint64[]). - [Native Account Abstraction](https://docs.base.org/base-chain/specs/upgrades/cobalt/eip-8130): Build with native account abstraction on Base. EIP-8130 smart accounts send ordinary transactions, with no bundlers or relays. - [Span-batches](https://docs.base.org/base-chain/specs/upgrades/delta/span-batches): Specification of span batches introduced in Delta, a new batch format that compresses sequences of L2 blocks for more efficient L1 data posting. - [Derivation](https://docs.base.org/base-chain/specs/upgrades/ecotone/derivation): Derivation changes in the Ecotone upgrade, extending the retrieval stage to support EIP-4844 blobs as an additional data availability source. @@ -369,6 +478,7 @@ const client = createPublicClient({ chain: base, transport: http() }) - [Rewards](https://docs.base.org/apps/growth/rewards): Earn financial incentives for building high-quality Apps that drive user engagement and onchain transactions - [Accept B20 payments](https://docs.base.org/apps/guides/accept-b20-payments): Accept B20 token payments in your app and match each transaction to an order with onchain memos. - [Migrate to a Standard Web App](https://docs.base.org/apps/guides/migrate-to-standard-web-app): Migrate your Farcaster mini-app to work in the Base App. Covers replacing deprecated SDK methods, and registering on Base.dev. +- [Verify Users Onchain](https://docs.base.org/apps/guides/verify-onchain): Enforce Sybil resistance and policy gating inside any Base contract. Base Verify signs a short-lived verification your contract checks in the same transaction as a claim, deposit, or vote, so one real identity counts once and only wallets that meet your bar can participate. - [Build an app on Base](https://docs.base.org/apps/quickstart/build-app): A step-by-step guide to building a Next.js tally app on Base using wagmi and viem, with wallet connection, contract reads and writes, and batch transaction support. - [Deploy on Base](https://docs.base.org/apps/quickstart/deploy-on-base): Deploy a smart contract to Base Sepolia with Foundry. - [Add notifications](https://docs.base.org/apps/technical-guides/base-notifications): Send in-app notifications to your app's users through the Base Dashboard REST API. diff --git a/docs/llms.txt b/docs/llms.txt index 679a7cfb5..73dc4f1bb 100644 --- a/docs/llms.txt +++ b/docs/llms.txt @@ -14,7 +14,7 @@ - [Static Docs Files](https://docs.base.org/get-started/docs-llms): Use llms.txt and llms-full.txt to give AI assistants access to Base documentation. - [MCP Server](https://docs.base.org/get-started/docs-mcp): Connect your AI coding assistant to Base documentation using Model Context Protocol for real-time access. - [Get Funded](https://docs.base.org/get-started/get-funded): The Base ecosystem offers multiple funding pathways designed specifically for builders at every stage—from weekend experiments to full-scale ventures. -- [Launch a B20 Token](https://docs.base.org/get-started/launch-b20-token): Launch a B20 token on Base by calling the B20 Factory precompile. +- [Launch a B20 token](https://docs.base.org/get-started/launch-b20-token): Launch a B20 token on Base with one call to the B20 Factory precompile, with roles, supply caps, and compliance controls built in. - [Launch a Token](https://docs.base.org/get-started/launch-token) - [Learning Resources](https://docs.base.org/get-started/learning-resources): Find educational content for learning Solidity, Ethereum, and blockchain development - [Developer's Guide to Effective AI Prompting](https://docs.base.org/get-started/prompt-library): Learn practical AI prompting techniques to enhance your coding workflow and get better results from AI coding assistants. @@ -28,6 +28,8 @@ - [Overview](https://docs.base.org/base-chain/specs/protocol/overview): High-level overview of the Base Chain protocol, covering rollup architecture, core components, and user flows for deposits, transactions, and withdrawals. - [Proofs](https://docs.base.org/base-chain/specs/protocol/proofs/index): Overview of the offchain services and onchain contracts that make L2 checkpoint proposals verifiable from Ethereum in the Azul proof system. - [Overview](https://docs.base.org/base-chain/specs/upgrades/azul/overview): Overview of the Azul hardfork, introducing Osaka EVM support, a simplified execution client, and a multi-proof system for L2 checkpoints. +- [B20 specification](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/index): Normative Beryl specification for Base's B20 native token standard, precompile registries, policy scopes, factory, and variants. +- [B20 token standard](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/overview): Build with Base-native B20 tokens: ERC-20 compatible precompile tokens with roles, policy scopes, memos, supply caps, pausing, and variants. - [Overview](https://docs.base.org/base-chain/specs/upgrades/beryl/overview): Overview of the Beryl hardfork, introducing the B20 native token standard, reduced withdrawal delays, and Reth V2. - [Canyon](https://docs.base.org/base-chain/specs/upgrades/canyon/overview): Overview of the Canyon hardfork, bringing Ethereum Shanghai EIPs (EIP-3651, EIP-3855, EIP-3860) to the Base execution layer. - [Delta](https://docs.base.org/base-chain/specs/upgrades/delta/overview): Overview of the Delta hardfork, introducing span batches to reduce L1 data costs by compressing multiple L2 blocks into single batcher transactions. @@ -84,7 +86,7 @@ - [Network Fees](https://docs.base.org/base-chain/network-information/network-fees): Documentation about network fees on Base. This page covers details of the two-component cost system involving L2 execution fees and L1 security fees, and offers insights on fee variations and cost-saving strategies. - [Throughput and Limits](https://docs.base.org/base-chain/network-information/throughput-and-limits): Gas limits and throughput-related network parameters on Base. - [Transaction Finality](https://docs.base.org/base-chain/network-information/transaction-finality): Detailed information about transaction finality on Base. -- [Transaction Ordering](https://docs.base.org/base-chain/network-information/transaction-ordering): This page outlines how Base transactions are ordered. +- [Transaction Ordering](https://docs.base.org/base-chain/network-information/transaction-ordering): Transactions are ordered based priority fee and arrival time, which determines which Flashblock they are included in. - [Troubleshooting Transactions](https://docs.base.org/base-chain/network-information/troubleshooting-transactions): Guide to diagnosing and resolving transaction issues on Base. - [Node Providers](https://docs.base.org/base-chain/node-operators/node-providers): Documentation for Node Providers for the Base network. Including details on their services, supported networks, and pricing plans. - [Node Performance](https://docs.base.org/base-chain/node-operators/performance-tuning): Hardware specifications, storage requirements, client recommendations, and configuration settings for running a performant Base node. @@ -118,7 +120,114 @@ - [Execution Engine](https://docs.base.org/base-chain/specs/upgrades/azul/exec-engine): Execution engine changes in the Azul hardfork, including the EIP-7825 transaction gas limit cap and secp256r1 precompile cost updates. - [Node Upgrade Guide](https://docs.base.org/base-chain/specs/upgrades/azul/node-upgrade): Migrate your Base node to base-reth-node and base-consensus for Azul. - [Proof System](https://docs.base.org/base-chain/specs/upgrades/azul/proofs): Specification of the Azul multi-proof system, replacing the single output proposer with an AggregateVerifier contract for L2 checkpoint security. -- [B20 Native Token Standard](https://docs.base.org/base-chain/specs/upgrades/beryl/b20): B20 is Base's native token standard - designed for stablecoin issuers, real-world asset (RWA) and equity issuers, and long-tail token creators. +- [B20 playground](https://docs.base.org/base-chain/specs/upgrades/beryl/b20-playground): Try B20's issuer flows in your browser: freeze-and-seize, payment memos, gasless approvals, and onchain corporate actions on Base. +- [Architecture & precompiles](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/concepts/architecture-and-precompiles): Understand the B20 precompile architecture, fixed addresses, activation gates, and deterministic token addresses. +- [Policies & scopes](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes): Learn how B20 policy scopes point to PolicyRegistry policies and gate transfers, mints, and seizures. +- [Roles & access control](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control): Understand B20 roles, access-control gates, user-defined roles, and irreversible admin renunciation. +- [Token lifecycle](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle): Follow a B20 token from factory creation through initCalls, operation, pausing, memos, seizures, and admin renunciation. +- [Variants: Asset vs Stablecoin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin): Choose between B20 Asset and Stablecoin variants and understand their variant-specific behavior. +- [Deployment & initCalls encoding](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/implementation/deployment-and-initcalls-encoding): Use B20FactoryLib to encode createB20 params and initCalls for atomic B20 token deployment. +- [Policy configuration in code](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/implementation/policy-configuration-in-code): Read, audit, create, update, and bind B20 PolicyRegistry policies from Solidity. +- [Testing against precompiles](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/implementation/testing-against-precompiles): Test B20 code with base-std mocks, base-forge in-process live precompiles, and forked base-anvil nodes. +- [Working with base-std](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/implementation/working-with-base-std): Install base-std and use StdPrecompiles, B20Constants, interfaces, and helper libraries for B20 development. +- [Constants & addresses](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/constants-and-addresses): Copy B20 precompile addresses, roles, policy scopes, variant bytes, policy IDs, and supply-cap constants. +- [Errors & events index](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/errors-and-events-index): Reverse lookup B20 errors and events by selector or topic. +- [IActivationRegistry reference](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry): Generated B20 reference for IActivationRegistry functions, events, and errors. +- [IActivationRegistry.activate](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/activate): Generated B20 reference for activate(bytes32). +- [IActivationRegistry.admin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/admin): Generated B20 reference for admin(). +- [IActivationRegistry.checkActivated](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/checkActivated): Generated B20 reference for checkActivated(bytes32). +- [IActivationRegistry.deactivate](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/deactivate): Generated B20 reference for deactivate(bytes32). +- [IActivationRegistry.isActivated](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/isActivated): Generated B20 reference for isActivated(bytes32). +- [IB20 reference](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20): Generated B20 reference for IB20 functions, events, and errors. +- [IB20.allowance](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/allowance): Generated B20 reference for allowance(address,address). +- [IB20.approve](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/approve): Generated B20 reference for approve(address,uint256). +- [IB20.balanceOf](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/balanceOf): Generated B20 reference for balanceOf(address). +- [IB20.burn](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burn): Generated B20 reference for burn(uint256). +- [IB20.BURN_BLOCKED_ROLE](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_BLOCKED_ROLE): Generated B20 reference for BURN_BLOCKED_ROLE(). +- [IB20.BURN_ROLE](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_ROLE): Generated B20 reference for BURN_ROLE(). +- [IB20.burnWithMemo](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burnWithMemo): Generated B20 reference for burnWithMemo(uint256,bytes32). +- [IB20.contractURI](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/contractURI): Generated B20 reference for contractURI(). +- [IB20.decimals](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/decimals): Generated B20 reference for decimals(). +- [IB20.DEFAULT_ADMIN_ROLE](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DEFAULT_ADMIN_ROLE): Generated B20 reference for DEFAULT_ADMIN_ROLE(). +- [IB20.DOMAIN_SEPARATOR](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DOMAIN_SEPARATOR): Generated B20 reference for DOMAIN_SEPARATOR(). +- [IB20.eip712Domain](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/eip712Domain): Generated B20 reference for eip712Domain(). +- [IB20.getRoleAdmin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/getRoleAdmin): Generated B20 reference for getRoleAdmin(bytes32). +- [IB20.grantRole](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/grantRole): Generated B20 reference for grantRole(bytes32,address). +- [IB20.hasRole](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/hasRole): Generated B20 reference for hasRole(bytes32,address). +- [IB20.isPaused](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/isPaused): Generated B20 reference for isPaused(PausableFeature). +- [IB20.METADATA_ROLE](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/METADATA_ROLE): Generated B20 reference for METADATA_ROLE(). +- [IB20.mint](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mint): Generated B20 reference for mint(address,uint256). +- [IB20.MINT_RECEIVER_POLICY](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_RECEIVER_POLICY): Generated B20 reference for MINT_RECEIVER_POLICY(). +- [IB20.MINT_ROLE](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_ROLE): Generated B20 reference for MINT_ROLE(). +- [IB20.mintWithMemo](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mintWithMemo): Generated B20 reference for mintWithMemo(address,uint256,bytes32). +- [IB20.name](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/name): Generated B20 reference for name(). +- [IB20.nonces](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/nonces): Generated B20 reference for nonces(address). +- [IB20.pause](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pause): Generated B20 reference for pause(PausableFeature[]). +- [IB20.PAUSE_ROLE](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/PAUSE_ROLE): Generated B20 reference for PAUSE_ROLE(). +- [IB20.pausedFeatures](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pausedFeatures): Generated B20 reference for pausedFeatures(). +- [IB20.permit](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/permit): Generated B20 reference for permit(address,address,uint256,uint256,uint8,bytes32,bytes32). +- [IB20.policyId](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/policyId): Generated B20 reference for policyId(bytes32). +- [IB20.renounceLastAdmin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceLastAdmin): Generated B20 reference for renounceLastAdmin(). +- [IB20.renounceRole](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceRole): Generated B20 reference for renounceRole(bytes32,address). +- [IB20.revokeRole](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/revokeRole): Generated B20 reference for revokeRole(bytes32,address). +- [IB20.SEIZE_HOLDER_POLICY](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_HOLDER_POLICY): Generated B20 reference for SEIZE_HOLDER_POLICY(). +- [IB20.SEIZE_ROLE](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_ROLE): Generated B20 reference for SEIZE_ROLE(). +- [IB20.seizeWithMemo](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/seizeWithMemo): Generated B20 reference for seizeWithMemo(address,address,uint256,bytes32). +- [IB20.setRoleAdmin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/setRoleAdmin): Generated B20 reference for setRoleAdmin(bytes32,bytes32). +- [IB20.supplyCap](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/supplyCap): Generated B20 reference for supplyCap(). +- [IB20.symbol](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/symbol): Generated B20 reference for symbol(). +- [IB20.totalSupply](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/totalSupply): Generated B20 reference for totalSupply(). +- [IB20.transfer](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transfer): Generated B20 reference for transfer(address,uint256). +- [IB20.TRANSFER_EXECUTOR_POLICY](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_EXECUTOR_POLICY): Generated B20 reference for TRANSFER_EXECUTOR_POLICY(). +- [IB20.TRANSFER_RECEIVER_POLICY](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_RECEIVER_POLICY): Generated B20 reference for TRANSFER_RECEIVER_POLICY(). +- [IB20.TRANSFER_SENDER_POLICY](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_SENDER_POLICY): Generated B20 reference for TRANSFER_SENDER_POLICY(). +- [IB20.transferFrom](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFrom): Generated B20 reference for transferFrom(address,address,uint256). +- [IB20.transferFromWithMemo](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFromWithMemo): Generated B20 reference for transferFromWithMemo(address,address,uint256,bytes32). +- [IB20.transferWithMemo](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferWithMemo): Generated B20 reference for transferWithMemo(address,uint256,bytes32). +- [IB20.unpause](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/unpause): Generated B20 reference for unpause(PausableFeature[]). +- [IB20.UNPAUSE_ROLE](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/UNPAUSE_ROLE): Generated B20 reference for UNPAUSE_ROLE(). +- [IB20.updateContractURI](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateContractURI): Generated B20 reference for updateContractURI(string). +- [IB20.updateName](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateName): Generated B20 reference for updateName(string). +- [IB20.updatePolicy](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updatePolicy): Generated B20 reference for updatePolicy(bytes32,uint64). +- [IB20.updateSupplyCap](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSupplyCap): Generated B20 reference for updateSupplyCap(uint256). +- [IB20.updateSymbol](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSymbol): Generated B20 reference for updateSymbol(string). +- [IB20Asset reference](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset): Generated B20 reference for IB20Asset functions, events, and errors. +- [IB20Asset.announce](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/announce): Generated B20 reference for announce(bytes[],string,string,string). +- [IB20Asset.batchMint](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/batchMint): Generated B20 reference for batchMint(address[],uint256[]). +- [IB20Asset.cancelScheduledMultiplier](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/cancelScheduledMultiplier): Generated B20 reference for cancelScheduledMultiplier(). +- [IB20Asset.extraMetadata](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/extraMetadata): Generated B20 reference for extraMetadata(string). +- [IB20Asset.isAnnouncementIdUsed](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/isAnnouncementIdUsed): Generated B20 reference for isAnnouncementIdUsed(string). +- [IB20Asset.multiplier](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/multiplier): Generated B20 reference for multiplier(). +- [IB20Asset.OPERATOR_ROLE](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/OPERATOR_ROLE): Generated B20 reference for OPERATOR_ROLE(). +- [IB20Asset.scaledBalanceOf](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/scaledBalanceOf): Generated B20 reference for scaledBalanceOf(address). +- [IB20Asset.setUIMultiplier](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/setUIMultiplier): Generated B20 reference for setUIMultiplier(uint256,uint256). +- [IB20Asset.toRawBalance](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toRawBalance): Generated B20 reference for toRawBalance(uint256). +- [IB20Asset.toScaledBalance](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toScaledBalance): Generated B20 reference for toScaledBalance(uint256). +- [IB20Asset.updateExtraMetadata](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateExtraMetadata): Generated B20 reference for updateExtraMetadata(string,string). +- [IB20Asset.updateMultiplier](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateMultiplier): Generated B20 reference for updateMultiplier(uint256). +- [IB20Asset.WAD_PRECISION](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/WAD_PRECISION): Generated B20 reference for WAD_PRECISION(). +- [IB20Factory reference](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory): Generated B20 reference for IB20Factory functions, events, and errors. +- [IB20Factory.createB20](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/createB20): Generated B20 reference for createB20(B20Variant,bytes32,bytes,bytes[]). +- [IB20Factory.getB20Address](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/getB20Address): Generated B20 reference for getB20Address(B20Variant,address,bytes32). +- [IB20Factory.isB20](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20): Generated B20 reference for isB20(address). +- [IB20Factory.isB20Initialized](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20Initialized): Generated B20 reference for isB20Initialized(address). +- [IB20Stablecoin reference](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin): Generated B20 reference for IB20Stablecoin functions, events, and errors. +- [IB20Stablecoin.currency](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin/currency): Generated B20 reference for currency(). +- [IPolicyRegistry reference](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry): Generated B20 reference for IPolicyRegistry functions, events, and errors. +- [IPolicyRegistry.compositePolicyChildIds](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/compositePolicyChildIds): Generated B20 reference for compositePolicyChildIds(uint64). +- [IPolicyRegistry.createCompositePolicy](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createCompositePolicy): Generated B20 reference for createCompositePolicy(address,PolicyType,uint64[]). +- [IPolicyRegistry.createPolicy](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicy): Generated B20 reference for createPolicy(address,PolicyType). +- [IPolicyRegistry.createPolicyWithAccounts](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicyWithAccounts): Generated B20 reference for createPolicyWithAccounts(address,PolicyType,address[]). +- [IPolicyRegistry.finalizeUpdateAdmin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/finalizeUpdateAdmin): Generated B20 reference for finalizeUpdateAdmin(uint64). +- [IPolicyRegistry.isAuthorized](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/isAuthorized): Generated B20 reference for isAuthorized(uint64,address). +- [IPolicyRegistry.pendingPolicyAdmin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/pendingPolicyAdmin): Generated B20 reference for pendingPolicyAdmin(uint64). +- [IPolicyRegistry.policyAdmin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyAdmin): Generated B20 reference for policyAdmin(uint64). +- [IPolicyRegistry.policyExists](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyExists): Generated B20 reference for policyExists(uint64). +- [IPolicyRegistry.renounceAdmin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/renounceAdmin): Generated B20 reference for renounceAdmin(uint64). +- [IPolicyRegistry.stageUpdateAdmin](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/stageUpdateAdmin): Generated B20 reference for stageUpdateAdmin(uint64,address). +- [IPolicyRegistry.updateAllowlist](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateAllowlist): Generated B20 reference for updateAllowlist(uint64,bool,address[]). +- [IPolicyRegistry.updateBlocklist](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateBlocklist): Generated B20 reference for updateBlocklist(uint64,bool,address[]). +- [IPolicyRegistry.updateComposite](https://docs.base.org/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateComposite): Generated B20 reference for updateComposite(uint64,uint64[]). - [Native Account Abstraction](https://docs.base.org/base-chain/specs/upgrades/cobalt/eip-8130): Build with native account abstraction on Base. EIP-8130 smart accounts send ordinary transactions, with no bundlers or relays. - [Span-batches](https://docs.base.org/base-chain/specs/upgrades/delta/span-batches): Specification of span batches introduced in Delta, a new batch format that compresses sequences of L2 blocks for more efficient L1 data posting. - [Derivation](https://docs.base.org/base-chain/specs/upgrades/ecotone/derivation): Derivation changes in the Ecotone upgrade, extending the retrieval stage to support EIP-4844 blobs as an additional data availability source. @@ -281,6 +390,7 @@ - [Rewards](https://docs.base.org/apps/growth/rewards): Earn financial incentives for building high-quality Apps that drive user engagement and onchain transactions - [Accept B20 payments](https://docs.base.org/apps/guides/accept-b20-payments): Accept B20 token payments in your app and match each transaction to an order with onchain memos. - [Migrate to a Standard Web App](https://docs.base.org/apps/guides/migrate-to-standard-web-app): Migrate your Farcaster mini-app to work in the Base App. Covers replacing deprecated SDK methods, and registering on Base.dev. +- [Verify Users Onchain](https://docs.base.org/apps/guides/verify-onchain): Enforce Sybil resistance and policy gating inside any Base contract. Base Verify signs a short-lived verification your contract checks in the same transaction as a claim, deposit, or vote, so one real identity counts once and only wallets that meet your bar can participate. - [Build an app on Base](https://docs.base.org/apps/quickstart/build-app): A step-by-step guide to building a Next.js tally app on Base using wagmi and viem, with wallet connection, contract reads and writes, and batch transaction support. - [Deploy on Base](https://docs.base.org/apps/quickstart/deploy-on-base): Deploy a smart contract to Base Sepolia with Foundry. - [Add notifications](https://docs.base.org/apps/technical-guides/base-notifications): Send in-app notifications to your app's users through the Base Dashboard REST API. From ee8df75416edec0389f647ae324c624c9fa04d84 Mon Sep 17 00:00:00 2001 From: sohey Date: Mon, 3 Aug 2026 15:34:26 +0200 Subject: [PATCH 2/5] changed b20 update diagram --- docs/images/b20/b20-policies-and-scopes.png | Bin 69271 -> 94829 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/b20/b20-policies-and-scopes.png b/docs/images/b20/b20-policies-and-scopes.png index 4861a674c82f7fe7bc2977dfadb00501d9a54527..65bedad4b7f524bfaa611919ef826e8573abf45e 100644 GIT binary patch literal 94829 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 S4Evc2PEAGYdckk^p8kKEOzEru literal 69271 zcmb@tbyU<{8!k)ce# zafau8pA&z4Yn`*!xBr?o>$mIPd*A!MuIt|6S{jOkk7yoYU|I~TKhHVuNo=5MN8Hx^J07bq0!G0A_6HkC7B zDIVb8V%8QO_TTc0PB7!&-yCZEOTd4NX#^(wzu!O7B@q3eO{MNagfz zg|JsEM@oXsbBjh2hXWbkys}Yt_|J>#3OV15EK+`Cq`FJ@C;PQ^# z6Z&3Tex;kVH$#m@Uj-UJ4eVQe5>6X}Ix<|TS0ER2n)8P^&9OeBrJLda)Zg1fu}5%R zvA16z+^zxLN(W9dk{q2zZoULuc{Madyy;;bD=Sk9F#}{VkhCZ;vd7p0!7KIs&MBMb z9nR6e$gnlY*^F9AsjF31&wm3%7+i`-TWot*BK(XM^ZnmKi?!?TI>3% z?f0f_;S1YbZ;DC)h)E}Q(iX>=cNEkM!P6RFe>+EqiSD=R(|Lw37^9nZj6^rhT*nac zhLNM{4$G5i6!jb;4t?4JjPH!ze0j;|WWbzT_uDxI!86+Z1wqq7h?~JN!81o%@;8>% z4algXf^3umY{dhSY0ZnG6(rj4m+N;jPDJFNpKhEh=MrOfzw|+`yLPc4M#TA23U)5> zp6ag{*#S3~PY43lxFQm=|MT{&0wAtMllj*l>9NT!ELsa@=@2&&bhdnW0g_bf$_2V}EcX&s?hK2u<8 ztRl&mGooWQJH8C_N%e!5>J@-=o{Km25&_(co zXg5Z-Me?Mx0W%<`>3{~VN$UTqHM8>|VU-R&bD;UVAC6?B-ESbV!*1Yiv@sW+#x$Xg zDJ4ud)dR{XhzVX>^a4o(*`m|f}Q1gqR5VraY_;u1-36-5T?M&ha~b8|6Q#3 zZZa`x;bZimH~2cjgMXT^ho}P?X>mRrPREpe-y;wv8ExwPkMVIIK7?MPSj0jx*&j_J z)#qe^jCnoR(=h|H8bA_ufmlhX_iVV7<+Yuz68Z>*GDwkuAfF^Q{g<{^uI=TV$N97c zN|pA40rCPZ2=>Cd;9+4Y1eCD*C$ZvkRM%gf=lVS%XP;Q$v@)0#`);*Owrt72?dU!7~sB?DlC-9Wz^fDgA616+t?>)r5$_xv-& zos|(lkvDQ+;knE8x4pfSe3Grx5~a}rg@aIYJ>Wa~Czm!AJuet%XDRx*#=ZqBmA?is zH~{+3!>@lTgXfo*rXF?+DX-8-FZy)^2*ZWRIFo;S4W)%F?DB8UcUaM8ABlfvo?6(b zr;vJ-PdSZBKRO9I0i0)1Atr85056Ecc153Fb?^RZqZ+@J;MS>W3M*>r33~_FcL4mz z3%7ekv!4F!G%~EF)XaBY)e$O3DL+X^I_+Zci!keae5Gsnq&9q49C7VW)=lB;{SF>49jmPy_ENj|!(h^B*-n`BS5s>eo`&51qvXMo`r;8+bm78rRO7KNY@i)D3R9SLWm z79saYyM8ui8sGCJFoX>!GVUvQTWcO4*BeDuS2||Ay7a)Dn&?Xv3-N$f+IVk0JUd%y z(Hk&t8PW zY?XodaDj4%DxJdsw6S3qS2QpY-ByzDr>Cd00AE21zYWGFGim5wb>P*FJw&W48Tf-$ z%}+u*A3+W+@QwQM_qROQ+7(KbRk=ukFpqdr+cE!^#U8-?_)iwAulx#xGro3j$Ldhq zEHvTqU*qKy!8&sf-IH4@1yI~_ZcdMhN3LEM8 zkSK%DENNYb7bQckZ$u})DgEYrWDurs=<~ z&0_5NY?a8Mst6#DCZE99p(u*WuMR!B`72VlkL4LOM09e#su)2f<$(J)tS$~wJ<-Yv zAL`sIWZk$`}az^ zs6KINwzU&?JvDf8A@J;QrLL{M)z^P^Lst4xR33A3ZsYDD;DC^bDoJ<-25y3?X4;z>!3V|NneNtJv#nFd<&I`JMcNdLuRBkrP4 zGX73>by3ybwcbHXfZ+rOpm&8@n%MT)v797xu|;318dzz3inv$}pQn7+Vh#^R$dTub zoDpU9v5tw& zrp-v?6Pq_WtFg(Ba0k6zWTMIjxbRgA?dGh~D*nB1PDq&(TgJp=kb=-!bq-2*ivFdp zXF3$FW29AY&cj{7zJ^vl=?8 zh+~yMqSvSPdHAmpi{nNcc49V7vlK1EQ1H#{;HKc(0q>Y!O;7GTW~||&Qc%Fv>wGUy zC{?ul?X(3~M-UA5z~a}TyFY@MyW*bftl_tr%q<+`iTe2;Iu>%;%;?_ReU(-Ne zONaSgHI1&i?+YWYGD@PSRL+$H5O>ug!3TGW=ZFm1m6PK{W-=}t{$rp~nyeM$ z{qQ&NFPO7pnN?HAH1~<;0FhbN@;1Nfs)3BcpPbKKT-u_#*{q-K&GmN_nl>Nu2`*s} zKf=p5%A0xlx^&2F7|`PA!M6H-0y-H2Ukl7fG zwra5@ri#)`k?QZ^2|niB#QfmoGsy3AW(rw3z~Pak4abU2e_zRZZy-PjI60GR9 z4fYQ{w!*ol+ap7RL3At_w5yR=`V~jSA*xN;{>cdLP6BSv5OJT6ok7DQ$GrSVi#sdg zxKDo-q6_RQ_omdBBjFUd51j8^|HTg~r$?Hi7q8oJt%3)tl~Oh42tRA?rZlnfXhwLsH63w_bi6X$dBL0)d}XR zT9dJ%7_nmS*3>MJc^y=~Yeps@dMpk6B|k&X?-j}%7E+uQj)c4U3tE!nO!_!Y7Xn~>I(8ri-j&sbid9-tOp#HkCir?IF zt$s9M6IA?-pPFRgm8{lvoPow^oxNggPDRj^U|!UCAbw*2y% zw=f5fWs^UcfQ#<$Qq*0B2H?n?rhh<&dgu%xL$Kz0F&168oC@n36UpWk;#t(z7I#YN=gOt1Y+&s(4{Isc z0+=UHe$U|XlfMsU9Zo{Qw=r$EuJ~Wlt0zDZ%1%!p@&X7G@R1_C0(|!z&l!%U=EoBu zfz`jue{G!iW}4uaIhR~uAAz6wuLsTSald0t8U@SXm1bqHrDc2|@2ze~AN-DeAqJK_ zA^Myt{#ib2kfcFSeKp&m3-(dQRlZtpEVUBbmkzUUpKq|t`%)?=NR-IB^^s^twBVuQ zEnne-?kLR>i?p81?wF|uR!5_s=)O_%748is{}N42Bj+O&y$a1~znta|DsYB#6YVmZ zWhQ+;mRV}29x_o!OitL&ZKIiMGqIzP@Pu$#bvp7R>mg+3i~>*o)BSPAt% zUPr0XgNY5($uAmnJoT;9VgWhT+cGAM4XE*G2A%Z_F>}`?`%%3|=7}$@RJs+oM5=@^ zVcM3|i*XQatAl27?bRbS1QP**hE2N-1c@5$A!utSt%}`#%3qa8X8{0pL}`l_zb2L# zSn@QF=Wk`sA%1a&x8TtMZ6i%h*NqBi%LsytrT!TDg#Ef2Ci*$HM-~);mTU%WOB;&hKw;otZ62|J{AJ6~AG(*seO|Dma2`oF;Ri3%}?-!c=9q)=A{n${6H zyowu|OSKxn1mU!hv{ij9j9y&6uayLQutz+Mo8(RNZ{9GqC2c61h3`x57^+h-gOKIWf0tf+Q}smgq^qmuR3v7 zM9q~hxZ$l9?m+eaIza{=*3dSd$i7LfR#ZY@I0Iibo7(#qW8UBR5p-BemYT(oJF*f- zcfL>VJ$Efi!ytg5NF?%3KYw(jZO!sfYO_{0fkc7tA>IdN1oav_hxwM^RISBRb@K9f{!s=bp9lV-EqqqQ5LnB3^W{gI})%|DYg~j508t z3+VGPC&dR>=H^q$dilW(eUWwSZRjX?3X;4u#<$)Q%{`gkq7>UPAIIc z=xpaF7DFG%(@r~JuGc|z4CLQwE;=g4A+xYPiHIg=S=WP`gfxlaz$ z(x>y3X=0{L5A)eFs~I_Q;VeeH0CM3c20(@MX%3;PB{Z9I2nSOi?5=wry8EWq&RG6j}e4&SjSj7;cH|sX}pm$$zlJlPF3(BEJ z9&|5Ez~`fMKKcqXkZ?LC&0q0+eJI|AQQb_u#v>+v%%bbHQcqjaloAGz0W(bXh;fzV znY?__PY*=$M+{`|^)&B6pZffMCisv##oAB*s>qYfPM}|Dq^*KvTR(HY%rFEoD+YupuLE zW|&kyFW$w#O10|Qf7#%GIm6lXMfPwh@_XhSEp0sd>81?yAP~@b9=>_=d6+}0^kP8g z@V{jA3xAz^GWy9Oisha)-;5qs`^rc_yHDDZeK_4|l?YQGLi~r3M(=Fkfk;4he%@+kg|ox zTnDl>KcXqcZTS>L3a#vJ=qoF)5NK|wtSMjNMYG&}=k5t|l!p1b>eAH6&m^+4BhUR& zQz8;Z1ds+P&clZEXqTkVO$KWl!~O-XXtG2DU$f#Cn+|IS1Mb(G3VI-6<6h@4qh!KvNpiq44LCVgy~(OdQv<( zED7+=@O|EC-I;~j4zM1qvHh)?*Olu0uK*VmG;&vT4ZwZpmLxiQEyQ6?ERg;o*8Pu( z?xjJ1K+caFH+ok|rpBV1(>=lAw|(IABrIyIN{?Z&Gg#3rp%eD{O*hm(9wt(ORY${7!n>WlsJby;D+Jh@l;plL%wP1l1}V zn#ic*PM+4R&2)m6vl|plnoxokr}S3v9%{)Jyb3tJER zWnCu+cU?`Vx4w!$(UcN?AM(Rd>yiboET}yqV6kTj>Tue-kAO;CA$zrLt9_ z!@!7Br-Xzl1LTjHH$((f4fPk1aCqdv#gOI-kP=ouDc_pD!lruOpmgx1vhpO~qcxr% zbT~U+Ta}IcX!5E%4sx?LMo-z`qe-_AD@6wq%n#pu%LMSLymu8VXm@qs+|~>79j3vI z`9=Mk)DA1L``MD)VeV*p&-~z707uBI$JoVXc10_x$d{Y$^RuV0239^@PI*75i`br( zS|)rAKwnhfmwz@S;@C&`Byj7zu9U86g}0#UQgufqAYQ0qZ|^KqWb!KrB&{m**uu@$ z7uDBN1lUTzS@1XzL)6+oM}Y*YzWa0cqm&OC92%RW|1RPxQO#c5^*%=RQyw@&Sul6d zLPLJg+i5_s=i#iGUV~G=v5KYKdNMpe?BL?^zh0BW#m5m_qo{)Ru1M94c0?u{;3)z* zI`)9}d)i|QeBT3`JmIwF>!VS*MDOHkPKjztCmPhxN@TVpGW1(&_vMmGolk(v?zf(A z*gOKRk);E3W?;IXr7OH}krT3%z(22iJ9ZDizIR-lMvwvBsp#24RXbn*nZQL&JT8%E zO%J=uT%cCGhTtJ##Cet2uA^e5SP+U?+YVx*#l;sw0QwNhbJZK)!Xx0DUOKQ)ILyS| zhw3kWcUIl=e@p;`jm1Oh(9rzuW2it~F~e=;0~nri%oe)%BnyMv6n9+4qX7Jdb1J4b5C4Zd{e24IW z#iRNw1bHe4ufD9W_W)ljyxHAcmpYot8T&k2Ti4>$e4E3s)^fbG&PN7io-P~~*j znF)P*^3l|i?vH_>cK)lw%vYYu=qRESeSL+Y3}4l*PpO z3Z2?)7FBP+S*2ne&1LOd}MYlSt54O z5h#V*NpGQZN9vV^CT?|DbeGHnK$FIW_Q)yR<;$i<<#vMGs-2oh1Bi(bspI=O;U%yz zA#WOW_3-EBA>&xr1naCWbCVZE0XyvBSXWY)7u2)Wr=KFvJYL7ybaR@6KzJ>c|7*|j zVrf(mnTaxgxCn15?Fr80sWO9?7L@H4;RfhDtGi(e1xba%4k-?f5|Z!?3f8h6s?PO{ zRTo(fPdrD*_{aougAvO-0yh%IoX2_Tul%W9Mr_)w0$lD&df-j}IAhh4#d_f&S-LPr zU2tz~>x|~dDVxz-C604B%@R)8w8Xrx=f@1KG*njyQJZRhSq!)61chw1j~g4`WgGKu zXvu@k6^eTgSLK%)&#pT)9VE#weM2MBaNJJw*ZW(6?H9(%2|W$n|4l>6?P*{8oO14) zowafh`{i%fu6;P72k!yw&3jKAhxl&d+uGq4KIW`Z{P~Q}JoVj@u5v7@E+m@7-d09t zz7ABC52{8s5vIxG&NGexzZIFbe5hjJ~%e*XTyySw$S`5u(4h|%W8W{)n8{rU42 zoubt_I5;HKi>{BP`6o~dUOqVBH8L_FK;n-?1ZHPfzVg4) zft(|w09jdCba?2M3~rAXM<-R``T6;+PFHWNEbsIDFq5CU3+He-IXi-~Yi8}-@tXlD zJ!2lDyYaZs--@W7AZcN+^SMI8IwNWItJA{5%AV~U-F9@7zIdmG21i(ESVIDG{dpOU z?m*}-a%D!)Yt+2-SmppH&7rBj8B#6vRaVsJx$ico1?VupLzPwAGFdPN&j_62FOUE z_T1^N-TWWRp&=78YcTjz2;ERH5D0ajEb5NU25y#V_V7K3=>U?`tfvO?ulo1>W$~G+ zvQ+BG)BsWth|2Tbf6bB{=nEXaT16oG*_MIGt^#)|xql*gf$uh6I4fLAK;Xetnda?n zz{+-?bTp9Mhf0F)3wm|mT4l7#Qau^k-OuX>$fd3@5(-KH+dXD zQ+SQPZ1X!U_PzYrpXHA_J*TeTP@3Tq1Gncw*39`VX58kpSo_}rk>AjhAo)Dgl+Ivv&;c$;%09e*e8rJ#*%77PvRQwfYoo48Wro15Obb84tq4 zIE1RDT4rI}oAWd`-CCd~vvB0q5gvE;^>L~2@yhSV>9cdKu8JDjVzevfPkG+UPz+`> zKRDi~ZdmByGI!)vGjWVu%gj`9a98 znOO_EMNSKfc`oPDy>fd$lqKQl%^=j>eRC-7;CkKpu%#9FBezk~+jXPLo6gbEaXu>t z)%&Si((MAj|0rxTvp?-wG#cOq{*&hz!Pnrro``jMth{mO9;foO&vwM(E-0jN_bQrJ zr_tqDZ1lY_uDR%2c13R8Rpnr?@8Pp<_TRim)th{?D@19pG?}b%GDa^eEq>;X@-e8+G$D#XL^cKT0iI&Bg^1ia zYSqQehh~adRYcK9XncEH!4i3!#r(7{Dakm1u~4$O%zmy)K7d|Grq%AaAwvQpTR5Ci zJ_VUP)U_GA5WHzX)a_Xu1_lV9>%*NB{KgA^UJHAf#0~P-S%n~JMc+T7d|o`fc$jb{ zV6!a*6ZbFVS^REO&2{bh!(pQ~+P1(n`e}Ek+~!aw ziZYG7$$8JoY5Y^6Uh=Mdw(fMmrPn11ypmYrV~932i|xK&BiAb~!&V*Ib%&X%x4#}= zS=52RPZ8AZL6hT9Na(j=p^G}p6QThg19C0gZ$$!QitiP|WN`37G-Y}Tabi3vRP z@C4k`ZI!wM30vHWT6&30pWW#6y3IQ{5e>)Bk8ctdA=E68TYj|&3ZDEa$d$6>4dk@Z zz3a|)Dl$DieWK*;_&%cigZW&=yTR@Id*j>Nl6<%$z88aT)1a%>3W+;%RGmLs<(YfoU9K?JL^zh_^UD-jE%Dfkdt-p^u+`g<+3|p zFE6EBV7QRddX!L!?t`Z5IdAi9g6lPrdBsV{FFKi~m!>zt40SZ}iZGwwZjZmdd%s55xTSl6yX^@((A06(LoU$K`Lm7}+ih5zk! zLubrWRV(?bRw6vf{r#@Jk+!pmt?_tq_mAP!Y9shJ(i&Of1;gWTP2O-?_6noL_0r_A zmHt8>V=ze4>q6_*+&rt%t2_f7JW-C*NLuz7U^wY-oiCopNSjQH-UUpoA(OmmE=%)A zy(b&It6SAYjq1b3%_B>cLlydr#qU#k4I5nER)L4W(*eFZESfxz*9Q_)`ORA29Xqe@ ziiI;sHs-5A=L)^c>tbVZQBL3Sh#934^%fT5MYRE;!y)UfdXzNcc}ZPPoWX{Q7{6n+Q>eCnKKN3t&b zW$&>zZ1M{S_ocQAP&76*fE>o_^oY0S5sG4NtHo!LuOBW;N2Yv)(WAW_I_oxG{HmBK zRkudTG(D2Khx2`I%|!8(3`9Zmv5*1+$qZ0P&L z0)djc>?A{Bp9xB$#Ez{&Mpt$X`8NHN!qrUN7gkX4K$br3=z5Q_QtiRq)7{(D<0-fK zLPv3rWIOL;)gJx`7YdFt6e-H>tQpQ-*Dmg{ zJ)=HmF=#r?j$qTMRcw9TNMs{mm2#9|hn)#TdOS(xeOD7^H{UAP4VCUz z9~lBuE$jw*qprrXw}T=!Wje>55EBs=Ck;#qi#=IQf-)za?Hc7GZer7K97c(~JPEwy1; z&{@Wr@0?}E^ExsNdQ7)?W)Cras_uQfF*Mdn1L3_;{G$J$xGb9fG?dlVdOylW2d=?A zTXcFp6_St6)XbGlUbulIhwB#hUOuKQ@Em4jefurZ<$6^)bDBf`7@Q_M@uNee%5UvC z^+kVWvSs6<`=xBNQA>QQ^l4nJ@y`it1}iT8A3BYmH%5&f`yA){iz&(WGh1jV{e@X* z@}^l^&i-3Ezd5dC*uxnd5svEcy@LLfpW&6Ik)>)EuK8z-V$R!%ZU=u9Q$&gxN0?bn zjG0Z`PbRrb4D%Z2%W{)!C$~MACG2Luyws`m;D*7Spq84l2e;Vn-ZzczZvLaMC}9tq zZfDE;A=@HazWRSE_4NxivvMq=Mf+n-vR=*=%2yW(e0OvtWLXI$pT!bA1h$dDh^+_o zi%l@MMw=>k@$nA_GbHsq_7<3L0=7BRC(9De4eOgBb$a zXy42Y8O$gM+5n@W+b+CNsV|Y!twB|0GT%1tPMtM^GJ!-6@|4k-k&uYn_~!>2k?S`z zwGI{ygngg-Q#i||^~&Gy|FxUc+@2ggqJ-#w_-Vrn8BAqWmv-dJY!&RA+O>$qecNF6 zfYYd~IQe-jgP_!3|0iy~Dk)rFXG3z%r}iYQb4oSJX~xdk&Dk20jfKaJ^iC+a62%E= zdS~2eYsAFPp8ew_y6&As&Z5@O8HGS>6$)N9RSI0oiqt39?LiNQc=EU&Mca@Bwo|%S zW4^$8zSf^i;^@f8soz**SFG2C&c zziw}4b6Bs!D5(L$J3>l^^LNCKUb5o$!as~*j%n%b4vZrl zf3bP@I_TQl-4M|ko!5^ZKyd+&H9^!`YUU$qy}ufCTxs7cS^}Ndj%>8xZFjw`Kn0&CS8UJH$*;=JCf_v>Hc`Ffv7*A*nLkce~?Q{fk z`9Ah<`INZ!DMz}C%1=XE*q*SR+(0e$DG{ZuvEQT;F9#%=jQz|u$RTlYfnf74lyo!B z$$nM5)PGi^+(m8P)*i^5nu(9et|sWe zx~YAm6H`XTm;Q%{T6}ID15Yw_;axY;-peKA%5PPhKP#&J)OOX>Tv+<9w?-xnH{(T` zr+58&729_(K^j52tzpb+`p-BZ)j~DusBB)thTI$VCr)xp{RYI0E`{L;Qd^}R{o#S7w;Vj97tDoOaSTEbW zeSEgp>{-+SpE6xWWxuX-1k6dXkh=K1=j{W{n|xYY2+1!IHLaj_9kw&cC9@Y!(( z5|h#qEDZ>$vV;O$FqNobYaK3O_+8aO>X{Nu+ zRg7gT(J4$sgRJ*H@}RV1%c0!~^Yk76l?mm3cMfTwa$4^zgtY6Bftb@_+(fBv|8hG; z1>>un$_&YX_vg}Bx|<|F{eC|ulzP_lWlTf}iF+NzM6YuCWLLIpv_LiGr z$)OCQeriL;jdq-)LZ;KB2}Nsjzg20Jge>~vH2PA6ug;mqcahU4$GexVVlLPDXtX=! z(u5AcdOxeCtorT;K7JwJ-!MO|Cl@oNyFT5(JRWYI7O=@cEV$qAUUHuS zr(C7S7KHA$f8w^P*Egs47@ItPaFxFK+I%hS_enTre_~mmTTae=JMB+tUrl%r^_#Ch z(O?o(YnJ3@J@u|=P$6&1IP~V3wEF?uT3;g6dNlW=+$`#x(Ym2?ST11vR%Vm=4U@4H zH)}ed_cvT4Eu&zzl_42skg>G!;8~kEi)Qi!DaY$+DlB2{R)->gwJy!9+*sps71kn# zCa+OIqmf)_EV-wMXM;Z~<{smrB2o*uADnC?xY>+<95?1urQEypzrY{lvK=i8x0LuD zW;%eCv2JYf79a z0tX%s_{l$Ox?6%0(20MDXI19f-*<4?*!S;E6AN*3m{P%xnQ~l+zlBF9Qt{{7Dl@C( z__*ye{V?kq!T2+odAD_-nI)BAtQeET5>B?oWvW-X7`L6&r`nSCcI|JtuFKiAJmEWT z<7y-ET9gWpaSIzfnufhZhb5)yd|&n2%ei3oZl-#bgH(>UIC(H#9{KT}iSbXohZVR) zZ$d1UaSRzIicWWWYpAPh-e5}#siAROe7L!S>S9ocn=n)H`_?jo8;kE9-E~v!9am!f zy7R=6J~o=s2NHLhx$@D^$E^mFp^%s)+|wPES}st{L*X>ty1Q)czR$Z^(uxGti6LqX z=S6ON3#wgF*~Kl%S}I@4zQ*~u)qGq~!)Eb3m>-uRyP}1yac&ZyBDVxVRdx-Qq|d&G z1Zeae|5(6PRQFC`Re$bUr1__C)_OZ~jYF0C*mY^Z#d4SpC*p}$Up8-Lhr7I>u@Jo? zlhZa5M#}8tcKM9yJGOMdB4~dR&ij~xdvZY?-{VHyI0X* z*Dy_5zWG^cWD3ug?8efqzkBxf?Z=~nGdEej$J1zdYtk}c^jxy(hH0w8aLVM_g6q-B z?>}D-Gaf#7d!ER{^Y%p|bk_4g`5Y782SpUIXb#y4_%4(7CP|k1jeje7<%a|Y&`KJ; ztC-~=+?lLFiMoG#oBZp+abK;WFL<=-txlc7Q%+FXcY`KxRR-w*Ksj6pD;xhEt9qhR zz(qx-rM&(0QMRQH3{&o(C#{bp?lp9J#;>~dG6xKvB9xN)ng?)S^jgvQqWAIQ)8+{D^bp)AS@?DXpdZ>kbzjvyo3z3}EkN@4ZtoX9|YJ4(2{v)T6-> z3AbA#)x9T60<@`kc;^jwOFZeB$TVmq7bt`g>}us`3l z)zhQ#^nOt+jQIJQEN0ihwHpKqUZNjeJz5=RuP#(iE(2xQMrbTsEmyrAt1*=n^Ei&m zXz~K32@9n4TlL3lqxTcbbTv3p;+&ypND`Ir(lGWl;M!VSa%~k>J!8TUG?HX1@=@W# zJk48H^>5@Zhdun>XS)q7_|G=ctS`EJMdz-KDsrJI4WDo&e7>I!)2|mOdz4-yoFlvz z7Nm~dix_CAKEAK}0#>qZ)=T&Mpr@dIp(=j;SFgJNcw^{UQW;v);ZaaXfZb3CRrg;1 zlv$Xo@<#D&&6UEVXocUS&nEy;IF#s~UKd_k8ad>VBK|hQv#$N0&Y}3eqVgDL_|I~C z26mT)_J$XK>QP#zy1Kgh?s-%;x2#Q9Q_{%#j1Pzkxt|{${mIgpGuV+y)08-|Gd7Rpa0@@gMoovuzK5r;G;Wm|75)CH)uNyO~|^k{Y5@I@;Ozh zSZt>MhPt@C-1==qol`v(x-P!R1T*{U9e|u|bX!Y%<$a~L@W#4s>MEdKT`3Fh#i>^@ z?^WtgKIbFaKi&QPJna*b>g?=m%Z>TL?a;#1=;=AbtHjbN<3;$h_B|3I59F1^2V>vw zM4tN##77>U2hwq9XVT))k~byFW#ow-k`KKqdPrdlztDT%;?ET~jhjj`3)Ibe-aw~F zjbYdSNt?~+*HZK={oa~U_$-%xi)m!pe6#wOvjZE~n@d%_{9)dXwT-OB9WLMR)|WJw zR@2X^#p+`_V=472)A=2t8B(6IxM#a&4F~aWcfhwRPX%%mt&~&5lZ@)jhXbgk?Q4-Y z%aHhIhBW<{-f&~Zu*lL<*31pB#Lav$8+b(#b#Er+q66s-cA_x z!$^vr7lX7SPxSQk#LxlG^{ZXY%NAo|#rJ| zPim3-SDDQZaS&{SsV`7O^hw#R2TUM=LgKSCRlUj-_?;ooO_OIl(#DS6(|Wd`r~-2I z>w#Uxoj($|Cq4PYUiIeYPpRHmp{ph*s3xxFZ@AYa)&B0ZI+vWO;-jo-iMxp1H zr3a1515~3Hb0gWO;y6tKyVAgT78RC7$n4B9U1&^Z+@gYd9OK>8I~U7-fL?`R3JId9 zcW~Czt)a+@+-9=4HIdV(v*hNuKg`+XdV;$Dz-y75J5^KaF2A-QmS(ctzqC+?!`PuI z_J`|m0I1$A$%3AgHH`OX>AOUif{5ukhvA@(tC_UANLq_;32{C@u^T&;ps&9bhOxJU`7f_#hGo2w7vb09ADb(ru~?XK&!JtX zw!O)jO%_+p@;>QmTjLQ{i5xUuRRQyd8H$=X`*jIL!!~?->P)CoRG=|;5RoEG)x$U; zGpI8BrSHMBff}#v-ODz2DOaOre?K>0tV)R@Ov#)mLgoR39=a%c*eoLHSGzMl1T88S2 zlalTW+|Mj9=ryBxbK|%un?5TxW2LB>mF%o*rJNkK1=gypxDvfQSxw}u-mneq{dB&U z$|=a|KQke4QN#$oXv=2Ni{Uz+-F%n^v-q{+VCguRaaT$A%EbWN0sUnEbM*gI@a~;} z9QuY#Hkhtf+A{mhDtqm9e!FeZUq7o#Z-G9~A`g?t{KmtK&XZ4kyBc;x3+^DP=Ihp76jxvfwvf(NQ;+ zI2jDDd|2xC=l)C`t1lg?kpB&Y6_9Qaq(P*VP#Wo$RzP5AiJ_&WyG6RY zOQbsl21L3;y1Tn!;4Hqs=Y7v}UFSOIdgf1tnZ0MPz4lu7r*2m2=EiTR_4IH3`qEDm zSS`??@Z`^2WBt>eR}GcM6IP9`@cjGmNs3upfGL5~ucce^pF}H5Fc#jQp*5Bx`p3*G zkb!nvtU4mbzIrH`{4AjO%^sD}+ouRF31zxtp}D!i1OQ`xm-lI&^u$<1WOVw{>W7gG zon+;!XjX;S9#jTmPxh=$m~|Qy*-hlxN|HH8`$Yw?g-ovPHzPaVOlW?sGlxS5-bzTR z{37fD*ZYc;QS#$?Yt(9)@WIYG_@R#1db32Nv9G{PD+jA9K!C{_ZBN6&0ven1l%4OR zoe|~TtRJGQ5%zO7RgoXWy#;MgOxAnjJE9Bi_tr>)iT>wf0nP*2v?a zOw$VpRqFhTWus-&Z5iL>rc+ARFjp_hTz8Byxi4AQ%ozU#g@lJvA@P1RsBwFsVVV5X z<`RYAlBR1?Jb9txmZy<*r`%-YIbHQoj?DAtPe7kKoqgapd^Sb$lwFL?A%gNd*(FbY z4>d0#yOmhz-gu#|j2AM}@kfKWV=P1*R7&pq+}Z;-6U+Gq>B-;b0qiU5>vTbTND_N8 zaW5O)(6jd~_5QA4)^5R;=GL$^J{o`lHt5)3S%r&%0}5 z@Bgu^C!rD<52SwTlX}ppn5Yy!PDLa5>tuI$)z=V`z{&f=G8?wRI*wWV=Q_;|N2lKI zv)q0;tEiqKlAMRT``M+OdZ}!S_O#Va`?8QAzt@|ZU#iYl543V+9)0xDv#)vOz;gfP zKefP(Da-8cOD|^os7>AF)2mCsI`CE)&S(=es4+KqJ!G}tW>R6fZc}TaiM}v;6%dPO zEQXAYATs%NZgh{xh<&{$Nrwzdd*!Py9*?=r(i~~?w#9zv>Haf9T361V7}^vC2*r4* zri?+ykHU4CZtY;we`A%*7WtSb^OFNyDdubbW+wwU%{3^4Rt!}tOIO=fCrcxSOqz@t z@nTu2W@Vq5#%D#)w4x=@0FMlTpiA`aBDL#yPNJUT?FI1$bRkf&0uaw{R%3`tRUiq-jU|#ClZ20Z9Uc`N+ z!M;?%T zZ5yy5RO9|SUpUQR!KG<b9I^#}+>rmzV9hl-NT(#-1h)C`SE3TJ=#?ZP z8twKsV6bmyQhL{XNZHMJuh=`rSZ)66aJpzRR7g4N zIontAo+z#=?PkaM!dY6z@35z$i095>BSmO}jnq~l`Q+4wBdGZ~IY>5EMK_W5lqrOw*e%)hXtI;rqU z=+K!bN_r%T?>#SXrewo&sFYmF>%3eUGtT*19u5-H0K;BaBrlumyi1(Me%Jg8pbj!C zZ@n>~{6I^9GSD>QPc}{KUHRS!{UxIj_nj2q=&~V0wNlu%_STR}_6Jcc8@|=!7zTE; zPHn9B%g3zRjoEaXN$j~})RG@Q<_9fxwWcp>O=L}8QdH;SMi^qv8Z|dhw0VZMPxSRe zx`vP5OI4e)TlO0bsQ$6=Zav?77Q*!tmqQA(&oJ>83+v~nUSt=0=omFcp$06Ila`eDFkV(wA{a(ChPP2#{Z)!>UB*SfGkHQ1+?PTc3|?-Y(;ZuL7N8~zXdfI-0W=Cbb!&HSEES^We^+c6D zUydb%=jW*=qV_J^8e^L%HNraL^S;=~y9Rqr-}f5v4AN?XHf^F->vnmTq}eOf_I-m7 z)df-qZ^eU7}Y2xe5ujv=OAGhIsHfF~zh*+x2djb75Kq8vgvvxsWTqF~g^CJJ!3GX)p8hH7_H_y4*7B_sl{%uG~ z(ieO}DC!#uBLT4_as=LP8_|sz5>rVSxdkYbMp{wXHI7=uBYXViahS#5c3>jWyg}Oa zX_1*2t|wDy{p9H%%^Xv-yZbb^cU`V;fZwU+Zm9pQXy$HFepu>^F#pBg7&CJ$JPEhD zEipn@ZDJtx-G;{Q%(BIP4N|vuTZcb&uQlA&^ypb#3a4TEosg?9wC?4WTB)k-b+#x) zN|(4uCnkFmK)gyspYKu+%%U;@l}#&+$3FT-kFmW+#h+`g?$8B|Ed`_y_0qABLiymA z?{||SYC-9e)9l98%+fA&vZwu{BB4D~UEpqTFTunsqltgULW`-X7$hW@Hd{05Ek7yb z$1>@m28+M&x8v>(B)M+Hxl-`zx|brj-3TL_n!{#rwt4rZ`O}}^OSj)ddZwKfN$WqX zTHS{4ZcU)SJx)J!T;DDlkDhKWp1*G*eqVjB%u%)1w#aywM)n>W&8+wPlerq};W#%y z#-r@Db)8+RrU&>h0R3j`WIw_t7WEwAt!e8_rlNzbgY8IRJ=sKIsn3g8sc(BDdIdI} z#4}tewLly*Wc(q6>bwQ@YbJB{mwD2g_4^FtBC!8WeGp;Deuoeg!{ZzVH}s; zqiv!{7ti7+i#|an;Td^F=X>?dh|=V|Ugt2Xydj*2DtTgf-}j2-8lR-Z$n~SKr7!HB zTSGI8h!G*1T}h^A)or^Wx^JBoaGTmK0s}h-NGHZ1nUV8HpS!5??53698xjr58hX(@ z3AB1g^Zf$AAu~Kk#(bvc{6E#zgAR-6t@zCvKD58*sy;qmd?*D%BX)r&yTSUy3|vLM zrwMGv_prXauVKCM>^b@S@8u?~VH3C1x9Fln%ZP5k(f=d;*Jt1>>aueMsrl$(xT_whZJ83bwf$*jm$DH(Mxe$abF|> zTu(cNS-NV5C+nR_N=Wq`$69f$L`7JuN?#@0E6v#9h#}NbA=fjB0)vMaG)q68e4d-C zIOD*1F%%iM^|Kl~DH7VcrPEq}eza_e)yW^@A(`a|8(<_>NM-afmKUR9ILoa>sY4@G zb=A7!54$AmJ@M6_F3Lb zdWXOF4X%yY+ee)JEEAc8i8oSQk3KernhXW%pWJ-)@oQv}5i zWp%_he-hMFOC&iUNFQuAs7RjHv#N8ihC0>uCo$&{p{}U1YAKtmbGUw8>f6g)_A=+j z8mvaF?Qzw#MPfBqFUoz&De?q)_J?;2q?DM!(XuCsF6Qi^qRJU%TlmX+hm9ry=c5mv z2h*Rco|Ts-;*(AbOo)=6O^W1vMzXPyB5k8dou6-l3lF>&*}%)x>(V>Dk5W@04eV(n zakZniL7t)l5XXc!0hCzm0^8T(+HSL)xyuKGbc(xFPfj^cp0$X_GD=TcAyV)5{-@}h zrUigE4a38%L|c1EP@iOxFgw?~b+18Aa|aT_9AGcECMpy#1aXm(!XrD3kW+p6r=(!G zv2FUb^sVnx;AyhY-!Q{HDYEFOd2z*v!~xQ^|Mkxp{+OmLs$VgZlaW4!d+#;_nrP+ z?!q>KIm};PqI)q6k?cR2>I#0;_PTE3iv026s|>M0L+5xgaBmX4H|^D(9~6`UgAEq@ zLkm&alOjF*L%33XxKu84B+uPTf`6i|+iyMdwWKiOq)t47G$&(E!gs<_l(Xc~`VP&M z>3K?Fp6&QHvii@b#MJPUS6{ZHBxIH^bpI8D{u`e@tqHcwY2;!N)bJJJLC~JaV{-P? zw*FK5atdjKa}-t68xoFR&5WfIFpJR{5bt27IQkcjWym5TsmIR`h2u$Jex23(%h((S zC5ym`A2li89{!bm{>;G?il}8MRky_MIhu>^Zk?-;CI(CaHDws=AvRvS9wEh*Uh2go zp0eSxnM)h{vzosQ;Vo6HpCyQ1RKAW}4_JE9%MyYdi{8Ry*tmgf%k&- zoEEBjvV=_fm)=-?!#Ic}@{EOK9L9lp?!%<%WOP^)ZBcHQRI=ILOj+W-_a9Kpk@hVN z*qjY@gFGx;@9zTqjcbt*zHRXth+UA@Vi@CkEAtzPdCV6E4S2xrHrz;rG1pBlLq3e;6NBnF8N!Fi%DFAD_FE~6X&0=uJ%LhN{!5?)^gxJZB$0QsbZG{cjK10P3- z(b@|5FcP-TO@~9}>E#c}0SzknQ(8DP^AZj)f0-zOLgcbe`J}=;%0-WPf$`mUuA|?u zmN;*VTjHx}PCMrZP;3AGAko3O_!O<46+2Rggw?BFx>$_mx%&499moB>v>PkL9&>opLKHHH98 zZ%(8V6L@~cO&3BK`%F%)cN!xh*Zx*5YeAavHWZ)khjxRjPD)G8JGThMMgJRH#&7*1 zG1HuPl2aX@|MOG4*Fq!$Gj6QUamxA6)NBsZ8=x7KB6*T(hGbi&>Q zEu0kvR3iP(+>D^G2|FevFJI`s21e=KFW0qrHAvmG-AGZFFQ$W3|XvY_m$W( z^Ji!7AN03lLn?i17%qtV1b(d!6+}yBt}J&;G)` z<ETQBUKWVtEhxSJhbe6ZVETb%AQ0k)gNV}UA z48lhZVNj2xv_6LpxB{m33nXFw+~ZvK&_s|R>D<2Q4E$&qA-;T4_>+N@SgkA+d|BKy z7uGoRKfS%Zy+NOV`uDa1jm?IoK1Ll@kv;(u7I)I@3HL0p zO0W95DeOOkry8?$f0x=^&F>$b5dQZj-ea{Z|EN8b{*i6Yb^=Gk^EMd{{?i3u-&Zc9 zuN)DzmeCY8%K%VlrjqAg1YIV)AW`hQXzZR&S^2h2{=YM!j}D=ySU|;$#v4HN-y8ph z9snz~LehVu@V#5+e|hr%Zy!G4M&j~+fYQ!roQ2)e(YwCG-xrjTWOZMIcI}H7D|JeB zVR-pNwrf{ReD?P%7L$)i8kUyR)e}?BFD?XtHm? zF9PJxj=8w zniX)plX!e&K{$*faU}2O_>A`s5$QaV$7vQWZc4OHE@6Ejhv6ZunCwx6b2mrp`V3sk zt#+sVPL@ZBL%e-Q2$}S+&&+QEPSzcFS~gjACq~OK63S$E2z$<2Q1_^Jq5b1YqYXN5 zfR?{Dex+og9&B>W*$xg4DqY)&8XRs*!4v)7B7)CzhM7qv`zK*{jEWy)_gx!23LeWZ zt!4%o{rZLmnTJKGos*=~hdA0UCD}eU(ixpDfSx{r%5k`?KhklHZV* zmR=0)QwTXKPgu^p20BeZrK-rKna5dDy3KmI8SjSA+g;ux_C&IVx!=oJ&7+8dDeyt9 zc>d>Z+IwTW6k|p$a(;*SyDL~NzMv*2OGQeJenqN~o2Wr&D9v-Zgvikjj7Q4S=)#xI zHA6`JKJwRk--qKr*M2S?-@oqxTnozy3l9Rat--ZgnE8IJvX(db=DOIEMJAdtD>U`3 z0;RAE=?Wb8XrPlqBh`-S_|WX^vW=ZWr{SHfY8bhzYkJwTSSW4NGHJc^%JmtXYoM)TC>MM%{a)-?{kE+tH_LC!mGFdRKHy8_!i$q0HBIrxE_Ox)#Kgoh3G{JBgOP*F zhSXc1f0?%FXB6}lIOJ&;8r*PHrgB@(7e1}eyq|UY7|kH}vLwYLe<;lIr?ux6OP5kw zRQ9t|GZD<$S>C0V?u+*}Yl&AkH=2}&i&;6OoV&vy7s6!F`D&{|;`}UD0&PX^U=NZf zdp)|cO(KbCoy3t(0HJMU)c{O3aL9CE7F=QuF02$EW#ureiF->GCDv>j`fw~IPJds} zd)zZTF6`WYgADHUs@8`qa8^02tPa~~XHt2YvnNt z;!sz6vRcaoMM0Dgr`9bAgTh$V{XdEDIbn)X%)vlH)K&mCBE50m`BRKu;^mur0dmO$ z{>*f-rCBuG2-+lL1z5*?vd>vw0m2g0Dq#s_{O7}$=Y0v`Cb1ak9Dlxa{st^4vfJgh}3vz_#u|@)85yr^H9gD-=|BLG$E65L=tGqB|cpx?XaH6(dIZ zJwm8d-c_ah8+{M4-RqD9J3!D2qKdL%R~0|m4S^Pz@{)0W^xqWr+$l!x@J;XOOmO0~ z?066HYG8#_XRZw-wT~LMyL&uA>6y^Gs!(vo@>9(7SU!2~a43Kb+4z@@%_EfA6-i;n3D789o-!AJOABiMK8BLN^iZFQi>e@^OR0k&;1}0%YTyKmg4Lop&e4=N;!VeyLepd0?`dtP= zgx^qn&Cc^aGZp=&$s?y3km%T6X>d z`p3f0Bd}uX#b^w^v?MW z1O)sIdkYw!7**QNDzXHG5OMti4?$gSt64fAsi;Fkqx`*SOr0GJh`-LUFdnI4$>#Qijyp+#B*#X5(ESn5rHe&4thIjqBwzE+ZsDHVSVi2mbx5 zRH!iQ7=1YAAzCE|OT);l0Zsw+5uL@kE3JY@#|)Nov$9K1%A4PzNdh{cQ0H2QLF0bR zxP1Y8FxOT}9!JYGw0xaDsO#*T$*6W&w$2Ra6qWd zeyPuC(~;#Iv$VzvEKlRp7_U?Ut7kS56y(Xgl(iC;F*Y|S9?T5Yi}eyNO3p+0TP#;? zW9VdxXMePc0$e6nH|(`5EN+*lFEv2!mGMa~>5&MZ$nu>FGs=&8HtZic&d%R~v+(S; zBIj=ifixfpnK9yvhY?|_Ows&;_EFnF5BXSF=@bCR=Z93>)mC~_I7ggLQrUn!)1 zXmqkH@IfW7zN9z_0x~+YDpgP~Z2!yid*lxgF#$?c7~$v8L9#fwueA-aBadC`=jg@0 zhtz6%ahnJyv%9tAen^%`DSCi%@gia97zi6_oO!+54r95L84N-HAeV4EdGjyXp&X(nVrc(T!!dik06w?#LH@&dVOW;ao1`1NSSW@Z${X+8wuR(|Cy*B${64 zm7H2>jO3e%4=1_74wj~;#)eF~_1*`Q_ppfQE8EpA#}%&jT@q5m{QgL=jome&ygl-= z(%QO3F|D%L%kq(F zC_ISvlK^q^=vxgpl)-0+y`SgbZ4>THc?ydd-}F2lm7^*HhUa7m{`j3&LJyd}-vhG!YR^yGC$yNC|-Ldv)%#uXl@psyYux)p3z{UZnD>XVLDUVJL{~y znJOhjMeo+f8pO={8AvT|v4}uUjeO_7goC|x6hJIWg9IIYB}-$~a;FVwpMNLD#CkUG z5Qo@=9mWu~-AU4cMB`Di+V`I3%DXjIFj1LAuM&@0B=Q-_Gw&yV155aU5|8Sv)p0r* zi`4t3M9-7^p&5nQv%THnr-J88 z$910wjJAKBj}}K&3`IgtEf%S`h7EDB-EA}RIc=b6asF^9vdspo<}VbgtLSjHH9;U+ z2drAcXb1YP4+gfk=hm>4_3h>wNwQU-pL_o(V7i|QW{L)C)Oo_X+j6?Nru0ixE5sW0 zlDU5stjBdJrp8M-SnRx41PrmJ=W!uWjY?Gcy5dllCQ(CipH#t@jw#xv-H|Z%lepb{ z=)413NhWYaahn#CJv9MY)XYfDA(tzgK}Rn zEW8-m=x4)s+b2J~$*>KAu($GjrrW$id`U3uT^*#|6}yhgaH-$6{d|*6_*SB8=EXb9MLiYi2k0q3JD06! zVEVZe)-Lke75U5daaTUYrojCV zyjPo?|5Tm`CNCrBRoF{HJ17R`o(~o)Ly3XR!=xO5Q;(KLlRT_w z8nGvv7Zf?#xVMC&^_fo#fV`l4Ey>G*9)(@4yo8q^q7@_Ee(d4_NEtfcw|2ZyXL-sX zEh^ILBR7=cm7ut<*-UgM`Vl+Ak0dTK0KpkY8%Pil6;Y`Vgls+_A_!mJ>Ea03*aQ{- zOsPBE@!?;}M4$Edv%Ry1>d_Ds0IyYVO6%$?d0Ztw8t*PCdi2VO{z7 zj-~qoe<#VWF9`6I6V28he|_r8w{A}R`k*_@C8WBGT(8_ZlIG^B@ZIyfM`wXY0R0UI zwll`sK%udxC{1QirvJ5PPdr`B-)eN_#IT2`fM0bmSDlr=KaA0MvznsX@{g9y3iLji zPGN8d(7Au5s9>$A3Oq4rqB?G|Mea1NdfLbV95(W(;mCD&3J@Vnd=-dEF;!;R?JTWE^e)7yF2<4&gGa9NV_dt zA%mIyLW*2PFZyuzDzLd}67jWr5ZD<%hC5tsp+R5{LGd_PR8w*|LM2qhD4pF1`qU#-Zm~VN;5|F8isM^CKR{yJAp7MFS1p zO2+z>ZS%D6G%L4X;O9{#dS=q?z+8Iox-6u(+eSF{$+G|}X3e){l=3-c-(9@F9>89M zw_2)K-+`icd%V^_*yCSrR6HwE049MwyuTHjlB`XEgE~N}YU{U8D%;~W#X&$dx&`RkcR2Tl@(*@s5?#{{lw zHmfyFPQ9yuLnwZubt-`=hVGv+@Av9Dwt-6|T|^|Qf!imzkF$C~z+r7J=M6iS=OL4f@U~0pWPDs0Ub6h4%foI5swc3nP{+TQPpRTpbw1 z2pNsECL5mHHXCT9E1ane8O6jwxS2+e4ingbz8m>$WdoQ0Pxgrm(= znPRS3S(L^PWk5SEfSJUIRsVrODOrM}7?>=fJm$*@UOrkwiJtZksq&Z{&hq12xZSxVo=HuOn7d= z!v}Yfj#rz;m)u*R%u8a7J0)LL8ocbNRES~#} z+frmpzJxV`p@XU0F{pd-@HkTU#9DJd__!yxjqg<WRU@aP;Vr+*8XB7UOKfa6 z(dU;g%2Q>pod2P8-P!c@59a6On4g*SW)564{ZZCU0SkP*Rv2$l^YtQ0Wm>@-Kbfg& z!vcp2j9ncv_RR=qy~CK)qa2nrRt))>tLU`R$Ej%|^6qSM^SkQlnRZFJooKoWOES_< z-9|f|8#uREUn{Qs?ZNH__N9#Jvw;HU2lmF8}7fX}L1IQ#HGU zE5!?m0yNdl%B{kxd;HJ6_sqZ7y<5R!>${5cHPsxy{_TB7^GR7lReCi(~^X?n=IEDSn&5vwA7OS7mYPWO@5j?`FoRfmhSyERE#d zm*ndGQ5CPQ@nz`8{at97gK*v9j8@f1ZvyjICY)Qnl#Lrt%lV4m$lr?8nTy(p-F8Ez zZoPm;C$2ZXx@i&j`)#cQ$9`7;JcRu>ea6ICKLbb6j)Jf_s#vxjS@OD}Ta@wnzPjEH zd(|dk=PM)PJh?R4Iy#%?uycNo3ty=5im!LR?PBz!rn}9PNZi+oU6}2~p_Jm=g`%mi zXJvotefJbCuHXQwLaw zj@D29^v!yrh`zKNmo(bLGoBksGxA8=nH?i?vfkWK)H(R`9 z1SQKjihg&aSoMiIXDinuQ5oO+M>cHvzCh(ct>{9=I*XE2a zNf;klM)M@av{z!*TTVmY<{@JC>4jX0x4hlTVoAx(lh}P9l}WTCQtH4=yEy+-Ye*#o zL{5`fRm8{vn5rO4mH>--%HO-Hxw2`g)5M7PsXXQ(z_| z&~9ZCuyLo)<^jERqq;#b_&1*N1OmLLZvQWd;{VUyyxEiVUK$mSIdg7DZ|5%hPl?%# z+9xPxUJ3nd?^5jbY45uF<*u)0J@=C5>wNguKWcF8FOd)x@dC%}2=Hv1+=Xd|If3?_ z&viw$Ua+eo#>8mw51pgQH|-Y39A-$(;C7do&EC#A*@@5}`5$0g6b~LwJzbbp34^-j z5*K^ImJMHzduu>)Wg4mu+e_EFVdhk<_TcWdJNI2esJ3?Kb`wYsbS8g8E4AW}W;8eK zgU=xqYU378P%tD51il^r&d=@jbY|+%{~5ACYIL)uL+F`e7-BB5phDWfx(6Ux9fJ-` z7@TATy!G19bDwP_2W61)dZ_YWG^g!L07>J0T6+v(w6V2)t|z?s-P!zQHqMWXjEwrm zmh`9MG`CJ2n)6=g7HT7lN@;>@r$j6<3p%i|#V(~3mS6(9$SPvio_&6&JpF|^ou3n@?JH#6n!{Y!G*Vmh0;!?~Ey?Xg}Uo%^sNf#xs`h%Phz_2pFtyZaU6 zo+Os4@t>-Lm2>Hj++T&*^**b3U`$zA2Io&5g>)ge{9WZ@eWB@wOYaSo1Xf)M;CC;r zqu~8k9lyzl{z(#Gfl_=wyBFr!pX%KMI!%*{UdVYiA_hlbI4}0d_E`hU7_2int;g#+j zZ{uEDyEMDkF}lto((#Jy_DVn=z*!piPX6t(1J9_=q{6JD`BI5l&P}DmCMDmuJ^#NE zWYWpp#SCUD1>>_1_nQ)r9yW45&(TV2V3?6J==xFESK)z5NFm^=jo1RHut(zed7ZaB z=UxT?>@7BwEB^-PeQ73*X017<1dr!N)go2k1RY@Z@S@1dOL{CY0n^%}u0XbJbwMHU za+lj0Bs3iEx^n(fm-G7!nB}wMFETnvHcn14AX@SeA}S$K+obEVn<$gzw0WS@;CULq zehI8M-PdvnEHJ%hPnCO}7AZTU0p@i;p`L5i_Qg~DX6eJ@72|tBF6g2urI<+H6a8vp zsU3`rQTNZ|lhHo8gvAy&CAHE;=Hu0lxa7FLzU9?|>eSvS6Y#yjFU~pj1&8u*BJKAL z2ZEAD0+6-J05$fjN6(_eg?oeN*w%B^Iw|90kQWofHWDNYPR}m@ z!)otTAqSm9@7jOls^e-r01SOuPmj;z9=SL0bu!JQaa>P;1DP3XuC*_L&Ea8B_?zm^ zWbv=b^IHdhkj?Nxs7PG}5U@Sfd>G6_4%fY0SO~_z=D4F)#>_C7IyO1sZ~Q1cWbX+1 zaIM^7G#|gu?y(>ouRjiu0NGTHirjz1VXtHfajp&b2%8tC4%OGU$2OB|CNkBy;8da= z00n~hhB}u5%cyKv@AET{01rtp)>I5o;D0}5&H~7_bNwkD^~*{W!`$;knJ;Ck6@QeQ z4Iprk(X?x~)NNa++k@JwG237QgXTP{*1V)6cT%Wa`x-D3&P=*vg-SSqKGI976Av_q z;`6v@x`%UA6{L>jic&BE>qji$uOG=+4x4BOh2m+>uU`*Hi$ycL`-x=ZIV;>3GQ;oF zUwslA@E6OEOyW|lkVnHxPXfGGaT2!-K3ybmoSH5%o2x46)B*wOfHQm5FG?YI=Gli? zF#lACmxz3w+EMOb1><)n08B%6MwO{!jN=DD(Sg?haxMhn$geXZc~)aJsoRslALNc# z-U3A5b48ViLyppCGN)9xfEzwvRVXn>3P(QX)CD+*ejW`DqxxFUU^x z60%wLRLkNDmtx)<7DJso0L)(tuTugZ1Xi$B7+)`CEd`Mq24)NOKBYrrCPN?&a;uT$ z!D38|V|Fi2(%`p_w)Pp9)OKz|T6eg`$AZRtN(M)HlAFy}Se8;Dz03^R5p9p%Exayl zU%u3@ruAJ4*@|HpqVsH;a%aHDoA!B!Z%7wlT}H1G{TGdbd!fY)BTQj3?X$9R8R?VH`rjMS(7o{%7XC~4V+{-)shs)?Z3 z?O8c-6*H5}_wTwOuk3#TScXKX& zy)L&qG}U!Qo(Ous*R*LRbu?ZKIP3u~4e~mjcQ#Lcpa#(u9n^Jo?`ry~X`Y7+f z+#cmUfARQ8TGnr6@^yA~?Op9ss@6uzdji6MP}|UrctIM&6d|nc1Act8yfTNtic}lFl`sv5fKIT^} z-Z)Gy;ondVT$>c;%0_8(I1Hl{LgUbrpFda4mO!i4#xwSPhd>Hltas2t6hiHv)`Cq^ z(tbf`us=*+cPdjaTiYn%C)JRRrEc-0On+uX^wd|lekcW~$|^Fbfl+#9wU%|v|s9PLLbI2QnQ15%yby=bqU?w$#EK{u(^wwtyYt;(YcRp-=S>N1b1FPE3*{;~* zOl7?Q5z1F~0c_zoltL5tI3SF=HPQKD*^q+Ph5BYAnojXm!H`~TdzX?qEC(-eUk-}I_QzX#n4+jDvJIj~Qx zCwBx|a#~Vd&|bW`aWVdoqItN=sO!J6Yq}6_CpaH5UDdPTCvEg-o@r#(Y|(swPRh8j zux9}p-kiNN2vm_caCdSFCgBK7mkFif0Tlgr#!>MJ2881ZgO2fc>;~@S(?rIygd>oD zo)mn#h?GD=F)~VLQCjLVYtB}0qO0Dh@x_Wz2spcE+ELm90Z^w2<>sJ#b40FYRfY2o@;`e9BdfK7n^~#J*M!epy8Ms&;kiZqVEhP64*$`Ym88z zd0-a1&F{n+&7=lYS`Hu|9~})xb8|3G6n_yUIXz2ypa?GOyDtZ zBbqAOTTKvwhU&pi30Phtx^a1ICQVMMj_`c3+b*_#EqC`Zor(hUeBn-|0+O4dQaosn&I)kxDG!uUOum#$# z34EdLFd{?XUu$61v|YU*g6ak77uwqckf#B_>RVFL7jBmwi>}4uHVQ{kBmRNA-HDYC zS3}j`1{PNNcYjme_A=BI$rNS>RAb^!t6b>wA3wvRbG(=!*fr2$-$I2>6QGoZa9ln_ zf_5zOcXx2Q*JPQ%0>=d9ZALkwV|Lurc(kKmQVC4#4o~)cQ0XEz>O>0OTJ@V?<+YJi zBglNm?#eA`L_$$1ad+pwZs?0&QO=6uMYgp_7{C6F-pz-+*xJ;ObONF!N@Gf_y~JAY zu`iGN-0PC!SxRUZ&TkRM^f&cg7_7Ufmky4w#-I_PBxrTsSm}ju0o{#!zl|%-GIL1; z&fxgX_EQqPkuFqQIwa@eNZ$J52q(dNA&(pR=vS^)&?!RpGa4~uh>g#4bYYMX6A8HJ z_m(FL)&~=5w==JoJxGQC0{;>u)GUZYhmb+w!{sVlW;KrSAmIgAxclcxeU$S)bi%2y z-$I|jU;yiQw!-Wnk*k>gJC``S8#~Wqi$PLijX9L$1^@S#{Gesn|7uYMIX*iZw|rJr zM~L^y2JCaTLGZmFI26KTKEH%f!Mh8;pa=&w_LncE-%8DSU1@ZMeosB}2AV{VzmEw9 zQE4O{!*`bl@Sx;o5eY)VO6o&F=T~6LelsT$12o$ym)5UQmY{m990ENP>R^7x;J8ugFc{3)#RbBiCXnO&y{O1S1oxOqqv{VnWX^<$kB~5{7-kv*E2b(4&)0!KdE#_V)5hKN?mB-!(zq> zXSRC4!n?l-V3F^bpI4Zho2!2Sra*1lwBL?567x{`KZwp)7CXRt^kB#RNueNPr_5EqGAz8SNZInHaj@XPE_Hs zC55Ev*b#A=gmQK87ki!FD^F$apfXIe6WMG@w5FCGMkR>D(fQ}p(fhn{mNkoO__kb> zBY~jt>L(tT`(BW4A-}`03cHAQ-$uxJUPl#dwEsdpTk<%;Vl_jnR9eKa6#<8&s#DzE zJ?xet*l-R8nzP&zZ{sNpE>=?I>_Q&mz7?*Q2rFqHvI-BLR5RNZ-SrN^i#jG&EhirD+uKTz(nS*b>REHbkXbHIiPrBC>QJOxCXV z!{j3Fi=L~@3U6)QyxZXCM)`=B(q;8OK#QjXKlW)4F(~9?g0epZWtK4 zJ4YB8-i^O=KAu0|-Cu^8*}>j(-}hSUT5DZbLUFkpd9Nj$~pzVe3`_EqAah%(hBo=O+b6zGY#j&-<@G zf}a{~QdfD0&#|aDgGm;CD}Ez-y43N1#?>nv#eLFOS24^UKAXpcuTz?5Bn6dge;Viv zqz|hyZ=Y8iy!>70#645uDGN?TYb58gcm^)aHxUNkoA6eOBr`48; z(NU9zRNN};6J5vXM;UB|#i;RU^l8$BRf&Sv!eu^ocaN;psOa=%Prf~m3;NSW=cOPf z;JBc?sB{{C#DM1JQIrZJeY@x|sLV^w6TnKV?P>X|#F=;HbD*-s7qQ#FKQXgKNl0hR z7fKG;CoSDI4TH-E?p-Lq7*i+1Z$gSw7l?={#9o8=SxaqIC!3Jxx;S?7apT6klx}gU z9a4B&#OjsPy%1iG>O4#s38Hl6j&XgBezGC9k(+(3B1My}*L|=;mbwG>f1b@{j2XW! z8FW!`$v`^s$SKY|FK;j?PbZ_(`n5)qUX?XxVEK{Y1~XYyv*Mv8vZfM_C!aBHj7FCA z>|$CRD?t8@6*{Hbg6D5+)OywvHjx9e#*u_YRd$%`gr8QSsm!nL;hqIIm=-gB2>sqm z#L!Ac1&z7{6?Av3DjdO0ddy@+&^i=kVyjM5_CoF_nPk4zk@lohWYJTD-5mcCoC9HQ z7RyeHs*~W=Ym>ZnQOB#yu+2SEWng~AvA7w&)%sx4-dAxJjWrfdH7mB#@k(2JV$1AS zW@`2MwZ@jPT^7mr?3J^!%GBzHf)%`FQS<I;V} zuKJw^S{)%#Pj8pzRWT+JAc4(#FZS5C&khbACoizk*mMqD?l#9HycBA=7w;OKvRyxT zo!qQmmL1iDU91BIclAFl&0LWUR9;=DsmTu85dZkmTpYBCOVI4xr=?(em7p4SBlq*~ z7s4iSoW-f6Cs0c*2xi3~qQA$5LQiJ)v!$lT*`PF+>+@4ww!;oaTN)!#8r5)I5kl4;zkJoM!CY1qKeolfHiR{m{PTbJ6+$E1S#q0QOd2BKFcR|C zTfN7(6Gb8hlxD36{pwCC5zNIGF0QgD)q7$Ya=$?7e;+rv^K_WgG2h0_PQZCUEAh}J z4x@GHie{a|IQ~3l%^30$KBtc>fI(-a1$Lc*s4|jCt>k~Zv2J|-vsErj)mT34y&8`Y zcH`cS{O-3U`f{fvG6DnB8(+S&bBCDk)#F^u?{r+ZgQ~$(^fmZ@lb^KIJ{ejePIU`R z(FMq7r;Rys&iZhn=L&6n!+wM{&8}Gv2@B9=vjL+G)R~K${+Z@{ zl*`u(*u6^_Iw0ftXVR(Yn-S%n(U@;GhED?X*0bSGc~dRU1mVoH+J!QvPuyUplo?1}1%MIjzcqr-x5iw9X;A*953tHOJx@Ip;J}vAv9LaqrXOq{CZE zRCEg`GsBhMRH(tnku!HHWKA#GM{kQz%oeBa&W?SudSz z>vQK+rbA_CuY8#j9Lb(UgI$FpPYMWhR-ENO828TQmN%B~-+Z`6o*P6GfT?e$ptep( zzm!{Q?YaB7lkjT96rHbh>muQ9&$~WJquF=DS%%B>{803ua0?Wn7?ge#K)=D5CwXyt zEA72CYVvx)7q{yLm?`e)$cyY=XHLJ?p7_u)?m^2fhP>o=Ly60plCL^{-bS_>f*Drh zoYiVAv{#7VR{It{mGz#?h$#dA2R{W~7cr9ZpsymABkw9itwPQg^hj6+!$Eb_${ zpu~@Z7TA8iB~eKZ9rGhZk%Nhdeca(G>m=Xg|CdoJ}x@eWsUP_rkwuYdK=!%*facap1kHzUs8$*vC9o zZYDr^(~{eW`G>v|K0euJNs%l)&NAOghH)}kpXN#Zc(_4yCA~gDQR_v^Q2_|Q1vf^ zP}$8xw%7Q)1@fk3ce&$Sfy&m`a#E(ocf`G~%Hc(#8|*YR>wpLCxuUrLTisbTW(fon z?#5`(`Q5T~QBp|9qfAU}D`OcS^x+=rAkI&FC9PsVclPZ^|0X18Jq^+Jqpj%J>-*a8E@qHAqqDf;dQe(;M z&*)?4_4)yvhLTuJOzf=h&x&z+R$%N078!06ObkFr>bTARGm_5H0pK0d)^>0)Lt?kD z{4Zj`r5-AQ3qwJ>$;(ogNJ;yFxjtDy9qtN6MB$YifEUhXF?mZ}gpU~_*kN&nc)m(G-oMeDB-irH;c5pjkK)_&pEOw4N;jvyAaZwxa7yjk zv=ACRK>MH>zMA7Mb!J*f*v`j~3&f}b3usag_ASi-%`BdmpA=_xUf8AGU(Qtv`Vd*( zMa#u8W5qf@5e?W1z!s=>*Hlenohyg+WY*nbqaO%<>3$Y5bQFzy`ID#szZUf+ii49A zk*cbyNPm9+5JR?lSB71n9DbJt2M5R5)s@LuJUl$Au`%p?}RZe&PRntA&l8r{bkxOX=R)pc7|o7OtE?~!(aTz^3MEY&u^>M_4VHi zy8vuP>)=hy4@h|bPcTeKL>wTg?=7dNaioDVrACr$o1(sY|1L)|p3z!W5nWAq>55C@ z)x^JnQ4@fs+^P41lMyYAgj9d6ZqZ)&0TPr!=@CueD!aD*=m2&F_CW10Zf5!gx6^ z7SjKol9JK`d57WlLhWt$zv%_c?zem{w@M`jc@5-3zBI#>t)3aTu|@W39%nS(0V-v) zL|M#JbmujZ~1$4;2fEIl1_&B+4n_M1Bq7GrLs>B@0 z4DU^P#t$luTIqqF&}e`O|NG6w)@X(z(3;4kmMax=Y7gYz4BB*}|*4FFP)?v{;& zB=TJDPS659sgVUm{|zpjA|5G7;aCI|{h@J1o1I;fjz^0w0RQHKRa8VDzwi2YpgC^Q z=NQm>=ucqLK7tW+Q8syArB>2j-mQ71a9^tq^^m)rz@}VkAi}Fpp9H(k?0|P5g`?w6 zz}2Am7!EWF0kr);!qfQQ50es|EY&N1o3qP~BAfNRKBjHPdljouq^ju74@L%5BBnbE zJBT;GT}l&@T=#{%^Qt7{v)gxyAipm{Msn?Y;1R{}9(CZ4P7kRW>KrYS$5$ zg+&l!_;CMve<$O;Rl{_#hW1!w8ilYsBi1vDcqq`Gp)-`u6lXe+4&=;3Y1h_n!ggAY z0sX6nW@O`+?)qTa`ckd#!{)ZOHtS3lAn6s$X7#E4d%}sJTg*u-hVgCnL+29#hx2?X zUhK=Yb}K_>jWQXR1&B$}Q?mD*ALb%<4U>gkQVp8i3y)C)ufe} zj&=IB)7fP%-Cp!m=M@a>MA#(KUVtu7bJXh{>6$$b62r5&rK|cj`2MzqF15QE2R-mg z1wA7vCy~tZzW!sS`>8*hbh@L;8xZ2#5l+w6dXu(IVf;@$Z`>=$${J(TllEN_xnJvt#tpMd`;Wo&~J&KuGBR& zYWJiQyZkFZTfRaijrTg%TDSJQxi;a1K0q4+EJmmR5tE9!Y8E>Yb9`enva37T5s+C4 z-f|5i#`0}8s&fw=so5FJvYN$*Sf-sKy8UXG`%xvpc<5>DMlF`juth}<4z{AshwG(Q zH`UQ}5rm#=!p#z+OB473V$k$Co#Y|k$S~!-%g;wKF);Y@Z#8W6HUNs{ayCgPvWmlA zi-Q=XAP*l-5mG(h95oZ@7ypGl_T!=Y?lOgI{piRBj-)<9(*Rm;Owa#1oL^~I80iOP zW7nXS!wHQv$^)-1Xb6Xv?7EtL?_11u+VO>7!}KFZFA+C4Ao|q2NkUdxlCTAqKNF5# zRbf|%@!R{a$9M;D0vPQ!qR(?BL&QyGr4^vwtBwb4_h%Y%VCT~yqIOMYi?j&@oG!ED zIkaVfat1meX{yKTcD7DebR5;GnEM^)a_8Jk;b4W@>QU<;g3N~*(C{hh$P(}xja_zr zK%(80{z*DFiyJGDuBD%B+j|WVgo+4QCv2g|^+m)qROri}eU(0{L___M!1C!iU_fD=~BXCWe&vK=E=H^t-w+Hg(IP|M0YbXFAxoBQMnhK({;&z)=XAK)Z zzPQ|-Ql(eUpwHs_#t3N1z0}sGK)!5Oyz6-pQ=rRF7DU+YCFFV(dnf&KFn^$z#1uUg z7$~v>86DZ0RfgJ*n~YK1u|>{DGXWGP)K*p(=HU#r0nnI z-dm-5^cIEze6DxsKF19!-Yg!t#EHOkn?1mKdMjNeo2{7D*!^(ncA(hxm5wzkP+YZI z-7H_T8CShn2gmUB0Sb2FYi1+$LCx~FfQDDX9+yRXgPmGz&}X$2^#ay8o5dRGtTM@> zQS~M%rjm~ZskYq#U}W_YW>=1_h^PGZlE;;Y)8+t!i0}Tw>metuVV_?^u9&+al=mlK5p%DJwse#Hg*@$8_ilAB`%AxiI?LFGo=T- z-jlmr0Gmbw4!qB?Ex4K-(YI99qL(W~_FL_-Gobh!uBOx6^n z9p>*C5A<1*=Do?nnTN3qzQmNtd=;Ygi_h))4IqXRje^N=2B053t?zfa$D@24haVL{ zHM#^-dSd4IIdK@H-fhKKK9jX1oD|s#H2br?0PM%!&eZEMnsBz!pyvaSY zsBzuGEirDaEH|jv17u%qn~x^9ST0cjkw#|Et|#|F%4zAol^kij33@!=cE=2b++uB4 zz;?CXL$ei=@FJthHeHQJv4Efm?8B2YEvPH0(%z*Z7Kz9@K`0<<>pfQzW{#^1y;`xo zsXl<8E4MbdHr6T@MRM9qO10NnBMXeQ-%}0YN#que=zpW1{VOIrbRy|HQJ(0!;`&Qi z1!^bMKa$2*@F!^`-))S7)EN(#?oBk8#pqn(mn>eyy3F&Whrn~y3z#l{umhl*(;K4L@0qGxnuml*GiJF3*fK48J$1Qh9R^ zUJk-f{5%P{$I6#m`wg)8yljnHZnYB|Q7AR2&J~40?h%qc&qK3E*Xa}sTt`Sb52`@w z72k*!>O8_!7@h?`ql^K@sKQc{gW2J3%1^+{t+x3fSdp?~9d9K!wchKi2K?7|yl zr;Wn{Iu7BkqpA0o8@G(`>^za}C*~iq2;NKr-cI!L{|NM5MuYAl;;`U~x*&}eN%~=HyZksl54i0|*;%3XQ5XNUKIQsJH`pn_h zqt<+&{DC%b!udS@{b(+?F!%Uwt9)1$x16xapj4Wp)kXDq;NI_nJkMs&<2rJoU$TAS zmwVyi<=wKVwWa0Y241IqQ{DPa<6sl~7e6>mxB=fW7apM6nX3AuUgo~lv}CKC z7gZmdIa?~%sqbOWrN8{cEY9stwrbp7QKm@#mq1nWN=ZnYOep#-74`E#w2&_y&)zrO z|8*EC?P{UU{-Fr?k!FA%njjhZZAkVs?!iQds$DyQ?S&+qf_Kb;k4m2r^fE7ej1<+w zu=PLx=kcHKMXj3-#q2)%6Xc9UA8@=n% z7mTz<+o>%;6p9_FmLK2hkCg0v(EwduzNyN<{!YXA^YaSe4qV>PKy1hcGFXc8nzoKsoG?U(Dj?*M$^}y@nyR` z_)nJJB&ipRBcEsS5r~2Z;s&Poxa!^#Z2SpdaB^81P7(1cZpbm2vvs_jcVH_Mvfqt1 z0&HZ3PtssKGZPRZL>u`a2Bs`jx7L8V!qX&UI=f?ony+VKv0`=t#&|J3be*!nVC)OEx^O`&jo~IL%bVpXVewrKI&na4aFyl$%aSISDS#C zo^UE>J4|(E67`=-h>@Yo9pWhSDy>V&2w->`Qt3Et1Wj=D9};|}DE?2ZX!arSdQm=s z*(_u%5RKkcsr~#qQGTOOVL18ym1phYvxw%A!~beo@hlFr#P~=z%!i-reE4Fh_k}ZU zK37)mf`jJiKF0Jarsz?zbc*}V#6dTLST;sV zm(>!r_QRNS1^RApEP$EM4hS^Wu|Bkz;f)w9)!KEC^E>OLa@)QIqOe!mbDgYN+sa}| zS7dwxD|pD5P5HQQodbt;;TE|Ff_td7Yve_iw|uNqF_0#RX)1(wqQA{VEFNgP!gP_xPomxY0rD>Cl1 zGTk_ip6+hRZ*%2L_h5>*fF$zF-0S<`=kqmK5{0h-y0wo4Sjzp^HSE>S#Dl0WtVy}E zJG=o!>?5>UK-(_K)~(YjWVprP$rgx_Eu5IG1v8No!&LdR0B6`~W-5wLF3J+AMXeS2dMTPhvmU&E&qz_CQ(oBPGPEd*uDvU zG4+=-3RLxk&XzyW+kOoElEX;2y|SC{sQ!k>yi&50$wa(?fb?CS+jtPZzXe3O1g*xd zS0%X^i=5FPS3dl|_xYNkFKf)8ynC<%hLIYQo1OnevYB*q-HRKXmU==-rG`>@!i0g+ zku1Qohe^xh1l`++;myfh;=#`Fok-B?Bk z)t{e>qw(KYmk5@<_9XxTJLDvlivOLAynKQ}0{80o!!lqQANno*uzxk0$olpE#pe`0 zFvNV93WeXgM-KmY-M0w?yEsO*56ejx+Z^L7XTn_)iDUsnmgj~wQaC9cpVzD!ySz5W z*SZ1qYBHa@Z2MD;;3)EmIUvFkvq{XeNC0G77B!IokGJFgGzmU`z2&SDno6?Px7|}Q z)6TI#?*D>^>Dp`=xuiNv3>G+BGVU?&%IRW)pS_t#d8$TgA<7q!Sfr9Q;S+Tz;ItAH zl)}Vw7!{+}U}$eqv*c1=b= zV27$Tk;*HFdG7SbU=V|iOPto~^1RF6J&z-GFeoCe&JCZGE{oqmonTc>@AEw!x&Kpi z@c0fUSCAH?HXsjQQoiMeZA5K?CBb~49=xwrW=WZy(ds%-x5ssusD^&`^#U1lRJhZ&g@ng9&D8 zo{HBxn`%>k{6T^WAQEpgknoHG%D84qwg)T^{Ay%v(L=!jysux4a}%DE+QsAfT`k~i zsdi&S!NV&BCL4HC*@)=DR9TTGqp=D?Y3=>NY{~s1B$LZ76T%+(>_d#<50?+o*dy)l zyK{KjqE2sVI_HX3Q1Fwf|6cp-s3eAmOn{%xp*6woZ-)ZF#Gnla?&x6hh1#JkTG`#} zRV3go%x+0maI$#94@GmD zZRWSfMX?5<@1$J}%2Iy(M!P-xOiU|l(M&1ko4Z95IXX#ufmge5w9*dL(=&cSlqw5l zEIezk`B?d4iNracc5#TA2SY{=EaE|g0e+E*8_0QcuPVGj`{*YL?<7za zx2Mv4W$eLiZtrWqKt4#nHT$_K*lHprzEA{oQzSlo>Dp54O*a++MchO5ozu3c%y__vob1>tDw?0XP8D=$rhWla^pndPF=2#V z7-_@z>x{|hj8;!=1&&X4UAhqXx@LBS)~Lde8(4;bRRg9D;&T7$Qxs6FDfK1zADVgc zC5Z6H8}2@t6z#PS814_#=FGU{o%o3Q$n+8sH-)32k{&_O?rmgfPliRpcVv!nW- zq=|UJLG%VCv2--nZ<5zuHGHD5kGp6@uE2c!__W*{$i?;bPTHBgBrRY&>6bxu%2>}qT_?ds1U7L%byxnt1M>JL z>matZDl&!@ygm~3MV-3M|Nc(&gO zES*~hGd35Q#fN;aK6*lhMs1J!8K9u+Nd%5b!eFr6cX0_f#d#eXs&c~fA)D2>{nPsT zdcNybskP=Rr|jzEsaI>BrrLW5x$pkE1E}_#ZJ`PQfq_SEafKuC$;tnrGOXf?6EL8l za5hORYRmN?(e~O&NoE0f@l9ckQ4^$_+yE266L%=V zREBeS;-5bPw=IqdKZsu`ke-rJ|0RwLGny5{OOiWY5-9lET;o_UU++~F{-1~nAk6M0 ze{6Sj8^LL}_Oe8`;^)c`!viwdbR<@~RFjos&t|CM4X5qos}k+j-j15PP>mwRsi3R; zkN$TxzEkETLSJe$tJLLjiCCYHBXp}hD|&i*6*5R?P+JU4y*0T#b`LsMWR2wzvuydk zcPkg?T2^Miuzxsn@G}G~e8^$1=qgJ+%h-j5yDCjLpU% z*i6wJSxfddSS24D>I@q^pw9#x*7K)Jj~_&omD2^g6T!Tk>ZPAbsYEJISl7N}X6gc5 zJMqRvqtP}(uJYBnKMEudh}D}v2((%QZCK}Hxdqo0)s_pmK)4^Il_JU91u#SPr293wxpN=J1@uXY*5~sm)4Zo9qV$9B2 zX`S-@Cp{%;^k#qN$Zx{FLl3;Sird4)ycN0~@}h`u#qq44GzIIM^*)swF`#vj9k<&) z_^&AFSQcMG+JiTTV+?P>XAzC04%1Dc=UdT~u|Dj*sz}3L5X=cRg{I2$6XH&-jBMMHCBBMj+^riH?BRF zt>tn#0WdU-xrPoI<^(u7_5%1c8;F7X$?8D%NW`#!>q>#bt0X(w@ED&LJIpLRr;a_n z#$wEaQ`3swl~o;-W)kjciOOc9Vt8hMcO70M&e5Y~H2I&PJg2g4)b~vj)kv(=VUv(x zFVU|JsdK&Q6*iFj_xN> zOj=dPC&%sKwZ<0n+bpN83B>XBv&t2ObM}(!#+7=mj#_ABWFn4+Z<3Z3Q0S;xqS+Ps z^5EIPc#MfDqSCO&>cnWF&8D^ObdwfFyV3#^ay?FrrTZzr<2om|_IG@Bx@3xTJ4wC< zbifO(2F6AX&^WYmvOy^ZDg|ajzkgt`P09?jR(vo1{-7!${m_I-pS7WuQ$ zMao(;ILt@AP!p%QL6U4Bi6P36_uEocgHwLeQN%n4kaUPyuM#Nz%zY5dDQvruruklB|CqE>ivAhZkeQ<3QQ1>&E5B{ zcOyxeFWl0h%z?AzP%3I_YV{6RWiR#&#FUNDb&@>s_uUI;!#-E_N+l*cI`Kr-lmefF zMA*(vsSLig?8I&Cbn!RnyxTINa32}(z$OUXpVKXy|JmQ$(Xhz1Ve}gyDA-`=oOZa- zI_8?Y*zk?IdEJ;r5C8O{s$-ycM4t`}Y5Sxc9a|NIr1}#^6r-%)u)sN#$j&t9_Kl<2 zX-nxeb+(V>%^MRfeM6!8xbf(GNjaaF}XhQ`C+#}PnhF(#u>fV-8izjOVP zn3$fnH$3iep=QD9_>kN8Y~0s0%|_G14OSOqtzQ$f}xM*ccg0)5H` zU%!5>sF5@#WKUxGbM!;8Nb*RB*NsM-r;;P&KEFRfURm-dGb|Nj6QMDN=GmP3YzW)gs z5p(FT;eQc*b60VNJ<;dBeW>d-Jo+s0`uPNO|5<8~P?v-R=T(%hs~3Jfx9QZ*~XP~c+gtcI5+fq<>`e{B~%(MdtDk&@ql>5`sW~kiM1yYP@D&ruQW*u)`95E6cXxe zl3(Iq_9~};&9T^VtuRAG8oGi<4=(4JrnVYaEcC8oMT1-N_zq=N%_P6xrcU(jM?UDz zIsM)QsTT$9+|140g}mQ5;>72+7|F2kFPZ$fznVh}%bwD1*W<~zTnkWd`X~W~>DHPi zs{aXFxX6*nozhkW&z=r@_;MFdzWXRy5ps`pbd@(2Jh`JEC}7xF7_mQ4mr@G|t#Q_* zYOz2Mzys%60HwSj&NG~A-dP~H$+?Pb-KpL=RP3fNkf;fQlK$F#)fSxPqh+)=2jqlw zckp%aHixWEpvYaX8svRE^BPXOR!S^gzQ+dUbvqKDm`StqH+=!TKq3yQEO@>>x|Q*J zTgk~u)MQd&ZbBF0OG)yOl9Z}t#iyg;XwhnEHk(o#0|1C;7cF3v*Fm^|gN153+J^CI zCbug<(0TV4V9J#Acj@vjTLaB4-F5md4pcz z+VXs^&XT^O@*DG)FFCx~S&g4VwcPn-3+fxADYPop>TB**B+2lNjv+_%Q0ij6l3d}7 zeSH8_a4nOY9E?+1TO;o^E#Hl}_n)}#lKkoY;zIm`!O>+ev-3;c^BcYueg3L1 z9~GQaJRG;;(Xd1`meNJ#NjDExvLSsO2HOJBtK)FGdsco*Jr8HOw&&8yWgOiR7{ ztupV0NkAin=|CXi)OFerB?;A^5C!E)wnPl(vks+9bK_9Z3H}?ugUD)L>ltP`eEoEk zuRXh2N4s^O_6?p^=#X4pRMq&*+1g#n722zsXoFo37j57-n_*Q9fA2Fx?upTzkLE|2 z^^6YSIe>(rVk&nzL&l;fDjnDx?e+4D!9<=gxCMTtbCGz(N}Y6M7C%#z*n?gG^dutW z6jPlC^(+H1JC|tzJ%W1~mtd$srjDIkOMG4+Y#20H>b*JUf;w+oe)8MD zlW2-dc6!5rqIugUIA+sety`d%ppXgTlg873?j<=F=_pD%SH%JzF=m`|wX~YCglI5o z;bdLSmN)}z9)yFGe{Ut!7bKm{0UpDNjxm@ihP2&X2VdU1&#Z(0xc_$-UxDSra&40rcy9B6OBwfp1W;V#b2%$XhzFu|8b9y&|$||Dx1FBVLSt6%be@q`njk~BUl!d zb~MJ*#WH!s*L0O>H-k`tv{#k_Ndo>v+E~GiU14r=v3!KEP zNgt5(NNtper54X(hvo3!P-0TorrxRUP4B&1OCCQT@MW=<$_*ZG-MONdn#g=vk=E~{ z`F4F#@^}2o@EATf+p%*3%BxS3d-sKA%P+xIP!%sWP!`?FP*e~2WJy~g;Xl%k` zpFkk9?_4&(xA>G-wfAo&b-sXqgOp(e)vu{rJ_lHaxHBCz{if*k+Vzq!j$4kQFoBKnc zWmw4W_*g_SL*qyM5~5NiX$ItPOh9RN60x{5Qn}+qHpUrn$DXHt!#UaHYeT}jZ$Waq zp{ic>=?Z;r!hBQE5MJ9QX|vz#%MSDEV|!h9^dwyj`0-ItrC5^bA4I1DFqYTm%%Ot# z2as0V+MzP-3fAg8-$eN-q})4~z7*VS|C!_V7o04Romer_Ys;&UPv$_tCM3^6W#d<_ zLFF7QMK)Ne+tHP3BUEEC#tfwSYPm4?R3O)KlULJIP(G{a&e3Bo&%3Jg&s9R!xUkkN z?=M=+Esz$p_tgA40fFpD=SjgWMXzn8EFSIsxf0NUfbF`b$96SVn~3OW5^pXf$BLos za^m?1#Cs;6@VvhJZ}%b23YnP`meWl*jt|R?iVNy=_v}`u<1Z42uXbH4mW@=|eBVbw zamp`;C0OvITDJNsw(zrV4-I4BldzQc=a8)qasNxOOjiv}9I8y+T3y#^#pQ>wZ_WD@QD{ z`hgO>O3~UTlb~?zUhjW$btaTDFtKVivv@VjQTVazj@S|ernmW8sc~1Qt~>`#x^655 zCTGTsf|vXrw{+3E!ow$?T{f+nS$IG-_} z+W`%q;ha2R9WyphBm$F0ZS-|_%f7@{$)2=NK^sRX@1b*rtBVJ!W$y^Jsd+#j`ykE> zi+E#6Dq*gLGA#J{LEsy;fCJ%sdpo@GbkGn%57?X;e}~YxW6VkQEp{#iWan8kVm3{R ziynWj%oFGEm~6MJ;8k+{M+3(c*M@xl?jTZ-}fd?T`TnT=JV_1YgJ07FvnWBvhgRZ zK3z~I{uT1fFd&M-6lrPa-o4$M8~F6Y#RkEP^SiKThMr05EvUaxNXG}ZcOp<`kf8^I zNRpO=zzq0`busluuu829^e-Cgd3!chw(Kk34|&1}J!5?WeA!faxriJ z2#I#+g@1f$?Sq^yHJVY`sL)dO>{xs!RE;isOSs&K`NJ3=ApvtgF~M`I3!b@EPP>OC zo%lqO3&9Hczx{!twR?IZxRyP;UCu{NDGMHUjCIFLEUH^iMxBHLeH(*SSC}hUCxeb! z@=CRAT7-jP!I>}b$2uOWPr2#z)Qax&VeStm9tQ;$fx&CVaUeog> z?!tGg3at0__Ga}m{G7pI-dR+AA3vG6METEDpX@xkfhVBRqhj1TU4U z;+2eo^Pv9@qy2f2`?V~Y{=qW`Jxrt?Q{EH5TC^iYmcn$}5#$F_k=TmH872=%-B@tY zD`X*2##l>6Rs1pBdyizdjw4hB>te^7GFXLn!VIM2PF)u@QDz7JtU>I;@Q#<4UAc;5 z3^XQLeuMZiekzBsC}>dT$(};dAZxXvjNdHHxx6BOO_pTpX|A_xQy@8jIGyJDhof?teqB^q386l2}nXe-JMw-w>&w z3|}v2a$!vj;WW9EZoYlyG)Yrmq6!ffT1K8oN)~QL+OyzO-(kF9dUG$5N3VxuEbifvqI@3l3!=TI^5i;mIvc?_*`Vsc5AshN6d>ni9t-& zk^2}Tf|O5u?|xi~PAN2RqDr(YD?}-lm8%OuDWcVONo20@P}pAsz|=c*74cQ(bd;6- z%yuu@LnUjHYU=vTP}OdxqJh5!xmwbTisf=^A8*Hc^j9v;w%;|I)e>~s_Ze$=8%=~eV}$<^=SG#hWe0cbd| zb(%%|1IvLwpGYT3p#+()J$~#bo&$vP|F$QH+;#=vFISrvLB2lQxL=!)vj;r2`m>3>dizv~bM!kYAC{Rt& z^&3v&aWpLCY60Zi_b3%W{03?qM+93BH%m0mkBf{4t2Y=ngRF$~iZ9Qy?aZcTk6dpe z4ZSuGPQdZa7q4#&T{Si1trr?3w?~aFzo`CkG~2W`&2JO?{EJ-JS*pd=+5}8M`Sd?l zAita7?QtPzYMMW+-!$DCzE_Kk_4aUr!U0c^g%+Gib@gp7I#HQyAfBXlb0<{eu%>CA zzqM))Jep9J#uMAZQzk#KE?r<$vG020@&+o`JV}SVI>K4KdrXA*MXj!WCVOQu5c}f@ zl}h=g+sXyXL*_7X>+7~3lkJLFCqBy_ zPHrW}twHb|+%1JLB|LsKpay`x3+)zJZeE|tG^uBf zGWnv4KFEVY@+o{ORRazVVF$YAQ^hzLY6Zp`$m9&u(o)*2 zF(2xyQpFGars(1MPm*J$@v7n7n-bdM5+dbGQG+Ko;CU+y&yiXdox|%lm3V=p}i&vnMEXshPEB zQd9{qsWRHNBGrq7MU$$d&U$g&Q|V^XB}_@uj0_CMk(Tb0le65#5K9uzem6l5B*rKs zB_tZqJocwSWk$f;%XWzs+ROF;nDU-#78*W9-5R&Lc8Rwxo>B*;h|2Ym7!`Q_2GwB@wuwEPH<~4*6}Yy!b@ar>|H+{?|5>rzv_cS@&s7W zQSzS)W(YXVMotF>2WuRmce+m2Tf}iiL}s*vOCl`ah&d<#7*GnVEcVM^h$xVA33Y01 zpOK4#xfMO76oH{;183H?qbqs=KOuR@Gm;+%r`2(pZf{UfqQ6tnh1XNCWs1HO48g;7 z)V=Y&YkJd3G`w}*M$q%8nXrw(vV*Vi%#`(37(@VBYIc-!|8FXEQlTuR#%v^Y6TT?M zw27Lwmc{R(z-ck+3~QVlln{YtbX>_tX1-VTVtFn+82Adhi8WcF}E>CN4)jj<=*O?O1tqhiww&Weou8Q<3IByY(WCvdv* z;>{acECR}c^Oq#JC%=KGA9G|$&%DMB_T6fXzQPt4Kd*?KlLF@P z&+No7_>NO}12w9(Ofg?_sAs{72*)Q$3`dlEdkn9Mjs(auAca@;DyjmeQjbYwz}4Yz zL95jGe5L3m^r!cayppxEXVomx5nz9=!Ik6-lU`a#!YUijLFzmp6a3kd_!)4B=H+TD z_xaX{Pv|jD=a%1S(c_6wP_P*vZQkRC{_1g|c-&Bd9JAj7K*jCz`0u?AID3m?{J#tT zzxV%lAj%V>m-By~G#MnY>M^!!KOUX*zBdlV`+qrQ!1Ve7Y3_f!ii-p0^WR@o*?klb%bYasW>q!$tJnLUY#Fiz*|#|iVe z{r~Ld3}he=4&~&6-kZ6J?`_xZYApB8UsVwj64DwIAS3{g%SR3FQjjWWl4w0&_Xo04 zXO^afypOsxq64z!@zKL6zo)$3pqNs%F`$U|`eqrlc^A~#EuZJk((*IPeFzBDFpzO} z{?%l_j)RA<4DUPq>%KZSS?Qu!Vvu9tS@qL;sZH9^bc{ZQODhqmA?{CgAuZnhtfKf=K3To)49-p@_;3_RNTSbwJdMYt%F{W*v7Z+PDG?|q>rot6o zvCv3J?BLGl<>ft^_w|=ClLZQL?mEf$5RWMt*vZV}QUs*RfkI1qCjHWUbSx}IOUsbQ zR2(i*f7U95*KV1fI)_@l#S{mxV*0TSt$!l#v5RP-+A2zuQCqLZbTs|&f`o*K4ruL4 z0AS@uzv(fP8qch@#2ywF7B>QI7#fHx$~Qgx8q46uj<^T#OH;(Cq3c7l<976K3_SNl zA`-JGF^kAU^>Vo{cmw1w5Cr|l?TEL4DO7K>j4_>K;N|_)V7tO(K}%bpH1IN(Zm8Ks z49K4@R|P4yM7G$V{Oxmp>BsRnjr^Wkk4LZ7e7(|pOuVFdfQo>0R21n-6G9iI7o~SZKzi?8ETAI2Nk=K61*C==1nE@>5PFazgaDx>A%wsV z{-51@cR!zJ@9R5n7{Zjy%wf*&eA}sNsdb)sQol9D3sgDW_o5k6$iN;E$HbL%70w^4 zgwt0)Wc0P7$#O^L)vt$MDH=LB6rWMAekcv2^5os5BGX&>3@@T$+3Ik` z`f`p6ev7}Y(WE~R#sEjLn`?fvt_wj#6KbT~ambI&d8XUbHFilKDJWM)NkM88>I}93 z-MTtBT?53G>Y8Z-3~ukXENLY>PCgBIKcAIw1?K6Admh+k0Uy$SWw`A@gH@pmIiq-LUW~8=`d`Rv^ecdrgGsFXDbd{Dl`6+w4 zu}=f~nF5sdAQ0EPnID1CXQZTMD4we9LWZbq~w?qK5jE`8zaI=(Rso`X@cbrP#& zQXNt#R;;H12pPEnJ}6mbyLF&65`OH~@UN5-FU?()J2(O`#Z-Ha;O77uVMqAJpbBSr z?ldTzRG?nC=XGiUGh4@P^H>?9zH=b`s|Li214$`sP++tJ`?Zq$A)0(in;vrPmZGX7 z>r-iPH&o(KdOCbD&%$rxfVsr5@w<$NzYcXZoOq&=-sbS>qBh~6#bnZbM&OLE^>s3Y zVd9P*TL4Lfid*Y$P}x`zZi`?Cz%9D@PIl?AmsPcHqxwz0Xot|^dh7uz+Nu8_{RRie z{m`6n^(RlB*mi#Ptae#-qRtY#8k}dOW0qs6j>b=rMxB6G7ccUkwx zqWfZP$OH??D)@3qeorj$Pu9E{1b(&|S&_X-Fx}n%E$e^S8ndKy_R}f@N5innqbfWd0?@z&FAEi#O#Q~O!WK;G6!0HZ2xQYPl!TuZ)_n*W z8d#0p&?~*eS`jr)#D*_xi{9F?3Cy!b>*9F70K`-c(&nh34>9y*77hFEGSxEir2H@7 z^|a`oWS1_~9%5mXD4BI@SqL@(3hz|{0BMbleFc{<(DMue^B8S~|6QO^ z=>FEOW9ySlSSwy%zmSHx`QvpAi|YL0=iEub47G@mz%9~Xx`;{m-6%sTUKEE;DZn)B zwVPG;mWpHSPL}TNO-AJ!7ba@!Y5WlSV?Ft+?;Bzxw6Mfsu?KzyoSYEZf!daONCQg8Gaw)OqnRC(jRZ95>6>5e|t z@CqLB`+U%xed#L4oj>Uvg?5N;{GmK?FH;{$c_@6=F&XXUpY?eK{H}|wfd3~Q=24X; zBn!!sGsHPf{OIT3vM7vcw;v*#;kO7EjIF{5 zty=BQqqPaa-CmajHSGL@z%>D_U>9a*LZX z>S`L(LO{=3#@2GRcR>qwlwC%26UDmI9qEpu_8K0~<7*q68gB}k_pSxyEGGflC6~~= zoIso)6%AEYiN}o3TtWj&A47O^XYGb6gy5*;1_01_Td%i2G7QR$#m5lBZMOj&p&GYi z;TC;Aru^{)P_IEDh%MQszMt-q(>UBCClFBPOEtSeoeb<8 z)8)cAe&vIuy44Uxg8KR-{7T2Q9wBhiW95 z!e;;(gYan`e_J;0aB&o1*H?GftZH)WKC6vfSkoxWOk5Uzug-QuO6-<~##BKf^>3h% z*rEo3vN-?qr~^JAQdIflYR~gRBd!5;Z_AmG4)jJt2+CjpX#Mt*D`w<(l-apS@5^&UYVp+c~h`N+!;P8m~<8CiHj7 zU~=bdyn9eOOTN1)slGZP*}#mI3(9Rz-jOTw+ekQAh<&r8Fk*!R(=>l)S~U9Repa0n zl|Az(*78Y&^0@7z+8^zyxDz!Q7Z1uj(HF8 zC(a7S@HMRdq4gZ=^xjL;kIBL$!n!Z@rCuJf8B7{-jl;f^Ub=DNDLrG;%HO!*LWkS! zZY2ilD~*_?0`FGu*<~#54wS@gK>*v$?HQrGF$>2jFHNdf&1aIN%gi=XyaynyO9lE7 z1(-(LXjMd-%s^<9MplcjbBB+k^LteW`Pso;Bh;-D`f$S)%mQ^HDvh#lr^lu+_^$uk zJapq9MG>#z#uL`J8q6)d+V9+Lo81&n%qh@HtucgDYe24 z5UmJ?6U#1vrq>H@KPNpVKWMq9b;H;wuOLtkoM#KXG#htsM)w(muxX%2_(vkeTNrMbcBz0xzjYQ5)MU-K2I1nG}L^Sv}ZhfF#|)7hH}0v zF^|I?Bbw`TB71$3jz$CYFIyggRToIlY<%z^4OA_AXI^a`w}z*sN$Vc=R`ZBA+ep1`@}uwG zsmo1A^FMRGS60D5SWx&_DfA_JVM-8-(=^-5xBd<}8WhaW`J7b0J3@4p-|*(JHF${> zS3L{~3V70d5!-!#+VEeK;9724VbIoqIraWY-22eQDp6wO{y8b>?kl?kgqqTq(Om|u zIKMAR{atg_A(=dqjkio)3-pe%DyN-~jix0#o;*ETSTcci$ss0=rC9G(J3-b+Jk43b zGSJfCqJCcJOZ88pcAG2d1xV>2kv~lkLr>qOFRJFpMUx9^@V^xZ4m}}9(>_7iV?sG* zz3n`y+L-OsxGd$G`&2>B`evj2*0S$L`RS}On|EI;#k)j(i+{t*H(xM`Mv|^m%T%1| z43cSF$zeNl`oh^cb?dED7Z_fEhqNIHbtQjN@0rb2`=vqp(W|UNA#M|WH7vGS%~sia zlP&7~CCbxJa!%uNyi6vvb6id;A$nb}URflH&t(@Np^@UKht zZ(f@pi`AqWBvl|Peo-OGa0$<`ypS>1-6@!2;@z6wYS*Krfubsg;jM76#afda+88Mq z7h0xAX|dOy9pOCODksM_o}&f#vZwD$?-K0MZnpJ)uNsp`P@wxs#R^gExn%oN{IE6)F#U z_6!Xz3p8lic8$&^+Yp8ozTx?++ClDAiF7 ziiDNF_^-8zqhRs^ZRaMY$X19q+H&<&nRo7T{H``+8qh>kd~#cLo}@j!9l=0&&>Ba{HKl zrnf^OvfaZ+^{2DOfy7Ivg!~jmIHm$YPbL-^Wod>B8g?knONhG;&%BR_!zX*KCri)6 zV_$@^)L1=$P)?Mx=Y#=yWjq1(S}99+OghM@dPB#A$IB2A@K;L$wphQu;2(VQh3A}k zDuXt`ayeBP(zsGY_pU%g7WT9|plGOsG@C_jLYp0bSd-jnx4%}U%MAx_L;x~6AH#SY zOR2?CN6`ek?7cDcmbdlu_N*CO8FcjmGZVKJS*Y44vlp$Jrgct(?akqSe~c&oP%fK| zn_8lY+eiXtK;w8?ssir3m+k~%G4Rm1oBMjcZ<-~+W4`X~`Y-9_#Q6n6t=|BXp84KJ zoT8UjjIn3qjmW?eznCPXJAN*VD3PEn{C>*hoP4tiw~W3}hT%KeQQqNU&0_lngyUPD z;fC^aEryR1HgE!_&E^QmI!J|O56Xn?bS>g zU~GHWP%;oJGlghdQ#X2;wnoj-hs%0$WD1)`y!;|}24B6Dp;~-p@lE{MzY~H~h5v5| zTtybZIf>9_d;o~AH@n>bC&P7ii2nmhdk9SN0TTv3UwrZ~=fYz2|3j25{!i%b3f1Nk zuz`>}JyYXK=k$s&rxY?}#eZ7#lTXFkiNDcRU}uphXPYnDAmkF5lrQi!YXybo98`zF zx~ge_*KbGzPz-xZ0u=?<0$MepA1E|VY}EMEk9p$}g3j`vQUw0EJONHYDSI|*2yyT@ zuw82qbEj_=vId|?g(v?m`O_S-+cia_WE8XR3mh~4+8Ipw^P-{Di}|xta{|BCxb6Fq z&Vve|{hv1OgH%8MFTj%N`RY^OvqS9x7$XQYT=Q=Opi2J-K4#gc&`)RqpY#4R%t*%Z z@swr)zv`|54|k|B1UQ@S&hFE+mWOwy;8=gNa+%TeKW9f%znmqK2e2ofK7G0llh&S- z$gz7)z1Y9()!4auB{4q!8WnBPA|vxGaLq0LAEpRVk)2ce(x9|g0)vvb4*k&qnmu-3 z`mP1!B+!ezFD`x{6)d3(*krh6WHjHJ3;A_`%&V5>JORFgpGP|@Auo@sFPYc8qoZRi zxDM1N_HwNM{#r07?WF+QO5!4yj@|7y;c+KJkM93!i?{;0st`Aq1@={+^K=7(elp)j zMouM!gAOZOD3w)udI7|yi(w_P+@xlY6)b78~KfVl{huP$gl#~23n0ML1PA;5x@MB1&u1Q-fQ=IOu8<(of`3(i2z7?!>fnD z0q%F(UcQj=x$2hfa<7K*V6N0!WNAw&*V^eOQr6&-b&<{#@Zs0L+Uu5e`tah_1^ zN50>e!XL#3_Ia8Ue0-btMN9ETDR=nkr-tPvmr`5_!hYoggd^d}#k~PE!oC0-mD`_Q zV}H-PNb?3eebQnWob{2qA)vTGPP|-;u#_!Sp6FMbwBPt*vWFQ*>oz^5nyz+j_SqWO zp0S*ttH%KXXWP{bT%xd!+cfO-&0Hu(Ypghoo%##lc}e;3LdyH~+3oD3r^BbJuMYH| zfv>GPlJu#`(=V&AdQK$d2jM)!Z?K7!C>Y;_d#Es0v zbph=#J{bCQtP+_Ut`3kRcfHpHdDy;-?%v9WUtehhhOP^LRdA~(fkuB???i-|%{OgI_uqpq?#A_4RprVrI`7n%iN@bPlPu8#W?d2WL4i#OTW1nQji zQzB5bNqh_g8Zo5?0-!w=r94l1h;f5H)azMesizXD)$kc0f$j(PD)*!y>CXCZR^xvE zP@AZ<(7UglEo6UpBnA1n)M)l(BuP3gnP0De(g^E3s;iUBOOu&=$p|ouHMmglfFkm- zSjE2g%OH_de!Ks9Nu-#?mvXk}xTIM6dpf%;@vOc6K=OR*;EfwM1h&jzwYjtA^X6~g z$xw2>9wwUIKbFt}n0%fO)Qmqi?n0e(S;UAEFXBFb*7o3}!#Dj35`daFYXk7u5F8um zP2k3i)!CSpnVQzU&Ynl@r8ut;c{l<1qJ#c|>I}Vl+ri1Nj*gX;K5uft_wV_FD`R{D zs0F>XNx^=%<-isbfve8?m9gZxre~skoSaVQ4&C>^e2_Z4VlHO`AgEdL3#;cq4Nv)u z9=I2xA5~T5r~|g@Gtc2>^)J9(v2EU1;Q6iz0A<}|v$IO>ulA=V0&{DbP9T7HYB^KV z@_N-x4{02FV;UHHH-FIQRNkK=6CGADk{T<_j{7h5jRE zo7H73;z08@?7utGA^@0(l0yRb0w^GVV_5tD3eFY+?-UaceaLI^X(m)SuhB3YK!99# zUVtJ;GNsez{E@C|lS*YNJ}lYVYosF*C$tnjZ01%waHed4`C$3(b|1UM{H$wi#9QbB z%`nN?)bd^~?a^dWcZ$#pbB>m^*!R@_(K7hsGR9Fc_F-F)?XjpoqVmiZG%+F4(_VQzmXpFYQoIqf~|jM7_+M8GCgF9|w4Q#_Sj7!%F1 zaP(=)2&0t@O$Y&0)p3c9;DA{hK?@F)v?l3t)?rH$t6p$=d$={^>bKQz#L! z_0O?*F`_S;SOEfy_U;J`er{25IqQu=+=qAE!Sw~$XCRTK zuL437k1oaEI^!43U$NXLQfDT&arOQYcJOkrDjZCIhwwr5%|}_L&b`#7xQF`D*9f=x z>!nt-vvYGY^Uo!qYze2is{qiHiauae8fR-#UW6p@-0~b)fD%dQ)>+X5I{qh4I_A+b zUr8Lge&=l5Aka5*`QW<=u&Kh#KPL4gNjr-nFf8DQewd80T>45PBH_&93j!I@0#v}M zR1_U2@Yam&TU8!;QXkqAdtgbk_!$_8MK4k{3_gAKtgphNc~w2n{_=c%X!9}Cy7%8K zPni66aG1$QRine1g@8Uq%$tu!idjBMybH|QC^_EPiOu}a#uIFJKr_tuK z(B`YB)&-$tDf?KUwApA$-JQ}KnX+F5I>OC05@(>M)3`e~tAyK?Ua*i=)fm>;VS0~& zscudjGdUeZI9;i+t=!*^;#A949W|5B z>G&-8D1jY|t#_H{n-7}fOK}=c@RwhAZ^QVWD(U81{)%Slp%x+(o6?p z@&MVl^Uzl*jmQxBCoJN{!UWtl!_F!u?-h{ZrCY0dy)CWnWOA0V;|u40J`gcxIwlEs8hR9}SrEbeYR@>TiQz{UhcODv8Q&b%|z{qP-{q$!V4VU%K zLC43J=+iQ@oQ)eigu2~>0AP%v7oi}`vv_>4MTk8MMPn4STq0Xkm^a#X#$yXSe+4<3 zDtDe-CWXX!2lFYLTFs9=DSPta%B2Zo>~*cO#gCkWtg#YQK7PS%z9tH%)6B$@Zs0 zx_EHx+{C_wW3ZMpXP(m#WwSk*U1xitT>--;GDVC*D<| z)%cVD{d=KH`dGCO@yc2Kl+0%`=H|Wr+uEen5BfphpiDotTuvI_^o4EOTXmr&(6(>P zPWRiBz`ooE4}cQoOSxsUwsx+ZpaH*8J*G7D`t|CUe_oN`dQo`YnxMK1Foc)>JaeT* zSrK3yo+pt2rnWzVg0jG;MAt9drYBCL69t7r839_Z1OW8%I>Jin@8g{7btOE!sX{M^sxP}IQ*8w*R~q92RXhYL}?pAE`3 z{j9C6{fG&7Re(5B1HinRet`hd`#I@8#Rc4&L^i4FfwKrT+fPe)Nx+0D6rCoN)bZhp zTH$8~?t8=g3wb&A%|~N*vuEqwlipsuVyf0uk?Gb0tN~7aa6hlV8 zm<0w&B|xGgnU2eqmQClDOx*)a;-Iyg1gA$%)^5iVaet+Amwpe?;JG)=M6pUtvr3Q; zKNV~jlVUg8_*!H-!N(i++G76uhw%~vy)(JdA_2^Z7})~m{nV)X{_MsVhHCqPZFV|I z8&>xG^?>2sg;{s?fxm0#6J#2_d5qz)B%k8~8z%N&hZUrvq0D>k3oSPoS)7*d&;S#y zOxbspPUt=wJ%j;~eS3J;%6rCih09wXKawTtaVkB*Wk!`%yWib}+4CWt)A00;Ut34* z?d=N#VmGCMf;vX)037JGrjB3SIH91l#bwmhyZT7KkK&QRyp7fK9W*M^FS)QREIUOw z;uoHg&;`>jY}@mFi|qj{+-P#($U>`OU(txaQ{1Cn{G?|dJhs#jdIzBS_YIrfry5>( ztqluK*Vw164j8GT#|j0mX=s`~T*v=j8zd0@)}5XEs_i83W#%Q{-$w>@r-5H@la9)C zi}Thbz&XfA1x@?-*#gyL@A)EM{#k4=XX?aMuPOJWoeOMU%jn!Z+>eBh%_P50>)VY-q*%WxfiKd(L5YUX*t2&MKY~(Yg*Vj7n*2gI?mVbhD~f1k??f1b~StyO*#LLfJ=RB z89H6j_G*={aW%Gi>%rHt$6Iu$P&2o-)z`#z#7L`NsbwHpi%3kP5?O|QGDLgNS`d0U zYffqh4wRlDSNnQ6s&b>QvI>zGPM>E;xN(OMk$U`^?6pXO(=U}!`p)_qw_cYpS#I4; zf@s!Zv2g6UMs%dx-l~0WFG2oG@?%mf#sYpx!~68mB2~yt2!@)UB^e*kz_FOhJ_^Eu zjlBGRhsGZ1OZr&7FMqnkG94+qVs_lBXO_5fFgu&y`yV}9 z{!`c@tz2s>=QQE^_|@feR;nofg?%}9!Az@rccVh>2gd30{~~LXB5@d#seI0cvQ&W` zA$jLX0o@9hv3@r8c(gYX2n!Bgz!5E~9N;u7Cj{U-Y{gqIU^W(=4(L#`pq2Zv`aL$a7vAn?xz6vGq!O;1@B+xd(ks>u+=@jd7R>oV4oX%L?GC`@i4QXl+B}o0Cz&J<jz$q zTLc#U7*0~Yzk;V!F9Ks8aJ9gHhg(-U$0hvvf`H%+O+V@^CK^_sD2uk7a6B`!xL zWlcBjFq(F+09Dl6N+-KPo*Pc$fgOu^y&o@sF^}C_2x!jzLUhb3H$IGG=N?;~n*$!( zJ`%Nnne#%#?Da)q)ofQx8k;P5nz44&GHIt^$LhJ$-sQbHgwD*@_7}x3729lXlfNK$ zE8UwTB%qb4*f#Rad2!k21vVFCiyOUgEUdXg$IkVHCVnGmY6eY4K(MNu&uQzPVXo0u zu)Tm(Q0K$4fYIG)E!e#E#6xvD@W$7lX$Jjsq&FY<)O#$z%07Jd#|9p_rc*`gl&mW? zxyrPJNRv33-P#zNOmRmSn-LX`7L>Fc0fz=&p*Yx)$%AhPTuW04s9?I!K>hX-y+1j- zhUd%>OMUSxYQ}rhc|wKaQ(g;_cp5xA6O039{aU^i;^K7B-O(oFU%llCCbVGtpf^eR|!8U z`f}>~-Jh)zQ-&nlpET|Uj+nV8oM3Sp*RFxZG@I~|9E{~sB<}Az$1gG z@Okrasb>`5zSoniR!aBvXLA{A7w<X_ZJM-8C93G5ug%*P3e}w&m3NEoodqi9*Ukc|j)Uib$Qi)q9%5Ea6a1xY&ch zItClbJuO5VN`nq^@YPW_gqqw%(QrJ7lRwVOlJoAiWa4Z=ATNnIdGL{Q4?a3% z8X67!uB0@p%b|URt1C`1X$nm-q(u|zoQ~wjimg*PT*qGy=kB&?SGykeQ;$sleDbU4 zVl-oLW{wdnW9Mo%X1YW#8p0rvW?)Iy$3X?h zG8>ei0Q(0JD1Qtf;_;R~d~G>DmFP|!u6@gGC&=vlFvxRQ7dhP5SzYPVV{GDnET>vN zVn!Bl85=QVPjV1H?j5yRAuxv<-;2H^)%2^Hs&8oSZB@6EZ>**IK($|ayPVc{0`n(2zDu7k)GG-aiE(=n!(v+exDa%=Ol6H zAK+GvP*aCmbW1d++s>?X>x#lw*zki-&{?aRqJb=CMERI%kI;$3YILL?%TWxA++cTA z&@8Jv22G>E1~&Y?xbc^@nFRei3R2>?^ZmupNI{96IZ~xkoq(cUk_!!x1{weaMp9LinSyQ01lW z6I2izaj^KE1IUMHNF z5G!{#~?nXUsI1uspxrTPw#zZs=2W?Rw$!KI-sa{@#_+m-*E6D zamU92d!OcU(85w%+MCo^uwHtt?Ii4}aqDqMjo0ju?2TkwX}ux*778mH^xgX~6f%k1 z+BZF}p7VRJ2r%GL(KUiT3I!C5>{AZc{`{u9Ss0P9KR1{|N+VlUxR_ACymE7AZiF*@ zI2CCrXQWubIVF5ZeDj-bA*Xd)>o;t%%l>qY+-O6prwYpvMS3ScFY`E9&otCVM>W=P z#CFrLPK^r83UP*UKdO3U$N)JAL|ze=eFCBA=wuYaYeJlj<*iMEUIp0}*^vAsdWkFh z5sXLc5;dgF)2hvRjFfH?8~cjntg1#%T?B+Ss{%7N-5gqD+qX%;{`3cDL!H0h2#VUz z(*7zo-O)=5MlD0#bZx@$S8sa%9kfR1*1gq?D@8kZ_-AA(#obR8S}jpvJ)C%KxJ{l` z$?Vdq+DJ41R8!9c?*~@m6&E(KSD|mKXFu4fmP)Eus`YeATf^_jpF$6QgtYY z1iQ*f%-4!5)0MIwI2V4B@pyzU3x!1@`4st#%DG^uv0vR!H;T6BS70Rw+nF!ShV5cD zlevbnDGeEF{9U1rFTWwv>E-K*hh%>!xEP4LHoPrDs(f#g<7`@&Y-AO5yYI*mdj~rF zg5|p-Zm8o~^p*m&jUrE79^o5OxZJ@UK3FYr9d2_43S!ym;wp0*>t_jHeqgrH(Pija zm|||4vMPNE`OePN8haSD2x`+C$TFn9-QHg93pl)whx`}b4Gt%(*|Va-7|HHwmERoY za2w+&4j-Rx18}f{k}9;{zqIiF>ECpdyjiQBL+}aA_cS=iVCPiIzTztD$vgi*u%Koc zB6}-8WjQxosuu{49=)5S*@LL6_2x1yo2$E{*5d`vTpp3i>G>{r;{Y!HLl@jV0n#kn zNO41yWk^(2eqJ3=a}lvGM8prLk3sY(=#9#ye5@3Z`}1&j(X)lkH-%GnSPlOQ$_2SHaom`}5 zQg_VdO%1gS?CPFZaJro3(O!F{_p!?uU9}l@(~hboY>@|fJPiA;986WxaF}modeIxm z!y&yH%~uby{f^A`?b-!{q|80 zPj0xiebH~a=nmdF|C~eD^}*G+n0=RMyzA`Lcnvl()ZLy(&(~?9`ffN&>|wr&;dpVC z{PfG=Z{9dPQ==$DlUA}aCw4^prSG=ihhsO=oe#2Y$TbaE4XtHJoa)ALKvZPf5q54Q zM^WADudwRu{?eR^YKU(J);wUV@EUu{9&Z4-RR|HJKe0Q~@eCh=)GAW>s{L!O)-L+X zEvf#ZJK)*lC~MTT_X?YxkL7@=XAvNtPTvgOc&T2Ndf=|AQIKuPIPBaWtJ@{4LrI*R z<-4;~O_lZLVC90AHp1gN3!Z|hgT0Mj&MpITLs=;=b;!*4XMvAtlGo8pamTI=b*q42 zMAEhZW(_8~rAl#u#))lfrna6vOg7%A($6(>riila2BMUWMwG2@bSG7CsQAjnL7#;QmD1Tk{!S9M>Fzd_VL4?I)vHn3lxDQD!9Dd#Mme{Q;V=HWqfWcMllMHM6hVQ|fhFzJXBr&v&} z%76_0<3PR{Wf&+4sj|P zK6M!wWM5lfHY_+640zeUua1N32Bj!IrjB1CrtfdXY3G((LY*>@FR(gsO%5hihDnaz zKC&BycJn8H)2%)NXqnj$G`4rR&`&}{WC9uQmefh38A^Ex=zXIMJ~=Wh4uo2!p@BEk z-EdR2LI(Aq?(D$u6YE(WO8uG5M}?x-S%B?rBKMr~A}J)k%HR2d-it2BIKKF0Ms=FJpa_f|GrFlw*H_g49#R)uRM1}Y(q z7{lMrUGWmQVIX`ublB-y{uWm)_IvF0W}l4*^0CbP^0CA|0PLu+NEA@vUnR$UIPf;` z|63PWhhHD100$GE9YUW2!rfk+LTVUX+D04taTgLo^pX(Q=`n5!As;U^c)s^Z9=?>~IB3FmO9 z{4GbG6W#VnEks<(w$z=J;5rG!tMn+$Tu~~E&%%RfEs6|p3}r}kl@8*5W?iyvTvn22 zUp{1|cYX%L-(x>StKgduPK66}GPa1#5DEwbzfn-|M=73SUaR5#taY1FjuMt4DFy|W zCsGsUM?rcsv*T15wP0;JFQ@Pd>cUWoI?AuZi2y4I(TzPp+dDHSHc+)j<_7&XqH8*l zb&hN;@|{_Re+*^vnUr38h?s;+gW_y3K<$Bn_IW-65-OXyQvh8WDz zc1=m%q1N_s&#O#TW8} zS$7#2LY{o+oPjyo*oy}rqwUK}mZ>XS?u)aE)puu{MpjsWXY-UZ-8S?aGu^fvhiJ*{ zk6Ny=%n6#o?`Yj#Y}3jOhRy|@tQsW^MjL^5#ucBdV~$pls2T60pZPjd$vyNu+V=yr z0r*nIp^oZg(H&kFuWL0h^JalFG&Vf@ATuQp!_0zPPYpwR=Y30*_{Apis-Ok0Y*p6a zJoi1Nc56<2V)5#sFr^mREjpzxx3ix???L%_(k>BQh`HYb-2S#{dT3zUp+(CPSN^i6q#5&{L?fT(bb3(sTE3@ho1t*|8h z5(^#piCeMwa_pzrs+ta>^rBIv8++N`QAdv%8}u$Dw+{WmR0^wUr4da*Nvn=)qA3i- z_=%ulCDo7b+)-3T;4=&jpW#JSPDrv|f8zwWP_1&;|i)O#++Tl(c2X=3?-?-;d4N%D& zJku6`u|~TkXx@bVqXNBtq&FfbT*oR=mvpOy(a6G%^Z*<78+BeZw4yd{Bh__w<&{r! zMVXdx>mS1rjIovb5qLOZUX)$9Y8z=`|1DWtZM@0`f@z+W@Cr)Frh^(Hc)!iW89+id zmWew_ItgY8*r3g(m zkQV$NHRHC!&+qO(z?`#EPg2F54V$$bM7#^L`{|)K)C8w~M|_r8v21p0^>>4DDDIXc z8cVE?jO$G5of^ddy1lvP8c~caht8MXt!&hvmEOQAlGKk^4U%b> zHtX0<3E#Eu;MSIVbd2|3tPPa>M7%x#)18tMjruUA-8uzrAQ?qpn;LT^-eYo>j@fy@KpQ z2{5=jgWK80DM|>1&QEVJ38+6DF-AF>z{mnP?DRTbpCFn0XqEvp!NQcjbPd$ev6lf9c1>suS=1ZA1n zdMXg~u-vq+bPva+b1U&{EN6GjNqaYa5dJkZ6}cNx@90tB_r}QaL9x9EH5FC8@)(OB zdiu9z2;R}XO>e8cAk?5P{pdGVWy){z(l~s!m$}&~^Bj9F23ub84U z_T5o37|woNC<~e4)SyeAgj$$&$FgmcNfUf0Elt?ejxeA?@VzfGoR1oJYS3VMzV^?s7fe*J`Iv-KMdGix$a3qb^DTD$V z?rmn?@2eRT_69ThNLE8-No47ZGExuePkbBb2xiHg!CzU~hg2%Al_#bp(evocURTSA zTth+?K#UtCE*>A2hCv}-{iY|s+)4H=Lgr^uZ>HfgI#&mQa zlSQ+F`r71MWu4R%PgkYEEKw4^{LV0!iJXVH8^D~6xA`q+<0wehaSgt>M?@fBa#=?G zOeyk~jcq)~ti?qedr0~+q3+^3owqy?=6=w)_=C4`6*55#pQN&`SDmi<<=tSWXV6Bks8@J2u{qNJ1cYOzL`Sakq8B2yhQ0VUYdX?#OLI{|OiYlSE z*THjNks7479&BT4o7`%29#k=2<#E%-n(Lj7W@NPDVsb2l_7MX+dy-`tkm;TZf4mWF z>+z6N59D!gjNsqh@t@e5PKj{k%fjFDOAqGG}M+{CYJ)VKG@z&Os*|d=Ch-0b;MUo+v3zjh^4h z4Wb)A0hv}qQ?!66-c{LapcADtjpLg8BR;TlEarcci*mhq@xlx5QqbAer4|rSe4$Zh z=;pHrPbfTAKSg_MWJwPXPnBSOX9nIm`ha#&tKkBh>ez|%6&^yQOyEw1Q$*-pDhS_s z1VqEOWtLO@WKg#s3><#S1k5N40$G0f5OKhq^x^&cP9_=9xggikUsP{QVS&wLs}dJA ziOZnFb`m$J;0r+w1pg=uGy`C{2DF`jEB{Rhz*$Dm*>d^8KN}mc_TTRDU+Ut+p8s`{ ze`4bQ+b(BE2A%Iedtb3nJ^N4M!D8E&|5xKYllq)(^Pf0>VC^i5=w~^gdxC>NC%ZtS zSvK^KSkxnf?=N^yXCL|MQ~$?f1W*{l5_ From c8028c45423cd17647c09911fc17fd24c1337103 Mon Sep 17 00:00:00 2001 From: sohey Date: Mon, 3 Aug 2026 16:08:29 +0200 Subject: [PATCH 3/5] updated b20 docs --- .../beryl/b20/specification/concepts/policies-and-scopes.mdx | 2 +- .../b20/specification/concepts/roles-and-access-control.mdx | 4 ++-- .../specification/concepts/variants-asset-vs-stablecoin.mdx | 4 ++-- .../specs/upgrades/beryl/b20/specification/index.mdx | 4 ++-- .../b20/specification/reference/errors-and-events-index.mdx | 3 --- .../reference/interfaces/IActivationRegistry.mdx | 3 --- .../reference/interfaces/IActivationRegistry/activate.mdx | 3 --- .../reference/interfaces/IActivationRegistry/admin.mdx | 3 --- .../interfaces/IActivationRegistry/checkActivated.mdx | 3 --- .../reference/interfaces/IActivationRegistry/deactivate.mdx | 3 --- .../reference/interfaces/IActivationRegistry/isActivated.mdx | 3 --- .../beryl/b20/specification/reference/interfaces/IB20.mdx | 3 --- .../reference/interfaces/IB20/BURN_BLOCKED_ROLE.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/BURN_ROLE.mdx | 3 --- .../reference/interfaces/IB20/DEFAULT_ADMIN_ROLE.mdx | 3 --- .../reference/interfaces/IB20/DOMAIN_SEPARATOR.mdx | 3 --- .../specification/reference/interfaces/IB20/METADATA_ROLE.mdx | 3 --- .../reference/interfaces/IB20/MINT_RECEIVER_POLICY.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/MINT_ROLE.mdx | 3 --- .../specification/reference/interfaces/IB20/PAUSE_ROLE.mdx | 3 --- .../reference/interfaces/IB20/SEIZE_HOLDER_POLICY.mdx | 3 --- .../specification/reference/interfaces/IB20/SEIZE_ROLE.mdx | 3 --- .../reference/interfaces/IB20/TRANSFER_EXECUTOR_POLICY.mdx | 3 --- .../reference/interfaces/IB20/TRANSFER_RECEIVER_POLICY.mdx | 3 --- .../reference/interfaces/IB20/TRANSFER_SENDER_POLICY.mdx | 3 --- .../specification/reference/interfaces/IB20/UNPAUSE_ROLE.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/allowance.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/approve.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/balanceOf.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/burn.mdx | 3 --- .../specification/reference/interfaces/IB20/burnWithMemo.mdx | 3 --- .../specification/reference/interfaces/IB20/contractURI.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/decimals.mdx | 3 --- .../specification/reference/interfaces/IB20/eip712Domain.mdx | 3 --- .../specification/reference/interfaces/IB20/getRoleAdmin.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/grantRole.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/hasRole.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/isPaused.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/mint.mdx | 3 --- .../specification/reference/interfaces/IB20/mintWithMemo.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/name.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/nonces.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/pause.mdx | 3 --- .../reference/interfaces/IB20/pausedFeatures.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/permit.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/policyId.mdx | 3 --- .../reference/interfaces/IB20/renounceLastAdmin.mdx | 3 --- .../specification/reference/interfaces/IB20/renounceRole.mdx | 3 --- .../specification/reference/interfaces/IB20/revokeRole.mdx | 3 --- .../specification/reference/interfaces/IB20/seizeWithMemo.mdx | 3 --- .../specification/reference/interfaces/IB20/setRoleAdmin.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/supplyCap.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/symbol.mdx | 3 --- .../specification/reference/interfaces/IB20/totalSupply.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/transfer.mdx | 3 --- .../specification/reference/interfaces/IB20/transferFrom.mdx | 3 --- .../reference/interfaces/IB20/transferFromWithMemo.mdx | 3 --- .../reference/interfaces/IB20/transferWithMemo.mdx | 3 --- .../b20/specification/reference/interfaces/IB20/unpause.mdx | 3 --- .../reference/interfaces/IB20/updateContractURI.mdx | 3 --- .../specification/reference/interfaces/IB20/updateName.mdx | 3 --- .../specification/reference/interfaces/IB20/updatePolicy.mdx | 3 --- .../reference/interfaces/IB20/updateSupplyCap.mdx | 3 --- .../specification/reference/interfaces/IB20/updateSymbol.mdx | 3 --- .../b20/specification/reference/interfaces/IB20Asset.mdx | 3 --- .../reference/interfaces/IB20Asset/OPERATOR_ROLE.mdx | 3 --- .../reference/interfaces/IB20Asset/WAD_PRECISION.mdx | 3 --- .../specification/reference/interfaces/IB20Asset/announce.mdx | 3 --- .../reference/interfaces/IB20Asset/batchMint.mdx | 3 --- .../interfaces/IB20Asset/cancelScheduledMultiplier.mdx | 3 --- .../reference/interfaces/IB20Asset/extraMetadata.mdx | 3 --- .../reference/interfaces/IB20Asset/isAnnouncementIdUsed.mdx | 3 --- .../reference/interfaces/IB20Asset/multiplier.mdx | 3 --- .../reference/interfaces/IB20Asset/scaledBalanceOf.mdx | 3 --- .../reference/interfaces/IB20Asset/setUIMultiplier.mdx | 3 --- .../reference/interfaces/IB20Asset/toRawBalance.mdx | 3 --- .../reference/interfaces/IB20Asset/toScaledBalance.mdx | 3 --- .../reference/interfaces/IB20Asset/updateExtraMetadata.mdx | 3 --- .../reference/interfaces/IB20Asset/updateMultiplier.mdx | 3 --- .../b20/specification/reference/interfaces/IB20Factory.mdx | 3 --- .../reference/interfaces/IB20Factory/createB20.mdx | 3 --- .../reference/interfaces/IB20Factory/getB20Address.mdx | 3 --- .../specification/reference/interfaces/IB20Factory/isB20.mdx | 3 --- .../reference/interfaces/IB20Factory/isB20Initialized.mdx | 3 --- .../b20/specification/reference/interfaces/IB20Stablecoin.mdx | 3 --- .../reference/interfaces/IB20Stablecoin/currency.mdx | 3 --- .../specification/reference/interfaces/IPolicyRegistry.mdx | 3 --- .../interfaces/IPolicyRegistry/compositePolicyChildIds.mdx | 3 --- .../interfaces/IPolicyRegistry/createCompositePolicy.mdx | 3 --- .../reference/interfaces/IPolicyRegistry/createPolicy.mdx | 3 --- .../interfaces/IPolicyRegistry/createPolicyWithAccounts.mdx | 3 --- .../interfaces/IPolicyRegistry/finalizeUpdateAdmin.mdx | 3 --- .../reference/interfaces/IPolicyRegistry/isAuthorized.mdx | 3 --- .../interfaces/IPolicyRegistry/pendingPolicyAdmin.mdx | 3 --- .../reference/interfaces/IPolicyRegistry/policyAdmin.mdx | 3 --- .../reference/interfaces/IPolicyRegistry/policyExists.mdx | 3 --- .../reference/interfaces/IPolicyRegistry/renounceAdmin.mdx | 3 --- .../reference/interfaces/IPolicyRegistry/stageUpdateAdmin.mdx | 3 --- .../reference/interfaces/IPolicyRegistry/updateAllowlist.mdx | 3 --- .../reference/interfaces/IPolicyRegistry/updateBlocklist.mdx | 3 --- .../reference/interfaces/IPolicyRegistry/updateComposite.mdx | 3 --- 101 files changed, 7 insertions(+), 298 deletions(-) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes.mdx index 0fb26fe9d..ab826e970 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes.mdx @@ -3,7 +3,7 @@ title: "Policies & scopes" description: "Learn how B20 policy scopes point to PolicyRegistry policies and gate transfers, mints, and seizures." --- -A B20 token does **not** hold a list of policy IDs. It has fixed policy scopes. Each scope stores exactly one `uint64` pointer into the singleton PolicyRegistry. +A B20 token chooses policies by scope. Each scope stores one `uint64` policy ID that points to a policy in the singleton PolicyRegistry. The token only checks the policy assigned to the relevant scope. ![B20 policies and scopes diagram: fixed token policy scopes store uint64 pointers to PolicyRegistry policies, and gated operations call isAuthorized before continuing or reverting.](/images/b20/b20-policies-and-scopes.png) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control.mdx index c8114d294..32f7110ab 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control.mdx @@ -3,7 +3,7 @@ title: "Roles & access control" description: "Understand B20 roles, access-control gates, user-defined roles, and irreversible admin renunciation." --- -B20 extends the OpenZeppelin `AccessControl` model with a fixed base surface. User-defined roles can exist, but B20 only enforces the built-in roles listed here. +B20 is an ERC-20 superset with built-in role-based access control. Its role API uses familiar admin, grant, revoke, and renounce patterns, but B20 only enforces the built-in roles listed here. ## Base roles @@ -25,7 +25,7 @@ User-defined roles have no built-in enforcement. You can create them with `setRo ## Admin renunciation -B20 intentionally diverges from the default OpenZeppelin last-admin behavior. The last `DEFAULT_ADMIN_ROLE` holder cannot renounce or be revoked through normal role methods; those calls revert with `LastAdminCannotRenounce`. +B20 has a specific last-admin rule. The last `DEFAULT_ADMIN_ROLE` holder cannot renounce or be revoked through normal role methods; those calls revert with `LastAdminCannotRenounce`. Use `renounceLastAdmin()` to permanently move the token to an admin-less state. A token can also launch admin-less by passing `initialAdmin == address(0)` at creation. diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin.mdx index f1e8d6d49..0a9cf868f 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin.mdx @@ -25,7 +25,7 @@ B20 has two variants. Both share the base ERC-20-compatible B20 surface, roles, Asset tokens expose a WAD-precision multiplier for scaled UI balances. Raw balances remain unchanged; scaled balances are derived at read time. -Do not assume `balanceOf(account)` and `scaledBalanceOf(account)` are the same display unit. Integrations that show asset balances must decide whether they use raw ERC-20 balances or the scaled UI view. +For Asset tokens, `balanceOf(account)` returns the raw ERC-20 balance. `scaledBalanceOf(account)` returns the multiplier-adjusted display balance. Choose one view for your integration and label it clearly. Routine corporate actions should use scheduled multiplier updates when possible. Instant `updateMultiplier` is an emergency override. @@ -49,7 +49,7 @@ Asset tokens can store issuer-defined string key/value metadata. Setting an empt Stablecoin tokens expose `currency()`, set once at creation. The code must contain uppercase `A`-`Z` characters only. -The currency code is self-declared and not verified against any external registry. +B20 validates the currency code format, not the issuer's claim. A token can set `currency()` to `USD`, but B20 does not verify reserves, legal status, or registration with an external currency registry. diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/index.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/index.mdx index 1107e9b2c..8e7b9b530 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/index.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/index.mdx @@ -17,7 +17,7 @@ B20-specific methods extend the standard without changing the ERC-20 surface. ## Roles Model -B20 uses an OpenZeppelin-style access-control model with fixed built-in roles. +B20 includes role-based access control with fixed built-in roles. | Role | Gates | |---|---| @@ -205,7 +205,7 @@ The multiplier is WAD-precision and scales UI balance reads while raw balances r ### Stablecoin -Stablecoin tokens add `currency()`, set once at creation. The value must contain uppercase `A`-`Z` characters only and is self-declared, not externally verified. +Stablecoin tokens add `currency()`, set once at creation. The value must contain uppercase `A`-`Z` characters only. B20 validates the code format, not the issuer claim, reserves, legal status, or external registration. ## Precompile addresses diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/errors-and-events-index.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/errors-and-events-index.mdx index 4ed912779..a7952af39 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/errors-and-events-index.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/errors-and-events-index.mdx @@ -3,9 +3,6 @@ title: "Errors & events index" description: "Reverse lookup B20 errors and events by selector or topic." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Error selectors are 4 bytes; event topics are 32 bytes. - ## Index diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry.mdx index 0eebc1578..3b9d07084 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry.mdx @@ -3,9 +3,6 @@ title: "IActivationRegistry reference" description: "Generated B20 reference for IActivationRegistry functions, events, and errors." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Function child pages include selectors, access notes, policy notes, and examples. - ## Functions diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/activate.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/activate.mdx index c91903625..cdf739353 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/activate.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/activate.mdx @@ -3,9 +3,6 @@ title: "IActivationRegistry.activate" description: "Generated B20 reference for activate(bytes32)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/architecture-and-precompiles) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/admin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/admin.mdx index c934f9a21..30bd3957c 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/admin.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/admin.mdx @@ -3,9 +3,6 @@ title: "IActivationRegistry.admin" description: "Generated B20 reference for admin()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/architecture-and-precompiles) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/checkActivated.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/checkActivated.mdx index fe27a5040..22f2d1e62 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/checkActivated.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/checkActivated.mdx @@ -3,9 +3,6 @@ title: "IActivationRegistry.checkActivated" description: "Generated B20 reference for checkActivated(bytes32)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/architecture-and-precompiles) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/deactivate.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/deactivate.mdx index 95fe33048..acfe20f09 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/deactivate.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/deactivate.mdx @@ -3,9 +3,6 @@ title: "IActivationRegistry.deactivate" description: "Generated B20 reference for deactivate(bytes32)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/architecture-and-precompiles) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/isActivated.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/isActivated.mdx index 93bca59cd..744d1bdf9 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/isActivated.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IActivationRegistry/isActivated.mdx @@ -3,9 +3,6 @@ title: "IActivationRegistry.isActivated" description: "Generated B20 reference for isActivated(bytes32)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/architecture-and-precompiles) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20.mdx index a0f9c4236..6f68208a5 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20.mdx @@ -3,9 +3,6 @@ title: "IB20 reference" description: "Generated B20 reference for IB20 functions, events, and errors." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Function child pages include selectors, access notes, policy notes, and examples. - ## Functions diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_BLOCKED_ROLE.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_BLOCKED_ROLE.mdx index 95acfcd94..e770aa144 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_BLOCKED_ROLE.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_BLOCKED_ROLE.mdx @@ -3,9 +3,6 @@ title: "IB20.BURN_BLOCKED_ROLE" description: "Generated B20 reference for BURN_BLOCKED_ROLE()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_ROLE.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_ROLE.mdx index a762945fe..d1c844a38 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_ROLE.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/BURN_ROLE.mdx @@ -3,9 +3,6 @@ title: "IB20.BURN_ROLE" description: "Generated B20 reference for BURN_ROLE()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DEFAULT_ADMIN_ROLE.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DEFAULT_ADMIN_ROLE.mdx index 5d54290db..ee6ea7ca2 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DEFAULT_ADMIN_ROLE.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DEFAULT_ADMIN_ROLE.mdx @@ -3,9 +3,6 @@ title: "IB20.DEFAULT_ADMIN_ROLE" description: "Generated B20 reference for DEFAULT_ADMIN_ROLE()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DOMAIN_SEPARATOR.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DOMAIN_SEPARATOR.mdx index c8db8d499..79c2aac33 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DOMAIN_SEPARATOR.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/DOMAIN_SEPARATOR.mdx @@ -3,9 +3,6 @@ title: "IB20.DOMAIN_SEPARATOR" description: "Generated B20 reference for DOMAIN_SEPARATOR()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/METADATA_ROLE.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/METADATA_ROLE.mdx index 003d760b9..08343ae61 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/METADATA_ROLE.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/METADATA_ROLE.mdx @@ -3,9 +3,6 @@ title: "IB20.METADATA_ROLE" description: "Generated B20 reference for METADATA_ROLE()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_RECEIVER_POLICY.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_RECEIVER_POLICY.mdx index 7aaee9ec6..a15e2e8ec 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_RECEIVER_POLICY.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_RECEIVER_POLICY.mdx @@ -3,9 +3,6 @@ title: "IB20.MINT_RECEIVER_POLICY" description: "Generated B20 reference for MINT_RECEIVER_POLICY()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_ROLE.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_ROLE.mdx index 41daf7543..6943c0271 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_ROLE.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/MINT_ROLE.mdx @@ -3,9 +3,6 @@ title: "IB20.MINT_ROLE" description: "Generated B20 reference for MINT_ROLE()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/PAUSE_ROLE.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/PAUSE_ROLE.mdx index 289c83e59..20f5990d2 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/PAUSE_ROLE.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/PAUSE_ROLE.mdx @@ -3,9 +3,6 @@ title: "IB20.PAUSE_ROLE" description: "Generated B20 reference for PAUSE_ROLE()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_HOLDER_POLICY.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_HOLDER_POLICY.mdx index 68dcade05..907ee86fa 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_HOLDER_POLICY.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_HOLDER_POLICY.mdx @@ -3,9 +3,6 @@ title: "IB20.SEIZE_HOLDER_POLICY" description: "Generated B20 reference for SEIZE_HOLDER_POLICY()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_ROLE.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_ROLE.mdx index f3b2ab4a4..66174524c 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_ROLE.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/SEIZE_ROLE.mdx @@ -3,9 +3,6 @@ title: "IB20.SEIZE_ROLE" description: "Generated B20 reference for SEIZE_ROLE()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_EXECUTOR_POLICY.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_EXECUTOR_POLICY.mdx index cbd902c44..07e16384e 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_EXECUTOR_POLICY.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_EXECUTOR_POLICY.mdx @@ -3,9 +3,6 @@ title: "IB20.TRANSFER_EXECUTOR_POLICY" description: "Generated B20 reference for TRANSFER_EXECUTOR_POLICY()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_RECEIVER_POLICY.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_RECEIVER_POLICY.mdx index a092e4d6e..f1d559430 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_RECEIVER_POLICY.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_RECEIVER_POLICY.mdx @@ -3,9 +3,6 @@ title: "IB20.TRANSFER_RECEIVER_POLICY" description: "Generated B20 reference for TRANSFER_RECEIVER_POLICY()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_SENDER_POLICY.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_SENDER_POLICY.mdx index 4ba79a254..c9d8c2df4 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_SENDER_POLICY.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/TRANSFER_SENDER_POLICY.mdx @@ -3,9 +3,6 @@ title: "IB20.TRANSFER_SENDER_POLICY" description: "Generated B20 reference for TRANSFER_SENDER_POLICY()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/UNPAUSE_ROLE.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/UNPAUSE_ROLE.mdx index 6a23d94c0..2bbd4fabb 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/UNPAUSE_ROLE.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/UNPAUSE_ROLE.mdx @@ -3,9 +3,6 @@ title: "IB20.UNPAUSE_ROLE" description: "Generated B20 reference for UNPAUSE_ROLE()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/allowance.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/allowance.mdx index 92fc6d807..1626fb545 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/allowance.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/allowance.mdx @@ -3,9 +3,6 @@ title: "IB20.allowance" description: "Generated B20 reference for allowance(address,address)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/approve.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/approve.mdx index c6e65b1dd..9af3a02e3 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/approve.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/approve.mdx @@ -3,9 +3,6 @@ title: "IB20.approve" description: "Generated B20 reference for approve(address,uint256)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/balanceOf.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/balanceOf.mdx index 6e6cc9f6a..0f831066f 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/balanceOf.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/balanceOf.mdx @@ -3,9 +3,6 @@ title: "IB20.balanceOf" description: "Generated B20 reference for balanceOf(address)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burn.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burn.mdx index 4327e2ba1..8a2e124c1 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burn.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burn.mdx @@ -3,9 +3,6 @@ title: "IB20.burn" description: "Generated B20 reference for burn(uint256)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burnWithMemo.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burnWithMemo.mdx index e559f722a..adfeecfaf 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burnWithMemo.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/burnWithMemo.mdx @@ -3,9 +3,6 @@ title: "IB20.burnWithMemo" description: "Generated B20 reference for burnWithMemo(uint256,bytes32)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/contractURI.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/contractURI.mdx index 1b8f36ae1..a8de4ce0c 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/contractURI.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/contractURI.mdx @@ -3,9 +3,6 @@ title: "IB20.contractURI" description: "Generated B20 reference for contractURI()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/decimals.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/decimals.mdx index b1a7adb07..498b048f5 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/decimals.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/decimals.mdx @@ -3,9 +3,6 @@ title: "IB20.decimals" description: "Generated B20 reference for decimals()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/eip712Domain.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/eip712Domain.mdx index 516084bcd..f303be13d 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/eip712Domain.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/eip712Domain.mdx @@ -3,9 +3,6 @@ title: "IB20.eip712Domain" description: "Generated B20 reference for eip712Domain()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/getRoleAdmin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/getRoleAdmin.mdx index f0b1619e0..d92413b4e 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/getRoleAdmin.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/getRoleAdmin.mdx @@ -3,9 +3,6 @@ title: "IB20.getRoleAdmin" description: "Generated B20 reference for getRoleAdmin(bytes32)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/grantRole.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/grantRole.mdx index 8d1559072..9a850c82b 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/grantRole.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/grantRole.mdx @@ -3,9 +3,6 @@ title: "IB20.grantRole" description: "Generated B20 reference for grantRole(bytes32,address)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/hasRole.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/hasRole.mdx index de27162ba..33b0adc02 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/hasRole.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/hasRole.mdx @@ -3,9 +3,6 @@ title: "IB20.hasRole" description: "Generated B20 reference for hasRole(bytes32,address)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/isPaused.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/isPaused.mdx index ce4e1cb21..4935b8ef7 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/isPaused.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/isPaused.mdx @@ -3,9 +3,6 @@ title: "IB20.isPaused" description: "Generated B20 reference for isPaused(PausableFeature)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mint.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mint.mdx index c181110c9..a4c59195b 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mint.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mint.mdx @@ -3,9 +3,6 @@ title: "IB20.mint" description: "Generated B20 reference for mint(address,uint256)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mintWithMemo.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mintWithMemo.mdx index 415e20897..84bd234e6 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mintWithMemo.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/mintWithMemo.mdx @@ -3,9 +3,6 @@ title: "IB20.mintWithMemo" description: "Generated B20 reference for mintWithMemo(address,uint256,bytes32)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/name.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/name.mdx index 6ae8d6aa1..7e86c70ad 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/name.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/name.mdx @@ -3,9 +3,6 @@ title: "IB20.name" description: "Generated B20 reference for name()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/nonces.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/nonces.mdx index d08cc643f..760cfd94a 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/nonces.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/nonces.mdx @@ -3,9 +3,6 @@ title: "IB20.nonces" description: "Generated B20 reference for nonces(address)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pause.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pause.mdx index ff2eff887..5f8a4584c 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pause.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pause.mdx @@ -3,9 +3,6 @@ title: "IB20.pause" description: "Generated B20 reference for pause(PausableFeature[])." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pausedFeatures.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pausedFeatures.mdx index 6c26a2300..bd704dc0b 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pausedFeatures.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/pausedFeatures.mdx @@ -3,9 +3,6 @@ title: "IB20.pausedFeatures" description: "Generated B20 reference for pausedFeatures()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/permit.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/permit.mdx index 3c6b21c1b..de0d4702a 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/permit.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/permit.mdx @@ -3,9 +3,6 @@ title: "IB20.permit" description: "Generated B20 reference for permit(address,address,uint256,uint256,uint8,bytes32,bytes32)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/policyId.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/policyId.mdx index acde7a691..1767844d4 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/policyId.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/policyId.mdx @@ -3,9 +3,6 @@ title: "IB20.policyId" description: "Generated B20 reference for policyId(bytes32)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceLastAdmin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceLastAdmin.mdx index 9b57cbaa7..df5a79848 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceLastAdmin.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceLastAdmin.mdx @@ -3,9 +3,6 @@ title: "IB20.renounceLastAdmin" description: "Generated B20 reference for renounceLastAdmin()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceRole.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceRole.mdx index b5e580e13..ac287ddff 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceRole.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/renounceRole.mdx @@ -3,9 +3,6 @@ title: "IB20.renounceRole" description: "Generated B20 reference for renounceRole(bytes32,address)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/revokeRole.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/revokeRole.mdx index 034eb9c80..b2d6e512b 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/revokeRole.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/revokeRole.mdx @@ -3,9 +3,6 @@ title: "IB20.revokeRole" description: "Generated B20 reference for revokeRole(bytes32,address)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/seizeWithMemo.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/seizeWithMemo.mdx index abd382420..4c6b439b9 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/seizeWithMemo.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/seizeWithMemo.mdx @@ -3,9 +3,6 @@ title: "IB20.seizeWithMemo" description: "Generated B20 reference for seizeWithMemo(address,address,uint256,bytes32)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/setRoleAdmin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/setRoleAdmin.mdx index 860a166c9..fdbf840c2 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/setRoleAdmin.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/setRoleAdmin.mdx @@ -3,9 +3,6 @@ title: "IB20.setRoleAdmin" description: "Generated B20 reference for setRoleAdmin(bytes32,bytes32)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/roles-and-access-control) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/supplyCap.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/supplyCap.mdx index 19ddd4868..028edc360 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/supplyCap.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/supplyCap.mdx @@ -3,9 +3,6 @@ title: "IB20.supplyCap" description: "Generated B20 reference for supplyCap()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/symbol.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/symbol.mdx index c42af872e..e1eb7a5ea 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/symbol.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/symbol.mdx @@ -3,9 +3,6 @@ title: "IB20.symbol" description: "Generated B20 reference for symbol()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/totalSupply.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/totalSupply.mdx index 15f69a2ea..916299ef2 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/totalSupply.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/totalSupply.mdx @@ -3,9 +3,6 @@ title: "IB20.totalSupply" description: "Generated B20 reference for totalSupply()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transfer.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transfer.mdx index b2fd671a1..f86ec477c 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transfer.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transfer.mdx @@ -3,9 +3,6 @@ title: "IB20.transfer" description: "Generated B20 reference for transfer(address,uint256)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFrom.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFrom.mdx index 711d33caf..8f2eec178 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFrom.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFrom.mdx @@ -3,9 +3,6 @@ title: "IB20.transferFrom" description: "Generated B20 reference for transferFrom(address,address,uint256)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFromWithMemo.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFromWithMemo.mdx index 30d2ee09f..d583f1819 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFromWithMemo.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferFromWithMemo.mdx @@ -3,9 +3,6 @@ title: "IB20.transferFromWithMemo" description: "Generated B20 reference for transferFromWithMemo(address,address,uint256,bytes32)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferWithMemo.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferWithMemo.mdx index e592e5f08..20b43bdd2 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferWithMemo.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/transferWithMemo.mdx @@ -3,9 +3,6 @@ title: "IB20.transferWithMemo" description: "Generated B20 reference for transferWithMemo(address,uint256,bytes32)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/unpause.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/unpause.mdx index de025d586..0461e8290 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/unpause.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/unpause.mdx @@ -3,9 +3,6 @@ title: "IB20.unpause" description: "Generated B20 reference for unpause(PausableFeature[])." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/token-lifecycle) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateContractURI.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateContractURI.mdx index 26bca6982..3be88f537 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateContractURI.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateContractURI.mdx @@ -3,9 +3,6 @@ title: "IB20.updateContractURI" description: "Generated B20 reference for updateContractURI(string)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateName.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateName.mdx index 6b3b3a2b5..b366061d1 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateName.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateName.mdx @@ -3,9 +3,6 @@ title: "IB20.updateName" description: "Generated B20 reference for updateName(string)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updatePolicy.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updatePolicy.mdx index 333d6a98c..78a6aa7db 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updatePolicy.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updatePolicy.mdx @@ -3,9 +3,6 @@ title: "IB20.updatePolicy" description: "Generated B20 reference for updatePolicy(bytes32,uint64)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSupplyCap.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSupplyCap.mdx index 7f48163a5..c17ad80e4 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSupplyCap.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSupplyCap.mdx @@ -3,9 +3,6 @@ title: "IB20.updateSupplyCap" description: "Generated B20 reference for updateSupplyCap(uint256)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSymbol.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSymbol.mdx index ae4eecba3..e1e97c013 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSymbol.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20/updateSymbol.mdx @@ -3,9 +3,6 @@ title: "IB20.updateSymbol" description: "Generated B20 reference for updateSymbol(string)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset.mdx index 3f2bd2f6d..48619ad65 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset.mdx @@ -3,9 +3,6 @@ title: "IB20Asset reference" description: "Generated B20 reference for IB20Asset functions, events, and errors." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Function child pages include selectors, access notes, policy notes, and examples. - ## Functions diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/OPERATOR_ROLE.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/OPERATOR_ROLE.mdx index fec489e0c..061ebfac6 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/OPERATOR_ROLE.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/OPERATOR_ROLE.mdx @@ -3,9 +3,6 @@ title: "IB20Asset.OPERATOR_ROLE" description: "Generated B20 reference for OPERATOR_ROLE()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/WAD_PRECISION.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/WAD_PRECISION.mdx index ef8b79dc5..fc7054487 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/WAD_PRECISION.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/WAD_PRECISION.mdx @@ -3,9 +3,6 @@ title: "IB20Asset.WAD_PRECISION" description: "Generated B20 reference for WAD_PRECISION()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/announce.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/announce.mdx index 4cde5a2df..b79d2f3ba 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/announce.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/announce.mdx @@ -3,9 +3,6 @@ title: "IB20Asset.announce" description: "Generated B20 reference for announce(bytes[],string,string,string)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/batchMint.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/batchMint.mdx index 39af8b60e..f1094d370 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/batchMint.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/batchMint.mdx @@ -3,9 +3,6 @@ title: "IB20Asset.batchMint" description: "Generated B20 reference for batchMint(address[],uint256[])." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/cancelScheduledMultiplier.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/cancelScheduledMultiplier.mdx index f154b7a78..0d0cb3783 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/cancelScheduledMultiplier.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/cancelScheduledMultiplier.mdx @@ -3,9 +3,6 @@ title: "IB20Asset.cancelScheduledMultiplier" description: "Generated B20 reference for cancelScheduledMultiplier()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/extraMetadata.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/extraMetadata.mdx index d500df3a3..d9f53be6a 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/extraMetadata.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/extraMetadata.mdx @@ -3,9 +3,6 @@ title: "IB20Asset.extraMetadata" description: "Generated B20 reference for extraMetadata(string)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/isAnnouncementIdUsed.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/isAnnouncementIdUsed.mdx index ae60fb89a..d1098def3 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/isAnnouncementIdUsed.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/isAnnouncementIdUsed.mdx @@ -3,9 +3,6 @@ title: "IB20Asset.isAnnouncementIdUsed" description: "Generated B20 reference for isAnnouncementIdUsed(string)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/multiplier.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/multiplier.mdx index 864e64468..c06874045 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/multiplier.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/multiplier.mdx @@ -3,9 +3,6 @@ title: "IB20Asset.multiplier" description: "Generated B20 reference for multiplier()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/scaledBalanceOf.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/scaledBalanceOf.mdx index bfb0214cd..e759f2c98 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/scaledBalanceOf.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/scaledBalanceOf.mdx @@ -3,9 +3,6 @@ title: "IB20Asset.scaledBalanceOf" description: "Generated B20 reference for scaledBalanceOf(address)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/setUIMultiplier.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/setUIMultiplier.mdx index b39f7db35..04d0211d6 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/setUIMultiplier.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/setUIMultiplier.mdx @@ -3,9 +3,6 @@ title: "IB20Asset.setUIMultiplier" description: "Generated B20 reference for setUIMultiplier(uint256,uint256)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toRawBalance.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toRawBalance.mdx index e40959b61..9ec22ab5f 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toRawBalance.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toRawBalance.mdx @@ -3,9 +3,6 @@ title: "IB20Asset.toRawBalance" description: "Generated B20 reference for toRawBalance(uint256)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toScaledBalance.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toScaledBalance.mdx index 1ca67005e..ce16e97db 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toScaledBalance.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/toScaledBalance.mdx @@ -3,9 +3,6 @@ title: "IB20Asset.toScaledBalance" description: "Generated B20 reference for toScaledBalance(uint256)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateExtraMetadata.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateExtraMetadata.mdx index 4b2650ae6..f0d094de4 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateExtraMetadata.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateExtraMetadata.mdx @@ -3,9 +3,6 @@ title: "IB20Asset.updateExtraMetadata" description: "Generated B20 reference for updateExtraMetadata(string,string)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateMultiplier.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateMultiplier.mdx index 9853df16b..89177a70c 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateMultiplier.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Asset/updateMultiplier.mdx @@ -3,9 +3,6 @@ title: "IB20Asset.updateMultiplier" description: "Generated B20 reference for updateMultiplier(uint256)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory.mdx index 4c9fe0854..5f7d4bf08 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory.mdx @@ -3,9 +3,6 @@ title: "IB20Factory reference" description: "Generated B20 reference for IB20Factory functions, events, and errors." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Function child pages include selectors, access notes, policy notes, and examples. - ## Functions diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/createB20.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/createB20.mdx index fe3ea7ed7..b0ca18557 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/createB20.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/createB20.mdx @@ -3,9 +3,6 @@ title: "IB20Factory.createB20" description: "Generated B20 reference for createB20(B20Variant,bytes32,bytes,bytes[])." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/implementation/deployment-and-initcalls-encoding) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/getB20Address.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/getB20Address.mdx index 517afeed9..7ace6dd39 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/getB20Address.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/getB20Address.mdx @@ -3,9 +3,6 @@ title: "IB20Factory.getB20Address" description: "Generated B20 reference for getB20Address(B20Variant,address,bytes32)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/implementation/deployment-and-initcalls-encoding) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20.mdx index a6b13de6a..a5ae4db18 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20.mdx @@ -3,9 +3,6 @@ title: "IB20Factory.isB20" description: "Generated B20 reference for isB20(address)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/implementation/deployment-and-initcalls-encoding) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20Initialized.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20Initialized.mdx index 7364b4da4..c6933533a 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20Initialized.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Factory/isB20Initialized.mdx @@ -3,9 +3,6 @@ title: "IB20Factory.isB20Initialized" description: "Generated B20 reference for isB20Initialized(address)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/implementation/deployment-and-initcalls-encoding) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin.mdx index c587e6ac3..e9d66398d 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin.mdx @@ -3,9 +3,6 @@ title: "IB20Stablecoin reference" description: "Generated B20 reference for IB20Stablecoin functions, events, and errors." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Function child pages include selectors, access notes, policy notes, and examples. - ## Functions diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin/currency.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin/currency.mdx index 7ddb33b44..d4b43cbad 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin/currency.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IB20Stablecoin/currency.mdx @@ -3,9 +3,6 @@ title: "IB20Stablecoin.currency" description: "Generated B20 reference for currency()." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry.mdx index dc40d85a7..ae4a363f0 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry.mdx @@ -3,9 +3,6 @@ title: "IPolicyRegistry reference" description: "Generated B20 reference for IPolicyRegistry functions, events, and errors." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Function child pages include selectors, access notes, policy notes, and examples. - ## Functions diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/compositePolicyChildIds.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/compositePolicyChildIds.mdx index 513607cb7..8b3707a6a 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/compositePolicyChildIds.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/compositePolicyChildIds.mdx @@ -3,9 +3,6 @@ title: "IPolicyRegistry.compositePolicyChildIds" description: "Generated B20 reference for compositePolicyChildIds(uint64)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createCompositePolicy.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createCompositePolicy.mdx index dab77614e..16f3da2db 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createCompositePolicy.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createCompositePolicy.mdx @@ -3,9 +3,6 @@ title: "IPolicyRegistry.createCompositePolicy" description: "Generated B20 reference for createCompositePolicy(address,PolicyType,uint64[])." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicy.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicy.mdx index 950e4f957..24f4ad072 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicy.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicy.mdx @@ -3,9 +3,6 @@ title: "IPolicyRegistry.createPolicy" description: "Generated B20 reference for createPolicy(address,PolicyType)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicyWithAccounts.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicyWithAccounts.mdx index 00d85293d..f32e9fbae 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicyWithAccounts.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/createPolicyWithAccounts.mdx @@ -3,9 +3,6 @@ title: "IPolicyRegistry.createPolicyWithAccounts" description: "Generated B20 reference for createPolicyWithAccounts(address,PolicyType,address[])." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/finalizeUpdateAdmin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/finalizeUpdateAdmin.mdx index 4e3065e05..35dde88e2 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/finalizeUpdateAdmin.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/finalizeUpdateAdmin.mdx @@ -3,9 +3,6 @@ title: "IPolicyRegistry.finalizeUpdateAdmin" description: "Generated B20 reference for finalizeUpdateAdmin(uint64)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/isAuthorized.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/isAuthorized.mdx index f843e04da..e2f58cc3e 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/isAuthorized.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/isAuthorized.mdx @@ -3,9 +3,6 @@ title: "IPolicyRegistry.isAuthorized" description: "Generated B20 reference for isAuthorized(uint64,address)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/pendingPolicyAdmin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/pendingPolicyAdmin.mdx index b2d5a23ce..3d2d31c38 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/pendingPolicyAdmin.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/pendingPolicyAdmin.mdx @@ -3,9 +3,6 @@ title: "IPolicyRegistry.pendingPolicyAdmin" description: "Generated B20 reference for pendingPolicyAdmin(uint64)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyAdmin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyAdmin.mdx index 72ad19d0d..4f1e13e41 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyAdmin.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyAdmin.mdx @@ -3,9 +3,6 @@ title: "IPolicyRegistry.policyAdmin" description: "Generated B20 reference for policyAdmin(uint64)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyExists.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyExists.mdx index e02a7aa6a..aa9df727c 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyExists.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/policyExists.mdx @@ -3,9 +3,6 @@ title: "IPolicyRegistry.policyExists" description: "Generated B20 reference for policyExists(uint64)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/renounceAdmin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/renounceAdmin.mdx index 7867c25ce..f6d453d0d 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/renounceAdmin.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/renounceAdmin.mdx @@ -3,9 +3,6 @@ title: "IPolicyRegistry.renounceAdmin" description: "Generated B20 reference for renounceAdmin(uint64)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/stageUpdateAdmin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/stageUpdateAdmin.mdx index 65fdee2e8..c2a257fb0 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/stageUpdateAdmin.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/stageUpdateAdmin.mdx @@ -3,9 +3,6 @@ title: "IPolicyRegistry.stageUpdateAdmin" description: "Generated B20 reference for stageUpdateAdmin(uint64,address)." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateAllowlist.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateAllowlist.mdx index e501991df..7a3ac068d 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateAllowlist.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateAllowlist.mdx @@ -3,9 +3,6 @@ title: "IPolicyRegistry.updateAllowlist" description: "Generated B20 reference for updateAllowlist(uint64,bool,address[])." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateBlocklist.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateBlocklist.mdx index f4d90a3fb..af43081d4 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateBlocklist.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateBlocklist.mdx @@ -3,9 +3,6 @@ title: "IPolicyRegistry.updateBlocklist" description: "Generated B20 reference for updateBlocklist(uint64,bool,address[])." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateComposite.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateComposite.mdx index c9a84961d..b5c05a646 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateComposite.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/reference/interfaces/IPolicyRegistry/updateComposite.mdx @@ -3,9 +3,6 @@ title: "IPolicyRegistry.updateComposite" description: "Generated B20 reference for updateComposite(uint64,uint64[])." --- - -Generated from base-std commit `68a7a35ebfb8a0a8deb328d9762b9eb9dff06ba3`. Do not edit this page by hand; update NatSpec or generator overrides instead. - [Related concept](/base-chain/specs/upgrades/beryl/b20/specification/concepts/policies-and-scopes) From 7bee2ab8610f608ef17ec3cb51bd08cfdd067907 Mon Sep 17 00:00:00 2001 From: sohey Date: Mon, 3 Aug 2026 16:18:18 +0200 Subject: [PATCH 4/5] updated b20 docs --- .../specs/upgrades/beryl/b20/specification/overview.mdx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/overview.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/overview.mdx index e698b3af2..608be1d94 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/overview.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/overview.mdx @@ -7,14 +7,6 @@ B20 is Base's native token standard: an ERC-20 superset implemented as Rust prec B20 adds issuer-grade controls at the chain level: policy-gated transfers and mints, role-based administration, granular pausing, supply caps, memos, ERC-2612 `permit`, and variant-specific features for assets and stablecoins. -```mermaid -flowchart LR - Factory[B20 Factory\n0xB20f...0000] -->|createB20| Token[B20 token\n0xB200... or 0xB201...] - Token -->|policyId(scope)| Policy[PolicyRegistry\n0x8453...0002] - Policy -->|writes gated by| Activation[ActivationRegistry\n0x8453...0001] - Factory -->|feature check| Activation -``` - ## Choose your path From 579d7afe4f4771db3d1f8b637ea0242eeca0321e Mon Sep 17 00:00:00 2001 From: sohey Date: Mon, 3 Aug 2026 20:34:04 +0200 Subject: [PATCH 5/5] updated wording in multiplier --- .../b20/specification/concepts/variants-asset-vs-stablecoin.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin.mdx b/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin.mdx index 0a9cf868f..63722dfaa 100644 --- a/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin.mdx +++ b/docs/base-chain/specs/upgrades/beryl/b20/specification/concepts/variants-asset-vs-stablecoin.mdx @@ -28,7 +28,7 @@ Asset tokens expose a WAD-precision multiplier for scaled UI balances. Raw balan For Asset tokens, `balanceOf(account)` returns the raw ERC-20 balance. `scaledBalanceOf(account)` returns the multiplier-adjusted display balance. Choose one view for your integration and label it clearly. -Routine corporate actions should use scheduled multiplier updates when possible. Instant `updateMultiplier` is an emergency override. +Routine multiplier changes should use scheduled updates when possible. Instant `updateMultiplier` is an emergency override. ### Announcements