From a4947b0b2d771139c38de240aaee1c69ba440e2c Mon Sep 17 00:00:00 2001 From: dangershony Date: Fri, 22 Jan 2021 18:47:59 +0000 Subject: [PATCH 1/3] Creating a method to auto generate the test wallet db --- .../Blockcore.IntegrationTests.Common.csproj | 6 + .../ReadyData/wallet-data-table.json | 9 + .../ReadyData/wallet-transactions-table.json | 524 ++++++++++++++++++ .../Blockcore.IntegrationTests.csproj | 7 + .../GenerateChain.cs | 180 +++++- .../Wallet/Data/txdb/wallet-with-funds.db | Bin 0 -> 73728 bytes .../Wallet/Data/wallet-with-funds.db | Bin 163840 -> 0 bytes .../Wallet/WalletOperationsTests.cs | 2 +- .../Wallet/WalletPostOperationsTests.cs | 2 +- 9 files changed, 727 insertions(+), 3 deletions(-) create mode 100644 src/Tests/Blockcore.IntegrationTests.Common/ReadyData/wallet-data-table.json create mode 100644 src/Tests/Blockcore.IntegrationTests.Common/ReadyData/wallet-transactions-table.json create mode 100644 src/Tests/Blockcore.IntegrationTests/Wallet/Data/txdb/wallet-with-funds.db delete mode 100644 src/Tests/Blockcore.IntegrationTests/Wallet/Data/wallet-with-funds.db diff --git a/src/Tests/Blockcore.IntegrationTests.Common/Blockcore.IntegrationTests.Common.csproj b/src/Tests/Blockcore.IntegrationTests.Common/Blockcore.IntegrationTests.Common.csproj index 31645a2ca..24d827e07 100644 --- a/src/Tests/Blockcore.IntegrationTests.Common/Blockcore.IntegrationTests.Common.csproj +++ b/src/Tests/Blockcore.IntegrationTests.Common/Blockcore.IntegrationTests.Common.csproj @@ -82,6 +82,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + diff --git a/src/Tests/Blockcore.IntegrationTests.Common/ReadyData/wallet-data-table.json b/src/Tests/Blockcore.IntegrationTests.Common/ReadyData/wallet-data-table.json new file mode 100644 index 000000000..08e48d620 --- /dev/null +++ b/src/Tests/Blockcore.IntegrationTests.Common/ReadyData/wallet-data-table.json @@ -0,0 +1,9 @@ +[ + { + "Id": "Key", + "EncryptedSeed": "6PYVfbtgR2vvkEtjCGFSq6v2nRoZMc2X1yPo5jG9TmGfCdQaoP8cR3iVLf", + "WalletName": "wallet-with-funds", + "WalletTip": "612591-d79c85e49d4024adb6f5d0a4e84aabac7a12f5964d41d3f16af3dedef22a2ad7", + "BlockLocator": [ "d79c85e49d4024adb6f5d0a4e84aabac7a12f5964d41d3f16af3dedef22a2ad7", "4b879668ea35a9dc1d0dee41263b8016cefb1ad61675a81a196f105a605f6253", "bba5ab001f7062f83b03d80879be19cdaa986830dc8dec8a4a1e562ab147e70b", "2e1a140297f7eaa1bed438c212a96b21c7d9c04769453a2c9cc268df98aa8ed9", "493bd83839f93cbcc889815262a3f3e54103dccb260051048e23b5604afcdcb0", "f11e1a27ca52006fd47d51a706648ea7b5a9f192a61710d0e82c835828abef5f", "580f36fa1c57bf64f11df5fbe239c022097f637e64ac5bbc3c3899435d0071a0", "f62357b1d4672f4eb6b1f963adb0ead2b307102cae5387732b642e8564400c6d", "9870ae47fcc2738ca011cb74d61f67f9da07b7438ff3d09dc6fa02917e13a48d", "63b4aba410a3b3c527eabe38412166d89f0e098d19a3bd052c70b155ebd0d0f5", "7b2d2fe5d7c4c4dd01c7d456bb288a684f3a901b0d12453cb77d199d609f710f", "feec721ef1f80e5e012eed5afe9ca78cde43f3494b08aca7f49ec15cf1737171", "d7345f76239eaaa5323d6e1fe7900e26909d4007a06a09b7f8a5010c9e318326", "a1afdab1e03cda7055678ca3cef5fc7a0f9d06bc0fcafc6700ffae77bceea452", "b7911ba105301945ccf59ae3b78921a8e7198ee82d6ec25e9b7a754a7ac1002e", "e9c38e323f466535b8bc6835c90bf260f360d5736ddd42e9cf64b0ac221f679b", "b2f5ee550f209aa5f7ce6f4422763e7ef79f3386f745b70939bda2da5a76bf6b", "5a90d268ba726930203c9adc2537e7f962b22452edc97146d0e6d8d179c84e54", "eafd04ba3a794d9a1c12269796e9b8c4ac7449bb7ea7cf9e206b14a3fc279ef9", "a9c671439827cb12a5295949bbfe601eab867c0370c91044dd385f64275ac84f", "a43d26bb6f835a520af7dd45a6c526557b9b5885faeabe64c932a5a7bca9769f", "0e15cd950c3b11c9f2a9c202a604b767fc7831da0dd1ea92c327a5406fac7040", "8af05078c9ec117b47406ab37c78ff770df562cdd605455e0f0718f8b9d0e5c0", "3c5292dd49bd3a004c355583c418c23793a713fac520cf14d29dfc598325186b", "33cc2264bf832b1eb27684bb9b64e83e7356a8b1571feae9f520dbb6deb3c6be", "180c94c93bd809a7d485114f5836e838902cd46ce0f613284c90be7a5846e816", "a2ec04f0f3544be538f483b8ae30043154d4e84a6cc63fd3aa3b12b749afbf27", "462091fa4e345b8d3b8985a363a555abdd5826a94d5ef201fadddeeadef2e9aa", "70d26875349c222a1c8b48c85ac382d8c10cdd594df773550ef45f551a68f901", "86f4b8458194221f5a94f00b5b396a24a9c12e97a42e92e29879c17a64941888", "00000e246d7b73b88c9ab55f2e5e94d9e22d471def3df5ea448f5576b1d156b9" ] + } +] \ No newline at end of file diff --git a/src/Tests/Blockcore.IntegrationTests.Common/ReadyData/wallet-transactions-table.json b/src/Tests/Blockcore.IntegrationTests.Common/ReadyData/wallet-transactions-table.json new file mode 100644 index 000000000..14a627e5e --- /dev/null +++ b/src/Tests/Blockcore.IntegrationTests.Common/ReadyData/wallet-transactions-table.json @@ -0,0 +1,524 @@ +[ + { + "OutPoint": "385ed3fd641f2c33f7c03b9698e69ff03beea90f1e1e0a5943b1a0f4fd29ed97-0", + "Address": "TFspxD1w7SxgYanNDGKkgcFj3ihqK1ktAJ", + "Id": "385ed3fd641f2c33f7c03b9698e69ff03beea90f1e1e0a5943b1a0f4fd29ed97", + "Amount": 2499999997700, + "Index": 0, + "BlockHeight": 72, + "BlockHash": "def1f8b45271a030782cf5106ec38fccbed10dd7a07810cd43ba19c4eb9b935c", + "CreationTime": "1540231296", + "ScriptPubKey": "76a91440cc44e95b9f502cd44893891c19a826494d702f88ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "385ed3fd641f2c33f7c03b9698e69ff03beea90f1e1e0a5943b1a0f4fd29ed97-1", + "Address": "TJkod1GniJG1CA55CrmxNi5emaYNTWwLnj", + "Id": "385ed3fd641f2c33f7c03b9698e69ff03beea90f1e1e0a5943b1a0f4fd29ed97", + "Amount": 2500000000000, + "Index": 1, + "BlockHeight": 72, + "BlockHash": "def1f8b45271a030782cf5106ec38fccbed10dd7a07810cd43ba19c4eb9b935c", + "CreationTime": "1540231296", + "ScriptPubKey": "76a91460609fa94fa6668c62c68baf8dcbc31eeb15240488ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "3ae2ca48712670395b14c616f5c0224359866b53244511409ed0248ea73a49be-1", + "Address": "TBrCEVwwp3pqxUfAV6yqQ1TCMFYkp4e5HC", + "Id": "3ae2ca48712670395b14c616f5c0224359866b53244511409ed0248ea73a49be", + "Amount": 100000000000000, + "Index": 1, + "BlockHeight": 94, + "BlockHash": "27247426eab0a915513a4d8e06e6117548dc79eb722d1b347f11790679a5b824", + "CreationTime": "1540232544", + "ScriptPubKey": "76a914149cb2d2735d7d52bd64d73f6a523d4d9130bbc888ac", + "IsPropagated": true, + "SpendingDetails": { + "TransactionId": "ecffe31056399a844b0608fa84bc0b62201bd36d051cf150c04f87dce55a0a49", + "Payments": [], + "BlockHeight": 116, + "IsCoinStake": true, + "CreationTime": "1540234352" + }, + "AccountIndex": 0 + }, + { + "OutPoint": "3ccdfdce538eabe4d18efd2ee8fdc2554dc95cae6ce082aa4b5c7b9074b2e0a3-1", + "Address": "TRCT9QP3ipb6zCvW15yKoEtaU418UaKVE2", + "Id": "3ccdfdce538eabe4d18efd2ee8fdc2554dc95cae6ce082aa4b5c7b9074b2e0a3", + "Amount": 10000000000000, + "Index": 1, + "BlockHeight": 10, + "BlockHash": "54ea867ad7c0ee923b4d8f11a6c68edcc5a01b50e8cf3afb493c46df7391dc67", + "CreationTime": "1540211312", + "ScriptPubKey": "76a914a70b19d97a01e0bea6a7beeaea4b9c78b995a07588ac", + "IsPropagated": true, + "SpendingDetails": { + "TransactionId": "9ba03170f7a9e65d19a92e948cb9c7aab832992cad5178e248d1761710167d44", + "Payments": [], + "BlockHeight": 105, + "IsCoinStake": true, + "CreationTime": "1540233728" + }, + "AccountIndex": 0 + }, + { + "OutPoint": "4f1766c2dca4bb96bb7282b4eef113c0956f1ad50ba1a205bec50c7770cac2d5-1", + "Address": "TRCT9QP3ipb6zCvW15yKoEtaU418UaKVE2", + "Id": "4f1766c2dca4bb96bb7282b4eef113c0956f1ad50ba1a205bec50c7770cac2d5", + "Amount": 150000000000, + "Index": 1, + "BlockHeight": 36, + "BlockHash": "935b98019c1f687cd196adfa37ef6cc4e49201243a56600a3dc87c35ab2f5936", + "CreationTime": "1540229600", + "ScriptPubKey": "76a914a70b19d97a01e0bea6a7beeaea4b9c78b995a07588ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "7b690b85b1589f6519b484a10ef0a782d661476d22278ad95de8d91caa52c20f-0", + "Address": "TQJphNZMvQqcCUD4tD59AX3co4d6v5wEBM", + "Id": "7b690b85b1589f6519b484a10ef0a782d661476d22278ad95de8d91caa52c20f", + "Amount": 100000000000, + "Index": 0, + "CreationTime": "1540236867", + "ScriptPubKey": "76a9149d477602f7db6373421ada2dd54da6c6f777abbe88ac", + "IsPropagated": false, + "AccountIndex": 0 + }, + { + "OutPoint": "8b2e57f8959272d357682ede444244d9831cb47e9c936ea9452657a5633a53b5-0", + "Address": "TMwfNfwRD4gzCqimgUiBSdioyPmV3X6HLC", + "Id": "8b2e57f8959272d357682ede444244d9831cb47e9c936ea9452657a5633a53b5", + "Amount": 39999997700, + "Index": 0, + "BlockHeight": 74, + "BlockHash": "d97bada993f477915b02937ac6e08f1c4634d1a5ae456d683cc7236437226801", + "CreationTime": "1540231472", + "ScriptPubKey": "76a9148356b13788b5160d66f2332d12bc30f61cea92cc88ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "9ba03170f7a9e65d19a92e948cb9c7aab832992cad5178e248d1761710167d44-1", + "Address": "TRCT9QP3ipb6zCvW15yKoEtaU418UaKVE2", + "Id": "9ba03170f7a9e65d19a92e948cb9c7aab832992cad5178e248d1761710167d44", + "Amount": 1250012500000, + "IsCoinStake": true, + "Index": 1, + "BlockHeight": 105, + "BlockHash": "c91adbcd12cdbd80914fd45ca99930892b4ef65d2b42384f1798e496c3c2b785", + "CreationTime": "1540233728", + "ScriptPubKey": "2103a49886750794318c6f2da737d4835367890760b0616d59f6852d6404f968007aac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "9ba03170f7a9e65d19a92e948cb9c7aab832992cad5178e248d1761710167d44-2", + "Address": "TRCT9QP3ipb6zCvW15yKoEtaU418UaKVE2", + "Id": "9ba03170f7a9e65d19a92e948cb9c7aab832992cad5178e248d1761710167d44", + "Amount": 1250012500000, + "IsCoinStake": true, + "Index": 2, + "BlockHeight": 105, + "BlockHash": "c91adbcd12cdbd80914fd45ca99930892b4ef65d2b42384f1798e496c3c2b785", + "CreationTime": "1540233728", + "ScriptPubKey": "2103a49886750794318c6f2da737d4835367890760b0616d59f6852d6404f968007aac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "9ba03170f7a9e65d19a92e948cb9c7aab832992cad5178e248d1761710167d44-3", + "Address": "TRCT9QP3ipb6zCvW15yKoEtaU418UaKVE2", + "Id": "9ba03170f7a9e65d19a92e948cb9c7aab832992cad5178e248d1761710167d44", + "Amount": 1250012500000, + "IsCoinStake": true, + "Index": 3, + "BlockHeight": 105, + "BlockHash": "c91adbcd12cdbd80914fd45ca99930892b4ef65d2b42384f1798e496c3c2b785", + "CreationTime": "1540233728", + "ScriptPubKey": "2103a49886750794318c6f2da737d4835367890760b0616d59f6852d6404f968007aac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "9ba03170f7a9e65d19a92e948cb9c7aab832992cad5178e248d1761710167d44-4", + "Address": "TRCT9QP3ipb6zCvW15yKoEtaU418UaKVE2", + "Id": "9ba03170f7a9e65d19a92e948cb9c7aab832992cad5178e248d1761710167d44", + "Amount": 1250012500000, + "IsCoinStake": true, + "Index": 4, + "BlockHeight": 105, + "BlockHash": "c91adbcd12cdbd80914fd45ca99930892b4ef65d2b42384f1798e496c3c2b785", + "CreationTime": "1540233728", + "ScriptPubKey": "2103a49886750794318c6f2da737d4835367890760b0616d59f6852d6404f968007aac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "9ba03170f7a9e65d19a92e948cb9c7aab832992cad5178e248d1761710167d44-5", + "Address": "TRCT9QP3ipb6zCvW15yKoEtaU418UaKVE2", + "Id": "9ba03170f7a9e65d19a92e948cb9c7aab832992cad5178e248d1761710167d44", + "Amount": 1250012500000, + "IsCoinStake": true, + "Index": 5, + "BlockHeight": 105, + "BlockHash": "c91adbcd12cdbd80914fd45ca99930892b4ef65d2b42384f1798e496c3c2b785", + "CreationTime": "1540233728", + "ScriptPubKey": "2103a49886750794318c6f2da737d4835367890760b0616d59f6852d6404f968007aac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "9ba03170f7a9e65d19a92e948cb9c7aab832992cad5178e248d1761710167d44-6", + "Address": "TRCT9QP3ipb6zCvW15yKoEtaU418UaKVE2", + "Id": "9ba03170f7a9e65d19a92e948cb9c7aab832992cad5178e248d1761710167d44", + "Amount": 1250012500000, + "IsCoinStake": true, + "Index": 6, + "BlockHeight": 105, + "BlockHash": "c91adbcd12cdbd80914fd45ca99930892b4ef65d2b42384f1798e496c3c2b785", + "CreationTime": "1540233728", + "ScriptPubKey": "2103a49886750794318c6f2da737d4835367890760b0616d59f6852d6404f968007aac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "9ba03170f7a9e65d19a92e948cb9c7aab832992cad5178e248d1761710167d44-7", + "Address": "TRCT9QP3ipb6zCvW15yKoEtaU418UaKVE2", + "Id": "9ba03170f7a9e65d19a92e948cb9c7aab832992cad5178e248d1761710167d44", + "Amount": 1250012500000, + "IsCoinStake": true, + "Index": 7, + "BlockHeight": 105, + "BlockHash": "c91adbcd12cdbd80914fd45ca99930892b4ef65d2b42384f1798e496c3c2b785", + "CreationTime": "1540233728", + "ScriptPubKey": "2103a49886750794318c6f2da737d4835367890760b0616d59f6852d6404f968007aac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "9ba03170f7a9e65d19a92e948cb9c7aab832992cad5178e248d1761710167d44-8", + "Address": "TRCT9QP3ipb6zCvW15yKoEtaU418UaKVE2", + "Id": "9ba03170f7a9e65d19a92e948cb9c7aab832992cad5178e248d1761710167d44", + "Amount": 1250012500000, + "IsCoinStake": true, + "Index": 8, + "BlockHeight": 105, + "BlockHash": "c91adbcd12cdbd80914fd45ca99930892b4ef65d2b42384f1798e496c3c2b785", + "CreationTime": "1540233728", + "ScriptPubKey": "2103a49886750794318c6f2da737d4835367890760b0616d59f6852d6404f968007aac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "a40cf5f3c20cf265f5e1a360c7c984688b191993792e7a9cd6227c952b840710-1", + "Address": "TSPZFwU7Drs6mZAvJwvcJkRhZpitRPpRLj", + "Id": "a40cf5f3c20cf265f5e1a360c7c984688b191993792e7a9cd6227c952b840710", + "Amount": 19000000000000, + "Index": 1, + "BlockHeight": 100, + "BlockHash": "f5ddd61dba71e07ccb3188c09862c4872752584fa3fa6980858a1cae62944223", + "CreationTime": "1540233520", + "ScriptPubKey": "76a914b41ce7ab15efd7ed46bcf5d0c77dee9e2951abb188ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "b5a111b97dd3764d45e3a4a014433fef2200c212434c08a3106930196bd366cf-1", + "Address": "TB4LrSQxvubrEQR87RtypAadr9vvCnZAgN", + "Id": "b5a111b97dd3764d45e3a4a014433fef2200c212434c08a3106930196bd366cf", + "Amount": 1000012500000, + "IsCoinStake": true, + "Index": 1, + "BlockHeight": 120, + "BlockHash": "a1afdab1e03cda7055678ca3cef5fc7a0f9d06bc0fcafc6700ffae77bceea452", + "CreationTime": "1540234384", + "ScriptPubKey": "2103a22da24b8922d4cec261c204316fc8ff250d716b17f52f4e78629d344cf031f9ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "b5a111b97dd3764d45e3a4a014433fef2200c212434c08a3106930196bd366cf-2", + "Address": "TB4LrSQxvubrEQR87RtypAadr9vvCnZAgN", + "Id": "b5a111b97dd3764d45e3a4a014433fef2200c212434c08a3106930196bd366cf", + "Amount": 1000012500000, + "IsCoinStake": true, + "Index": 2, + "BlockHeight": 120, + "BlockHash": "a1afdab1e03cda7055678ca3cef5fc7a0f9d06bc0fcafc6700ffae77bceea452", + "CreationTime": "1540234384", + "ScriptPubKey": "2103a22da24b8922d4cec261c204316fc8ff250d716b17f52f4e78629d344cf031f9ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "b5a111b97dd3764d45e3a4a014433fef2200c212434c08a3106930196bd366cf-3", + "Address": "TB4LrSQxvubrEQR87RtypAadr9vvCnZAgN", + "Id": "b5a111b97dd3764d45e3a4a014433fef2200c212434c08a3106930196bd366cf", + "Amount": 1000012500000, + "IsCoinStake": true, + "Index": 3, + "BlockHeight": 120, + "BlockHash": "a1afdab1e03cda7055678ca3cef5fc7a0f9d06bc0fcafc6700ffae77bceea452", + "CreationTime": "1540234384", + "ScriptPubKey": "2103a22da24b8922d4cec261c204316fc8ff250d716b17f52f4e78629d344cf031f9ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "b5a111b97dd3764d45e3a4a014433fef2200c212434c08a3106930196bd366cf-4", + "Address": "TB4LrSQxvubrEQR87RtypAadr9vvCnZAgN", + "Id": "b5a111b97dd3764d45e3a4a014433fef2200c212434c08a3106930196bd366cf", + "Amount": 1000012500000, + "IsCoinStake": true, + "Index": 4, + "BlockHeight": 120, + "BlockHash": "a1afdab1e03cda7055678ca3cef5fc7a0f9d06bc0fcafc6700ffae77bceea452", + "CreationTime": "1540234384", + "ScriptPubKey": "2103a22da24b8922d4cec261c204316fc8ff250d716b17f52f4e78629d344cf031f9ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "b5a111b97dd3764d45e3a4a014433fef2200c212434c08a3106930196bd366cf-5", + "Address": "TB4LrSQxvubrEQR87RtypAadr9vvCnZAgN", + "Id": "b5a111b97dd3764d45e3a4a014433fef2200c212434c08a3106930196bd366cf", + "Amount": 1000012500000, + "IsCoinStake": true, + "Index": 5, + "BlockHeight": 120, + "BlockHash": "a1afdab1e03cda7055678ca3cef5fc7a0f9d06bc0fcafc6700ffae77bceea452", + "CreationTime": "1540234384", + "ScriptPubKey": "2103a22da24b8922d4cec261c204316fc8ff250d716b17f52f4e78629d344cf031f9ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "b5a111b97dd3764d45e3a4a014433fef2200c212434c08a3106930196bd366cf-6", + "Address": "TB4LrSQxvubrEQR87RtypAadr9vvCnZAgN", + "Id": "b5a111b97dd3764d45e3a4a014433fef2200c212434c08a3106930196bd366cf", + "Amount": 1000012500000, + "IsCoinStake": true, + "Index": 6, + "BlockHeight": 120, + "BlockHash": "a1afdab1e03cda7055678ca3cef5fc7a0f9d06bc0fcafc6700ffae77bceea452", + "CreationTime": "1540234384", + "ScriptPubKey": "2103a22da24b8922d4cec261c204316fc8ff250d716b17f52f4e78629d344cf031f9ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "b5a111b97dd3764d45e3a4a014433fef2200c212434c08a3106930196bd366cf-7", + "Address": "TB4LrSQxvubrEQR87RtypAadr9vvCnZAgN", + "Id": "b5a111b97dd3764d45e3a4a014433fef2200c212434c08a3106930196bd366cf", + "Amount": 1000012500000, + "IsCoinStake": true, + "Index": 7, + "BlockHeight": 120, + "BlockHash": "a1afdab1e03cda7055678ca3cef5fc7a0f9d06bc0fcafc6700ffae77bceea452", + "CreationTime": "1540234384", + "ScriptPubKey": "2103a22da24b8922d4cec261c204316fc8ff250d716b17f52f4e78629d344cf031f9ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "b5a111b97dd3764d45e3a4a014433fef2200c212434c08a3106930196bd366cf-8", + "Address": "TB4LrSQxvubrEQR87RtypAadr9vvCnZAgN", + "Id": "b5a111b97dd3764d45e3a4a014433fef2200c212434c08a3106930196bd366cf", + "Amount": 1000012500000, + "IsCoinStake": true, + "Index": 8, + "BlockHeight": 120, + "BlockHash": "a1afdab1e03cda7055678ca3cef5fc7a0f9d06bc0fcafc6700ffae77bceea452", + "CreationTime": "1540234384", + "ScriptPubKey": "2103a22da24b8922d4cec261c204316fc8ff250d716b17f52f4e78629d344cf031f9ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "bfc1e9b8cafbcb3976b42f57f4f1da2342e79ac1600ac02acdbdb6c94132395b-1", + "Address": "TB4LrSQxvubrEQR87RtypAadr9vvCnZAgN", + "Id": "bfc1e9b8cafbcb3976b42f57f4f1da2342e79ac1600ac02acdbdb6c94132395b", + "Amount": 8000000000000, + "Index": 1, + "BlockHeight": 50, + "BlockHash": "7c983c6f134aff71c2a2444fc7062c43cc198138ad74b90c31970a12b336ac0c", + "CreationTime": "1540228624", + "ScriptPubKey": "76a9140bf0c274bc9fa6878e737e07b8ba7bff6ba1707988ac", + "IsPropagated": true, + "SpendingDetails": { + "TransactionId": "b5a111b97dd3764d45e3a4a014433fef2200c212434c08a3106930196bd366cf", + "Payments": [], + "BlockHeight": 120, + "IsCoinStake": true, + "CreationTime": "1540234384" + }, + "AccountIndex": 0 + }, + { + "OutPoint": "c59004311a96d43ba30294d0b833a9d1ab1fc0210880b6ea3c7a620511394459-1", + "Address": "TJ7JpLHqhP4t8kNtAs7X8G1scNAxsPiRcY", + "Id": "c59004311a96d43ba30294d0b833a9d1ab1fc0210880b6ea3c7a620511394459", + "Amount": 5000000000000, + "Index": 1, + "BlockHeight": 31, + "BlockHash": "4467e3a935aa5ea8c53e38f54b1de3432eb49cb3fdddfa8270b5b5378060294d", + "CreationTime": "1540227680", + "ScriptPubKey": "76a9145949302a4e6ce82ca539262d04a652857e0338bb88ac", + "IsPropagated": true, + "SpendingDetails": { + "TransactionId": "385ed3fd641f2c33f7c03b9698e69ff03beea90f1e1e0a5943b1a0f4fd29ed97", + "Payments": [ + { + "DestinationScriptPubKey": "76a91460609fa94fa6668c62c68baf8dcbc31eeb15240488ac", + "DestinationAddress": "TJkod1GniJG1CA55CrmxNi5emaYNTWwLnj", + "Amount": 2500000000000 + } + ], + "BlockHeight": 72, + "CreationTime": "1540231296" + }, + "AccountIndex": 0 + }, + { + "OutPoint": "e92f84829f90f62be193c03a1c32f5d4b2fc4edcf8c96a8b7fd5176c47d14cd1-0", + "Address": "TKGmMkUwYiB2ezdNeKgn5rTEAVSBErxkbH", + "Id": "e92f84829f90f62be193c03a1c32f5d4b2fc4edcf8c96a8b7fd5176c47d14cd1", + "Amount": 700000000000, + "Index": 0, + "BlockHeight": 36, + "BlockHash": "935b98019c1f687cd196adfa37ef6cc4e49201243a56600a3dc87c35ab2f5936", + "CreationTime": "1540229600", + "ScriptPubKey": "76a914660b36a541f8b4a9d6c31e3a3c5938955b399d0f88ac", + "IsPropagated": true, + "SpendingDetails": { + "TransactionId": "8b2e57f8959272d357682ede444244d9831cb47e9c936ea9452657a5633a53b5", + "Payments": [ + { + "DestinationScriptPubKey": "76a914022fb220001308fd03e7465c6f1306b4917b45e188ac", + "DestinationAddress": "TAAmVQSfLRQhnqcC7R4EhrknAiW3Zvfkoy", + "Amount": 660000000000 + } + ], + "BlockHeight": 74, + "CreationTime": "1540231472" + }, + "AccountIndex": 0 + }, + { + "OutPoint": "ecffe31056399a844b0608fa84bc0b62201bd36d051cf150c04f87dce55a0a49-1", + "Address": "TBrCEVwwp3pqxUfAV6yqQ1TCMFYkp4e5HC", + "Id": "ecffe31056399a844b0608fa84bc0b62201bd36d051cf150c04f87dce55a0a49", + "Amount": 12500012500000, + "IsCoinStake": true, + "Index": 1, + "BlockHeight": 116, + "BlockHash": "3a6c249d7fcfd46b1d160e18d94a3135c573b5d5ff5d16ac23d23eafaea65af6", + "CreationTime": "1540234352", + "ScriptPubKey": "210367aefe5232c0f1217511c4ae08ea970f166f66e7bc014813564c95a9df514f87ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "ecffe31056399a844b0608fa84bc0b62201bd36d051cf150c04f87dce55a0a49-2", + "Address": "TBrCEVwwp3pqxUfAV6yqQ1TCMFYkp4e5HC", + "Id": "ecffe31056399a844b0608fa84bc0b62201bd36d051cf150c04f87dce55a0a49", + "Amount": 12500012500000, + "IsCoinStake": true, + "Index": 2, + "BlockHeight": 116, + "BlockHash": "3a6c249d7fcfd46b1d160e18d94a3135c573b5d5ff5d16ac23d23eafaea65af6", + "CreationTime": "1540234352", + "ScriptPubKey": "210367aefe5232c0f1217511c4ae08ea970f166f66e7bc014813564c95a9df514f87ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "ecffe31056399a844b0608fa84bc0b62201bd36d051cf150c04f87dce55a0a49-3", + "Address": "TBrCEVwwp3pqxUfAV6yqQ1TCMFYkp4e5HC", + "Id": "ecffe31056399a844b0608fa84bc0b62201bd36d051cf150c04f87dce55a0a49", + "Amount": 12500012500000, + "IsCoinStake": true, + "Index": 3, + "BlockHeight": 116, + "BlockHash": "3a6c249d7fcfd46b1d160e18d94a3135c573b5d5ff5d16ac23d23eafaea65af6", + "CreationTime": "1540234352", + "ScriptPubKey": "210367aefe5232c0f1217511c4ae08ea970f166f66e7bc014813564c95a9df514f87ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "ecffe31056399a844b0608fa84bc0b62201bd36d051cf150c04f87dce55a0a49-4", + "Address": "TBrCEVwwp3pqxUfAV6yqQ1TCMFYkp4e5HC", + "Id": "ecffe31056399a844b0608fa84bc0b62201bd36d051cf150c04f87dce55a0a49", + "Amount": 12500012500000, + "IsCoinStake": true, + "Index": 4, + "BlockHeight": 116, + "BlockHash": "3a6c249d7fcfd46b1d160e18d94a3135c573b5d5ff5d16ac23d23eafaea65af6", + "CreationTime": "1540234352", + "ScriptPubKey": "210367aefe5232c0f1217511c4ae08ea970f166f66e7bc014813564c95a9df514f87ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "ecffe31056399a844b0608fa84bc0b62201bd36d051cf150c04f87dce55a0a49-5", + "Address": "TBrCEVwwp3pqxUfAV6yqQ1TCMFYkp4e5HC", + "Id": "ecffe31056399a844b0608fa84bc0b62201bd36d051cf150c04f87dce55a0a49", + "Amount": 12500012500000, + "IsCoinStake": true, + "Index": 5, + "BlockHeight": 116, + "BlockHash": "3a6c249d7fcfd46b1d160e18d94a3135c573b5d5ff5d16ac23d23eafaea65af6", + "CreationTime": "1540234352", + "ScriptPubKey": "210367aefe5232c0f1217511c4ae08ea970f166f66e7bc014813564c95a9df514f87ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "ecffe31056399a844b0608fa84bc0b62201bd36d051cf150c04f87dce55a0a49-6", + "Address": "TBrCEVwwp3pqxUfAV6yqQ1TCMFYkp4e5HC", + "Id": "ecffe31056399a844b0608fa84bc0b62201bd36d051cf150c04f87dce55a0a49", + "Amount": 12500012500000, + "IsCoinStake": true, + "Index": 6, + "BlockHeight": 116, + "BlockHash": "3a6c249d7fcfd46b1d160e18d94a3135c573b5d5ff5d16ac23d23eafaea65af6", + "CreationTime": "1540234352", + "ScriptPubKey": "210367aefe5232c0f1217511c4ae08ea970f166f66e7bc014813564c95a9df514f87ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "ecffe31056399a844b0608fa84bc0b62201bd36d051cf150c04f87dce55a0a49-7", + "Address": "TBrCEVwwp3pqxUfAV6yqQ1TCMFYkp4e5HC", + "Id": "ecffe31056399a844b0608fa84bc0b62201bd36d051cf150c04f87dce55a0a49", + "Amount": 12500012500000, + "IsCoinStake": true, + "Index": 7, + "BlockHeight": 116, + "BlockHash": "3a6c249d7fcfd46b1d160e18d94a3135c573b5d5ff5d16ac23d23eafaea65af6", + "CreationTime": "1540234352", + "ScriptPubKey": "210367aefe5232c0f1217511c4ae08ea970f166f66e7bc014813564c95a9df514f87ac", + "IsPropagated": true, + "AccountIndex": 0 + }, + { + "OutPoint": "ecffe31056399a844b0608fa84bc0b62201bd36d051cf150c04f87dce55a0a49-8", + "Address": "TBrCEVwwp3pqxUfAV6yqQ1TCMFYkp4e5HC", + "Id": "ecffe31056399a844b0608fa84bc0b62201bd36d051cf150c04f87dce55a0a49", + "Amount": 12500012500000, + "IsCoinStake": true, + "Index": 8, + "BlockHeight": 116, + "BlockHash": "3a6c249d7fcfd46b1d160e18d94a3135c573b5d5ff5d16ac23d23eafaea65af6", + "CreationTime": "1540234352", + "ScriptPubKey": "210367aefe5232c0f1217511c4ae08ea970f166f66e7bc014813564c95a9df514f87ac", + "IsPropagated": true, + "AccountIndex": 0 + } +] \ No newline at end of file diff --git a/src/Tests/Blockcore.IntegrationTests/Blockcore.IntegrationTests.csproj b/src/Tests/Blockcore.IntegrationTests/Blockcore.IntegrationTests.csproj index 198d2bf38..cc245dffb 100644 --- a/src/Tests/Blockcore.IntegrationTests/Blockcore.IntegrationTests.csproj +++ b/src/Tests/Blockcore.IntegrationTests/Blockcore.IntegrationTests.csproj @@ -74,6 +74,9 @@ Always + + PreserveNewest + Always @@ -84,4 +87,8 @@ PreserveNewest + + + + \ No newline at end of file diff --git a/src/Tests/Blockcore.IntegrationTests/GenerateChain.cs b/src/Tests/Blockcore.IntegrationTests/GenerateChain.cs index a48991197..57cb97309 100644 --- a/src/Tests/Blockcore.IntegrationTests/GenerateChain.cs +++ b/src/Tests/Blockcore.IntegrationTests/GenerateChain.cs @@ -1,6 +1,13 @@ -using System.IO; +using System; +using System.Collections.Generic; +using System.IO; using System.IO.Compression; using System.Linq; +using Blockcore.Configuration; +using Blockcore.Consensus.ScriptInfo; +using Blockcore.Consensus.TransactionInfo; +using Blockcore.Features.Wallet.Database; +using Blockcore.Features.Wallet.Types; using Blockcore.IntegrationTests.Common; using Blockcore.IntegrationTests.Common.EnvironmentMockUpHelpers; using Blockcore.IntegrationTests.Common.Extensions; @@ -8,7 +15,11 @@ using Blockcore.Networks.Bitcoin; using Blockcore.Networks.Stratis; using Blockcore.Tests.Common; +using Blockcore.Utilities; +using Blockcore.Utilities.JsonConverters; using NBitcoin; +using NBitcoin.DataEncoders; +using Newtonsoft.Json; using Xunit; namespace Blockcore.IntegrationTests @@ -20,6 +31,7 @@ public class GenerateChain private const string MinerMnemonic = "elevator slight dad hair table forum maze feed trim ignore field mystery"; private const string ListenerMnemonic = "seminar cool use bleak drink section rent bid language obey skin round"; private const string DataPath = @"..\..\..\..\Blockcore.IntegrationTests.Common\ReadyData"; + private const string WalletOutputDataPath = @"..\..\..\..\\Blockcore.IntegrationTests\Wallet\Data"; public GenerateChain() { @@ -62,6 +74,92 @@ public void CreateBitcoinBlockchainDataWith150Blocks() this.GenerateBitcoinBlockchainData(new BitcoinRegTest(), 150, true, true, true); } + [Fact(Skip = SkipTestMessage)] + public void CreateWalletData() + { + string walltName = "wallet-with-funds"; + string path = Path.Combine(WalletOutputDataPath + @"\txdb", walltName + ".db"); + + if (File.Exists(path)) + { + File.Delete(path); + } + + var network = new BitcoinRegTest(); + var folder = new DataFolder(WalletOutputDataPath); + var wallet = new Features.Wallet.Types.Wallet() { Name = walltName }; + + var walletStore = new WalletStore(network, folder, wallet); + + string dataPath = Path.Combine(DataPath, "wallet-data-table.json"); + + var dataTable = JsonConvert.DeserializeObject(File.ReadAllText(dataPath))[0]; + + WalletData walletData = new WalletData + { + Key = dataTable.Id, + WalletName = dataTable.WalletName, + EncryptedSeed = dataTable.EncryptedSeed, + WalletTip = new HashHeightPair(uint256.Parse(dataTable.WalletTip.Split("-")[1]), + int.Parse(dataTable.WalletTip.Split("-")[0])), + BlockLocator = dataTable.BlockLocator.Select(uint256.Parse).ToList() + }; + walletStore.SetData(walletData); + + dataPath = Path.Combine(DataPath, "wallet-transactions-table.json"); + + var transactionsTable = JsonConvert.DeserializeObject(File.ReadAllText(dataPath)); + foreach (var item in transactionsTable) + { + var trx = new TransactionOutputData + { + OutPoint = new OutPoint(uint256.Parse(item.OutPoint.Split("-")[0]), + int.Parse(item.OutPoint.Split("-")[1])), + Address = item.Address, + Id = uint256.Parse(item.Id), + Amount = new Money(item.Amount), + Index = item.Index, + BlockHeight = item.BlockHeight, + BlockHash = item.BlockHash != null ? uint256.Parse(item.BlockHash) : null, + CreationTime = DateTimeOffset.FromUnixTimeSeconds(long.Parse(item.CreationTime)), + ScriptPubKey = new Script(Encoders.Hex.DecodeData(item.ScriptPubKey)), + IsPropagated = item.IsPropagated, + AccountIndex = item.AccountIndex, + IsCoinStake = item.IsCoinStake, + IsCoinBase = item.IsCoinBase, + IsColdCoinStake = item.IsColdCoinStake, + }; + + if (item.SpendingDetails != null) + { + trx.SpendingDetails = new Features.Wallet.Database.SpendingDetails + { + BlockHeight = item.SpendingDetails.BlockHeight, + IsCoinStake = item.SpendingDetails.IsCoinStake, + CreationTime = DateTimeOffset.FromUnixTimeSeconds(long.Parse(item.SpendingDetails.CreationTime)), + TransactionId = uint256.Parse(item.SpendingDetails.TransactionId) + }; + + if (item.SpendingDetails.Payments != null) + { + foreach (PaymentDetails spendingDetailsPayment in item.SpendingDetails.Payments) + { + trx.SpendingDetails.Payments.Add(new Features.Wallet.Database.PaymentDetails + { + Amount = new Money(spendingDetailsPayment.Amount), + DestinationAddress = spendingDetailsPayment.DestinationAddress, + DestinationScriptPubKey = new Script(Encoders.Hex.DecodeData(spendingDetailsPayment.DestinationScriptPubKey)), + OutputIndex = spendingDetailsPayment.OutputIndex, + PayToSelf = spendingDetailsPayment.PayToSelf + }); + } + } + } + + walletStore.InsertOrUpdate(trx); + } + } + private void GenerateStratisBlockchainData(Network network, int blockCount, bool saveMinerFolderWithWallet, bool saveListenerFolderWithSyncedEmptyWallet, bool saveFolderWithoutWallet) { string dataFolderPath, listenerFolderPath; @@ -178,4 +276,84 @@ private static void ZipDataFolder(string folderToZip, string zipFileName, string ZipFile.CreateFromDirectory(Path.GetFullPath(folderToZip), zipPath); } } + + public class WalletDataItem + { + public string Id { get; set; } + + public string EncryptedSeed { get; set; } + + public string WalletName { get; set; } + + public string WalletTip { get; set; } + + public ICollection BlockLocator { get; set; } + } + + public class TransactionDataItem + { + public string OutPoint { get; set; } + + public string Address { get; set; } + + public int AccountIndex { get; set; } + + public string Id { get; set; } + + public long Amount { get; set; } + + public bool? IsCoinBase { get; set; } + + public bool? IsCoinStake { get; set; } + public bool? IsColdCoinStake { get; set; } + + public int Index { get; set; } + + public int? BlockHeight { get; set; } + + public string BlockHash { get; set; } + + public int? BlockIndex { get; set; } + + public string CreationTime { get; set; } + + public string ScriptPubKey { get; set; } + + public bool? IsPropagated { get; set; } + + public SpendingDetails SpendingDetails { get; set; } + } + + public class PaymentDetails + { + public string DestinationScriptPubKey { get; set; } + + public string DestinationAddress { get; set; } + + public int? OutputIndex { get; set; } + + public long Amount { get; set; } + + public bool? PayToSelf { get; set; } + } + + public class SpendingDetails + { + public SpendingDetails() + { + this.Payments = new List(); + } + + public string TransactionId { get; set; } + + public ICollection Payments { get; set; } + + public int? BlockHeight { get; set; } + + public int? BlockIndex { get; set; } + + public bool? IsCoinStake { get; set; } + + public string CreationTime { get; set; } + } } \ No newline at end of file diff --git a/src/Tests/Blockcore.IntegrationTests/Wallet/Data/txdb/wallet-with-funds.db b/src/Tests/Blockcore.IntegrationTests/Wallet/Data/txdb/wallet-with-funds.db new file mode 100644 index 0000000000000000000000000000000000000000..f7142b131d1bd4102fe6fbde021257c761bbc7bf GIT binary patch literal 73728 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 literal 0 HcmV?d00001 diff --git a/src/Tests/Blockcore.IntegrationTests/Wallet/Data/wallet-with-funds.db b/src/Tests/Blockcore.IntegrationTests/Wallet/Data/wallet-with-funds.db deleted file mode 100644 index 182bc31ace6b9ef31e9e890bdf7fa23578c20d6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163840 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 diff --git a/src/Tests/Blockcore.IntegrationTests/Wallet/WalletOperationsTests.cs b/src/Tests/Blockcore.IntegrationTests/Wallet/WalletOperationsTests.cs index 9fc17321d..8b2654f47 100644 --- a/src/Tests/Blockcore.IntegrationTests/Wallet/WalletOperationsTests.cs +++ b/src/Tests/Blockcore.IntegrationTests/Wallet/WalletOperationsTests.cs @@ -63,7 +63,7 @@ public WalletOperationsFixture() this.WalletWithFundsFilePath = Path.Combine(walletsFolderPath, filename); File.Copy(Path.Combine("Wallet", "Data", filename), this.WalletWithFundsFilePath, true); Directory.CreateDirectory(dbWalletsFolderPath); - File.Copy(Path.Combine("Wallet", "Data", dbfilename), Path.Combine(dbWalletsFolderPath, dbfilename), true); + File.Copy(Path.Combine("Wallet", "Data", "txdb", dbfilename), Path.Combine(dbWalletsFolderPath, dbfilename), true); var result = $"http://localhost:{stratisNode.ApiPort}/api".AppendPathSegment("wallet/load").PostJsonAsync(new WalletLoadRequest { diff --git a/src/Tests/Blockcore.IntegrationTests/Wallet/WalletPostOperationsTests.cs b/src/Tests/Blockcore.IntegrationTests/Wallet/WalletPostOperationsTests.cs index ef61e55ee..ec22f96f8 100644 --- a/src/Tests/Blockcore.IntegrationTests/Wallet/WalletPostOperationsTests.cs +++ b/src/Tests/Blockcore.IntegrationTests/Wallet/WalletPostOperationsTests.cs @@ -50,7 +50,7 @@ private void AddAndLoadWalletFileToWalletFolder(CoreNode node) this.walletFilePath = Path.Combine(walletsFolderPath, filename); File.Copy(Path.Combine("Wallet", "Data", filename), this.walletFilePath, true); Directory.CreateDirectory(dbWalletsFolderPath); - File.Copy(Path.Combine("Wallet", "Data", dbfilename), Path.Combine(dbWalletsFolderPath, dbfilename), true); + File.Copy(Path.Combine("Wallet", "Data", "txdb", dbfilename), Path.Combine(dbWalletsFolderPath, dbfilename), true); var result = $"http://localhost:{node.ApiPort}/api".AppendPathSegment("wallet/load").PostJsonAsync(new WalletLoadRequest { From 2f89342d294e17e63f1bf97fdba15b02ee763046 Mon Sep 17 00:00:00 2001 From: dangershony Date: Thu, 28 Jan 2021 21:28:14 +0000 Subject: [PATCH 2/3] make sure IStakeChain can be null for POW networks --- .../Api/Controllers/BlockStoreController.cs | 2 +- .../Api/Models/BlockStoreRouteEndPoint.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Features/Blockcore.Features.BlockStore/Api/Controllers/BlockStoreController.cs b/src/Features/Blockcore.Features.BlockStore/Api/Controllers/BlockStoreController.cs index a8b4712b0..b70c859e5 100644 --- a/src/Features/Blockcore.Features.BlockStore/Api/Controllers/BlockStoreController.cs +++ b/src/Features/Blockcore.Features.BlockStore/Api/Controllers/BlockStoreController.cs @@ -59,7 +59,7 @@ public BlockStoreController( ChainIndexer chainIndexer, IAddressIndexer addressIndexer, IUtxoIndexer utxoIndexer, - IStakeChain stakeChain) + IStakeChain stakeChain = null) { Guard.NotNull(network, nameof(network)); Guard.NotNull(loggerFactory, nameof(loggerFactory)); diff --git a/src/Features/Blockcore.Features.BlockStore/Api/Models/BlockStoreRouteEndPoint.cs b/src/Features/Blockcore.Features.BlockStore/Api/Models/BlockStoreRouteEndPoint.cs index a48dbb10e..d7aee3784 100644 --- a/src/Features/Blockcore.Features.BlockStore/Api/Models/BlockStoreRouteEndPoint.cs +++ b/src/Features/Blockcore.Features.BlockStore/Api/Models/BlockStoreRouteEndPoint.cs @@ -6,7 +6,7 @@ public static class BlockStoreRouteEndPoint public const string GetVerboseAddressesBalances = "getverboseaddressesbalances"; public const string GetAddressIndexerTip = "addressindexertip"; public const string GetBlock = "block"; - public const string GetBlockCount = "GetBlockCount"; + public const string GetBlockCount = "getblockcount"; public const string GetUtxoSet = "getutxoset"; } -} +} \ No newline at end of file From 5f5c55ad974e84d8d6a535513717c59190593c69 Mon Sep 17 00:00:00 2001 From: dangershony Date: Thu, 28 Jan 2021 22:22:13 +0000 Subject: [PATCH 3/3] Change LiteDB.FileMode for mac os --- .../Database/WalletStore.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Features/Blockcore.Features.Wallet/Database/WalletStore.cs b/src/Features/Blockcore.Features.Wallet/Database/WalletStore.cs index 4ac615325..abf77132b 100644 --- a/src/Features/Blockcore.Features.Wallet/Database/WalletStore.cs +++ b/src/Features/Blockcore.Features.Wallet/Database/WalletStore.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Runtime.InteropServices; using Blockcore.Configuration; using Blockcore.Consensus.ScriptInfo; using Blockcore.Consensus.TransactionInfo; @@ -45,15 +46,16 @@ public WalletStore(Network network, DataFolder dataFolder, Types.Wallet wallet) } BsonMapper mapper = this.Create(); - + LiteDB.FileMode fileMode = RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? LiteDB.FileMode.Exclusive : LiteDB.FileMode.Shared; + if (!File.Exists(dbPath)) { - this.db = new LiteDatabase(new ConnectionString() { Filename = dbPath }, mapper: mapper); + this.db = new LiteDatabase(new ConnectionString() { Filename = dbPath, Mode = fileMode }, mapper: mapper); } else { // Only perform this check if the database file already exists. - this.db = new LiteDatabase(new ConnectionString() { Filename = dbPath }, mapper: mapper); + this.db = new LiteDatabase(new ConnectionString() { Filename = dbPath, Mode = fileMode }, mapper: mapper); // Attempt to access the user version, this will crash if the loaded database is V5 and we use V4 packages. try @@ -68,7 +70,7 @@ public WalletStore(Network network, DataFolder dataFolder, Types.Wallet wallet) File.Move(dbPath, dbBackupPath); // Re-create the database object after we renamed the file. - this.db = new LiteDatabase(new ConnectionString() { Filename = dbPath }, mapper: mapper); + this.db = new LiteDatabase(new ConnectionString() { Filename = dbPath, Mode = fileMode }, mapper: mapper); } } @@ -166,7 +168,6 @@ public IEnumerable GetAccountHistory(int accountIndex, bool e .OrderByDescending(x => x.SpendingDetails.CreationTime) .ToList(); - Query historyUnSpentQuery = Query.EQ("AccountIndex", new BsonValue(accountIndex)); if (excludeColdStake) { @@ -387,4 +388,4 @@ public void Dispose() this.db?.Dispose(); } } -} +} \ No newline at end of file