Skip to main content

Overview of Transfer Restriction Enforcement Functions

The current system implements a sophisticated multi-layer restriction framework that automatically enforces regulatory compliance through identity verification, token type rules, and holding period validations.

Core Restriction Categories

1. Token Type & Holding Period Restrictions

Token TypeRestriction ScenarioEnforcement MechanismAdmin RoleDetails
RegS (1)Transfer to any jurisdictionTransferRule with holding period validationTransfer Admin1-year holding period for offshore placements
RegD (2)Transfer to US/non-US recipientsTransferRule with differentiated holding periodsTransfer Admin6-month to accredited, 12-month to retail
RegCF (3)Transfer between investor typesTransferRule with recipient eligibility checksTransfer AdminRetail → Accredited allowed, reverse restricted
Institutional (4)Large transaction restrictionsTransferRule with custom compliance rulesTransfer AdminInstitution-specific holding periods
Generic (0)Basic compliance checksTransferRule with minimal restrictionsTransfer AdminDefault type with AML/KYC requirements

2. Identity & Compliance Restrictions

Restriction TypeValidation MethodEnforced ByAdmin RoleFunction Call
AML/KYC VerificationReal-time identity check with expirationIdentityRegistry.isAmlKycPassed()Wallets AdmingrantAmlKyc(address, duration)
Regional ComplianceMulti-jurisdiction validationIdentityRegistry.hasRegion()Wallets AdminsetRegions(address, regions[])
Accreditation LevelInvestor sophistication checkIdentityRegistry.accreditationType()Wallets AdmingrantAccreditation(address, type)
Token Type AssignmentAutomatic type based on identityTransferRules.getTokenType()Transfer AdminsetTokenTypeRule(region, accred, type, amlReq, isActive)

3. Time-Lock & Release Schedule Restrictions

ScenarioRestriction PeriodEnforcement MechanismAdmin RoleFunction Signature
Vesting SchedulesUntil release timestampIndividual timelock validation in holdingsAny AdminfundReleaseSchedule(ReleaseScheduleParams, canceler)
Regulatory LockupsToken type specific periodsTransferRule.lockDurationSeconds validationReserve AdminmintReleaseSchedule(ReleaseScheduleParams, canceler)
Cliff PeriodsAll-or-nothing releaseTimelock cliff validationAny AdmincreateReleaseSchedule(recipient, amount, start, id)
Linear VestingGradual token releasePro-rata unlock calculationAny AdmincalculateUnlocked(scheduleId, timestamp)

4. Holder & Supply Management Restrictions

Limit TypeRestriction LogicEnforcement PointAdmin RoleConfiguration Function
Maximum HoldersGlobal holder count limitTransfer validation & mintingTransfer AdminsetHolderMax(maxAmount)
Regional Holder LimitsPer-jurisdiction capsIdentity-based countingTransfer AdminRegional rules in TransferRules
Supply ConstraintsMaximum issuable tokensMint operationsReserve AdminsetMaxTotalSupply(newMax)
Circulating vs ReservedOutstanding token trackingAll token operationsReserve AdmintotalSupply() vs maxTotalSupply()

5. Emergency & Administrative Controls

Control TypeUse CaseMechanismAdmin RoleFunction Call
Wallet FreezeSuspicious activity/stolen tokensIndividual address blockingWallets/Transfer Adminfreeze(address, isFrozen)
Global PauseRegulatory emergencyAll transfers disabledTransfer Adminpause(isPaused)
Force TransferCourt orders/emergency recoveryBypass all restrictionsReserve AdminforceTransferBetween(from, to, amount)
Token RecoveryLost/stolen token remediationBurn + reissue processReserve Adminburn(address, amount) + mint(newOwner, amount)

Advanced Restriction Scenarios

Multi-Holding Type Transfers

// Example: Transfer specific holding with different token type
token.transferHolding(
recipient,
amount,
holdingIndex, // Which holding to transfer from
newTokenType // Convert type during transfer
);

Cross-Border Compliance

// Automatic validation for international transfers
// 1. Check sender regions and compliance status
// 2. Validate recipient eligibility for token type
// 3. Apply appropriate holding periods
// 4. Ensure AML/KYC requirements met

Regulatory Timelock Enforcement

// Holdings-based timelock validation
function _validateHoldingPeriod(
address from,
uint256 amount,
uint256 tokenType,
uint256 mintTimestamp
) internal view returns (bool) {
// Check if sufficient time has passed based on token type rules
TransferRule memory rule = transferRules.getTransferRule(tokenType, recipient);
return block.timestamp >= mintTimestamp + rule.lockDurationSeconds;
}

Integration Flow

The system enforces these restrictions through an integrated validation pipeline:

  1. Identity Verification: Check sender/recipient AML/KYC and regional compliance
  2. Token Type Validation: Determine applicable rules based on token holdings
  3. Holding Period Check: Validate time-based restrictions per token type
  4. Regulatory Rules: Apply jurisdiction-specific transfer limitations
  5. Administrative Overrides: Allow emergency controls when needed

This comprehensive restriction framework ensures regulatory compliance while providing the flexibility needed for complex international securities offerings.