/// <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); }
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()); }
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()); }
private void TransferFrom(TransferFromInput input) { SetContractStateRequired(State.TokenContract, SmartContractConstants.TokenContractSystemName); State.TokenContract.TransferFrom.Send(input); }
private void TransferFrom(TransferFromInput input) { ValidateContractState(State.TokenContract, State.TokenContractSystemName.Value); State.TokenContract.TransferFrom.Send(input); }
private void TransferFrom(TransferFromInput input) { ValidateContractState(State.TokenContract, SmartContractConstants.TokenContractSystemName); State.TokenContract.TransferFrom.Send(input); }