public Decimal GetMinimumNonZeroTransactionFeeEstimate(Int16 numberOfInputs = 1, Int16 numberOfOutputs = 1) { CreateRawTransactionRequest rawTransactionRequest = new CreateRawTransactionRequest(new List<CreateRawTransactionInput>(numberOfInputs), new Dictionary<String, Decimal>(numberOfOutputs)); for (Int16 i = 0; i < numberOfInputs; i++) { rawTransactionRequest.AddInput(new CreateRawTransactionInput { TxId = "dummyTxId" + i.ToString(CultureInfo.InvariantCulture), Vout = i }); } for (Int16 i = 0; i < numberOfOutputs; i++) { rawTransactionRequest.AddOutput(new CreateRawTransactionOutput { Address = "dummyAddress" + i.ToString(CultureInfo.InvariantCulture), Amount = i + 1 }); } return GetTransactionFee(rawTransactionRequest, false, true); }
public Decimal GetTransactionFee(CreateRawTransactionRequest transaction, Boolean checkIfTransactionQualifiesForFreeRelay, Boolean enforceMinimumTransactionFeePolicy) { if (checkIfTransactionQualifiesForFreeRelay && IsTransactionFree(transaction)) { return 0; } Decimal transactionSizeInBytes = GetTransactionSizeInBytes(transaction); Decimal transactionFee = ((transactionSizeInBytes / Parameters.FreeTransactionMaximumSizeInBytes) + (transactionSizeInBytes % Parameters.FreeTransactionMaximumSizeInBytes == 0 ? 0 : 1)) * Parameters.FeePerThousandBytesInCoins; if (transactionFee.GetNumberOfDecimalPlaces() > Parameters.CoinsPerBaseUnit.GetNumberOfDecimalPlaces()) { transactionFee = Decimal.Round(transactionFee, Parameters.CoinsPerBaseUnit.GetNumberOfDecimalPlaces(), MidpointRounding.AwayFromZero); } if (enforceMinimumTransactionFeePolicy && Parameters.MinimumTransactionFeeInCoins != 0 && transactionFee < Parameters.MinimumTransactionFeeInCoins) { transactionFee = Parameters.MinimumTransactionFeeInCoins; } return transactionFee; }
public async Task<decimal> GetMinimumNonZeroTransactionFeeEstimate(short numberOfInputs = 1, short numberOfOutputs = 1) { var rawTransactionRequest = new CreateRawTransactionRequest(new List<CreateRawTransactionInput>(numberOfInputs), new Dictionary<string, decimal>(numberOfOutputs)); for (short i = 0; i < numberOfInputs; i++) { rawTransactionRequest.AddInput(new CreateRawTransactionInput { TxId = "dummyTxId" + i.ToString(CultureInfo.InvariantCulture), Vout = i }); } for (short i = 0; i < numberOfOutputs; i++) { rawTransactionRequest.AddOutput(new CreateRawTransactionOutput { Address = "dummyAddress" + i.ToString(CultureInfo.InvariantCulture), Amount = i + 1 }); } return await GetTransactionFee(rawTransactionRequest, false, true); }
public Boolean IsTransactionFree(CreateRawTransactionRequest transaction) { return transaction.Outputs.Any(x => x.Value < Parameters.FreeTransactionMinimumOutputAmountInCoins) && GetTransactionSizeInBytes(transaction) < Parameters.FreeTransactionMaximumSizeInBytes && GetTransactionPriority(transaction) > Parameters.FreeTransactionMinimumPriority; }
public Int32 GetTransactionSizeInBytes(CreateRawTransactionRequest transaction) { return GetTransactionSizeInBytes(transaction.Inputs.Count, transaction.Outputs.Count); }
public Decimal GetTransactionPriority(CreateRawTransactionRequest transaction) { if (transaction.Inputs.Count == 0) { return 0; } List<ListUnspentResponse> unspentInputs = (this as ICoinService).ListUnspent(0).ToList(); Decimal sumOfInputsValueInBaseUnitsMultipliedByTheirAge = transaction.Inputs.Select(input => unspentInputs.First(x => x.TxId == input.TxId)).Select(unspentResponse => (unspentResponse.Amount * Parameters.OneCoinInBaseUnits) * unspentResponse.Confirmations).Sum(); return sumOfInputsValueInBaseUnitsMultipliedByTheirAge / GetTransactionSizeInBytes(transaction); }
public String CreateRawTransaction(CreateRawTransactionRequest rawTransaction) { return _rpcConnector.MakeRequest<String>(RpcMethods.createrawtransaction, rawTransaction.Inputs, rawTransaction.Outputs); }