///<inheritdoc /> public ITransferResult TransferFunds(ISmartContractState smartContractState, Address addressTo, ulong amountToTransfer, TransferFundsToContract contractDetails) { this.logger.LogTrace("({0}:{1},{2}:{3})", nameof(addressTo), addressTo, nameof(amountToTransfer), amountToTransfer); // TODO: Spend BaseFee here var balance = smartContractState.GetBalance(); if (balance < amountToTransfer) { this.logger.LogTrace("(-)[INSUFFICIENT_BALANCE]:{0}={1}", nameof(balance), balance); throw new InsufficientBalanceException(); } // Discern whether this is a contract or an ordinary address. byte[] contractCode = this.contractStateRepository.GetCode(addressTo.ToUint160(this.network)); if (contractCode == null || contractCode.Length == 0) { this.internalTransferList.Add(new TransferInfo { From = smartContractState.Message.ContractAddress.ToUint160(this.network), To = addressTo.ToUint160(this.network), Value = amountToTransfer }); this.logger.LogTrace("(-)[TRANSFER_TO_SENDER]:Transfer {0} from {1} to {2}.", smartContractState.Message.ContractAddress, addressTo, amountToTransfer); return(TransferResult.Empty()); } this.logger.LogTrace("(-)[TRANSFER_TO_CONTRACT]"); return(ExecuteTransferFundsToContract(contractCode, smartContractState, addressTo, amountToTransfer, contractDetails)); }
/// <summary> /// Throws an exception if a contract doesn't have a high enough balance to make this transaction. /// </summary> private void EnsureContractHasEnoughBalance(ISmartContractState smartContractState, ulong amountToTransfer) { ulong balance = smartContractState.GetBalance(); if (balance < amountToTransfer) { this.logger.LogTrace("(-)[INSUFFICIENT_BALANCE]:{0}={1}", nameof(balance), balance); throw new InsufficientBalanceException(); } }