Security Token contract (SecurityToken.sol)
View Source: contracts/tokens/SecurityToken.sol
↗ Extends: ERC20, ReentrancyGuard, SecurityTokenStorage, IERC1594, IERC1643, IERC1644, IERC1410, Proxy ↘ Derived Contracts: MockSecurityTokenLogic, SecurityTokenMock
SecurityToken
SecurityToken is an ERC1400 token with added capabilities:
Events
Modifiers
checkGranularity
Arguments
Name | Type | Description |
_value | uint256 |
Functions
Arguments
Name | Type | Description |
initialize
⤿ Overridden Implementation(s): SecurityTokenMock.initialize
Initialization function
Arguments
Name | Type | Description |
_getterDelegate | address |
isModule
Checks if an address is a module of certain type
Arguments
Name | Type | Description |
_module | address | Address to check |
_type | uint8 | type to check against |
_onlyModuleOrOwner
Arguments
Name | Type | Description |
_type | uint8 |
_isValidPartition
Arguments
Name | Type | Description |
_partition | bytes32 |
_isValidOperator
Arguments
Name | Type | Description |
_from | address | |
_operator | address | |
_partition | bytes32 |
_zeroAddressCheck
Arguments
Name | Type | Description |
_entity | address |
_isValidTransfer
Arguments
Name | Type | Description |
_isTransfer | bool |
_isValidRedeem
Arguments
Name | Type | Description |
_isRedeem | bool |
_isSignedByOwner
Arguments
Name | Type | Description |
_signed | bool |
_isIssuanceAllowed
Arguments
Name | Type | Description |
_onlyController
Arguments
Name | Type | Description |
_isAuthorised
Arguments
Name | Type | Description |
_authorised | bool |
_onlyOwner
Throws if called by any account other than the owner.
Arguments
Name | Type | Description |
_onlyModule
Require msg.sender to be the specified module type
Arguments
Name | Type | Description |
_type | uint8 |
addModuleWithLabel
⤿ Overridden Implementation(s): MockSecurityTokenLogic.addModuleWithLabel
Attachs a module to the SecurityToken
Arguments
Name | Type | Description |
_moduleFactory | address | is the address of the module factory to be added |
_data | bytes | is data packed into bytes used to further configure the module (See STO usage) |
_maxCost | uint256 | max amount of POLY willing to pay to the module. |
_budget | uint256 | max amount of ongoing POLY willing to assign to the module. |
_label | bytes32 | custom module label. |
_archived | bool |
_addModuleData
Arguments
Name | Type | Description |
_moduleTypes | uint8[] | |
_moduleFactory | address | |
_module | address | |
_moduleCost | uint256 | |
_budget | uint256 | |
_label | bytes32 | |
_archived | bool |
addModule
addModule function will call addModuleWithLabel() with an empty label for backward compatible
Arguments
Name | Type | Description |
_moduleFactory | address | |
_data | bytes | |
_maxCost | uint256 | |
_budget | uint256 | |
_archived | bool |
archiveModule
Archives a module attached to the SecurityToken
Arguments
Name | Type | Description |
_module | address | address of module to archive |
upgradeModule
Upgrades a module attached to the SecurityToken
Arguments
Name | Type | Description |
_module | address | address of module to archive |
upgradeToken
Upgrades security token
Arguments
Name | Type | Description |
unarchiveModule
Unarchives a module attached to the SecurityToken
Arguments
Name | Type | Description |
_module | address | address of module to unarchive |
removeModule
Removes a module attached to the SecurityToken
Arguments
Name | Type | Description |
_module | address | address of module to unarchive |
withdrawERC20
Allows the owner to withdraw unspent POLY stored by them on the ST or any ERC20 token.
Arguments
Name | Type | Description |
_tokenContract | address | Address of the ERC20Basic compliance token |
_value | uint256 | amount of POLY to withdraw |
changeModuleBudget
allows owner to increase/decrease POLY approval of one of the modules
Arguments
Name | Type | Description |
_module | address | module address |
_change | uint256 | change in allowance |
_increase | bool | true if budget has to be increased, false if decrease |
updateTokenDetails
updates the tokenDetails associated with the token
Arguments
Name | Type | Description |
_newTokenDetails | string | New token details |
changeGranularity
Allows owner to change token granularity
Arguments
Name | Type | Description |
_granularity | uint256 | granularity level of the token |
changeDataStore
Allows owner to change data store
Arguments
Name | Type | Description |
_dataStore | address | Address of the token data store |
changeName
Allows owner to change token name
Arguments
Name | Type | Description |
_name | string | new name of the token |
changeTreasuryWallet
Allows to change the treasury wallet address
Arguments
Name | Type | Description |
_wallet | address | Ethereum address of the treasury wallet |
_adjustInvestorCount
Keeps track of the number of non-zero token holders
Arguments
Name | Type | Description |
_from | address | sender of transfer |
_to | address | receiver of transfer |
_value | uint256 | value of transfer |
freezeTransfers
freezes transfers
Arguments
Name | Type | Description |
unfreezeTransfers
Unfreeze transfers
Arguments
Name | Type | Description |
_adjustBalanceCheckpoints
Internal - adjusts token holder balance at checkpoint before a token transfer
Arguments
Name | Type | Description |
_investor | address | address of the token holder affected |
transfer
⤾ overrides ERC20.transfer
Overloaded version of the transfer function
Returns
bool success
Arguments
Name | Type | Description |
_to | address | receiver of transfer |
_value | uint256 | value of transfer |
transferWithData
⤾ overrides IERC1594.transferWithData
Transfer restrictions can take many forms and typically involve on-chain rules or whitelists. However for many types of approved transfers, maintaining an on-chain list of approved transfers can be cumbersome and expensive. An alternative is the co-signing approach, where in addition to the token holder approving a token transfer, and authorised entity provides signed data which further validates the transfer.
Arguments
Name | Type | Description |
_to | address | address The address which you want to transfer to |
_value | uint256 | uint256 the amount of tokens to be transferred |
_data | bytes | The |
for the token contract to interpret or record. This could be signed data authorising the transfer (e.g. a dynamic whitelist) but is flexible enough to accomadate other use-cases. |
_transferWithData
Arguments
Name | Type | Description |
_from | address | |
_to | address | |
_value | uint256 | |
_data | bytes |
transferFrom
⤾ overrides ERC20.transferFrom
Overloaded version of the transferFrom function
Returns
bool success
Arguments
Name | Type | Description |
_from | address | sender of transfer |
_to | address | receiver of transfer |
_value | uint256 | value of transfer |
transferFromWithData
⤾ overrides IERC1594.transferFromWithData
Transfer restrictions can take many forms and typically involve on-chain rules or whitelists. However for many types of approved transfers, maintaining an on-chain list of approved transfers can be cumbersome and expensive. An alternative is the co-signing approach, where in addition to the token holder approving a token transfer, and authorised entity provides signed data which further validates the transfer.
Arguments
Name | Type | Description |
_from | address | address The address which you want to send tokens from |
_to | address | address The address which you want to transfer to |
_value | uint256 | uint256 the amount of tokens to be transferred |
_data | bytes | The |
for the token contract to interpret or record. This could be signed data authorising the transfer (e.g. a dynamic whitelist) but is flexible enough to accomadate other use-cases. |
balanceOfByPartition
⤾ overrides IERC1410.balanceOfByPartition
Get the balance according to the provided partitions
Returns
Amount of tokens as per the given partitions
Arguments
Name | Type | Description |
_partition | bytes32 | Partition which differentiate the tokens. |
_tokenHolder | address | Whom balance need to queried |
_balanceOfByPartition
Arguments
Name | Type | Description |
_partition | bytes32 | |
_tokenHolder | address | |
_additionalBalance | uint256 |
transferByPartition
⤾ overrides IERC1410.transferByPartition
Transfers the ownership of tokens from a specified partition from one address to another address
Returns
The partition to which the transferred tokens were allocated for the _to address
Arguments
Name | Type | Description |
_partition | bytes32 | The partition from which to transfer tokens |
_to | address | The address to which to transfer tokens to |
_value | uint256 | The amount of tokens to transfer from |
_data | bytes | Additional data attached to the transfer of tokens |
_transferByPartition
Arguments
Name | Type | Description |
_from | address | |
_to | address | |
_value | uint256 | |
_partition | bytes32 | |
_data | bytes | |
_operator | address | |
_operatorData | bytes |
_returnPartition
Arguments
Name | Type | Description |
_beforeBalance | uint256 | |
_afterBalance | uint256 | |
_value | uint256 |
authorizeOperator
⤾ overrides IERC1410.authorizeOperator
Authorises an operator for all partitions of msg.sender
. NB - Allowing investors to authorize an investor to be an operator of all partitions but it doesn't mean we operator is allowed to transfer the LOCKED partition values. Logic for this restriction is written in operatorTransferByPartition()
function.
Arguments
Name | Type | Description |
_operator | address | An address which is being authorised. |
revokeOperator
⤾ overrides IERC1410.revokeOperator
Revokes authorisation of an operator previously given for all partitions of msg.sender
. NB - Allowing investors to authorize an investor to be an operator of all partitions but it doesn't mean we operator is allowed to transfer the LOCKED partition values. Logic for this restriction is written in operatorTransferByPartition()
function.
Arguments
Name | Type | Description |
_operator | address | An address which is being de-authorised |
authorizeOperatorByPartition
⤾ overrides IERC1410.authorizeOperatorByPartition
Authorises an operator for a given partition of msg.sender
Arguments
Name | Type | Description |
_partition | bytes32 | The partition to which the operator is authorised |
_operator | address | An address which is being authorised |
revokeOperatorByPartition
⤾ overrides IERC1410.revokeOperatorByPartition
Revokes authorisation of an operator previously given for a specified partition of msg.sender
Arguments
Name | Type | Description |
_partition | bytes32 | The partition to which the operator is de-authorised |
_operator | address | An address which is being de-authorised |
operatorTransferByPartition
⤾ overrides IERC1410.operatorTransferByPartition
Transfers the ownership of tokens from a specified partition from one address to another address
Returns
The partition to which the transferred tokens were allocated for the _to address
Arguments
Name | Type | Description |
_partition | bytes32 | The partition from which to transfer tokens. |
_from | address | The address from which to transfer tokens from |
_to | address | The address to which to transfer tokens to |
_value | uint256 | The amount of tokens to transfer from |
_data | bytes | Additional data attached to the transfer of tokens |
_operatorData | bytes | Additional data attached to the transfer of tokens by the operator |
_validateOperatorAndPartition
Arguments
Name | Type | Description |
_partition | bytes32 | |
_from | address | |
_operator | address |
_updateTransfer
Updates internal variables when performing a transfer
Returns
bool success
Arguments
Name | Type | Description |
_from | address | sender of transfer |
_to | address | receiver of transfer |
_value | uint256 | value of transfer |
_data | bytes | data to indicate validation |
_executeTransfer
Validate transfer with TransferManager module if it exists
Returns
bool
Arguments
Name | Type | Description |
_from | address | sender of transfer |
_to | address | receiver of transfer |
_value | uint256 | value of transfer |
_data | bytes | data to indicate validation |
freezeIssuance
Permanently freeze issuance of this security token.
Arguments
Name | Type | Description |
_signature | bytes |
issue
⤾ overrides IERC1594.issue
This function must be called to increase the total supply (Corresponds to mint function of ERC20).
Arguments
Name | Type | Description |
_tokenHolder | address | The account that will receive the created tokens (account should be whitelisted or KYCed). |
_value | uint256 | The amount of tokens need to be issued |
_data | bytes | The |
_issue
Arguments
Name | Type | Description |
_tokenHolder | address | |
_value | uint256 | |
_data | bytes |
issueMulti
issue new tokens and assigns them to the target _tokenHolder.
Returns
success
Arguments
Name | Type | Description |
_tokenHolders | address[] | A list of addresses to whom the minted tokens will be dilivered |
_values | uint256[] | A list of number of tokens get minted and transfer to corresponding address of the investor from _tokenHolders[] list |
issueByPartition
⤾ overrides IERC1410.issueByPartition
Increases totalSupply and the corresponding amount of the specified owners partition
Arguments
Name | Type | Description |
_partition | bytes32 | The partition to allocate the increase in balance |
_tokenHolder | address | The token holder whose balance should be increased |
_value | uint256 | The amount by which to increase the balance |
_data | bytes | Additional data attached to the minting of tokens |
redeem
⤾ overrides IERC1594.redeem
This function redeem an amount of the token of a msg.sender. For doing so msg.sender may incentivize using different ways that could be implemented with in the redeem
function definition. But those implementations are out of the scope of the ERC1594.
Arguments
Name | Type | Description |
_value | uint256 | The amount of tokens need to be redeemed |
_data | bytes | The |
_redeem
Arguments
Name | Type | Description |
_from | address | |
_value | uint256 | |
_data | bytes |
redeemByPartition
⤾ overrides IERC1410.redeemByPartition
Decreases totalSupply and the corresponding amount of the specified partition of msg.sender
Arguments
Name | Type | Description |
_partition | bytes32 | The partition to allocate the decrease in balance |
_value | uint256 | The amount by which to decrease the balance |
_data | bytes | Additional data attached to the burning of tokens |
_redeemByPartition
Arguments
Name | Type | Description |
_partition | bytes32 | |
_from | address | |
_value | uint256 | |
_operator | address | |
_data | bytes | |
_operatorData | bytes |
operatorRedeemByPartition
⤾ overrides IERC1410.operatorRedeemByPartition
Decreases totalSupply and the corresponding amount of the specified partition of tokenHolder
Arguments
Name | Type | Description |
_partition | bytes32 | The partition to allocate the decrease in balance. |
_tokenHolder | address | The token holder whose balance should be decreased |
_value | uint256 | The amount by which to decrease the balance |
_data | bytes | Additional data attached to the burning of tokens |
_operatorData | bytes | Additional data attached to the transfer of tokens by the operator |
_checkAndBurn
Arguments
Name | Type | Description |
_from | address | |
_value | uint256 | |
_data | bytes |
redeemFrom
⤾ overrides IERC1594.redeemFrom
This function redeem an amount of the token of a msg.sender. For doing so msg.sender may incentivize using different ways that could be implemented with in the redeem
function definition. But those implementations are out of the scope of the ERC1594.
Arguments
Name | Type | Description |
_tokenHolder | address | The account whose tokens gets redeemed. |
_value | uint256 | The amount of tokens need to be redeemed |
_data | bytes | The |
createCheckpoint
Creates a checkpoint that can be used to query historical balances / totalSuppy
Returns
uint256
Arguments
Name | Type | Description |
setController
Used by the issuer to set the controller addresses
Arguments
Name | Type | Description |
_controller | address | address of the controller |
disableController
Used by the issuer to permanently disable controller functionality
Arguments
Name | Type | Description |
_signature | bytes |
canTransfer
⤾ overrides IERC1594.canTransfer
Transfers of securities may fail for a number of reasons. So this function will used to understand the cause of failure by getting the byte value. Which will be the ESC that follows the EIP 1066. ESC can be mapped with a reson string to understand the failure cause, table of Ethereum status code will always reside off-chain
Returns
byte Ethereum status code (ESC)
Arguments
Name | Type | Description |
_to | address | address The address which you want to transfer to |
_value | uint256 | uint256 the amount of tokens to be transferred |
_data | bytes | The |
canTransferFrom
⤾ overrides IERC1594.canTransferFrom
Transfers of securities may fail for a number of reasons. So this function will used to understand the cause of failure by getting the byte value. Which will be the ESC that follows the EIP 1066. ESC can be mapped with a reson string to understand the failure cause, table of Ethereum status code will always reside off-chain
Returns
byte Ethereum status code (ESC)
Arguments
Name | Type | Description |
_from | address | address The address which you want to send tokens from |
_to | address | address The address which you want to transfer to |
_value | uint256 | uint256 the amount of tokens to be transferred |
_data | bytes | The |
_canTransfer
Arguments
Name | Type | Description |
_from | address | |
_to | address | |
_value | uint256 | |
_data | bytes |
canTransferByPartition
⤾ overrides IERC1410.canTransferByPartition
The standard provides an on-chain function to determine whether a transfer will succeed, and return details indicating the reason if the transfer is not valid.
Returns
ESC (Ethereum Status Code) following the EIP-1066 standard
Arguments
Name | Type | Description |
_from | address | The address from whom the tokens get transferred. |
_to | address | The address to which to transfer tokens to. |
_partition | bytes32 | The partition from which to transfer tokens |
_value | uint256 | The amount of tokens to transfer from |
_data | bytes | Additional data attached to the transfer of tokens |
setDocument
⤾ overrides IERC1643.setDocument
Used to attach a new document to the contract, or update the URI or hash of an existing attached document
Arguments
Name | Type | Description |
_name | bytes32 | Name of the document. It should be unique always |
_uri | string | Off-chain uri of the document from where it is accessible to investors/advisors to read. |
_documentHash | bytes32 | hash (of the contents) of the document. |
removeDocument
⤾ overrides IERC1643.removeDocument
Used to remove an existing document from the contract by giving the name of the document.
Arguments
Name | Type | Description |
_name | bytes32 | Name of the document. It should be unique always |
isControllable
⤾ overrides IERC1644.isControllable
In order to provide transparency over whether controllerTransfer
/ controllerRedeem
are useable or not isControllable
function will be used.
Returns
bool true
when controller address is non-zero otherwise return false
.
Arguments
Name | Type | Description |
controllerTransfer
⤾ overrides IERC1644.controllerTransfer
This function allows an authorised address to transfer tokens between any two token holders. The transfer must still respect the balances of the token holders (so the transfer must be for at most balanceOf(_from)
tokens) and potentially also need to respect other transfer restrictions.
Arguments
Name | Type | Description |
_from | address | Address The address which you want to send tokens from |
_to | address | Address The address which you want to transfer to |
_value | uint256 | uint256 the amount of tokens to be transferred |
_data | bytes | data to validate the transfer. (It is not used in this reference implementation |
because use of _data
parameter is implementation specific). | | _operatorData | bytes | data attached to the transfer by controller to emit in event. (It is more like a reason string for calling this function (aka force transfer) which provides the transparency on-chain). |
controllerRedeem
⤾ overrides IERC1644.controllerRedeem
This function allows an authorised address to redeem tokens for any token holder. The redemption must still respect the balances of the token holder (so the redemption must be for at most balanceOf(_tokenHolder)
tokens) and potentially also need to respect other transfer restrictions.
Arguments
Name | Type | Description |
_tokenHolder | address | The account whose tokens will be redeemed. |
_value | uint256 | uint256 the amount of tokens need to be redeemed. |
_data | bytes | data to validate the transfer. (It is not used in this reference implementation |
because use of _data
parameter is implementation specific). | | _operatorData | bytes | data attached to the transfer by controller to emit in event. (It is more like a reason string for calling this function (aka force transfer) which provides the transparency on-chain). |
_implementation
⤾ overrides Proxy._implementation
Arguments
Name | Type | Description |
updateFromRegistry
Arguments
Name | Type | Description |
owner
Returns
the address of the owner.
Arguments
Name | Type | Description |
isOwner
Returns
true if msg.sender
is the owner of the contract.
Arguments
Name | Type | Description |
transferOwnership
Allows the current owner to transfer control of the contract to a newOwner.
Arguments
Name | Type | Description |
newOwner | address | The address to transfer ownership to. |
_transferOwnership
Transfers control of the contract to a newOwner.
Arguments
Name | Type | Description |
newOwner | address | The address to transfer ownership to. |
_isSuccess
Check if a status code represents success (ie: 0x*1)
Returns
successful A boolean representing if the status code represents success
Arguments
Name | Type | Description |
status | bytes1 | Binary ERC-1066 status code |
Last updated