Ejemplo n.º 1
0
        /// <summary>
        /// Because Profit Contract Addresses in different chains are different,
        /// so we use a property (is_profitable) in TokenInfo in order to indicate whether
        /// Profit Contract Address of current chain should be in the white list or not.
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        private bool IsContributingProfits(TransferFromInput input)
        {
            var tokenInfo = Context.Call <TokenInfo>(Context.Self, nameof(GetTokenInfo), new GetTokenInfoInput
            {
                Symbol = input.Symbol
            }.ToByteString());

            if (!tokenInfo.IsProfitable)
            {
                return(false);
            }

            if (Context.Sender == Context.GetContractAddressByName(SmartContractConstants.ProfitContractSystemName) ||
                Context.Sender ==
                Context.GetContractAddressByName(SmartContractConstants.TreasuryContractSystemName) // For main chain.
                )
            {
                // Sender is Profit Contract, wants to transfer tokens from general ledger virtual address
                // to period virtual address or sub schemes.
                return(true);
            }

            var tokenHolderContractAddress =
                Context.GetContractAddressByName(SmartContractConstants.TokenHolderContractSystemName);

            if (Context.Sender == tokenHolderContractAddress && input.To == tokenHolderContractAddress)
            {
                // Sender is Token Holder Contract, wants to transfer tokens from DApp Contract to himself.
                return(true);
            }

            return(false);
        }
Ejemplo n.º 2
0
        public override Empty TransferFrom(TransferFromInput input)
        {
            AssertValidToken(input.Symbol, input.Amount);
            // First check allowance.
            var allowance = State.Allowances[input.From][Context.Sender][input.Symbol];

            if (allowance < input.Amount)
            {
                if (IsInWhiteList(new IsInWhiteListInput {
                    Symbol = input.Symbol, Address = Context.Sender
                }).Value ||
                    IsContributingProfits(input))
                {
                    DoTransfer(input.From, input.To, input.Symbol, input.Amount, input.Memo);
                    return(new Empty());
                }

                Assert(false,
                       $"[TransferFrom]Insufficient allowance. Token: {input.Symbol}; {allowance}/{input.Amount}.\n" +
                       $"From:{input.From}\tSpender:{Context.Sender}\tTo:{input.To}");
            }

            DoTransfer(input.From, input.To, input.Symbol, input.Amount, input.Memo);
            State.Allowances[input.From][Context.Sender][input.Symbol] = allowance.Sub(input.Amount);
            return(new Empty());
        }
Ejemplo n.º 3
0
        public override Empty TransferFrom(TransferFromInput input)
        {
            AssertValidToken(input.Symbol, input.Amount);

            // First check allowance.
            var allowance = State.Allowances[input.From][Context.Sender][input.Symbol];

            if (allowance < input.Amount)
            {
                if (IsInWhiteList(new IsInWhiteListInput {
                    Symbol = input.Symbol, Address = Context.Sender
                }).Value)
                {
                    DoTransfer(input.From, input.To, input.Symbol, input.Amount, input.Memo);
                    return(new Empty());
                }
                Assert(false, "Insufficient allowance.");
            }

            DoTransfer(input.From, input.To, input.Symbol, input.Amount, input.Memo);
            State.Allowances[input.From][Context.Sender][input.Symbol] = allowance.Sub(input.Amount);
            return(new Empty());
        }
Ejemplo n.º 4
0
 private void TransferFrom(TransferFromInput input)
 {
     SetContractStateRequired(State.TokenContract, SmartContractConstants.TokenContractSystemName);
     State.TokenContract.TransferFrom.Send(input);
 }
Ejemplo n.º 5
0
 private void TransferFrom(TransferFromInput input)
 {
     ValidateContractState(State.TokenContract, State.TokenContractSystemName.Value);
     State.TokenContract.TransferFrom.Send(input);
 }
Ejemplo n.º 6
0
 private void TransferFrom(TransferFromInput input)
 {
     ValidateContractState(State.TokenContract, SmartContractConstants.TokenContractSystemName);
     State.TokenContract.TransferFrom.Send(input);
 }