public static bool Sell(StorageContext context, byte[] owner, byte[] investor, BigInteger _amount)
        {
            if (owner.Length != 20 || investor.Length != 20)
            {
                return(false);
            }
            if (_amount <= 0)
            {
                return(false);
            }
            if (!Runtime.CheckWitness(owner))
            {
                return(false);
            }

            BigInteger buyPrice = BuyPrice(context);
            BigInteger amount   = _amount * Token.Factor() / buyPrice;
            uint       stage    = Stage(context);

            if (stage == 1)
            {
                amount += WithDiscount(amount, Discount(context));
            }
            else if (stage == 2)
            {
                if (DateTime.Now.Ticks <= (int)Storage.Get(context, START_TIME_KEY).AsBigInteger() + 24 * 60 * 60)
                {
                    if (DiscountFirstDay(context) == 0)
                    {
                        SetDiscountFirstDay(context, 20);
                    }

                    amount += WithDiscount(amount, DiscountFirstDay(context));
                }
                else
                {
                    amount += WithDiscount(amount, Discount(context));
                }
            }
            else if (stage == 3)
            {
                amount += WithDiscount(amount, Discount(context));
            }

            if (Tokens(context) < amount)
            {
                CrowdsaleFinished(CrowdsaleStatus(context));
                Pausable.Pause(context);

                return(false);
            }

            SetTokens(context, Tokens(context) - amount);
            Token.SetAvailableSupply(context, Token.AvailableSupply(context) - amount);

            return(Token.Transfer(context, owner, investor, amount));
        }
 public static bool StartCrowd(StorageContext context, BigInteger tokens, uint startTime, uint endTime, uint discount, uint discountFirstDay)
 {
     SetTokens(context, tokens * Token.Factor());
     SetStartTime(context, startTime);
     SetEndTime(context, endTime);
     SetDiscount(context, discount);
     SetDiscountFirstDay(context, discountFirstDay);
     SetStage(context, 1);
     Pausable.Unpause(context);
     return(true);
 }