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()); }