react-native-zcash 0.3.3 → 0.3.5
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 +10 -0
- package/LICENSE +22 -0
- package/README.md +47 -14
- package/android/build.gradle +1 -1
- package/android/src/main/assets/saplingtree/mainnet/1310000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1320000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1330000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1340000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1350000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1360000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1370000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1380000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1390000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1400000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1410000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1420000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1430000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1440000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1450000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1460000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1470000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1480000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1490000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1500000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1510000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1520000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1530000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1540000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1550000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1560000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1570000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1580000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1590000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1600000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1610000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1620000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1630000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1640000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1650000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1660000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1670000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1680000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1690000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1700000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1710000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1720000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1730000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1740000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1750000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1760000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1770000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1780000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1790000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1800000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1810000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1820000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1830000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1840000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1850000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1860000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1870000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1880000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1890000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1900000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1910000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1920000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1930000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1940000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1950000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1960000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1970000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1980000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/1990000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/2000000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/2010000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/2020000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/2030000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/2040000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/2050000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/2060000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/2070000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/2080000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/2090000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/2100000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/2110000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/2120000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/2130000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/2140000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/2150000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/2160000.json +7 -0
- package/android/src/main/assets/saplingtree/mainnet/2170000.json +7 -0
- package/ios/RNZcash.m +0 -1
- package/ios/RNZcash.swift +14 -15
- package/ios/ZCashLightClientKit/Block/DatabaseStorage/CompactBlockStorage.swift +123 -0
- package/ios/ZCashLightClientKit/Block/DatabaseStorage/DatabaseMigrationManager.swift +222 -0
- package/ios/ZCashLightClientKit/Block/DatabaseStorage/StorageError.swift +22 -0
- package/ios/ZCashLightClientKit/Block/DatabaseStorage/StorageManager.swift +73 -0
- package/ios/ZCashLightClientKit/Block/Downloader/BlockDownloader.swift +240 -0
- package/ios/ZCashLightClientKit/Block/Downloader/CompactBlockDownloaderBuilder.swift +26 -0
- package/ios/ZCashLightClientKit/Block/Processor/CompactBlockDownloadOperation.swift +258 -0
- package/ios/ZCashLightClientKit/Block/Processor/CompactBlockEnhancementOperation.swift +157 -0
- package/ios/ZCashLightClientKit/Block/Processor/CompactBlockProcessor.swift +1454 -0
- package/ios/ZCashLightClientKit/Block/Processor/CompactBlockScanningOperation.swift +238 -0
- package/ios/ZCashLightClientKit/Block/Processor/CompactBlockValidationInformation.swift +66 -0
- package/ios/ZCashLightClientKit/Block/Processor/FetchUnspentTxOutputsOperation.swift +103 -0
- package/ios/ZCashLightClientKit/Block/Processor/FigureNextBatchOperation.swift +58 -0
- package/ios/ZCashLightClientKit/Block/Processor/ZcashOperation.swift +68 -0
- package/ios/ZCashLightClientKit/Constants/WalletBirthday+Constants.swift +58 -0
- package/ios/ZCashLightClientKit/Constants/WalletBirthday+mainnet.swift +20 -0
- package/ios/ZCashLightClientKit/Constants/WalletBirthday+testnet.swift +20 -0
- package/ios/ZCashLightClientKit/Constants/ZcashSDK.swift +245 -0
- package/ios/ZCashLightClientKit/DAO/BlockDao.swift +67 -0
- package/ios/ZCashLightClientKit/DAO/CompactBlockDAO.swift +24 -0
- package/ios/ZCashLightClientKit/DAO/NotesDao.swift +142 -0
- package/ios/ZCashLightClientKit/DAO/PagedTransactionDao.swift +62 -0
- package/ios/ZCashLightClientKit/DAO/PendingTransactionDao.swift +213 -0
- package/ios/ZCashLightClientKit/DAO/TransactionBuilder.swift +169 -0
- package/ios/ZCashLightClientKit/DAO/TransactionDao.swift +393 -0
- package/ios/ZCashLightClientKit/DAO/UnspentTransactionOutputDao.swift +188 -0
- package/ios/ZCashLightClientKit/Entity/AccountEntity.swift +201 -0
- package/ios/ZCashLightClientKit/Entity/CompactBlockEntity.swift +13 -0
- package/ios/ZCashLightClientKit/Entity/EncodedTransactionEntity.swift +26 -0
- package/ios/ZCashLightClientKit/Entity/PendingTransactionEntity.swift +205 -0
- package/ios/ZCashLightClientKit/Entity/ReceivedNoteEntity.swift +22 -0
- package/ios/ZCashLightClientKit/Entity/SentNoteEntity.swift +45 -0
- package/ios/ZCashLightClientKit/Entity/TransactionEntity.swift +161 -0
- package/ios/ZCashLightClientKit/Entity/UnspentTransactionOutputEntity.swift +17 -0
- package/ios/ZCashLightClientKit/Extensions/Data+Zcash.swift +17 -0
- package/ios/ZCashLightClientKit/Extensions/Data+internal.swift +35 -0
- package/ios/ZCashLightClientKit/Extensions/HexEncode.swift +41 -0
- package/ios/ZCashLightClientKit/Extensions/ZcashRust+Utils.swift +26 -0
- package/ios/ZCashLightClientKit/Extensions/ZcashSDK+extensions.swift +34 -0
- package/ios/ZCashLightClientKit/Initializer.swift +357 -0
- package/ios/ZCashLightClientKit/Model/WalletTypes.swift +108 -0
- package/ios/ZCashLightClientKit/Providers/ResourceProvider.swift +47 -0
- package/ios/ZCashLightClientKit/Repository/BlockRepository.swift +13 -0
- package/ios/ZCashLightClientKit/Repository/CompactBlockRepository.swift +75 -0
- package/ios/ZCashLightClientKit/Repository/NotesRepository.swift +16 -0
- package/ios/ZCashLightClientKit/Repository/PaginatedTransactionRepository.swift +35 -0
- package/ios/ZCashLightClientKit/Repository/PendingTransactionRepository.swift +19 -0
- package/ios/ZCashLightClientKit/Repository/TransactionRepository.swift +30 -0
- package/ios/ZCashLightClientKit/Repository/TransactionRepositoryBuilder.swift +24 -0
- package/ios/ZCashLightClientKit/Repository/UnspentTransactionOutputRepository.swift +18 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1000000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1010000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1020000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1030000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1040000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1050000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1060000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1070000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1080000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1090000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1100000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1110000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1120000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1130000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1140000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1150000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1160000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1170000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1180000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1190000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1200000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1210000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1220000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1230000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1240000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1250000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1260000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1270000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1280000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1290000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1300000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1310000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1320000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1330000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1340000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1350000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1360000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1370000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1380000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1390000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1400000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1410000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1420000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1430000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1440000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1450000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1460000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1470000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1480000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1490000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1500000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1510000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1520000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1530000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1540000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1550000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1560000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1570000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1580000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1590000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1600000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1610000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1620000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1630000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1640000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1650000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1660000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1670000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1680000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1690000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1700000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1710000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1720000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1730000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1740000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1750000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1760000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1770000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1780000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1790000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1800000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1810000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1820000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1830000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1840000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1850000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1860000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1870000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1880000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1890000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1900000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1910000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1920000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1930000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1940000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1950000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1960000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1970000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1980000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/1990000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2000000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2010000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2020000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2030000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2040000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2050000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2060000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2070000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2080000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2090000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2100000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2110000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2120000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2130000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2140000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2150000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2160000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/2170000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/419200.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/500000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/510000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/520000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/530000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/540000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/550000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/560000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/570000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/580000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/590000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/600000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/610000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/620000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/630000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/640000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/650000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/660000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/663150.json +8 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/670000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/680000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/690000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/700000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/710000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/720000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/730000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/740000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/750000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/760000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/770000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/780000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/790000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/800000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/810000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/820000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/830000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/840000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/850000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/860000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/870000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/880000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/890000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/900000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/910000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/920000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/930000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/940000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/950000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/960000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/970000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/980000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/mainnet/990000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1000000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1010000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1020000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1030000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1040000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1050000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1060000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1070000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1080000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1090000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1100000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1110000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1120000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1130000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1140000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1150000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1160000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1170000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1180000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1190000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1200000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1210000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1220000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1230000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1240000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1250000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1260000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1270000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1280000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1290000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1300000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1310000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1320000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1330000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1340000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1350000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1360000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1370000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1380000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1390000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1400000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1410000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1420000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1430000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1440000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1450000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1460000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1470000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1480000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1490000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1500000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1510000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1520000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1530000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1540000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1550000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1560000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1570000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1580000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1590000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1600000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1610000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1620000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1630000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1640000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1650000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1660000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1670000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1680000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1690000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1700000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1710000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1720000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1730000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1740000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1750000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1760000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1770000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1780000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1790000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1800000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1810000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1820000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1830000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1840000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1850000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/1860000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/280000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/290000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/300000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/310000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/320000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/330000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/340000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/350000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/360000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/370000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/380000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/390000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/400000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/410000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/420000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/430000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/440000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/450000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/460000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/470000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/480000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/490000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/500000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/510000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/520000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/530000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/540000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/550000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/560000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/570000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/580000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/590000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/600000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/610000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/620000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/630000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/640000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/650000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/660000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/670000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/680000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/690000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/700000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/710000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/720000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/730000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/740000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/750000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/760000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/770000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/780000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/790000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/800000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/810000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/820000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/830000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/840000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/850000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/860000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/870000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/880000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/890000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/900000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/910000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/920000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/930000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/940000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/950000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/960000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/970000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/980000.json +7 -0
- package/ios/ZCashLightClientKit/Resources/saplingtree-checkpoints/testnet/990000.json +7 -0
- package/ios/ZCashLightClientKit/Rust/ZcashRustBackend.swift +718 -0
- package/ios/ZCashLightClientKit/Rust/ZcashRustBackendWelding.swift +389 -0
- package/ios/ZCashLightClientKit/Rust/zcashlc.h +385 -0
- package/ios/ZCashLightClientKit/Service/LightWalletGRPCService.swift +551 -0
- package/ios/ZCashLightClientKit/Service/LightWalletService.swift +214 -0
- package/ios/ZCashLightClientKit/Service/Model/ZcashCompactBlock.swift +46 -0
- package/ios/ZCashLightClientKit/Service/ProtoBuf/Extensions/Protocolbuffer+Extensions.swift +50 -0
- package/ios/ZCashLightClientKit/Service/ProtoBuf/compact_formats.pb.swift +332 -0
- package/ios/ZCashLightClientKit/Service/ProtoBuf/proto/compact_formats.proto +56 -0
- package/ios/ZCashLightClientKit/Service/ProtoBuf/proto/service.proto +180 -0
- package/ios/ZCashLightClientKit/Service/ProtoBuf/service.grpc.swift +383 -0
- package/ios/ZCashLightClientKit/Service/ProtoBuf/service.pb.swift +1173 -0
- package/ios/ZCashLightClientKit/Synchronizer/SDKSynchronizer.swift +929 -0
- package/ios/ZCashLightClientKit/Synchronizer.swift +430 -0
- package/ios/ZCashLightClientKit/Tool/DerivationTool.swift +344 -0
- package/ios/ZCashLightClientKit/Transaction/PersistentTransactionManager.swift +339 -0
- package/ios/ZCashLightClientKit/Transaction/TransactionEncoder.swift +116 -0
- package/ios/ZCashLightClientKit/Transaction/TransactionManager.swift +42 -0
- package/ios/ZCashLightClientKit/Transaction/WalletTransactionEncoder.swift +216 -0
- package/ios/ZCashLightClientKit/Utils/Bundle+module.swift +30 -0
- package/ios/ZCashLightClientKit/Utils/LoggingProxy.swift +47 -0
- package/ios/ZCashLightClientKit/Utils/SaplingParameterDownloader.swift +124 -0
- package/ios/libzcashlc.xcframework/Info.plist +40 -0
- package/ios/libzcashlc.xcframework/ios-arm64/libzcashlc.a +0 -0
- package/ios/libzcashlc.xcframework/ios-arm64_x86_64-simulator/libzcashlc.a +0 -0
- package/ios/react-native-zcash-Bridging-Header.h +2 -0
- package/ios/react-native-zcash.xcodeproj/project.pbxproj +1 -0
- package/lib/scripts/copyCheckpoints.d.ts +5 -0
- package/lib/scripts/updateCheckpoints.d.ts +1 -0
- package/lib/scripts/updateSources.d.ts +1 -0
- package/package.json +21 -32
- package/react-native-zcash.podspec +17 -7
- package/ios/RNZcash-Bridging-Header.h +0 -6
- package/ios/RNZcash.xcodeproj/project.pbxproj +0 -271
- package/ios/RNZcash.xcworkspace/contents.xcworkspacedata +0 -7
- package/ios/RNZcash.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- package/lib/src/browser.d.ts +0 -0
- package/lib/src/index.d.ts +0 -0
- package/lib/test/test.test.d.ts +0 -0
- package/src/browser.ts +0 -36
- package/src/index.flow.js +0 -168
- package/src/index.ts +0 -1
|
@@ -0,0 +1,929 @@
|
|
|
1
|
+
//
|
|
2
|
+
// SDKSynchronizer.swift
|
|
3
|
+
// ZcashLightClientKit
|
|
4
|
+
//
|
|
5
|
+
// Created by Francisco Gindre on 11/6/19.
|
|
6
|
+
// Copyright © 2019 Electric Coin Company. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
import Foundation
|
|
10
|
+
|
|
11
|
+
public extension Notification.Name {
|
|
12
|
+
/**
|
|
13
|
+
Notification is posted whenever transactions are updated
|
|
14
|
+
|
|
15
|
+
- Important: not yet posted
|
|
16
|
+
*/
|
|
17
|
+
static let transactionsUpdated = Notification.Name("SDKSyncronizerTransactionUpdated")
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
Posted when the synchronizer is started.
|
|
21
|
+
*/
|
|
22
|
+
static let synchronizerStarted = Notification.Name("SDKSyncronizerStarted")
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
Posted when there are progress updates.
|
|
26
|
+
|
|
27
|
+
- Note: Query userInfo object for NotificationKeys.progress for Float progress percentage and NotificationKeys.blockHeight for the current progress height
|
|
28
|
+
*/
|
|
29
|
+
static let synchronizerProgressUpdated = Notification.Name("SDKSyncronizerProgressUpdated")
|
|
30
|
+
|
|
31
|
+
static let synchronizerStatusWillUpdate = Notification.Name("SDKSynchronizerStatusWillUpdate")
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
Posted when the synchronizer is synced to latest height
|
|
35
|
+
*/
|
|
36
|
+
static let synchronizerSynced = Notification.Name("SDKSyncronizerSynced")
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
Posted when the synchronizer is stopped
|
|
40
|
+
*/
|
|
41
|
+
static let synchronizerStopped = Notification.Name("SDKSyncronizerStopped")
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
Posted when the synchronizer loses connection
|
|
45
|
+
*/
|
|
46
|
+
static let synchronizerDisconnected = Notification.Name("SDKSyncronizerDisconnected")
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
Posted when the synchronizer starts syncing
|
|
50
|
+
*/
|
|
51
|
+
static let synchronizerSyncing = Notification.Name("SDKSyncronizerSyncing")
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
Posted when synchronizer starts downloading blocks
|
|
55
|
+
*/
|
|
56
|
+
static let synchronizerDownloading = Notification.Name("SDKSyncronizerDownloading")
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
Posted when synchronizer starts validating blocks
|
|
60
|
+
*/
|
|
61
|
+
static let synchronizerValidating = Notification.Name("SDKSyncronizerValidating")
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
Posted when synchronizer starts scanning blocks
|
|
65
|
+
*/
|
|
66
|
+
static let synchronizerScanning = Notification.Name("SDKSyncronizerScanning")
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
Posted when the synchronizer starts Enhancing
|
|
70
|
+
*/
|
|
71
|
+
static let synchronizerEnhancing = Notification.Name("SDKSyncronizerEnhancing")
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
Posted when the synchronizer starts fetching UTXOs
|
|
75
|
+
*/
|
|
76
|
+
static let synchronizerFetching = Notification.Name("SDKSyncronizerFetching")
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
Posted when the synchronizer finds a pendingTransaction that hast been newly mined
|
|
80
|
+
- Note: query userInfo on NotificationKeys.minedTransaction for the transaction
|
|
81
|
+
*/
|
|
82
|
+
static let synchronizerMinedTransaction = Notification.Name("synchronizerMinedTransaction")
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
Posted when the synchronizer finds a mined transaction
|
|
86
|
+
- Note: query userInfo on NotificationKeys.foundTransactions for the [ConfirmedTransactionEntity]. This notification could arrive in a background thread.
|
|
87
|
+
*/
|
|
88
|
+
static let synchronizerFoundTransactions = Notification.Name("synchronizerFoundTransactions")
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
Posted when the synchronizer presents an error
|
|
92
|
+
- Note: query userInfo on NotificationKeys.error for an error
|
|
93
|
+
*/
|
|
94
|
+
static let synchronizerFailed = Notification.Name("SDKSynchronizerFailed")
|
|
95
|
+
|
|
96
|
+
static let synchronizerConnectionStateChanged = Notification.Name("SynchronizerConnectionStateChanged")
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
Synchronizer implementation for UIKit and iOS 12+
|
|
101
|
+
*/
|
|
102
|
+
// swiftlint:disable type_body_length
|
|
103
|
+
public class SDKSynchronizer: Synchronizer {
|
|
104
|
+
public enum NotificationKeys {
|
|
105
|
+
public static let progress = "SDKSynchronizer.progress"
|
|
106
|
+
public static let blockHeight = "SDKSynchronizer.blockHeight"
|
|
107
|
+
public static let blockDate = "SDKSynchronizer.blockDate"
|
|
108
|
+
public static let minedTransaction = "SDKSynchronizer.minedTransaction"
|
|
109
|
+
public static let foundTransactions = "SDKSynchronizer.foundTransactions"
|
|
110
|
+
public static let error = "SDKSynchronizer.error"
|
|
111
|
+
public static let currentStatus = "SDKSynchronizer.currentStatus"
|
|
112
|
+
public static let nextStatus = "SDKSynchronizer.nextStatus"
|
|
113
|
+
public static let currentConnectionState = "SDKSynchronizer.currentConnectionState"
|
|
114
|
+
public static let previousConnectionState = "SDKSynchronizer.previousConnectionState"
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
public private(set) var status: SyncStatus {
|
|
118
|
+
didSet {
|
|
119
|
+
notify(status: status)
|
|
120
|
+
}
|
|
121
|
+
willSet {
|
|
122
|
+
notifyStatusChange(newValue: newValue, oldValue: status)
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
public private(set) var progress: Float = 0.0
|
|
126
|
+
public private(set) var blockProcessor: CompactBlockProcessor
|
|
127
|
+
public private(set) var initializer: Initializer
|
|
128
|
+
public private(set) var latestScannedHeight: BlockHeight
|
|
129
|
+
public private(set) var connectionState: ConnectionState
|
|
130
|
+
public private(set) var network: ZcashNetwork
|
|
131
|
+
private var transactionManager: OutboundTransactionManager
|
|
132
|
+
private var transactionRepository: TransactionRepository
|
|
133
|
+
private var utxoRepository: UnspentTransactionOutputRepository
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
Creates an SDKSynchronizer instance
|
|
137
|
+
- Parameter initializer: a wallet Initializer object
|
|
138
|
+
*/
|
|
139
|
+
public convenience init(initializer: Initializer) throws {
|
|
140
|
+
try self.init(
|
|
141
|
+
status: .unprepared,
|
|
142
|
+
initializer: initializer,
|
|
143
|
+
transactionManager: try OutboundTransactionManagerBuilder.build(initializer: initializer),
|
|
144
|
+
transactionRepository: initializer.transactionRepository,
|
|
145
|
+
utxoRepository: try UTXORepositoryBuilder.build(initializer: initializer),
|
|
146
|
+
blockProcessor: CompactBlockProcessor(initializer: initializer)
|
|
147
|
+
)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
init(
|
|
151
|
+
status: SyncStatus,
|
|
152
|
+
initializer: Initializer,
|
|
153
|
+
transactionManager: OutboundTransactionManager,
|
|
154
|
+
transactionRepository: TransactionRepository,
|
|
155
|
+
utxoRepository: UnspentTransactionOutputRepository,
|
|
156
|
+
blockProcessor: CompactBlockProcessor
|
|
157
|
+
) throws {
|
|
158
|
+
self.connectionState = .idle
|
|
159
|
+
self.status = status
|
|
160
|
+
self.initializer = initializer
|
|
161
|
+
self.transactionManager = transactionManager
|
|
162
|
+
self.transactionRepository = transactionRepository
|
|
163
|
+
self.utxoRepository = utxoRepository
|
|
164
|
+
self.blockProcessor = blockProcessor
|
|
165
|
+
self.latestScannedHeight = (try? transactionRepository.lastScannedHeight()) ?? initializer.walletBirthday.height
|
|
166
|
+
self.network = initializer.network
|
|
167
|
+
self.subscribeToProcessorNotifications(blockProcessor)
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
deinit {
|
|
171
|
+
NotificationCenter.default.removeObserver(self)
|
|
172
|
+
self.blockProcessor.stop()
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
public func initialize() throws {
|
|
176
|
+
try self.initializer.initialize()
|
|
177
|
+
try self.blockProcessor.setStartHeight(initializer.walletBirthday.height)
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
public func prepare() throws {
|
|
181
|
+
try self.initializer.initialize()
|
|
182
|
+
try self.blockProcessor.setStartHeight(initializer.walletBirthday.height)
|
|
183
|
+
self.status = .disconnected
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
Starts the synchronizer
|
|
188
|
+
- Throws: CompactBlockProcessorError when failures occur
|
|
189
|
+
*/
|
|
190
|
+
public func start(retry: Bool = false) throws {
|
|
191
|
+
switch status {
|
|
192
|
+
case .unprepared:
|
|
193
|
+
throw SynchronizerError.notPrepared
|
|
194
|
+
|
|
195
|
+
case .downloading, .validating, .scanning, .enhancing, .fetching:
|
|
196
|
+
LoggerProxy.warn("warning: synchronizer started when already started")
|
|
197
|
+
return
|
|
198
|
+
|
|
199
|
+
case .stopped, .synced, .disconnected, .error:
|
|
200
|
+
do {
|
|
201
|
+
try blockProcessor.start(retry: retry)
|
|
202
|
+
} catch {
|
|
203
|
+
throw mapError(error)
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
Stops the synchronizer
|
|
210
|
+
*/
|
|
211
|
+
public func stop() {
|
|
212
|
+
guard status != .stopped, status != .disconnected else {
|
|
213
|
+
LoggerProxy.info("attempted to stop when status was: \(status)")
|
|
214
|
+
return
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
blockProcessor.stop(cancelTasks: true)
|
|
218
|
+
self.status = .stopped
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
private func subscribeToProcessorNotifications(_ processor: CompactBlockProcessor) {
|
|
222
|
+
let center = NotificationCenter.default
|
|
223
|
+
|
|
224
|
+
center.addObserver(
|
|
225
|
+
self,
|
|
226
|
+
selector: #selector(processorUpdated(_:)),
|
|
227
|
+
name: Notification.Name.blockProcessorUpdated,
|
|
228
|
+
object: processor
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
center.addObserver(
|
|
232
|
+
self,
|
|
233
|
+
selector: #selector(processorStartedDownloading(_:)),
|
|
234
|
+
name: Notification.Name.blockProcessorStartedDownloading,
|
|
235
|
+
object: processor
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
center.addObserver(
|
|
239
|
+
self,
|
|
240
|
+
selector: #selector(processorStartedValidating(_:)),
|
|
241
|
+
name: Notification.Name.blockProcessorStartedValidating,
|
|
242
|
+
object: processor
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
center.addObserver(
|
|
246
|
+
self,
|
|
247
|
+
selector: #selector(processorStartedScanning(_:)),
|
|
248
|
+
name: Notification.Name.blockProcessorStartedScanning,
|
|
249
|
+
object: processor
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
center.addObserver(
|
|
253
|
+
self,
|
|
254
|
+
selector: #selector(processorStartedEnhancing(_:)),
|
|
255
|
+
name: Notification.Name.blockProcessorStartedEnhancing,
|
|
256
|
+
object: processor
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
center.addObserver(
|
|
260
|
+
self,
|
|
261
|
+
selector: #selector(processorStartedFetching(_:)),
|
|
262
|
+
name: Notification.Name.blockProcessorStartedFetching,
|
|
263
|
+
object: processor
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
center.addObserver(
|
|
267
|
+
self,
|
|
268
|
+
selector: #selector(processorStopped(_:)),
|
|
269
|
+
name: Notification.Name.blockProcessorStopped,
|
|
270
|
+
object: processor
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
center.addObserver(
|
|
274
|
+
self,
|
|
275
|
+
selector: #selector(processorFailed(_:)),
|
|
276
|
+
name: Notification.Name.blockProcessorFailed,
|
|
277
|
+
object: processor
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
center.addObserver(
|
|
281
|
+
self,
|
|
282
|
+
selector: #selector(processorIdle(_:)),
|
|
283
|
+
name: Notification.Name.blockProcessorIdle,
|
|
284
|
+
object: processor
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
center.addObserver(
|
|
288
|
+
self,
|
|
289
|
+
selector: #selector(processorFinished(_:)),
|
|
290
|
+
name: Notification.Name.blockProcessorFinished,
|
|
291
|
+
object: processor
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
center.addObserver(
|
|
295
|
+
self,
|
|
296
|
+
selector: #selector(processorTransitionUnknown(_:)),
|
|
297
|
+
name: Notification.Name.blockProcessorUnknownTransition,
|
|
298
|
+
object: processor
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
center.addObserver(
|
|
302
|
+
self,
|
|
303
|
+
selector: #selector(reorgDetected(_:)),
|
|
304
|
+
name: Notification.Name.blockProcessorHandledReOrg,
|
|
305
|
+
object: processor
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
center.addObserver(
|
|
309
|
+
self,
|
|
310
|
+
selector: #selector(transactionsFound(_:)),
|
|
311
|
+
name: Notification.Name.blockProcessorFoundTransactions,
|
|
312
|
+
object: processor
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
center.addObserver(
|
|
316
|
+
self,
|
|
317
|
+
selector: #selector(connectivityStateChanged(_:)),
|
|
318
|
+
name: Notification.Name.blockProcessorConnectivityStateChanged,
|
|
319
|
+
object: nil
|
|
320
|
+
)
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// MARK: Block Processor notifications
|
|
324
|
+
|
|
325
|
+
@objc func connectivityStateChanged(_ notification: Notification) {
|
|
326
|
+
guard
|
|
327
|
+
let userInfo = notification.userInfo,
|
|
328
|
+
let previous = userInfo[CompactBlockProcessorNotificationKey.previousConnectivityStatus] as? ConnectivityState,
|
|
329
|
+
let current = userInfo[CompactBlockProcessorNotificationKey.currentConnectivityStatus] as? ConnectivityState
|
|
330
|
+
else {
|
|
331
|
+
LoggerProxy.error(
|
|
332
|
+
"Found \(Notification.Name.blockProcessorConnectivityStateChanged) but lacks dictionary information." +
|
|
333
|
+
"This is probably a programming error"
|
|
334
|
+
)
|
|
335
|
+
return
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
let currentState = ConnectionState(current)
|
|
339
|
+
NotificationCenter.default.post(
|
|
340
|
+
name: .synchronizerConnectionStateChanged,
|
|
341
|
+
object: self,
|
|
342
|
+
userInfo: [
|
|
343
|
+
NotificationKeys.previousConnectionState: ConnectionState(previous),
|
|
344
|
+
NotificationKeys.currentConnectionState: currentState
|
|
345
|
+
]
|
|
346
|
+
)
|
|
347
|
+
|
|
348
|
+
DispatchQueue.main.async { [weak self] in
|
|
349
|
+
self?.connectionState = currentState
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
@objc func transactionsFound(_ notification: Notification) {
|
|
354
|
+
guard
|
|
355
|
+
let userInfo = notification.userInfo,
|
|
356
|
+
let foundTransactions = userInfo[CompactBlockProcessorNotificationKey.foundTransactions] as? [ConfirmedTransactionEntity]
|
|
357
|
+
else {
|
|
358
|
+
return
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
NotificationCenter.default.post(
|
|
362
|
+
name: .synchronizerFoundTransactions,
|
|
363
|
+
object: self,
|
|
364
|
+
userInfo: [
|
|
365
|
+
NotificationKeys.foundTransactions: foundTransactions
|
|
366
|
+
]
|
|
367
|
+
)
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
@objc func reorgDetected(_ notification: Notification) {
|
|
371
|
+
guard
|
|
372
|
+
let userInfo = notification.userInfo,
|
|
373
|
+
let progress = userInfo[CompactBlockProcessorNotificationKey.reorgHeight] as? BlockHeight,
|
|
374
|
+
let rewindHeight = userInfo[CompactBlockProcessorNotificationKey.rewindHeight] as? BlockHeight
|
|
375
|
+
else {
|
|
376
|
+
LoggerProxy.debug("error processing reorg notification")
|
|
377
|
+
return
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
LoggerProxy.debug("handling reorg at: \(progress) with rewind height: \(rewindHeight)")
|
|
381
|
+
|
|
382
|
+
do {
|
|
383
|
+
try transactionManager.handleReorg(at: rewindHeight)
|
|
384
|
+
} catch {
|
|
385
|
+
LoggerProxy.debug("error handling reorg: \(error)")
|
|
386
|
+
notifyFailure(error)
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
@objc func processorUpdated(_ notification: Notification) {
|
|
391
|
+
guard
|
|
392
|
+
let userInfo = notification.userInfo,
|
|
393
|
+
let progress = userInfo[CompactBlockProcessorNotificationKey.progress] as? CompactBlockProgress
|
|
394
|
+
else {
|
|
395
|
+
return
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
self.notify(progress: progress)
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
@objc func processorStartedDownloading(_ notification: Notification) {
|
|
402
|
+
DispatchQueue.main.async { [weak self] in
|
|
403
|
+
guard let self = self, self.status != .downloading(.nullProgress) else { return }
|
|
404
|
+
self.status = .downloading(.nullProgress)
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
@objc func processorStartedValidating(_ notification: Notification) {
|
|
409
|
+
DispatchQueue.main.async { [weak self] in
|
|
410
|
+
guard let self = self, self.status != .validating else { return }
|
|
411
|
+
self.status = .validating
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
@objc func processorStartedScanning(_ notification: Notification) {
|
|
416
|
+
DispatchQueue.main.async { [weak self] in
|
|
417
|
+
guard let self = self, self.status != .scanning(.nullProgress) else { return }
|
|
418
|
+
self.status = .scanning(.nullProgress)
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
@objc func processorStartedEnhancing(_ notification: Notification) {
|
|
422
|
+
DispatchQueue.main.async { [weak self] in
|
|
423
|
+
guard let self = self, self.status != .enhancing(NullEnhancementProgress()) else { return }
|
|
424
|
+
self.status = .enhancing(NullEnhancementProgress())
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
@objc func processorStartedFetching(_ notification: Notification) {
|
|
429
|
+
DispatchQueue.main.async { [weak self] in
|
|
430
|
+
guard let self = self, self.status != .fetching else { return }
|
|
431
|
+
self.status = .fetching
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
@objc func processorStopped(_ notification: Notification) {
|
|
436
|
+
DispatchQueue.main.async { [weak self] in
|
|
437
|
+
guard let self = self, self.status != .stopped else { return }
|
|
438
|
+
self.status = .stopped
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
@objc func processorFailed(_ notification: Notification) {
|
|
443
|
+
DispatchQueue.main.async { [weak self] in
|
|
444
|
+
guard let self = self else { return }
|
|
445
|
+
if let error = notification.userInfo?[CompactBlockProcessorNotificationKey.error] as? Error {
|
|
446
|
+
self.notifyFailure(error)
|
|
447
|
+
self.status = .error(self.mapError(error))
|
|
448
|
+
} else {
|
|
449
|
+
self.notifyFailure(
|
|
450
|
+
CompactBlockProcessorError.generalError(
|
|
451
|
+
message: "This is strange. processorFailed Call received no error message"
|
|
452
|
+
)
|
|
453
|
+
)
|
|
454
|
+
self.status = .error(SynchronizerError.generalError(message: "This is strange. processorFailed Call received no error message"))
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
@objc func processorIdle(_ notification: Notification) {
|
|
460
|
+
DispatchQueue.main.async { [weak self] in
|
|
461
|
+
guard let self = self else { return }
|
|
462
|
+
self.status = .disconnected
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
@objc func processorFinished(_ notification: Notification) {
|
|
467
|
+
// FIX: Pending transaction updates fail if done from another thread. Improvement needed: explicitly define queues for sql repositories
|
|
468
|
+
|
|
469
|
+
DispatchQueue.main.async { [weak self] in
|
|
470
|
+
guard let self = self else { return }
|
|
471
|
+
if let blockHeight = notification.userInfo?[CompactBlockProcessorNotificationKey.latestScannedBlockHeight] as? BlockHeight {
|
|
472
|
+
self.latestScannedHeight = blockHeight
|
|
473
|
+
}
|
|
474
|
+
self.refreshPendingTransactions()
|
|
475
|
+
self.status = .synced
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
@objc func processorTransitionUnknown(_ notification: Notification) {
|
|
480
|
+
self.status = .disconnected
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// MARK: Synchronizer methods
|
|
484
|
+
|
|
485
|
+
// swiftlint:disable:next function_parameter_count
|
|
486
|
+
public func sendToAddress(
|
|
487
|
+
spendingKey: String,
|
|
488
|
+
zatoshi: Int64,
|
|
489
|
+
toAddress: String,
|
|
490
|
+
memo: String?,
|
|
491
|
+
from accountIndex: Int,
|
|
492
|
+
resultBlock: @escaping (Result<PendingTransactionEntity, Error>) -> Void
|
|
493
|
+
) {
|
|
494
|
+
initializer.downloadParametersIfNeeded { downloadResult in
|
|
495
|
+
DispatchQueue.main.async { [weak self] in
|
|
496
|
+
switch downloadResult {
|
|
497
|
+
case .success:
|
|
498
|
+
self?.createToAddress(
|
|
499
|
+
spendingKey: spendingKey,
|
|
500
|
+
zatoshi: zatoshi,
|
|
501
|
+
toAddress: toAddress,
|
|
502
|
+
memo: memo,
|
|
503
|
+
from: accountIndex,
|
|
504
|
+
resultBlock: resultBlock
|
|
505
|
+
)
|
|
506
|
+
case .failure(let error):
|
|
507
|
+
resultBlock(.failure(SynchronizerError.parameterMissing(underlyingError: error)))
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
public func shieldFunds(
|
|
514
|
+
spendingKey: String,
|
|
515
|
+
transparentSecretKey: String,
|
|
516
|
+
memo: String?,
|
|
517
|
+
from accountIndex: Int,
|
|
518
|
+
resultBlock: @escaping (Result<PendingTransactionEntity, Error>) -> Void
|
|
519
|
+
) {
|
|
520
|
+
// let's see if there are funds to shield
|
|
521
|
+
let derivationTool = DerivationTool(networkType: self.network.networkType)
|
|
522
|
+
|
|
523
|
+
do {
|
|
524
|
+
let tAddr = try derivationTool.deriveTransparentAddressFromPrivateKey(transparentSecretKey)
|
|
525
|
+
let tBalance = try utxoRepository.balance(address: tAddr, latestHeight: self.latestDownloadedHeight())
|
|
526
|
+
|
|
527
|
+
// Verify that at least there are funds for the fee. Ideally this logic will be improved by the shielding wallet.
|
|
528
|
+
guard tBalance.verified >= self.network.constants.defaultFee(for: self.latestScannedHeight) else {
|
|
529
|
+
resultBlock(.failure(ShieldFundsError.insuficientTransparentFunds))
|
|
530
|
+
return
|
|
531
|
+
}
|
|
532
|
+
let viewingKey = try derivationTool.deriveViewingKey(spendingKey: spendingKey)
|
|
533
|
+
let zAddr = try derivationTool.deriveShieldedAddress(viewingKey: viewingKey)
|
|
534
|
+
|
|
535
|
+
let shieldingSpend = try transactionManager.initSpend(zatoshi: Int(tBalance.verified), toAddress: zAddr, memo: memo, from: 0)
|
|
536
|
+
|
|
537
|
+
transactionManager.encodeShieldingTransaction(
|
|
538
|
+
spendingKey: spendingKey,
|
|
539
|
+
tsk: transparentSecretKey,
|
|
540
|
+
pendingTransaction: shieldingSpend
|
|
541
|
+
) { [weak self] result in
|
|
542
|
+
guard let self = self else { return }
|
|
543
|
+
|
|
544
|
+
switch result {
|
|
545
|
+
case .success(let transaction):
|
|
546
|
+
self.transactionManager.submit(pendingTransaction: transaction) { submitResult in
|
|
547
|
+
switch submitResult {
|
|
548
|
+
case .success(let submittedTx):
|
|
549
|
+
resultBlock(.success(submittedTx))
|
|
550
|
+
case .failure(let submissionError):
|
|
551
|
+
DispatchQueue.main.async {
|
|
552
|
+
resultBlock(.failure(submissionError))
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
case .failure(let error):
|
|
558
|
+
resultBlock(.failure(error))
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
} catch {
|
|
562
|
+
resultBlock(.failure(error))
|
|
563
|
+
return
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
// swiftlint:disable:next function_parameter_count
|
|
568
|
+
func createToAddress(
|
|
569
|
+
spendingKey: String,
|
|
570
|
+
zatoshi: Int64,
|
|
571
|
+
toAddress: String,
|
|
572
|
+
memo: String?,
|
|
573
|
+
from accountIndex: Int,
|
|
574
|
+
resultBlock: @escaping (Result<PendingTransactionEntity, Error>) -> Void
|
|
575
|
+
) {
|
|
576
|
+
do {
|
|
577
|
+
let spend = try transactionManager.initSpend(
|
|
578
|
+
zatoshi: Int(zatoshi),
|
|
579
|
+
toAddress: toAddress,
|
|
580
|
+
memo: memo,
|
|
581
|
+
from: accountIndex
|
|
582
|
+
)
|
|
583
|
+
|
|
584
|
+
transactionManager.encode(spendingKey: spendingKey, pendingTransaction: spend) { [weak self] result in
|
|
585
|
+
guard let self = self else { return }
|
|
586
|
+
switch result {
|
|
587
|
+
case .success(let transaction):
|
|
588
|
+
self.transactionManager.submit(pendingTransaction: transaction) { submitResult in
|
|
589
|
+
switch submitResult {
|
|
590
|
+
case .success(let submittedTx):
|
|
591
|
+
resultBlock(.success(submittedTx))
|
|
592
|
+
case .failure(let submissionError):
|
|
593
|
+
DispatchQueue.main.async {
|
|
594
|
+
resultBlock(.failure(submissionError))
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
case .failure(let error):
|
|
600
|
+
resultBlock(.failure(error))
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
} catch {
|
|
604
|
+
resultBlock(.failure(error))
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
public func cancelSpend(transaction: PendingTransactionEntity) -> Bool {
|
|
609
|
+
transactionManager.cancel(pendingTransaction: transaction)
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
public func allReceivedTransactions() throws -> [ConfirmedTransactionEntity] {
|
|
613
|
+
try transactionRepository.findAllReceivedTransactions(offset: 0, limit: Int.max) ?? [ConfirmedTransactionEntity]()
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
public func allPendingTransactions() throws -> [PendingTransactionEntity] {
|
|
617
|
+
try transactionManager.allPendingTransactions() ?? [PendingTransactionEntity]()
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
public func allClearedTransactions() throws -> [ConfirmedTransactionEntity] {
|
|
621
|
+
try transactionRepository.findAll(offset: 0, limit: Int.max) ?? [ConfirmedTransactionEntity]()
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
public func allSentTransactions() throws -> [ConfirmedTransactionEntity] {
|
|
625
|
+
try transactionRepository.findAllSentTransactions(offset: 0, limit: Int.max) ?? [ConfirmedTransactionEntity]()
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
public func allConfirmedTransactions(from transaction: ConfirmedTransactionEntity?, limit: Int) throws -> [ConfirmedTransactionEntity]? {
|
|
629
|
+
try transactionRepository.findAll(from: transaction, limit: limit)
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
public func paginatedTransactions(of kind: TransactionKind = .all) -> PaginatedTransactionRepository {
|
|
633
|
+
PagedTransactionRepositoryBuilder.build(initializer: initializer, kind: .all)
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
public func latestDownloadedHeight() throws -> BlockHeight {
|
|
637
|
+
try initializer.downloader.lastDownloadedBlockHeight()
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
public func latestHeight(result: @escaping (Result<BlockHeight, Error>) -> Void) {
|
|
641
|
+
initializer.downloader.latestBlockHeight(result: result)
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
public func latestHeight() throws -> BlockHeight {
|
|
645
|
+
try initializer.downloader.latestBlockHeight()
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
public func latestUTXOs(address: String, result: @escaping (Result<[UnspentTransactionOutputEntity], Error>) -> Void) {
|
|
649
|
+
guard initializer.isValidTransparentAddress(address) else {
|
|
650
|
+
result(.failure(SynchronizerError.generalError(message: "invalid t-address")))
|
|
651
|
+
return
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
initializer.lightWalletService.fetchUTXOs(for: address, height: network.constants.saplingActivationHeight) { [weak self] fetchResult in
|
|
655
|
+
guard let self = self else { return }
|
|
656
|
+
switch fetchResult {
|
|
657
|
+
case .success(let utxos):
|
|
658
|
+
do {
|
|
659
|
+
try self.utxoRepository.clearAll(address: address)
|
|
660
|
+
try self.utxoRepository.store(utxos: utxos)
|
|
661
|
+
result(.success(utxos))
|
|
662
|
+
} catch {
|
|
663
|
+
result(.failure(SynchronizerError.generalError(message: "\(error)")))
|
|
664
|
+
}
|
|
665
|
+
case .failure(let error):
|
|
666
|
+
result(.failure(SynchronizerError.connectionFailed(message: error)))
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
public func refreshUTXOs(address: String, from height: BlockHeight, result: @escaping (Result<RefreshedUTXOs, Error>) -> Void) {
|
|
672
|
+
self.blockProcessor.refreshUTXOs(tAddress: address, startHeight: height, result: result)
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
public func getShieldedBalance(accountIndex: Int = 0) -> Int64 {
|
|
676
|
+
initializer.getBalance(account: accountIndex)
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
public func getShieldedVerifiedBalance(accountIndex: Int = 0) -> Int64 {
|
|
680
|
+
initializer.getVerifiedBalance(account: accountIndex)
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
public func getShieldedAddress(accountIndex: Int) -> SaplingShieldedAddress? {
|
|
684
|
+
blockProcessor.getShieldedAddress(accountIndex: accountIndex)
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
public func getUnifiedAddress(accountIndex: Int) -> UnifiedAddress? {
|
|
688
|
+
blockProcessor.getUnifiedAddres(accountIndex: accountIndex)
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
public func getTransparentAddress(accountIndex: Int) -> TransparentAddress? {
|
|
692
|
+
blockProcessor.getTransparentAddress(accountIndex: accountIndex)
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
public func getTransparentBalance(accountIndex: Int) throws -> WalletBalance {
|
|
696
|
+
try blockProcessor.getTransparentBalance(accountIndex: accountIndex)
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
/**
|
|
700
|
+
Returns the last stored unshielded balance
|
|
701
|
+
*/
|
|
702
|
+
public func getTransparentBalance(address: String) throws -> WalletBalance {
|
|
703
|
+
do {
|
|
704
|
+
return try self.blockProcessor.utxoCacheBalance(tAddress: address)
|
|
705
|
+
} catch {
|
|
706
|
+
throw SynchronizerError.uncategorized(underlyingError: error)
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
public func rewind(_ policy: RewindPolicy) throws {
|
|
711
|
+
self.stop()
|
|
712
|
+
|
|
713
|
+
var height: BlockHeight?
|
|
714
|
+
|
|
715
|
+
switch policy {
|
|
716
|
+
case .quick:
|
|
717
|
+
break
|
|
718
|
+
|
|
719
|
+
case .birthday:
|
|
720
|
+
let birthday = self.blockProcessor.config.walletBirthday
|
|
721
|
+
height = birthday
|
|
722
|
+
|
|
723
|
+
case .height(let rewindHeight):
|
|
724
|
+
height = rewindHeight
|
|
725
|
+
|
|
726
|
+
case .transaction(let transaction):
|
|
727
|
+
guard let txHeight = transaction.anchor(network: self.network) else {
|
|
728
|
+
throw SynchronizerError.rewindErrorUnknownArchorHeight
|
|
729
|
+
}
|
|
730
|
+
height = txHeight
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
do {
|
|
734
|
+
let rewindHeight = try self.blockProcessor.rewindTo(height)
|
|
735
|
+
try self.transactionManager.handleReorg(at: rewindHeight)
|
|
736
|
+
} catch {
|
|
737
|
+
throw SynchronizerError.rewindError(underlyingError: error)
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
// MARK: notify state
|
|
742
|
+
private func notify(progress: CompactBlockProgress) {
|
|
743
|
+
var userInfo: [AnyHashable: Any] = .init()
|
|
744
|
+
userInfo[NotificationKeys.progress] = progress
|
|
745
|
+
userInfo[NotificationKeys.blockHeight] = progress.progressHeight
|
|
746
|
+
|
|
747
|
+
self.status = SyncStatus(progress)
|
|
748
|
+
NotificationCenter.default.post(name: Notification.Name.synchronizerProgressUpdated, object: self, userInfo: userInfo)
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
private func notifyStatusChange(newValue: SyncStatus, oldValue: SyncStatus) {
|
|
752
|
+
NotificationCenter.default.post(
|
|
753
|
+
name: .synchronizerStatusWillUpdate,
|
|
754
|
+
object: self,
|
|
755
|
+
userInfo:
|
|
756
|
+
[
|
|
757
|
+
NotificationKeys.currentStatus: oldValue,
|
|
758
|
+
NotificationKeys.nextStatus: newValue
|
|
759
|
+
]
|
|
760
|
+
)
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
private func notify(status: SyncStatus) {
|
|
764
|
+
switch status {
|
|
765
|
+
case .disconnected:
|
|
766
|
+
NotificationCenter.default.post(name: Notification.Name.synchronizerDisconnected, object: self)
|
|
767
|
+
case .stopped:
|
|
768
|
+
NotificationCenter.default.post(name: Notification.Name.synchronizerStopped, object: self)
|
|
769
|
+
case .synced:
|
|
770
|
+
NotificationCenter.default.post(
|
|
771
|
+
name: Notification.Name.synchronizerSynced,
|
|
772
|
+
object: self,
|
|
773
|
+
userInfo: [
|
|
774
|
+
SDKSynchronizer.NotificationKeys.blockHeight: self.latestScannedHeight
|
|
775
|
+
]
|
|
776
|
+
)
|
|
777
|
+
case .unprepared:
|
|
778
|
+
break
|
|
779
|
+
case .downloading:
|
|
780
|
+
NotificationCenter.default.post(name: Notification.Name.synchronizerDownloading, object: self)
|
|
781
|
+
case .validating:
|
|
782
|
+
NotificationCenter.default.post(name: Notification.Name.synchronizerValidating, object: self)
|
|
783
|
+
case .scanning:
|
|
784
|
+
NotificationCenter.default.post(name: Notification.Name.synchronizerScanning, object: self)
|
|
785
|
+
case .enhancing:
|
|
786
|
+
NotificationCenter.default.post(name: Notification.Name.synchronizerEnhancing, object: self)
|
|
787
|
+
case .fetching:
|
|
788
|
+
NotificationCenter.default.post(name: Notification.Name.synchronizerFetching, object: self)
|
|
789
|
+
case .error(let e):
|
|
790
|
+
self.notifyFailure(e)
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
// MARK: book keeping
|
|
794
|
+
|
|
795
|
+
private func updateMinedTransactions() throws {
|
|
796
|
+
try transactionManager.allPendingTransactions()?
|
|
797
|
+
.filter { $0.isSubmitSuccess && !$0.isMined }
|
|
798
|
+
.forEach { pendingTx in
|
|
799
|
+
guard let rawId = pendingTx.rawTransactionId else { return }
|
|
800
|
+
let transaction = try transactionRepository.findBy(rawId: rawId)
|
|
801
|
+
|
|
802
|
+
guard let minedHeight = transaction?.minedHeight else { return }
|
|
803
|
+
let minedTx = try transactionManager.applyMinedHeight(pendingTransaction: pendingTx, minedHeight: minedHeight)
|
|
804
|
+
|
|
805
|
+
notifyMinedTransaction(minedTx)
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
private func removeConfirmedTransactions() throws {
|
|
810
|
+
let latestHeight = try transactionRepository.lastScannedHeight()
|
|
811
|
+
|
|
812
|
+
try transactionManager.allPendingTransactions()?
|
|
813
|
+
.filter { $0.minedHeight > 0 && abs($0.minedHeight - latestHeight) >= ZcashSDK.defaultStaleTolerance }
|
|
814
|
+
.forEach { try transactionManager.delete(pendingTransaction: $0) }
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
private func refreshPendingTransactions() {
|
|
818
|
+
do {
|
|
819
|
+
try updateMinedTransactions()
|
|
820
|
+
try removeConfirmedTransactions()
|
|
821
|
+
} catch {
|
|
822
|
+
LoggerProxy.debug("error refreshing pending transactions: \(error)")
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
private func notifyMinedTransaction(_ transaction: PendingTransactionEntity) {
|
|
827
|
+
DispatchQueue.main.async { [weak self] in
|
|
828
|
+
guard let self = self else { return }
|
|
829
|
+
|
|
830
|
+
NotificationCenter.default.post(
|
|
831
|
+
name: Notification.Name.synchronizerMinedTransaction,
|
|
832
|
+
object: self,
|
|
833
|
+
userInfo: [NotificationKeys.minedTransaction: transaction]
|
|
834
|
+
)
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
// swiftlint:disable cyclomatic_complexity
|
|
839
|
+
private func mapError(_ error: Error) -> Error {
|
|
840
|
+
if let compactBlockProcessorError = error as? CompactBlockProcessorError {
|
|
841
|
+
switch compactBlockProcessorError {
|
|
842
|
+
case .dataDbInitFailed(let path):
|
|
843
|
+
return SynchronizerError.initFailed(message: "DataDb init failed at path: \(path)")
|
|
844
|
+
case .connectionError(let message):
|
|
845
|
+
return SynchronizerError.connectionFailed(message: message)
|
|
846
|
+
case .invalidConfiguration:
|
|
847
|
+
return SynchronizerError.generalError(message: "Invalid Configuration")
|
|
848
|
+
case .missingDbPath(let path):
|
|
849
|
+
return SynchronizerError.initFailed(message: "missing Db path: \(path)")
|
|
850
|
+
case .generalError(let message):
|
|
851
|
+
return SynchronizerError.generalError(message: message)
|
|
852
|
+
case .maxAttemptsReached(attempts: let attempts):
|
|
853
|
+
return SynchronizerError.maxRetryAttemptsReached(attempts: attempts)
|
|
854
|
+
case let .grpcError(statusCode, message):
|
|
855
|
+
return SynchronizerError.connectionError(status: statusCode, message: message)
|
|
856
|
+
case .connectionTimeout:
|
|
857
|
+
return SynchronizerError.networkTimeout
|
|
858
|
+
case .unspecifiedError(let underlyingError):
|
|
859
|
+
return SynchronizerError.uncategorized(underlyingError: underlyingError)
|
|
860
|
+
case .criticalError:
|
|
861
|
+
return SynchronizerError.criticalError
|
|
862
|
+
case .invalidAccount:
|
|
863
|
+
return SynchronizerError.invalidAccount
|
|
864
|
+
case .wrongConsensusBranchId:
|
|
865
|
+
return SynchronizerError.lightwalletdValidationFailed(underlyingError: compactBlockProcessorError)
|
|
866
|
+
case .networkMismatch:
|
|
867
|
+
return SynchronizerError.lightwalletdValidationFailed(underlyingError: compactBlockProcessorError)
|
|
868
|
+
case .saplingActivationMismatch:
|
|
869
|
+
return SynchronizerError.lightwalletdValidationFailed(underlyingError: compactBlockProcessorError)
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
return SynchronizerError.uncategorized(underlyingError: error)
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
private func notifyFailure(_ error: Error) {
|
|
877
|
+
DispatchQueue.main.async { [weak self] in
|
|
878
|
+
guard let self = self else { return }
|
|
879
|
+
NotificationCenter.default.post(
|
|
880
|
+
name: Notification.Name.synchronizerFailed,
|
|
881
|
+
object: self,
|
|
882
|
+
userInfo: [NotificationKeys.error: self.mapError(error)]
|
|
883
|
+
)
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
extension SDKSynchronizer {
|
|
889
|
+
public var pendingTransactions: [PendingTransactionEntity] {
|
|
890
|
+
(try? self.allPendingTransactions()) ?? [PendingTransactionEntity]()
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
public var clearedTransactions: [ConfirmedTransactionEntity] {
|
|
894
|
+
(try? self.allClearedTransactions()) ?? [ConfirmedTransactionEntity]()
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
public var sentTransactions: [ConfirmedTransactionEntity] {
|
|
898
|
+
(try? self.allSentTransactions()) ?? [ConfirmedTransactionEntity]()
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
public var receivedTransactions: [ConfirmedTransactionEntity] {
|
|
902
|
+
(try? self.allReceivedTransactions()) ?? [ConfirmedTransactionEntity]()
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
import GRPC
|
|
907
|
+
extension ConnectionState {
|
|
908
|
+
init(_ connectivityState: ConnectivityState) {
|
|
909
|
+
switch connectivityState {
|
|
910
|
+
case .connecting:
|
|
911
|
+
self = .connecting
|
|
912
|
+
case .idle:
|
|
913
|
+
self = .idle
|
|
914
|
+
case .ready:
|
|
915
|
+
self = .online
|
|
916
|
+
case .shutdown:
|
|
917
|
+
self = .shutdown
|
|
918
|
+
case .transientFailure:
|
|
919
|
+
self = .reconnecting
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
private struct NullEnhancementProgress: EnhancementProgress {
|
|
925
|
+
var totalTransactions: Int { 0 }
|
|
926
|
+
var enhancedTransactions: Int { 0 }
|
|
927
|
+
var lastFoundTransaction: ConfirmedTransactionEntity? { nil }
|
|
928
|
+
var range: CompactBlockRange { 0 ... 0 }
|
|
929
|
+
}
|