ERC-981: An Advanced Interface for Fractional Ownership

Unless you have been returning to the earth from a secret NASA mission, you will have heard about Bitcoin, Ethereum. The blockchain network has been dominating the technology sector for the last few years. Entrepreneurs from all around the world are trying to utilize this technology for various use cases.

Many of you have noticed that one project is using ERC-20 and at the same time another project is using ERC-721 but Why? Why doesn’t everyone use a common ERC token?

Confused with different types of Ethereum tokens? Don’t be.

What is an Ethereum token?

Before we go in further deep, let’s be clear what tokens are in the Ethereum ecosystem. Ethereum token is a packet of information of who owns that. The Ethereum token is just an entry into a smart contract and the information of the token owner is recorded into the contract.

These tokens will never be in your wallet like bitcoin instead these tokens will work as a data entry into the smart contract database.

But when we go deep into these tokens and their classifications, sometimes we see application X is using ERC-20 or application Y is using ERC-721 or ERC-223 etc.

So then what are these different Ethereum tokens ERC-20, ERC-721, etc? 

These are interfaces or let’s say a packet of information with specific commands into the smart contract. Each token type contains a set of information which is recorded in the contract database. When someone says they have “ERC-20 token” that just means they store a specific set of information into the contract and command corresponding functions.

An ERC-20 token is an interface which commands 6 basic functions. It is the first simplest interface on Ethereum ecosystem and later became the industry standard. This interface has already been employed by various projects. In fact, all of the projects in the Top 20 Ethereum Tokens are ERC-20 tokens.

The interface of ERC-20:

pragma solidity ^0.4.18;

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 {
  function totalSupply() public view returns (uint256);
  
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
 
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  
  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

The ERC-20 token is a fungible token standard. Now, what is a fungible token? Basically, it means all the ERC-20 tokens are the same and can be interchangeable with another ERC-20 similar to bitcoin or fiat currency. One of the most common use cases of the ERC-20 token is Initial Coin Offering (ICO).

Later in 2017, ERC-721 became famous due to the popularity of Ethereum-based collectibles game, CryptoKitties.

Like ERC-20 this is an interface: what it can do. ERC-721 defines a set of functions that the token contract can do that involve the movement, ownership, and information about non-fungible items.

The interface of ERC-721:

pragma solidity ^0.4.18;

/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Basic {
  event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
  event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
  event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);  

  function balanceOf(address _owner) public view returns (uint256 _balance);
  function ownerOf(uint256 _tokenId) public view returns (address _owner);
  function exists(uint256 _tokenId) public view returns (bool _exists);
  
  function approve(address _to, uint256 _tokenId) public;
  function getApproved(uint256 _tokenId) public view returns (address _operator);
  
  function setApprovalForAll(address _operator, bool _approved) public;
  function isApprovedForAll(address _owner, address _operator) public view returns (bool);

  function transferFrom(address _from, address _to, uint256 _tokenId) public;
  function safeTransferFrom(address _from, address _to, uint256 _tokenId) public;  
  function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) public;
}

ERC-721 tokens are the non-fungible type tokens which mean each token is unique and non-interchangeable with another token. For example – In real estate, each property is unique and can’t be substituted with another property. We can use ERC-721 tokens to represent those properties and their owners. We have already developed a POC solution using the ERC-721 token for title registration in the real estate sector.

These current Ethereum tokens while useful leave out key aspects of information needed to enable tokenized trade of real-world assets on distributed ledger technology. For example in the case of issuing multiple tokens for a digital asset or fractional ownership of an asset can’t be represented by ERC-20 or ERC-721 interfaces due to their own limitations.

Here comes the ERC-981 interface for fractional ownership of an asset.

What is ERC-981 token? 

An ERC-981 token is also an interface like ERC-20 or ERC-721 which allows splitting ownership of any digital asset. It’s a mixture of ERC-20 and ERC-721 tokens and this interface allow the owner of a fungible ERC-20 to exchange specific units with non-fungible ERC 721 tokens as long as the seller and buyer agree on a value assignment mechanism for each asset.

For example – A football league can issue multiple tokens for each team and anyone can buy these tokens and have fractional ownership of the team. Here each team will be represented as ERC-721 non-fungible asset with multiple ERC-20 tokens.

The interface of ERC-981:

pragma solidity ^0.4.19;

contract ERC {
    // Events
    event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);

    // Methods
    function divide(uint256 , address[] _owners, uint256[] amounts, string[] types, string[] metadata, bytes[] sigs) public payable;
    function merge(uint256[] _tokenIds, uint256 amount, string type, string metadata, bytes[] sigs) public payable;
    function transfer(address _to, uint256 _tokenId, bytes[] sigs) public payable;
    
    function balanceOf(address _owner) public view returns (uint256 _balance);
    function owners() public view returns (address[] _owners);
    function ownerOf(uint256 _tokenId) public view returns (address owner);
    function getToken(uint256 _tokenId) public view returns (address _owner, uint256 _amount, string _type, string _metadata);
    function totalTokens(address _owner) public view returns (uint256 _totalTokens);
    function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256 _tokenId);
    
    // identity hash
    function getIdentity(address _owner) public view returns (bytes32 _key);
    
    // OPTIONAL
    function name() public view returns (string _name);
    function symbol() public view returns (string _symbol);
    function decimals() public view returns (uint8 _decimals);
    
    function tokenMetadata(uint256 _tokenId) public view returns (string infoUrl);
}

This interface can be used in various application such as property fractional ownerships, crowdfunding or alternative option of ICO for money raising.

Based on this interface, we have developed a basic model for fundraising for real estate properties. It will enable issuers to reach more investors and reduce the cost by eliminating third-party integration. In the next blog, I will explain how we utilized ERC-981 interface as a security token.

In case you are a company looking to solve inefficiencies in your business, write to me at mohit@jalantechnologies.com to learn how we can help. Stay Tuned!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s