public void HttpMonitorWorks() { var monitor = new HttpMonitor(Network.MainNet); var history = monitor.GetAddressHistory("15emqTTjzCVRFWTRyBiQUgBnK3DBhShFBU"); var recordCount = history.Records.Count; Assert.True(recordCount > 16); Assert.Equal(history.Records.Last().Amount, 0.03802378m); Assert.Equal(history.Records[recordCount - 2].TransactionId, "1798a59c37828db66e8c4d57a90324fa8039aef72b872df5876edfb31b102c5f"); Assert.Equal(history.Records[recordCount - 3].Amount, -0.06335627m); Assert.True(history.Records[recordCount - 3].Confirmed); string mnemonic; var safe = Safe.Create(out mnemonic, "", "foo", Network.MainNet); safe.DeleteWalletFile(); var history2 = monitor.GetAddressHistory(safe.GetAddress(2)); Assert.True(history2.Records.Count == 0); var balanceInfo = monitor.GetAddressBalanceInfo("15emqTTjzCVRFWTRyBiQUgBnK3DBhShFBU"); var balanceInfo2 = monitor.GetAddressBalanceInfo(safe.GetAddress(2)); Assert.Equal(balanceInfo.Balance, history.TotalReceived - history.TotalSpent); Assert.Equal(balanceInfo2.Balance, history2.TotalReceived - history2.TotalSpent); var confirmedBalance = history.Records.Where(record => record.Confirmed).Sum(record => record.Amount); var unconfirmedBalance = history.Records.Where(record => !record.Confirmed).Sum(record => record.Amount); Assert.Equal(balanceInfo.Unconfirmed, unconfirmedBalance); Assert.Equal(balanceInfo.Confirmed, confirmedBalance); }
private static void TemporarilyTestHttpMonitor() { var monitor = new HttpMonitor(Network.TestNet); // var privateKey = "tprv8f3GDAef8nhKvQbC5KGEerqDGB2s2KgMNHS4kLDXXP7c8M6ZcxyEzyvsVA9C1ss9Fj5QEiCiKbyEfD97duhXjc2he58dDicMtLs3YfwNJb2"; var address = "miLGbZvQ5sEd5BKCPXjEJzknMdENuFEzCy"; var bal = monitor.GetAddressBalanceInfo(address); var his = monitor.GetAddressHistory(address); WriteLine($"Balance: {bal.Balance}"); WriteLine($"Confirmed balance: {bal.Confirmed}"); WriteLine($"Unconfirmed balance: {bal.Unconfirmed}"); WriteLine($"TotalReceived: {his.TotalReceived}"); WriteLine($"TotalSpent: {his.TotalSpent}"); WriteLine($"TotalReceived - TotalSpent: {his.TotalReceived - his.TotalSpent}"); WriteLine($"TotalReceived - TotalSpent == Balance: {his.TotalReceived - his.TotalSpent == bal.Balance}"); WriteLine(); WriteLine("RECORDS:"); foreach (var record in his.Records) { WriteLine(); WriteLine($"DateTime: {record.DateTime}"); WriteLine($"Amount: {record.Amount}"); WriteLine($"Confirmed: {record.Confirmed}"); } //var spender = new HttpBuilder(Network.TestNet); //var tx = spender.BuildTransaction( // new List<string> { privateKey }, // new List<AddressAmountPair> // { // new AddressAmountPair // { // //Address = "miLGbZvQ5sEd5BKCPXjEJzknMdENuFEzCy", // Address = "miNu2YVQLSqFcw91fRVuNHMmGkStMd5SFj", // Amount = 1 // } // }); //Console.WriteLine(); //Console.WriteLine("Transaction created"); //spender.Send(tx.Id); //Console.WriteLine("Transaction sent"); }
private static void Part2Lesson1() { var network = Network.MainNet; // HttpMonitor can monitor The Blockchain through HTTP (QBitNinja) var httpMonitor = new HttpMonitor(network); // Checking address balances var balanceInfo = httpMonitor.GetAddressBalanceInfo("1ENCTCkqoJqy2XZ2m2Dy1bRax7hsSnC5Fc"); WriteLine($"Address balance: {balanceInfo.Balance}"); // 0,05474889 WriteLine($"Confirmed balance: {balanceInfo.Confirmed}"); // 0 WriteLine($"Unconfirmed balance: {balanceInfo.Unconfirmed}"); // 0,05474889 // Get history of an address var history = httpMonitor.GetAddressHistory("1ENCTCkqoJqy2XZ2m2Dy1bRax7hsSnC5Fc"); WriteLine("Number of transactions: " + history.Records.Count); // Exercise: are all transaction confirmed? var allTransactionsConfirmed = true; foreach (var record in history.Records) { WriteLine(record.TransactionId + " : " + record.Amount); allTransactionsConfirmed = allTransactionsConfirmed && record.Confirmed; } WriteLine("All transactions are confirmed: " + allTransactionsConfirmed); // Exercise: get the balance of the address WriteLine("Total received - Total spent = Balance"); WriteLine(history.TotalReceived + " - " + history.TotalSpent + " = " + (history.TotalReceived - history.TotalSpent)); // Get some data from the transaction var transactionInfo1 = httpMonitor.GetTransactionInfo(history.Records.First().TransactionId); WriteLine("txid: " + transactionInfo1.Id); WriteLine("Network: " + transactionInfo1.Network); WriteLine("Confirmed: " + transactionInfo1.Confirmed); WriteLine("Total amount of all inputs: " + transactionInfo1.TotalInputAmount); WriteLine("Total amount of all outputs: " + transactionInfo1.TotalOutputAmount); WriteLine("Fee : " + transactionInfo1.Fee); WriteLine(Environment.NewLine + "Input addresses and amounts: "); foreach (var input in transactionInfo1.Inputs) { WriteLine(input.Amount + " " + input.Address); } WriteLine(Environment.NewLine + "Output addresses and amounts: "); foreach (var output in transactionInfo1.Outputs) { WriteLine(output.Amount + " " + output.Address); } // Sometimes my API can't fully process a transaction, because it has OP_RETURN for example // It should not be a concern for a Bitcoin wallet that purely handles money, if a transaction output or input has not been added // that means it has some other purpose, a wallet API can dismiss it // This tx is exotic (has OP_RETURN) var transactionInfo2 = httpMonitor.GetTransactionInfo("8bae12b5f4c088d940733dcd1455efc6a3a69cf9340e17a981286d3778615684"); WriteLine(transactionInfo2.Id); WriteLine("There are exotic inputs or outputs, so not all of them have been added successfully: " + Environment.NewLine + !transactionInfo2.AllInOutsAdded); }