The ICO or Initial Coin Offering economy is doing very well, with many organizations raising tens or hundreds of millions in a very short duration. There are also much more mainstream media coverage and scrutiny from regulators world wide now. This has led to some changes in the structure of ICOs. Here, we will look at the recently concluded Kyber Network ICO which raised 200,000 ether (USD 56 million).

ICO structure

Compared to the 2 ICOs that we have covered previously, BAT and Bancor, there are stricter restrictions around participant eligibility for Kyber. The permitted allocations are distributed as follows.

* The private presale exchange rate might not be accurate because it includes marketing/community bounties and extra minted tokens which will be burned later.

Due to regulatory reasons, all participants have to go through a know your customer (KYC) process where real world identities are being verified and certain countries are excluded. Your Ethereum account will then be whitelisted in the ICO contract and funds from non whitelisted accounts will be rejected. To ensure all whitelisted participants have a chance to join the ICO, there are individual caps on each account. The cap is such that for 24 hours, you are guaranteed an amount of KNC if you choose to join the ICO. This mitigates the race condition and network congestion seen in previous ICOs. This also enables a more diverse group of token holders from the start.

ICO round 1

Below we take a closer look at the individual caps for the 70 accounts whitelisted for 15,560 ether and their contribution in round 1 of the ICO, where contribution are limited by caps.

The chart shows all but 1 account joined the ICO and most joined for their entire cap. Next we look at the majority of participants (22,279 accounts), whose individual caps are only 3.6 ether (USD 1,000).

The chart shows that close to 88% of the accounts used up their cap and less than 5% did not join the ICO. The remaining unsold KNC from accounts that did not join the ICO or did not fill their cap is about 5,600 ether worth. This is where it gets interesting. These KNC are sold in round 2 where there are no individual caps meaning it is possible for any account to obtain much more KNC, with a little bit of knowledge and preparation. In fact, one account managed to get almost half of this remaining KNC.

ICO round 2

First we take a look at the amount of funds raised against time.

As observed, most of the participants joined the ICO early. As expected, the remaining KNC in round 2 was bought swiftly as seen from the almost vertical curve near the end. Interestingly, this did not occur right after the cap is removed but about 30 minutes later. This is due to a maximum gasPrice of 50 shannon restriction imposed by the ICO contract.

require( tx.gasprice <= 50000000000 wei );

This prevents prioritizing your transaction with a higher fee to get a higher chance of grabbing the remaining KNC. Right after the cap removal, there was a flood of transactions on the network with a slightly higher gasPrice , these transactions were included in the blocks and confirmed before those valid ICO transactions, resulting in a delay. However, even with a whitelist and maximum gasPrice , there were still ways in which you could exponentially increase your chances of grabbing the remaining KNC.

To simplify the explanation, for example when you send 5 transactions at once, think of it as they could be processed either in series or in parallel. In series means that your 2nd transaction depends on your 1st transaction, so your 2nd transaction has a lower priority than someone’s else 1st transaction. In parallel would mean that all your 5 transactions have the same priority as someone’s else 1st transaction. Thus we would want to create parallel transactions to increase our chances of grabbing the remaining KNC. For this ICO, there were 3 ways to do that.

First we look at the series transactions which were used by the majority of participants. With just 1 whitelisted account, you could send e.g. 5 transactions normally at once to the ICO. However as Ethereum transactions have to be processed in sequence according to their nonce, each transaction is dependent on the previous and have a lower priority than the previous transaction. If you have managed to whitelist 5 accounts, you could instead send 1 transaction from each account. These are parallel transactions since they do not depend on each other thus have the same priority as someone’s else first transaction. Although real world identities were used as KYC in this ICO, we have observed instances where accounts most likely belonged to the same entity. In the Kyber ICO contract, it is actually possible to send from a non whitelisted account as long as you included the whitelisted account details. This can be done by calling the buy(address) function instead of calling the default function by just sending ether with no data. Thus even with just 1 whitelisted account, you could send 5 transactions from 5 different non whitelisted accounts, thereby creating parallel transactions. Instead of whitelisting a normal account, you could have whitelisted a contract account. This enables you to send 5 transactions from 5 different non whitelisted accounts. These transactions call your whitelisted contract which in turn calls the ICO contract. From the ICO contract’s point of view, it is a whitelisted account. Since these 5 transactions does not depend on each other, they are parallel transactions. In our analysis, only 2 contracts were whitelisted. 1 of them will go on to grab almost half of the remaining KNC.

The following diagram summaries the 4 methods above.

Next we take a look at the transactions that made it in round 2.

54 transactions made into round 2 with some of them from the same entity. All 4 methods described above were used. Even with only a few entities using parallel transactions compared to thousands who used the series transactions, they have managed to grab an outsize proportion of the remaining KNC.

One of our functions is building analytics on Ethereum,

Contact us at contact@codetract.io

Visit us at https://codetract.io

Follow us on Twitter and Medium for more updates!