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 Type | Restriction Scenario | Enforcement Mechanism | Admin Role | Details |
---|---|---|---|---|
RegS (1) | Transfer to any jurisdiction | TransferRule with holding period validation | Transfer Admin | 1-year holding period for offshore placements |
RegD (2) | Transfer to US/non-US recipients | TransferRule with differentiated holding periods | Transfer Admin | 6-month to accredited, 12-month to retail |
RegCF (3) | Transfer between investor types | TransferRule with recipient eligibility checks | Transfer Admin | Retail → Accredited allowed, reverse restricted |
Institutional (4) | Large transaction restrictions | TransferRule with custom compliance rules | Transfer Admin | Institution-specific holding periods |
Generic (0) | Basic compliance checks | TransferRule with minimal restrictions | Transfer Admin | Default type with AML/KYC requirements |
2. Identity & Compliance Restrictions
Restriction Type | Validation Method | Enforced By | Admin Role | Function Call |
---|---|---|---|---|
AML/KYC Verification | Real-time identity check with expiration | IdentityRegistry.isAmlKycPassed() | Wallets Admin | grantAmlKyc(address, duration) |
Regional Compliance | Multi-jurisdiction validation | IdentityRegistry.hasRegion() | Wallets Admin | setRegions(address, regions[]) |
Accreditation Level | Investor sophistication check | IdentityRegistry.accreditationType() | Wallets Admin | grantAccreditation(address, type) |
Token Type Assignment | Automatic type based on identity | TransferRules.getTokenType() | Transfer Admin | setTokenTypeRule(region, accred, type, amlReq, isActive) |
3. Time-Lock & Release Schedule Restrictions
Scenario | Restriction Period | Enforcement Mechanism | Admin Role | Function Signature |
---|---|---|---|---|
Vesting Schedules | Until release timestamp | Individual timelock validation in holdings | Any Admin | fundReleaseSchedule(ReleaseScheduleParams, canceler) |
Regulatory Lockups | Token type specific periods | TransferRule.lockDurationSeconds validation | Reserve Admin | mintReleaseSchedule(ReleaseScheduleParams, canceler) |
Cliff Periods | All-or-nothing release | Timelock cliff validation | Any Admin | createReleaseSchedule(recipient, amount, start, id) |
Linear Vesting | Gradual token release | Pro-rata unlock calculation | Any Admin | calculateUnlocked(scheduleId, timestamp) |
4. Holder & Supply Management Restrictions
Limit Type | Restriction Logic | Enforcement Point | Admin Role | Configuration Function |
---|---|---|---|---|
Maximum Holders | Global holder count limit | Transfer validation & minting | Transfer Admin | setHolderMax(maxAmount) |
Regional Holder Limits | Per-jurisdiction caps | Identity-based counting | Transfer Admin | Regional rules in TransferRules |
Supply Constraints | Maximum issuable tokens | Mint operations | Reserve Admin | setMaxTotalSupply(newMax) |
Circulating vs Reserved | Outstanding token tracking | All token operations | Reserve Admin | totalSupply() vs maxTotalSupply() |
5. Emergency & Administrative Controls
Control Type | Use Case | Mechanism | Admin Role | Function Call |
---|---|---|---|---|
Wallet Freeze | Suspicious activity/stolen tokens | Individual address blocking | Wallets/Transfer Admin | freeze(address, isFrozen) |
Global Pause | Regulatory emergency | All transfers disabled | Transfer Admin | pause(isPaused) |
Force Transfer | Court orders/emergency recovery | Bypass all restrictions | Reserve Admin | forceTransferBetween(from, to, amount) |
Token Recovery | Lost/stolen token remediation | Burn + reissue process | Reserve Admin | burn(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:
- Identity Verification: Check sender/recipient AML/KYC and regional compliance
- Token Type Validation: Determine applicable rules based on token holdings
- Holding Period Check: Validate time-based restrictions per token type
- Regulatory Rules: Apply jurisdiction-specific transfer limitations
- Administrative Overrides: Allow emergency controls when needed
This comprehensive restriction framework ensures regulatory compliance while providing the flexibility needed for complex international securities offerings.