CCIP v2.0.0 RegistryModuleOwnerCustom API Reference
Summary
RegistryModuleOwnerCustom is a registry module used by [TokenAdminRegistry](/ccip/evm/api-reference/v2.0.0/token-admin-registry) to enable token-level administrators to self-register without registry owner intervention.
It supports three authority discovery mechanisms:
getCCIPAdmin()via[IGetCCIPAdmin](/ccip/evm/api-reference/v2.0.0/i-get-ccip-admin)owner()via[IOwner](/ccip/evm/api-reference/v2.0.0/i-owner)- OpenZeppelin
AccessControlwithDEFAULT_ADMIN_ROLE
The module proposes administrators in TokenAdminRegistry, but does not finalize the two-step transfer.
Contract
chains/evm/contracts/tokenAdminRegistry/RegistryModuleOwnerCustom.sol
Import
import {RegistryModuleOwnerCustom} from "chainlink-ccip/chains/evm/contracts/tokenAdminRegistry/RegistryModuleOwnerCustom.sol";
Inheritance
ITypeAndVersion
typeAndVersion
string public constant override typeAndVersion =
"RegistryModuleOwnerCustom 1.6.0";
State
Constants
string public constant override typeAndVersion =
"RegistryModuleOwnerCustom 1.6.0";
Immutables
ITokenAdminRegistry internal immutable i_tokenAdminRegistry;
Reference to the TokenAdminRegistry where administrators are proposed.
Storage
None declared.
Constructor
constructor(address tokenAdminRegistry)
Validations:
- Reverts
AddressZero()iftokenAdminRegistry == address(0).
Sets:
i_tokenAdminRegistry = ITokenAdminRegistry(tokenAdminRegistry);
External API
registerAdminViaGetCCIPAdmin
function registerAdminViaGetCCIPAdmin(address token)
external
Flow:
- Calls
IGetCCIPAdmin(token).getCCIPAdmin(). - Calls
_registerAdmin(token, derivedAdmin).
Reverts CanOnlySelfRegister(derivedAdmin, token) if derivedAdmin != msg.sender.
registerAdminViaOwner
function registerAdminViaOwner(address token)
external
Flow:
- Calls
IOwner(token).owner(). - Calls
_registerAdmin(token, derivedAdmin).
Reverts CanOnlySelfRegister(derivedAdmin, token) if mismatch.
registerAccessControlDefaultAdmin
function registerAccessControlDefaultAdmin(address token)
external
Flow:
- Reads:
bytes32 role = AccessControl(token).DEFAULT_ADMIN_ROLE();
- Validates:
AccessControl(token).hasRole(role, msg.sender)
Else reverts:
error RequiredRoleNotFound(address msgSender, bytes32 role, address token);
- Calls
_registerAdmin(token, msg.sender).
Internal Functions
_registerAdmin
function _registerAdmin(address token, address admin)
internal
Validations:
- Reverts
CanOnlySelfRegister(admin, token)ifadmin != msg.sender.
Effects:
i_tokenAdminRegistry.proposeAdministrator(token, admin);
Emits:
event AdministratorRegistered(address indexed token, address indexed administrator);
Events
event AdministratorRegistered(
address indexed token,
address indexed administrator
);
Errors
error CanOnlySelfRegister(address admin, address token);
error RequiredRoleNotFound(address msgSender, bytes32 role, address token);
error AddressZero();
Security model
- Self-registration only: caller must match derived admin.
- Does not bypass
TokenAdminRegistryownership rules. - Two-step admin transfer still required via
acceptAdminRole. - Does not permit registry owner override via this module.
- Token contract determines authoritative admin source.