Rule144Facet
Rule 144 provides a safe harbor for the resale of restricted or control securities if certain conditions are met: holding periods, volume limits, current public info, manner of sale
Asset facet implementing SEC Rule 144 requirements for resale of restricted securities
State Variables
REPORTING_COMPANY_HOLDING_PERIOD
uint256 public constant REPORTING_COMPANY_HOLDING_PERIOD = 180 days;
NON_REPORTING_COMPANY_HOLDING_PERIOD
uint256 public constant NON_REPORTING_COMPANY_HOLDING_PERIOD = 365 days;
VOLUME_LIMIT_PERIOD
uint256 public constant VOLUME_LIMIT_PERIOD = 28 days;
VOLUME_LIMIT_PERCENTAGE
uint256 public constant VOLUME_LIMIT_PERCENTAGE = 100;
RULE144_STORAGE_SLOT
bytes32 private constant RULE144_STORAGE_SLOT = keccak256("capsign.storage.Rule144");
Functions
_getRule144Storage
Get Rule 144 storage
function _getRule144Storage() internal pure returns (Rule144Storage storage s);
initializeRule144
Initialize Rule 144 functionality
function initializeRule144(bool _isReporting, bool _hasPublicInfo) external;
Parameters
_isReporting
bool
Whether the company is subject to Exchange Act reporting
_hasPublicInfo
bool
Whether current public information is available
setCompanyStatus
Set company reporting status and public information availability
function setCompanyStatus(bool _isReporting, bool _hasPublicInfo) external;
Parameters
_isReporting
bool
Whether the company is subject to Exchange Act reporting
_hasPublicInfo
bool
Whether current public information is available
setControlPerson
Designate control persons (affiliates) for volume limit purposes
function setControlPerson(address person, bool _isControl) external;
Parameters
person
address
The person to designate
_isControl
bool
Whether the person is a control person
setRule144Enabled
Enable or disable Rule 144 enforcement
function setRule144Enabled(bool enabled) external;
Parameters
enabled
bool
Whether Rule 144 should be enforced
checkRule144Transfer
Check if a transfer is allowed under Rule 144
function checkRule144Transfer(address from, address to, bytes32 lotId, uint256 amount)
external
view
returns (bool allowed, string memory reason);
Parameters
from
address
The seller
to
address
The buyer
lotId
bytes32
The lot being transferred
amount
uint256
The amount being transferred
Returns
allowed
bool
Whether the transfer is allowed
reason
string
Reason if transfer is not allowed
_checkVolumeLimit
Check if volume limit is satisfied for control person
function _checkVolumeLimit(Rule144Storage storage s, address seller, uint256 amount) internal view returns (bool);
Parameters
s
Rule144Storage
Rule 144 storage
seller
address
The control person selling
amount
uint256
The amount being sold
Returns
<none>
bool
Whether volume limit is satisfied
recordRule144Sale
Record a sale for volume tracking (called after successful transfer)
function recordRule144Sale(address from, uint256 amount) external;
Parameters
from
address
The seller
amount
uint256
The amount sold
getVolumeInfo
Get volume information for a control person
function getVolumeInfo(address person)
external
view
returns (uint256 volumeSold, uint256 volumeLimit, uint256 lastSale);
Parameters
person
address
The control person
Returns
volumeSold
uint256
Volume sold in current 4-week period
volumeLimit
uint256
Maximum volume allowed (1% of outstanding)
lastSale
uint256
Timestamp of last sale
getHoldingPeriodInfo
Get holding period information for a lot
function getHoldingPeriodInfo(bytes32 lotId)
external
view
returns (uint256 acquisitionDate, uint256 requiredHoldingPeriod, bool holdingPeriodMet);
Parameters
lotId
bytes32
The lot ID
Returns
acquisitionDate
uint256
When the lot was acquired
requiredHoldingPeriod
uint256
Required holding period based on company status
holdingPeriodMet
bool
Whether holding period is satisfied
getCompanyStatus
Get company status information
function getCompanyStatus() external view returns (bool isReporting, bool hasPublicInfo, bool enabled);
Returns
isReporting
bool
Whether company is subject to Exchange Act reporting
hasPublicInfo
bool
Whether current public information is available
enabled
bool
Whether Rule 144 enforcement is enabled
isControlPerson
Check if an address is designated as a control person
function isControlPerson(address person) external view returns (bool isControl);
Parameters
person
address
The address to check
Returns
isControl
bool
Whether the person is a control person
getControlPersons
Get list of all control persons (note: this is expensive, use carefully)
function getControlPersons() external pure returns (address[] memory controlPersons);
Returns
controlPersons
address[]
Array of control person addresses
Events
CompanyStatusUpdated
event CompanyStatusUpdated(bool isReporting, bool hasPublicInfo);
ControlPersonDesignated
event ControlPersonDesignated(address indexed person, bool isControl);
Rule144SaleRecorded
event Rule144SaleRecorded(address indexed seller, uint256 amount, uint256 timestamp);
Rule144EnabledUpdated
event Rule144EnabledUpdated(bool enabled);
Structs
Rule144Storage
struct Rule144Storage {
bool isReportingCompany;
bool hasCurrentPublicInformation;
mapping(address => bool) isControlPerson;
mapping(address => uint256) volumeSoldInPeriod;
mapping(address => uint256) lastSaleTimestamp;
bool rule144Enabled;
}
Last updated
Was this helpful?