Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 150
Dividend Module
| Introduced in | 1.3.0 |
| Contract name | DividendCheckpointModule |
| Compatible ST Protocol version range | ^3.0.0 |
| Type | Checkpoint Module |
This module allows the issuer to define checkpoints at which token balances and the total supply of a token can be consistently queried. The dividends checkpoint is for dividend payment mechanisms and on-chain governance, both of which need to be able to determine token balances consistently as of a specified point in time.
DISCLAIMER:
Under certain conditions, the function pushDividendPayment
- May fail due to block gas limits. If the total number of investors that ever held tokens is greater than ~15,000. If this happens investors can pull their dividends, or the Issuer can use
pushDividendPaymentToAddresses()to provide an explicit address list in batches.
This function simply returns a list of the default excluded addresses.
/**
* @notice Return the default excluded addresses
* @return List of excluded addresses
*/
function getDefaultExcluded() external view returns(address[] memory)
This function allows the issuer to create a checkpoint for their respective security token and returns a checkpoint ID.
/**
* @notice Creates a checkpoint on the security token
* @return Checkpoint ID
*/
function createCheckpoint() public withPerm(OPERATOR) returns(uint256)
This function allows for the issuer to clear their dividends list and to set a new list of excluded addresses used for future dividend issuances.
/**
* @notice Function to clear and set list of excluded addresses used for future dividends
* @param _excluded Addresses of investors
*/
function setDefaultExcluded(address[] memory _excluded) public withPerm(ADMIN)
This function allows the issuer to set withholding tax rates for their investors.
There are a few requirements for the function:
Investors list length must equal the withholding list length (so we don’t have mismatched input lengths)
withholding tax must be less than or equal to 10**18 or else it will be marked as incorrect withholding tax.
/** * @notice Function to set withholding tax rates for investors * @param _investors Addresses of investors * @param _withholding Withholding tax for individual investors (multiplied by 10**16) */ function setWithholding( address[] memory _investors, uint256[] memory _withholding ) public withPerm(ADMIN)
This function allows the issuer to set the withholding tax rates for investors.
Requirement:
Withholding must be less than (or equal to) than 10**18 or else the function will return “Incorrect withholding tax”
/** * @notice Function to set withholding tax rates for investors * @param _investors Addresses of investor * @param _withholding Withholding tax for all investors (multiplied by 10**16) */ function setWithholdingFixed(address[] memory _investors, uint256 _withholding) public withPerm(ADMIN)
This function allows the issuer to push dividends to the provided list of addresses.
/**
* @notice Issuer can push dividends to provided addresses
* @param _dividendIndex Dividend to push
* @param _payees Addresses to which to push the dividend
*/
function pushDividendPaymentToAddresses(
uint256 _dividendIndex,
address payable[] memory _payees
)
public
withPerm(OPERATOR)
This function allows the issuer to push dividends to the provided list of addresses.
/**
* @notice Issuer can push dividends using the investor list from the security token
* @param _dividendIndex Dividend to push
* @param _start Index in investor list at which to start pushing dividends
* @param _end Index in investor list at which to stop pushing dividends
*/
function pushDividendPayment(
uint256 _dividendIndex,
uint256 _start,
uint256 _end
)
public
withPerm(OPERATOR)
This function allows investors to pull their own issued dividends. Note: If the dividend contract is paused then it will not allow investors to pull their dividends
/**
* @notice Investors can pull their own dividends
* @param _dividendIndex Dividend to pull
*/
function pullDividendPayment(uint256 _dividendIndex) public whenNotPaused This internal function allows for the payment of dividends.
/**
* @notice paying dividends
* @param _payee Address of investor
* @param _dividend Storage with previously issued dividends
* @param _dividendIndex Dividend to pay
*/
function _payDividend(address _payee, Dividend storage _dividend, uint256 _dividendIndex)
This function allows the issuer to reclaim the remaining unclaimed dividend amounts that have expired for investors.
/**
* @notice Issuer can reclaim remaining unclaimed dividend amounts, for expired dividends
* @param _dividendIndex Dividend to reclaim
*/
function reclaimDividend(uint256 _dividendIndex) external;
This function is used to calculate the number of dividends that are claimable.
Requirements:
Dividend Index must be less than the length of the dividend
Dividend storage size must be equal to the dividends index
/** * @notice Calculate amount of dividends claimable * @param _dividendIndex Dividend to calculate * @param _payee Affected investor address * @return claim, withheld amounts */ function calculateDividend(uint256 _dividendIndex, address _payee) public view returns(uint256, uint256)
This function returns the index according to the inputted checkpoint ID.
/**
* @notice Get the index according to the checkpoint id
* @param _checkpointId Checkpoint id to query
* @return uint256[]
*/
function getDividendIndex(uint256 _checkpointId) public view returns(uint256[] memory))
This function allows the issuer to withdraw withheld tax from the dividend index.
/**
* @notice Allows issuer to withdraw withheld tax
* @param _dividendIndex Dividend to withdraw from
*/
function withdrawWithholding(uint256 _dividendIndex) external; This function allows the issuer to change the maturity/expiry dates of a given dividendIndex.
/**
* @notice Allows issuer to change maturity/expiry dates for dividends
* @dev NB - setting the maturity of a currently matured dividend to a future date
* @dev will effectively refreeze claims on that dividend until the new maturity date passes
* @ dev NB - setting the expiry date to a past date will mean no more payments can be pulled
* @dev or pushed out of a dividend
* @param _dividendIndex Dividend to withdraw from
* @param _maturity updated maturity date
* @param _expiry updated expiry date
*/
function updateDividendDates(uint256 _dividendIndex, uint256 _maturity, uint256 _expiry) external withPerm(ADMIN)
The function used to change the treasury wallet address. It can only be called by the issuer.
/**
* @notice Function used to change wallet address
* @param _wallet Ethereum account address to receive reclaimed dividends and tax
*/
function changeWallet(address payable _wallet) external
getDividendsData()get all static dividend data.getDividendData(uint256 _dividendIndex)get static dividend data of a given dividendIndex.getDividendProgress(uint256 _dividendIndex)Retrieves list of investors, their claim status and whether they are excluded.getCheckpointData(uint256 _checkpointId)Retrieves list of investors, their balances, and their current withholding tax percentage.isExcluded(address _investor, uint256 _dividendIndex)Checks whether an address is excluded from claiming a dividend.isClaimed(address _investor, uint256 _dividendIndex)Checks whether an address has claimed a dividend.getTreasuryWallet()returns the treasury wallet address.
| Introduced in | 1.3.0 |
| Contract(s) name | EtherDividendCheckpoint.sol |
| Compatible ST Protocol version range | ^3.0.0 |
| Type | Checkpoint Module |
This checkpoint module for issuing ether dividends to investors.
This function allows the issuer to create a dividend and a corresponding checkpoint for that dividend. It requires a global list of excluded addresses.
/**
* @notice Creates a dividend and checkpoint for the dividend, using the global list of excluded addresses
* @param _maturity Time from which dividend can be paid
* @param _expiry Time until dividend can no longer be paid, and can be reclaimed by the issuer
* @param _name Name/title for identification
*/
function createDividend(uint256 _maturity, uint256 _expiry, bytes32 _name) external payable withPerm(ADMIN)
This function allows the issuer to create a dividend with a provided checkpoint. This function also requires a global list of excluded addresses.
/**
* @notice Creates a dividend with a provided checkpoint, using the global list of excluded addresses
* @param _maturity Time from which dividend can be paid
* @param _expiry Time until dividend can no longer be paid, and can be reclaimed by the issuer
* @param _checkpointId Id of the checkpoint from which to issue a dividend
* @param _name Name/title for identification
*/
function createDividendWithCheckpoint(
uint256 _maturity,
uint256 _expiry,
uint256 _checkpointId,
bytes32 _name
)
external
payable
withPerm(ADMIN)
This function is used to create a dividend and checkpoint for the dividend and also allows the issuer to define a specific list of explicitly excluded addresses.
/**
* @notice Creates a dividend and checkpoint for the dividend, specifying explicitly excluded addresses
* @param _maturity Time from which dividend can be paid
* @param _expiry Time until dividend can no longer be paid, and can be reclaimed by the issuer
* @param _excluded List of addresses to exclude
* @param _name Name/title for identification
*/
function createDividendWithExclusions(
uint256 _maturity,
uint256 _expiry,
address[] memory _excluded,
bytes32 _name
)
public
payable
withPerm(ADMIN)
This function is used to create a dividend with a provided checkpoint and also allows the issuer to define a specific list of explicitly excluded addresses.
Function Requirements:
Excluded address list needs to be less than or equal to the excluded address list limit
Dividend expiry must be greater than the maturity ("Expiry is before maturity")
Dividend expiry date must be greater than the present moment ("Expiry can’t be in the past")
Dividend sent must be greater than 0. ("No dividend sent")
The checkpointId must be less than or equal to the
ISecurityToken(securityToken).currentCheckpointId()Name cannot be 0
The zero address cannot be included in the excluded addresses list ("Invalid address")
Cannot dupe the system with excluded-address:
!dividends[dividendIndex].dividendExcluded[_excluded[j]]/** * @notice Creates a dividend with a provided checkpoint, specifying explicitly excluded addresses * @param _maturity Time from which dividend can be paid * @param _expiry Time until dividend can no longer be paid, and can be reclaimed by the issuer * @param _checkpointId Id of the checkpoint from which to issue a dividend * @param _excluded List of addresses to exclude * @param _name Name/title for identification */ function createDividendWithCheckpointAndExclusions( uint256 _maturity, uint256 _expiry, uint256 _checkpointId, address[] memory _excluded, bytes32 _name ) public payable withPerm(ADMIN)
This function allows the issuer to have the ability to reclaim remaining unclaimed dividend amounts, for expired investor dividends.
Function Requirements:
_dividendIndexmust be less than the dividends.length ("Incorrect dividend index")The current time period must be great than or equal to the dividends[_dividendIndex].expiry time ("Dividend expiry is in the future")
/** * @notice Issuer can reclaim remaining unclaimed dividend amounts, for expired dividends * @param _dividendIndex Dividend to reclaim */ function reclaimDividend(uint256 _dividendIndex) external withPerm(OPERATOR)
This function allows the issuer to withdraw the withheld tax. This collected tax will directly be transferred to the treasury wallet.
Requirements:
The dividendIndex must be less than the dividends.length ("Incorrect dividend index")
The Dividend storage dividend must equal the dividends[_dividendIndex]
/** * @notice Allows issuer to withdraw withheld tax * @param _dividendIndex Dividend to withdraw from */ function withdrawWithholding(uint256 _dividendIndex) external withPerm(OPERATOR)
| Introduced in | 1.3.0 |
| Contract(s) name | ERC20DividendCheckpoint.sol |
| Compatible ST Protocol version range | ^3.0.0 |
| Type | Checkpoint Module |
Checkpoint module for issuing ERC20 dividends. The function works by having a mapping to token addresses for each dividend.
This function allows the issuer to create a dividend and a corresponding checkpoint for that dividend. It requires a global list of excluded addresses.
/**
* @notice Creates a dividend and checkpoint for the dividend
* @param _maturity Time from which dividend can be paid
* @param _expiry Time until dividend can no longer be paid, and can be reclaimed by the issuer
* @param _token Address of ERC20 token in which dividend is to be denominated
* @param _amount Amount of specified token for dividend
* @param _name Name/Title for identification
*/
function createDividend(
uint256 _maturity,
uint256 _expiry,
address _token,
uint256 _amount,
bytes32 _name
)
external
withPerm(ADMIN)
This function allows the issuer to create a dividend with a provided checkpoint. This function also requires a global list of excluded addresses.
/**
* @notice Creates a dividend with a provided checkpoint
* @param _maturity Time from which dividend can be paid
* @param _expiry Time until dividend can no longer be paid, and can be reclaimed by issuer
* @param _token Address of ERC20 token in which dividend is to be denominated
* @param _amount Amount of specified token for dividend
* @param _checkpointId Checkpoint id from which to create dividends
* @param _name Name/Title for identification
*/
function createDividendWithCheckpoint(
uint256 _maturity,
uint256 _expiry,
address _token,
uint256 _amount,
uint256 _checkpointId,
bytes32 _name
)
external
withPerm(ADMIN)
This function is used to create a dividend and checkpoint for the dividend and also allows the issuer to define a specific list of explicitly excluded addresses.
/**
* @notice Creates a dividend and checkpoint for the dividend
* @param _maturity Time from which dividend can be paid
* @param _expiry Time until dividend can no longer be paid, and can be reclaimed by issuer
* @param _token Address of ERC20 token in which dividend is to be denominated
* @param _amount Amount of specified token for dividend
* @param _excluded List of addresses to exclude
* @param _name Name/Title for identification
*/
function createDividendWithExclusions(
uint256 _maturity,
uint256 _expiry,
address _token,
uint256 _amount,
address[] memory _excluded,
bytes32 _name
)
public
withPerm(ADMIN)
This function allows the issuer to create a dividend with a provided checkpoint ID.
Important Function Requirements:
Excluded address list needs to be less than or equal to the excluded address list limit
Dividend expiry must be greater than the maturity ("Expiry is before maturity")
Dividend expiry date must be greater than the present moment ("Expiry can’t be in the past")
Dividend sent must be greater than 0. ("No dividend sent")
The token cannot be the zero address(0) ("Invalid token")
checkpointId must be less than or equal to the
securityTokenInstance.currentCheckpointId()("Invalid checkpoint")IERC20(_token).transferFrom(msg.sender, address(this), _amount)needs to have enough allowance to make a transfer ("insufficient allowance")The name cannot be 0.
Cannot dupe the system with excluded-address:
!dividends[dividendIndex].dividendExcluded[_excluded[j]], "duped exclude address");/** * @notice Creates a dividend with a provided checkpoint * @param _maturity Time from which dividend can be paid * @param _expiry Time until dividend can no longer be paid, and can be reclaimed by issuer * @param _token Address of ERC20 token in which dividend is to be denominated * @param _amount Amount of specified token for dividend * @param _checkpointId Checkpoint id from which to create dividends * @param _excluded List of addresses to exclude * @param _name Name/Title for identification */ function createDividendWithCheckpointAndExclusions( uint256 _maturity, uint256 _expiry, address _token, uint256 _amount, uint256 _checkpointId, address[] memory _excluded, bytes32 _name ) public withPerm(ADMIN)
This function is used by the issuer in order to reclaim remaining unclaimed dividend amounts, specifically for expired dividends.
/**
* @notice Issuer can reclaim remaining unclaimed dividend amounts, for expired dividends
* @param _dividendIndex Dividend to reclaim
*/
function reclaimDividend(uint256 _dividendIndex) external withPerm(OPERATOR)
This function allows an issuer to withdraw the withheld tax.
/**
* @notice Allows issuer to withdraw withheld tax
* @param _dividendIndex Dividend to withdraw from
*/
function withdrawWithholding(uint256 _dividendIndex) external withPerm(OPERATOR)
CLI Installation
Running the CLI Features and Modules
- How to Use the POLY Faucet
- St-20 Generator
- STO Manager
- How to Use the Investor Portal
- Token Manager
- Transfer Feature
- Transfer Ownership
- Dividends Manager
- Transfer Manager
- Contract Manager
- Permission Manager
- Time Travel for Contract Testing
Modules
- LockupTransferManager
- VolumeRestrictionTransferManager
- BlacklistTransferManager
- ManualApprovalTransferManager
- CountTransferManager
- GeneralPermissionManager
- PercentageTransferManager
- GeneralTransferManager
- DividendCheckpointModules
- VestingEscrowWallet
- CappedSTO
- USDTieredSTO
- AdvancedPLCRVotingCheckpoint
- VotingCheckpointModules
- Schedule Checkpoint