Token Release Update
It has been a very intensive period for our team that culminated in the successful token sale event which concluded in no more than 18 minutes. In this blog post, I would like to notify you about the process of releasing the tokens tomorrow. The token release is proceeding on the set timeline while respecting all terms toward contributors. Yet, despite all the good practices followed and two security audits performed, we had a case of unexpected behaviour of the token sale smart contract resulting in certain alterations. This required us to deploy a new smart contract for token distribution, which will not affect envisaged token attributes.
Overview of the process:
- All terms and key dates for the availability of the tokens remain the same.
- The token symbol used in the new contract will be TRAC (this will also show up in your wallet).
- You will receive newly minted TRAC tokens to your wallets by Jan 24th 15:00 UTC (following the initial timeline).
- Newly minted TRAC tokens will be transferable from Jan 24th 15:00 UTC on.
- TRACE tokens that are currently in your wallets will remain there (locked) due to the unexpected behaviour of the smart contract (see more below).
- Newly minted TRAC tokens will be the only tokens to have full functionality within the OriginTrail protocol ecosystem.
Unexpected smart contract behaviour
We have experienced a problem with the smart contract functioning as we were not able to call the function finishCrowdsale because an excess of ~9605,5 TRACE tokens got created during the token sale. This effectively means that TRACE tokens will not be able to get transferred and will remain locked in the wallets to which they were distributed. Instead, you will receive newly minted TRAC tokens to your wallets that will become transferable on Jan 24th 15:00 UTC.
The root of the problem is an overlook in the function that was verifying that no more than the total allowed number of tokens got minted. The value inserted for comparison was the total supply of tokens (500MM) rather than the total number of tokens for sale (250MM). This allowed the minting of a fraction of extra tokens.
require((token.totalSupply() + amount) <= TOTAL_NUM_TOKENS);
TOTAL_NUM_TOKENS should have been tokensForSale.
Audits and security practices
We have been taking the development of the smart contract with the highest priority and security measures.
Smart contracts were developed in-house using the foundation of the current standard contracts available on Token market and other audited contracts used by various projects. Existing contracts were then modified to our needs (particularity of vesting schedules and token sale phases). Our team wrote and ran, on several iterations, more than 40 automated and several manual tests to ensure the functioning of the contract and its security (tests can be found on our Github repo).
In addition to the tests, we have been closely working with third-party auditors that performed our code reviews. First auditing company we used was DLT Labs from Toronto followed by Hosho from Las Vegas (audits available here). Both were auditing the core contract code that included the function mentioned above. One feature that was added in the last days (pause functionality we needed to include due to a large number of addresses that had to be whitelisted — explained here) was audited by Hosho only.
Lastly, we also published a bug bounty programme to allow the community to try and find any shortcomings in the smart contracts.
Despite the best intentions, working with the best in the industry and all the checks in place, the function error slipped through.
Consequences and follow up
The smart contract error created no malfunction regarding security or loss of funds. All terms towards contributors will be respected, including the timeline for the release of the token. There are no long-term consequences for any of the parties involved.
We have discussed the next possible steps within our team and the auditing companies we were cooperating with. The final decision was to cooperate on the next steps with Hosho and perform the following actions:
- Creation of a new smart contract that will have all contributor data from the initial contract included.
- The new smart contract will substitute the symbol for the token, changing how it looks in your wallets. The new symbol is TRAC
- An expedited security audit of the new smart contract will be performed by Hosho.
- The excess ~9605,5 tokens created will be deducted from the founders’ pool, the total token supply remains unchanged.
- Deployment of the smart contract and distribution of the newly minted tokens will occur from Tuesday on.
- Unlocking the tokens will follow, as planned, on Jan 24th 15:00 UTC and making them transferable.
- We will distribute bounty tokens by Jan 26th 15:00 UTC latest.
I kindly ask for your understanding during the process.