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:

  1. getCCIPAdmin() via [IGetCCIPAdmin](/ccip/evm/api-reference/v2.0.0/i-get-ccip-admin)
  2. owner() via [IOwner](/ccip/evm/api-reference/v2.0.0/i-owner)
  3. OpenZeppelin AccessControl with DEFAULT_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() if tokenAdminRegistry == address(0).

Sets:

i_tokenAdminRegistry = ITokenAdminRegistry(tokenAdminRegistry);

External API

registerAdminViaGetCCIPAdmin

function registerAdminViaGetCCIPAdmin(address token)
  external

Flow:

  1. Calls IGetCCIPAdmin(token).getCCIPAdmin().
  2. Calls _registerAdmin(token, derivedAdmin).

Reverts CanOnlySelfRegister(derivedAdmin, token) if derivedAdmin != msg.sender.


registerAdminViaOwner

function registerAdminViaOwner(address token)
  external

Flow:

  1. Calls IOwner(token).owner().
  2. Calls _registerAdmin(token, derivedAdmin).

Reverts CanOnlySelfRegister(derivedAdmin, token) if mismatch.


registerAccessControlDefaultAdmin

function registerAccessControlDefaultAdmin(address token)
  external

Flow:

  1. Reads:
bytes32 role = AccessControl(token).DEFAULT_ADMIN_ROLE();
  1. Validates:
AccessControl(token).hasRole(role, msg.sender)

Else reverts:

error RequiredRoleNotFound(address msgSender, bytes32 role, address token);
  1. Calls _registerAdmin(token, msg.sender).

Internal Functions

_registerAdmin

function _registerAdmin(address token, address admin)
  internal

Validations:

  • Reverts CanOnlySelfRegister(admin, token) if admin != 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 TokenAdminRegistry ownership rules.
  • Two-step admin transfer still required via acceptAdminRole.
  • Does not permit registry owner override via this module.
  • Token contract determines authoritative admin source.

Get the latest Chainlink content straight to your inbox.