Order static elements
MODIFY
WalletWasabi.Backend/Controllers/BlockchainController.cs
WalletWasabi.Backend/Controllers/BlockchainController.cs
@@ -32,15 +32,15 @@ namespace WalletWasabi.Backend.Controllers
Global = global;
}
- public IMemoryCache Cache { get; }
- public Global Global { get; }
private IRPCClient RpcClient => Global.RpcClient;
-
private Network Network => Global.Config.Network;
public static Dictionary<uint256, string> TransactionHexCache { get; } = new Dictionary<uint256, string>();
public static object TransactionHexCacheLock { get; } = new object();
+ public IMemoryCache Cache { get; }
+ public Global Global { get; }
+
/// <summary>
/// Get fees for the requested confirmation targets based on Bitcoin Core's estimatesmartfee output.
/// </summary>

MODIFY
WalletWasabi.Tests/UnitTests/Transactions/AllTransactionStoreTests.cs
WalletWasabi.Tests/UnitTests/Transactions/AllTransactionStoreTests.cs
@@ -16,6 +16,63 @@ namespace WalletWasabi.Tests.UnitTests.Transactions
{
public class AllTransactionStoreTests
{
+ #region Helpers
+
+ private static SmartTransaction CreateTransaction(int height, uint256 blockHash)
+ {
+ var tx = Network.RegTest.CreateTransaction();
+ tx.Version = 1;
+ tx.LockTime = LockTime.Zero;
+ tx.Inputs.Add(new OutPoint(RandomUtils.GetUInt256(), 0), new Script(OpcodeType.OP_0, OpcodeType.OP_0), sequence: Sequence.Final);
+ tx.Outputs.Add(Money.Coins(1), Script.Empty);
+ return new SmartTransaction(tx, new Height(height), blockHash);
+ }
+
+ private void PrepareTestEnv(out string dir, out Network network, out string mempoolFile, out string txFile, out SmartTransaction uTx1, out SmartTransaction uTx2, out SmartTransaction uTx3, out SmartTransaction cTx1, out SmartTransaction cTx2, out SmartTransaction cTx3, [CallerFilePath] string callerFilePath = null, [CallerMemberName] string callerMemberName = null)
+ {
+ dir = PrepareWorkDir(EnvironmentHelpers.ExtractFileName(callerFilePath), callerMemberName);
+ network = Network.TestNet;
+ mempoolFile = Path.Combine(dir, "Mempool", "Transactions.dat");
+ txFile = Path.Combine(dir, "ConfirmedTransactions", Constants.ConfirmedTransactionsVersion, "Transactions.dat");
+ IoHelpers.EnsureContainingDirectoryExists(mempoolFile);
+ IoHelpers.EnsureContainingDirectoryExists(txFile);
+
+ uTx1 = SmartTransaction.FromLine("34fc45781f2ac8e541b6045c2858c755dd2ab85e0ea7b5778b4d0cc191468571:01000000000102d5ae6e2612cdf8932d0e4f684d8ad9afdbca0afffba5c3dc0bf85f2b661bfb670000000000ffffffffbfd117908d5ba536624630519aaea7419605efa33bf1cb50c5ff7441f7b27a5b0100000000ffffffff01c6473d0000000000160014f9d25fe27812c3d35ad3819fcab8b95098effe15024730440220165730f8275434a5484b6aba3c71338a109b7cfd7380fdc18c6791a6afba9dee0220633b3b65313e57bdbd491d17232e6702912869d81461b4c939600d1cc99c06ec012102667c9fb272660cd6c06f853314b53c41da851f86024f9475ff15ea0636f564130247304402205e81562139231274cd7f705772c2810e34b7a291bd9882e6c567553babca9c7402206554ebd60d62a605a27bd4bf6482a533dd8dd35b12dc9d6abfa21738fdf7b57a012102b25dec5439a1aad8d901953a90d16252514a55f547fe2b85bc12e3f72cff1c4b00000000:Mempool::0::1570464578:False", network);
+ uTx2 = SmartTransaction.FromLine("b5cd5b4431891d913a6fbc0e946798b6f730c8b97f95a5c730c24189bed24ce7:01000000010113145dd6264da43406a0819b6e2d791ec9281322f33944ef034c3307f38c330000000000ffffffff0220a10700000000001600149af662cf9564700b93bd46fac8b51f64f2adad2343a5070000000000160014f1938902267eac1ae527128fe7773657d2b757b900000000:Mempool::0::1555590391:False", network);
+ uTx3 = SmartTransaction.FromLine("89e6788e63c5966fae0ccf6e85665ec62754f982b9593d7e3c4b78ac0e93208d:01000000000101f3e7c1bce1e0566800d8e6cae8f0d771a2ace8939cc6be7c8c21b05e590969530000000000ffffffff01cc2b0f0000000000160014e0ff6f42032bbfda63fabe0832b4ccb7be7350ae024730440220791e34413957c0f8348718d5d767f660657faf241801e74b5b81ac69e8912f60022041f3e9aeca137044565e1a81b6bcca74a88166436e5fa5f0e390448ac18fa5900121034dc07f3c26734591eb97f7e112888c3198d62bc3718106cba5a5688c62485b4500000000:Mempool::0::1555590448:False", network);
+ cTx1 = SmartTransaction.FromLine("95374c1037eb5268c8ae6681eb26756459d19754d41b660c251e6f62df586d29:0100000001357852bdf4e75a4ee2afe213463ff8afbed977ea5459a310777322504254ffdf0100000000ffffffff0240420f0000000000160014dc992214c430bf306fe446e9bac1dfc4ad4d3ee368cc100300000000160014005340d370675c47f7a04eb186200dd98c3d463c00000000:1580176:0000000034522ee38f074e1f4330b9c2f20c6a2b9a96de6f474a5f5f8fa76e2b:307::1569940579:False", network);
+ cTx2 = SmartTransaction.FromLine("af73b4c173da1bd24063e35a755babfa40728a282d6f56eeef4ce5a81ab26ee7:01000000013c81d2dcb25ad36781d1a6f9faa68f4a8b927f40e0b4e4b6184bb4761ebfc0dd0000000000ffffffff016f052e0000000000160014ae6e31ee9dae103f50979f761c2f9b44661da24f00000000:1580176:0000000034522ee38f074e1f4330b9c2f20c6a2b9a96de6f474a5f5f8fa76e2b:346::1569940633:False", network);
+ cTx3 = SmartTransaction.FromLine("ebcef423f6b03ef89dce076b53e624c966381f76e5d8b2b5034d3615ae950b2f:01000000000101296d58df626f1e250c661bd45497d159647526eb8166aec86852eb37104c37950100000000ffffffff01facb100300000000160014d5461e0e7077d62c4cf9c18a4e9ba10efd4930340247304402206d2c5b2b182474531ed07587e44ea22b136a37d5ddbd35aa2d984da7be5f7e5202202abd8435d9856e3d0892dbd54e9c05f2a20d9d5f333247314b925947a480a2eb01210321dd0574c773a35d4a7ebf17bf8f974b5665c0183598f1db53153e74c876768500000000:1580673:0000000017b09a77b815f3df513ff698d1f3b0e8c5e16ac0d6558e2d831f3bf9:130::1570462988:False", network);
+ }
+
+ private string PrepareWorkDir([CallerFilePath] string callerFilePath = null, [CallerMemberName] string callerMemberName = null)
+ {
+ string dir = Path.Combine(Global.Instance.DataDir, EnvironmentHelpers.ExtractFileName(callerFilePath), callerMemberName);
+ if (Directory.Exists(dir))
+ {
+ Directory.Delete(dir, true);
+ }
+
+ return dir;
+ }
+
+ public static IEnumerable<object[]> GetDifferentNetworkValues()
+ {
+ var networks = new List<Network>
+ {
+ Network.Main,
+ Network.TestNet,
+ Network.RegTest
+ };
+
+ foreach (Network network in networks)
+ {
+ yield return new object[] { network };
+ }
+ }
+
+ #endregion Helpers
+
[Theory]
[MemberData(nameof(GetDifferentNetworkValues))]
public async Task CanInitializeEmptyAsync(Network network)
@@ -435,62 +492,5 @@ namespace WalletWasabi.Tests.UnitTests.Transactions
reorgedTxs = txStore.ReleaseToMempoolFromBlock(firstBlockHash);
Assert.NotEmpty(reorgedTxs);
}
-
- #region Helpers
-
- private void PrepareTestEnv(out string dir, out Network network, out string mempoolFile, out string txFile, out SmartTransaction uTx1, out SmartTransaction uTx2, out SmartTransaction uTx3, out SmartTransaction cTx1, out SmartTransaction cTx2, out SmartTransaction cTx3, [CallerFilePath]string callerFilePath = null, [CallerMemberName] string callerMemberName = null)
- {
- dir = PrepareWorkDir(EnvironmentHelpers.ExtractFileName(callerFilePath), callerMemberName);
- network = Network.TestNet;
- mempoolFile = Path.Combine(dir, "Mempool", "Transactions.dat");
- txFile = Path.Combine(dir, "ConfirmedTransactions", Constants.ConfirmedTransactionsVersion, "Transactions.dat");
- IoHelpers.EnsureContainingDirectoryExists(mempoolFile);
- IoHelpers.EnsureContainingDirectoryExists(txFile);
-
- uTx1 = SmartTransaction.FromLine("34fc45781f2ac8e541b6045c2858c755dd2ab85e0ea7b5778b4d0cc191468571:01000000000102d5ae6e2612cdf8932d0e4f684d8ad9afdbca0afffba5c3dc0bf85f2b661bfb670000000000ffffffffbfd117908d5ba536624630519aaea7419605efa33bf1cb50c5ff7441f7b27a5b0100000000ffffffff01c6473d0000000000160014f9d25fe27812c3d35ad3819fcab8b95098effe15024730440220165730f8275434a5484b6aba3c71338a109b7cfd7380fdc18c6791a6afba9dee0220633b3b65313e57bdbd491d17232e6702912869d81461b4c939600d1cc99c06ec012102667c9fb272660cd6c06f853314b53c41da851f86024f9475ff15ea0636f564130247304402205e81562139231274cd7f705772c2810e34b7a291bd9882e6c567553babca9c7402206554ebd60d62a605a27bd4bf6482a533dd8dd35b12dc9d6abfa21738fdf7b57a012102b25dec5439a1aad8d901953a90d16252514a55f547fe2b85bc12e3f72cff1c4b00000000:Mempool::0::1570464578:False", network);
- uTx2 = SmartTransaction.FromLine("b5cd5b4431891d913a6fbc0e946798b6f730c8b97f95a5c730c24189bed24ce7:01000000010113145dd6264da43406a0819b6e2d791ec9281322f33944ef034c3307f38c330000000000ffffffff0220a10700000000001600149af662cf9564700b93bd46fac8b51f64f2adad2343a5070000000000160014f1938902267eac1ae527128fe7773657d2b757b900000000:Mempool::0::1555590391:False", network);
- uTx3 = SmartTransaction.FromLine("89e6788e63c5966fae0ccf6e85665ec62754f982b9593d7e3c4b78ac0e93208d:01000000000101f3e7c1bce1e0566800d8e6cae8f0d771a2ace8939cc6be7c8c21b05e590969530000000000ffffffff01cc2b0f0000000000160014e0ff6f42032bbfda63fabe0832b4ccb7be7350ae024730440220791e34413957c0f8348718d5d767f660657faf241801e74b5b81ac69e8912f60022041f3e9aeca137044565e1a81b6bcca74a88166436e5fa5f0e390448ac18fa5900121034dc07f3c26734591eb97f7e112888c3198d62bc3718106cba5a5688c62485b4500000000:Mempool::0::1555590448:False", network);
- cTx1 = SmartTransaction.FromLine("95374c1037eb5268c8ae6681eb26756459d19754d41b660c251e6f62df586d29:0100000001357852bdf4e75a4ee2afe213463ff8afbed977ea5459a310777322504254ffdf0100000000ffffffff0240420f0000000000160014dc992214c430bf306fe446e9bac1dfc4ad4d3ee368cc100300000000160014005340d370675c47f7a04eb186200dd98c3d463c00000000:1580176:0000000034522ee38f074e1f4330b9c2f20c6a2b9a96de6f474a5f5f8fa76e2b:307::1569940579:False", network);
- cTx2 = SmartTransaction.FromLine("af73b4c173da1bd24063e35a755babfa40728a282d6f56eeef4ce5a81ab26ee7:01000000013c81d2dcb25ad36781d1a6f9faa68f4a8b927f40e0b4e4b6184bb4761ebfc0dd0000000000ffffffff016f052e0000000000160014ae6e31ee9dae103f50979f761c2f9b44661da24f00000000:1580176:0000000034522ee38f074e1f4330b9c2f20c6a2b9a96de6f474a5f5f8fa76e2b:346::1569940633:False", network);
- cTx3 = SmartTransaction.FromLine("ebcef423f6b03ef89dce076b53e624c966381f76e5d8b2b5034d3615ae950b2f:01000000000101296d58df626f1e250c661bd45497d159647526eb8166aec86852eb37104c37950100000000ffffffff01facb100300000000160014d5461e0e7077d62c4cf9c18a4e9ba10efd4930340247304402206d2c5b2b182474531ed07587e44ea22b136a37d5ddbd35aa2d984da7be5f7e5202202abd8435d9856e3d0892dbd54e9c05f2a20d9d5f333247314b925947a480a2eb01210321dd0574c773a35d4a7ebf17bf8f974b5665c0183598f1db53153e74c876768500000000:1580673:0000000017b09a77b815f3df513ff698d1f3b0e8c5e16ac0d6558e2d831f3bf9:130::1570462988:False", network);
- }
-
- private string PrepareWorkDir([CallerFilePath]string callerFilePath = null, [CallerMemberName] string callerMemberName = null)
- {
- string dir = Path.Combine(Global.Instance.DataDir, EnvironmentHelpers.ExtractFileName(callerFilePath), callerMemberName);
- if (Directory.Exists(dir))
- {
- Directory.Delete(dir, true);
- }
-
- return dir;
- }
-
- public static IEnumerable<object[]> GetDifferentNetworkValues()
- {
- var networks = new List<Network>
- {
- Network.Main,
- Network.TestNet,
- Network.RegTest
- };
-
- foreach (Network network in networks)
- {
- yield return new object[] { network };
- }
- }
-
- private static SmartTransaction CreateTransaction(int height, uint256 blockHash)
- {
- var tx = Network.RegTest.CreateTransaction();
- tx.Version = 1;
- tx.LockTime = LockTime.Zero;
- tx.Inputs.Add(new OutPoint(RandomUtils.GetUInt256(), 0), new Script(OpcodeType.OP_0, OpcodeType.OP_0), sequence: Sequence.Final);
- tx.Outputs.Add(Money.Coins(1), Script.Empty);
- return new SmartTransaction(tx, new Height(height), blockHash);
- }
-
- #endregion Helpers
}
}

MODIFY
WalletWasabi.Tests/UnitTests/Transactions/TransactionFactoryTests.cs
WalletWasabi.Tests/UnitTests/Transactions/TransactionFactoryTests.cs
@@ -567,28 +567,6 @@ namespace WalletWasabi.Tests.UnitTests.Transactions
Assert.DoesNotContain(rest, x => x > samplingSize * 0.001);
}
- private TransactionFactory CreateTransactionFactory(
- IEnumerable<(string Label, int KeyIndex, decimal Amount, bool Confirmed, int AnonymitySet)> coins,
- bool allowUnconfirmed = true,
- bool watchOnly = false)
- {
- var (password, keyManager) = watchOnly ? WatchOnlyKeyManager() : DefaultKeyManager();
-
- keyManager.AssertCleanKeysIndexed();
-
- var keys = keyManager.GetKeys().Take(10).ToArray();
- var scoins = coins.Select(x => Coin(x.Label, keys[x.KeyIndex], x.Amount, x.Confirmed, x.AnonymitySet)).ToArray();
- foreach (var coin in scoins)
- {
- foreach (var sameLabelCoin in scoins.Where(c => !c.Label.IsEmpty && c.Label == coin.Label))
- {
- sameLabelCoin.Clusters = coin.Clusters;
- }
- }
- var coinsView = new CoinsView(scoins);
- return new TransactionFactory(Network.Main, keyManager, coinsView, password, allowUnconfirmed);
- }
-
private static (string, KeyManager) DefaultKeyManager()
{
var password = "blahblahblah";
@@ -614,5 +592,27 @@ namespace WalletWasabi.Tests.UnitTests.Transactions
pubKey.SetKeyState(KeyState.Used);
return new SmartCoin(RandomUtils.GetUInt256(), (uint)randomIndex(), pubKey.P2wpkhScript, Money.Coins(amount), spentOutput, height, false, anonymitySet, slabel, pubKey: pubKey);
}
+
+ private TransactionFactory CreateTransactionFactory(
+ IEnumerable<(string Label, int KeyIndex, decimal Amount, bool Confirmed, int AnonymitySet)> coins,
+ bool allowUnconfirmed = true,
+ bool watchOnly = false)
+ {
+ var (password, keyManager) = watchOnly ? WatchOnlyKeyManager() : DefaultKeyManager();
+
+ keyManager.AssertCleanKeysIndexed();
+
+ var keys = keyManager.GetKeys().Take(10).ToArray();
+ var scoins = coins.Select(x => Coin(x.Label, keys[x.KeyIndex], x.Amount, x.Confirmed, x.AnonymitySet)).ToArray();
+ foreach (var coin in scoins)
+ {
+ foreach (var sameLabelCoin in scoins.Where(c => !c.Label.IsEmpty && c.Label == coin.Label))
+ {
+ sameLabelCoin.Clusters = coin.Clusters;
+ }
+ }
+ var coinsView = new CoinsView(scoins);
+ return new TransactionFactory(Network.Main, keyManager, coinsView, password, allowUnconfirmed);
+ }
}
}

MODIFY
WalletWasabi.Tests/UnitTests/Transactions/TransactionProcessorTests.cs
WalletWasabi.Tests/UnitTests/Transactions/TransactionProcessorTests.cs
@@ -1065,22 +1065,6 @@ namespace WalletWasabi.Tests.UnitTests.Transactions
Assert.NotEmpty(changeCoin.Clusters.Labels);
}
- private async Task<TransactionProcessor> CreateTransactionProcessorAsync([CallerFilePath]string callerFilePath = null, [CallerMemberName] string callerName = "")
- {
- var keyManager = KeyManager.CreateNew(out _, "password");
- keyManager.AssertCleanKeysIndexed();
-
- var txStore = new AllTransactionStore();
- var dir = Path.Combine(Global.Instance.DataDir, EnvironmentHelpers.ExtractFileName(callerFilePath), callerName, "TransactionStore");
- await IoHelpers.DeleteRecursivelyWithMagicDustAsync(dir);
- await txStore.InitializeAsync(dir, Network.RegTest);
-
- return new TransactionProcessor(
- txStore,
- keyManager,
- Money.Coins(0.0001m));
- }
-
private static SmartTransaction CreateSpendingTransaction(Coin coin, Script scriptPubKey = null, int height = 0)
{
var tx = Network.RegTest.CreateTransaction();
@@ -1118,5 +1102,21 @@ namespace WalletWasabi.Tests.UnitTests.Transactions
{
return new OutPoint(RandomUtils.GetUInt256(), 0);
}
+
+ private async Task<TransactionProcessor> CreateTransactionProcessorAsync([CallerFilePath] string callerFilePath = null, [CallerMemberName] string callerName = "")
+ {
+ var keyManager = KeyManager.CreateNew(out _, "password");
+ keyManager.AssertCleanKeysIndexed();
+
+ var txStore = new AllTransactionStore();
+ var dir = Path.Combine(Global.Instance.DataDir, EnvironmentHelpers.ExtractFileName(callerFilePath), callerName, "TransactionStore");
+ await IoHelpers.DeleteRecursivelyWithMagicDustAsync(dir);
+ await txStore.InitializeAsync(dir, Network.RegTest);
+
+ return new TransactionProcessor(
+ txStore,
+ keyManager,
+ Money.Coins(0.0001m));
+ }
}
}

MODIFY
WalletWasabi/Gma/QrCodeNet/Encoding/DataEncodation/ECISet.cs
WalletWasabi/Gma/QrCodeNet/Encoding/DataEncodation/ECISet.cs
@@ -46,6 +46,34 @@ namespace Gma.QrCodeNet.Encoding.DataEncodation
Three = 6
}
+ /// <remarks>ISO/IEC 18004:2006E ECI Designator Page 24</remarks>
+ /// <param name="eCIValue">Range: 0 ~ 999999</param>
+ /// <returns>Number of Codewords(Byte) for ECI Assignment Value</returns>
+ private static int NumOfCodewords(int eCIValue)
+ {
+ if (eCIValue >= 0 && eCIValue <= 127)
+ {
+ return 1;
+ }
+ else if (eCIValue > 127 && eCIValue <= 16383)
+ {
+ return 2;
+ }
+ else if (eCIValue > 16383 && eCIValue <= 999999)
+ {
+ return 3;
+ }
+ else
+ {
+ throw new ArgumentOutOfRangeException($"{nameof(eCIValue)} should be in range: 0 to 999999.");
+ }
+ }
+
+ /// <remarks>ISO/IEC 18004:2006E ECI Designator Page 24</remarks>
+ /// <param name="eCIValue">Range: 0 ~ 999999</param>
+ /// <returns>Number of bits for ECI Assignment Value</returns>
+ private static int NumOfAssignmentBits(int eCIValue) => NumOfCodewords(eCIValue) * 8;
+
private void AppendECI(string name, int value, AppendOption option)
{
switch (option)
@@ -111,6 +139,11 @@ namespace Gma.QrCodeNet.Encoding.DataEncodation
AppendECI("utf-8", 26, option);
}
+ /// <remarks>ISO/IEC 18004:2006E ECI Designator Page 24</remarks>
+ /// <param name="eCIValue">Range: 0 ~ 999999</param>
+ /// <returns>Number of bits for ECI Header</returns>
+ internal static int NumOfECIHeaderBits(int eCIValue) => NumOfAssignmentBits(eCIValue) + 4;
+
internal int GetECIValueByName(string encodingName)
{
if (_nameToValue is null)
@@ -145,39 +178,6 @@ namespace Gma.QrCodeNet.Encoding.DataEncodation
}
}
- /// <remarks>ISO/IEC 18004:2006E ECI Designator Page 24</remarks>
- /// <param name="eCIValue">Range: 0 ~ 999999</param>
- /// <returns>Number of Codewords(Byte) for ECI Assignment Value</returns>
- private static int NumOfCodewords(int eCIValue)
- {
- if (eCIValue >= 0 && eCIValue <= 127)
- {
- return 1;
- }
- else if (eCIValue > 127 && eCIValue <= 16383)
- {
- return 2;
- }
- else if (eCIValue > 16383 && eCIValue <= 999999)
- {
- return 3;
- }
- else
- {
- throw new ArgumentOutOfRangeException($"{nameof(eCIValue)} should be in range: 0 to 999999.");
- }
- }
-
- /// <remarks>ISO/IEC 18004:2006E ECI Designator Page 24</remarks>
- /// <param name="eCIValue">Range: 0 ~ 999999</param>
- /// <returns>Number of bits for ECI Assignment Value</returns>
- private static int NumOfAssignmentBits(int eCIValue) => NumOfCodewords(eCIValue) * 8;
-
- /// <remarks>ISO/IEC 18004:2006E ECI Designator Page 24</remarks>
- /// <param name="eCIValue">Range: 0 ~ 999999</param>
- /// <returns>Number of bits for ECI Header</returns>
- internal static int NumOfECIHeaderBits(int eCIValue) => NumOfAssignmentBits(eCIValue) + 4;
-
/// <returns>ECI table in Dictionary collection</returns>
public Dictionary<string, int> GetECITable()
{

Order static elements