public override Empty Sell(SellInput input)
        {
            var fromConnector = State.Connectors[input.Symbol];

            Assert(fromConnector != null, "[Sell]Can't find from connector.");
            Assert(fromConnector.IsPurchaseEnabled, "can't purchase");
            var toConnector = State.Connectors[fromConnector.RelatedSymbol];

            Assert(toConnector != null, "[Sell]Can't find to connector.");
            var amountToReceive = BancorHelper.GetReturnFromPaid(
                GetSelfBalance(fromConnector), GetWeight(fromConnector),
                GetSelfBalance(toConnector), GetWeight(toConnector),
                input.Amount
                );

            var fee = Convert.ToInt64(amountToReceive * GetFeeRate());

            if (Context.Sender == Context.GetContractAddressByName(SmartContractConstants.TreasuryContractSystemName))
            {
                fee = 0;
            }

            var amountToReceiveLessFee = amountToReceive.Sub(fee);

            Assert(input.ReceiveLimit == 0 || amountToReceiveLessFee >= input.ReceiveLimit, "Price not good.");

            // Pay fee
            if (fee > 0)
            {
                HandleFee(fee);
            }

            // Transfer base token
            State.TokenContract.Transfer.Send(
                new TransferInput
            {
                Symbol = State.BaseTokenSymbol.Value,
                To     = Context.Sender,
                Amount = amountToReceive
            });
            State.DepositBalance[toConnector.Symbol] =
                State.DepositBalance[toConnector.Symbol].Sub(amountToReceive);
            // Transfer sold token
            State.TokenContract.TransferFrom.Send(
                new TransferFromInput
            {
                Symbol = input.Symbol,
                From   = Context.Sender,
                To     = Context.Self,
                Amount = input.Amount
            });
            Context.Fire(new TokenSold
            {
                Symbol     = input.Symbol,
                SoldAmount = input.Amount,
                BaseAmount = amountToReceive,
                FeeAmount  = fee
            });
            return(new Empty());
        }
        public override Empty Sell(SellInput input)
        {
            Assert(IsValidSymbol(input.Symbol), "Invalid symbol.");
            var fromConnector = State.Connectors[input.Symbol];

            Assert(fromConnector != null, "Can't find connector.");
            var toConnector     = State.Connectors[State.BaseTokenSymbol.Value];
            var amountToReceive = BancorHelpers.GetReturnFromPaid(
                GetSelfBalance(fromConnector), GetWeight(fromConnector),
                GetSelfBalance(toConnector), GetWeight(toConnector),
                input.Amount
                );

            var fee = Convert.ToInt64(amountToReceive * GetFeeRate());

            var amountToReceiveLessFee = amountToReceive.Sub(fee);

            Assert(input.ReceiveLimit == 0 || amountToReceiveLessFee >= input.ReceiveLimit, "Price not good.");

            // Pay fee
            if (fee > 0)
            {
                State.TokenContract.Transfer.Send(
                    new TransferInput()
                {
                    Symbol = State.BaseTokenSymbol.Value,
                    To     = State.FeeReceiverAddress.Value,
                    Amount = fee
                });
            }

            // Transafer base token
            State.TokenContract.Transfer.Send(
                new TransferInput()
            {
                Symbol = State.BaseTokenSymbol.Value,
                To     = Context.Sender,
                Amount = amountToReceiveLessFee
            });

            // Transafer sold token
            State.TokenContract.TransferFrom.Send(
                new TransferFromInput()
            {
                Symbol = input.Symbol,
                From   = Context.Sender,
                To     = Context.Self,
                Amount = input.Amount
            });
            Context.Fire(new TokenSold()
            {
                Symbol     = input.Symbol,
                SoldAmount = input.Amount,
                BaseAmount = amountToReceive,
                FeeAmount  = fee
            });
            return(new Empty());
        }