Skip to main content

Identity Registry

Overview​

The IdentityRegistry contract manages identity verification, AML/KYC compliance, and accreditation status for token holders. It's used by the RestrictedLockupToken and TransferRules contracts to define and enforce transfer restrictions.

Architecture​

The IdentityRegistry maintains identity information for each wallet address, including:

  • Regions: Array of integer region identifiers
  • AML/KYC Status: Boolean flag indicating whether the wallet has passed AML/KYC verification
  • Accreditation Type: An integer indicating the wallet's accreditation status
  • Timestamps: Timestamps of the last AML/KYC status change and last accreditation change

Key Features​

  • Centralized Identity Management: One contract can be reused for multiple instances of the RestrictedLockupToken contract
  • Flexible Identity Updates: Admins can update individual components of identity information
  • Event Logging: All identity changes are logged via events for audit trails
  • ERC-165 Interface Support: Implements standardized interface detection
  • ERC-2771 Support: Compatible with ERC-2771 trusted forwarder

Usage​

Identity Information Structure​

struct IdentityInfo {
uint256[] regions;
uint256 accreditationType;
uint256 lastAmlKycChangeTimestamp;
uint256 lastAccreditationChangeTimestamp;
bool amlKycPassed;
}

Field Descriptions​

  • regions: Array of integer region IDs representing the holder's jurisdictions
  • accreditationType: Holder's accreditation type
  • lastAmlKycChangeTimestamp: Updated when AML/KYC status changes via grantAmlKyc() or revokeAmlKyc(), supports custom timestamps or defaults to block.timestamp
  • lastAccreditationChangeTimestamp: Updated when accreditation type changes via grantAccreditation() or revokeAccreditation(), supports custom timestamps or defaults to block.timestamp
  • amlKycPassed: Boolean flag indicating whether the holder has passed AML/KYC verification

AML/KYC Validity Duration​

The IdentityRegistry includes a configurable AML/KYC validity duration system:

  • Global Setting: amlKycValidityDuration is set during contract deployment and can be updated by Contract Admin
  • Zero Duration Behavior: When set to 0, AML/KYC status never expires
  • Non-Zero Duration: When set to a value > 0, AML/KYC status expires after the specified duration in seconds
  • Validity Checking: The isAmlKycPassed() function considers both the AML/KYC status flag AND the validity duration
  • Automatic Expiration: AML/KYC status automatically becomes invalid when block.timestamp exceeds lastAmlKycChangeTimestamp + amlKycValidityDuration

RestrictedLockupToken​

The RestrictedLockupToken integrates with IdentityRegistry to enforce compliance-based transfer restrictions:

  1. Integration Point: The token contract holds a reference to the IdentityRegistry via the identityRegistry property
  2. Transfer Validation: During every token transfer, the system validates both sender and recipient AML/KYC status
  3. Compliance Enforcement: Transfers are automatically blocked if either party fails AML/KYC verification
  4. Administrative Control: Only Wallets Admin can update identity information

AML/KYC Transfer Validation Flow​

Administrative Functions​

The IdentityRegistry provides several administrative functions for managing wallet identities:

FunctionDescriptionAccess Control
setIdentity(owner, info)Set complete identity information with IdentityInfo struct (supports custom timestamps)Wallets Admin
batchSetIdentity(owners[], info)Set same identity information for multiple walletsWallets Admin
removeIdentity(owner)Remove all identity information for a walletWallets Admin
setRegions(owner, regions[])Replace entire regions arrayWallets Admin
addRegion(owner, region)Add a single region to existing regionsWallets Admin
removeRegion(owner, region)Remove a specific region from regions arrayWallets Admin
grantAmlKyc(owner, timestamp)Mark wallet as AML/KYC passed with optional custom timestampWallets Admin
revokeAmlKyc(owner, timestamp)Mark wallet as AML/KYC failed with optional custom timestampWallets Admin
grantAccreditation(owner, level, timestamp)Set accreditation level with optional custom timestampWallets Admin
revokeAccreditation(owner, timestamp)Remove accreditation with optional custom timestampWallets Admin
setAmlKycValidityDuration(duration)Set global AML/KYC validity duration in secondsContract Admin

Timestamp Functionality​

Custom Timestamp Support​

The IdentityRegistry can be used with both manual and automatic timestamps for the identity changes, supporting the following use cases:

  • Retroactive Data Migration: Import historical compliance data with original timestamps

  • Off-chain Integration: Synchronize with external compliance systems that track verification dates

  • Audit Compliance: Maintain accurate historical records for regulatory reporting and auditing

  • Flexibility: Wallets Admin can choose between automatic timestamping (pass 0) or precise control (provide specific timestamp)

  • setIdentity(owner, info): The IdentityInfo struct includes lastAmlKycChangeTimestamp and lastAccreditationChangeTimestamp fields

    • When these timestamp fields are non-zero, the contract uses the provided custom timestamps
    • When these timestamp fields are 0, the contract automatically sets them to block.timestamp
  • AML/KYC Functions - grantAmlKyc(owner, timestamp) and revokeAmlKyc(owner, timestamp):

    • timestamp parameter: when non-zero, uses the custom timestamp; when 0, uses block.timestamp
    • Updates the lastAmlKycChangeTimestamp field in the wallet's identity record
  • Accreditation Functions - grantAccreditation(owner, level, timestamp) and revokeAccreditation(owner, timestamp):

    • timestamp parameter: when non-zero, uses the custom timestamp; when 0, uses block.timestamp
    • Updates the lastAccreditationChangeTimestamp field in the wallet's identity record

Example Usage:

// Using automatic timestamp (current block time)
identityRegistry.grantAmlKyc(walletAddress, 0);

// Using custom timestamp (e.g., when the verification actually occurred off-chain)
uint256 verificationDate = 1640995200; // Jan 1, 2022
identityRegistry.grantAmlKyc(walletAddress, verificationDate);

// Setting identity with mixed timestamp approach
uint256[] memory regions = new uint256[](2);
regions[0] = 840; // United States
regions[1] = 826; // United Kingdom

IdentityInfo memory identity = IdentityInfo({
regions: regions,
accreditationType: 2, // Accredited
lastAmlKycChangeTimestamp: 1640995200, // Custom timestamp
lastAccreditationChangeTimestamp: 0, // Will use block.timestamp
amlKycPassed: true
});
identityRegistry.setIdentity(walletAddress, identity);

Multiple Region Management​

The IdentityRegistry supports multiple regions per wallet, enabling support for dual citizenship, cross-border investments, and multi-jurisdictional compliance.

Region Management Functions​

Set Complete Regions Array​

// Replace entire regions array
uint256[] memory newRegions = new uint256[](3);
newRegions[0] = 840; // United States
newRegions[1] = 826; // United Kingdom
newRegions[2] = 124; // Canada

identityRegistry.setRegions(walletAddress, newRegions);

Add Individual Region​

// Add a single region to existing regions
identityRegistry.addRegion(walletAddress, 756); // Switzerland

Remove Individual Region​

// Remove a specific region from regions array
identityRegistry.removeRegion(walletAddress, 826); // Remove UK

Query Region Information​

// Get all regions for a wallet
uint256[] memory walletRegions = identityRegistry.regions(walletAddress);

// Check if wallet has specific region
bool hasUSRegion = identityRegistry.hasRegion(walletAddress, 840);

Multi-Region Use Cases​

Dual Citizenship Scenario​

// Investor has both US and Canadian citizenship
uint256[] memory dualCitizenship = new uint256[](2);
dualCitizenship[0] = 840; // United States
dualCitizenship[1] = 124; // Canada

identityRegistry.setRegions(investor, dualCitizenship);

Corporate Entity with Multiple Jurisdictions​

// Investment fund operating in multiple regions
uint256[] memory operatingRegions = new uint256[](4);
operatingRegions[0] = 840; // United States
operatingRegions[1] = 826; // United Kingdom
operatingRegions[2] = 276; // Germany
operatingRegions[3] = 392; // Japan

identityRegistry.setRegions(institutionalInvestor, operatingRegions);

Dynamic Region Updates​

// Investor relocates and gains new residency
identityRegistry.addRegion(investor, 756); // Add Switzerland

// Later, renounces previous citizenship
identityRegistry.removeRegion(investor, 840); // Remove United States

Region Validation Rules​

The contract enforces several validation rules for regions:

  • No Empty Arrays: setRegions() rejects empty region arrays
  • No Duplicates: Regions array cannot contain duplicate region IDs
  • Maximum Count: Regions array cannot exceed MAX_REGIONS_COUNT (10)
  • Existence Checking: addRegion() prevents adding regions already present
  • Removal Validation: removeRegion() only removes regions that exist

Error Handling​

The contract provides specific error messages for region operations:

// Attempting to add existing region
identityRegistry.addRegion(wallet, 840); // Reverts: IdentityRegistry_WalletAlreadyHasRegion

// Attempting to remove non-existent region
identityRegistry.removeRegion(wallet, 999); // Reverts: IdentityRegistry_WalletDoesNotHaveRegion

// Setting empty regions array
uint256[] memory empty;
identityRegistry.setRegions(wallet, empty); // Reverts: IdentityRegistry_EmptyRegionsArray

Queries​

The IdentityRegistry provides comprehensive query functions for accessing identity information:

FunctionDescriptionReturnsExample Usage
identity(owner)Get complete identity informationIdentityInfo structIdentityInfo memory info = identityRegistry.identity(wallet);
regions(owner)Get all regions for a walletuint256[] memoryuint256[] memory walletRegions = identityRegistry.regions(wallet);
hasRegion(owner, region)Check if wallet has specific regionbooleanbool hasUS = identityRegistry.hasRegion(wallet, 840);
isAmlKycPassed(owner)Check AML/KYC status with validity durationbooleanbool verified = identityRegistry.isAmlKycPassed(wallet);
accreditationType(owner)Get accreditation leveluint256uint256 level = identityRegistry.accreditationType(wallet);
amlKycValidityDuration()Get global AML/KYC validity durationuint256uint256 duration = identityRegistry.amlKycValidityDuration();

Complete Identity Information​

// Get all identity data at once
IdentityInfo memory info = identityRegistry.identity(walletAddress);

// Access individual fields
uint256[] memory regions = info.regions;
uint256 accreditation = info.accreditationType;
bool amlKycStatus = info.amlKycPassed;
uint256 lastAmlKycChange = info.lastAmlKycChangeTimestamp;
uint256 lastAccreditationChange = info.lastAccreditationChangeTimestamp;

Region-Specific Queries​

// Get all regions for a wallet
uint256[] memory allRegions = identityRegistry.regions(walletAddress);

// Check for specific region membership
bool isUSResident = identityRegistry.hasRegion(walletAddress, 840); // United States
bool isEUResident = identityRegistry.hasRegion(walletAddress, 276); // Germany

// Example: Check for multi-jurisdiction compliance
bool canTradeGlobally = identityRegistry.hasRegion(investor, 840) || // US
identityRegistry.hasRegion(investor, 826) || // UK
identityRegistry.hasRegion(investor, 276); // Germany

AML/KYC Status Validation​

// Check current AML/KYC status (considers validity duration)
bool isCompliant = identityRegistry.isAmlKycPassed(walletAddress);

// This function performs automatic time-based validation:
// - Returns true only if amlKycPassed == true AND status hasn't expired
// - Expiration calculated as: lastAmlKycChangeTimestamp + amlKycValidityDuration

Accreditation Level Queries​

// Get accreditation type
uint256 accredLevel = identityRegistry.accreditationType(walletAddress);

// Common accreditation levels:
// 0 = No accreditation (retail investor)
// 1 = Retail investor
// 2 = Accredited investor
// 3 = Qualified investor
// 4 = Institutional investor

Advanced Query Patterns​

Multi-Condition Compliance Checking​

function checkInvestorEligibility(address investor) public view returns (bool eligible) {
// Must have AML/KYC approval
if (!identityRegistry.isAmlKycPassed(investor)) return false;

// Must be from allowed region
if (!identityRegistry.hasRegion(investor, 840)) return false; // US only

// Must have minimum accreditation
if (identityRegistry.accreditationType(investor) < 2) return false; // Accredited or higher

return true;
}

Region-Based Token Type Determination​

function determineTokenType(address investor) public view returns (uint256 tokenType) {
if (identityRegistry.hasRegion(investor, 840)) {
// US investor - check accreditation
uint256 accreditation = identityRegistry.accreditationType(investor);
return accreditation >= 2 ? 2 : 3; // RegD if accredited, RegCF if retail
} else {
// Non-US investor
return 1; // RegS
}
}

Batch Identity Verification​

function batchCheckCompliance(address[] memory investors)
public view returns (bool[] memory results) {
results = new bool[](investors.length);

for (uint256 i = 0; i < investors.length; i++) {
results[i] = identityRegistry.isAmlKycPassed(investors[i]);
}
}

Time-Based Validation Notes​

AML/KYC Validity Duration Behavior​

  • Duration = 0: AML/KYC status never expires (permanent until manually revoked)
  • Duration > 0: Status expires after specified seconds from lastAmlKycChangeTimestamp
  • Automatic Expiration: isAmlKycPassed() returns false for expired status even if amlKycPassed is true

Example of Time-Based Validation​

// Check validity duration setting
uint256 duration = identityRegistry.amlKycValidityDuration(); // e.g., 31536000 (1 year)

// Get identity info to check timestamps
IdentityInfo memory info = identityRegistry.identity(investor);

// Manual calculation (for reference - the contract does this automatically)
bool isExpired = (duration > 0) &&
(block.timestamp > info.lastAmlKycChangeTimestamp + duration);

// This matches what isAmlKycPassed() returns
bool isValid = info.amlKycPassed && !isExpired;

API Reference​

Constructor​

constructor(address contractAdmin_, address walletsAdmin_, address trustedForwarder_, uint256 amlKycValidityDuration_)​

Initializes the IdentityRegistry contract with admin roles, trusted forwarder, and AML/KYC validity duration.

Parameters:

  • contractAdmin_ (address): Initial contract administrator address
  • walletsAdmin_ (address): Initial wallets administrator address
  • trustedForwarder_ (address): ERC-2771 trusted forwarder address for meta-transactions
  • amlKycValidityDuration_ (uint256): AML/KYC validity duration in seconds (0 = never expires)

Requirements:

  • All addresses must be non-zero
  • Sets up initial role assignments and AML/KYC validity duration

Constants​

INTERFACE_ID() → bytes4​

Returns the ERC-165 interface identifier for IIdentityRegistry.

Returns:

  • bytes4: The interface identifier

Usage: Used for ERC-165 interface detection


Identity Management Functions​

setIdentity(address owner, IdentityInfo info)​

Sets complete identity information for a wallet address.

Parameters:

  • owner (address): The wallet address to set identity for
  • info (IdentityInfo): Complete identity information struct

IdentityInfo Structure:

struct IdentityInfo {
uint256[] regions; // Array of region identifiers
uint256 accreditationType; // Accreditation level
uint256 lastAmlKycChangeTimestamp; // Timestamp of last AML/KYC change (0 = use block.timestamp)
uint256 lastAccreditationChangeTimestamp; // Timestamp of last accreditation change (0 = use block.timestamp)
bool amlKycPassed; // AML/KYC status flag
}

Requirements:

  • Caller must have WALLETS_ADMIN_ROLE
  • Regions array cannot be empty
  • Regions array cannot exceed MAX_REGIONS_COUNT (10)
  • No duplicate regions allowed

Emits:

  • IdentityCreated (if new identity)
  • RegionsSet (if regions changed)
  • AmlKycPassed or AmlKycFailed (if AML/KYC status changed)
  • AccreditationGranted or AccreditationRevoked (if accreditation changed)

batchSetIdentity(address[] owners, IdentityInfo info)​

Sets the same identity information for multiple wallet addresses.

Parameters:

  • owners (address[]): Array of wallet addresses to set identity for
  • info (IdentityInfo): Identity information to apply to all addresses

Requirements:

  • Caller must have WALLETS_ADMIN_ROLE
  • Same requirements as setIdentity apply to each address

Emits: Same events as setIdentity for each address processed


removeIdentity(address owner)​

Removes all identity information for a wallet address.

Parameters:

  • owner (address): The wallet address to remove identity from

Requirements:

  • Caller must have WALLETS_ADMIN_ROLE
  • Wallet must have existing identity information

Emits: IdentityRemoved(authority, owner)


Region Management Functions (API)​

setRegions(address owner, uint256[] newRegions)​

Replaces the entire regions array for a wallet.

Parameters:

  • owner (address): The wallet address to update regions for
  • newRegions (uint256[]): New array of region identifiers

Requirements:

  • Caller must have WALLETS_ADMIN_ROLE
  • Regions array cannot be empty
  • Regions array cannot exceed MAX_REGIONS_COUNT (10)
  • No duplicate regions allowed
  • New regions must be different from current regions

Emits: RegionsSet(authority, owner, newRegions)


addRegion(address owner, uint256 region)​

Adds a single region to a wallet's existing regions.

Parameters:

  • owner (address): The wallet address to add region to
  • region (uint256): The region identifier to add

Requirements:

  • Caller must have WALLETS_ADMIN_ROLE
  • Wallet must not already have this region
  • Total regions cannot exceed MAX_REGIONS_COUNT (10)

Emits: RegionAdded(authority, owner, region)


removeRegion(address owner, uint256 region)​

Removes a specific region from a wallet's regions array.

Parameters:

  • owner (address): The wallet address to remove region from
  • region (uint256): The region identifier to remove

Requirements:

  • Caller must have WALLETS_ADMIN_ROLE
  • Wallet must currently have this region

Emits: RegionRemoved(authority, owner, region)


AML/KYC Management Functions​

grantAmlKyc(address owner, uint256 amlKycTimestamp)​

Grants AML/KYC approval to a wallet.

Parameters:

  • owner (address): The wallet address to grant AML/KYC to
  • amlKycTimestamp (uint256): Timestamp for the change (0 = use block.timestamp)

Requirements:

  • Caller must have WALLETS_ADMIN_ROLE
  • AML/KYC status must actually change (not already granted with same timestamp)

Emits: AmlKycPassed(authority, owner, amlKycTimestamp)


revokeAmlKyc(address owner, uint256 amlKycTimestamp)​

Revokes AML/KYC approval from a wallet.

Parameters:

  • owner (address): The wallet address to revoke AML/KYC from
  • amlKycTimestamp (uint256): Timestamp for the change (0 = use block.timestamp)

Requirements:

  • Caller must have WALLETS_ADMIN_ROLE
  • AML/KYC status must actually change (not already revoked with same timestamp)

Emits: AmlKycFailed(authority, owner, amlKycTimestamp)


setAmlKycValidityDuration(uint256 amlKycValidityDuration_)​

Sets the global AML/KYC validity duration.

Parameters:

  • amlKycValidityDuration_ (uint256): New validity duration in seconds (0 = never expires)

Requirements:

  • Caller must have CONTRACT_ADMIN_ROLE
  • New duration must be different from current duration

Emits: AmlKycValidityDurationSet(authority, oldDuration, newDuration)


Accreditation Management Functions​

grantAccreditation(address owner, uint256 _accreditationType, uint256 accreditationTimestamp)​

Grants accreditation to a wallet.

Parameters:

  • owner (address): The wallet address to grant accreditation to
  • _accreditationType (uint256): The accreditation type/level to grant
  • accreditationTimestamp (uint256): Timestamp for the change (0 = use block.timestamp)

Requirements:

  • Caller must have WALLETS_ADMIN_ROLE
  • Accreditation must actually change (not already granted with same level and timestamp)

Emits: AccreditationGranted(authority, owner, newAccreditationLevel, accreditationTimestamp)


revokeAccreditation(address owner, uint256 accreditationTimestamp)​

Revokes accreditation from a wallet (sets to NO_ACCREDITATION = 0).

Parameters:

  • owner (address): The wallet address to revoke accreditation from
  • accreditationTimestamp (uint256): Timestamp for the change (0 = use block.timestamp)

Requirements:

  • Caller must have WALLETS_ADMIN_ROLE
  • Wallet must not already have no accreditation

Emits: AccreditationRevoked(authority, owner, revokedAccreditationLevel, accreditationTimestamp)


Query Functions​

identity(address owner) → IdentityInfo​

Returns complete identity information for a wallet.

Parameters:

  • owner (address): The wallet address to query

Returns:

  • IdentityInfo: Complete identity information struct

regions(address owner) → uint256[]​

Returns all regions for a wallet.

Parameters:

  • owner (address): The wallet address to query

Returns:

  • uint256[]: Array of region identifiers

hasRegion(address owner, uint256 region) → bool​

Checks if a wallet has a specific region.

Parameters:

  • owner (address): The wallet address to check
  • region (uint256): The region identifier to check for

Returns:

  • bool: True if the wallet has the region

accreditationType(address owner) → uint256​

Returns the accreditation type for a wallet.

Parameters:

  • owner (address): The wallet address to query

Returns:

  • uint256: The accreditation type (0 = no accreditation)

isAmlKycPassed(address owner) → bool​

Checks if a wallet has valid AML/KYC approval (considers validity duration).

Parameters:

  • owner (address): The wallet address to check

Returns:

  • bool: True if AML/KYC is passed and not expired

Logic:

  • Returns true only if amlKycPassed == true AND status hasn't expired
  • If amlKycValidityDuration == 0, status never expires
  • If amlKycValidityDuration > 0, checks if lastAmlKycChangeTimestamp + amlKycValidityDuration >= block.timestamp

amlKycValidityDuration() → uint256​

Returns the global AML/KYC validity duration.

Returns:

  • uint256: Validity duration in seconds (0 = never expires)

ERC-165 & ERC-2771 Functions​

supportsInterface(bytes4 interfaceId) → bool​

Checks if the contract supports a specific interface (ERC-165).

Parameters:

  • interfaceId (bytes4): The interface identifier to check

Returns:

  • bool: True if the interface is supported

isTrustedForwarder(address forwarder) → bool​

Checks if an address is the trusted forwarder for meta-transactions.

Parameters:

  • forwarder (address): The address to check

Returns:

  • bool: True if the address is the trusted forwarder

trustedForwarder() → address​

Returns the current trusted forwarder address.

Returns:

  • address: The trusted forwarder address

Inherited Access Control Functions​

The IdentityRegistry inherits from EasyAccessControl and includes all access control functions:

  • grantRole(address addr, uint8 role)
  • revokeRole(address addr, uint8 role)
  • batchGrantRoles(address[] addresses, uint8[] roles_)
  • batchRevokeRoles(address[] addresses, uint8[] roles_)
  • hasRole(address addr, uint8 role) → bool
  • roles(address addr) → uint8
  • contractAdminCount() → uint8
  • Role constants: CONTRACT_ADMIN_ROLE(), WALLETS_ADMIN_ROLE(), etc.

Events​

IdentityCreated(address indexed authority, address indexed owner)​

Emitted when a new identity is created for a wallet.

Parameters:

  • authority (address, indexed): The address that created the identity
  • owner (address, indexed): The wallet address that received the identity

IdentityRemoved(address indexed authority, address indexed owner)​

Emitted when an identity is completely removed from a wallet.

Parameters:

  • authority (address, indexed): The address that removed the identity
  • owner (address, indexed): The wallet address that lost the identity

RegionsSet(address indexed authority, address indexed owner, uint256[] regions)​

Emitted when a wallet's regions array is replaced.

Parameters:

  • authority (address, indexed): The address that set the regions
  • owner (address, indexed): The wallet address whose regions were set
  • regions (uint256[]): The new regions array

RegionAdded(address indexed authority, address indexed owner, uint256 region)​

Emitted when a single region is added to a wallet.

Parameters:

  • authority (address, indexed): The address that added the region
  • owner (address, indexed): The wallet address that received the region
  • region (uint256): The region identifier that was added

RegionRemoved(address indexed authority, address indexed owner, uint256 region)​

Emitted when a single region is removed from a wallet.

Parameters:

  • authority (address, indexed): The address that removed the region
  • owner (address, indexed): The wallet address that lost the region
  • region (uint256): The region identifier that was removed

AmlKycPassed(address indexed authority, address indexed owner, uint256 amlKycTimestamp)​

Emitted when AML/KYC approval is granted to a wallet.

Parameters:

  • authority (address, indexed): The address that granted AML/KYC
  • owner (address, indexed): The wallet address that received AML/KYC approval
  • amlKycTimestamp (uint256): The timestamp of the AML/KYC approval

AmlKycFailed(address indexed authority, address indexed owner, uint256 amlKycTimestamp)​

Emitted when AML/KYC approval is revoked from a wallet.

Parameters:

  • authority (address, indexed): The address that revoked AML/KYC
  • owner (address, indexed): The wallet address that lost AML/KYC approval
  • amlKycTimestamp (uint256): The timestamp of the AML/KYC revocation

AccreditationGranted(address indexed authority, address indexed owner, uint256 newAccreditationLevel, uint256 accreditationTimestamp)​

Emitted when accreditation is granted to a wallet.

Parameters:

  • authority (address, indexed): The address that granted accreditation
  • owner (address, indexed): The wallet address that received accreditation
  • newAccreditationLevel (uint256): The accreditation level that was granted
  • accreditationTimestamp (uint256): The timestamp of the accreditation grant

AccreditationRevoked(address indexed authority, address indexed owner, uint256 revokedAccreditationLevel, uint256 accreditationTimestamp)​

Emitted when accreditation is revoked from a wallet.

Parameters:

  • authority (address, indexed): The address that revoked accreditation
  • owner (address, indexed): The wallet address that lost accreditation
  • revokedAccreditationLevel (uint256): The accreditation level that was revoked
  • accreditationTimestamp (uint256): The timestamp of the accreditation revocation

AmlKycValidityDurationSet(address indexed authority, uint256 oldAmlKycValidityDuration, uint256 newAmlKycValidityDuration)​

Emitted when the global AML/KYC validity duration is changed.

Parameters:

  • authority (address, indexed): The address that changed the validity duration
  • oldAmlKycValidityDuration (uint256): The previous validity duration
  • newAmlKycValidityDuration (uint256): The new validity duration

RoleChange(address indexed grantor, address indexed grantee, uint8 role, bool indexed status)​

Emitted when access control roles are granted or revoked (inherited from EasyAccessControl).

Parameters:

  • grantor (address, indexed): The address that performed the role change
  • grantee (address, indexed): The address that received or lost the role
  • role (uint8): The role that was changed
  • status (bool, indexed): True for grant, false for revoke

Custom Errors​

Identity Registry Specific Errors​

IdentityRegistry_InvalidContractAdmin()​

Thrown when a zero address is provided for contract admin in constructor.


IdentityRegistry_InvalidWalletsAdmin()​

Thrown when a zero address is provided for wallets admin in constructor.


IdentityRegistry_InvalidTrustedForwarder()​

Thrown when a zero address is provided for trusted forwarder in constructor.


IdentityRegistry_WalletHasNoIdentityToRemove()​

Thrown when attempting to remove identity from a wallet that has no identity information.


IdentityRegistry_WalletAlreadyHasSameRegions()​

Thrown when attempting to set regions that are identical to current regions.


IdentityRegistry_WalletAlreadyHasRegion()​

Thrown when attempting to add a region that the wallet already has.


IdentityRegistry_WalletDoesNotHaveRegion()​

Thrown when attempting to remove a region that the wallet doesn't have.


IdentityRegistry_WalletAlreadyHasSameAmlKycStatus()​

Thrown when attempting to set AML/KYC status that matches current status and timestamp.


IdentityRegistry_WalletAlreadyHasSameAccreditationLevel()​

Thrown when attempting to set accreditation that matches current level and timestamp.


IdentityRegistry_WalletAlreadyHasNoAccreditation()​

Thrown when attempting to revoke accreditation from a wallet that already has no accreditation.


IdentityRegistry_AlreadyHasSameAmlKycValidityDuration()​

Thrown when attempting to set AML/KYC validity duration to the same value.


IdentityRegistry_EmptyRegionsArray()​

Thrown when attempting to set an empty regions array.


IdentityRegistry_InvalidRegion()​

Thrown when regions array contains duplicate values.


IdentityRegistry_RegionsExceedsMaxCount()​

Thrown when regions array exceeds MAX_REGIONS_COUNT (10).


Inherited Access Control Errors​

The IdentityRegistry also includes all EasyAccessControl errors:

  • EasyAccessControl_AlreadyHasRole()
  • EasyAccessControl_ArraysMustBeSameLength()
  • EasyAccessControl_AtLeastOneContractAdminRequired()
  • EasyAccessControl_CannotRevokeRole()
  • EasyAccessControl_DoesNotHaveAdminRole(address addr)
  • EasyAccessControl_DoesNotHaveContractAdminRole(address addr)
  • EasyAccessControl_DoesNotHaveWalletsAdminRole(address addr)
  • EasyAccessControl_InvalidRole()
  • EasyAccessControl_InvalidZeroAddress()