Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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);
                }
            }
        }
Exemplo n.º 3
0
        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);
            }
        }