We’ve just launched support for 43 new ERC-20 tokens, more than doubling the total number of tokens we cover to 81. This means that our compliance and investigation tools can now help you understand what’s happening with 97% of the total value in ERC-20s and over $1 billion of ERC-20 transfers every day.
As of February 2020 there are 244,697 ERC-20 tokens live on Ethereum. By far and away it’s the most popular way to issue a cryptocurrency. So why is Chainalysis only supporting 81 ERC-20 tokens at the moment? In this post we’ll provide some technical background on the ERC-20 standard, why it’s a bad idea to try and support them all, and how we choose which tokens to add support for first.
But what are ERC-20s?
One of the reasons for the explosion in ERC-20 tokens and their widespread adoption is that you don’t need deep technical understanding to use them, trade them or even launch one yourself. Of course, this is also why we see such a variation in the quality of these tokens as well.
‘ERC-20’ is a technical standard for creating a token on the Ethereum blockchain. ‘ERC’ stands for ‘Ethereum Request for Comments’, inspired by the Internet Engineering Task Force’s Request For Comment documents, some of which became pivotal internet standards.
ERCs go through a process of peer review and discussion within the Ethereum community. If they pass through this gauntlet successfully and garner enough support, they become a finalised Ethereum Improvement Proposal (EIP).
ERC-20 was the twentieth ‘Request for Comments’ but the first one to become an accepted standard. Written by Fabian Vogelsteller and Vitalik Buterin in 2015, it’s gone on to become the most widely used of the standards.
One of the things that differentiates Ethereum from Bitcoin is that it can run programs. The so-called smart contracts that run on the Ethereum Virtual Machine allow decentralised applications to be built on top of the Ethereum blockchain, rather than requiring their own blockchain.
ERC-20 describes a standard for writing smart contracts that function as tokens. It provides a programmatic interface for basic functionality to transfer tokens and allow third parties to spend the token (important if you want anyone other than yourself to use your token!).
Specifically, an ERC-20 smart contract must implement at least the following 6 functions and 2 events.
- totalSupply() - returns the total supply of the token
- balanceOf(address _owner) - returns the account balance with address ‘_owner’
- transfer(address _to, uint256 _value) - transfers ‘_value’ amount of tokens from the function caller’s account to address ‘_to’, and fires the Transfer event.
- transferFrom(address _from, address _to, uint256 _value) - transfers ‘_value’ amount of tokens from address ‘_from’ to address ‘_to’, and fires the Transfer event. This function is used by contracts allowed to transfer tokens on your behalf.
- approve(address _spender, uint256 _value) - allows the owner of address ‘_spender’ to withdraw tokens from your account, up to the ‘_value’ amount. A successful call must fire the Approval event.
- allowance(address _owner, address _spender) - returns the amount that ‘_spender’ is still allowed to withdraw from ‘_owner’.
- Transfer(address _from, address _to, uint256 _value)
- Approval(address _owner, address _spender, uint256 _value)
There are three optional functions:
- name() - returns the name of the token, ‘MyMadeupToken’
- symbol() - returns the symbol of the token, e.g. ‘TOK’
- decimals() - returns the number of decimal places the token uses.
Importantly, ERC-20 compliant smart contracts are allowed to have additional functions performing extra capabilities.
Why does Chainalysis need to add ERC-20s if Ethereum is already supported?
ETH is the native token of the Ethereum blockchain and is what transaction fees are paid in. We’ve tracked over $353 billion worth of Ether transfers conducted by more than 600 entities. Our products provide information on every transfer of ETH ever made.
If Alice wants to perform a basic ERC-20 token transfer to Bob, no ETH is transferred between the two of them. Alice just executes the transfer function of the token’s smart contract and pays the transaction fee, which also covers the gas for the smart contract computation. This transfer function updates the balances for Alice and Bob stored in a data structure within the token’s smart contract.
This means that capturing any token’s transfers requires a completely separate technical process from capturing Ether flows. We need to manually deconstruct the token’s smart contract code and understand what happens each time someone triggers one of its functions. Then we need to parse the event logs generated per Ethereum block to see if any Transfer events have taken place for that particular token.
Why don’t you just automatically support them all?
ERC-20 is a technical standard so it has precise specifications for the functions and events of a token smart contract as detailed above.
For example, the integral transfer(address _to, uint256 _value) function deducts the numerical amount of the token equal to ‘_value’ from the function caller’s balance and adds it to the balance controlled by the owner of Ethereum address ‘_to’.
Each time one of the smart contract functions is called, the request is included by miners in a block. For the transfer and approve functions, a corresponding event is emitted in the logs to record that the function took place.
So, if the standard specifies how all the important token functionality works, then surely engineers as smart as ours at Chainalysis can just create a script to automatically process any ERC-20 Transfer event, regardless of token? That is possible, and we believe some of our competitors may do it. However, this is a fundamentally flawed approach for a simple reason - not all ERC-20 tokens are the same.
First off, unlike other EIPs that are embedded in the core blockchain protocol or APIs, smart contract standards cannot be enforced. There’s nothing stopping the coder of a token smart contract picking and choosing the methods they want. You could even code a smart contract with the exact same names as the ERC-20 methods but completely different, or even malicious, functionalities.
Some popular tokens are only partially ERC-20 compliant. For example, the GNT Golem Network Token does not implement the approve(...), allowance(..) and transferFrom(...) functions, or the Approval(...) event.
Additionally, plenty of tokens have extra functionality on top of the ERC-20 specified methods. These can significantly affect the flow of funds. For example MANA, Decentraland’s token that we’ve just added, has Mint and Burn events. If you don’t capture additional events correctly, then funds will be appearing and disappearing all over the place and flows will be misleading or outright incorrect.
Another popular example is USDT (Tether), which has the highest trading volume of any ERC-20 token. Apart from the regular Transfer event, this token has an initial supply instantiated in its contract constructor. It also has additional Issue, Redeem and Destroyed events that significantly change the supply if not tracked. Plus, getting slightly more technical, the Destroyed event is parsed in a completely different way in the event logs as compared to the other events due to the way it’s implemented in the contract.
Missing even tiny value transfers can cause massive issues as they accrete and have knock on effects on addresses further down the flow of funds. This causes the inaccuracy in balances and transfers of entities to balloon, resulting in completely unreliable data.
Here’s just one example: token issuers can affect the total supply by minting or burning tokens, which can have an effect on price similar to stock buy-backs or dilutions. By looking at the Coin Generation cluster of a token in Chainalysis Reactor, it’s straightforward to see the outstanding supply and spot suspicious changes or reconcile a stablecoin’s claims against their real-world assets.
This is why we have a partially automated process for onboarding new ERC-20 tokens into our systems. Every single token we support has been thoroughly investigated by our blockchain experts to make sure we’ve captured every single nuance. We don’t support a token unless we are sure you can depend on our insights.
How do you choose which tokens to support?
Since we can’t automatically support every ERC-20, we need to ruthlessly prioritise which ones we include in each of our quarterly batches.
Chainalysis’ mission is to create transparency for a global economy built on blockchains. Cryptocurrencies need greater trust and transparency to achieve their full transformative potential. We contribute to this through our compliance and investigation tools as well as our expert education and support.
To further our mission, we prioritise supporting the coins currently providing the most utility to the most people. This way, we can be as effective as possible in providing value to not just our own customers, but all actors in the cryptocurrency ecosystem. We can then accelerate the growth and reach of cryptocurrency, helping all different kinds of people transact in new and better ways.
Our coin prioritisation process therefore is based on two pillars:
- Transferring the most value
- Usefulness to our customers
Let’s briefly explore each below.
Transferring the most value
Although cryptocurrencies have a myriad of different use cases, the core application is to transfer value between people. Of course, “value” is a subjective concept and there may be automated actors in between the people transacting. But as a first order approximation, the total dollar-equivalent value being transferred between entities is a proxy for the usefulness people are getting from a cryptocurrency.
We pay a lot of attention to ERC-20s’ daily trading volumes and prioritise those with consistently higher volume. We factor in on and off-chain volumes, taking steps to filter out wash-trading and inflated reports of trading volume.
Daily trading volume matters because in addition to having different technical implementations, ERC-20 tokens also have different levels of usage. In fact, usage is heavily concentrated within the top tokens. Tether, a US dollar stablecoin, currently makes up 75% of all ERC-20 traded value (as of February 27, 2020). Just 15 tokens make up 90% of the remaining volume.
As you can see from the graph above, the trading volumes follow the Pareto principle (or more mathematically, a power law distribution). This means we can make an outsized difference to our coverage of ERC-20s by focusing on delivering high-quality insights on the few tokens being traded the most.
Usefulness to customers
Our goal is to help global institutions understand and operate within the cryptocurrency ecosystem. That means we pay a lot of attention to the coins that are most useful to our customers specifically.
Usually for our customers who handle cryptocurrencies themselves, such as exchanges and custodians, the coins and tokens being traded the most are the most useful for us to support.
The situation can be different for our customers in law enforcement, compliance, and regulation. Sometimes, the coins most useful to these customers aren’t just the ones being traded the most — they can also be the coins that are the dodgiest. Just because we support a token doesn’t mean it’s squeaky clean. Sometimes, it’s exactly the opposite!
As you may have noticed, we haven’t mentioned anything to do with technical superiority, coin governance, consensus mechanisms, etc. We don’t base our support on the quality of the token or underlying organisations, but rather on the needs of our customers.
We really do take customer feedback on board — many of the recently added coins were specifically asked for by customers. So, if there’s a token you would really like us to support please contact your customer success representative!
In summary, ERC-20 may be a token standard, but you can’t take a token standardised approach to ERC-20s. Our focus at Chainalysis is on delivering useful insights our customers can act on, so we prioritise data quality and supporting the most useful coins. Our unique position in the cryptocurrency ecosystem, however, means that we judge the usefulness of coins and tokens by different standards from other players!