diff --git a/NBitcoin.Altcoins/Dogecoin.cs b/NBitcoin.Altcoins/Dogecoin.cs
index 0887f48b3..1f5b8d86e 100644
--- a/NBitcoin.Altcoins/Dogecoin.cs
+++ b/NBitcoin.Altcoins/Dogecoin.cs
@@ -169,7 +169,20 @@ public BlockHeader ParentBlock
public void ReadWrite(BitcoinStream stream)
{
- stream.ReadWrite(ref tx);
+ var transactionOptions = stream.TransactionOptions;
+ var supportWitness = stream.ProtocolCapabilities.SupportWitness;
+ try
+ {
+ // The parent chain may use SegWit even though Dogecoin does not.
+ stream.TransactionOptions |= TransactionOptions.Witness;
+ stream.ProtocolCapabilities.SupportWitness = true;
+ stream.ReadWrite(ref tx);
+ }
+ finally
+ {
+ stream.TransactionOptions = transactionOptions;
+ stream.ProtocolCapabilities.SupportWitness = supportWitness;
+ }
stream.ReadWrite(ref hashBlock);
stream.ReadWrite(ref vMerkelBranch);
stream.ReadWrite(ref nIndex);
diff --git a/NBitcoin.Altcoins/NBitcoin.Altcoins.csproj b/NBitcoin.Altcoins/NBitcoin.Altcoins.csproj
index ec64725c4..4fd16da6c 100644
--- a/NBitcoin.Altcoins/NBitcoin.Altcoins.csproj
+++ b/NBitcoin.Altcoins/NBitcoin.Altcoins.csproj
@@ -17,7 +17,7 @@
$(TargetFrameworkOverride)
1591;1573;1572;1584;1570;3021
true
- 6.0.7
+ 6.0.8
diff --git a/NBitcoin.Tests/AltcoinTests.cs b/NBitcoin.Tests/AltcoinTests.cs
index 591aafe4b..00aee439b 100644
--- a/NBitcoin.Tests/AltcoinTests.cs
+++ b/NBitcoin.Tests/AltcoinTests.cs
@@ -86,6 +86,39 @@ public void DogeHeadersIgnoreTransactionCount()
Assert.All(headers.Headers, h => Assert.Equal(block.GetHash(), h.GetHash()));
}
+ [Fact]
+ public void CanParseDogeHeadersFromMainnetReorg()
+ {
+ var network = Dogecoin.Instance.Mainnet;
+ const string headersHex =
+ "0204016200092b8ac93d9725a8a77eb15c7499080780777c71d52e32aab9e1daba835341b37a00138d013ee3b5fa7153e65018376e0f43170ae08deef7dee249b830a65eca459aab6a847877190000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff64033083302cfabe6d6d97afbdade555de4c20bf5d9a8d3d57491a6ef61673881c10f4b81b4f27bcfed320000000f09f909f092f4632506f6f6c2f610000000000000000000000000000000000000000000000000000000000000000000000050000abaaaaaaaaaaaa0295c24625000000001976a914dfd88711bf5d20f2ac7049ba28d053a89186ce9288ac0000000000000000266a24aa21a9ed642ac1fc3163b72da4b8d9e70fc881ca63ac73af38e4e4d3b2db06d5e91d735129406a45fdfbd57e6dbc96f4e0966a29f82d3d9e9a34a316403ebd704000000000000000079e16933360da72933ca3613ff2739e34fd79102f6aeffb629073940702b68c5785da5b8be3f7edfca56e60d86fd2a51fdbe57ce3f6790a980c9e7fdbd9966f8113099e3526172286f138d825df356889e915ab7e76efafdfa7008c70d244dac198f86003d8b6af96483f9bd0788d7143e26ea1a96ab9c99d1e0622bb1411d9c392ad31d569f64be4e6463deb12bf16b9f04be846f9e0a3b5641637d9fb056384ffb9c2ff131c95d5279e3a7eb443676880f54569b3f69ee03bf2356f641fd590f2ca7f7a850f0f9536aa20b779cd4822796945b04cdbbf280530762fae4d2f1000000000050900000000000000000000000000000000000000000000000000000000000000710b1b3f2df407a200dd8321454575d9c8a35228a0cb34775aef1d44a656a7c820990273eaacecd2849bb3ce178ae71d586f9776be401dd0cb89c44f51020d87947dcc639f47153e5b9bf1049ca78b9a693a513b81b18143fd236dd8e8e2b5e85b11157e3781beb1e54c11a661636881e74ccbcf911d661c607f943d77e557cd080000001400002074c180190720793c76f044bac873bfa23ce3c3b940df9e423c31c1bdeafdc4c81963147f5708732bea47c5ccf6f4c3581abeeb246338c03ad38466b638eb9b3d689aab6a41973019c85146400004016200a85259653887be4245ba190d76a43e0ca407e03b3b0c0cf3b0597af334565071782f86ef905c9dc76ea9d5ded8718e0e9662d2f5a590cdbeb4d4c2154b5ba6dc8e9aab6ace836d190000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff64033083302cfabe6d6d8b047cf9e4790731f271f00cd3b585376647d7acbd2b340a3bdefbbb32eb247120000000f09f909f092f4632506f6f6c2f64000000000000000000000000000000000000000000000000000000000000000000000005000f000000000000000224c74a25000000001976a914dfd88711bf5d20f2ac7049ba28d053a89186ce9288ac0000000000000000266a24aa21a9edeaafd8daacd665b640c7533911dbbf9930cc15ede7616f93bf0ddb6e4ef0e052a750a143f2d37d17073b3638f0d60fc7f264e56cd7e88023423a6c134900000000000000089e16933360da72933ca3613ff2739e34fd79102f6aeffb629073940702b68c5785da5b8be3f7edfca56e60d86fd2a51fdbe57ce3f6790a980c9e7fdbd9966f8155160e53c56803a7d1c42504515bc9920d54ad92dc964745659912d3cf56f87a12d790c5a711456a72ebf0d3e2193577914ea844b7beddbd49bfbc08f4c5bb8c6701b9c84f2d8f69d8b0f14db64c5d7ff1f5ec8b67f03fe1e417c638fe245334e0543392c0ed3633ac3e48281911f5bf0e5d1c67f08dc871c533e93998893eeadc6ff3a2f55f34b1e7eae5e4dc5ccca4e82c76c5abda7f8553628c8e4ff8e8831a55b4b20fdaad06014da3e314de997f78303bd9c9dce51e2f97a4d778e1042f00000000050900000000000000000000000000000000000000000000000000000000000000710b1b3f2df407a200dd8321454575d9c8a35228a0cb34775aef1d44a656a7c88c6e01681276bbc57168ddc1c02d950085bba998469e4409af12df1a458f1a12733c27cb3859f3d2dd88a6a7c7920b7d5280b2cf6e134b8f50f4b7ec39aafa1f4b2e5c8f77ab3f08e2c7f47982c5d523e271e66b68963f4321d38b3bd09043ce080000001400002074c180190720793c76f044bac873bfa23ce3c3b940df9e423c31c1bdeafdc4c8d17bf4f02c495adfb023d8d433bcb8e7dab91319e43fb408e31ebfe7c4c2c5878a9aab6a4197301983219f7300";
+
+ var payload = network.Consensus.ConsensusFactory.CreatePayload("headers");
+ payload.ReadWrite(Encoders.Hex.DecodeData(headersHex), network);
+ var headers = Assert.IsAssignableFrom(payload);
+
+ Assert.Equal(new[]
+ {
+ uint256.Parse("71505634f37a59b0f30c0c3b3be007a40c3ea4760d19ba4542be8738655952a8"),
+ uint256.Parse("3ad63c3ca927909abe46a726101d9c79d3156a5b77440426851c6b8bdd2efb1f")
+ }, headers.Headers.Select(h => h.GetHash()));
+ }
+
+ [Fact]
+ public void CanParseDogeHeaderWithSegwitAuxPow()
+ {
+ var network = Dogecoin.Instance.Mainnet;
+ const string headersHex =
+ "0104016200d3dac1b499f4ed31038a68d974acfe4ef485558b9e6b0e16f9a101f3d1bd3178c64bb44d78e400d78d082857fe9fc9462d961d176f8dd3fab33d1189a01747b739aaab6a1b88781900000000020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff4c034d83300439aaab6a08656d63645f5235302cfabe6d6d301b98c9d267c5a1e7d263cd5bc9af956371e0c7cc2479125ac4d0f3d16045bb20000000000000000c0931ac6200000ab4d0010000000000000251c9402500000000160014a0210a92fdaef52ea18f0c8fdb9246a751617b520000000000000000266a24aa21a9ed0d246e134669f5fb1ee7292a403ea0f8d08f8f410d5a89d13c9b9756650236b601200000000000000000000000000000000000000000000000000000000000000000000000003f4257444bad1d85ad7349cc86078bb41ae79cdde948fda0eed6392c65ef5ad503c7f803f2288e348eeb81a87c74459ae5b1b57d3aa2abc3c7344c140db259ec9f15a26cf67c92359a4c7c58f543ec1a377e2014745fa5637f42345ab99f34a38336eaf06ccc57cb1bb51172d5678535d632d12d7a604e0e450c4f9632d969a92600000000050000000000000000000000000000000000000000000000000000000000000000e2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf9d903f4bd07dd7996d0fec96201c9bbc9f6e24c332269d5acc0f17e06030756577eda2b4d44c285e0cec061ab25476481cc509cccd57d40e0ff6c84041bb4771b245574c4da5be27d47fce9734df2db040ac7a094f401d8e56d4c6d8569a364a718000000000000204aad8376e717e3444953abc8bcad3299e90ba72a0e4580334058d755eb0f98162e43d4d6a77d59cf5b23b384f67cc0d2005e43c03eb5933a824a1990057971ac39aaab6a41973019213c08bc00";
+
+ var payload = network.Consensus.ConsensusFactory.CreatePayload("headers");
+ payload.ReadWrite(Encoders.Hex.DecodeData(headersHex), network);
+ var headers = Assert.IsAssignableFrom(payload);
+
+ Assert.Equal(uint256.Parse("34ebd0f3ecf1bd2058aafe3ddbee405781041549e9879f68a349bc04b7a6661b"), Assert.Single(headers.Headers).GetHash());
+ Assert.Equal(headersHex, Encoders.Hex.EncodeData(payload.ToBytes()));
+ }
+
[Fact]
public void NoCrashQuickTest()
{