public async Task <BitcoinSecret> DumpPrivKeyAsync(BitcoinAddress address)
        {
            RPCResponse response = await SendCommandAsync(RPCOperations.dumpprivkey, address.ToString()).ConfigureAwait(false);

            return(this.Network.Parse <BitcoinSecret>((string)response.Result));
        }
        // getaccountaddress

        public BitcoinAddress GetAccountAddress(string account)
        {
            RPCResponse response = SendCommand(RPCOperations.getaccountaddress, account);

            return(this.Network.Parse <BitcoinAddress>((string)response.Result));
        }
        /// <summary>
        /// Sign a transaction
        /// </summary>
        /// <param name="tx">The transaction to be signed</param>
        /// <returns>The signed transaction</returns>
        public async Task <Transaction> SignRawTransactionAsync(Transaction tx)
        {
            RPCResponse result = await SendCommandAsync(RPCOperations.signrawtransaction, tx.ToHex()).ConfigureAwait(false);

            return(this.network.CreateTransaction(result.Result["hex"].Value <string>()));
        }
        // dumpprivkey

        public BitcoinSecret DumpPrivKey(BitcoinAddress address)
        {
            RPCResponse response = SendCommand(RPCOperations.dumpprivkey, address.ToString());

            return(this.Network.Parse <BitcoinSecret>((string)response.Result));
        }
        // listunspent

        /// <summary>
        /// Returns an array of unspent transaction outputs belonging to this wallet.
        /// </summary>
        /// <remarks>
        /// <para>
        /// Note: as of Bitcoin Core 0.10.0, outputs affecting watch-only addresses will be returned;
        /// see the spendable field in the results.
        /// </para>
        /// </remarks>
        public UnspentCoin[] ListUnspent()
        {
            RPCResponse response = SendCommand(RPCOperations.listunspent);

            return(response.Result.Select(i => new UnspentCoin((JObject)i, this.Network)).ToArray());
        }
        /// <summary>
        /// Returns an array of unspent transaction outputs belonging to this wallet.
        /// </summary>
        public async Task <UnspentCoin[]> ListUnspentAsync()
        {
            RPCResponse response = await SendCommandAsync(RPCOperations.listunspent).ConfigureAwait(false);

            return(response.Result.Select(i => new UnspentCoin((JObject)i, this.Network)).ToArray());
        }
        /// <summary>
        /// Returns the total amount received by the specified address in transactions with the
        /// specified number of confirmations. It does not count coinbase transactions.
        /// </summary>
        /// <param name="confirmations">
        /// The minimum number of confirmations an externally-generated transaction must have before
        /// it is counted towards the balance. Transactions generated by this node are counted immediately.
        /// Typically, externally-generated transactions are payments to this wallet and transactions
        /// generated by this node are payments to other wallets. Use 0 to count unconfirmed transactions.
        /// Default is 1.
        /// </param>
        /// <returns>The number of bitcoins received by the address, excluding coinbase transactions. May be 0.</returns>
        public Money GetReceivedByAddress(BitcoinAddress address, int confirmations)
        {
            RPCResponse response = SendCommand(RPCOperations.getreceivedbyaddress, address.ToString(), confirmations);

            return(Money.Coins(response.Result.Value <decimal>()));
        }
        /// <summary>
        /// Lists accounts and their balances, based on the specified number of confirmations.
        /// </summary>
        /// <param name="confirmations">
        /// The minimum number of confirmations an externally-generated transaction must have before
        /// it is counted towards the balance. Transactions generated by this node are counted immediately.
        /// Typically, externally-generated transactions are payments to this wallet and transactions
        /// generated by this node are payments to other wallets. Use 0 to count unconfirmed transactions.
        /// Default is 1.
        /// </param>
        /// <returns>
        /// A list of accounts and their balances.
        /// </returns>
        public IEnumerable <RPCAccount> ListAccounts(int confirmations)
        {
            RPCResponse response = SendCommand(RPCOperations.listaccounts, confirmations);

            return(AsRPCAccount(response));
        }
        public async Task <FundRawTransactionResponse> FundRawTransactionAsync(Transaction transaction, FundRawTransactionOptions options = null)
        {
            if (transaction == null)
            {
                throw new ArgumentNullException("transaction");
            }

            RPCResponse response = null;

            if (options != null)
            {
                var jOptions = new JObject();

                if (options.ChangeAddress != null)
                {
                    jOptions.Add(new JProperty("changeAddress", options.ChangeAddress.ToString()));
                }

                if (options.ChangePosition != null)
                {
                    jOptions.Add(new JProperty("changePosition", options.ChangePosition.Value));
                }

                jOptions.Add(new JProperty("includeWatching", options.IncludeWatching));
                jOptions.Add(new JProperty("lockUnspents", options.LockUnspents));

                if (options.ReserveChangeKey != null)
                {
                    jOptions.Add(new JProperty("reserveChangeKey", options.ReserveChangeKey));
                }

                if (options.FeeRate != null)
                {
                    jOptions.Add(new JProperty("feeRate", options.FeeRate.GetFee(1000).ToDecimal(this.Network.MoneyUnits.DefaultUnit)));
                }

                if (options.SubtractFeeFromOutputs != null)
                {
                    var array = new JArray();
                    foreach (int v in options.SubtractFeeFromOutputs)
                    {
                        array.Add(new JValue(v));
                    }
                    jOptions.Add(new JProperty("subtractFeeFromOutputs", array));
                }

                response = await SendCommandAsync("fundrawtransaction", ToHex(transaction), jOptions).ConfigureAwait(false);
            }
            else
            {
                response = await SendCommandAsync("fundrawtransaction", ToHex(transaction)).ConfigureAwait(false);
            }

            var r = (JObject)response.Result;

            return(new FundRawTransactionResponse()
            {
                Transaction = this.network.CreateTransaction(r["hex"].Value <string>()),
                Fee = Money.Coins(r["fee"].Value <decimal>()),
                ChangePos = r["changepos"].Value <int>()
            });
        }
        public async Task <Money> GetBalanceAsync(int minConf, bool includeWatchOnly)
        {
            RPCResponse data = await SendCommandAsync(RPCOperations.getbalance, "*", minConf, includeWatchOnly).ConfigureAwait(false);

            return(Money.Coins(data.Result.Value <decimal>()));
        }
        public async Task <Money> GetBalanceAsync()
        {
            RPCResponse data = await SendCommandAsync(RPCOperations.getbalance, "*").ConfigureAwait(false);

            return(Money.Coins(data.Result.Value <decimal>()));
        }
        // getaddressesbyaccount

        /// <summary>
        /// Returns a list of every address assigned to a particular account.
        /// </summary>
        /// <param name="account">
        /// The name of the account containing the addresses to get. To get addresses from the default account,
        /// pass an empty string ("").
        /// </param>
        /// <returns>
        /// A collection of all addresses belonging to the specified account.
        /// If the account has no addresses, the collection will be empty.
        /// </returns>
        public IEnumerable <BitcoinAddress> GetAddressesByAccount(string account)
        {
            RPCResponse response = SendCommand(RPCOperations.getaddressesbyaccount, account);

            return(response.Result.Select(t => this.Network.Parse <BitcoinAddress>((string)t)));
        }
        public async Task <BitcoinAddress> GetAccountAddressAsync(string account)
        {
            RPCResponse response = await SendCommandAsync(RPCOperations.getaccountaddress, account).ConfigureAwait(false);

            return(this.Network.Parse <BitcoinAddress>((string)response.Result));
        }