diff --git a/packages/wallet-lib/fixtures/wallets/2a331817b9d6bf85100ef0/chain-store.json b/packages/wallet-lib/fixtures/wallets/2a331817b9d6bf85100ef0/chain-store.json new file mode 100644 index 00000000000..9c9dc1cf05f --- /dev/null +++ b/packages/wallet-lib/fixtures/wallets/2a331817b9d6bf85100ef0/chain-store.json @@ -0,0 +1,67 @@ +{ + "network": "testnet", + "state": { + "fees": { + "minRelay": 1000 + }, + "blockHeight": 640507, + "blockHeaders": { + "0000012464fba1e3c66e678de79e4003bf17c36d5caa689e80fd4711fe620ec1": "00000020dc238f49a4671c66a42eb8312996f69801c4867b50658bf1588e4c402e00000088249fb4facf62de5b7706fb41d25cf7ae6404e387b25bce43d5ca69c621a5a05c2acc6108ca011e20420000", + "000000299efeefa87dc15474fd0423c136798975b779a2bb8aa5bb2f50509afb": "0000002016d86d54b0fb10d74d56687f14f1ff451d1e8e1fd9078afee6c3847eec000000a4c3c2e1b7b03b06ab32eb36b59bbe1ef9bba5b6ba6c18cab1ec64f38b49b7aad2402061bcfb011e7c3a0000", + "0000018b88fe43d07c3d63050aa82271698dc406dd08388529205dd837bf92dc": "00000020a78bb103f356ad73a2da83cfa9138054d170eb86259c6d01ebc7cfa15a01000051066136f040a39786459a111d453331ced2997354230d23d0c171df7c154bb460562061cee0011e07810000", + "0000007b7356e715b43ed7d5b7135fb9a2bf403e079bbcf7faec0f0da5c40117": "0000002011ec1243498c7b866199ea055fc7c899e2efe11585fd8c8099e343331801000025b944e894131cde8e07aaca3a750d7ec707f8ae05b74198391e972f5a8625cbcc59206123e4011eebcb0000" + }, + "transactions": { + "0dcdaa9bf5b3596be1bcf22113e39026fd49d24b47190e2c7423be936cb116a7": { + "transaction": "0200000002e56082c04785e77de2dbbfded439dbfc0dde2201fd32e4a32aa425f5769c9e33010000006a4730440220737fb319650cd5c5ff17a1ef0667ec4a2c9d337c25463b8eaa5018ec4ff41cf202201a3f82c7790e0fb07ceddbee7c2ffa1e6de999f5b42b9d3eb64dab2697625a830121038f7857ad3a707c2cb4fa5d7dc270b6e04050dff58613c3a0198a463923c89512fefffffff9c814dd01da4b5b59e06cd1dc3ad8bbfb4af9ddb07d4a3ec4748e91b58d0478000000006a473044022054b284413497f3d8a5909916c298a6585a27e0f20039dbe393634869896293d7022079d252b13434e9bb2bb347f7cb45750500439b652ab28e85573acc5e8c33a60c0121032996947342cd793585d9adc2dc007b89135c764c0c9d528723ad7031fdf2c5aafeffffff029adb4900000000001976a9149eaf940724ad809abdc1f8e32ad7fbd221c742af88ac1059492a000000001976a914ae6994ac03281f1137b91a7e0f050dece040455388ac078c0800", + "metadata": { + "blockHash": "000000299efeefa87dc15474fd0423c136798975b779a2bb8aa5bb2f50509afb", + "height": 560136, + "isInstantLocked": true, + "isChainLocked": true + } + }, + "d48f415f08fb795d43b216cf56e9ef10e059d4009cfc8fc90edfc0d3850813af": { + "transaction": "0300000001a716b16c93be23742c0e19474bd249fd2690e31321f2bce16b59b3f59baacd0d010000006a47304402202c72746fafa9db3ef4ce3b16f2a05bccf2f72b5b2fb18208a10ac563b0e1edc602203371d81765942104bb05acacfe141f204223a1fa426052b55b780e804eb563780121021feafc962128b08d7ef46ce6e4507193d53d3d101d7ad7e6d889fea9b1d4faaaffffffff0210329000000000001976a914ae6994ac03281f1137b91a7e0f050dece040455388ac0926b929000000001976a914ae6994ac03281f1137b91a7e0f050dece040455388ac00000000", + "metadata": { + "blockHash": "0000018b88fe43d07c3d63050aa82271698dc406dd08388529205dd837bf92dc", + "height": 560169, + "isInstantLocked": true, + "isChainLocked": true + } + }, + "47d13f7f713f4258953292c2298c1d91e2d6dee309d689f3c8b44ccf457bab52": { + "transaction": "0300000001af130885d3c0df0ec98ffc9c00d459e010efe956cf16b2435d79fb085f418fd4000000006b4830450221008d7a45a192df8e1b7d39e1465ddbed40f34793ecfc4c3bbc9c9116fd6d91e3cb0220304abf8405aee39ed7e66fae73f713db5868068990ea48b3865c1bba0ed569fe0121021feafc962128b08d7ef46ce6e4507193d53d3d101d7ad7e6d889fea9b1d4faaaffffffff02d0dd0600000000001976a9141ec5c66e9789c655ae068d35088b4073345fe0b088ac49538900000000001976a914ae6994ac03281f1137b91a7e0f050dece040455388ac00000000", + "metadata": { + "blockHash": "0000007b7356e715b43ed7d5b7135fb9a2bf403e079bbcf7faec0f0da5c40117", + "height": 560179, + "isInstantLocked": true, + "isChainLocked": true + } + } + }, + "instantLocks": {}, + "addresses": { + "ycDeuTfs4U77bTb5cq17dame28zdWHVYfk": { + "address": "ycDeuTfs4U77bTb5cq17dame28zdWHVYfk", + "transactions": [ + "0dcdaa9bf5b3596be1bcf22113e39026fd49d24b47190e2c7423be936cb116a7", + "d48f415f08fb795d43b216cf56e9ef10e059d4009cfc8fc90edfc0d3850813af", + "47d13f7f713f4258953292c2298c1d91e2d6dee309d689f3c8b44ccf457bab52" + ], + "utxos": { + "d48f415f08fb795d43b216cf56e9ef10e059d4009cfc8fc90edfc0d3850813af-1": { + "satoshis": 699999753, + "script": "76a914ae6994ac03281f1137b91a7e0f050dece040455388ac" + }, + "47d13f7f713f4258953292c2298c1d91e2d6dee309d689f3c8b44ccf457bab52-1": { + "satoshis": 8999753, + "script": "76a914ae6994ac03281f1137b91a7e0f050dece040455388ac" + } + }, + "balanceSat": 708999506, + "unconfirmedBalanceSat": 0 + } + } + } +} diff --git a/packages/wallet-lib/fixtures/wallets/apart-trip-dignity/chain-store.json b/packages/wallet-lib/fixtures/wallets/apart-trip-dignity/chain-store.json new file mode 100644 index 00000000000..15fbaa77a73 --- /dev/null +++ b/packages/wallet-lib/fixtures/wallets/apart-trip-dignity/chain-store.json @@ -0,0 +1,838 @@ +{ + "network": "testnet", + "state": { + "fees": { + "minRelay": 1000 + }, + "blockHeight": 640476, + "blockHeaders": { + "0000022113844aa456c439bf1f7d720c5ee013cd945acad41b6522ddb12102ee": "00000020e621284508549461adaf248278d67709f3df2315a76be01175f7137872010000dd31aa7cb665279529260b154cac878c1af59e81d03209221bcec08a0889da3a7d1ccc616682021efd0d0a00", + "0000009d9bb006df83378ba3b22f6a17e3902658401668fed0b7d4971db91293": "00000020ee0221b1dd22651bd4ca5a94cd13e05e0c727d1fbf39c456a44a8413210200008c3ca551f529a105e132841a22d560d00002e9b2d1fed25bcd75fd8fa222bd44c21ccc61083e021e2cbe0900", + "000001deee9f99e8219a9abcaaea135dbaae8a9b0f1ea214e6b6a37a5c5b115d": "0000002084813d1a5019ed9079e8c7a0d579b685f16e2e0dcaae54d9144aa4a730010000adcba982cc7bea98a786106769a9341a4d3866834d58105be0630b890cba5882553a16613554021ef2800000", + "000000b6006c758eda23ec7e2a640a0bf2c6a0c44827be216faff6bf4fd388e8": "000000205d115b5c7aa3b6e614a21e0f9b8aaeba5d13eaaabc9a9a21e8999feede010000709f82baa9c1f24fec82712e0599152d7e4d077853cf7cba91861ec3eaea22eab03a1661113a021e01da0000", + "0000012cf6377c6cf2b317a4deed46573c09f04f6880dca731cc9ccea6691e19": "00000020e888d34fbff6af6f21be2748c4a0c6f20b0a642a7eec23da8e756c00b6000000766a990ddb0e1be5191eae3ae973e4558a20d9fcdcc5309145ac8edfab8f9966963b1661b82d021e450b0000", + "00000221952c2a60adcb929de837f659308cb5c6bb7783016479381fb550fbad": "0000002031f1bb8d975bf830b0ac702b534e2f66f0edd90fcd99770c8dd4794bd8020000bcaccb7f4cdf155fe1e08ac473530f92fbb4f51d62376f34ca1d882bd810b677c57f1a61e7f5021e53b30000", + "00000c1e4556add15119392ed36ec6af2640569409abfa23a9972bc3be1b3717": "00000020638feafd82aca4e6b2ac1f77876f880e06775d2e6f79a61725f5011c6e0100005ecf6c29dcff20133c5399ef08ea13299fec7788bc03dfb7e05b0695535aa738f7bb1b6174f50e1e95660000", + "00000084b4d9e887a6ad3f37c576a17d79c35ec9301e55210eded519e8cdcd3a": "00000020b0c8a51730dfa39cd12b1f80f55784fd167bf97392d7e8caf5f93053e20000009b43512fc810155df3d5f7d73e7031812845784a6b6ce68f1649dfd8db44d8f660df1b616c8a011e4aab0000", + "000001953ea0bbb8ad04a9a1a2a707fef207ad22a712d7d3c619f0f9b63fa98c": "000000207dca199148d151d71bc35127b31205090d8f242b8a05ad2adea07bc9fe000000b37f61034e6dedf382051227c736ced4b786eb0c6495e6c23526630e38bf6d732a251c61ee09021e6eeb0000", + "000000dffb05c071a8c05082a475b7ce9c1e403f3b89895a6c448fe08535a5f5": "000000208ca93fb6f9f019c6d3d712a722ad07f2fe07a7a2a1a904adb8bba03e95010000d1db1a1802320ab91ddb72525338b3a46059b0d3f3cbed01f550a72577db773cb9261c614d02021eb36b0000", + "000000444b3f2f02085f8befe72da5442c865c290658766cf935e1a71a4f4ba7": "0000002031b3986a9c0814a212264200e2a276c551e5df433c5e147276eab87b0c02000090f859396304db0dd94b9214222d0dd1dfd16d79e4bc610f68ffd18c377f5ef7be2b1c615321021e1d240000", + "000001f9c5de4d2b258a975bfbf7b9a3346890af6389512bea3cb6926b9be330": "00000020478e3710c6030a6d6e9c8588789f530b498db6f8e18b20e9ab23b48bd60100003ffa42f2dc18080e764a4cdd37fccf46533b74287ed7579200f5c937268ab9a9542f1c61803e021efbd80000" + }, + "transactions": { + "a43845e580ad01f31bc06ce47ab39674e40316c4c6b765b6e54d6d35777ef456": { + "transaction": "0200000007fd1ef99bc1edb4ab93ba74309da788e4ac460975733f02936a6321620d2a8011000000006b483045022100dfb220a840d597179abdf49692ad64c1c0da785041975b00aee03c9625639cf202204d06eade5cca19fab1e10b1d6e1b67c77626a0e88bb4d5f61bd57293b4b64217012102295ecb812ccf52deaf304bebfe3a59a644f05bac81241ea1e3a2f8750064cbf6feffffff694226ee65ea29ba7ec3e5448464c16f11d5b7564f6b3b5d0425a4c751389519000000006b483045022100beff3263b7c99720e99af9ec146c818701efb0130603f1570f427b74aef8521802202e660bb9f7ea156f91addd5fe47cbd2c2bf388cc6e1eff3a39adffd89d26d346012102c33942799f7cbf4a7d12f1b3e52cb80cc4de083b997d3e63915df9973d5bce2afeffffff963e9964a8394a07dde1dbb1e8b34af0f194def0db77fa69229030fbade2c82d000000006b483045022100ff67776932e7a32520aa131f76bdfd6737650ad3b11edbdf466cca83f691b0e60220633bcbedebacffd53ceb7e9cdbd47928d7c2849f49ac1f8efb9f384c1a4ee46301210371c0bc42e08de059a8829730abb16f3d40cff87e5ad85d65c4a0a949d9c4b524feffffff1fe16550125c3398c25d97308d7ab89bdd3d27a1589c78e97c4823c92723cf40000000006b483045022100cca348c7ab16fac28b3bba502be54a9e3766b7da9821a90605f370b75840569702207d082510aa493988e09da046355b018781718208f8a954e14ea33d608ae59625012103699b9402e109ed9d0c67c6a45be5cf5f1236c44bb9fc4b07a2f3392ba0b64172feffffffce251fb3d87d7df03b0fbd720ce5425ab0ea86d96a4ec658463d9507928bb34b000000006a47304402203ae564ff74b08b1f96bf857f51448434418d747a02039ec1ee109a4f5d8e8106022072f8769bd175416d22f44011f7e67aec301f08573c9937be7e4a09c394c7396601210311bae874933a4503a61d1c8c2e5b57b1a278d28d4892af4bd79ab8a731495265feffffffaf2dfef80d4a1f77c75dfc74e3769d8526c66c467c859b16b3439ab213851eb2000000006a47304402200b49b7059064efb57df453dc2d20002f09b5266bc825760ef81624771f13920802200782616b8c4fb7b5eff94fdf865e6ddc4530d3932b97fdc3a747e8c451f0314c012103a94131f28f8efd67f47f2496ff6e8d9069a3a7df97202a33e90e16f257d03729feffffff344fef05224cca98a16f87515041df61cbca948518761021a286d1a76e2bfdd6000000006a47304402202a24d1123775641269c6f748d3e4dad08a682e4e334a9b73c7df84f6c22e8e7d022022c0cc2225d3f14cb58a6fb3e4bf23c0f33252d9040a9ca9ef66eb17742a476f01210347301de4c9ba7f46b0f27cb82ae70a73749821e2951d3c87c2f0d56648635d1cfeffffff0251d21b00000000001976a91440ca54360086cc0fbd69d862db58ab2b6d22805888ace058340b000000001976a914538da44e7136cc994023d89a7b4b3d02ac0e573988acf1790800", + "metadata": { + "blockHash": "000001deee9f99e8219a9abcaaea135dbaae8a9b0f1ea214e6b6a37a5c5b115d", + "height": 555506, + "isInstantLocked": true, + "isChainLocked": true + } + }, + "d37b6c7dd449d605bea9997af8bbeed2f3fbbcb23a4068b1f1ad694db801912d": { + "transaction": "03000000014e74eb53f4b1fa08e1fa02788005b8ef9f70929b3f0668fcb9dc4093b7385af3010000006a473044022071fcd620db9f245fe91c44e9b298ee5a718c2be728958f9e707dd1f785fb05e002207b05d45e4ab78c83f9117032a109d6afa37883ca5b479d2b3110fb0d773d23df0121033883dff35aeac917a26d2cbfb59a365c7ff83256a49c4d6aed8f1c0684605c40ffffffff0280969800000000001976a914cb579d4aa777c3583f61f28425ae3fea5b60d39088ac2296bf1f000000001976a914500ddabedf00296b40842cea428951d57331d5e088ac00000000", + "metadata": { + "blockHash": "000000b6006c758eda23ec7e2a640a0bf2c6a0c44827be216faff6bf4fd388e8", + "height": 555507, + "isInstantLocked": true, + "isChainLocked": true + } + }, + "7d1b78157f9f2238669f260d95af03aeefc99577ff0cddb91b3e518ee557a2fd": { + "transaction": "03000000012d9101b84d69adf1b168403ab2bcfbf3d2eebbf87a99a9be05d649d47d6c7bd3010000006a47304402201cc3d6887d5161eba36a5e6fb1ccd8e8f9eeda7fe95b4fb0a1accb99eeba0223022040d0df81fde8f59c807e541ca5bcfc9d7450f76657aeb44c708fa7d65b7d58410121038cdae47fceb5b117cd3ef5bdf8c9f2a83679a9105d012095762067bdb2351ceaffffffff0280969800000000001976a914e00939d2ec2f885f5e7dc7b9f5b06dcf868d0c4b88acabfe261f000000001976a914f03286cbb7954ea6affa9654af6cfe1210dd0c6288ac00000000", + "metadata": { + "blockHash": "0000012cf6377c6cf2b317a4deed46573c09f04f6880dca731cc9ccea6691e19", + "height": 555508, + "isInstantLocked": true, + "isChainLocked": true + } + }, + "eb1a7fc8e3b43d3021653b1176f8f9b41e9667d05b65ee225d14c149a5b14f77": { + "transaction": "02000000024f5ccb10d1762b155b25a32c1242f72e506ead7dcdffebbb9a57c450eff24306000000006a473044022006d0f91fbc789475f4bc545901b069a5baf657b36914638b7847e61c6ce508a0022061cc6488a5e8e7d142acf015d9447ea2c37b2c44f7ce9822b2b3421e6f200111012103f7626b79771dc4e1928ffbb407aa32f7089bd8deebb7b7393d28397b504f3002feffffff07f289648f6f097dd46857c15d64576658b9f2c693a1472eb8beaa21b21ec020010000006a47304402207ac2b0c2ea3c073db24d893b533d1d5753f35a85c00971e8d0a1d7fdd77c1ffb0220024b43bdd62ee96189e3da40c5725d771c6cb8df0909826538f558fb32c46cf901210308b60306848cbb551d800192ddecfc07bd6cb34eb23df4c53d840a07d1db6e0cfeffffff02f6fc1a00000000001976a9147d03641b70a1883b600f9646081c8bf626504ac288ac10891132000000001976a9140b348dfe637f57295943cfdc2b5c65c79c0da6ba88ac72810800", + "metadata": { + "blockHash": "00000221952c2a60adcb929de837f659308cb5c6bb7783016479381fb550fbad", + "height": 557481, + "isInstantLocked": true, + "isChainLocked": true + } + }, + "1cbb35edc105918b956838570f122d6f3a1fba2b67467e643e901d09f5f8ac1b": { + "transaction": "0200000001194d876938fc6a69f418367e81425640963a2f2569e44b8652fbf98deb49746a000000006b483045022100fc497d765125566b303738841fb04c953fa286e4f531f5fca21df8c2bbdb0b0f02207a57b073f934b47bb1d1b83bb7fedf7a2d52061ea8107d0362d7c2bedfe4b7d401210200669c7e5dd728b676c2c1163ddcfa88e7cd4f01d12f01188b6b32c399c008ccfeffffff024044ca02000000001976a914802950915c17f11b1a677dd7cae5101e376fb34888ac90dc762b000000001976a914daf40881fda36848da6cc430dcbec6da3ea421b088acd3830800", + "metadata": { + "blockHash": "00000c1e4556add15119392ed36ec6af2640569409abfa23a9972bc3be1b3717", + "height": 558036, + "isInstantLocked": true, + "isChainLocked": true + } + }, + "f230a9414bf577d93d6f7f2515d9b549ede78cfba4168920892970fa8aa1eef8": { + "transaction": "03000000051bacf8f5091d903e647e46672bba1f3a6f2d120f573868958b9105c1ed35bb1c010000006b4830450221008f3e0a1b59bd4072242fafbe994fb264ca3751480628755585de32e7a828b13902205ed37762b260f9ad8ef641084da938b8bd6dd2df0f7d8dca91e7c0ac0d31f4610121039ac6241be1c1f328522f0cd183ccbe78c10ad74d4535bec40f5e8fe082633d3cfffffffffda257e58e513e1bb9dd0cff7795c9efae03af950d269f6638229f7f15781b7d000000006a47304402203773f77a278f4039caa7024373bd5ac8002c12f88ac20b1ac1480ed616c1b561022054811f33ba1403e1fa38839994e97bb4c6540b78b1a2a2d102cccd2f218cd99e012103d59b76bb58143cf8de0ff52007242f7af15f1e6943c40d4d5d5fc5e0aa5141aeffffffff56f47e77356d4de5b665b7c6c41603e47496b37ae46cc01bf301ad80e54538a4010000006a4730440220762743c1cb769a51f6f5e600da17c35cf6ed9d45315e96c96fb203d743118b15022062d5c03716c6a6a9a1bbe9eb139cc500778ef3bf00aa21724e83391edcfcf20b012103e98d3cc012bb72006634b098d678afac500a1b3d3a430ac972075b5fb7153d87ffffffff2d9101b84d69adf1b168403ab2bcfbf3d2eebbf87a99a9be05d649d47d6c7bd3000000006b483045022100d31090741004486f2cb473eb046d058e63f12ff9e101a2f2028d5f0e3371499d022057f7b3f0375590d3961cf8b51bde61a830bb4f29b07d7e48132de7d292306193012103f4991317c773fbb37756fb222909c8bbd44e53f3c4e4f3060edb3df7d8549b24ffffffff774fb1a549c1145d22ee655bd067961eb4f9f876113b6521303db4e3c87f1aeb010000006a473044022064f3b9869041239074dadae73c2d0e78abf100d89f88d4ba33b7b3b83eaf87010220608079322bd051ac7900a3bb96d3bc694f2b8d65850bcfc043ce51e6367c654801210332d0d14a1a28c90c1149b691a675e26f4c8b485b8dcc3624280a9fdc954ef081ffffffff02e064ec69000000001976a914fa49fe511c437a0d4ec01050184bd2d6538b3f0888ac62830100000000001976a91414dfbdcfb48babe7127fa0ee90339c33a46aeda288ac00000000", + "metadata": { + "blockHash": "00000084b4d9e887a6ad3f37c576a17d79c35ec9301e55210eded519e8cdcd3a", + "height": 558102, + "isInstantLocked": true, + "isChainLocked": true + } + }, + "c3fb3620ebd1c7678879b40df1495cc86a179b5a6f9e48ce0b687a5c6f5a1db5": { + "transaction": "0300000001f8eea18afa702989208916a4fb8ce7ed49b5d915257f6f3dd977f54b41a930f2000000006a4730440220442af7402fad5756cb4bd1890023369c9b4f63129cc2b6020b3e610cfe0f05f502206d90f315d3467d86b71871b484ab1dfdfdc7fb91cc190f35eb84c34d40490d6b012102ba0588ffd3c838b715d7c79bcf1cff2ba69befd5ea52aa3474d66f094536cac0ffffffff0380a9b24b000000001976a914fa49fe511c437a0d4ec01050184bd2d6538b3f0888ac0084d717000000001976a914e922f6420544f1be0cb593c10535cc3469198bc888ac48366206000000001976a91404a791e67467246c3c0a003007793160387de54288ac00000000", + "metadata": { + "blockHash": "000001953ea0bbb8ad04a9a1a2a707fef207ad22a712d7d3c619f0f9b63fa98c", + "height": 558229, + "isInstantLocked": true, + "isChainLocked": true + } + }, + "6f37b0d6284aab627c31c50e1c9d7cce39912dd4f2393f91734f794bc6408533": { + "transaction": "0300000001b51d5a6f5c7a680bce489e6f5a9b176ac85c49f10db4798867c7d1eb2036fbc3000000006a4730440220283fd42353767188532db4a4f1c3d0a9e96e313196ae1310af6d3006c7aa64ff022027fa50cf065c096f146e00516cb3e28a9bb387a6cf1103aae0592d5c882d25e5012102ba0588ffd3c838b715d7c79bcf1cff2ba69befd5ea52aa3474d66f094536cac0ffffffff0200131a4b000000001976a914838112cc6c85e074aa7f373e942c9f5240c3e13a88ac89959800000000001976a914f728c15b9a5fe4e6d7b6ed74b323e23f5c6e303f88ac00000000", + "metadata": { + "blockHash": "000000dffb05c071a8c05082a475b7ce9c1e403f3b89895a6c448fe08535a5f5", + "height": 558230, + "isInstantLocked": true, + "isChainLocked": true + } + }, + "6f76ca8038c6cb1b373bbbf80698afdc0d638e4a223be12a4feb5fd8e1801135": { + "transaction": "030000000140d85c0bec59ac6ba3892164ef9816b45f5d105769bcae339af9a7874ad4d39c000000006b483045022100eef13b38a771924b1429b119ef27494fe764cf1a7b12962462c4934ba15dd426022037097eaf74e3f3b547bf5e67451c7bf1e2e2a4b7b205850b1315bc4ab983fdf2012103f376b41c9e9ebc3131e33d4de127c57c1bf3ca88f81845595c44f9ac46122677ffffffff02809b8b44000000001976a914f3a39f8266812baa084890d02fc489f2aee8075a88ac89effa02000000001976a914e3dd87e2dd2080c854d0c90abae96d985ae8902288ac00000000", + "metadata": { + "blockHash": "000000444b3f2f02085f8befe72da5442c865c290658766cf935e1a71a4f4ba7", + "height": 558242, + "isInstantLocked": true, + "isChainLocked": true + } + }, + "e6b6f85a18d77974f376f05d6c96d0fdde990e733664248b1a00391565af6841": { + "transaction": "0300000002338540c64b794f73913f39f2d42d9139ce7c9d1c0ec5317c62ab4a28d6b0376f010000006a47304402204de0c38c97e07cddaa0da91563b9ae7620c593c18fe146dde8429b662e542b4902203eeb557d6553dbac0d4f813c07d5ad6ecdd9c27e2e228aaba8c727943676f62b0121038ada8b4de6d21a29ab12401e70d7f44566dbd224a056c857f273b48adf8b0cd2ffffffff351180e1d85feb4f2ae13b224a8e630ddcaf9806f8bb3b371bcbc63880ca766f000000006b483045022100b9a1ff2866f2795fead698f7b16f26c42cc91ef4efda6203e147d8fe910b31cb02203c9c846cea5efa369f2f0e015952bd5992a884a0d79b2c237bcaa842a83f0efa0121033f532214f69c414bc1742367df5cd1195c64a5ee08455d0aad17f6de72e9eaadffffffff0200ca9a3b000000001976a9140d2a064dc57ccd2270a436a871f277bbb7b9ca2088ac7f658909000000001976a914e9c12479daba9d989cedba69adb56a5a50fe500288ac00000000", + "metadata": { + "blockHash": "000001f9c5de4d2b258a975bfbf7b9a3346890af6389512bea3cb6926b9be330", + "height": 558246, + "isInstantLocked": true, + "isChainLocked": true + } + } + }, + "instantLocks": {}, + "addresses": { + "yTwEca67QSkZ6axGdpNFzWPaCj8zqYybY7": { + "address": "yTwEca67QSkZ6axGdpNFzWPaCj8zqYybY7", + "transactions": [ + "a43845e580ad01f31bc06ce47ab39674e40316c4c6b765b6e54d6d35777ef456", + "f230a9414bf577d93d6f7f2515d9b549ede78cfba4168920892970fa8aa1eef8" + ], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yercyhdN9oEkZcB9BsW5ktFaDxFEuK6qXN": { + "address": "yercyhdN9oEkZcB9BsW5ktFaDxFEuK6qXN", + "transactions": [ + "d37b6c7dd449d605bea9997af8bbeed2f3fbbcb23a4068b1f1ad694db801912d", + "f230a9414bf577d93d6f7f2515d9b549ede78cfba4168920892970fa8aa1eef8" + ], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "ygk3GCSba2J3L9G665Snozhj9HSkh5ByVE": { + "address": "ygk3GCSba2J3L9G665Snozhj9HSkh5ByVE", + "transactions": [ + "7d1b78157f9f2238669f260d95af03aeefc99577ff0cddb91b3e518ee557a2fd", + "f230a9414bf577d93d6f7f2515d9b549ede78cfba4168920892970fa8aa1eef8" + ], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "ybuL6rM6dgrKzCg8s99f3jxGuv5oz5JcDA": { + "address": "ybuL6rM6dgrKzCg8s99f3jxGuv5oz5JcDA", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "ygHAVkMtYSqoTWHebDv7qkhMV6dHyuRsp2": { + "address": "ygHAVkMtYSqoTWHebDv7qkhMV6dHyuRsp2", + "transactions": [ + "1cbb35edc105918b956838570f122d6f3a1fba2b67467e643e901d09f5f8ac1b", + "f230a9414bf577d93d6f7f2515d9b549ede78cfba4168920892970fa8aa1eef8" + ], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yMLhEsiP2ajSh8STmXnNmkWXtoHsmawZxd": { + "address": "yMLhEsiP2ajSh8STmXnNmkWXtoHsmawZxd", + "transactions": [ + "eb1a7fc8e3b43d3021653b1176f8f9b41e9667d05b65ee225d14c149a5b14f77", + "f230a9414bf577d93d6f7f2515d9b549ede78cfba4168920892970fa8aa1eef8" + ], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yj8rRKATAUHcAgXvNZekob58xKm2oNyvhv": { + "address": "yj8rRKATAUHcAgXvNZekob58xKm2oNyvhv", + "transactions": [ + "f230a9414bf577d93d6f7f2515d9b549ede78cfba4168920892970fa8aa1eef8", + "c3fb3620ebd1c7678879b40df1495cc86a179b5a6f9e48ce0b687a5c6f5a1db5", + "6f37b0d6284aab627c31c50e1c9d7cce39912dd4f2393f91734f794bc6408533" + ], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yhaAB6e8m3F8zmGX7WAVYa6eEfmSrrnY8x": { + "address": "yhaAB6e8m3F8zmGX7WAVYa6eEfmSrrnY8x", + "transactions": [ + "c3fb3620ebd1c7678879b40df1495cc86a179b5a6f9e48ce0b687a5c6f5a1db5" + ], + "utxos": { + "c3fb3620ebd1c7678879b40df1495cc86a179b5a6f9e48ce0b687a5c6f5a1db5-1": { + "satoshis": 400000000, + "script": "76a914e922f6420544f1be0cb593c10535cc3469198bc888ac" + } + }, + "balanceSat": 400000000, + "unconfirmedBalanceSat": 0 + }, + "yiXh4Yo5djG6QH8WzXkKm5EFzqLRJWakXz": { + "address": "yiXh4Yo5djG6QH8WzXkKm5EFzqLRJWakXz", + "transactions": [ + "6f76ca8038c6cb1b373bbbf80698afdc0d638e4a223be12a4feb5fd8e1801135", + "e6b6f85a18d77974f376f05d6c96d0fdde990e733664248b1a00391565af6841" + ], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yQYv3Um6DsdtANo1ZPTUte75wAGMstLRex": { + "address": "yQYv3Um6DsdtANo1ZPTUte75wAGMstLRex", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yiYPJmu7eEm1cXUNumQRdjv1fvPhsfgMS4": { + "address": "yiYPJmu7eEm1cXUNumQRdjv1fvPhsfgMS4", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yii4aUZhNfL6EWN9KAgAFrJzGJmqHnF4wx": { + "address": "yii4aUZhNfL6EWN9KAgAFrJzGJmqHnF4wx", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yLpTquSct2SGz2Ka45uTPDd81Kzro2Jt2k": { + "address": "yLpTquSct2SGz2Ka45uTPDd81Kzro2Jt2k", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yMiJtpzb1Qthy9TGnavsf5NZ6EZZa4j9q3": { + "address": "yMiJtpzb1Qthy9TGnavsf5NZ6EZZa4j9q3", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yacgSfW7RkwWakEZPg8USAVdzCypiG3vxS": { + "address": "yacgSfW7RkwWakEZPg8USAVdzCypiG3vxS", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yVvrmoRPFLy6nUpCQBT8ZExxF5wF3DhiGU": { + "address": "yVvrmoRPFLy6nUpCQBT8ZExxF5wF3DhiGU", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yaJf2aG6cFUtfv4o6TuEKsh5kr4xq5iAY4": { + "address": "yaJf2aG6cFUtfv4o6TuEKsh5kr4xq5iAY4", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yfardJQ4ucgWLKQPaRHGMRMbSGm5H4ExJR": { + "address": "yfardJQ4ucgWLKQPaRHGMRMbSGm5H4ExJR", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yLSCqx7dcM5JKR2fG7vHbF2axMvuYqomaw": { + "address": "yLSCqx7dcM5JKR2fG7vHbF2axMvuYqomaw", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yVij8XpJ78LM5hepSV1KF7T8vRpUEXCpK5": { + "address": "yVij8XpJ78LM5hepSV1KF7T8vRpUEXCpK5", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yNDpPsJqXKM36zHSNEW7c1zSvNnrZ699FY": { + "address": "yNDpPsJqXKM36zHSNEW7c1zSvNnrZ699FY", + "transactions": [ + "f230a9414bf577d93d6f7f2515d9b549ede78cfba4168920892970fa8aa1eef8" + ], + "utxos": { + "f230a9414bf577d93d6f7f2515d9b549ede78cfba4168920892970fa8aa1eef8-1": { + "satoshis": 99170, + "script": "76a91414dfbdcfb48babe7127fa0ee90339c33a46aeda288ac" + } + }, + "balanceSat": 99170, + "unconfirmedBalanceSat": 0 + }, + "yLk4Hw3w4zDudrDVP6W8J9TggkY57zQUki": { + "address": "yLk4Hw3w4zDudrDVP6W8J9TggkY57zQUki", + "transactions": [ + "c3fb3620ebd1c7678879b40df1495cc86a179b5a6f9e48ce0b687a5c6f5a1db5" + ], + "utxos": { + "c3fb3620ebd1c7678879b40df1495cc86a179b5a6f9e48ce0b687a5c6f5a1db5-2": { + "satoshis": 107099720, + "script": "76a91404a791e67467246c3c0a003007793160387de54288ac" + } + }, + "balanceSat": 107099720, + "unconfirmedBalanceSat": 0 + }, + "yirJaK8KCE5YAmwvLadizqFw3TCXqBuZXL": { + "address": "yirJaK8KCE5YAmwvLadizqFw3TCXqBuZXL", + "transactions": [ + "6f37b0d6284aab627c31c50e1c9d7cce39912dd4f2393f91734f794bc6408533", + "e6b6f85a18d77974f376f05d6c96d0fdde990e733664248b1a00391565af6841" + ], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yhdRfg5gNr587dtEC4YYMcSHmLVEGqqtHc": { + "address": "yhdRfg5gNr587dtEC4YYMcSHmLVEGqqtHc", + "transactions": [ + "e6b6f85a18d77974f376f05d6c96d0fdde990e733664248b1a00391565af6841" + ], + "utxos": { + "e6b6f85a18d77974f376f05d6c96d0fdde990e733664248b1a00391565af6841-1": { + "satoshis": 159999359, + "script": "76a914e9c12479daba9d989cedba69adb56a5a50fe500288ac" + } + }, + "balanceSat": 159999359, + "unconfirmedBalanceSat": 0 + }, + "yYwKP1FQae5kbjXkmuirGx6Xzf8NzHpLqW": { + "address": "yYwKP1FQae5kbjXkmuirGx6Xzf8NzHpLqW", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yX9gmsm8aSxZZjYhq4w35aidT7qbhcpNjU": { + "address": "yX9gmsm8aSxZZjYhq4w35aidT7qbhcpNjU", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "ybgXCTGMHEBbQeUib8c3xAjtGAc12XtWiU": { + "address": "ybgXCTGMHEBbQeUib8c3xAjtGAc12XtWiU", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yS31WpdMT2b34uL9C37fbUoACHhiupHCyP": { + "address": "yS31WpdMT2b34uL9C37fbUoACHhiupHCyP", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yTSpFqRoX3vyN286AUtKKhgmX5Xb41YKQe": { + "address": "yTSpFqRoX3vyN286AUtKKhgmX5Xb41YKQe", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yQU5YsqN7psTTASuYbcMi7N5nNZGaxXb2X": { + "address": "yQU5YsqN7psTTASuYbcMi7N5nNZGaxXb2X", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yVGGFj9BLgEab5rucSGLC6UGVLQKB4U1wJ": { + "address": "yVGGFj9BLgEab5rucSGLC6UGVLQKB4U1wJ", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yQCh5yYCHEbJzgSJE9rdHiqXHidKm3kwr5": { + "address": "yQCh5yYCHEbJzgSJE9rdHiqXHidKm3kwr5", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yX7T3Ac3yaLk5CTC5UaR93Fc7SjYkeT5hn": { + "address": "yX7T3Ac3yaLk5CTC5UaR93Fc7SjYkeT5hn", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yXx3WXq8kYNPbYEg5U6bL8Xfih4g5LCYVo": { + "address": "yXx3WXq8kYNPbYEg5U6bL8Xfih4g5LCYVo", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yYnLMTz3jCi2KKKNuo3TVkEAGyUFg8tgkJ": { + "address": "yYnLMTz3jCi2KKKNuo3TVkEAGyUFg8tgkJ", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yiKa1dA6B4tSTNJqJP9Y5pQfQEffnQQDTL": { + "address": "yiKa1dA6B4tSTNJqJP9Y5pQfQEffnQQDTL", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yf7vcuDnE9DVhXdMfBMQQTEi43otYQzkWE": { + "address": "yf7vcuDnE9DVhXdMfBMQQTEi43otYQzkWE", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yTmSmocwERCeRHqNNG5SbpYKUra1HTmj8m": { + "address": "yTmSmocwERCeRHqNNG5SbpYKUra1HTmj8m", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yivUe5NeJsGsREwPQZUGYaTSwWB3E1oLcz": { + "address": "yivUe5NeJsGsREwPQZUGYaTSwWB3E1oLcz", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "ygfsZojdfW9UjCRU4ra95Aq6YgCC7UqZFx": { + "address": "ygfsZojdfW9UjCRU4ra95Aq6YgCC7UqZFx", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "ydJpjuJGossAZR7S5oS7cWvjygEwoj8Xwp": { + "address": "ydJpjuJGossAZR7S5oS7cWvjygEwoj8Xwp", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yW3TmWnmhvpxRbgFcQ8oXqDRkn3RhRH6jj": { + "address": "yW3TmWnmhvpxRbgFcQ8oXqDRkn3RhRH6jj", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yRegVX85DThKRkH8C61TtRacfzrkiBfNy5": { + "address": "yRegVX85DThKRkH8C61TtRacfzrkiBfNy5", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yPtDCqDFRe1JuDp8pvdiEMQMz2erGwS3VG": { + "address": "yPtDCqDFRe1JuDp8pvdiEMQMz2erGwS3VG", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yM9pSw3L4oBfG7uQL5o522Hu3WTvy9awgZ": { + "address": "yM9pSw3L4oBfG7uQL5o522Hu3WTvy9awgZ", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yNC6qYJYungzuk5XUynDFKCn54Dy8ngox4": { + "address": "yNC6qYJYungzuk5XUynDFKCn54Dy8ngox4", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yR5KcLr1bceLT4teTk2qoJx6pFLik1zyzL": { + "address": "yR5KcLr1bceLT4teTk2qoJx6pFLik1zyzL", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yU9fdXaUVtefwDZvxjJAr9xj1z2MtYi34A": { + "address": "yU9fdXaUVtefwDZvxjJAr9xj1z2MtYi34A", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yRrKLGJa9JmdjBWvrHtedKjHTao6CRDTKf": { + "address": "yRrKLGJa9JmdjBWvrHtedKjHTao6CRDTKf", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yXgMN6FgrgZCnTN1vhoZMh8afKMBmi3JC4": { + "address": "yXgMN6FgrgZCnTN1vhoZMh8afKMBmi3JC4", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yiqaCbXscvR8y3VFYMzdaKCaAGuDuZxMzt": { + "address": "yiqaCbXscvR8y3VFYMzdaKCaAGuDuZxMzt", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yP5dShZBydpbEzgGoXL6kcjv2KzervRrYB": { + "address": "yP5dShZBydpbEzgGoXL6kcjv2KzervRrYB", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "ydcgWDxheSxrLAqDBP4JXBndMCzUNf77gq": { + "address": "ydcgWDxheSxrLAqDBP4JXBndMCzUNf77gq", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yYJmzWey5kNecAThet5BFxAga1F4b4DKQ2": { + "address": "yYJmzWey5kNecAThet5BFxAga1F4b4DKQ2", + "transactions": [ + "6f37b0d6284aab627c31c50e1c9d7cce39912dd4f2393f91734f794bc6408533" + ], + "utxos": { + "6f37b0d6284aab627c31c50e1c9d7cce39912dd4f2393f91734f794bc6408533-0": { + "satoshis": 1260000000, + "script": "76a914838112cc6c85e074aa7f373e942c9f5240c3e13a88ac" + } + }, + "balanceSat": 1260000000, + "unconfirmedBalanceSat": 0 + }, + "yNCqctyQaq51WU1hN5aNwsgMsZ5fRiB7GY": { + "address": "yNCqctyQaq51WU1hN5aNwsgMsZ5fRiB7GY", + "transactions": [ + "6f76ca8038c6cb1b373bbbf80698afdc0d638e4a223be12a4feb5fd8e1801135" + ], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yNPbYz5cZKw2EwxtkL3VSVzPi2FYp9VKjQ": { + "address": "yNPbYz5cZKw2EwxtkL3VSVzPi2FYp9VKjQ", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "ybsGWzsnSCAZufgSeUjScVxqEdved99UM2": { + "address": "ybsGWzsnSCAZufgSeUjScVxqEdved99UM2", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yfNHuPojk8XKWP5nuueDptX4nM7qToudgx": { + "address": "yfNHuPojk8XKWP5nuueDptX4nM7qToudgx", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yXxLnDkk6s8h1PSnYaFM6MAyRarc1Kc1rY": { + "address": "yXxLnDkk6s8h1PSnYaFM6MAyRarc1Kc1rY", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yipResSzN2zUvL7UYkmptKKmQTv7sNssRn": { + "address": "yipResSzN2zUvL7UYkmptKKmQTv7sNssRn", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yZPtNwimHdRiKYbNQW49qezw1Kc1YwUJeT": { + "address": "yZPtNwimHdRiKYbNQW49qezw1Kc1YwUJeT", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yPMjYYfQbga2nBiuqqfUyX41U1vwRZ8fG8": { + "address": "yPMjYYfQbga2nBiuqqfUyX41U1vwRZ8fG8", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yLueLWWcLQsaXQ8D5o9tcyo8tfTxMWXvG4": { + "address": "yLueLWWcLQsaXQ8D5o9tcyo8tfTxMWXvG4", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yN8gzgsc1RVjXThMQT5qZH2jjpnMymz6zP": { + "address": "yN8gzgsc1RVjXThMQT5qZH2jjpnMymz6zP", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yPQLWBNwMdLxUW2oUwHGwQtfyYxD41BARJ": { + "address": "yPQLWBNwMdLxUW2oUwHGwQtfyYxD41BARJ", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yg5g2AfWFdwWexWGfbSXYbUHf1y5WWrFPs": { + "address": "yg5g2AfWFdwWexWGfbSXYbUHf1y5WWrFPs", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yWyABu4naV1Jzw7w9sn1gqhebPRSkCndsS": { + "address": "yWyABu4naV1Jzw7w9sn1gqhebPRSkCndsS", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "ycuUPzUBjhKyUjezQR1LNot79a6C4aRLaR": { + "address": "ycuUPzUBjhKyUjezQR1LNot79a6C4aRLaR", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yQ7YjvAXgDAUCekveHVjr6NBveXrUemVno": { + "address": "yQ7YjvAXgDAUCekveHVjr6NBveXrUemVno", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yi8bghcw627cMGpuH4bJqH6bqR5ywv1NLH": { + "address": "yi8bghcw627cMGpuH4bJqH6bqR5ywv1NLH", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yizHu8i2rfwzwBgnJ62s2WUe6wLoDjne6N": { + "address": "yizHu8i2rfwzwBgnJ62s2WUe6wLoDjne6N", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yW1u3tySeUKAKJsz7sjZFyjUiTyKLB6xBv": { + "address": "yW1u3tySeUKAKJsz7sjZFyjUiTyKLB6xBv", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yNaSkdy1Q8JNubUdbLMGsGf7sTRofEJYZq": { + "address": "yNaSkdy1Q8JNubUdbLMGsGf7sTRofEJYZq", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yXMrw79LPgu78EJsfGGYpm6fXKc1EMnQ49": { + "address": "yXMrw79LPgu78EJsfGGYpm6fXKc1EMnQ49", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yh6Hcyipdvp6WJpQxjNbaXP4kzPQUJpY3n": { + "address": "yh6Hcyipdvp6WJpQxjNbaXP4kzPQUJpY3n", + "transactions": [ + "6f76ca8038c6cb1b373bbbf80698afdc0d638e4a223be12a4feb5fd8e1801135" + ], + "utxos": { + "6f76ca8038c6cb1b373bbbf80698afdc0d638e4a223be12a4feb5fd8e1801135-1": { + "satoshis": 49999753, + "script": "76a914e3dd87e2dd2080c854d0c90abae96d985ae8902288ac" + } + }, + "balanceSat": 49999753, + "unconfirmedBalanceSat": 0 + }, + "yNphpXuaTZRpU9FBh2W7NkUYcr3kBDE8me": { + "address": "yNphpXuaTZRpU9FBh2W7NkUYcr3kBDE8me", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yXFppDT59xYD41mT2pmAdnvr7aZEFdgdrN": { + "address": "yXFppDT59xYD41mT2pmAdnvr7aZEFdgdrN", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yeKGAiiEHBGRujvLoYewA77jDDpeDamxvF": { + "address": "yeKGAiiEHBGRujvLoYewA77jDDpeDamxvF", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yaxTG66CVzKgHhHZXojRHC9ztLTvz3fwdT": { + "address": "yaxTG66CVzKgHhHZXojRHC9ztLTvz3fwdT", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yYw6qU7dwGoELZkSTj3oSKRpM4U8qTMc1U": { + "address": "yYw6qU7dwGoELZkSTj3oSKRpM4U8qTMc1U", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yQE2MksEnSfbeNre19oja9Jj8tvpj64C5a": { + "address": "yQE2MksEnSfbeNre19oja9Jj8tvpj64C5a", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yaRnvHo8oLvVmv46vMj5XPbDJouQSnmcLT": { + "address": "yaRnvHo8oLvVmv46vMj5XPbDJouQSnmcLT", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yj5ofWf2uYQQkSavYm2WXgu1QkaZCyP3Cm": { + "address": "yj5ofWf2uYQQkSavYm2WXgu1QkaZCyP3Cm", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yUCjGmEwrHJwNDrE1o2rMre6MkSbiE6yz7": { + "address": "yUCjGmEwrHJwNDrE1o2rMre6MkSbiE6yz7", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yfJzd1nE2rEqz5XEurD6vs4ykizwmw9xTv": { + "address": "yfJzd1nE2rEqz5XEurD6vs4ykizwmw9xTv", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yUk8U3jRZMHKVTa1eFDEtZpa1G4E13FP4d": { + "address": "yUk8U3jRZMHKVTa1eFDEtZpa1G4E13FP4d", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yMr59YWQFCADq4FbWrtxDUtMwwshSrmAyK": { + "address": "yMr59YWQFCADq4FbWrtxDUtMwwshSrmAyK", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yetSehBupzGS9yps5ogqARUGmTMAs2xVcQ": { + "address": "yetSehBupzGS9yps5ogqARUGmTMAs2xVcQ", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yNcESKLwriNrhM6EyoSpZEXrzdY3uht92T": { + "address": "yNcESKLwriNrhM6EyoSpZEXrzdY3uht92T", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yN2FihGU7KdaEspp39bKrhsHypeyeYzoM2": { + "address": "yN2FihGU7KdaEspp39bKrhsHypeyeYzoM2", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yirpWLxHuhwFzA6LfUPKUh1Ke9RB9BUjit": { + "address": "yirpWLxHuhwFzA6LfUPKUh1Ke9RB9BUjit", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yVDN66vvdshWdNzhUaQNB6xExAHkzs1zj8": { + "address": "yVDN66vvdshWdNzhUaQNB6xExAHkzs1zj8", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + }, + "yPzofnEhRVfDisL2nCUJtAoSHkuyMirHZS": { + "address": "yPzofnEhRVfDisL2nCUJtAoSHkuyMirHZS", + "transactions": [], + "utxos": {}, + "balanceSat": 0, + "unconfirmedBalanceSat": 0 + } + } + } +} diff --git a/packages/wallet-lib/src/types/ChainStore/ChainStore.js b/packages/wallet-lib/src/types/ChainStore/ChainStore.js new file mode 100644 index 00000000000..0c9e4df6b11 --- /dev/null +++ b/packages/wallet-lib/src/types/ChainStore/ChainStore.js @@ -0,0 +1,40 @@ +/** + * ChainStore holds any information that is relatives to a specific network. + * Information such as blockHeaders, transactions, instantLocks. + * Also holds the state of addresses based on the transactions imported (e.g: balances and utxos). + */ +class ChainStore { + constructor(networkIdentifier = 'testnet') { + this.network = networkIdentifier; + + this.state = { + fees: { + minRelay: -1, + }, + blockHeight: 0, + blockHeaders: new Map(), + transactions: new Map(), + instantLocks: new Map(), + addresses: new Map(), + }; + } +} + +ChainStore.prototype.considerTransaction = require('./methods/considerTransaction'); + +ChainStore.prototype.exportState = require('./methods/exportState'); +ChainStore.prototype.importState = require('./methods/importState'); + +ChainStore.prototype.getAddress = require('./methods/getAddress'); +ChainStore.prototype.getAddresses = require('./methods/getAddresses'); + +ChainStore.prototype.getBlockHeader = require('./methods/getBlockHeader'); +ChainStore.prototype.getInstantLock = require('./methods/getInstantLock'); +ChainStore.prototype.getTransaction = require('./methods/getTransaction'); + +ChainStore.prototype.importAddress = require('./methods/importAddress'); +ChainStore.prototype.importBlockHeader = require('./methods/importBlockHeader'); +ChainStore.prototype.importInstantLock = require('./methods/importInstantLock'); +ChainStore.prototype.importTransaction = require('./methods/importTransaction'); + +module.exports = ChainStore; diff --git a/packages/wallet-lib/src/types/ChainStore/ChainStore.spec.js b/packages/wallet-lib/src/types/ChainStore/ChainStore.spec.js new file mode 100644 index 00000000000..5a738fb5268 --- /dev/null +++ b/packages/wallet-lib/src/types/ChainStore/ChainStore.spec.js @@ -0,0 +1,101 @@ +const {Transaction, BlockHeader} = require('@dashevo/dashcore-lib'); +const ChainStore = require('./ChainStore'); +const {expect} = require('chai'); +const fixtures1 = require('../../../fixtures/wallets/2a331817b9d6bf85100ef0/chain-store.json') +const fixtures2 = require('../../../fixtures/wallets/apart-trip-dignity/chain-store.json') + +describe('ChainStore - class', function suite() { + let testnetChainStore; + let mainnetChainStore; + it('should create a new chain store', function () { + testnetChainStore = new ChainStore('testnet'); + mainnetChainStore = new ChainStore('mainnet'); + expect(new ChainStore()).to.deep.equal(testnetChainStore); + expect(testnetChainStore.state).to.exist; + expect(testnetChainStore.state.blockHeight).to.equal(0); + expect(testnetChainStore.state.fees).to.deep.equal({minRelay: -1}); + expect(testnetChainStore.state.blockHeaders).to.deep.equal(new Map()); + expect(testnetChainStore.state.transactions).to.deep.equal(new Map()); + expect(testnetChainStore.state.instantLocks).to.deep.equal(new Map()); + expect(testnetChainStore.state.addresses).to.deep.equal(new Map()); + }); + it('should be able to import transactions with metadata', function () { + let {transactions} = fixtures1.state; + + const tx1 = new Transaction(transactions.d48f415f08fb795d43b216cf56e9ef10e059d4009cfc8fc90edfc0d3850813af.transaction); + const meta1 = transactions.d48f415f08fb795d43b216cf56e9ef10e059d4009cfc8fc90edfc0d3850813af.metadata; + testnetChainStore.importTransaction(tx1, meta1); + + const storedTransactionData = testnetChainStore.getTransaction('d48f415f08fb795d43b216cf56e9ef10e059d4009cfc8fc90edfc0d3850813af'); + expect(storedTransactionData.transaction.toString()).to.equal(tx1.toString()) + expect(storedTransactionData.metadata).to.deep.equal(meta1) + }); + it('should be able to import transaction without metadata', function () { + let {transactions} = fixtures1.state; + + const tx1 = new Transaction(transactions['0dcdaa9bf5b3596be1bcf22113e39026fd49d24b47190e2c7423be936cb116a7'].transaction); + testnetChainStore.importTransaction(tx1); + + const storedTransactionData = testnetChainStore.getTransaction('0dcdaa9bf5b3596be1bcf22113e39026fd49d24b47190e2c7423be936cb116a7'); + expect(storedTransactionData.transaction.toString()).to.equal(tx1.toString()) + expect(storedTransactionData.metadata).to.deep.equal({ + blockHash: null, + height: null, + isInstantLocked: null, + isChainLocked: null + }) + }); + it('should update metadata', function () { + let {transactions} = fixtures1.state; + + const tx1 = new Transaction(transactions['0dcdaa9bf5b3596be1bcf22113e39026fd49d24b47190e2c7423be936cb116a7'].transaction); + const meta1 = transactions['0dcdaa9bf5b3596be1bcf22113e39026fd49d24b47190e2c7423be936cb116a7'].metadata; + testnetChainStore.importTransaction(tx1, meta1); + const storedTransactionData = testnetChainStore.getTransaction('0dcdaa9bf5b3596be1bcf22113e39026fd49d24b47190e2c7423be936cb116a7'); + expect(storedTransactionData.metadata).to.deep.equal(meta1) + }); + it('should be able to import and get a blockheader', function () { + let {blockHeaders} = fixtures1.state; + + const blockheaders1 = new BlockHeader.fromString(blockHeaders['0000012464fba1e3c66e678de79e4003bf17c36d5caa689e80fd4711fe620ec1']); + testnetChainStore.importBlockHeader(blockheaders1); + + const storedTransactionData = testnetChainStore.getBlockHeader('0000012464fba1e3c66e678de79e4003bf17c36d5caa689e80fd4711fe620ec1'); + expect(storedTransactionData.toString()).to.equal(blockheaders1.toString()) + }); + it('should be able to import addresses', function () { + const { addresses, transactions } = fixtures1.state; + + testnetChainStore.importAddress('ycDeuTfs4U77bTb5cq17dame28zdWHVYfk') + + const tx1 = new Transaction(transactions['47d13f7f713f4258953292c2298c1d91e2d6dee309d689f3c8b44ccf457bab52'].transaction); + const meta1 = transactions['47d13f7f713f4258953292c2298c1d91e2d6dee309d689f3c8b44ccf457bab52'].metadata; + testnetChainStore.importTransaction(tx1, meta1); + + const addr = testnetChainStore.getAddress('ycDeuTfs4U77bTb5cq17dame28zdWHVYfk'); + expect(addr).to.deep.equal(addresses['ycDeuTfs4U77bTb5cq17dame28zdWHVYfk']) + + }); + it('should export and import state', function () { + const exportedState = testnetChainStore.exportState(); + const importedChainStore = new ChainStore(); + importedChainStore.importState(exportedState); + + expect(importedChainStore.network).to.equal(testnetChainStore.network) + expect(importedChainStore.state.fees).to.deep.equal(testnetChainStore.state.fees) + expect(importedChainStore.state.blockHeight).to.deep.equal(testnetChainStore.state.blockHeight) + expect(importedChainStore.state.blockHeaders).to.deep.equal(testnetChainStore.state.blockHeaders) + expect(importedChainStore.state.instantLocks).to.deep.equal(testnetChainStore.state.instantLocks) + expect([...importedChainStore.state.addresses]).to.deep.equal([...testnetChainStore.state.addresses]) + + const importedTransactionsState = [...importedChainStore.state.transactions]; + const exportedTransactionsState = exportedState.state.transactions; + + importedTransactionsState.forEach(([hash, {transaction, metadata}]) => { + expect(exportedTransactionsState[hash]).to.deep.equal({ + transaction: transaction.toString(), + metadata + }) + }) + }); +}); diff --git a/packages/wallet-lib/src/types/ChainStore/methods/considerTransaction.js b/packages/wallet-lib/src/types/ChainStore/methods/considerTransaction.js new file mode 100644 index 00000000000..b8c991a4954 --- /dev/null +++ b/packages/wallet-lib/src/types/ChainStore/methods/considerTransaction.js @@ -0,0 +1,83 @@ +const { Transaction } = require('@dashevo/dashcore-lib'); +const logger = require('../../../logger'); + +const { Output } = Transaction; + +function considerTransaction(transactionHash) { + logger.silly(`ChainStore - Considering transaction ${transactionHash}`); + const { transaction, metadata } = this.getTransaction(transactionHash); + + const { inputs, outputs } = transaction; + let outputIndex = -1; + + const processedAddressesForTx = {}; + + [...inputs, ...outputs].forEach((element) => { + const isOutput = (element instanceof Output); + if (isOutput) outputIndex += 1; + + if (element.script) { + const address = element.script.toAddress(this.network).toString(); + const watchedAddress = this.getAddress(address); + if (watchedAddress) { + // If the transactions has already been processed in a previous insertion, + // we can skip the processing now, it's important to do so as we might consider + // the same transaction multiple times (e.g: on address import) + if (watchedAddress.transactions.includes(transactionHash)) { + return; + } + + // We mark our address as affected so we update the tx later on + if (!processedAddressesForTx[watchedAddress.address]) { + processedAddressesForTx[watchedAddress.address] = watchedAddress; + } + + if (!isOutput) { + const vin = element; + const utxoKey = `${vin.prevTxId.toString('hex')}-${vin.outputIndex}`; + if (watchedAddress.utxos[utxoKey]) { + const previousOutput = watchedAddress.utxos[utxoKey]; + watchedAddress.balanceSat -= previousOutput.satoshis; + delete watchedAddress.utxos[utxoKey]; + } + } else { + const vout = element; + + const utxoKey = `${transaction.hash}-${outputIndex}`; + if (!watchedAddress.utxos[utxoKey]) { + watchedAddress.utxos[utxoKey] = vout.toJSON(); + watchedAddress.balanceSat += vout.satoshis; + } + } + } + } + }); + + // As the same address can have one or more inputs and one or more outputs in the same tx + // we update it's transactions array as last step of importing + Object.values(processedAddressesForTx).forEach((addressObject) => { + addressObject.transactions.push(transaction.hash); + }); + + // If any of the previous transactions added had a height that is subsequent + // of the one we just add + // We should remove and re-add address to trigger reconsidering in proper order + if (metadata && metadata.height > 0) { + Object + .keys(processedAddressesForTx) + .forEach((address) => { + const addressTransactions = processedAddressesForTx[address].transactions; + addressTransactions.forEach((tx) => { + if (metadata.height < this.getTransaction(tx).metadata.height) { + this.state.addresses.delete(address); + this.importAddress(address); + processedAddressesForTx[address] = this.getAddress(address); + } + }); + }); + } + + return processedAddressesForTx; +} + +module.exports = considerTransaction; diff --git a/packages/wallet-lib/src/types/ChainStore/methods/exportState.js b/packages/wallet-lib/src/types/ChainStore/methods/exportState.js new file mode 100644 index 00000000000..e82e918806b --- /dev/null +++ b/packages/wallet-lib/src/types/ChainStore/methods/exportState.js @@ -0,0 +1,46 @@ +function exportState() { + const { network, state } = this; + const { + fees, + blockHeight, + blockHeaders, + transactions, + instantLocks, + addresses, + } = state; + + const serializedState = { + network, + state: { + fees, + blockHeight, + blockHeaders: {}, + transactions: {}, + instantLocks: {}, + addresses: {}, + }, + }; + + [...blockHeaders.entries()].forEach(([blockHeaderHash, blockHeader]) => { + serializedState.state.blockHeaders[blockHeaderHash] = blockHeader.toString(); + }); + + [...transactions.entries()].forEach(([transactionHash, { transaction, metadata }]) => { + serializedState.state.transactions[transactionHash] = { + transaction: transaction.toString(), + metadata, + }; + }); + + [...instantLocks.entries()].forEach(([transactionHash, instantLock]) => { + serializedState.state.instantLocks[transactionHash] = instantLock.toString(); + }); + + [...addresses.entries()].forEach(([address, addressObj]) => { + serializedState.state.addresses[address] = addressObj; + }); + + return serializedState; +} + +module.exports = exportState; diff --git a/packages/wallet-lib/src/types/ChainStore/methods/getAddress.js b/packages/wallet-lib/src/types/ChainStore/methods/getAddress.js new file mode 100644 index 00000000000..1076c9ed22d --- /dev/null +++ b/packages/wallet-lib/src/types/ChainStore/methods/getAddress.js @@ -0,0 +1,5 @@ +function getAddress(address) { + return this.state.addresses.get(address.toString()); +} + +module.exports = getAddress; diff --git a/packages/wallet-lib/src/types/ChainStore/methods/getAddresses.js b/packages/wallet-lib/src/types/ChainStore/methods/getAddresses.js new file mode 100644 index 00000000000..6d6b94bcf74 --- /dev/null +++ b/packages/wallet-lib/src/types/ChainStore/methods/getAddresses.js @@ -0,0 +1,5 @@ +function getAddresses() { + return this.state.addresses; +} + +module.exports = getAddresses; diff --git a/packages/wallet-lib/src/types/ChainStore/methods/getBlockHeader.js b/packages/wallet-lib/src/types/ChainStore/methods/getBlockHeader.js new file mode 100644 index 00000000000..be7d9c57925 --- /dev/null +++ b/packages/wallet-lib/src/types/ChainStore/methods/getBlockHeader.js @@ -0,0 +1,5 @@ +function getBlockHeader(blockHeaderHash) { + return this.state.blockHeaders.get(blockHeaderHash); +} + +module.exports = getBlockHeader; diff --git a/packages/wallet-lib/src/types/ChainStore/methods/getInstantLock.js b/packages/wallet-lib/src/types/ChainStore/methods/getInstantLock.js new file mode 100644 index 00000000000..523380658f6 --- /dev/null +++ b/packages/wallet-lib/src/types/ChainStore/methods/getInstantLock.js @@ -0,0 +1,5 @@ +function getInstantLock(transactionHash) { + return this.state.instantLocks.get(transactionHash); +} + +module.exports = getInstantLock; diff --git a/packages/wallet-lib/src/types/ChainStore/methods/getTransaction.js b/packages/wallet-lib/src/types/ChainStore/methods/getTransaction.js new file mode 100644 index 00000000000..7f97e871321 --- /dev/null +++ b/packages/wallet-lib/src/types/ChainStore/methods/getTransaction.js @@ -0,0 +1,5 @@ +function getTransaction(transactionHash) { + return this.state.transactions.get(transactionHash); +} + +module.exports = getTransaction; diff --git a/packages/wallet-lib/src/types/ChainStore/methods/importAddress.js b/packages/wallet-lib/src/types/ChainStore/methods/importAddress.js new file mode 100644 index 00000000000..ff504321308 --- /dev/null +++ b/packages/wallet-lib/src/types/ChainStore/methods/importAddress.js @@ -0,0 +1,27 @@ +const logger = require('../../../logger'); + +function importAddress(address) { + logger.silly(`ChainStore - import address ${address}`); + if (this.state.addresses.has(address.toString())) throw new Error('Address is already inserted'); + this.state.addresses.set(address.toString(), { + address: address.toString(), + transactions: [], + utxos: {}, + balanceSat: 0, + unconfirmedBalanceSat: 0, + }); + + // We need to consider all previous transactions + const transactions = [...this.state.transactions]; + const sortedTransactions = transactions.sort((a, b) => { + const heightA = a[1].metadata.height; + const heightB = b[1].metadata.height; + return heightA - heightB; + }); + + sortedTransactions.forEach(([transactionHash]) => { + this.considerTransaction(transactionHash); + }); +} + +module.exports = importAddress; diff --git a/packages/wallet-lib/src/types/ChainStore/methods/importBlockHeader.js b/packages/wallet-lib/src/types/ChainStore/methods/importBlockHeader.js new file mode 100644 index 00000000000..9d13c064297 --- /dev/null +++ b/packages/wallet-lib/src/types/ChainStore/methods/importBlockHeader.js @@ -0,0 +1,5 @@ +function importBlockHeader(blockHeader) { + this.state.blockHeaders.set(blockHeader.hash, blockHeader); +} + +module.exports = importBlockHeader; diff --git a/packages/wallet-lib/src/types/ChainStore/methods/importInstantLock.js b/packages/wallet-lib/src/types/ChainStore/methods/importInstantLock.js new file mode 100644 index 00000000000..c39d5d493ce --- /dev/null +++ b/packages/wallet-lib/src/types/ChainStore/methods/importInstantLock.js @@ -0,0 +1,5 @@ +function importInstantLock(instantLock) { + this.state.instantLocks.set(instantLock.txid, instantLock); +} + +module.exports = importInstantLock; diff --git a/packages/wallet-lib/src/types/ChainStore/methods/importInstantLock.spec.js b/packages/wallet-lib/src/types/ChainStore/methods/importInstantLock.spec.js new file mode 100644 index 00000000000..86cfd3443ab --- /dev/null +++ b/packages/wallet-lib/src/types/ChainStore/methods/importInstantLock.spec.js @@ -0,0 +1 @@ +const is = '01424b1c86a93794b4cc8bf9391494faf6994fe6794747ba2bc415e7bcd353204301000000c518facee06d0dc8d5b71028ce949dc8ba99d95c023af2752421a3647f6ce668827fbd5503f9a48a73ab9e30e564cd8b95f6c603caa93deaf4c3836c89d19cb71edc6edab0eccafe42d415e5598fa92e15ff71d5e8a81a34cac04c2fea031cc2f9e653a2d2a7fa2ef1994dee8df60e031c29ab7481ccb1bd3a89e7576cb79880'; \ No newline at end of file diff --git a/packages/wallet-lib/src/types/ChainStore/methods/importState.js b/packages/wallet-lib/src/types/ChainStore/methods/importState.js new file mode 100644 index 00000000000..ab0feb9a2c6 --- /dev/null +++ b/packages/wallet-lib/src/types/ChainStore/methods/importState.js @@ -0,0 +1,42 @@ +const { + BlockHeader, + Transaction, + InstantLock, +} = require('@dashevo/dashcore-lib'); + +function importState(state) { + const { + network, + state: { + fees, + blockHeight, + blockHeaders, + transactions, + instantLocks, + addresses, + }, + } = state; + + this.network = network; + + this.state.fees = fees; + this.state.blockHeight = blockHeight; + + // We actually do not import address state, but import the address itself + // Which will force processing tx for each added address, therefore we might want to do + // import address as the first process done + Object.values(addresses).forEach(({ address }) => { + this.importAddress(address); + }); + + Object.values(blockHeaders).forEach((serializedBlockHeader) => { + this.importBlockHeader(new BlockHeader(Buffer.from(serializedBlockHeader, 'hex'))); + }); + Object.values(transactions).forEach(({ transaction: serializedTransaction, metadata }) => { + this.importTransaction(new Transaction(Buffer.from(serializedTransaction, 'hex')), metadata); + }); + Object.values(instantLocks).forEach((serializedInstantLock) => { + this.importTransaction(new InstantLock(Buffer.from(serializedInstantLock, 'hex'))); + }); +} +module.exports = importState; diff --git a/packages/wallet-lib/src/types/ChainStore/methods/importTransaction.js b/packages/wallet-lib/src/types/ChainStore/methods/importTransaction.js new file mode 100644 index 00000000000..d78c11ba5b8 --- /dev/null +++ b/packages/wallet-lib/src/types/ChainStore/methods/importTransaction.js @@ -0,0 +1,23 @@ +const { Transaction } = require('@dashevo/dashcore-lib'); +const is = require('../../../utils/is'); + +function importTransaction(transaction, metadata = {}) { + // Even if transaction is a transaction object, if manglized, + // it might end up not being a correct instanceof internally. + if (Array.isArray(transaction)) { + throw new Error('Will not import an array of transaction'); + } + const normalizedTransaction = is.string(transaction) ? new Transaction(transaction) : transaction; + this.state.transactions.set(normalizedTransaction.hash, { + transaction: normalizedTransaction, + metadata: { + blockHash: metadata.blockHash || null, + height: metadata.height || null, + isInstantLocked: metadata.isInstantLocked || null, + isChainLocked: metadata.isChainLocked || null, + }, + }); + return this.considerTransaction(normalizedTransaction.hash); +} + +module.exports = importTransaction;