public override Empty Donate(DonateInput input) { Assert(input.Amount > 0, "Invalid amount of donating."); if (State.TokenContract.Value == null) { State.TokenContract.Value = Context.GetContractAddressByName(SmartContractConstants.TokenContractSystemName); } var isNativeSymbol = input.Symbol == Context.Variables.NativeSymbol; State.TokenContract.TransferFrom.Send(new TransferFromInput { From = Context.Sender, To = isNativeSymbol ? State.TreasuryVirtualAddress.Value : Context.Self, Symbol = input.Symbol, Amount = input.Amount, Memo = "Donate to treasury." }); if (input.Symbol != Context.Variables.NativeSymbol) { ConvertToNativeToken(input.Symbol, input.Amount); } return(new Empty()); }
public override Empty Donate(DonateInput input) { State.TokenContract.TransferFrom.Send(new TransferFromInput { From = Context.Sender, Symbol = input.Symbol, Amount = input.Amount, To = Context.Self }); State.TokenContract.Approve.Send(new ApproveInput { Symbol = input.Symbol, Amount = input.Amount, Spender = State.TokenHolderContract.Value }); State.TokenHolderContract.ContributeProfits.Send(new ContributeProfitsInput { SchemeManager = Context.Self, Symbol = input.Symbol, Amount = input.Amount }); Context.Fire(new DonationReceived { From = Context.Sender, Symbol = input.Symbol, Amount = input.Amount, PoolContract = Context.Self }); var currentReceivedDividends = State.ReceivedDividends[Context.CurrentHeight]; if (currentReceivedDividends != null && currentReceivedDividends.Value.ContainsKey(input.Symbol)) { currentReceivedDividends.Value[input.Symbol] = currentReceivedDividends.Value[input.Symbol].Add(input.Amount); } else { currentReceivedDividends = new Dividends { Value = { { input.Symbol, input.Amount } } }; } State.ReceivedDividends[Context.CurrentHeight] = currentReceivedDividends; Context.LogDebug(() => $"Contributed {input.Amount} {input.Symbol}s to side chain dividends pool."); return(new Empty()); }
public override Empty Donate(DonateInput input) { Assert(input.Amount > 0, "Invalid amount of donating. Amount needs to be greater than 0."); if (State.TokenContract.Value == null) { State.TokenContract.Value = Context.GetContractAddressByName(SmartContractConstants.TokenContractSystemName); } if (State.TokenConverterContract.Value == null) { State.TokenConverterContract.Value = Context.GetContractAddressByName(SmartContractConstants.TokenConverterContractSystemName); } var isNativeSymbol = input.Symbol == Context.Variables.NativeSymbol; var connector = State.TokenConverterContract.GetConnector.Call(new TokenSymbol { Symbol = input.Symbol }); var canExchangeWithNativeSymbol = connector.RelatedSymbol != string.Empty; State.TokenContract.TransferFrom.Send(new TransferFromInput { From = Context.Sender, To = isNativeSymbol || !canExchangeWithNativeSymbol ? State.TreasuryVirtualAddress.Value : Context.Self, Symbol = input.Symbol, Amount = input.Amount, Memo = "Donate to treasury.", }); Context.Fire(new DonationReceived { From = Context.Sender, To = isNativeSymbol ? State.TreasuryVirtualAddress.Value : Context.Self, Symbol = input.Symbol, Amount = input.Amount, Memo = "Donate to treasury." }); if (input.Symbol != Context.Variables.NativeSymbol && canExchangeWithNativeSymbol) { ConvertToNativeToken(input.Symbol, input.Amount); } return(new Empty()); }
public override Empty Donate(DonateInput input) { Assert(input.Amount > 0, "Invalid amount of donating. Amount needs to be greater than 0."); if (State.TokenContract.Value == null) { State.TokenContract.Value = Context.GetContractAddressByName(SmartContractConstants.TokenContractSystemName); } if (State.TokenConverterContract.Value == null) { State.TokenConverterContract.Value = Context.GetContractAddressByName(SmartContractConstants.TokenConverterContractSystemName); } var isNativeSymbol = input.Symbol == Context.Variables.NativeSymbol; var canExchangeWithNativeSymbol = isNativeSymbol || State.TokenConverterContract.IsSymbolAbleToSell .Call(new StringValue { Value = input.Symbol }).Value; if (Context.Sender != Context.Self) { State.TokenContract.TransferFrom.Send(new TransferFromInput { From = Context.Sender, To = Context.Self, Symbol = input.Symbol, Amount = input.Amount, Memo = "Donate to treasury.", }); } var needToConvert = !isNativeSymbol && canExchangeWithNativeSymbol; if (needToConvert) { ConvertToNativeToken(input.Symbol, input.Amount); } else { State.TokenContract.Approve.Send(new ApproveInput { Symbol = input.Symbol, Amount = input.Amount, Spender = State.ProfitContract.Value }); State.ProfitContract.ContributeProfits.Send(new ContributeProfitsInput { SchemeId = State.TreasuryHash.Value, Symbol = input.Symbol, Amount = input.Amount }); var donatesOfCurrentBlock = State.DonatedDividends[Context.CurrentHeight]; if (donatesOfCurrentBlock != null && Context.Variables.NativeSymbol == input.Symbol && donatesOfCurrentBlock.Value.ContainsKey(Context.Variables.NativeSymbol)) { donatesOfCurrentBlock.Value[Context.Variables.NativeSymbol] = donatesOfCurrentBlock .Value[Context.Variables.NativeSymbol].Add(input.Amount); } else { donatesOfCurrentBlock = new Dividends { Value = { { input.Symbol, input.Amount } } }; } State.DonatedDividends[Context.CurrentHeight] = donatesOfCurrentBlock; Context.Fire(new DonationReceived { From = Context.Sender, Symbol = input.Symbol, Amount = input.Amount, PoolContract = Context.Self }); } return(new Empty()); }
public override Empty Donate(DonateInput input) { Assert(input.Amount > 0, "Invalid amount of donating. Amount needs to be greater than 0."); if (State.TokenContract.Value == null) { State.TokenContract.Value = Context.GetContractAddressByName(SmartContractConstants.TokenContractSystemName); } if (State.TokenConverterContract.Value == null) { State.TokenConverterContract.Value = Context.GetContractAddressByName(SmartContractConstants.TokenConverterContractSystemName); } var isNativeSymbol = input.Symbol == Context.Variables.NativeSymbol; var connector = State.TokenConverterContract.GetPairConnector.Call(new TokenSymbol { Symbol = input.Symbol }); var canExchangeWithNativeSymbol = connector.DepositConnector != null; if (Context.Sender != Context.Self) { State.TokenContract.TransferFrom.Send(new TransferFromInput { From = Context.Sender, To = Context.Self, Symbol = input.Symbol, Amount = input.Amount, Memo = "Donate to treasury.", }); } var needToConvert = !isNativeSymbol && canExchangeWithNativeSymbol; if (needToConvert) { ConvertToNativeToken(input.Symbol, input.Amount); } else { State.TokenContract.Approve.Send(new ApproveInput { Symbol = input.Symbol, Amount = input.Amount, Spender = State.ProfitContract.Value }); State.ProfitContract.ContributeProfits.Send(new ContributeProfitsInput { SchemeId = State.TreasuryHash.Value, Symbol = input.Symbol, Amount = input.Amount }); } Context.Fire(new DonationReceived { From = Context.Sender, To = State.TreasuryVirtualAddress.Value, Symbol = input.Symbol, Amount = input.Amount, Memo = "Donate to treasury." }); return(new Empty()); }