コード例 #1
0
 public async Task TrackAsync(Script scriptPubkey)
 {
     await _RPCBatch.WaitTransactionAsync(async batch =>
     {
         await batch.ImportAddressAsync(scriptPubkey, "", false).ConfigureAwait(false);
         return(true);
     }).ConfigureAwait(false);
 }
コード例 #2
0
        public async Task <IDestination> GenerateAddressAsync()
        {
            BitcoinAddress address = null;
            await _RPCBatch.WaitTransactionAsync(async batch =>
            {
                address = await batch.GetNewAddressAsync().ConfigureAwait(false);
                return(true);
            }).ConfigureAwait(false);

            RPCResponse witAddress = null;
            await _RPCBatch.WaitTransactionAsync(async batch =>
            {
                witAddress = await _RPCClient.SendCommandAsync("addwitnessaddress", address.ToString()).ConfigureAwait(false);
                return(true);
            }).ConfigureAwait(false);

            return(BitcoinAddress.Create(witAddress.ResultString, _RPCClient.Network));
        }
コード例 #3
0
        private async Task <bool> TryBroadcastCoreAsync(Record tx, int currentHeight)
        {
            bool remove = false;

            try
            {
                remove = currentHeight >= tx.Expiration;

                //Happens when the caller does not know the previous input yet
                if (tx.Transaction.Inputs.Count == 0 || tx.Transaction.Inputs[0].PrevOut.Hash == uint256.Zero)
                {
                    return(false);
                }

                bool isFinal = tx.Transaction.IsFinal(DateTimeOffset.UtcNow, currentHeight + 1);
                if (!isFinal || IsDoubleSpend(tx.Transaction))
                {
                    return(false);
                }

                try
                {
                    await _RPCBatch.WaitTransactionAsync(async batch =>
                    {
                        await batch.SendRawTransactionAsync(tx.Transaction).ConfigureAwait(false);
                        return(true);
                    }).ConfigureAwait(false);

                    _Cache.ImportTransaction(tx.Transaction, 0);
                    Logs.Broadcasters.LogInformation($"Broadcasted {tx.Transaction.GetHash()}");
                    return(true);
                }
                catch (RPCException ex)
                {
                    if (ex.RPCResult == null || ex.RPCResult.Error == null)
                    {
                        return(false);
                    }
                    var error = ex.RPCResult.Error.Message;
                    if (ex.RPCResult.Error.Code != RPCErrorCode.RPC_TRANSACTION_ALREADY_IN_CHAIN &&
                        !error.EndsWith("bad-txns-inputs-spent", StringComparison.OrdinalIgnoreCase) &&
                        !error.EndsWith("txn-mempool-conflict", StringComparison.OrdinalIgnoreCase) &&
                        !error.EndsWith("Missing inputs", StringComparison.OrdinalIgnoreCase))
                    {
                        remove = false;
                    }
                }
                return(false);
            }
            finally
            {
                if (remove)
                {
                    RemoveRecord(tx);
                }
            }
        }
コード例 #4
0
        public async Task <IDestination> GenerateAddressAsync()
        {
            BitcoinAddress address = null;
            await _RPCBatch.WaitTransactionAsync(async batch =>
            {
                address = await batch.GetNewAddressAsync().ConfigureAwait(false);
                return(true);
            }).ConfigureAwait(false);

            return(address);
        }