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());
        }
示例#2
0
        private long SellOperation(long paidRes)
        {
            var getReturnFromPaid = BancorHelpers.GetReturnFromPaid(
                _ramConnector.VirtualBalance, Decimal.Parse(_ramConnector.Weight),
                _elfConnector.VirtualBalance, Decimal.Parse(_elfConnector.Weight),
                paidRes);

            return(getReturnFromPaid);
        }
示例#3
0
 public void GetAmountToPay_GetReturnFromPaid_Failed()
 {
     //fromConnectorBalance <= 0
     Should.Throw <InvalidValueException>(() => BancorHelpers.GetAmountToPayFromReturn(0, 1000, 1000, 1000, 1000));
     //paidAmount <= 0
     Should.Throw <InvalidValueException>(() => BancorHelpers.GetAmountToPayFromReturn(1000, 1000, 1000, 1000, 0));
     //toConnectorBalance <= 0
     Should.Throw <InvalidValueException>(() => BancorHelpers.GetReturnFromPaid(1000, 1000, 0, 1000, 1000));
     //amountToReceive <= 0
     Should.Throw <InvalidValueException>(() => BancorHelpers.GetReturnFromPaid(1000, 1000, 1000, 1000, 0));
 }