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,123 @@
|
|
|
1
|
+
//
|
|
2
|
+
// CompactBlockStorage.swift
|
|
3
|
+
// ZcashLightClientKit
|
|
4
|
+
//
|
|
5
|
+
// Created by Francisco Gindre on 10/13/19.
|
|
6
|
+
// Copyright © 2019 Electric Coin Company. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
import Foundation
|
|
10
|
+
import SQLite
|
|
11
|
+
|
|
12
|
+
protocol ConnectionProvider {
|
|
13
|
+
func connection() throws -> Connection
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
class CompactBlockStorage: CompactBlockDAO {
|
|
17
|
+
var dbProvider: ConnectionProvider
|
|
18
|
+
|
|
19
|
+
init(connectionProvider: ConnectionProvider) {
|
|
20
|
+
dbProvider = connectionProvider
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
private func compactBlocksTable() -> Table {
|
|
24
|
+
Table("compactblocks")
|
|
25
|
+
}
|
|
26
|
+
private func heightColumn() -> Expression<Int64> {
|
|
27
|
+
Expression<Int64>("height")
|
|
28
|
+
}
|
|
29
|
+
private func dataColumn() -> Expression<Blob> {
|
|
30
|
+
Expression<Blob>("data")
|
|
31
|
+
}
|
|
32
|
+
func createTable() throws {
|
|
33
|
+
do {
|
|
34
|
+
let compactBlocks = compactBlocksTable()
|
|
35
|
+
let height = heightColumn()
|
|
36
|
+
let data = dataColumn()
|
|
37
|
+
|
|
38
|
+
let db = try dbProvider.connection()
|
|
39
|
+
|
|
40
|
+
try db.run(compactBlocks.create(ifNotExists: true) { table in
|
|
41
|
+
table.column(height, primaryKey: true)
|
|
42
|
+
table.column(data)
|
|
43
|
+
}
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
try db.run(compactBlocks.createIndex(height, ifNotExists: true))
|
|
47
|
+
} catch {
|
|
48
|
+
throw StorageError.couldNotCreate
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
func insert(_ block: ZcashCompactBlock) throws {
|
|
53
|
+
try dbProvider.connection().run(compactBlocksTable().insert(block))
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
func insert(_ blocks: [ZcashCompactBlock]) throws {
|
|
57
|
+
let compactBlocks = compactBlocksTable()
|
|
58
|
+
let db = try dbProvider.connection()
|
|
59
|
+
try db.transaction(.immediate) {
|
|
60
|
+
for block in blocks {
|
|
61
|
+
try db.run(compactBlocks.insert(block))
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
func latestBlockHeight() throws -> BlockHeight {
|
|
67
|
+
guard let maxHeight = try dbProvider.connection().scalar(compactBlocksTable().select(heightColumn().max)) else {
|
|
68
|
+
return BlockHeight.empty()
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
guard let blockHeight = BlockHeight(exactly: maxHeight) else {
|
|
72
|
+
throw StorageError.operationFailed
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return blockHeight
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
func rewind(to height: BlockHeight) throws {
|
|
79
|
+
try dbProvider.connection().run(compactBlocksTable().filter(heightColumn() >= Int64(height)).delete())
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
extension CompactBlockStorage: CompactBlockRepository {
|
|
84
|
+
func latestHeight() throws -> BlockHeight {
|
|
85
|
+
try latestBlockHeight()
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
func latestHeight(result: @escaping (Swift.Result<BlockHeight, Error>) -> Void) {
|
|
89
|
+
DispatchQueue.global(qos: .userInitiated).async {
|
|
90
|
+
do {
|
|
91
|
+
result(.success(try self.latestBlockHeight()))
|
|
92
|
+
} catch {
|
|
93
|
+
result(.failure(error))
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
func write(blocks: [ZcashCompactBlock]) throws {
|
|
99
|
+
try insert(blocks)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
func write(blocks: [ZcashCompactBlock], completion: ((Error?) -> Void)?) {
|
|
103
|
+
DispatchQueue.global(qos: .userInitiated).async {
|
|
104
|
+
do {
|
|
105
|
+
try self.insert(blocks)
|
|
106
|
+
completion?(nil)
|
|
107
|
+
} catch {
|
|
108
|
+
completion?(error)
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
func rewind(to height: BlockHeight, completion: ((Error?) -> Void)?) {
|
|
114
|
+
DispatchQueue.global(qos: .userInitiated).async {
|
|
115
|
+
do {
|
|
116
|
+
try self.rewind(to: height)
|
|
117
|
+
completion?(nil)
|
|
118
|
+
} catch {
|
|
119
|
+
completion?(error)
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
//
|
|
2
|
+
// DatabaseMigrationManager.swift
|
|
3
|
+
// ZcashLightClientKit
|
|
4
|
+
//
|
|
5
|
+
// Created by Francisco Gindre on 3/31/21.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
import SQLite
|
|
10
|
+
|
|
11
|
+
class MigrationManager {
|
|
12
|
+
enum DataDbMigrations: Int32 {
|
|
13
|
+
case none = 0
|
|
14
|
+
case version1 = 1
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
enum CacheDbMigration: Int32 {
|
|
18
|
+
case none = 0
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
enum PendingDbMigration: Int32 {
|
|
22
|
+
case none = 0
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
static let latestDataDbMigrationVersion: Int32 = DataDbMigrations.version1.rawValue
|
|
26
|
+
static let latestCacheDbMigrationVersion: Int32 = CacheDbMigration.none.rawValue
|
|
27
|
+
static let latestPendingDbMigrationVersion: Int32 = PendingDbMigration.none.rawValue
|
|
28
|
+
|
|
29
|
+
var cacheDb: ConnectionProvider
|
|
30
|
+
var dataDb: ConnectionProvider
|
|
31
|
+
var pendingDb: ConnectionProvider
|
|
32
|
+
var network: NetworkType
|
|
33
|
+
|
|
34
|
+
init(
|
|
35
|
+
cacheDbConnection: ConnectionProvider,
|
|
36
|
+
dataDbConnection: ConnectionProvider,
|
|
37
|
+
pendingDbConnection: ConnectionProvider,
|
|
38
|
+
networkType: NetworkType
|
|
39
|
+
) {
|
|
40
|
+
self.cacheDb = cacheDbConnection
|
|
41
|
+
self.dataDb = dataDbConnection
|
|
42
|
+
self.pendingDb = pendingDbConnection
|
|
43
|
+
self.network = networkType
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
func performMigration(uvks: [UnifiedViewingKey]) throws {
|
|
47
|
+
try migrateDataDb(uvks: uvks)
|
|
48
|
+
try migrateCacheDb()
|
|
49
|
+
try migratePendingDb()
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
func performVersion1Migration(viewingKeys: [UnifiedViewingKey]) throws {
|
|
53
|
+
LoggerProxy.debug("Starting migration version 1 from viewing Keys")
|
|
54
|
+
let db = try self.dataDb.connection()
|
|
55
|
+
|
|
56
|
+
let placeholder = "deriveMe"
|
|
57
|
+
let migrationStatement =
|
|
58
|
+
"""
|
|
59
|
+
BEGIN TRANSACTION;
|
|
60
|
+
PRAGMA foreign_keys = OFF;
|
|
61
|
+
DROP TABLE utxos;
|
|
62
|
+
CREATE TABLE IF NOT EXISTS utxos(
|
|
63
|
+
id_utxo INTEGER PRIMARY KEY,
|
|
64
|
+
address TEXT NOT NULL,
|
|
65
|
+
prevout_txid BLOB NOT NULL,
|
|
66
|
+
prevout_idx INTEGER NOT NULL,
|
|
67
|
+
script BLOB NOT NULL,
|
|
68
|
+
value_zat INTEGER NOT NULL,
|
|
69
|
+
height INTEGER NOT NULL,
|
|
70
|
+
spent_in_tx INTEGER,
|
|
71
|
+
FOREIGN KEY (spent_in_tx) REFERENCES transactions(id_tx),
|
|
72
|
+
CONSTRAINT tx_outpoint UNIQUE (prevout_txid, prevout_idx)
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
CREATE TABLE IF NOT EXISTS accounts_new (
|
|
76
|
+
account INTEGER PRIMARY KEY,
|
|
77
|
+
extfvk TEXT NOT NULL,
|
|
78
|
+
address TEXT NOT NULL,
|
|
79
|
+
transparent_address TEXT NOT NULL
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
INSERT INTO accounts_new SELECT account, extfvk, address, '\(placeholder)' FROM accounts;
|
|
83
|
+
DROP TABLE accounts;
|
|
84
|
+
|
|
85
|
+
ALTER TABLE accounts_new RENAME TO accounts;
|
|
86
|
+
|
|
87
|
+
PRAGMA user_version = 1;
|
|
88
|
+
PRAGMA foreign_keys = ON;
|
|
89
|
+
COMMIT TRANSACTION;
|
|
90
|
+
"""
|
|
91
|
+
LoggerProxy.debug("db.execute(\"\(migrationStatement)\")")
|
|
92
|
+
try db.execute(migrationStatement)
|
|
93
|
+
|
|
94
|
+
LoggerProxy.debug("db.run() succeeded")
|
|
95
|
+
|
|
96
|
+
// derive transparent (shielding) addresses
|
|
97
|
+
let accountsDao = AccountSQDAO(dbProvider: self.dataDb)
|
|
98
|
+
|
|
99
|
+
let accounts = try accountsDao.getAll()
|
|
100
|
+
|
|
101
|
+
guard !accounts.isEmpty else {
|
|
102
|
+
LoggerProxy.debug("no existing accounts found while performing this migration")
|
|
103
|
+
return
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
guard accounts.count == viewingKeys.count else {
|
|
107
|
+
let message = """
|
|
108
|
+
Number of accounts found and viewing keys provided don't match.
|
|
109
|
+
Found \(accounts.count) account(s) and there were \(viewingKeys.count) Viewing key(s) provided.
|
|
110
|
+
"""
|
|
111
|
+
LoggerProxy.debug(message)
|
|
112
|
+
throw StorageError.migrationFailedWithMessage(message: message)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
let derivationTool = DerivationTool(networkType: self.network)
|
|
116
|
+
|
|
117
|
+
for tuple in zip(accounts, viewingKeys) {
|
|
118
|
+
let tAddr = try derivationTool.deriveTransparentAddressFromPublicKey(tuple.1.extpub)
|
|
119
|
+
var account = tuple.0
|
|
120
|
+
account.transparentAddress = tAddr
|
|
121
|
+
try accountsDao.update(account)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// sanity check
|
|
125
|
+
guard try accountsDao.getAll().first(where: { $0.transparentAddress == placeholder }) == nil else {
|
|
126
|
+
LoggerProxy.error("Accounts Migration performed but the transparent addresses were not derived")
|
|
127
|
+
throw StorageError.migrationFailed(underlyingError: KeyDerivationErrors.unableToDerive)
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
func performVersion1Migration(_ seedBytes: [UInt8]) throws {
|
|
132
|
+
LoggerProxy.debug("Starting migration version 1")
|
|
133
|
+
|
|
134
|
+
// derive transparent (shielding) addresses
|
|
135
|
+
let accountsDao = AccountSQDAO(dbProvider: self.dataDb)
|
|
136
|
+
|
|
137
|
+
let accounts = try accountsDao.getAll()
|
|
138
|
+
|
|
139
|
+
guard !accounts.isEmpty else {
|
|
140
|
+
LoggerProxy.debug("no existing accounts found while performing this migration")
|
|
141
|
+
return
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
let derivationTool = DerivationTool(networkType: self.network)
|
|
145
|
+
|
|
146
|
+
let uvks = try derivationTool.deriveUnifiedViewingKeysFromSeed(seedBytes, numberOfAccounts: accounts.count)
|
|
147
|
+
|
|
148
|
+
try performVersion1Migration(viewingKeys: uvks)
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
private extension MigrationManager {
|
|
153
|
+
func migratePendingDb() throws {
|
|
154
|
+
let currentPendingDbVersion = try pendingDb.connection().getUserVersion()
|
|
155
|
+
|
|
156
|
+
LoggerProxy.debug(
|
|
157
|
+
"Attempting to perform migration for pending Db - currentVersion: \(currentPendingDbVersion)." +
|
|
158
|
+
"Latest version is: \(Self.latestPendingDbMigrationVersion)"
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
if currentPendingDbVersion < Self.latestPendingDbMigrationVersion {
|
|
162
|
+
// perform no migration just adjust the version number
|
|
163
|
+
try self.cacheDb.connection().setUserVersion(PendingDbMigration.none.rawValue)
|
|
164
|
+
} else {
|
|
165
|
+
LoggerProxy.debug("PendingDb Db - no migration needed")
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
func migrateCacheDb() throws {
|
|
170
|
+
let currentCacheDbVersion = try cacheDb.connection().getUserVersion()
|
|
171
|
+
|
|
172
|
+
LoggerProxy.debug(
|
|
173
|
+
"Attempting to perform migration for cache Db - currentVersion: \(currentCacheDbVersion)." +
|
|
174
|
+
"Latest version is: \(Self.latestCacheDbMigrationVersion)"
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
if currentCacheDbVersion < Self.latestCacheDbMigrationVersion {
|
|
178
|
+
// perform no migration just adjust the version number
|
|
179
|
+
try self.cacheDb.connection().setUserVersion(CacheDbMigration.none.rawValue)
|
|
180
|
+
} else {
|
|
181
|
+
LoggerProxy.debug("Cache Db - no migration needed")
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
func migrateDataDb(uvks: [UnifiedViewingKey]) throws {
|
|
186
|
+
let currentDataDbVersion = try dataDb.connection().getUserVersion()
|
|
187
|
+
LoggerProxy.debug(
|
|
188
|
+
"Attempting to perform migration for data Db - currentVersion: \(currentDataDbVersion)." +
|
|
189
|
+
"Latest version is: \(Self.latestDataDbMigrationVersion)"
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
if currentDataDbVersion < Self.latestDataDbMigrationVersion {
|
|
193
|
+
for dbVersion in (currentDataDbVersion + 1) ... Self.latestDataDbMigrationVersion {
|
|
194
|
+
guard let version = DataDbMigrations.init(rawValue: dbVersion) else {
|
|
195
|
+
LoggerProxy.error("failed to determine migration version")
|
|
196
|
+
throw StorageError.invalidMigrationVersion(version: dbVersion)
|
|
197
|
+
}
|
|
198
|
+
switch version {
|
|
199
|
+
case .version1:
|
|
200
|
+
try performVersion1Migration(viewingKeys: uvks)
|
|
201
|
+
case .none:
|
|
202
|
+
break
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
} else {
|
|
206
|
+
LoggerProxy.debug("Data Db - no migration needed")
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
extension Connection {
|
|
212
|
+
func getUserVersion() throws -> Int32 {
|
|
213
|
+
guard let version = try scalar("PRAGMA user_version") as? Int64 else {
|
|
214
|
+
return 0
|
|
215
|
+
}
|
|
216
|
+
return Int32(version)
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
func setUserVersion(_ version: Int32) throws {
|
|
220
|
+
try run("PRAGMA user_version = \(version)")
|
|
221
|
+
}
|
|
222
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Storage.swift
|
|
3
|
+
// ZcashLightClientKit
|
|
4
|
+
//
|
|
5
|
+
// Created by Francisco Gindre on 10/13/19.
|
|
6
|
+
// Copyright © 2019 Electric Coin Company. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
import Foundation
|
|
10
|
+
|
|
11
|
+
enum StorageError: Error {
|
|
12
|
+
case couldNotCreate
|
|
13
|
+
case openFailed
|
|
14
|
+
case closeFailed
|
|
15
|
+
case operationFailed
|
|
16
|
+
case updateFailed
|
|
17
|
+
case malformedEntity(fields: [String]?)
|
|
18
|
+
case transactionFailed(underlyingError: Error)
|
|
19
|
+
case invalidMigrationVersion(version: Int32)
|
|
20
|
+
case migrationFailed(underlyingError: Error)
|
|
21
|
+
case migrationFailedWithMessage(message: String)
|
|
22
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
//
|
|
2
|
+
// SQLDatabase.swift
|
|
3
|
+
// ZcashLightClientKit
|
|
4
|
+
//
|
|
5
|
+
// Created by Francisco Gindre on 10/13/19.
|
|
6
|
+
// Copyright © 2019 Electric Coin Company. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
import Foundation
|
|
10
|
+
import SQLite
|
|
11
|
+
|
|
12
|
+
class StorageManager {
|
|
13
|
+
static var shared = StorageManager()
|
|
14
|
+
|
|
15
|
+
private var readOnly: [URL: Connection] = [:]
|
|
16
|
+
private var readWrite: [URL: Connection] = [:]
|
|
17
|
+
|
|
18
|
+
init() {}
|
|
19
|
+
|
|
20
|
+
func connection(at url: URL, readOnly: Bool = false) throws -> Connection {
|
|
21
|
+
readOnly ? try readOnlyConnection(at: url) : try readWriteConnection(at: url)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
private func readOnlyConnection(at url: URL) throws -> Connection {
|
|
25
|
+
if let readOnlyConnection = readOnly[url] {
|
|
26
|
+
return readOnlyConnection
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let readOnlyConnection = try Connection.customConection(at: url)
|
|
30
|
+
readOnly[url] = readOnlyConnection
|
|
31
|
+
|
|
32
|
+
return readOnlyConnection
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
private func readWriteConnection(at url: URL) throws -> Connection {
|
|
36
|
+
if let readWriteConnection = readWrite[url] {
|
|
37
|
+
return readWriteConnection
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
let readWriteConnection = try Connection.customConection(at: url)
|
|
41
|
+
readWrite[url] = readWriteConnection
|
|
42
|
+
|
|
43
|
+
return readWriteConnection
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private extension Connection {
|
|
48
|
+
static func customConection(at url: URL, readonly: Bool = false) throws -> Connection {
|
|
49
|
+
let conn = try Connection(url.absoluteString, readonly: readonly)
|
|
50
|
+
try conn.run("PRAGMA journal_mode = TRUNCATE;")
|
|
51
|
+
return conn
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
class SimpleConnectionProvider: ConnectionProvider {
|
|
56
|
+
var path: String
|
|
57
|
+
var readonly: Bool
|
|
58
|
+
var db: Connection?
|
|
59
|
+
|
|
60
|
+
init(path: String, readonly: Bool = false) {
|
|
61
|
+
self.path = path
|
|
62
|
+
self.readonly = readonly
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
func connection() throws -> Connection {
|
|
66
|
+
guard let conn = db else {
|
|
67
|
+
let conn = try Connection(path, readonly: readonly)
|
|
68
|
+
self.db = conn
|
|
69
|
+
return conn
|
|
70
|
+
}
|
|
71
|
+
return conn
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
//
|
|
2
|
+
// BlockDownloader.swift
|
|
3
|
+
// ZcashLightClientKit
|
|
4
|
+
//
|
|
5
|
+
// Created by Francisco Gindre on 17/09/2019.
|
|
6
|
+
// Copyright © 2019 Electric Coin Company. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
import Foundation
|
|
10
|
+
|
|
11
|
+
enum CompactBlockDownloadError: Error {
|
|
12
|
+
case timeout
|
|
13
|
+
case generalError(error: Error)
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
Represents what a compact block downloaded should provide to its clients
|
|
17
|
+
*/
|
|
18
|
+
public protocol CompactBlockDownloading {
|
|
19
|
+
/**
|
|
20
|
+
Downloads and stores the given block range.
|
|
21
|
+
Non-Blocking
|
|
22
|
+
*/
|
|
23
|
+
func downloadBlockRange(
|
|
24
|
+
_ heightRange: CompactBlockRange,
|
|
25
|
+
completion: @escaping (Error?) -> Void
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
Remove newer blocks and go back to the given height
|
|
30
|
+
- Parameters:
|
|
31
|
+
- height: the given height to rewind to
|
|
32
|
+
- completion: block to be executed after completing rewind
|
|
33
|
+
*/
|
|
34
|
+
func rewind(to height: BlockHeight, completion: @escaping (Error?) -> Void)
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
returns the height of the latest compact block stored locally
|
|
38
|
+
BlockHeight.empty() if no blocks are stored yet
|
|
39
|
+
non-blocking
|
|
40
|
+
*/
|
|
41
|
+
func lastDownloadedBlockHeight(result: @escaping (Result<BlockHeight, Error>) -> Void)
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
Returns the last height on the blockchain
|
|
45
|
+
Non-blocking
|
|
46
|
+
*/
|
|
47
|
+
func latestBlockHeight(result: @escaping (Result<BlockHeight, Error>) -> Void)
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
Downloads and stores the given block range.
|
|
51
|
+
Blocking
|
|
52
|
+
*/
|
|
53
|
+
func downloadBlockRange(_ range: CompactBlockRange) throws
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
Restore the download progress up to the given height.
|
|
57
|
+
*/
|
|
58
|
+
func rewind(to height: BlockHeight) throws
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
Returns the height of the latest compact block stored locally.
|
|
62
|
+
BlockHeight.empty() if no blocks are stored yet
|
|
63
|
+
Blocking
|
|
64
|
+
*/
|
|
65
|
+
func lastDownloadedBlockHeight() throws -> BlockHeight
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
Returns the latest block height
|
|
69
|
+
Blocking
|
|
70
|
+
*/
|
|
71
|
+
func latestBlockHeight() throws -> BlockHeight
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
Gets the transaction for the Id given
|
|
75
|
+
- Parameter txId: Data representing the transaction Id
|
|
76
|
+
- Returns: a transaction entity with the requested transaction
|
|
77
|
+
- Throws: An error if the fetch failed
|
|
78
|
+
*/
|
|
79
|
+
func fetchTransaction(txId: Data) throws -> TransactionEntity
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
Gets the transaction for the Id given
|
|
83
|
+
- Parameter txId: Data representing the transaction Id
|
|
84
|
+
- Parameter result: a handler for the result of the operation
|
|
85
|
+
*/
|
|
86
|
+
func fetchTransaction(txId: Data, result: @escaping (Result<TransactionEntity, Error>) -> Void)
|
|
87
|
+
|
|
88
|
+
func fetchUnspentTransactionOutputs(tAddress: String, startHeight: BlockHeight) throws -> [UnspentTransactionOutputEntity]
|
|
89
|
+
|
|
90
|
+
func fetchUnspentTransactionOutputs(tAddress: String, startHeight: BlockHeight, result: @escaping (Result<[UnspentTransactionOutputEntity], Error>) -> Void)
|
|
91
|
+
|
|
92
|
+
func fetchUnspentTransactionOutputs(tAddresses: [String], startHeight: BlockHeight) throws -> [UnspentTransactionOutputEntity]
|
|
93
|
+
|
|
94
|
+
func fetchUnspentTransactionOutputs(tAddresses: [String], startHeight: BlockHeight, result: @escaping (Result<[UnspentTransactionOutputEntity], Error>) -> Void)
|
|
95
|
+
|
|
96
|
+
func closeConnection()
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
Serves as a source of compact blocks received from the light wallet server. Once started, it will use the given
|
|
101
|
+
lightwallet service to request all the appropriate blocks and compact block store to persist them. By delegating to
|
|
102
|
+
these dependencies, the downloader remains agnostic to the particular implementation of how to retrieve and store
|
|
103
|
+
data; although, by default the SDK uses gRPC and SQL.
|
|
104
|
+
- Property lightwalletService: the service used for requesting compact blocks
|
|
105
|
+
- Property storage: responsible for persisting the compact blocks that are received
|
|
106
|
+
*/
|
|
107
|
+
class CompactBlockDownloader {
|
|
108
|
+
var lightwalletService: LightWalletService
|
|
109
|
+
private(set) var storage: CompactBlockRepository
|
|
110
|
+
|
|
111
|
+
init(service: LightWalletService, storage: CompactBlockRepository) {
|
|
112
|
+
self.lightwalletService = service
|
|
113
|
+
self.storage = storage
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
extension CompactBlockDownloader: CompactBlockDownloading {
|
|
118
|
+
func closeConnection() {
|
|
119
|
+
lightwalletService.closeConnection()
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
func fetchUnspentTransactionOutputs(tAddresses: [String], startHeight: BlockHeight) throws -> [UnspentTransactionOutputEntity] {
|
|
123
|
+
try lightwalletService.fetchUTXOs(for: tAddresses, height: startHeight)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
func fetchUnspentTransactionOutputs(
|
|
127
|
+
tAddresses: [String],
|
|
128
|
+
startHeight: BlockHeight,
|
|
129
|
+
result: @escaping (Result<[UnspentTransactionOutputEntity], Error>) -> Void
|
|
130
|
+
) {
|
|
131
|
+
lightwalletService.fetchUTXOs(for: tAddresses, height: startHeight) { fetchResult in
|
|
132
|
+
switch fetchResult {
|
|
133
|
+
case .success(let utxos):
|
|
134
|
+
result(.success(utxos))
|
|
135
|
+
case .failure(let error):
|
|
136
|
+
result(.failure(error))
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
func fetchUnspentTransactionOutputs(tAddress: String, startHeight: BlockHeight) throws -> [UnspentTransactionOutputEntity] {
|
|
142
|
+
try lightwalletService.fetchUTXOs(for: tAddress, height: startHeight)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
func fetchUnspentTransactionOutputs(tAddress: String, startHeight: BlockHeight, result: @escaping (Result<[UnspentTransactionOutputEntity], Error>) -> Void) {
|
|
146
|
+
lightwalletService.fetchUTXOs(for: tAddress, height: startHeight) { fetchResult in
|
|
147
|
+
switch fetchResult {
|
|
148
|
+
case .success(let utxos):
|
|
149
|
+
result(.success(utxos))
|
|
150
|
+
case .failure(let error):
|
|
151
|
+
result(.failure(error))
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
func latestBlockHeight(result: @escaping (Result<BlockHeight, Error>) -> Void) {
|
|
157
|
+
lightwalletService.latestBlockHeight { fetchResult in
|
|
158
|
+
switch fetchResult {
|
|
159
|
+
case .failure(let error):
|
|
160
|
+
result(.failure(error))
|
|
161
|
+
case .success(let height):
|
|
162
|
+
result(.success(height))
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
func latestBlockHeight() throws -> BlockHeight {
|
|
168
|
+
try lightwalletService.latestBlockHeight()
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
Downloads and stores the given block range.
|
|
173
|
+
Non-Blocking
|
|
174
|
+
*/
|
|
175
|
+
func downloadBlockRange(
|
|
176
|
+
_ heightRange: CompactBlockRange,
|
|
177
|
+
completion: @escaping (Error?) -> Void
|
|
178
|
+
) {
|
|
179
|
+
lightwalletService.blockRange(heightRange) { [weak self] result in
|
|
180
|
+
guard let self = self else {
|
|
181
|
+
return
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
switch result {
|
|
185
|
+
case .failure(let error):
|
|
186
|
+
completion(error)
|
|
187
|
+
case .success(let compactBlocks):
|
|
188
|
+
self.storage.write(blocks: compactBlocks) { storeError in
|
|
189
|
+
completion(storeError)
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
func downloadBlockRange(_ range: CompactBlockRange) throws {
|
|
196
|
+
let blocks = try lightwalletService.blockRange(range)
|
|
197
|
+
try storage.write(blocks: blocks)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
func rewind(to height: BlockHeight, completion: @escaping (Error?) -> Void) {
|
|
201
|
+
storage.rewind(to: height) { e in
|
|
202
|
+
completion(e)
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
func lastDownloadedBlockHeight(result: @escaping (Result<BlockHeight, Error>) -> Void) {
|
|
207
|
+
storage.latestHeight { heightResult in
|
|
208
|
+
switch heightResult {
|
|
209
|
+
case .failure(let e):
|
|
210
|
+
result(.failure(CompactBlockDownloadError.generalError(error: e)))
|
|
211
|
+
return
|
|
212
|
+
case .success(let height):
|
|
213
|
+
result(.success(height))
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
func rewind(to height: BlockHeight) throws {
|
|
219
|
+
try self.storage.rewind(to: height)
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
func lastDownloadedBlockHeight() throws -> BlockHeight {
|
|
223
|
+
try self.storage.latestHeight()
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
func fetchTransaction(txId: Data) throws -> TransactionEntity {
|
|
227
|
+
try lightwalletService.fetchTransaction(txId: txId)
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
func fetchTransaction(txId: Data, result: @escaping (Result<TransactionEntity, Error>) -> Void) {
|
|
231
|
+
lightwalletService.fetchTransaction(txId: txId) { txResult in
|
|
232
|
+
switch txResult {
|
|
233
|
+
case .failure(let error):
|
|
234
|
+
result(.failure(error))
|
|
235
|
+
case .success(let transaction):
|
|
236
|
+
result(.success(transaction))
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|