public void CanReserveDirectAddress() { using (var tester = ServerTester.Create()) { //WaitServerStarted not needed, just a sanity check tester.Client.WaitServerStarted(); tester.Client.Track(DummyPubKey); var utxo = tester.Client.GetUTXOs(DummyPubKey, null, false); //Track things do not wait var tasks = new List <Task <KeyPathInformation> >(); for (int i = 0; i < 10; i++) { tasks.Add(tester.Client.GetUnusedAsync(DummyPubKey, DerivationFeature.Direct, reserve: true)); } Task.WaitAll(tasks.ToArray()); var paths = tasks.Select(t => t.Result).ToDictionary(c => c.KeyPath); Assert.Equal(9U, paths.Select(p => p.Key.Indexes.Last()).Max()); tester.Client.CancelReservation(DummyPubKey, new[] { new KeyPath("0") }); var path = tester.Client.GetUnused(DummyPubKey, DerivationFeature.Direct).KeyPath; Assert.Equal(new KeyPath("0"), path); } }
public void CanUseWebSockets() { using (var tester = ServerTester.Create()) { tester.Client.WaitServerStarted(); var key = new BitcoinExtKey(new ExtKey(), tester.Network); var pubkey = CreateDerivationStrategy(key.Neuter()); tester.Client.Track(pubkey); using (var connected = tester.Client.CreateNotificationSession()) { connected.ListenNewBlock(); var expectedBlockId = tester.Explorer.CreateRPCClient().Generate(1)[0]; var blockEvent = (Models.NewBlockEvent)connected.NextEvent(Cancel); Assert.Equal(expectedBlockId, blockEvent.Hash); Assert.NotEqual(0, blockEvent.Height); connected.ListenDerivationSchemes(new[] { pubkey }); tester.Explorer.CreateRPCClient().SendToAddress(AddressOf(key, "0/1"), Money.Coins(1.0m)); var txEvent = (Models.NewTransactionEvent)connected.NextEvent(Cancel); Assert.Equal(txEvent.DerivationStrategy, pubkey); } } }
public void CanTrack() { using (var tester = ServerTester.Create()) { //WaitServerStarted not needed, just a sanity check tester.Client.WaitServerStarted(); var key = new BitcoinExtKey(new ExtKey(), tester.Network); var pubkey = CreateDerivationStrategy(key.Neuter()); tester.Client.Track(pubkey); var utxo = tester.Client.Sync(pubkey, null, null, true); //Track things do not wait var gettingUTXO = tester.Client.SyncAsync(pubkey, utxo); var txId = tester.RPC.SendToAddress(AddressOf(key, "0/0"), Money.Coins(1.0m)); utxo = gettingUTXO.GetAwaiter().GetResult(); Assert.Equal(113, utxo.CurrentHeight); Assert.False(utxo.Confirmed.Reset); Assert.Equal(1, utxo.Unconfirmed.UTXOs.Count); Assert.Equal(txId, utxo.Unconfirmed.UTXOs[0].Outpoint.Hash); Assert.Equal(0, utxo.Unconfirmed.UTXOs[0].Confirmations); Assert.Equal(0, utxo.Confirmed.UTXOs.Count); Assert.Equal(uint256.Zero, utxo.Confirmed.Hash); Assert.NotEqual(uint256.Zero, utxo.Unconfirmed.Hash); var tx = tester.Client.GetTransaction(utxo.Unconfirmed.UTXOs[0].Outpoint.Hash); Assert.NotNull(tx); Assert.Equal(0, tx.Confirmations); Assert.Equal(utxo.Unconfirmed.UTXOs[0].Outpoint.Hash, tx.Transaction.GetHash()); tester.RPC.Generate(1); var prevUtxo = utxo; utxo = tester.Client.Sync(pubkey, prevUtxo); Assert.True(utxo.Unconfirmed.Reset); Assert.Equal(0, utxo.Unconfirmed.UTXOs.Count); Assert.Equal(1, utxo.Confirmed.UTXOs.Count); Assert.Equal(txId, utxo.Confirmed.UTXOs[0].Outpoint.Hash); Assert.Equal(1, utxo.Confirmed.UTXOs[0].Confirmations); Assert.NotEqual(uint256.Zero, utxo.Confirmed.Hash); var prevConfHash = utxo.Confirmed.Hash; txId = tester.RPC.SendToAddress(AddressOf(key, "0/1"), Money.Coins(1.0m)); var txId1 = txId; prevUtxo = utxo; utxo = tester.Client.Sync(pubkey, utxo); Assert.Equal(0, utxo.Confirmed.UTXOs.Count); Assert.False(utxo.Confirmed.Reset); Assert.True(utxo.HasChanges); Assert.False(utxo.Unconfirmed.Reset); Assert.Equal(1, utxo.Unconfirmed.UTXOs.Count); Assert.Equal(txId, utxo.Unconfirmed.UTXOs[0].Outpoint.Hash); utxo = tester.Client.Sync(pubkey, null, null, true); Assert.Equal(1, utxo.Unconfirmed.UTXOs.Count); Assert.Equal(new KeyPath("0/1"), utxo.Unconfirmed.UTXOs[0].KeyPath); Assert.Equal(1, utxo.Confirmed.UTXOs.Count); Assert.Equal(new KeyPath("0/0"), utxo.Confirmed.UTXOs[0].KeyPath); Assert.Equal(prevConfHash, utxo.Confirmed.Hash); utxo = tester.Client.Sync(pubkey, utxo.Confirmed.Hash, null, true); Assert.False(utxo.Confirmed.Reset); Assert.Equal(1, utxo.Unconfirmed.UTXOs.Count); Assert.Equal(0, utxo.Confirmed.UTXOs.Count); utxo = tester.Client.Sync(pubkey, null, utxo.Unconfirmed.Hash, true); Assert.True(utxo.Confirmed.Reset); Assert.Equal(0, utxo.Unconfirmed.UTXOs.Count); Assert.Equal(1, utxo.Confirmed.UTXOs.Count); Assert.Equal(1, utxo.Confirmed.UTXOs[0].Confirmations); Assert.Null(tester.Client.GetTransaction(uint256.One)); tx = tester.Client.GetTransaction(utxo.Confirmed.UTXOs[0].Outpoint.Hash); Assert.NotNull(tx); Assert.Equal(1, tx.Confirmations); Assert.Equal(utxo.Confirmed.UTXOs[0].Outpoint.Hash, tx.Transaction.GetHash()); tester.RPC.Generate(1); utxo = tester.Client.Sync(pubkey, utxo); Assert.Equal(1, utxo.Confirmed.UTXOs.Count); Assert.Equal(new KeyPath("0/1"), utxo.Confirmed.UTXOs[0].KeyPath); var outpoint01 = utxo.Confirmed.UTXOs[0].Outpoint; txId = tester.RPC.SendToAddress(AddressOf(key, "0/2"), Money.Coins(1.0m)); utxo = tester.Client.Sync(pubkey, utxo); Assert.Equal(1, utxo.Unconfirmed.UTXOs.Count); Assert.Equal(0, utxo.Confirmed.UTXOs.Count); Assert.Equal(new KeyPath("0/2"), utxo.Unconfirmed.UTXOs[0].KeyPath); tester.RPC.Generate(1); utxo = tester.Client.Sync(pubkey, utxo); Assert.Equal(1, utxo.Confirmed.UTXOs.Count); Assert.Equal(new KeyPath("0/2"), utxo.Confirmed.UTXOs[0].KeyPath); utxo = tester.Client.Sync(pubkey, utxo, true); Assert.True(!utxo.HasChanges); var before01Spend = utxo.Confirmed.Hash; LockTestCoins(tester.RPC); tester.RPC.ImportPrivKey(PrivateKeyOf(key, "0/1")); txId = tester.RPC.SendToAddress(AddressOf(key, "0/3"), Money.Coins(0.5m)); utxo = tester.Client.Sync(pubkey, utxo); Assert.Equal(1, utxo.Unconfirmed.UTXOs.Count); Assert.Equal(new KeyPath("0/3"), utxo.Unconfirmed.UTXOs[0].KeyPath); Assert.Equal(1, utxo.Unconfirmed.SpentOutpoints.Count); // "0/1" should be spent Assert.Equal(txId1, utxo.Unconfirmed.SpentOutpoints[0].Hash); // "0/1" should be spent utxo = tester.Client.Sync(pubkey, utxo, true); Assert.False(utxo.HasChanges); tester.RPC.Generate(1); utxo = tester.Client.Sync(pubkey, before01Spend, utxo.Unconfirmed.Hash); Assert.True(utxo.Unconfirmed.HasChanges); Assert.Equal(1, utxo.Confirmed.UTXOs.Count); Assert.Equal(new KeyPath("0/3"), utxo.Confirmed.UTXOs[0].KeyPath); Assert.Equal(1, utxo.Confirmed.SpentOutpoints.Count); Assert.Equal(outpoint01, utxo.Confirmed.SpentOutpoints[0]); utxo = tester.Client.Sync(pubkey, utxo, true); Assert.False(utxo.HasChanges); } }