Complete role-based access control reference for Stablecoin OFT and ERC20Plus with role definitions, function matrices, and recommended assignment strategies.
Complete role-based access control reference for Stablecoin OFT and ERC20Plus. All roles use AccessControl2StepUpgradeable with two-step admin transfer and keccak256 identifiers.
Pauser / Unpauser — A compromised pauser key can halt the system (disruptive, but funds remain safe). If that same key could also unpause, an attacker could undo a legitimate security pause. Keeping them separate means the security team can pause fast, and unpausing requires a different authorization path (typically a governance multisig).Fee config manager — A compromised FEE_CONFIG_MANAGER_ROLE can set high fee rates, but fee proceeds are pushed to the fee deposit address during _debit as part of the send path; the fee config manager cannot retarget that destination. Use a multisig for fee administration and monitor DefaultFeeBpsSet / FeeBpsSet events.Minter / Burner — Different risk profiles. A compromised minter inflates supply; a compromised burner destroys user funds. In practice, both roles should only be granted to OFT contracts, never to EOAs.Blacklister / Whitelister — Different compliance functions and different teams. Blacklisting is reactive (sanctions, fraud), typically handled by compliance or security. Whitelisting is proactive (KYC onboarding), typically handled by an onboarding team. Separating them matches the org chart.Messaging channel manager / Message nilifier — clear, skip, and burn are permanent channel advances; nilify can be reversed by re-verification. Separating them lets ops wallets handle blocked or rejected messages without irreversible channel control. Use nilify for policy rejects (e.g. extra-context DVNs); use skip / clear / burn to advance or permanently dispose of a nonce.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"LayerZero","colors":{"primary":"#c084fc","light":"#c084fc","dark":"#c084fc"},"logo":{"light":"https://mintcdn.com/layerzero/MzSiOdXt8xlDlEr4/images/LayerZero_Logo_Black.svg?fit=max\u0026auto=format\u0026n=MzSiOdXt8xlDlEr4\u0026q=85\u0026s=091b05c7556f6e8e948d613c2abf58cb","dark":"https://mintcdn.com/layerzero/MzSiOdXt8xlDlEr4/images/LayerZero_Logo_White.svg?fit=max\u0026auto=format\u0026n=MzSiOdXt8xlDlEr4\u0026q=85\u0026s=d6e58e0cf42c989a1fed9d1345e2d23a"},"favicon":"https://mintcdn.com/layerzero/qVdya_xVZRutFzkr/favicon.png?fit=max\u0026auto=format\u0026n=qVdya_xVZRutFzkr\u0026q=85\u0026s=c7fc37affda645fb663525dcbfc7a3a4","appearance":{"default":"dark"},"navbar":{"primary":{"type":"button","label":"LayerZero Scan","href":"https://layerzeroscan.com"}},"footer":{"socials":{"github":"https://github.com/LayerZero-Labs/LayerZero-v2","x":"https://x.com/layerzero_core","discord":"https://discord.com/invite/ktbvm8Nkcr","youtube":"https://www.youtube.com/@LayerZeroLabs","website":"https://layerzero.network/blog"}},"seo":{"metatags":{"og:site_name":"LayerZero Documentation","twitter:card":"summary_large_image","twitter:site":"@LayerZero_Labs"}},"fonts":{"heading":{"family":"Roboto"},"body":{"family":"Roboto"}},"contextual":{"options":["copy","cursor","vscode","mcp","view","chatgpt","claude","perplexity"],"display":"header"},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"Blog","icon":"newspaper","href":"https://layerzero.network/blog"},{"anchor":"GitHub","icon":"github","href":"https://github.com/LayerZero-Labs"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"layerzero","hasAudioNarration":false,"actualSubdomain":"layerzero","customDomains":["docs.layerzero.network"],"gitSource":{"type":"github","owner":"layerzero-labs","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ac831340109de95c3c06c54","collectionId":"caee5397-a3ba-41bd-95a7-8fd4a7ce8a21","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ac831340109de95c3c06c54"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ac831340109de95c3c06c54","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"Contracts \u0026 Deployments","count":179},{"language":"default","tag":"V2 Deployments","count":133},{"language":"default","tag":"Mainnet Endpoints","count":123},{"language":"default","tag":"Developers","count":122},{"language":"default","tag":"Core Concepts","count":39},{"language":"default","tag":"Developer Tools","count":35},{"language":"default","tag":"EVM","count":32},{"language":"default","tag":"Technical Reference","count":24},{"language":"default","tag":"Testnet Endpoints","count":20},{"language":"default","tag":"Contract Standards","count":20}]},"assistantConfig":{"enableStarterQuestions":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":":root{--lz-bg-primary:#fafafa;--lz-bg-secondary:#f5f5f5;--lz-text-primary:#171717;--lz-text-secondary:#5c5c5c;--lz-border-primary:#e5e5e5;--lz-purple-400:#c084fc;--lz-purple-500:#a855f7;--lz-purple-600:#9333ea;--lz-stargate-400:#0fb983;--lz-stargate-500:#10a073;--background-light:250 250 250!important;--background-dark:10 10 10!important}html[class~=dark]{--lz-bg-primary:#0a0a0a;--lz-bg-secondary:#171717;--lz-text-primary:#f0f0f0;--lz-text-secondary:#a3a3a3;--lz-border-primary:#2b2b2b}html[class~=dark],html[class~=dark] body{background-color:#0a0a0a!important}html:not([class~=dark]),html:not([class~=dark]) body{background-color:#fafafa!important}.custom-button{display:inline-flex!important;align-items:center;justify-content:center;padding:.5rem 1rem;border-radius:.375rem;font-weight:600;transition:color 100ms,background-color 100ms,border-color 100ms;cursor:pointer}.custom-button,.custom-button:hover{text-decoration:none!important}.custom-button-primary{background-color:#0a0a0a;color:#f2f2f2!important;border:1px solid transparent}.custom-button-primary:hover{opacity:.9;color:#f2f2f2!important}.custom-button-secondary{background-color:transparent;color:#0a0a0a!important;border:1px solid #0a0a0a}.custom-button-secondary:hover{background-color:#0a0a0a;color:#f2f2f2!important}html[class~=dark] .custom-button-primary{background-color:#f2f2f2;color:#0a0a0a!important}html[class~=dark] .custom-button-primary:hover{color:#0a0a0a!important}html[class~=dark] .custom-button-secondary{color:#f2f2f2!important;border-color:#f2f2f2}html[class~=dark] .custom-button-secondary:hover{background-color:#f2f2f2;color:#0a0a0a!important}a[href=\"/v2/developers/solana/overview\"] svg{-webkit-mask-image:url(/images/icons/solana-mask.svg)!important;mask-image:url(/images/icons/solana-mask.svg)!important}a[href=\"/v2/developers/aptos-move/overview\"] svg{-webkit-mask-image:url(/images/icons/aptos-mask.svg)!important;mask-image:url(/images/icons/aptos-mask.svg)!important}a[href=\"/v2/developers/hyperliquid/hyperliquid-concepts\"] svg{-webkit-mask-image:url(/images/icons/hyperliquid-mask.svg)!important;mask-image:url(/images/icons/hyperliquid-mask.svg)!important}a[href=\"/v2/developers/sui/overview\"] svg{-webkit-mask-image:url(/images/icons/sui-mask.svg)!important;mask-image:url(/images/icons/sui-mask.svg)!important}a[href=\"/v2/developers/iota/overview\"] svg{-webkit-mask-image:url(/images/icons/iota-mask.svg)!important;mask-image:url(/images/icons/iota-mask.svg)!important}a[href=\"/chain\"] svg,a[href=\"/chain/index\"] svg{-webkit-mask-image:url(/images/icons/zero-mask.svg)!important;mask-image:url(/images/icons/zero-mask.svg)!important}a[href=\"/v2/developers/evm/overview\"] svg{-webkit-mask-image:url(/images/icons/ethereum-mask.svg)!important;mask-image:url(/images/icons/ethereum-mask.svg)!important}a[href=\"/v2/developers/stellar/overview\"] svg{-webkit-mask-image:url(/images/icons/stellar-mask.svg)!important;mask-image:url(/images/icons/stellar-mask.svg)!important}a[href=\"/v2/developers/tempo\"] svg,a[href=\"/v2/developers/tempo/overview\"] svg{-webkit-mask-image:url(/images/icons/tempo-mark-white.svg)!important;mask-image:url(/images/icons/tempo-mark-white.svg)!important}.lz-mobile-nav-dialog{touch-action:manipulation;-webkit-tap-highlight-color:transparent;overflow-y:hidden!important}.lz-mobile-nav-dialog .overflow-y-auto{-webkit-overflow-scrolling:touch;overscroll-behavior:contain}.lz-mobile-nav-dialog a,.lz-mobile-nav-dialog button{touch-action:manipulation;-webkit-tap-highlight-color:transparent;min-height:44px;display:flex;align-items:center}#navbar-transition{pointer-events:none}html.lz-ios-scroll-lock{position:fixed;width:100%;height:100%;overflow:hidden}#footer a[href*=\"mintlify.com\"][href*=poweredBy]{display:none!important}img.nav-logo{width:102px!important;height:28px!important;aspect-ratio:109/30}.lz-content-wrapper{position:relative}.lz-content-video-bg{position:absolute;top:0;left:50%;transform:translateX(-50%);width:100vw;max-width:900px;height:280px;overflow:hidden;pointer-events:none;z-index:0;mask-image:linear-gradient(to bottom,#000 0,#000 50%,transparent 100%);-webkit-mask-image:linear-gradient(to bottom,#000 0,#000 50%,transparent 100%)}.lz-content-video{width:100%;height:100%;object-fit:cover;object-position:center top;opacity:0}html[class~=dark] .lz-content-video{opacity:.25}@media (min-width:900px){.lz-content-video-bg{border-radius:12px}}.lz-mobile-card-header,.lz-mobile-icon-wrapper{display:flex!important;align-items:center!important}.lz-mobile-card-header{flex-direction:row!important;gap:12px;margin-bottom:12px;padding-bottom:12px;border-bottom:1px solid #e5e7eb}.lz-mobile-icon-wrapper{justify-content:center!important;flex-shrink:0}.lz-mobile-icon-wrapper [data-rmiz-content],.lz-mobile-icon-wrapper [data-rmiz]{display:block!important;width:100%!important;height:100%!important;line-height:normal!important;margin:0!important;padding:0!important}.lz-mobile-card-title{font-size:18px!important;font-weight:700!important;margin:0!important;line-height:1.2!important;color:#000}html[class~=dark] .lz-mobile-card-header{border-bottom-color:rgba(255,255,255,.1)}html[class~=dark] .lz-mobile-card-title{color:#fff}a[data-accent]>div{background-color:#fff!important;border-color:#e5e5e5!important;border-width:2px!important;border-style:solid!important}html[class~=dark] a[data-accent]>div{background-color:#0a0a0a!important;border-color:#2b2b2b!important}a[data-accent] h3{color:#171717!important;font-weight:600!important}html[class~=dark] a[data-accent] h3{color:#fafafa!important}a[data-accent] p{color:#525252!important}html[class~=dark] a[data-accent] p{color:#a1a1a1!important}a[data-accent] svg:last-child{color:#a1a1a1!important}html[class~=dark] a[data-accent] svg:last-child{color:#525252!important}a[data-accent=purple]:hover h3{color:#9333ea!important}html[class~=dark] a[data-accent=purple]:hover h3{color:#c084fc!important}a[data-accent=purple]:hover>div{border-color:#9333ea!important}html[class~=dark] a[data-accent=purple]:hover>div{border-color:#c084fc!important}a[data-accent=purple]:hover svg:last-child{color:#9333ea!important}html[class~=dark] a[data-accent=purple]:hover svg:last-child{color:#c084fc!important}a[data-accent=stargate]:hover h3{color:#10a073!important}html[class~=dark] a[data-accent=stargate]:hover h3{color:#0fb983!important}a[data-accent=stargate]:hover>div{border-color:#10a073!important}html[class~=dark] a[data-accent=stargate]:hover>div{border-color:#0fb983!important}a[data-accent=stargate]:hover svg:last-child{color:#10a073!important}html[class~=dark] a[data-accent=stargate]:hover svg:last-child{color:#0fb983!important}a[data-accent=gray]:hover h3{color:#525252!important}html[class~=dark] a[data-accent=gray]:hover h3{color:#d4d4d4!important}a[data-accent=gray]:hover>div{border-color:#a1a1a1!important}html[class~=dark] a[data-accent=gray]:hover>div{border-color:#525252!important}a[data-accent=gray]:hover svg:last-child{color:#525252!important}html[class~=dark] a[data-accent=gray]:hover svg:last-child{color:#d4d4d4!important}"}],"page":{"pagePath":"v2/developers/evm/stablecoin-oft/rbac-reference","slug":"/v2/developers/evm/stablecoin-oft/rbac-reference","pageMetadata":{"title":"RBAC Reference","sidebarTitle":"RBAC Reference","description":"Complete role-based access control reference for Stablecoin OFT and ERC20Plus with role definitions, function matrices, and recommended assignment strategies.","keywords":["LayerZero","EVM","Stablecoin OFT","RBAC","roles","access control","permissions"],"href":"/v2/developers/evm/stablecoin-oft/rbac-reference"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Complete role-based access control reference for Stablecoin OFT and ERC20Plus with role definitions, function matrices, and recommended assignment strategies.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Table,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Complete role-based access control reference for Stablecoin OFT and `,_jsx(_components.code,{children:`ERC20Plus`}),`. All roles use `,_jsx(_components.code,{children:`AccessControl2StepUpgradeable`}),` with two-step admin transfer and `,_jsx(_components.code,{children:`keccak256`}),` identifiers.`]}),`\n`,_jsx(Heading,{level:`2`,id:`stablecoin-oft`,children:`Stablecoin OFT`}),`\n`,_jsxs(_components.p,{children:[`Applies to `,_jsx(_components.code,{children:`OFTBurnMint`}),`, `,_jsx(_components.code,{children:`OFTBurnSelfMint`}),`, `,_jsx(_components.code,{children:`OFTLockUnlock`}),`, `,_jsx(_components.code,{children:`OFTNative`}),`, and the alt variants of `,_jsx(_components.code,{children:`OFTBurnMint`}),`, `,_jsx(_components.code,{children:`OFTBurnSelfMint`}),`, and `,_jsx(_components.code,{children:`OFTLockUnlock`}),`.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Role`}),_jsx(_components.th,{children:`Source`}),_jsx(_components.th,{children:`Used For`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`DEFAULT_ADMIN_ROLE`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`AccessControl2StepUpgradeable`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`setPeer`}),`, `,_jsx(_components.code,{children:`setEnforcedOptions`}),`, `,_jsx(_components.code,{children:`setMsgInspector`}),`, `,_jsx(_components.code,{children:`setFeeDeposit`}),`, `,_jsx(_components.code,{children:`setCreditRedirectConfig`}),`, delegate operations`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`FEE_CONFIG_MANAGER_ROLE`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`FeeConfigRBACUpgradeable`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`setDefaultFeeBps`}),`, `,_jsx(_components.code,{children:`setFeeBps`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`RATE_LIMITER_MANAGER_ROLE`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`RateLimiterRBACUpgradeable`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`setRateLimitGlobalConfig`}),`, `,_jsx(_components.code,{children:`setRateLimitConfigs`}),`, `,_jsx(_components.code,{children:`setRateLimitStates`}),`, `,_jsx(_components.code,{children:`setRateLimitAddressExemptions`}),`, `,_jsx(_components.code,{children:`checkpointRateLimits`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PAUSER_ROLE`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`PauseByIDRBACUpgradeable`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`setDefaultPaused`}),` (when pausing), `,_jsx(_components.code,{children:`setPaused`}),` (when effectively pausing)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`UNPAUSER_ROLE`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`PauseByIDRBACUpgradeable`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`setDefaultPaused`}),` (when unpausing), `,_jsx(_components.code,{children:`setPaused`}),` (when effectively unpausing or no-op)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`MESSAGING_CHANNEL_MANAGER_ROLE`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`OAppMessagingChannelRBACUpgradeable`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`clear`}),`, `,_jsx(_components.code,{children:`skip`}),`, `,_jsx(_components.code,{children:`burn`}),` (non-reversible channel ops)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`MESSAGE_NILIFIER_ROLE`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`OAppMessagingChannelRBACUpgradeable`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`nilify`}),` (reversible; can be re-verified)`]})]})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`DEFAULT_ADMIN_ROLE`}),` is synchronized with `,_jsx(_components.code,{children:`delegate`}),`. The `,_jsx(_components.code,{children:`setDelegate`}),` function always reverts.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`erc20plus`,children:`ERC20Plus`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Role`}),_jsx(_components.th,{children:`Source`}),_jsx(_components.th,{children:`Used For`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`DEFAULT_ADMIN_ROLE`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`AccessControl2StepUpgradeable`})}),_jsxs(_components.td,{children:[`Admin transfer, set allowlist mode, `,_jsx(_components.code,{children:`recoverFunds`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`MINTER_ROLE`})}),_jsx(_components.td,{children:`Declared locally`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`mint`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`BURNER_ROLE`})}),_jsx(_components.td,{children:`Declared locally`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`burn`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`BLACKLISTER_ROLE`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`AllowlistRBACUpgradeable`})}),_jsx(_components.td,{children:`Blacklist addresses`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`WHITELISTER_ROLE`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`AllowlistRBACUpgradeable`})}),_jsx(_components.td,{children:`Whitelist addresses`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`PAUSER_ROLE`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`PauseRBACUpgradeable`})}),_jsx(_components.td,{children:`Pause`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`UNPAUSER_ROLE`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`PauseRBACUpgradeable`})}),_jsx(_components.td,{children:`Unpause`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`role-to-function-matrix`,children:`Role-to-Function Matrix`}),`\n`,_jsx(Heading,{level:`3`,id:`erc20plus-functions`,children:`ERC20Plus Functions`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Function`}),_jsx(_components.th,{children:`Required Role`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`mint(address, uint256)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`MINTER_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`burn(address, uint256)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`BURNER_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`recoverFunds(address, address, uint256)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`DEFAULT_ADMIN_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`setAllowlistMode(AllowlistMode)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`DEFAULT_ADMIN_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`setBlacklisted(SetAllowlistParam[])`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`BLACKLISTER_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`setWhitelisted(SetAllowlistParam[])`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`WHITELISTER_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`pause()`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`PAUSER_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`unpause()`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`UNPAUSER_ROLE`})})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`oft-functions`,children:`OFT Functions`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Function`}),_jsx(_components.th,{children:`Required Role`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`setDefaultFeeBps(uint16)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`FEE_CONFIG_MANAGER_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`setFeeBps(uint256, uint16, bool)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`FEE_CONFIG_MANAGER_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`setRateLimitGlobalConfig(RateLimitGlobalConfig)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`RATE_LIMITER_MANAGER_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`setRateLimitConfigs(SetRateLimitConfigParam[])`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`RATE_LIMITER_MANAGER_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`setRateLimitStates(SetRateLimitStateParam[])`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`RATE_LIMITER_MANAGER_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`setRateLimitAddressExemptions(SetRateLimitAddressExceptionParam[])`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`RATE_LIMITER_MANAGER_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`checkpointRateLimits(uint256[])`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`RATE_LIMITER_MANAGER_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`setDefaultPaused(bool)`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`PAUSER_ROLE`}),` or `,_jsx(_components.code,{children:`UNPAUSER_ROLE`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`setPaused(SetPausedParam[])`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`PAUSER_ROLE`}),` or `,_jsx(_components.code,{children:`UNPAUSER_ROLE`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`setPeer(uint32, bytes32)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`DEFAULT_ADMIN_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`setEnforcedOptions(EnforcedOptionParam[])`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`DEFAULT_ADMIN_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`setMsgInspector(address)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`DEFAULT_ADMIN_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`setFeeDeposit(address)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`DEFAULT_ADMIN_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`setCreditRedirectConfig(CreditRedirectConfig)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`DEFAULT_ADMIN_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`clear(Origin, bytes32, bytes)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`MESSAGING_CHANNEL_MANAGER_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`skip(uint32, bytes32, uint64)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`MESSAGING_CHANNEL_MANAGER_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`burn(uint32, bytes32, uint64, bytes32)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`MESSAGING_CHANNEL_MANAGER_ROLE`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`nilify(uint32, bytes32, uint64, bytes32)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`MESSAGE_NILIFIER_ROLE`})})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`permissionless-functions`,children:`Permissionless Functions`}),`\n`,_jsx(_components.p,{children:`These functions can be called by anyone:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Function`}),_jsx(_components.th,{children:`Contract`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`send(SendParam, MessagingFee, address)`})}),_jsx(_components.td,{children:`OFTs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`quoteSend(SendParam, bool)`})}),_jsx(_components.td,{children:`OFTs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`quoteOFT(SendParam)`})}),_jsx(_components.td,{children:`OFTs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`token()`})}),_jsx(_components.td,{children:`OFTs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`approvalRequired()`})}),_jsx(_components.td,{children:`OFTs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`oftVersion()`})}),_jsx(_components.td,{children:`OFTs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sharedDecimals()`})}),_jsx(_components.td,{children:`OFTs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`transfer(address, uint256)`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`ERC20Plus`}),` (subject to allowlist + pause)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`transferFrom(address, address, uint256)`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`ERC20Plus`}),` (subject to allowlist + pause)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`approve(address, uint256)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ERC20Plus`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`permit(...)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ERC20Plus`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`defaultFeeBps()`})}),_jsx(_components.td,{children:`OFTs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`feeBps(uint256)`})}),_jsx(_components.td,{children:`OFTs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`getRateLimitGlobalConfig()`})}),_jsx(_components.td,{children:`OFTs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`rateLimits(uint256)`})}),_jsx(_components.td,{children:`OFTs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`getRateLimitUsages(uint256)`})}),_jsx(_components.td,{children:`OFTs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`isRateLimitAddressExempt(address)`})}),_jsx(_components.td,{children:`OFTs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`isPaused(uint256)`})}),_jsx(_components.td,{children:`OFTs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`defaultPaused()`})}),_jsx(_components.td,{children:`OFTs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`pauseConfig(uint256)`})}),_jsx(_components.td,{children:`OFTs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`creditRedirectConfig()`})}),_jsx(_components.td,{children:`OFTs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`allowlistMode()`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ERC20Plus`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`isAllowlisted(address)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ERC20Plus`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`isBlacklisted(address)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ERC20Plus`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`isWhitelisted(address)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ERC20Plus`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`blacklistedCount()`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ERC20Plus`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`whitelistedCount()`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ERC20Plus`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`getBlacklist(uint256, uint256)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ERC20Plus`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`getWhitelist(uint256, uint256)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ERC20Plus`})})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`role-separation-principles`,children:`Role Separation Principles`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Pauser / Unpauser`}),` — A compromised pauser key can halt the system (disruptive, but funds remain safe). If that same key could also unpause, an attacker could undo a legitimate security pause. Keeping them separate means the security team can pause fast, and unpausing requires a different authorization path (typically a governance multisig).`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Fee config manager`}),` — A compromised `,_jsx(_components.code,{children:`FEE_CONFIG_MANAGER_ROLE`}),` can set high fee rates, but fee proceeds are pushed to the fee deposit address during `,_jsx(_components.code,{children:`_debit`}),` as part of the send path; the fee config manager cannot retarget that destination. Use a multisig for fee administration and monitor `,_jsx(_components.code,{children:`DefaultFeeBpsSet`}),` / `,_jsx(_components.code,{children:`FeeBpsSet`}),` events.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Minter / Burner`}),` — Different risk profiles. A compromised minter inflates supply; a compromised burner destroys user funds. In practice, both roles should only be granted to OFT contracts, never to EOAs.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Blacklister / Whitelister`}),` — Different compliance functions and different teams. Blacklisting is reactive (sanctions, fraud), typically handled by compliance or security. Whitelisting is proactive (KYC onboarding), typically handled by an onboarding team. Separating them matches the org chart.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Messaging channel manager / Message nilifier`}),` — `,_jsx(_components.code,{children:`clear`}),`, `,_jsx(_components.code,{children:`skip`}),`, and `,_jsx(_components.code,{children:`burn`}),` are permanent channel advances; `,_jsx(_components.code,{children:`nilify`}),` can be reversed by re-verification. Separating them lets ops wallets handle blocked or rejected messages without irreversible channel control. Use `,_jsx(_components.code,{children:`nilify`}),` for policy rejects (e.g. extra-context DVNs); use `,_jsx(_components.code,{children:`skip`}),` / `,_jsx(_components.code,{children:`clear`}),` / `,_jsx(_components.code,{children:`burn`}),` to advance or permanently dispose of a nonce.`]}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next Steps`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/v2/developers/evm/stablecoin-oft/erc20plus`,children:`ERC20Plus`}),` for token-layer behavior and interfaces`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/v2/developers/evm/stablecoin-oft/extensions`,children:`Extensions`}),` for fee, rate limit, pause, and credit redirect configuration on OFTs`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/v2/developers/evm/stablecoin-oft/security-compliance`,children:`Security and Compliance`}),` for operational security recommendations`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"RBAC Reference","sidebarTitle":"RBAC Reference","description":"Complete role-based access control reference for Stablecoin OFT and ERC20Plus with role definitions, function matrices, and recommended assignment strategies.","keywords":["LayerZero","EVM","Stablecoin OFT","RBAC","roles","access control","permissions"],"href":"/v2/developers/evm/stablecoin-oft/rbac-reference"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Stablecoin OFT","slug":"stablecoin-oft","depth":2,"children":[]},{"title":"ERC20Plus","slug":"erc20plus","depth":2,"children":[]},{"title":"Role-to-Function Matrix","slug":"role-to-function-matrix","depth":2,"children":[{"title":"ERC20Plus Functions","slug":"erc20plus-functions","depth":3,"children":[]},{"title":"OFT Functions","slug":"oft-functions","depth":3,"children":[]},{"title":"Permissionless Functions","slug":"permissionless-functions","depth":3,"children":[]}]},{"title":"Role Separation Principles","slug":"role-separation-principles","depth":2,"children":[]},{"title":"Next Steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/layerzero/355391ae19c1d258/accessibility.js","/_mintlify/custom/layerzero/714d41473c4c265e/posthog.js","/_mintlify/custom/layerzero/747cfa09f827dae8/snippets/contractAbis.js","/_mintlify/custom/layerzero/e4d3be41c98f3ab2/scripts/generate-chain-pages.js","/_mintlify/custom/layerzero/7530b00fc4b5bdca/scripts/update-deployments/constants.js","/_mintlify/custom/layerzero/c2a5b61ad6c140da/scripts/update-deployments/index.js"],"subdomain":"layerzero","siteName":"LayerZero","title":"RBAC Reference - LayerZero","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-08-05T21:36:37.276Z","originalFileLocation":"v2/developers/evm/stablecoin-oft/rbac-reference.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Complete role-based access control reference for Stablecoin OFT and ERC20Plus with role definitions, function matrices, and recommended assignment strategies.\">\u003cmeta data-mint-head name=\"application-name\" content=\"LayerZero\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"RBAC Reference - LayerZero\">\u003cmeta data-mint-head property=\"og:description\" content=\"Complete role-based access control reference for Stablecoin OFT and ERC20Plus with role definitions, function matrices, and recommended assignment strategies.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"LayerZero Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.layerzero.network/v2/developers/evm/stablecoin-oft/rbac-reference\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://layerzero.mintlify.app/_mintlify/api/og/v2?division=Stablecoin+OFT\u0026amp;title=RBAC+Reference\u0026amp;description=Complete+role-based+access+control+reference+for+Stablecoin+OFT+and+ERC20Plus+with+role+definitions%2C+function+matrices%2C+and+recommended+assignment+strategies.\u0026amp;theme=28e43194b2d92b2885f4b3d8\u0026amp;signature=034aa09d5f37b6fcf91efa1bcafe1aaebc4e45744d8b3ba94a65a8cb3947defd\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"RBAC Reference - LayerZero\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Complete role-based access control reference for Stablecoin OFT and ERC20Plus with role definitions, function matrices, and recommended assignment strategies.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://layerzero.mintlify.app/_mintlify/api/og/v2?division=Stablecoin+OFT\u0026amp;title=RBAC+Reference\u0026amp;description=Complete+role-based+access+control+reference+for+Stablecoin+OFT+and+ERC20Plus+with+role+definitions%2C+function+matrices%2C+and+recommended+assignment+strategies.\u0026amp;theme=28e43194b2d92b2885f4b3d8\u0026amp;signature=034aa09d5f37b6fcf91efa1bcafe1aaebc4e45744d8b3ba94a65a8cb3947defd\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"LayerZero\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#c084fc\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.layerzero.network/v2/developers/evm/stablecoin-oft/rbac-reference\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/v2/developers/evm/stablecoin-oft/rbac-reference.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.layerzero.network/#organization\",\"name\":\"LayerZero\",\"url\":\"https://docs.layerzero.network\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/layerzero/MzSiOdXt8xlDlEr4/images/LayerZero_Logo_Black.svg?fit=max\u0026auto=format\u0026n=MzSiOdXt8xlDlEr4\u0026q=85\u0026s=091b05c7556f6e8e948d613c2abf58cb\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.layerzero.network#website\",\"name\":\"LayerZero\",\"url\":\"https://docs.layerzero.network\",\"publisher\":{\"@id\":\"https://docs.layerzero.network/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.layerzero.network/v2/developers/evm/stablecoin-oft/rbac-reference#webpage\",\"url\":\"https://docs.layerzero.network/v2/developers/evm/stablecoin-oft/rbac-reference\",\"name\":\"RBAC Reference\",\"description\":\"Complete role-based access control reference for Stablecoin OFT and ERC20Plus with role definitions, function matrices, and recommended assignment strategies.\",\"dateModified\":\"2026-08-05T21:36:37.276Z\",\"isPartOf\":{\"@id\":\"https://docs.layerzero.network#website\"},\"breadcrumb\":{\"@id\":\"https://docs.layerzero.network/v2/developers/evm/stablecoin-oft/rbac-reference#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.layerzero.network/v2/developers/evm/stablecoin-oft/rbac-reference#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Stablecoin OFT\",\"item\":\"https://docs.layerzero.network/v2/developers/evm/stablecoin-oft/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"RBAC Reference\",\"item\":\"https://docs.layerzero.network/v2/developers/evm/stablecoin-oft/rbac-reference\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.layerzero.network/v2/developers/evm/stablecoin-oft/rbac-reference#article\",\"headline\":\"RBAC Reference\",\"name\":\"RBAC Reference\",\"description\":\"Complete role-based access control reference for Stablecoin OFT and ERC20Plus with role definitions, function matrices, and recommended assignment strategies.\",\"url\":\"https://docs.layerzero.network/v2/developers/evm/stablecoin-oft/rbac-reference\",\"mainEntityOfPage\":{\"@id\":\"https://docs.layerzero.network/v2/developers/evm/stablecoin-oft/rbac-reference#webpage\"},\"dateModified\":\"2026-08-05T21:36:37.276Z\",\"keywords\":\"LayerZero, EVM, Stablecoin OFT, RBAC, roles, access control, permissions\",\"publisher\":{\"@id\":\"https://docs.layerzero.network/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.layerzero.network#website\"}}]}\u003c/script>","siteName":"LayerZero","nav":{"global":{"anchors":[{"anchor":"Blog","icon":"newspaper","href":"https://layerzero.network/blog"},{"anchor":"GitHub","icon":"github","href":"https://github.com/LayerZero-Labs"}]},"tabs":[{"tab":"Home","pages":[{"title":"Home","href":""}]},{"tab":"Get Started","pages":[{"title":"Get Started","href":"/v2/get-started/overview"}]},{"tab":"Core Concepts","pages":[{"title":"Core Concepts","href":"/v2/concepts/getting-started/what-is-layerzero"}]},{"tab":"Developers","menu":[{"item":"Zero","icon":"circle","pages":[{"title":"Zero","href":"/chain"}]},{"item":"EVM","icon":"circle","groups":[{"group":"LayerZero for EVM","pages":[{"title":"LayerZero V2 Solidity Contract Standards","sidebarTitle":"Start Here","href":"/v2/developers/evm/overview"},{"title":"Interactive Contract Playground","sidebarTitle":"Contract Playground","href":"/v2/developers/evm/contracts-playground"},{"title":"Sending Tokenized Assets","sidebarTitle":"Sending Tokens","href":"/v2/developers/evm/oft/native-transfer"},{"title":"LayerZero Scan Explorer","sidebarTitle":"LayerZero Scan","url":"https://layerzeroscan.com/","href":"/v2/developers/layerzero-scan-explorer"},{"title":"LayerZero V2 Glossary","sidebarTitle":"Glossary","href":"/v2/concepts/glossary"}]},{"group":"Contract Standards","pages":[{"title":"LayerZero V2 OApp Quickstart","sidebarTitle":"Omnichain Application (OApp)","href":"/v2/developers/evm/oapp/overview"},{"title":"Omnichain Queries (LayerZero Read)","sidebarTitle":"Omnichain Queries (lzRead)","href":"/v2/developers/evm/lzread/overview"},{"title":"LayerZero V2 OFT Quickstart","sidebarTitle":"Omnichain Fungible Token (OFT)","href":"/v2/developers/evm/oft/quickstart"},{"title":"LayerZero V2 ONFT Quickstart","sidebarTitle":"Omnichain NFT (ONFT)","href":"/v2/developers/evm/onft/quickstart"},{"title":"Omnichain Composers","sidebarTitle":"Omnichain Composers","href":"/v2/developers/evm/composer/overview"},{"title":"OVault EVM Implementation","sidebarTitle":"Omnichain Vaults (OVault)","href":"/v2/developers/evm/ovault/overview"},{"title":"Integrating Stargate Transfers","sidebarTitle":"Stargate Transfers","href":"/v2/developers/evm/stargate/overview"},{"title":"Integrating lzAsset Transfers","sidebarTitle":"lzAsset Transfers","href":"/v2/developers/evm/lzasset/overview"},{"title":"Best Practices for Contract Ownership","sidebarTitle":"Contract Ownership","href":"/v2/developers/evm/technical-reference/transfer-ownership"}]},{"group":"Stablecoin OFT","pages":[{"title":"Stablecoin OFT Overview","sidebarTitle":"Overview","href":"/v2/developers/evm/stablecoin-oft/overview"},{"title":"Architecture","sidebarTitle":"Architecture","href":"/v2/developers/evm/stablecoin-oft/architecture"},{"title":"ERC20Plus","sidebarTitle":"ERC20Plus","href":"/v2/developers/evm/stablecoin-oft/erc20plus"},{"title":"OFT Variants","sidebarTitle":"OFTs","href":"/v2/developers/evm/stablecoin-oft/ofts"},{"title":"Extensions","sidebarTitle":"Extensions","href":"/v2/developers/evm/stablecoin-oft/extensions"},{"title":"Security and Compliance","sidebarTitle":"Security \u0026 Compliance","description":"Security model, compliance features, threat mitigations, and operational security recommendations.","href":"/v2/developers/evm/stablecoin-oft/security-compliance"},{"title":"RBAC Reference","sidebarTitle":"RBAC Reference","href":"/v2/developers/evm/stablecoin-oft/rbac-reference"}]},{"group":"Multi-Asset OFT","pages":[{"title":"Multi-Asset OFT Overview","sidebarTitle":"Overview","description":"A multi-token OFT framework built on a single OApp with composable security modules.","href":"/v2/developers/evm/multi-asset-oft/overview"},{"title":"Architecture","sidebarTitle":"Architecture","href":"/v2/developers/evm/multi-asset-oft/architecture"},{"title":"NexusERC20","sidebarTitle":"NexusERC20","href":"/v2/developers/evm/multi-asset-oft/nexus-erc20"},{"title":"Modules","sidebarTitle":"Modules","href":"/v2/developers/evm/multi-asset-oft/modules"},{"title":"Security and Compliance","sidebarTitle":"Security \u0026 Compliance","href":"/v2/developers/evm/multi-asset-oft/security-compliance"},{"title":"RBAC Reference","sidebarTitle":"RBAC Reference","href":"/v2/developers/evm/multi-asset-oft/rbac-reference"}]},{"group":"Technical Reference","pages":[{"title":"LayerZero V2 EVM Protocol Overview","sidebarTitle":"Protocol Contracts Overview","href":"/v2/developers/evm/protocol-contracts-overview"},{"title":"LayerZero EVM Chain Compatibility","sidebarTitle":"EVM Chain Compatibility","href":"/v2/developers/evm/evm-variants/evm-compatible-variants"},{"title":"EVM DVN and Executor Configuration","sidebarTitle":"DVN \u0026 Executor Configuration","href":"/v2/developers/evm/configuration/dvn-executor-config"},{"title":"Deploy Deterministic Addresses","sidebarTitle":"Deploy Deterministic Addresses","href":"/v2/developers/evm/tooling/uniform-address"},{"title":"Solidity API","sidebarTitle":"Solidity API","href":"/v2/developers/evm/technical-reference/api"}]},{"group":"Troubleshooting","pages":[{"title":"Debugging Messages","sidebarTitle":"Debugging Messages","href":"/v2/developers/evm/troubleshooting/debugging-messages"},{"title":"Error Codes \u0026 Handling","sidebarTitle":"Error Codes \u0026 Handling","href":"/v2/developers/evm/troubleshooting/error-messages"}]},{"group":"Resources","pages":[{"title":"LayerZero Whitepaper","sidebarTitle":"Whitepaper","url":"https://layerzero.network/publications/LayerZero_Whitepaper_V2.1.1.pdf","href":"/v2/resources/whitepaper"},{"title":"LayerZero Security Audits","sidebarTitle":"Audits","url":"https://github.com/LayerZero-Labs/Audits/tree/main/audits","href":"/v2/resources/audits"},{"title":"Awesome LayerZero","sidebarTitle":"Awesome LayerZero","url":"https://github.com/LayerZero-Labs/awesome-layerzero/","href":"/v2/resources/awesome-layerzero"},{"title":"Frequently Asked Questions (FAQ)","sidebarTitle":"General FAQ","href":"/v2/faq"}]}]},{"item":"Solana","icon":"circle","pages":[{"title":"Solana","href":"/v2/developers/solana/overview"}]},{"item":"Starknet","icon":"https://mintlify.s3.us-west-1.amazonaws.com/layerzero/images/icons/starknet.svg","pages":[{"title":"Starknet","href":"/v2/developers/starknet/overview"}]},{"item":"Aptos Move","icon":"code","pages":[{"title":"Aptos Move","href":"/v2/developers/aptos-move/overview"}]},{"item":"Hyperliquid","icon":"droplet","pages":[{"title":"Hyperliquid","href":"/v2/developers/hyperliquid/hyperliquid-concepts"}]},{"item":"Sui","icon":"waves","pages":[{"title":"Sui","href":"/v2/developers/sui/overview"}]},{"item":"Stellar","icon":"star","pages":[{"title":"Stellar","href":"/v2/developers/stellar/overview"}]},{"item":"IOTA L1","icon":"hexagon","pages":[{"title":"IOTA L1","href":"/v2/developers/iota/overview"}]},{"item":"Tempo","icon":"circle","pages":[{"title":"Tempo","href":"/v2/developers/tempo/overview"}]},{"item":"Value Transfer API","icon":"arrow-right-arrow-left","pages":[{"title":"Value Transfer API","href":"/v2/developers/value-transfer-api/start"}]}]},{"tab":"Contracts \u0026 Deployments","menu":[{"item":"V2 Deployments","icon":"file-text","pages":[{"title":"V2 Deployments","href":"/v2/deployments/deployed-contracts"}]},{"item":"V1 Deployments","icon":"file-code","pages":[{"title":"V1 Deployments","href":"/v1/deployments/deployed-contracts"}]},{"item":"Developer Tools","icon":"wrench","pages":[{"title":"Developer Tools","href":"/v2/tools/overview"}]},{"item":"DVN \u0026 Executor Reference","icon":"shield-halved","pages":[{"title":"DVN \u0026 Executor Reference","href":"/v2/workers/overview"}]}],"pages":[{"title":"Contracts \u0026 Deployments","href":"/v2/deployments/deployed-contracts"}]}]},"basePath":"","title":"RBAC Reference - LayerZero","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":[],"chunks":[]}