react-native-zcash 0.3.5 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.md +10 -7
- package/android/build.gradle +6 -4
- package/android/src/main/assets/saplingtree/mainnet/1310000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1320000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1330000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1340000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1350000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1360000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1370000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1380000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1390000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1400000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1410000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1420000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1430000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1440000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1450000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1460000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1470000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1480000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1490000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1500000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1510000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1520000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1530000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1540000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1550000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1560000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1570000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1580000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1590000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1600000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1610000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1620000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1630000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1640000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1650000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1660000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1670000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1680000.json +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1690000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1700000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1710000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1720000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1730000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1740000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1750000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1760000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1770000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1780000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1790000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1800000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1810000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1820000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1830000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1840000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1850000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1860000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1870000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1880000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1890000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1900000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1910000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1920000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1930000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1940000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1950000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1960000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1970000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1980000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/1990000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/2000000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/2010000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/2020000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/2030000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/2040000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/2050000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/2060000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/2070000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/2080000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/2090000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/2100000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/2110000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/2120000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/2130000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/2140000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/2150000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/2160000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/2170000.json +2 -1
- package/android/src/main/assets/saplingtree/mainnet/2180000.json +8 -0
- package/android/src/main/assets/saplingtree/mainnet/2190000.json +8 -0
- package/android/src/main/assets/saplingtree/mainnet/2200000.json +8 -0
- package/android/src/main/assets/saplingtree/mainnet/2210000.json +8 -0
- package/android/src/main/java/app/edge/rnzcash/RNZcashModule.kt +179 -175
- package/android/src/main/java/app/edge/rnzcash/RNZcashPackage.kt +2 -3
- package/ios/RNZcash.m +5 -21
- package/ios/RNZcash.swift +531 -512
- package/ios/ZCashLightClientKit/Block/CompactBlockProcessor.swift +1365 -0
- package/ios/ZCashLightClientKit/Block/DatabaseStorage/ConnectorProvider.swift +12 -0
- package/ios/ZCashLightClientKit/Block/DatabaseStorage/DatabaseStorageError.swift +20 -0
- package/ios/ZCashLightClientKit/Block/DatabaseStorage/SimpleConnectionProvider.swift +39 -0
- package/ios/ZCashLightClientKit/Block/Download/BlockDownloader.swift +295 -0
- package/ios/ZCashLightClientKit/Block/Download/BlockDownloaderService.swift +117 -0
- package/ios/ZCashLightClientKit/Block/Enhance/BlockEnhancer.swift +123 -0
- package/ios/ZCashLightClientKit/Block/FetchUnspentTxOutputs/UTXOFetcher.swift +114 -0
- package/ios/ZCashLightClientKit/Block/FilesystemStorage/FSCompactBlockRepository.swift +419 -0
- package/ios/ZCashLightClientKit/Block/SaplingParameters/SaplingParametersHandler.swift +52 -0
- package/ios/ZCashLightClientKit/Block/Scan/BlockScanner.swift +114 -0
- package/ios/ZCashLightClientKit/Block/Utils/AfterSyncHooksManager.swift +88 -0
- package/ios/ZCashLightClientKit/Block/Utils/InternalSyncProgress.swift +200 -0
- package/ios/ZCashLightClientKit/Block/Validate/BlockValidator.swift +51 -0
- package/ios/ZCashLightClientKit/ClosureSynchronizer.swift +84 -0
- package/ios/ZCashLightClientKit/CombineSynchronizer.swift +76 -0
- package/ios/ZCashLightClientKit/Constants/Checkpoint+Constants.swift +98 -0
- package/ios/ZCashLightClientKit/Constants/Checkpoint+mainnet.swift +19 -0
- package/ios/ZCashLightClientKit/Constants/Checkpoint+testnet.swift +20 -0
- package/ios/ZCashLightClientKit/Constants/ZcashSDK.swift +139 -169
- package/ios/ZCashLightClientKit/DAO/BlockDao.swift +65 -20
- package/ios/ZCashLightClientKit/DAO/PagedTransactionDao.swift +20 -28
- package/ios/ZCashLightClientKit/DAO/TransactionDao.swift +175 -323
- package/ios/ZCashLightClientKit/DAO/UnspentTransactionOutputDao.swift +80 -58
- package/ios/ZCashLightClientKit/Entity/AccountEntity.swift +86 -88
- package/ios/ZCashLightClientKit/Entity/BlockProgress.swift +24 -0
- package/ios/ZCashLightClientKit/Entity/EncodedTransactionEntity.swift +3 -3
- package/ios/ZCashLightClientKit/Entity/SentNoteEntity.swift +15 -12
- package/ios/ZCashLightClientKit/Entity/TransactionEntity.swift +205 -131
- package/ios/ZCashLightClientKit/Entity/UnspentTransactionOutputEntity.swift +7 -6
- package/ios/ZCashLightClientKit/Entity/ZcashCompactBlock.swift +96 -0
- package/ios/ZCashLightClientKit/Error/Sourcery/ZcashError.stencil +40 -0
- package/ios/ZCashLightClientKit/Error/Sourcery/ZcashErrorCode.stencil +15 -0
- package/ios/ZCashLightClientKit/Error/Sourcery/generateErrorCode.sh +34 -0
- package/ios/ZCashLightClientKit/Error/ZcashError.swift +820 -0
- package/ios/ZCashLightClientKit/Error/ZcashErrorCode.swift +306 -0
- package/ios/ZCashLightClientKit/Error/ZcashErrorCodeDefinition.swift +596 -0
- package/ios/ZCashLightClientKit/Extensions/Error+ZcashError.swift +18 -0
- package/ios/ZCashLightClientKit/Extensions/HexEncode.swift +1 -1
- package/ios/ZCashLightClientKit/Extensions/NumberFormatter+Zcash.swift +19 -0
- package/ios/ZCashLightClientKit/Extensions/URL+UpdateWithAlias.swift +36 -0
- package/ios/ZCashLightClientKit/Extensions/Undescribable.swift +22 -0
- package/ios/ZCashLightClientKit/Extensions/Zatoshi+SQLite.swift +20 -0
- package/ios/ZCashLightClientKit/Initializer.swift +336 -260
- package/ios/ZCashLightClientKit/Metrics/SDKMetrics.swift +270 -0
- package/ios/ZCashLightClientKit/Model/Checkpoint.swift +84 -0
- package/ios/ZCashLightClientKit/Model/Memo.swift +236 -0
- package/ios/ZCashLightClientKit/Model/WalletTypes.swift +261 -88
- package/ios/ZCashLightClientKit/Model/Zatoshi.swift +115 -0
- package/ios/ZCashLightClientKit/Modules/Service/GRPC/LightWalletGRPCService.swift +342 -0
- package/ios/ZCashLightClientKit/Modules/Service/GRPC/ProtoBuf/Extensions/Protocolbuffer+Extensions.swift +50 -0
- package/ios/ZCashLightClientKit/Modules/Service/GRPC/ProtoBuf/compact_formats.pb.swift +399 -0
- package/ios/ZCashLightClientKit/Modules/Service/GRPC/ProtoBuf/proto/compact_formats.proto +66 -0
- package/ios/ZCashLightClientKit/Modules/Service/GRPC/ProtoBuf/proto/service.proto +185 -0
- package/ios/ZCashLightClientKit/Modules/Service/GRPC/ProtoBuf/service.grpc.swift +1123 -0
- package/ios/ZCashLightClientKit/Modules/Service/GRPC/ProtoBuf/service.pb.swift +1208 -0
- package/ios/ZCashLightClientKit/Modules/Service/LightWalletService.swift +195 -0
- package/ios/ZCashLightClientKit/Providers/LatestBlocksDataProvider.swift +69 -0
- package/ios/ZCashLightClientKit/Providers/ResourceProvider.swift +24 -6
- package/ios/ZCashLightClientKit/Repository/CompactBlockRepository.swift +14 -46
- package/ios/ZCashLightClientKit/Repository/NotesRepository.swift +1 -0
- package/ios/ZCashLightClientKit/Repository/PaginatedTransactionRepository.swift +6 -6
- package/ios/ZCashLightClientKit/Repository/TransactionRepository.swift +18 -19
- package/ios/ZCashLightClientKit/Repository/UnspentTransactionOutputRepository.swift +5 -7
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1000000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1010000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1020000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1030000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1040000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1050000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1060000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1070000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1080000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1090000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1100000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1110000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1120000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1130000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1140000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1150000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1160000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1170000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1180000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1190000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1200000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1210000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1220000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1230000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1240000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1250000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1260000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1270000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1280000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1290000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1300000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1310000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1320000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1330000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1340000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1350000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1360000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1370000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1380000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1390000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1400000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1410000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1420000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1430000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1440000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1450000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1460000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1470000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1480000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1490000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1500000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1510000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1520000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1530000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1540000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1550000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1560000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1570000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1580000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1590000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1600000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1610000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1620000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1630000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1631000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1640000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1650000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1660000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1670000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1680000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1686871.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1687104.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1690000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1700000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1710000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1720000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1722500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1725000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1727500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1730000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1732500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1735000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1737500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1740000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1742500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1745000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1747500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1750000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1752500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1755000.json +9 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1757500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1760000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1762500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1765000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1767500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1770000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1772500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1775000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1777500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1780000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1782500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1785000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1787500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1790000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1792500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1795000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1797500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1800000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1802500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1805000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1807500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1810000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1812500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1815000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1817500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1820000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1822500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1825000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1827500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1830000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1832500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1835000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1837500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1840000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1842500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1845000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1847500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1850000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1852500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1855000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1857500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1860000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1862500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1865000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1867500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1870000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1872500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1875000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1877500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1880000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1882500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1885000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1887500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1890000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1892500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1895000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1897500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1900000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1902500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1905000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1907500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1910000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1912500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1915000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1917500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1920000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1922500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1925000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1927500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1930000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1932500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1935000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1937500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1940000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1942500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1945000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1947500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1950000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1952500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1955000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1957500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1960000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1962500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1965000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1967500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1970000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1972500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1975000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1977500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1980000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1982500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1985000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1987500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1990000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1992500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1995000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/1997500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2000000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2002500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2005000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2007500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2010000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2012500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2015000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2017500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2020000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2022500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2025000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2027500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2030000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2032500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2035000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2037500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2040000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2042500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2045000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2047500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2050000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2052500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2055000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2057500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2060000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2062500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2065000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2067500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2070000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2072500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2075000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2077500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2080000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2082500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2085000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2087500.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2090000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2100000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2110000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2120000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2130000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2140000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2150000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2160000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2170000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2180000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2190000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2200000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2210000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/419200.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/500000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/510000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/520000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/530000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/540000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/550000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/560000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/570000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/580000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/590000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/600000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/610000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/620000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/630000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/640000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/650000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/660000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/663150.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/670000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/680000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/690000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/700000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/710000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/720000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/730000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/740000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/750000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/760000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/770000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/780000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/790000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/800000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/810000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/820000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/830000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/840000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/850000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/860000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/870000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/880000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/890000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/900000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/910000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/920000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/930000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/940000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/950000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/960000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/970000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/980000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/990000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1000000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1010000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1020000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1030000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1040000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1050000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1060000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1070000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1080000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1090000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1100000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1110000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1120000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1130000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1140000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1150000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1160000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1170000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1180000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1190000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1200000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1210000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1220000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1230000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1240000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1250000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1260000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1270000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1280000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1290000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1300000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1310000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1320000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1330000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1340000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1350000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1360000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1370000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1380000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1390000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1400000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1410000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1420000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1430000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1440000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1450000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1460000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1470000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1480000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1490000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1500000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1510000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1520000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1530000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1540000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1550000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1560000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1570000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1580000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1590000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1600000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1610000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1620000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1630000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1640000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1650000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1660000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1670000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1680000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1690000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1700000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1710000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1720000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1730000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1740000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1750000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1760000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1770000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1780000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1790000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1800000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1810000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1820000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1830000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1840000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1842420.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1850000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1860000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1870000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1880000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1890000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1900000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1910000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1920000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1930000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1940000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1950000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1960000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1970000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1980000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/1990000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2000000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2010000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2020000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2030000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2040000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2050000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2060000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2070000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2080000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2090000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2100000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2110000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2120000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2130000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2140000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2150000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2160000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2170000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2180000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2190000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2200000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2210000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2220000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2230000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2240000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2250000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2260000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2270000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2280000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2290000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2300000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2310000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2320000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2330000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/2340000.json +8 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/280000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/290000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/300000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/310000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/320000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/330000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/340000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/350000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/360000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/370000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/380000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/390000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/400000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/410000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/420000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/430000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/440000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/450000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/460000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/470000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/480000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/490000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/500000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/510000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/520000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/530000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/540000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/550000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/560000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/570000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/580000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/590000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/600000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/610000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/620000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/630000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/640000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/650000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/660000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/670000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/680000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/690000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/700000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/710000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/720000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/730000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/740000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/750000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/760000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/770000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/780000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/790000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/800000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/810000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/820000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/830000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/840000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/850000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/860000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/870000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/880000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/890000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/900000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/910000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/920000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/930000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/940000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/950000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/960000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/970000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/980000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/checkpoints/testnet/990000.json +7 -0
- package/ios/ZCashLightClientKit/Rust/ZcashKeyDerivationBackend.swift +218 -0
- package/ios/ZCashLightClientKit/Rust/ZcashKeyDerivationBackendWelding.swift +88 -0
- package/ios/ZCashLightClientKit/Rust/ZcashRustBackend.swift +531 -604
- package/ios/ZCashLightClientKit/Rust/ZcashRustBackendWelding.swift +223 -356
- package/ios/ZCashLightClientKit/Rust/zcashlc.h +802 -136
- package/ios/ZCashLightClientKit/Synchronizer/ClosureSDKSynchronizer.swift +180 -0
- package/ios/ZCashLightClientKit/Synchronizer/CombineSDKSynchronizer.swift +175 -0
- package/ios/ZCashLightClientKit/Synchronizer/Dependencies.swift +207 -0
- package/ios/ZCashLightClientKit/Synchronizer/SDKSynchronizer.swift +527 -793
- package/ios/ZCashLightClientKit/Synchronizer.swift +416 -342
- package/ios/ZCashLightClientKit/Tool/DerivationTool.swift +163 -300
- package/ios/ZCashLightClientKit/Transaction/TransactionEncoder.swift +39 -89
- package/ios/ZCashLightClientKit/Transaction/WalletTransactionEncoder.swift +93 -144
- package/ios/ZCashLightClientKit/Utils/AsyncToClosureGateway.swift +46 -0
- package/ios/ZCashLightClientKit/Utils/AsyncToCombineGateway.swift +59 -0
- package/ios/ZCashLightClientKit/Utils/Clamped.swift +32 -0
- package/ios/ZCashLightClientKit/Utils/DIContainer.swift +86 -0
- package/ios/ZCashLightClientKit/Utils/GenericActor.swift +18 -0
- package/ios/ZCashLightClientKit/Utils/LoggingProxy.swift +22 -21
- package/ios/ZCashLightClientKit/Utils/OSLogger.swift +109 -0
- package/ios/ZCashLightClientKit/Utils/SaplingParameterDownloader.swift +124 -89
- package/ios/ZCashLightClientKit/Utils/SpecificCombineTypes.swift +16 -0
- package/ios/ZCashLightClientKit/Utils/SyncSessionIDGenerator.swift +32 -0
- package/ios/ZCashLightClientKit/Utils/Task+sleep.swift +14 -0
- package/ios/ZCashLightClientKit/Utils/UsedAliasesChecker.swift +41 -0
- package/ios/libzcashlc.xcframework/Info.plist +5 -5
- package/ios/libzcashlc.xcframework/ios-arm64/libzcashlc.a +0 -0
- package/ios/libzcashlc.xcframework/ios-arm64_x86_64-simulator/libzcashlc.a +0 -0
- package/lib/rnzcash.rn.js +37 -80
- package/lib/rnzcash.rn.js.map +1 -1
- package/lib/src/react-native.d.ts +5 -10
- package/lib/src/types.d.ts +3 -4
- package/package.json +4 -1
- package/react-native-zcash.podspec +5 -4
- package/src/react-native.ts +15 -41
- package/src/types.ts +3 -4
- package/ios/ZCashLightClientKit/Block/DatabaseStorage/CompactBlockStorage.swift +0 -123
- package/ios/ZCashLightClientKit/Block/DatabaseStorage/DatabaseMigrationManager.swift +0 -222
- package/ios/ZCashLightClientKit/Block/DatabaseStorage/StorageError.swift +0 -22
- package/ios/ZCashLightClientKit/Block/DatabaseStorage/StorageManager.swift +0 -73
- package/ios/ZCashLightClientKit/Block/Downloader/BlockDownloader.swift +0 -240
- package/ios/ZCashLightClientKit/Block/Downloader/CompactBlockDownloaderBuilder.swift +0 -26
- package/ios/ZCashLightClientKit/Block/Processor/CompactBlockDownloadOperation.swift +0 -258
- package/ios/ZCashLightClientKit/Block/Processor/CompactBlockEnhancementOperation.swift +0 -157
- package/ios/ZCashLightClientKit/Block/Processor/CompactBlockProcessor.swift +0 -1454
- package/ios/ZCashLightClientKit/Block/Processor/CompactBlockScanningOperation.swift +0 -238
- package/ios/ZCashLightClientKit/Block/Processor/CompactBlockValidationInformation.swift +0 -66
- package/ios/ZCashLightClientKit/Block/Processor/FetchUnspentTxOutputsOperation.swift +0 -103
- package/ios/ZCashLightClientKit/Block/Processor/FigureNextBatchOperation.swift +0 -58
- package/ios/ZCashLightClientKit/Block/Processor/ZcashOperation.swift +0 -68
- package/ios/ZCashLightClientKit/Constants/WalletBirthday+Constants.swift +0 -58
- package/ios/ZCashLightClientKit/Constants/WalletBirthday+mainnet.swift +0 -20
- package/ios/ZCashLightClientKit/Constants/WalletBirthday+testnet.swift +0 -20
- package/ios/ZCashLightClientKit/DAO/CompactBlockDAO.swift +0 -24
- package/ios/ZCashLightClientKit/DAO/NotesDao.swift +0 -142
- package/ios/ZCashLightClientKit/DAO/PendingTransactionDao.swift +0 -213
- package/ios/ZCashLightClientKit/DAO/TransactionBuilder.swift +0 -169
- package/ios/ZCashLightClientKit/Entity/CompactBlockEntity.swift +0 -13
- package/ios/ZCashLightClientKit/Entity/PendingTransactionEntity.swift +0 -205
- package/ios/ZCashLightClientKit/Entity/ReceivedNoteEntity.swift +0 -22
- package/ios/ZCashLightClientKit/Repository/PendingTransactionRepository.swift +0 -19
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1000000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1010000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1020000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1030000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1040000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1050000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1060000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1070000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1080000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1090000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1100000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1110000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1120000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1130000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1140000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1150000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1160000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1170000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1180000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1190000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1200000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1210000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1220000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1230000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1240000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1250000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1260000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1270000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1280000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1290000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1300000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1310000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1320000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1330000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1340000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1350000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1360000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1370000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1380000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1390000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1400000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1410000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1420000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1430000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1440000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1450000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1460000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1470000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1480000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1490000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1500000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1510000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1520000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1530000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1540000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1550000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1560000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1570000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1580000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1590000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1600000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1610000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1620000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1630000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1640000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1650000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1660000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1670000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1680000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1690000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1700000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1710000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1720000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1730000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1740000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1750000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1760000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1770000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1780000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1790000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1800000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1810000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1820000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1830000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1840000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1850000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1860000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1870000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1880000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1890000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1900000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1910000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1920000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1930000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1940000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1950000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1960000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1970000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1980000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1990000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2000000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2010000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2020000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2030000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2040000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2050000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2060000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2070000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2080000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2090000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2100000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2110000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2120000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2130000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2140000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2150000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2160000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2170000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/419200.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/500000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/510000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/520000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/530000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/540000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/550000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/560000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/570000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/580000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/590000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/600000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/610000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/620000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/630000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/640000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/650000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/660000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/663150.json +0 -8
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/670000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/680000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/690000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/700000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/710000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/720000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/730000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/740000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/750000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/760000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/770000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/780000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/790000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/800000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/810000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/820000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/830000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/840000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/850000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/860000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/870000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/880000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/890000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/900000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/910000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/920000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/930000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/940000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/950000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/960000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/970000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/980000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/990000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1000000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1010000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1020000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1030000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1040000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1050000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1060000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1070000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1080000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1090000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1100000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1110000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1120000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1130000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1140000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1150000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1160000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1170000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1180000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1190000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1200000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1210000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1220000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1230000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1240000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1250000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1260000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1270000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1280000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1290000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1300000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1310000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1320000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1330000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1340000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1350000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1360000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1370000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1380000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1390000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1400000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1410000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1420000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1430000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1440000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1450000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1460000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1470000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1480000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1490000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1500000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1510000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1520000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1530000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1540000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1550000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1560000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1570000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1580000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1590000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1600000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1610000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1620000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1630000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1640000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1650000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1660000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1670000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1680000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1690000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1700000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1710000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1720000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1730000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1740000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1750000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1760000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1770000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1780000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1790000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1800000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1810000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1820000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1830000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1840000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1850000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1860000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/280000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/290000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/300000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/310000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/320000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/330000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/340000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/350000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/360000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/370000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/380000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/390000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/400000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/410000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/420000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/430000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/440000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/450000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/460000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/470000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/480000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/490000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/500000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/510000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/520000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/530000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/540000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/550000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/560000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/570000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/580000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/590000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/600000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/610000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/620000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/630000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/640000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/650000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/660000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/670000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/680000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/690000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/700000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/710000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/720000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/730000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/740000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/750000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/760000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/770000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/780000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/790000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/800000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/810000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/820000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/830000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/840000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/850000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/860000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/870000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/880000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/890000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/900000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/910000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/920000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/930000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/940000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/950000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/960000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/970000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/980000.json +0 -7
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/990000.json +0 -7
- package/ios/ZCashLightClientKit/Service/LightWalletGRPCService.swift +0 -551
- package/ios/ZCashLightClientKit/Service/LightWalletService.swift +0 -214
- package/ios/ZCashLightClientKit/Service/Model/ZcashCompactBlock.swift +0 -46
- package/ios/ZCashLightClientKit/Service/ProtoBuf/Extensions/Protocolbuffer+Extensions.swift +0 -50
- package/ios/ZCashLightClientKit/Service/ProtoBuf/compact_formats.pb.swift +0 -332
- package/ios/ZCashLightClientKit/Service/ProtoBuf/proto/compact_formats.proto +0 -56
- package/ios/ZCashLightClientKit/Service/ProtoBuf/proto/service.proto +0 -180
- package/ios/ZCashLightClientKit/Service/ProtoBuf/service.grpc.swift +0 -383
- package/ios/ZCashLightClientKit/Service/ProtoBuf/service.pb.swift +0 -1173
- package/ios/ZCashLightClientKit/Transaction/PersistentTransactionManager.swift +0 -339
- package/ios/ZCashLightClientKit/Transaction/TransactionManager.swift +0 -42
- package/ios/ZCashLightClientKit/Utils/Bundle+module.swift +0 -30
|
@@ -0,0 +1,1365 @@
|
|
|
1
|
+
//
|
|
2
|
+
// CompactBlockProcessor.swift
|
|
3
|
+
// ZcashLightClientKit
|
|
4
|
+
//
|
|
5
|
+
// Created by Francisco Gindre on 18/09/2019.
|
|
6
|
+
// Copyright © 2019 Electric Coin Company. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
// swiftlint:disable file_length type_body_length
|
|
9
|
+
|
|
10
|
+
import Foundation
|
|
11
|
+
import Combine
|
|
12
|
+
|
|
13
|
+
public typealias RefreshedUTXOs = (inserted: [UnspentTransactionOutputEntity], skipped: [UnspentTransactionOutputEntity])
|
|
14
|
+
|
|
15
|
+
public enum CompactBlockProgress {
|
|
16
|
+
case syncing(_ progress: BlockProgress)
|
|
17
|
+
case enhance(_ progress: EnhancementProgress)
|
|
18
|
+
case fetch(_ progress: Float)
|
|
19
|
+
|
|
20
|
+
public var progress: Float {
|
|
21
|
+
switch self {
|
|
22
|
+
case .syncing(let blockProgress):
|
|
23
|
+
return blockProgress.progress
|
|
24
|
+
case .enhance(let enhancementProgress):
|
|
25
|
+
return enhancementProgress.progress
|
|
26
|
+
case .fetch(let fetchingProgress):
|
|
27
|
+
return fetchingProgress
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public var progressHeight: BlockHeight? {
|
|
32
|
+
switch self {
|
|
33
|
+
case .syncing(let blockProgress):
|
|
34
|
+
return blockProgress.progressHeight
|
|
35
|
+
case .enhance(let enhancementProgress):
|
|
36
|
+
return enhancementProgress.lastFoundTransaction?.minedHeight
|
|
37
|
+
default:
|
|
38
|
+
return 0
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public var blockDate: Date? {
|
|
43
|
+
if case .enhance(let enhancementProgress) = self, let time = enhancementProgress.lastFoundTransaction?.blockTime {
|
|
44
|
+
return Date(timeIntervalSince1970: time)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return nil
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
public var targetHeight: BlockHeight? {
|
|
51
|
+
switch self {
|
|
52
|
+
case .syncing(let blockProgress):
|
|
53
|
+
return blockProgress.targetHeight
|
|
54
|
+
default:
|
|
55
|
+
return nil
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public struct EnhancementProgress: Equatable {
|
|
61
|
+
/// total transactions that were detected in the `range`
|
|
62
|
+
public let totalTransactions: Int
|
|
63
|
+
/// enhanced transactions so far
|
|
64
|
+
public let enhancedTransactions: Int
|
|
65
|
+
/// last found transaction
|
|
66
|
+
public let lastFoundTransaction: ZcashTransaction.Overview?
|
|
67
|
+
/// block range that's being enhanced
|
|
68
|
+
public let range: CompactBlockRange
|
|
69
|
+
/// whether this transaction can be considered `newly mined` and not part of the
|
|
70
|
+
/// wallet catching up to stale and uneventful blocks.
|
|
71
|
+
public let newlyMined: Bool
|
|
72
|
+
|
|
73
|
+
public init(
|
|
74
|
+
totalTransactions: Int,
|
|
75
|
+
enhancedTransactions: Int,
|
|
76
|
+
lastFoundTransaction: ZcashTransaction.Overview?,
|
|
77
|
+
range: CompactBlockRange,
|
|
78
|
+
newlyMined: Bool
|
|
79
|
+
) {
|
|
80
|
+
self.totalTransactions = totalTransactions
|
|
81
|
+
self.enhancedTransactions = enhancedTransactions
|
|
82
|
+
self.lastFoundTransaction = lastFoundTransaction
|
|
83
|
+
self.range = range
|
|
84
|
+
self.newlyMined = newlyMined
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
public var progress: Float {
|
|
88
|
+
totalTransactions > 0 ? Float(enhancedTransactions) / Float(totalTransactions) : 0
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
public static var zero: EnhancementProgress {
|
|
92
|
+
EnhancementProgress(totalTransactions: 0, enhancedTransactions: 0, lastFoundTransaction: nil, range: 0...0, newlyMined: false)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
public static func == (lhs: EnhancementProgress, rhs: EnhancementProgress) -> Bool {
|
|
96
|
+
return
|
|
97
|
+
lhs.totalTransactions == rhs.totalTransactions &&
|
|
98
|
+
lhs.enhancedTransactions == rhs.enhancedTransactions &&
|
|
99
|
+
lhs.lastFoundTransaction?.id == rhs.lastFoundTransaction?.id &&
|
|
100
|
+
lhs.range == rhs.range
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/// The compact block processor is in charge of orchestrating the download and caching of compact blocks from a LightWalletEndpoint
|
|
105
|
+
/// when started the processor downloads does a download - validate - scan cycle until it reaches latest height on the blockchain.
|
|
106
|
+
actor CompactBlockProcessor {
|
|
107
|
+
typealias EventClosure = (Event) async -> Void
|
|
108
|
+
|
|
109
|
+
enum Event {
|
|
110
|
+
/// Event sent when the CompactBlockProcessor presented an error.
|
|
111
|
+
case failed (Error)
|
|
112
|
+
|
|
113
|
+
/// Event sent when the CompactBlockProcessor has finished syncing the blockchain to latest height
|
|
114
|
+
case finished (_ lastScannedHeight: BlockHeight, _ foundBlocks: Bool)
|
|
115
|
+
|
|
116
|
+
/// Event sent when the CompactBlockProcessor found a newly mined transaction
|
|
117
|
+
case minedTransaction(ZcashTransaction.Overview)
|
|
118
|
+
|
|
119
|
+
/// Event sent when the CompactBlockProcessor enhanced a bunch of transactions in some range.
|
|
120
|
+
case foundTransactions ([ZcashTransaction.Overview], CompactBlockRange)
|
|
121
|
+
|
|
122
|
+
/// Event sent when the CompactBlockProcessor handled a ReOrg.
|
|
123
|
+
/// `reorgHeight` is the height on which the reorg was detected.
|
|
124
|
+
/// `rewindHeight` is the height that the processor backed to in order to solve the Reorg.
|
|
125
|
+
case handledReorg (_ reorgHeight: BlockHeight, _ rewindHeight: BlockHeight)
|
|
126
|
+
|
|
127
|
+
/// Event sent when progress of the sync process changes.
|
|
128
|
+
case progressUpdated (CompactBlockProgress)
|
|
129
|
+
|
|
130
|
+
/// Event sent when the CompactBlockProcessor fetched utxos from lightwalletd attempted to store them.
|
|
131
|
+
case storedUTXOs ((inserted: [UnspentTransactionOutputEntity], skipped: [UnspentTransactionOutputEntity]))
|
|
132
|
+
|
|
133
|
+
/// Event sent when the CompactBlockProcessor starts enhancing of the transactions.
|
|
134
|
+
case startedEnhancing
|
|
135
|
+
|
|
136
|
+
/// Event sent when the CompactBlockProcessor starts fetching of the UTXOs.
|
|
137
|
+
case startedFetching
|
|
138
|
+
|
|
139
|
+
/// Event sent when the CompactBlockProcessor starts syncing.
|
|
140
|
+
case startedSyncing
|
|
141
|
+
|
|
142
|
+
/// Event sent when the CompactBlockProcessor stops syncing.
|
|
143
|
+
case stopped
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/// Compact Block Processor configuration
|
|
147
|
+
///
|
|
148
|
+
/// - parameter fsBlockCacheRoot: absolute root path where the filesystem block cache will be stored.
|
|
149
|
+
/// - parameter dataDb: absolute file path of the DB where all information derived from the cache DB is stored.
|
|
150
|
+
/// - parameter spendParamsURL: absolute file path of the sapling-spend.params file
|
|
151
|
+
/// - parameter outputParamsURL: absolute file path of the sapling-output.params file
|
|
152
|
+
struct Configuration {
|
|
153
|
+
let alias: ZcashSynchronizerAlias
|
|
154
|
+
let saplingParamsSourceURL: SaplingParamsSourceURL
|
|
155
|
+
let fsBlockCacheRoot: URL
|
|
156
|
+
let dataDb: URL
|
|
157
|
+
let spendParamsURL: URL
|
|
158
|
+
let outputParamsURL: URL
|
|
159
|
+
let downloadBatchSize: Int
|
|
160
|
+
let scanningBatchSize: Int
|
|
161
|
+
let retries: Int
|
|
162
|
+
let maxBackoffInterval: TimeInterval
|
|
163
|
+
let maxReorgSize = ZcashSDK.maxReorgSize
|
|
164
|
+
let rewindDistance: Int
|
|
165
|
+
let walletBirthdayProvider: () -> BlockHeight
|
|
166
|
+
var walletBirthday: BlockHeight { walletBirthdayProvider() }
|
|
167
|
+
let downloadBufferSize: Int = 10
|
|
168
|
+
let network: ZcashNetwork
|
|
169
|
+
let saplingActivation: BlockHeight
|
|
170
|
+
let cacheDbURL: URL?
|
|
171
|
+
var blockPollInterval: TimeInterval {
|
|
172
|
+
TimeInterval.random(in: ZcashSDK.defaultPollInterval / 2 ... ZcashSDK.defaultPollInterval * 1.5)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
init(
|
|
176
|
+
alias: ZcashSynchronizerAlias,
|
|
177
|
+
cacheDbURL: URL? = nil,
|
|
178
|
+
fsBlockCacheRoot: URL,
|
|
179
|
+
dataDb: URL,
|
|
180
|
+
spendParamsURL: URL,
|
|
181
|
+
outputParamsURL: URL,
|
|
182
|
+
saplingParamsSourceURL: SaplingParamsSourceURL,
|
|
183
|
+
downloadBatchSize: Int = ZcashSDK.DefaultDownloadBatch,
|
|
184
|
+
retries: Int = ZcashSDK.defaultRetries,
|
|
185
|
+
maxBackoffInterval: TimeInterval = ZcashSDK.defaultMaxBackOffInterval,
|
|
186
|
+
rewindDistance: Int = ZcashSDK.defaultRewindDistance,
|
|
187
|
+
scanningBatchSize: Int = ZcashSDK.DefaultScanningBatch,
|
|
188
|
+
walletBirthdayProvider: @escaping () -> BlockHeight,
|
|
189
|
+
saplingActivation: BlockHeight,
|
|
190
|
+
network: ZcashNetwork
|
|
191
|
+
) {
|
|
192
|
+
self.alias = alias
|
|
193
|
+
self.fsBlockCacheRoot = fsBlockCacheRoot
|
|
194
|
+
self.dataDb = dataDb
|
|
195
|
+
self.spendParamsURL = spendParamsURL
|
|
196
|
+
self.outputParamsURL = outputParamsURL
|
|
197
|
+
self.saplingParamsSourceURL = saplingParamsSourceURL
|
|
198
|
+
self.network = network
|
|
199
|
+
self.downloadBatchSize = downloadBatchSize
|
|
200
|
+
self.retries = retries
|
|
201
|
+
self.maxBackoffInterval = maxBackoffInterval
|
|
202
|
+
self.rewindDistance = rewindDistance
|
|
203
|
+
self.scanningBatchSize = scanningBatchSize
|
|
204
|
+
self.walletBirthdayProvider = walletBirthdayProvider
|
|
205
|
+
self.saplingActivation = saplingActivation
|
|
206
|
+
self.cacheDbURL = cacheDbURL
|
|
207
|
+
assert(downloadBatchSize >= scanningBatchSize)
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
init(
|
|
211
|
+
alias: ZcashSynchronizerAlias,
|
|
212
|
+
fsBlockCacheRoot: URL,
|
|
213
|
+
dataDb: URL,
|
|
214
|
+
spendParamsURL: URL,
|
|
215
|
+
outputParamsURL: URL,
|
|
216
|
+
saplingParamsSourceURL: SaplingParamsSourceURL,
|
|
217
|
+
downloadBatchSize: Int = ZcashSDK.DefaultDownloadBatch,
|
|
218
|
+
retries: Int = ZcashSDK.defaultRetries,
|
|
219
|
+
maxBackoffInterval: TimeInterval = ZcashSDK.defaultMaxBackOffInterval,
|
|
220
|
+
rewindDistance: Int = ZcashSDK.defaultRewindDistance,
|
|
221
|
+
scanningBatchSize: Int = ZcashSDK.DefaultScanningBatch,
|
|
222
|
+
walletBirthdayProvider: @escaping () -> BlockHeight,
|
|
223
|
+
network: ZcashNetwork
|
|
224
|
+
) {
|
|
225
|
+
self.alias = alias
|
|
226
|
+
self.fsBlockCacheRoot = fsBlockCacheRoot
|
|
227
|
+
self.dataDb = dataDb
|
|
228
|
+
self.spendParamsURL = spendParamsURL
|
|
229
|
+
self.outputParamsURL = outputParamsURL
|
|
230
|
+
self.saplingParamsSourceURL = saplingParamsSourceURL
|
|
231
|
+
self.walletBirthdayProvider = walletBirthdayProvider
|
|
232
|
+
self.saplingActivation = network.constants.saplingActivationHeight
|
|
233
|
+
self.network = network
|
|
234
|
+
self.cacheDbURL = nil
|
|
235
|
+
self.downloadBatchSize = downloadBatchSize
|
|
236
|
+
self.retries = retries
|
|
237
|
+
self.maxBackoffInterval = maxBackoffInterval
|
|
238
|
+
self.rewindDistance = rewindDistance
|
|
239
|
+
self.scanningBatchSize = scanningBatchSize
|
|
240
|
+
|
|
241
|
+
assert(downloadBatchSize >= scanningBatchSize)
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
Represents the possible states of a CompactBlockProcessor
|
|
247
|
+
*/
|
|
248
|
+
enum State {
|
|
249
|
+
/**
|
|
250
|
+
connected and downloading blocks
|
|
251
|
+
*/
|
|
252
|
+
case syncing
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
was doing something but was paused
|
|
256
|
+
*/
|
|
257
|
+
case stopped
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
Processor is Enhancing transactions
|
|
261
|
+
*/
|
|
262
|
+
case enhancing
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
fetching utxos
|
|
266
|
+
*/
|
|
267
|
+
case fetching
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
was processing but erred
|
|
271
|
+
*/
|
|
272
|
+
case error(_ error: Error)
|
|
273
|
+
|
|
274
|
+
/// Download sapling param files if needed.
|
|
275
|
+
case handlingSaplingFiles
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
Processor is up to date with the blockchain and you can now make transactions.
|
|
279
|
+
*/
|
|
280
|
+
case synced
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
private var afterSyncHooksManager = AfterSyncHooksManager()
|
|
284
|
+
|
|
285
|
+
let metrics: SDKMetrics
|
|
286
|
+
let logger: Logger
|
|
287
|
+
|
|
288
|
+
/// Don't update this variable directly. Use `updateState()` method.
|
|
289
|
+
var state: State = .stopped
|
|
290
|
+
|
|
291
|
+
private(set) var config: Configuration
|
|
292
|
+
|
|
293
|
+
var maxAttemptsReached: Bool {
|
|
294
|
+
self.retryAttempts >= self.config.retries
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
var shouldStart: Bool {
|
|
298
|
+
switch self.state {
|
|
299
|
+
case .stopped, .synced, .error:
|
|
300
|
+
return !maxAttemptsReached
|
|
301
|
+
default:
|
|
302
|
+
return false
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// It would be better to use Combine here but Combine doesn't work great with async. When this runs regularly only one closure is stored here
|
|
307
|
+
// and that is one provided by `SDKSynchronizer`. But while running tests more "subscribers" is required here. Therefore it's required to handle
|
|
308
|
+
// more closures here.
|
|
309
|
+
var eventClosures: [String: EventClosure] = [:]
|
|
310
|
+
|
|
311
|
+
let blockDownloaderService: BlockDownloaderService
|
|
312
|
+
let blockDownloader: BlockDownloader
|
|
313
|
+
let blockValidator: BlockValidator
|
|
314
|
+
let blockScanner: BlockScanner
|
|
315
|
+
let blockEnhancer: BlockEnhancer
|
|
316
|
+
let utxoFetcher: UTXOFetcher
|
|
317
|
+
let saplingParametersHandler: SaplingParametersHandler
|
|
318
|
+
private let latestBlocksDataProvider: LatestBlocksDataProvider
|
|
319
|
+
|
|
320
|
+
let service: LightWalletService
|
|
321
|
+
let storage: CompactBlockRepository
|
|
322
|
+
let transactionRepository: TransactionRepository
|
|
323
|
+
let accountRepository: AccountRepository
|
|
324
|
+
let rustBackend: ZcashRustBackendWelding
|
|
325
|
+
private var retryAttempts: Int = 0
|
|
326
|
+
private var backoffTimer: Timer?
|
|
327
|
+
private var lastChainValidationFailure: BlockHeight?
|
|
328
|
+
private var consecutiveChainValidationErrors: Int = 0
|
|
329
|
+
var processingError: Error?
|
|
330
|
+
private var foundBlocks = false
|
|
331
|
+
private var maxAttempts: Int {
|
|
332
|
+
config.retries
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
var batchSize: BlockHeight {
|
|
336
|
+
BlockHeight(self.config.downloadBatchSize)
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
private var cancelableTask: Task<Void, Error>?
|
|
340
|
+
|
|
341
|
+
private let internalSyncProgress: InternalSyncProgress
|
|
342
|
+
|
|
343
|
+
/// Initializes a CompactBlockProcessor instance
|
|
344
|
+
/// - Parameters:
|
|
345
|
+
/// - service: concrete implementation of `LightWalletService` protocol
|
|
346
|
+
/// - storage: concrete implementation of `CompactBlockRepository` protocol
|
|
347
|
+
/// - backend: a class that complies to `ZcashRustBackendWelding`
|
|
348
|
+
/// - config: `Configuration` struct for this processor
|
|
349
|
+
init(
|
|
350
|
+
container: DIContainer,
|
|
351
|
+
config: Configuration
|
|
352
|
+
) {
|
|
353
|
+
self.init(
|
|
354
|
+
container: container,
|
|
355
|
+
config: config,
|
|
356
|
+
accountRepository: AccountRepositoryBuilder.build(dataDbURL: config.dataDb, readOnly: true, logger: container.resolve(Logger.self))
|
|
357
|
+
)
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/// Initializes a CompactBlockProcessor instance from an Initialized object
|
|
361
|
+
/// - Parameters:
|
|
362
|
+
/// - initializer: an instance that complies to CompactBlockDownloading protocol
|
|
363
|
+
init(initializer: Initializer, walletBirthdayProvider: @escaping () -> BlockHeight) {
|
|
364
|
+
self.init(
|
|
365
|
+
container: initializer.container,
|
|
366
|
+
config: Configuration(
|
|
367
|
+
alias: initializer.alias,
|
|
368
|
+
fsBlockCacheRoot: initializer.fsBlockDbRoot,
|
|
369
|
+
dataDb: initializer.dataDbURL,
|
|
370
|
+
spendParamsURL: initializer.spendParamsURL,
|
|
371
|
+
outputParamsURL: initializer.outputParamsURL,
|
|
372
|
+
saplingParamsSourceURL: initializer.saplingParamsSourceURL,
|
|
373
|
+
walletBirthdayProvider: walletBirthdayProvider,
|
|
374
|
+
network: initializer.network
|
|
375
|
+
),
|
|
376
|
+
accountRepository: initializer.accountRepository
|
|
377
|
+
)
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
internal init(
|
|
381
|
+
container: DIContainer,
|
|
382
|
+
config: Configuration,
|
|
383
|
+
accountRepository: AccountRepository
|
|
384
|
+
) {
|
|
385
|
+
Dependencies.setupCompactBlockProcessor(
|
|
386
|
+
in: container,
|
|
387
|
+
config: config,
|
|
388
|
+
accountRepository: accountRepository
|
|
389
|
+
)
|
|
390
|
+
|
|
391
|
+
self.metrics = container.resolve(SDKMetrics.self)
|
|
392
|
+
self.logger = container.resolve(Logger.self)
|
|
393
|
+
self.latestBlocksDataProvider = container.resolve(LatestBlocksDataProvider.self)
|
|
394
|
+
self.internalSyncProgress = container.resolve(InternalSyncProgress.self)
|
|
395
|
+
self.blockDownloaderService = container.resolve(BlockDownloaderService.self)
|
|
396
|
+
self.blockDownloader = container.resolve(BlockDownloader.self)
|
|
397
|
+
self.blockValidator = container.resolve(BlockValidator.self)
|
|
398
|
+
self.blockScanner = container.resolve(BlockScanner.self)
|
|
399
|
+
self.blockEnhancer = container.resolve(BlockEnhancer.self)
|
|
400
|
+
self.utxoFetcher = container.resolve(UTXOFetcher.self)
|
|
401
|
+
self.saplingParametersHandler = container.resolve(SaplingParametersHandler.self)
|
|
402
|
+
self.service = container.resolve(LightWalletService.self)
|
|
403
|
+
self.rustBackend = container.resolve(ZcashRustBackendWelding.self)
|
|
404
|
+
self.storage = container.resolve(CompactBlockRepository.self)
|
|
405
|
+
self.config = config
|
|
406
|
+
self.transactionRepository = container.resolve(TransactionRepository.self)
|
|
407
|
+
self.accountRepository = accountRepository
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
deinit {
|
|
411
|
+
cancelableTask?.cancel()
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
func update(config: Configuration) async {
|
|
415
|
+
self.config = config
|
|
416
|
+
await stop()
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
func updateState(_ newState: State) async -> Void {
|
|
420
|
+
let oldState = state
|
|
421
|
+
state = newState
|
|
422
|
+
await transitionState(from: oldState, to: newState)
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
func updateEventClosure(identifier: String, closure: @escaping (Event) async -> Void) async {
|
|
426
|
+
eventClosures[identifier] = closure
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
func send(event: Event) async {
|
|
430
|
+
for item in eventClosures {
|
|
431
|
+
await item.value(event)
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
static func validateServerInfo(
|
|
436
|
+
_ info: LightWalletdInfo,
|
|
437
|
+
saplingActivation: BlockHeight,
|
|
438
|
+
localNetwork: ZcashNetwork,
|
|
439
|
+
rustBackend: ZcashRustBackendWelding
|
|
440
|
+
) async throws {
|
|
441
|
+
// check network types
|
|
442
|
+
guard let remoteNetworkType = NetworkType.forChainName(info.chainName) else {
|
|
443
|
+
throw ZcashError.compactBlockProcessorChainName(info.chainName)
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
guard remoteNetworkType == localNetwork.networkType else {
|
|
447
|
+
throw ZcashError.compactBlockProcessorNetworkMismatch(localNetwork.networkType, remoteNetworkType)
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
guard saplingActivation == info.saplingActivationHeight else {
|
|
451
|
+
throw ZcashError.compactBlockProcessorSaplingActivationMismatch(saplingActivation, BlockHeight(info.saplingActivationHeight))
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// check branch id
|
|
455
|
+
let localBranch = try rustBackend.consensusBranchIdFor(height: Int32(info.blockHeight))
|
|
456
|
+
|
|
457
|
+
guard let remoteBranchID = ConsensusBranchID.fromString(info.consensusBranchID) else {
|
|
458
|
+
throw ZcashError.compactBlockProcessorConsensusBranchID
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
guard remoteBranchID == localBranch else {
|
|
462
|
+
throw ZcashError.compactBlockProcessorWrongConsensusBranchId(localBranch, remoteBranchID)
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/// Starts the CompactBlockProcessor instance and starts downloading and processing blocks
|
|
467
|
+
///
|
|
468
|
+
/// triggers the blockProcessorStartedDownloading notification
|
|
469
|
+
///
|
|
470
|
+
/// - Important: subscribe to the notifications before calling this method
|
|
471
|
+
func start(retry: Bool = false) async {
|
|
472
|
+
if retry {
|
|
473
|
+
self.retryAttempts = 0
|
|
474
|
+
self.processingError = nil
|
|
475
|
+
self.backoffTimer?.invalidate()
|
|
476
|
+
self.backoffTimer = nil
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
guard shouldStart else {
|
|
480
|
+
switch self.state {
|
|
481
|
+
case .error(let error):
|
|
482
|
+
// max attempts have been reached
|
|
483
|
+
logger.info("max retry attempts reached with error: \(error)")
|
|
484
|
+
await notifyError(ZcashError.compactBlockProcessorMaxAttemptsReached(self.maxAttempts))
|
|
485
|
+
await updateState(.stopped)
|
|
486
|
+
case .stopped:
|
|
487
|
+
// max attempts have been reached
|
|
488
|
+
logger.info("max retry attempts reached")
|
|
489
|
+
await notifyError(ZcashError.compactBlockProcessorMaxAttemptsReached(self.maxAttempts))
|
|
490
|
+
case .synced:
|
|
491
|
+
// max attempts have been reached
|
|
492
|
+
logger.warn("max retry attempts reached on synced state, this indicates malfunction")
|
|
493
|
+
await notifyError(ZcashError.compactBlockProcessorMaxAttemptsReached(self.maxAttempts))
|
|
494
|
+
case .syncing, .enhancing, .fetching, .handlingSaplingFiles:
|
|
495
|
+
logger.debug("Warning: compact block processor was started while busy!!!!")
|
|
496
|
+
afterSyncHooksManager.insert(hook: .anotherSync)
|
|
497
|
+
}
|
|
498
|
+
return
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
do {
|
|
502
|
+
if let legacyCacheDbURL = self.config.cacheDbURL {
|
|
503
|
+
try await self.migrateCacheDb(legacyCacheDbURL)
|
|
504
|
+
}
|
|
505
|
+
} catch {
|
|
506
|
+
await self.fail(error)
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
await self.nextBatch()
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
/**
|
|
513
|
+
Stops the CompactBlockProcessor
|
|
514
|
+
|
|
515
|
+
Note: retry count is reset
|
|
516
|
+
*/
|
|
517
|
+
func stop() async {
|
|
518
|
+
self.backoffTimer?.invalidate()
|
|
519
|
+
self.backoffTimer = nil
|
|
520
|
+
|
|
521
|
+
cancelableTask?.cancel()
|
|
522
|
+
await blockDownloader.stopDownload()
|
|
523
|
+
|
|
524
|
+
self.retryAttempts = 0
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// MARK: Rewind
|
|
528
|
+
|
|
529
|
+
/// Rewinds to provided height.
|
|
530
|
+
/// - Parameter height: height to rewind to. If nil is provided, it will rescan to nearest height (quick rescan)
|
|
531
|
+
///
|
|
532
|
+
/// - Note: If this is called while sync is in progress then the sync process is stopped first and then rewind is executed.
|
|
533
|
+
func rewind(context: AfterSyncHooksManager.RewindContext) async {
|
|
534
|
+
logger.debug("Starting rewind")
|
|
535
|
+
switch self.state {
|
|
536
|
+
case .syncing, .enhancing, .fetching, .handlingSaplingFiles:
|
|
537
|
+
logger.debug("Stopping sync because of rewind")
|
|
538
|
+
afterSyncHooksManager.insert(hook: .rewind(context))
|
|
539
|
+
await stop()
|
|
540
|
+
|
|
541
|
+
case .stopped, .error, .synced:
|
|
542
|
+
logger.debug("Sync doesn't run. Executing rewind.")
|
|
543
|
+
await doRewind(context: context)
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
private func doRewind(context: AfterSyncHooksManager.RewindContext) async {
|
|
548
|
+
logger.debug("Executing rewind.")
|
|
549
|
+
let lastDownloaded = await internalSyncProgress.latestDownloadedBlockHeight
|
|
550
|
+
let height = Int32(context.height ?? lastDownloaded)
|
|
551
|
+
|
|
552
|
+
let nearestHeight: Int32
|
|
553
|
+
do {
|
|
554
|
+
nearestHeight = try await rustBackend.getNearestRewindHeight(height: height)
|
|
555
|
+
} catch {
|
|
556
|
+
await fail(error)
|
|
557
|
+
return await context.completion(.failure(error))
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
// FIXME: [#719] this should be done on the rust layer, https://github.com/zcash/ZcashLightClientKit/issues/719
|
|
561
|
+
let rewindHeight = max(Int32(nearestHeight - 1), Int32(config.walletBirthday))
|
|
562
|
+
|
|
563
|
+
do {
|
|
564
|
+
try await rustBackend.rewindToHeight(height: rewindHeight)
|
|
565
|
+
} catch {
|
|
566
|
+
await fail(error)
|
|
567
|
+
return await context.completion(.failure(error))
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
// clear cache
|
|
571
|
+
let rewindBlockHeight = BlockHeight(rewindHeight)
|
|
572
|
+
do {
|
|
573
|
+
try await blockDownloaderService.rewind(to: rewindBlockHeight)
|
|
574
|
+
} catch {
|
|
575
|
+
return await context.completion(.failure(error))
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
await internalSyncProgress.rewind(to: rewindBlockHeight)
|
|
579
|
+
|
|
580
|
+
self.lastChainValidationFailure = nil
|
|
581
|
+
await context.completion(.success(rewindBlockHeight))
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
// MARK: Wipe
|
|
585
|
+
|
|
586
|
+
func wipe(context: AfterSyncHooksManager.WipeContext) async {
|
|
587
|
+
logger.debug("Starting wipe")
|
|
588
|
+
switch self.state {
|
|
589
|
+
case .syncing, .enhancing, .fetching, .handlingSaplingFiles:
|
|
590
|
+
logger.debug("Stopping sync because of wipe")
|
|
591
|
+
afterSyncHooksManager.insert(hook: .wipe(context))
|
|
592
|
+
await stop()
|
|
593
|
+
|
|
594
|
+
case .stopped, .error, .synced:
|
|
595
|
+
logger.debug("Sync doesn't run. Executing wipe.")
|
|
596
|
+
await doWipe(context: context)
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
private func doWipe(context: AfterSyncHooksManager.WipeContext) async {
|
|
601
|
+
logger.debug("Executing wipe.")
|
|
602
|
+
context.prewipe()
|
|
603
|
+
|
|
604
|
+
await updateState(.stopped)
|
|
605
|
+
|
|
606
|
+
do {
|
|
607
|
+
try await self.storage.clear()
|
|
608
|
+
await internalSyncProgress.rewind(to: 0)
|
|
609
|
+
|
|
610
|
+
wipeLegacyCacheDbIfNeeded()
|
|
611
|
+
|
|
612
|
+
let fileManager = FileManager.default
|
|
613
|
+
if fileManager.fileExists(atPath: config.dataDb.path) {
|
|
614
|
+
try fileManager.removeItem(at: config.dataDb)
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
await context.completion(nil)
|
|
618
|
+
} catch {
|
|
619
|
+
await context.completion(error)
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
// MARK: Sync
|
|
624
|
+
|
|
625
|
+
func validateServer() async {
|
|
626
|
+
do {
|
|
627
|
+
let info = try await self.service.getInfo()
|
|
628
|
+
try await Self.validateServerInfo(
|
|
629
|
+
info,
|
|
630
|
+
saplingActivation: self.config.saplingActivation,
|
|
631
|
+
localNetwork: self.config.network,
|
|
632
|
+
rustBackend: self.rustBackend
|
|
633
|
+
)
|
|
634
|
+
} catch {
|
|
635
|
+
await self.severeFailure(error)
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
/// Processes new blocks on the given range based on the configuration set for this instance
|
|
640
|
+
func processNewBlocks(ranges: SyncRanges) async {
|
|
641
|
+
self.foundBlocks = true
|
|
642
|
+
|
|
643
|
+
cancelableTask = Task(priority: .userInitiated) {
|
|
644
|
+
do {
|
|
645
|
+
let totalProgressRange = computeTotalProgressRange(from: ranges)
|
|
646
|
+
|
|
647
|
+
logger.debug("""
|
|
648
|
+
Syncing with ranges:
|
|
649
|
+
downloaded but not scanned: \
|
|
650
|
+
\(ranges.downloadedButUnscannedRange?.lowerBound ?? -1)...\(ranges.downloadedButUnscannedRange?.upperBound ?? -1)
|
|
651
|
+
download and scan: \(ranges.downloadAndScanRange?.lowerBound ?? -1)...\(ranges.downloadAndScanRange?.upperBound ?? -1)
|
|
652
|
+
enhance range: \(ranges.enhanceRange?.lowerBound ?? -1)...\(ranges.enhanceRange?.upperBound ?? -1)
|
|
653
|
+
fetchUTXO range: \(ranges.fetchUTXORange?.lowerBound ?? -1)...\(ranges.fetchUTXORange?.upperBound ?? -1)
|
|
654
|
+
total progress range: \(totalProgressRange.lowerBound)...\(totalProgressRange.upperBound)
|
|
655
|
+
""")
|
|
656
|
+
|
|
657
|
+
var anyActionExecuted = false
|
|
658
|
+
|
|
659
|
+
// clear any present cached state if needed.
|
|
660
|
+
// this checks if there was a sync in progress that was
|
|
661
|
+
// interrupted abruptly and cache was not able to be cleared
|
|
662
|
+
// properly and internal state set to the appropriate value
|
|
663
|
+
if let newLatestDownloadedHeight = ranges.shouldClearBlockCacheAndUpdateInternalState() {
|
|
664
|
+
try await storage.clear()
|
|
665
|
+
await internalSyncProgress.set(newLatestDownloadedHeight, .latestDownloadedBlockHeight)
|
|
666
|
+
} else {
|
|
667
|
+
try await storage.create()
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
if let range = ranges.downloadedButUnscannedRange {
|
|
671
|
+
logger.debug("Starting scan with downloaded but not scanned blocks with range: \(range.lowerBound)...\(range.upperBound)")
|
|
672
|
+
try await blockScanner.scanBlocks(at: range, totalProgressRange: totalProgressRange) { [weak self] lastScannedHeight in
|
|
673
|
+
let progress = BlockProgress(
|
|
674
|
+
startHeight: totalProgressRange.lowerBound,
|
|
675
|
+
targetHeight: totalProgressRange.upperBound,
|
|
676
|
+
progressHeight: lastScannedHeight
|
|
677
|
+
)
|
|
678
|
+
await self?.notifyProgress(.syncing(progress))
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
if let range = ranges.downloadAndScanRange {
|
|
683
|
+
logger.debug("Starting sync with range: \(range.lowerBound)...\(range.upperBound)")
|
|
684
|
+
try await blockDownloader.setSyncRange(range, batchSize: batchSize)
|
|
685
|
+
try await downloadAndScanBlocks(at: range, totalProgressRange: totalProgressRange)
|
|
686
|
+
// Side effect of calling stop is to delete last used download stream. To be sure that it doesn't keep any data in memory.
|
|
687
|
+
await blockDownloader.stopDownload()
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
if let range = ranges.enhanceRange {
|
|
691
|
+
anyActionExecuted = true
|
|
692
|
+
logger.debug("Enhancing with range: \(range.lowerBound)...\(range.upperBound)")
|
|
693
|
+
await updateState(.enhancing)
|
|
694
|
+
if let transactions = try await blockEnhancer.enhance(
|
|
695
|
+
at: range,
|
|
696
|
+
didEnhance: { [weak self] progress in
|
|
697
|
+
await self?.notifyProgress(.enhance(progress))
|
|
698
|
+
if
|
|
699
|
+
let foundTx = progress.lastFoundTransaction,
|
|
700
|
+
progress.newlyMined {
|
|
701
|
+
await self?.notifyMinedTransaction(foundTx)
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
) {
|
|
705
|
+
await notifyTransactions(transactions, in: range)
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
if let range = ranges.fetchUTXORange {
|
|
710
|
+
anyActionExecuted = true
|
|
711
|
+
logger.debug("Fetching UTXO with range: \(range.lowerBound)...\(range.upperBound)")
|
|
712
|
+
await updateState(.fetching)
|
|
713
|
+
let result = try await utxoFetcher.fetch(at: range) { [weak self] progress in
|
|
714
|
+
await self?.notifyProgress(.fetch(progress))
|
|
715
|
+
}
|
|
716
|
+
await send(event: .storedUTXOs(result))
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
logger.debug("Fetching sapling parameters")
|
|
720
|
+
await updateState(.handlingSaplingFiles)
|
|
721
|
+
try await saplingParametersHandler.handleIfNeeded()
|
|
722
|
+
|
|
723
|
+
logger.debug("Clearing cache")
|
|
724
|
+
try await clearCompactBlockCache()
|
|
725
|
+
|
|
726
|
+
if !Task.isCancelled {
|
|
727
|
+
let newBlocksMined = await ranges.latestBlockHeight < latestBlocksDataProvider.latestBlockHeight
|
|
728
|
+
await processBatchFinished(height: (anyActionExecuted && !newBlocksMined) ? ranges.latestBlockHeight : nil)
|
|
729
|
+
}
|
|
730
|
+
} catch {
|
|
731
|
+
// Side effect of calling stop is to delete last used download stream. To be sure that it doesn't keep any data in memory.
|
|
732
|
+
await blockDownloader.stopDownload()
|
|
733
|
+
logger.error("Sync failed with error: \(error)")
|
|
734
|
+
|
|
735
|
+
if Task.isCancelled {
|
|
736
|
+
logger.info("Processing cancelled.")
|
|
737
|
+
await updateState(.stopped)
|
|
738
|
+
await handleAfterSyncHooks()
|
|
739
|
+
} else {
|
|
740
|
+
if case let ZcashError.rustValidateCombinedChainInvalidChain(height) = error {
|
|
741
|
+
await validationFailed(at: BlockHeight(height))
|
|
742
|
+
} else {
|
|
743
|
+
logger.error("processing failed with error: \(error)")
|
|
744
|
+
await fail(error)
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
private func handleAfterSyncHooks() async {
|
|
752
|
+
let afterSyncHooksManager = self.afterSyncHooksManager
|
|
753
|
+
self.afterSyncHooksManager = AfterSyncHooksManager()
|
|
754
|
+
|
|
755
|
+
if let wipeContext = afterSyncHooksManager.shouldExecuteWipeHook() {
|
|
756
|
+
await doWipe(context: wipeContext)
|
|
757
|
+
} else if let rewindContext = afterSyncHooksManager.shouldExecuteRewindHook() {
|
|
758
|
+
await doRewind(context: rewindContext)
|
|
759
|
+
} else if afterSyncHooksManager.shouldExecuteAnotherSyncHook() {
|
|
760
|
+
logger.debug("Starting new sync.")
|
|
761
|
+
await nextBatch()
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
private func downloadAndScanBlocks(at range: CompactBlockRange, totalProgressRange: CompactBlockRange) async throws {
|
|
766
|
+
// Divide `range` by `batchSize` and compute how many time do we need to run to download and scan all the blocks.
|
|
767
|
+
// +1 must be done here becase `range` is closed range. So even if upperBound and lowerBound are same there is one block to sync.
|
|
768
|
+
let blocksCountToSync = (range.upperBound - range.lowerBound) + 1
|
|
769
|
+
var loopsCount = blocksCountToSync / batchSize
|
|
770
|
+
if blocksCountToSync % batchSize != 0 {
|
|
771
|
+
loopsCount += 1
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
var lastScannedHeight: BlockHeight = .zero
|
|
775
|
+
for i in 0..<loopsCount {
|
|
776
|
+
let processingRange = computeSingleLoopDownloadRange(fullRange: range, loopCounter: i, batchSize: batchSize)
|
|
777
|
+
|
|
778
|
+
logger.debug("Sync loop #\(i + 1) range: \(processingRange.lowerBound)...\(processingRange.upperBound)")
|
|
779
|
+
|
|
780
|
+
// This is important. We must be sure that no new download is executed when this Task is canceled. Without this line `stop()` doesn't
|
|
781
|
+
// work.
|
|
782
|
+
try Task.checkCancellation()
|
|
783
|
+
|
|
784
|
+
do {
|
|
785
|
+
await blockDownloader.setDownloadLimit(processingRange.upperBound + (2 * batchSize))
|
|
786
|
+
await blockDownloader.startDownload(maxBlockBufferSize: config.downloadBufferSize)
|
|
787
|
+
|
|
788
|
+
try await blockDownloader.waitUntilRequestedBlocksAreDownloaded(in: processingRange)
|
|
789
|
+
} catch {
|
|
790
|
+
await ifTaskIsNotCanceledClearCompactBlockCache(lastScannedHeight: lastScannedHeight)
|
|
791
|
+
throw error
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
do {
|
|
795
|
+
try await blockValidator.validate()
|
|
796
|
+
} catch {
|
|
797
|
+
await ifTaskIsNotCanceledClearCompactBlockCache(lastScannedHeight: lastScannedHeight)
|
|
798
|
+
logger.error("Block validation failed with error: \(error)")
|
|
799
|
+
throw error
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
// Without this `stop()` would work. But this line improves support for Task cancelation.
|
|
803
|
+
try Task.checkCancellation()
|
|
804
|
+
|
|
805
|
+
do {
|
|
806
|
+
lastScannedHeight = try await blockScanner.scanBlocks(
|
|
807
|
+
at: processingRange,
|
|
808
|
+
totalProgressRange: totalProgressRange
|
|
809
|
+
) { [weak self] lastScannedHeight in
|
|
810
|
+
let progress = BlockProgress(
|
|
811
|
+
startHeight: totalProgressRange.lowerBound,
|
|
812
|
+
targetHeight: totalProgressRange.upperBound,
|
|
813
|
+
progressHeight: lastScannedHeight
|
|
814
|
+
)
|
|
815
|
+
await self?.notifyProgress(.syncing(progress))
|
|
816
|
+
}
|
|
817
|
+
} catch {
|
|
818
|
+
logger.error("Scanning failed with error: \(error)")
|
|
819
|
+
await ifTaskIsNotCanceledClearCompactBlockCache(lastScannedHeight: lastScannedHeight)
|
|
820
|
+
throw error
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
try await clearCompactBlockCache(upTo: lastScannedHeight)
|
|
824
|
+
|
|
825
|
+
let progress = BlockProgress(
|
|
826
|
+
startHeight: totalProgressRange.lowerBound,
|
|
827
|
+
targetHeight: totalProgressRange.upperBound,
|
|
828
|
+
progressHeight: processingRange.upperBound
|
|
829
|
+
)
|
|
830
|
+
await notifyProgress(.syncing(progress))
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
/*
|
|
835
|
+
Here range for one batch is computed. For example if we want to sync blocks 0...1000 with batchSize 100 we want to generage blocks like
|
|
836
|
+
this:
|
|
837
|
+
0...99
|
|
838
|
+
100...199
|
|
839
|
+
200...299
|
|
840
|
+
300...399
|
|
841
|
+
...
|
|
842
|
+
900...999
|
|
843
|
+
1000...1000
|
|
844
|
+
*/
|
|
845
|
+
func computeSingleLoopDownloadRange(fullRange: CompactBlockRange, loopCounter: Int, batchSize: BlockHeight) -> CompactBlockRange {
|
|
846
|
+
let lowerBound = fullRange.lowerBound + (loopCounter * batchSize)
|
|
847
|
+
let upperBound = min(fullRange.lowerBound + ((loopCounter + 1) * batchSize) - 1, fullRange.upperBound)
|
|
848
|
+
return lowerBound...upperBound
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
/// It may happen that sync process start with syncing blocks that were downloaded but not synced in previous run of the sync process. This
|
|
852
|
+
/// methods analyses what must be done and computes range that should be used to compute reported progress.
|
|
853
|
+
private func computeTotalProgressRange(from syncRanges: SyncRanges) -> CompactBlockRange {
|
|
854
|
+
guard syncRanges.downloadedButUnscannedRange != nil || syncRanges.downloadAndScanRange != nil else {
|
|
855
|
+
// In this case we are sure that no downloading or scanning happens so this returned range won't be even used. And it's easier to return
|
|
856
|
+
// this "fake" range than to handle nil.
|
|
857
|
+
return 0...0
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
// Thanks to guard above we can be sure that one of these two ranges is not nil.
|
|
861
|
+
let lowerBound = syncRanges.downloadedButUnscannedRange?.lowerBound ?? syncRanges.downloadAndScanRange?.lowerBound ?? 0
|
|
862
|
+
let upperBound = syncRanges.downloadAndScanRange?.upperBound ?? syncRanges.downloadedButUnscannedRange?.upperBound ?? 0
|
|
863
|
+
|
|
864
|
+
return lowerBound...upperBound
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
func notifyMinedTransaction(_ tx: ZcashTransaction.Overview) async {
|
|
868
|
+
logger.debug("notify mined transaction: \(tx)")
|
|
869
|
+
await send(event: .minedTransaction(tx))
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
func notifyProgress(_ progress: CompactBlockProgress) async {
|
|
873
|
+
logger.debug("progress: \(progress)")
|
|
874
|
+
await send(event: .progressUpdated(progress))
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
func notifyTransactions(_ txs: [ZcashTransaction.Overview], in range: CompactBlockRange) async {
|
|
878
|
+
await send(event: .foundTransactions(txs, range))
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
func determineLowerBound(
|
|
882
|
+
errorHeight: Int,
|
|
883
|
+
consecutiveErrors: Int,
|
|
884
|
+
walletBirthday: BlockHeight
|
|
885
|
+
) -> BlockHeight {
|
|
886
|
+
let offset = min(ZcashSDK.maxReorgSize, ZcashSDK.defaultRewindDistance * (consecutiveErrors + 1))
|
|
887
|
+
return max(errorHeight - offset, walletBirthday - ZcashSDK.maxReorgSize)
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
func severeFailure(_ error: Error) async {
|
|
891
|
+
cancelableTask?.cancel()
|
|
892
|
+
await blockDownloader.stopDownload()
|
|
893
|
+
logger.error("show stopper failure: \(error)")
|
|
894
|
+
self.backoffTimer?.invalidate()
|
|
895
|
+
self.retryAttempts = config.retries
|
|
896
|
+
self.processingError = error
|
|
897
|
+
await updateState(.error(error))
|
|
898
|
+
await self.notifyError(error)
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
func fail(_ error: Error) async {
|
|
902
|
+
// TODO: [#713] specify: failure. https://github.com/zcash/ZcashLightClientKit/issues/713
|
|
903
|
+
logger.error("\(error)")
|
|
904
|
+
cancelableTask?.cancel()
|
|
905
|
+
await blockDownloader.stopDownload()
|
|
906
|
+
self.retryAttempts += 1
|
|
907
|
+
self.processingError = error
|
|
908
|
+
switch self.state {
|
|
909
|
+
case .error:
|
|
910
|
+
await notifyError(error)
|
|
911
|
+
default:
|
|
912
|
+
break
|
|
913
|
+
}
|
|
914
|
+
await updateState(.error(error))
|
|
915
|
+
guard self.maxAttemptsReached else { return }
|
|
916
|
+
// don't set a new timer if there are no more attempts.
|
|
917
|
+
await self.setTimer()
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
private func validateConfiguration() throws {
|
|
921
|
+
guard FileManager.default.isReadableFile(atPath: config.fsBlockCacheRoot.absoluteString) else {
|
|
922
|
+
throw ZcashError.compactBlockProcessorMissingDbPath(config.fsBlockCacheRoot.absoluteString)
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
guard FileManager.default.isReadableFile(atPath: config.dataDb.absoluteString) else {
|
|
926
|
+
throw ZcashError.compactBlockProcessorMissingDbPath(config.dataDb.absoluteString)
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
private func nextBatch() async {
|
|
931
|
+
await updateState(.syncing)
|
|
932
|
+
if backoffTimer == nil { await setTimer() }
|
|
933
|
+
do {
|
|
934
|
+
let nextState = try await NextStateHelper.nextState(
|
|
935
|
+
service: self.service,
|
|
936
|
+
downloaderService: blockDownloaderService,
|
|
937
|
+
latestBlocksDataProvider: latestBlocksDataProvider,
|
|
938
|
+
config: self.config,
|
|
939
|
+
rustBackend: self.rustBackend,
|
|
940
|
+
internalSyncProgress: internalSyncProgress
|
|
941
|
+
)
|
|
942
|
+
switch nextState {
|
|
943
|
+
case .finishProcessing(let height):
|
|
944
|
+
await self.processingFinished(height: height)
|
|
945
|
+
case .processNewBlocks(let ranges):
|
|
946
|
+
await self.processNewBlocks(ranges: ranges)
|
|
947
|
+
case let .wait(latestHeight, latestDownloadHeight):
|
|
948
|
+
// Lightwalletd might be syncing
|
|
949
|
+
logger.info(
|
|
950
|
+
"Lightwalletd might be syncing: latest downloaded block height is: \(latestDownloadHeight) " +
|
|
951
|
+
"while latest blockheight is reported at: \(latestHeight)"
|
|
952
|
+
)
|
|
953
|
+
await self.processingFinished(height: latestDownloadHeight)
|
|
954
|
+
}
|
|
955
|
+
} catch {
|
|
956
|
+
await self.severeFailure(error)
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
|
|
960
|
+
internal func validationFailed(at height: BlockHeight) async {
|
|
961
|
+
// cancel all Tasks
|
|
962
|
+
cancelableTask?.cancel()
|
|
963
|
+
await blockDownloader.stopDownload()
|
|
964
|
+
|
|
965
|
+
// register latest failure
|
|
966
|
+
self.lastChainValidationFailure = height
|
|
967
|
+
|
|
968
|
+
// rewind
|
|
969
|
+
let rewindHeight = determineLowerBound(
|
|
970
|
+
errorHeight: height,
|
|
971
|
+
consecutiveErrors: consecutiveChainValidationErrors,
|
|
972
|
+
walletBirthday: self.config.walletBirthday
|
|
973
|
+
)
|
|
974
|
+
|
|
975
|
+
self.consecutiveChainValidationErrors += 1
|
|
976
|
+
|
|
977
|
+
do {
|
|
978
|
+
try await rustBackend.rewindToHeight(height: Int32(rewindHeight))
|
|
979
|
+
} catch {
|
|
980
|
+
await fail(error)
|
|
981
|
+
return
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
do {
|
|
985
|
+
try await blockDownloaderService.rewind(to: rewindHeight)
|
|
986
|
+
await internalSyncProgress.rewind(to: rewindHeight)
|
|
987
|
+
|
|
988
|
+
await send(event: .handledReorg(height, rewindHeight))
|
|
989
|
+
|
|
990
|
+
// process next batch
|
|
991
|
+
await self.nextBatch()
|
|
992
|
+
} catch {
|
|
993
|
+
await self.fail(error)
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
internal func processBatchFinished(height: BlockHeight?) async {
|
|
998
|
+
retryAttempts = 0
|
|
999
|
+
consecutiveChainValidationErrors = 0
|
|
1000
|
+
|
|
1001
|
+
if let height {
|
|
1002
|
+
await processingFinished(height: height)
|
|
1003
|
+
} else {
|
|
1004
|
+
await nextBatch()
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
private func processingFinished(height: BlockHeight) async {
|
|
1009
|
+
await send(event: .finished(height, foundBlocks))
|
|
1010
|
+
await updateState(.synced)
|
|
1011
|
+
await setTimer()
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
private func ifTaskIsNotCanceledClearCompactBlockCache(lastScannedHeight: BlockHeight) async {
|
|
1015
|
+
guard !Task.isCancelled else { return }
|
|
1016
|
+
do {
|
|
1017
|
+
// Blocks download work in parallel with scanning. So imagine this scenario:
|
|
1018
|
+
//
|
|
1019
|
+
// Scanning is done until height 10300. Blocks are downloaded until height 10400.
|
|
1020
|
+
// And now validation fails and this method is called. And `.latestDownloadedBlockHeight` in `internalSyncProgress` is set to 10400. And
|
|
1021
|
+
// all the downloaded blocks are removed here.
|
|
1022
|
+
//
|
|
1023
|
+
// If this line doesn't happen then when sync starts next time it thinks that all the blocks are downloaded until 10400. But all were
|
|
1024
|
+
// removed. So blocks between 10300 and 10400 wouldn't ever be scanned.
|
|
1025
|
+
//
|
|
1026
|
+
// Scanning is done until 10300 so the SDK can be sure that blocks with height below 10300 are not required. So it makes sense to set
|
|
1027
|
+
// `.latestDownloadedBlockHeight` to `lastScannedHeight`. And sync will work fine in next run.
|
|
1028
|
+
await internalSyncProgress.set(lastScannedHeight, .latestDownloadedBlockHeight)
|
|
1029
|
+
try await clearCompactBlockCache()
|
|
1030
|
+
} catch {
|
|
1031
|
+
logger.error("`clearCompactBlockCache` failed after error: \(error)")
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
private func clearCompactBlockCache(upTo height: BlockHeight) async throws {
|
|
1036
|
+
try await storage.clear(upTo: height)
|
|
1037
|
+
logger.info("Cache removed upTo \(height)")
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
private func clearCompactBlockCache() async throws {
|
|
1041
|
+
await blockDownloader.stopDownload()
|
|
1042
|
+
try await storage.clear()
|
|
1043
|
+
logger.info("Cache removed")
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
private func setTimer() async {
|
|
1047
|
+
let interval = self.config.blockPollInterval
|
|
1048
|
+
self.backoffTimer?.invalidate()
|
|
1049
|
+
let timer = Timer(
|
|
1050
|
+
timeInterval: interval,
|
|
1051
|
+
repeats: true,
|
|
1052
|
+
block: { [weak self] _ in
|
|
1053
|
+
Task { [weak self] in
|
|
1054
|
+
guard let self else { return }
|
|
1055
|
+
switch await self.state {
|
|
1056
|
+
case .syncing, .enhancing, .fetching, .handlingSaplingFiles:
|
|
1057
|
+
await self.latestBlocksDataProvider.updateBlockData()
|
|
1058
|
+
case .stopped, .error, .synced:
|
|
1059
|
+
if await self.shouldStart {
|
|
1060
|
+
self.logger.debug(
|
|
1061
|
+
"""
|
|
1062
|
+
Timer triggered: Starting compact Block processor!.
|
|
1063
|
+
Processor State: \(await self.state)
|
|
1064
|
+
latestHeight: \(try await self.transactionRepository.lastScannedHeight())
|
|
1065
|
+
attempts: \(await self.retryAttempts)
|
|
1066
|
+
"""
|
|
1067
|
+
)
|
|
1068
|
+
await self.start()
|
|
1069
|
+
} else if await self.maxAttemptsReached {
|
|
1070
|
+
await self.fail(ZcashError.compactBlockProcessorMaxAttemptsReached(self.config.retries))
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
)
|
|
1076
|
+
RunLoop.main.add(timer, forMode: .default)
|
|
1077
|
+
|
|
1078
|
+
self.backoffTimer = timer
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
private func transitionState(from oldValue: State, to newValue: State) async {
|
|
1082
|
+
guard oldValue != newValue else {
|
|
1083
|
+
return
|
|
1084
|
+
}
|
|
1085
|
+
|
|
1086
|
+
switch newValue {
|
|
1087
|
+
case .error(let err):
|
|
1088
|
+
await notifyError(err)
|
|
1089
|
+
case .stopped:
|
|
1090
|
+
await send(event: .stopped)
|
|
1091
|
+
case .enhancing:
|
|
1092
|
+
await send(event: .startedEnhancing)
|
|
1093
|
+
case .fetching:
|
|
1094
|
+
await send(event: .startedFetching)
|
|
1095
|
+
case .handlingSaplingFiles:
|
|
1096
|
+
// We don't report this to outside world as separate phase for now.
|
|
1097
|
+
break
|
|
1098
|
+
case .synced:
|
|
1099
|
+
// transition to this state is handled by `processingFinished(height: BlockHeight)`
|
|
1100
|
+
break
|
|
1101
|
+
case .syncing:
|
|
1102
|
+
await send(event: .startedSyncing)
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
private func notifyError(_ err: Error) async {
|
|
1107
|
+
await send(event: .failed(err))
|
|
1108
|
+
}
|
|
1109
|
+
// TODO: [#713] encapsulate service errors better, https://github.com/zcash/ZcashLightClientKit/issues/713
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
extension CompactBlockProcessor.State: Equatable {
|
|
1113
|
+
public static func == (lhs: CompactBlockProcessor.State, rhs: CompactBlockProcessor.State) -> Bool {
|
|
1114
|
+
switch (lhs, rhs) {
|
|
1115
|
+
case
|
|
1116
|
+
(.syncing, .syncing),
|
|
1117
|
+
(.stopped, .stopped),
|
|
1118
|
+
(.error, .error),
|
|
1119
|
+
(.synced, .synced),
|
|
1120
|
+
(.enhancing, .enhancing),
|
|
1121
|
+
(.fetching, .fetching):
|
|
1122
|
+
return true
|
|
1123
|
+
default:
|
|
1124
|
+
return false
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
extension CompactBlockProcessor {
|
|
1130
|
+
func getUnifiedAddress(accountIndex: Int) async throws -> UnifiedAddress {
|
|
1131
|
+
try await rustBackend.getCurrentAddress(account: Int32(accountIndex))
|
|
1132
|
+
}
|
|
1133
|
+
|
|
1134
|
+
func getSaplingAddress(accountIndex: Int) async throws -> SaplingAddress {
|
|
1135
|
+
try await getUnifiedAddress(accountIndex: accountIndex).saplingReceiver()
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
func getTransparentAddress(accountIndex: Int) async throws -> TransparentAddress {
|
|
1139
|
+
try await getUnifiedAddress(accountIndex: accountIndex).transparentReceiver()
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
func getTransparentBalance(accountIndex: Int) async throws -> WalletBalance {
|
|
1143
|
+
guard accountIndex >= 0 else {
|
|
1144
|
+
throw ZcashError.compactBlockProcessorInvalidAccount
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
return WalletBalance(
|
|
1148
|
+
verified: Zatoshi(
|
|
1149
|
+
try await rustBackend.getVerifiedTransparentBalance(account: Int32(accountIndex))
|
|
1150
|
+
),
|
|
1151
|
+
total: Zatoshi(
|
|
1152
|
+
try await rustBackend.getTransparentBalance(account: Int32(accountIndex))
|
|
1153
|
+
)
|
|
1154
|
+
)
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
extension CompactBlockProcessor {
|
|
1159
|
+
func refreshUTXOs(tAddress: TransparentAddress, startHeight: BlockHeight) async throws -> RefreshedUTXOs {
|
|
1160
|
+
let dataDb = self.config.dataDb
|
|
1161
|
+
|
|
1162
|
+
let stream: AsyncThrowingStream<UnspentTransactionOutputEntity, Error> = blockDownloaderService.fetchUnspentTransactionOutputs(
|
|
1163
|
+
tAddress: tAddress.stringEncoded,
|
|
1164
|
+
startHeight: startHeight
|
|
1165
|
+
)
|
|
1166
|
+
var utxos: [UnspentTransactionOutputEntity] = []
|
|
1167
|
+
|
|
1168
|
+
do {
|
|
1169
|
+
for try await utxo in stream {
|
|
1170
|
+
utxos.append(utxo)
|
|
1171
|
+
}
|
|
1172
|
+
return await storeUTXOs(utxos, in: dataDb)
|
|
1173
|
+
} catch {
|
|
1174
|
+
throw error
|
|
1175
|
+
}
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
private func storeUTXOs(_ utxos: [UnspentTransactionOutputEntity], in dataDb: URL) async -> RefreshedUTXOs {
|
|
1179
|
+
var refreshed: [UnspentTransactionOutputEntity] = []
|
|
1180
|
+
var skipped: [UnspentTransactionOutputEntity] = []
|
|
1181
|
+
for utxo in utxos {
|
|
1182
|
+
do {
|
|
1183
|
+
try await rustBackend.putUnspentTransparentOutput(
|
|
1184
|
+
txid: utxo.txid.bytes,
|
|
1185
|
+
index: utxo.index,
|
|
1186
|
+
script: utxo.script.bytes,
|
|
1187
|
+
value: Int64(utxo.valueZat),
|
|
1188
|
+
height: utxo.height
|
|
1189
|
+
)
|
|
1190
|
+
|
|
1191
|
+
refreshed.append(utxo)
|
|
1192
|
+
} catch {
|
|
1193
|
+
logger.info("failed to put utxo - error: \(error)")
|
|
1194
|
+
skipped.append(utxo)
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
return (inserted: refreshed, skipped: skipped)
|
|
1198
|
+
}
|
|
1199
|
+
}
|
|
1200
|
+
|
|
1201
|
+
extension CompactBlockProcessor {
|
|
1202
|
+
enum NextState: Equatable {
|
|
1203
|
+
case finishProcessing(height: BlockHeight)
|
|
1204
|
+
case processNewBlocks(ranges: SyncRanges)
|
|
1205
|
+
case wait(latestHeight: BlockHeight, latestDownloadHeight: BlockHeight)
|
|
1206
|
+
}
|
|
1207
|
+
|
|
1208
|
+
@discardableResult
|
|
1209
|
+
func figureNextBatch(
|
|
1210
|
+
downloaderService: BlockDownloaderService
|
|
1211
|
+
) async throws -> NextState {
|
|
1212
|
+
try Task.checkCancellation()
|
|
1213
|
+
|
|
1214
|
+
do {
|
|
1215
|
+
return try await CompactBlockProcessor.NextStateHelper.nextState(
|
|
1216
|
+
service: service,
|
|
1217
|
+
downloaderService: downloaderService,
|
|
1218
|
+
latestBlocksDataProvider: latestBlocksDataProvider,
|
|
1219
|
+
config: config,
|
|
1220
|
+
rustBackend: rustBackend,
|
|
1221
|
+
internalSyncProgress: internalSyncProgress
|
|
1222
|
+
)
|
|
1223
|
+
} catch {
|
|
1224
|
+
throw error
|
|
1225
|
+
}
|
|
1226
|
+
}
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1229
|
+
extension CompactBlockProcessor {
|
|
1230
|
+
enum NextStateHelper {
|
|
1231
|
+
// swiftlint:disable:next function_parameter_count
|
|
1232
|
+
static func nextState(
|
|
1233
|
+
service: LightWalletService,
|
|
1234
|
+
downloaderService: BlockDownloaderService,
|
|
1235
|
+
latestBlocksDataProvider: LatestBlocksDataProvider,
|
|
1236
|
+
config: Configuration,
|
|
1237
|
+
rustBackend: ZcashRustBackendWelding,
|
|
1238
|
+
internalSyncProgress: InternalSyncProgress
|
|
1239
|
+
) async throws -> CompactBlockProcessor.NextState {
|
|
1240
|
+
// It should be ok to not create new Task here because this method is already async. But for some reason something not good happens
|
|
1241
|
+
// when Task is not created here. For example tests start failing. Reason is unknown at this time.
|
|
1242
|
+
let task = Task(priority: .userInitiated) {
|
|
1243
|
+
let info = try await service.getInfo()
|
|
1244
|
+
|
|
1245
|
+
try await CompactBlockProcessor.validateServerInfo(
|
|
1246
|
+
info,
|
|
1247
|
+
saplingActivation: config.saplingActivation,
|
|
1248
|
+
localNetwork: config.network,
|
|
1249
|
+
rustBackend: rustBackend
|
|
1250
|
+
)
|
|
1251
|
+
|
|
1252
|
+
let latestDownloadHeight = try await downloaderService.lastDownloadedBlockHeight()
|
|
1253
|
+
|
|
1254
|
+
await internalSyncProgress.migrateIfNeeded(latestDownloadedBlockHeightFromCacheDB: latestDownloadHeight)
|
|
1255
|
+
|
|
1256
|
+
await latestBlocksDataProvider.updateScannedData()
|
|
1257
|
+
await latestBlocksDataProvider.updateBlockData()
|
|
1258
|
+
|
|
1259
|
+
return await internalSyncProgress.computeNextState(
|
|
1260
|
+
latestBlockHeight: latestBlocksDataProvider.latestBlockHeight,
|
|
1261
|
+
latestScannedHeight: latestBlocksDataProvider.latestScannedHeight,
|
|
1262
|
+
walletBirthday: config.walletBirthday
|
|
1263
|
+
)
|
|
1264
|
+
}
|
|
1265
|
+
|
|
1266
|
+
return try await task.value
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
|
|
1271
|
+
/// This extension contains asociated types and functions needed to clean up the
|
|
1272
|
+
/// `cacheDb` in favor of `FsBlockDb`. Once this cleanup functionality is deprecated,
|
|
1273
|
+
/// delete the whole extension and reference to it in other parts of the code including tests.
|
|
1274
|
+
extension CompactBlockProcessor {
|
|
1275
|
+
public enum CacheDbMigrationError: Error {
|
|
1276
|
+
case fsCacheMigrationFailedSameURL
|
|
1277
|
+
case failedToDeleteLegacyDb(Error)
|
|
1278
|
+
case failedToInitFsBlockDb(Error)
|
|
1279
|
+
case failedToSetDownloadHeight(Error)
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
/// Deletes the SQLite cacheDb and attempts to initialize the fsBlockDbRoot
|
|
1283
|
+
/// - parameter legacyCacheDbURL: the URL where the cache Db used to be stored.
|
|
1284
|
+
/// - Throws: `InitializerError.fsCacheInitFailedSameURL` when the given URL
|
|
1285
|
+
/// is the same URL than the one provided as `self.fsBlockDbRoot` assuming that's a
|
|
1286
|
+
/// programming error being the `legacyCacheDbURL` a sqlite database file and not a
|
|
1287
|
+
/// directory. Also throws errors from initializing the fsBlockDbRoot.
|
|
1288
|
+
///
|
|
1289
|
+
/// - Note: Errors from deleting the `legacyCacheDbURL` won't be throwns.
|
|
1290
|
+
func migrateCacheDb(_ legacyCacheDbURL: URL) async throws {
|
|
1291
|
+
guard legacyCacheDbURL != config.fsBlockCacheRoot else {
|
|
1292
|
+
throw ZcashError.compactBlockProcessorCacheDbMigrationFsCacheMigrationFailedSameURL
|
|
1293
|
+
}
|
|
1294
|
+
|
|
1295
|
+
// Instance with alias `default` is same as instance before the Alias was introduced. So it makes sense that only this instance handles
|
|
1296
|
+
// legacy cache DB. Any instance with different than `default` alias was created after the Alias was introduced and at this point legacy
|
|
1297
|
+
// cache DB is't anymore. So there is nothing to migrate for instances with not default Alias.
|
|
1298
|
+
guard config.alias == .default else {
|
|
1299
|
+
return
|
|
1300
|
+
}
|
|
1301
|
+
|
|
1302
|
+
// if the URL provided is not readable, it means that the client has a reference
|
|
1303
|
+
// to the cacheDb file but it has been deleted in a prior sync cycle. there's
|
|
1304
|
+
// nothing to do here.
|
|
1305
|
+
guard FileManager.default.isReadableFile(atPath: legacyCacheDbURL.path) else {
|
|
1306
|
+
return
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
do {
|
|
1310
|
+
// if there's a readable file at the provided URL, delete it.
|
|
1311
|
+
try FileManager.default.removeItem(at: legacyCacheDbURL)
|
|
1312
|
+
} catch {
|
|
1313
|
+
throw ZcashError.compactBlockProcessorCacheDbMigrationFailedToDeleteLegacyDb(error)
|
|
1314
|
+
}
|
|
1315
|
+
|
|
1316
|
+
// create the storage
|
|
1317
|
+
try await self.storage.create()
|
|
1318
|
+
|
|
1319
|
+
// The database has been deleted, so we have adjust the internal state of the
|
|
1320
|
+
// `CompactBlockProcessor` so that it doesn't rely on download heights set
|
|
1321
|
+
// by a previous processing cycle.
|
|
1322
|
+
let lastScannedHeight = try await transactionRepository.lastScannedHeight()
|
|
1323
|
+
|
|
1324
|
+
await internalSyncProgress.set(lastScannedHeight, .latestDownloadedBlockHeight)
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
func wipeLegacyCacheDbIfNeeded() {
|
|
1328
|
+
guard let cacheDbURL = config.cacheDbURL else {
|
|
1329
|
+
return
|
|
1330
|
+
}
|
|
1331
|
+
|
|
1332
|
+
guard FileManager.default.isDeletableFile(atPath: cacheDbURL.pathExtension) else {
|
|
1333
|
+
return
|
|
1334
|
+
}
|
|
1335
|
+
|
|
1336
|
+
try? FileManager.default.removeItem(at: cacheDbURL)
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1339
|
+
|
|
1340
|
+
extension SyncRanges {
|
|
1341
|
+
/// Tells whether the state represented by these sync ranges evidence some sort of
|
|
1342
|
+
/// outdated state on the cache or the internal state of the compact block processor.
|
|
1343
|
+
///
|
|
1344
|
+
/// - Note: this can mean that the processor has synced over the height that the internal
|
|
1345
|
+
/// state knows of because the sync process was interrupted before it could reflect
|
|
1346
|
+
/// it in the internal state storage. This could happen because of many factors, the
|
|
1347
|
+
/// most feasible being OS shutting down a background process or the user abruptly
|
|
1348
|
+
/// exiting the app.
|
|
1349
|
+
/// - Returns: an ``Optional<BlockHeight>`` where Some represents what's the
|
|
1350
|
+
/// new state the internal state should reflect and indicating that the cache should be cleared
|
|
1351
|
+
/// as well. c`None` means that no action is required.
|
|
1352
|
+
func shouldClearBlockCacheAndUpdateInternalState() -> BlockHeight? {
|
|
1353
|
+
guard self.downloadedButUnscannedRange != nil else {
|
|
1354
|
+
return nil
|
|
1355
|
+
}
|
|
1356
|
+
|
|
1357
|
+
guard
|
|
1358
|
+
let latestScannedHeight = self.latestScannedHeight,
|
|
1359
|
+
let latestDownloadedHeight = self.latestDownloadedBlockHeight,
|
|
1360
|
+
latestScannedHeight > latestDownloadedHeight
|
|
1361
|
+
else { return nil }
|
|
1362
|
+
|
|
1363
|
+
return latestScannedHeight
|
|
1364
|
+
}
|
|
1365
|
+
}
|