Ejemplo n.º 1
0
        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());
        }
Ejemplo n.º 3
0
        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());
        }
Ejemplo n.º 5
0
        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());
        }