public void StartSynchronizesWithWalletAndSurvivesRestart() { var dataFolder = new DataFolder(CreateTestDir(this)); this.Init(dataFolder); this.AppendBlocks(WithdrawalTransactionBuilder.MinConfirmations); using (ICrossChainTransferStore crossChainTransferStore = this.CreateStore()) { crossChainTransferStore.Initialize(); crossChainTransferStore.Start(); this.federationWalletManager.SaveWallet(); Assert.Equal(this.wallet.LastBlockSyncedHash, crossChainTransferStore.TipHashAndHeight.HashBlock); Assert.Equal(this.wallet.LastBlockSyncedHeight, crossChainTransferStore.TipHashAndHeight.Height); } // Create a new instance of this test that loads from the persistence that we created in the step before. var newTest = new CrossChainTransferStoreTests(this.network); // Force a reorg by creating a new chain that only has genesis in common. newTest.Init(dataFolder); newTest.AppendBlocks(3); using (ICrossChainTransferStore crossChainTransferStore2 = newTest.CreateStore()) { // Test that synchronizing the store aligns it with the current chain tip after the fork. crossChainTransferStore2.Initialize(); crossChainTransferStore2.Start(); Assert.Equal(newTest.wallet.LastBlockSyncedHash, crossChainTransferStore2.TipHashAndHeight.HashBlock); Assert.Equal(newTest.wallet.LastBlockSyncedHeight, crossChainTransferStore2.TipHashAndHeight.Height); } }
public void StoreMergesSignaturesAsExpected() { var dataFolder = new DataFolder(CreateTestDir(this)); this.Init(dataFolder); this.AddFunding(); this.AppendBlocks(WithdrawalTransactionBuilder.MinConfirmations); using (ICrossChainTransferStore crossChainTransferStore = this.CreateStore()) { crossChainTransferStore.Initialize(); crossChainTransferStore.Start(); Assert.Equal(this.chain.Tip.HashBlock, crossChainTransferStore.TipHashAndHeight.HashBlock); Assert.Equal(this.chain.Tip.Height, crossChainTransferStore.TipHashAndHeight.Height); BitcoinAddress address = (new Key()).PubKey.Hash.GetAddress(this.network); var deposit = new Deposit(0, new Money(160m, MoneyUnit.BTC), address.ToString(), crossChainTransferStore.NextMatureDepositHeight, 1); MaturedBlockDepositsModel[] blockDeposits = new[] { new MaturedBlockDepositsModel( new MaturedBlockInfoModel() { BlockHash = 1, BlockHeight = crossChainTransferStore.NextMatureDepositHeight }, new[] { deposit }) }; crossChainTransferStore.RecordLatestMatureDepositsAsync(blockDeposits).GetAwaiter().GetResult(); ICrossChainTransfer crossChainTransfer = crossChainTransferStore.GetAsync(new[] { deposit.Id }).GetAwaiter().GetResult().SingleOrDefault(); Assert.NotNull(crossChainTransfer); Transaction transaction = crossChainTransfer.PartialTransaction; Assert.True(crossChainTransferStore.ValidateTransaction(transaction)); // Create a separate instance to generate another transaction. Transaction transaction2; var newTest = new CrossChainTransferStoreTests(this.network); var dataFolder2 = new DataFolder(CreateTestDir(this)); newTest.federationKeys = this.federationKeys; newTest.SetExtendedKey(1); newTest.Init(dataFolder2); // Clone chain for (int i = 1; i <= this.chain.Height; i++) { ChainedHeader header = this.chain.GetBlock(i); Block block = this.blockDict[header.HashBlock]; newTest.AppendBlock(block); } using (ICrossChainTransferStore crossChainTransferStore2 = newTest.CreateStore()) { crossChainTransferStore2.Initialize(); crossChainTransferStore2.Start(); Assert.Equal(newTest.chain.Tip.HashBlock, crossChainTransferStore2.TipHashAndHeight.HashBlock); Assert.Equal(newTest.chain.Tip.Height, crossChainTransferStore2.TipHashAndHeight.Height); crossChainTransferStore2.RecordLatestMatureDepositsAsync(blockDeposits).GetAwaiter().GetResult(); ICrossChainTransfer crossChainTransfer2 = crossChainTransferStore2.GetAsync(new[] { deposit.Id }).GetAwaiter().GetResult().SingleOrDefault(); Assert.NotNull(crossChainTransfer2); transaction2 = crossChainTransfer2.PartialTransaction; Assert.True(crossChainTransferStore2.ValidateTransaction(transaction2)); } // Merges the transaction signatures. crossChainTransferStore.MergeTransactionSignaturesAsync(deposit.Id, new[] { transaction2 }).GetAwaiter().GetResult(); // Test the outcome. crossChainTransfer = crossChainTransferStore.GetAsync(new[] { deposit.Id }).GetAwaiter().GetResult().SingleOrDefault(); Assert.NotNull(crossChainTransfer); Assert.Equal(CrossChainTransferStatus.FullySigned, crossChainTransfer.Status); // Should be returned as signed. Transaction signedTransaction = crossChainTransferStore.GetTransactionsByStatusAsync(CrossChainTransferStatus.FullySigned).GetAwaiter().GetResult().Values.SingleOrDefault(); Assert.NotNull(signedTransaction); // Check ths signature. Assert.True(crossChainTransferStore.ValidateTransaction(signedTransaction, true)); } }