Security Token Standard

Github Join Telegram

What is a Security Token?

A Security Token shares many of the characteristics of both fungible (erc20) and non-fungible tokens (erc721). Security tokens are designed to represent complete or fractional ownership interests in assets and/or entities. While utility tokens have no limitations on who can send or receive the token, security tokens are subject to many restrictions based on identity, jurisdiction and asset category.

How do they differ from utility tokens?

The concept of utility tokens is fairly well understood in the blockchain space today. Utility tokens represent access to a network, and your token purchase represents the ability to buy goods or services from that network — kind of like purchasing a game token being used to play an arcade machine. Utility tokens give you that same type of access but just to a product or service.

On the other hand, security tokens represent complete or fractional ownership in an asset (such as shares in a company, a real-estate asset, artwork, etc). Having a stake in a company, real estate, or intellectual property can all be represented by security tokens. Security tokens offer the benefit of bringing significant transparency over traditional paper shares through the use of the blockchain and its associated public ledger. Security token structure, distribution, or changes that could affect investors are now accessible to all via the blockchain.

Security tokens and the digitalised assets they represent ownership will form the backbone of finance 3.0 driving innovation, adoption and accessibility across the financial sector.

Without A Standard

Security Tokens will never be adopted in any meaningful way if issuers, investors, KYC providers, wallets, exchanges, regulators and developers cannot work together within the same framework.

With A Standard

Security Tokens can become the default form for all financial securities. In the same way that the ERC-20 standard helped to create the boom in utility tokens, the security token standard will help drive the boom in security tokens. All participants in the ecosystem will be able to speak the same language and become confident building on this new and exciting technology.

Security Token Roundtable

The Security Token Roundtable was held to drive forward the conversation around technical, legal & regulatory opportunities and challenges associated with issuing, lifecycle events and the trading of securities on public ledgers. Building standards in this space provides the bedrock needed to ramp up adoption and establish regulatory compliance in this massive and emerging use-case for blockchain based public ledgers. Click here to read more

ERC 1400 - Security Token Standard

A proposed standard for security tokens - incorporating differentiated ownership, error signalling, document references, gate keeper (operator) access control and issuance / redemption semantics.

Authors: Adam Dossa, Pablo Ruiz, Stephane Gosselin, Fabian Vogelsteller

ERC 1400 - Security Token Standard

ERC 1410 - Partially Fungible Token Standard

/// @title IERCST Security Token Standard (EIP 1400)
/// @dev See

interface IERCST is IERCPFT {

    // Document Management
    function getDocument(bytes32 _name) external view returns (string, bytes32);
    function setDocument(bytes32 _name, string _uri, bytes32 _documentHash) external;

    // Controller Operation
    function isControllable() external view returns (bool);

    // Token Issuance
    function isIssuable() external view returns (bool);
    function issueByTranche(bytes32 _tranche, address _tokenHolder, uint256 _amount, bytes _data) external;
    event IssuedByTranche(bytes32 indexed tranche, address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData);

    // Token Redemption
    function redeemByTranche(bytes32 _tranche, uint256 _amount, bytes _data) external;
    function operatorRedeemByTranche(bytes32 _tranche, address _tokenHolder, uint256 _amount, bytes _operatorData) external;
    event RedeemedByTranche(bytes32 indexed tranche, address indexed operator, address indexed from, uint256 amount, bytes operatorData);

    // Transfer Validity
    function canSend(address _from, address _to, bytes32 _tranche, uint256 _amount, bytes _data) external view returns (byte, bytes32, bytes32);


/// @title ERC-1410 Partially Fungible Token Standard
/// @dev See

interface IERC1410 is IERC777 {

    // Token Information
    function balanceOfByTranche(bytes32 _tranche, address _tokenHolder) external view returns (uint256);
    function tranchesOf(address _tokenHolder) external view returns (bytes32[]);

    // Token Transfers
    function sendByTranche(bytes32 _tranche, address _to, uint256 _amount, bytes _data) external returns (bytes32);
    function sendByTranches(bytes32[] _tranches, address _to, uint256[] _amounts, bytes _data) external returns (bytes32[]);
    function operatorSendByTranche(bytes32 _tranche, address _from, address _to, uint256 _amount, bytes _data, bytes _operatorData) external returns (bytes32);
    function operatorSendByTranches(bytes32[] _tranches, address _from, address _to, uint256[] _amounts, bytes _data, bytes _operatorData) external returns (bytes32[]);

    // Default Tranche Management
    function getDefaultTranches(address _tokenHolder) external view returns (bytes32[]);
    function setDefaultTranche(bytes32[] _tranches) external;

    // Operators
    function defaultOperatorsByTranche(bytes32 _tranche) external view returns (address[]);
    function authorizeOperatorByTranche(bytes32 _tranche, address _operator) external;
    function revokeOperatorByTranche(bytes32 _tranche, address _operator) external;
    function isOperatorForTranche(bytes32 _tranche, address _operator, address _tokenHolder) external view returns (bool);

    // Transfer Events
    event SentByTranche(
        bytes32 indexed fromTranche,
        address operator,
        address indexed from,
        address indexed to,
        uint256 amount,
        bytes data,
        bytes operatorData

    event ChangedTranche(
        bytes32 indexed fromTranche,
        bytes32 indexed toTranche,
        uint256 amount,

    // Operator Events
    event AuthorizedOperator(address indexed operator, address indexed tokenHolder);
    event RevokedOperator(address indexed operator, address indexed tokenHolder);

    event AuthorizedOperatorByTranche(bytes32 indexed tranche, address indexed operator, address indexed tokenHolder);
    event RevokedOperatorByTranche(bytes32 indexed tranche, address indexed operator, address indexed tokenHolder);


The Security Token Standard started as a draft written by @adamdossa, @pabloruiz55, @frozeman, and more at the Security Token Roundtable

This Security Token Standard has since moved out of beta and into a community formalized ERC, supported and endorsed by a large number of projects from across the crypto ecosystem and traditional security market participants. This ERC wouldn't be possible without the time and dedication from a number of community members.

Security Token Standard Supporters

Projects Supporting the Security Token Standard


Perkins Coie, LLP





VStock Transfer








Security Token Network


Verify Investor







Start Contributing to the Security Token Standard

View Guidelines