Report on SOY IDO 17/11/2021 event

5 min readNov 17, 2021


Consecutive round endings

On 17/11/2021 three “daily” rounds of SOY token IDO ended within 30 minutes period.

This was the result of the fact that max_price upper bound was surpassed during these IDO rounds and therefore rounds ended ahead of scheduled time.


IDO Contracts work as intended. Funds are safe, there are no exploits in IDO. There was a mismatch with the description published in this article, we apologize for any inconveniences caused. Description will be fixed as soon as possible.

Here is the security audit report for IDO contract performed on 2/11/2021 by Dexaran:

IDO auction explained

IDO contracts follow the model of dutch auction. There are two versions of IDO contracts — one runs “daily” auctions, the other runs “weekly” ones. In fact, these auctions are expected to last 1 day or 1 week, but they can last longer or shorter if some special criteria are met (see the max_price and min_price criteria below).

  • 50% of “daily” rewards become available after the end of a round immediately and another 50% are locked for 1 year.
  • 30% of “weekly” rewards become available after the end of a round immediately and 70% are locked for 1 year.

IDO allocates a fixed amount of SOY tokens to be sold during a round (30,000 SOY tokens for a daily auction). Then it starts to collect funds (measured in USD). At the end of the auction round the IDO contract distributes SOY tokens to every contributor proportionally to their shares of USD pool.

Example: If there are 30,000 SOY tokens at the round and 15,000 USD were collected then the price of 1 SOY is 0.5 USD and a user who deposited 400 USD would receive 800 SOY tokens in exchange.

There are two parameters — min_price and max_price for each round and the IDO contract derives these values from the previous round according to the following formula:

min_price = 0.9 * previous_round_price

max_price = 1.6 * previous_round_price

There are additional rules for the IDO rounds:

1. If the amount of USD collected does not exceed the min_price then the round is extended — that’s why “daily” round can last longer than one day in theory. This can happen 3 times — on 4th round it finishes no matter what.

2. If the amount of USD collected exceeds the max_price then the round is finished immediately.

3. At the end of the round, max_price and min_price for the next round are adjusted based on the values at which the current round ended.

4th round of IDO started on November 12, 2021 10:00:00 PM +4 UTC and ended on November 16, 2021 10:00:00 PM +4 UTC — the data is transparently available to anyone and can be verified on-chain through the contract:

This round lasted 4 days, which means that it failed to raise the minimum required USD amount three times and was extended to 4 days from the original 1 day period.

At the end of the round there were 5882 USD collected in total and the pool of 31577 SOY was distributed among the participants of the round at 1 SOY per $0.186 ratio.

As the result, the following values were set for the round:

  • min_price of 0.186 * 0.9 = $0.167
  • max_price of 0.186 * 1.6 = $0.297

It appeared that the max_price of the 5th round was much lower than the market price of the SOY token traded on the exchange at that moment!

5th round started at 10:06:38 PM and ended 27 minutes after the start when 9573 USD were collected and 32122.1 SOY tokens were sold at 1 SOY per $0.298 price — which exceeded the max_price and thus triggered the end of the round.

6th round was configured to have a min_price of 0.298 * 0.9 = $0.268 and max_price of 0.298 * 1.6 = $0.476 (which was still lower than the market price of SOY that remained at $0.8 at that time). It is not surprising that a total of 32675 SOY tokens were sold at the max_price of 0.476 in a very short period of time and the round ended in 4 minutes.

For the 7th round, max_price was set above the market price. At this point, the system self-balanced and stabilized. This is how auction was supposed to find the resulting price.

This is worth to mention that only 50% of SOY became available to the participants of these rounds — another 50% is locked for 1 year.

Description/Documentation mismatch explained

At the moment of the IDO launch we had multiple variations of the contract discussed.

As the result, at the moment of the IDO launch a part of documentation was still in a “work in progress” state and the stable version of the IDO contract that passed a security audit and testing was not the latest one. The description published at soy-finance gitbook described a variation of the IDO contract that contained modifications of the auction process that were not implemented in the deployed IDO contract.

In particular, this phrase does not match the actual behavior of the contract:

Suppose the minimum price is not met for three consecutive rounds; In that case, the auction process will be canceled, and the deposits will be returned to the bidders.

— Description of the SOY IDO

In fact, the IDO contract will sell SOY tokens at any price if it was extended 3 times — even if the price is below market price or min_price value of the contract.

We congratulate those users who dived into the code or made correct observations of contract behavior and took advantage of this to acquire their SOY tokens through the IDO contract.

We apologize for the inconvenience this inappropriate description has caused and will resolve it like any other reported issue.

We do not plan to change the behavior of the contracts as these behave as intended. The logic of auction will stay unchanged and we encourage users to participate according to the current rules of the IDO.

The weekly auction can be subject to change or removal in the future (as we do not observe a lot of activity there) but it’s still under discussion and the official announcement will be made regarding the future rounds.

Any rounds of the auction will stay unchanged once started.