Security Token

Token representing tokenized shares.

General Description

The security token represents the shares of a tokenized fund, and is associated to the instrument tokenizing this fund. Unlike the single settlement token, multiple security tokens exist, one for each instrument. The prices of these tokens are dependent on the NAVs of the underlying funds. Investors can subscribe to an instrument using settlement tokens in order to obtain the security tokens associated with that instrument. In a similar way, they can later redeem from an instrument using their security tokens, exchanging them for settlement tokens.

Token Details

Security tokens follow the ERC-20 standard, implementing its interface. Their details are as follows:

Name

(varies by instrument)

Symbol

(varies by instrument)

Decimals

18

Security tokens have 18 decimals, meaning 0.000000000000000001 is their lowest denomination. Their name and symbol are configured when their associated instrument is created, but they are also changeable by an admin. Additionally, they also extends the core ERC-20 functionality with heavy custom logic, particularly around what kinds of users are allowed to send and receive tokens.

Transfers

Transfers are performed to update the balances of users. As described in the ERC-20 specification, this can be done directly by the sender, or by a third party that has been approved to do so.

Transfer

  • Function: transfer(address to, uint256 amount)

  • Purpose: Allows a user to transfer tokens from their address balance to another address.

  • Parameters:

    • address to: Address of the recipient.

    • uint256 amount: The amount of security tokens to transfer.

  • Validation Checks:

    • Ensures the recipient is not the zero address.

    • Makes sure that the sender has a balance larger than the amount to be transferred.

    • Checks the amount transferred is more than zero.

    • Uses the rules engine to check the sender and recipient against the relevant modules in the Rule Modules.

    • Checks the sender and recipient against the Allowlist Modules.

  • Behavior:

    • Updates the balances of both addresses with the new amount of tokens for each.

    • Updates values around latest operations, holder counts, and investor balances.

    • Emits a Transfer event, signaling the transfer has occurred.

  • Return Values:

    • bool: Signals if the transfer has been completed successfully.

  • Example:

    transfer(0xRecepientAddress, 111);

Third Party Approval

  • Function: approve(address spender, uint256 amount)

  • Purpose: Allows a user to approve an address for a certain amount of tokens. The address can then transfer up to that amount of the investor's tokens.

  • Parameters:

    • address spender: Address being allowed to spend the users tokens.

    • uint256 amount: The amount of security tokens allowed.

  • Validation Checks:

    • Ensures the spender is not the zero address.

  • Behavior:

    • Updates the spender's approval amount for the user's tokens.

    • Emits an Approval event, signaling the approval has occurred.

  • Return Values:

    • bool: Signals if the approval has been completed successfully.

  • Example:

Third Party Transfer

  • Function: transferFrom(address from, address to, uint256 amount)

  • Purpose: Allows a third party to transfer tokens from one address to another, using their previous allowance.

  • Parameters:

    • address from: Address the tokens are transferred from.

    • address to: Address of the recipient.

    • uint256 amount: The amount of settlement tokens to transfer.

  • Validation Checks:

    • Ensures both addresses are not the zero address.

    • Makes sure that the address transferring from has a balance larger than the amount to be transferred.

    • Checks that the caller has an allowance for the transferring address larger than the amount to be transferred.

    • Checks the amount transferred is more than zero.

    • Uses the rules engine to check the sender and recipient against the relevant modules in the Rule Modules.

    • Checks the sender and recipient against the Allowlist Modulesusing the rules engine.

  • Behavior:

    • Updates the balances of both addresses with the new amount of tokens for each.

    • Updates values around latest operations, holder counts, and investor balances.

    • Emits a Transfer event, signaling the transfer has occurred.

  • Return Values:

    • bool: Signals if the transfer has been completed successfully.

  • Example:

Forced Transfer

  • Function: forceTransfer(address _from, address _to, uint256 _amount)

  • Purpose: Forces a transfer between addresses. Can only be called by the redemption book, and is used for forced redemptions.

  • Parameters:

    • address _from: Address the tokens are transferred from.

    • address _to: Address of the recipient.

    • uint256 _amount: The amount of settlement tokens to transfer.

  • Validation Checks:

    • Ensures both addresses are not the zero address.

    • Makes sure that the address transferring from has a balance larger than the amount to be transferred.

    • Verifies the caller is the redemption book.

    • Checks the amount transferred is more than zero.

    • Uses the rules engine to check the sender and recipient against the relevant modules in the Rule Modules.

    • Checks the sender and recipient against the Allowlist Modulesusing the rules engine.

  • Behavior:

    • Updates the balances of both addresses with the new amount of tokens for each.

    • Updates values around latest operations, holder counts, and investor balances.

    • Emits a Transfer event, signaling the transfer has occurred.

  • Example:

Supply Increase & Reduction

Issuing and burning tokens are the ways in which the total supply of a security tokens changes. They are used to keep the accounting accurate to the share balance held by KAIO in the corresponding underlying fund.

Issue

  • Function: issue(address _investor, uint256 _amount)

  • Purpose: Allows the subscription book to mint new security tokens to an investor's address. Used when settling subscriptions to reflect the shares held in the underlying fund.

  • Parameters:

    • address _investor: Address to mint the tokens to, belonging to an investor.

    • uint256 _amount: The amount of security tokens to mint.

  • Validation Checks:

    • Checks the caller is the subscription book.

    • Ensures the recipient is not the zero address.

    • Checks the amount to mint is more than zero.

    • Uses the rules engine to check the recipient against the relevant modules in the Rule Modules.

    • Checks the recipient against the Allowlist Modulesusing the rules engine.

  • Behavior:

    • Updates the balance of the recipient address with the new amount of tokens.

    • Updates values around latest operations, holder counts, and investor balances.

    • Stores the new supply for lookbacks.

    • Emits a Transfer event from the 0 address, signaling the mint has occurred.

  • Example:

Burn

  • Function: burn(uint256 _amount)

  • Purpose: Allows the redemption book to burn security tokens from their own balance. Used when settling redemptions, to destroy the redeemed tokens.

  • Parameters:

    • uint256 _amount: The amount of security tokens to burn.

  • Validation Checks:

    • Checks the caller is the redemption book.

    • Checks the amount to burn is more than zero.

    • Check the sender against the relevant modules in the Rule Modulesusing the rules engine.

    • Checks the sender against the Allowlist Modulesusing the rules engine.

  • Behavior:

    • Removes the burned tokens from the redemption book's balance.

    • Updates values around latest operations, holder counts, and investor balances.

    • Stores the new supply for lookbacks.

    • Emits a Transfer event to the 0 address, signaling the burn has occurred.

  • Example:

Lookbacks

Security tokens offer functions for performing lookbacks on the maximum balance for a given period of time. These functions are used by books and modules when calculating restrictions and fees.

Maximum Total Balance

  • Function: lookback(uint256 _timestamp)

  • Purpose: Returns the maximum total supply of the security token from the given timestamp to the current point in time, and the timestamp corresponding to when this maximum was registered.

  • Parameters:

    • uint256 _timestamp: Timestamp defining the lookback period.

  • Return Values:

    • uint256: Timestamp indicating when the maximum was registered.

    • uint256: Maximum token supply in the lookback.

  • Example:

Maximum Investor Balance

  • Function: investorLookback(bytes32 _investorId, uint256 _timestamp)

  • Purpose: Returns the maximum balance of security tokens held by an investor from the given timestamp to the current point in time. It also returns the timestamp corresponding to when this maximum was registered.

  • Parameters:

    • bytes32 _investorId: Id of the investor whose balance is being checked.

    • uint256 _timestamp: Timestamp defining the lookback period.

  • Return Values:

    • uint256: Timestamp indicating when the maximum was registered.

    • uint256: Maximum token balance for the investor in the lookback.

  • Example:

Configuration

Security tokens can be configured to change their behavior or qualities, such as with modifying their name and symbol.

Change Metadata

  • Function: changeNameAndSymbol(string calldata _name, string calldata _symbol, bytes32 _role)

  • Purpose: Allows an admin to change the name and symbol of a security token.

  • Parameters:

    • string _name: New token name.

    • string _symbol: New token symbol.

    • bytes32 _role: Role of the caller.

  • Validation Checks:

    • Checks the caller has the proper admin role.

  • Behavior:

    • Changes the token name.

    • Changes the token symbol.

    • Emits a NameAndSymbolChanged event, signaling the name and symbol have been changed.

  • Example:

Last updated