react-native-zcash 0.3.4 → 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 +5 -0
- package/LICENSE +22 -0
- package/README.md +44 -44
- package/android/build.gradle +1 -1
- 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/updateSources.d.ts +1 -0
- package/package.json +20 -37
- 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/scripts/copyCheckpoints.js +0 -12
- package/src/browser.ts +0 -36
- package/src/index.flow.js +0 -168
- package/src/index.ts +0 -1
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
//
|
|
2
|
+
// DerivationTool.swift
|
|
3
|
+
// Pods
|
|
4
|
+
//
|
|
5
|
+
// Created by Francisco Gindre on 10/8/20.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
public protocol KeyValidation {
|
|
11
|
+
func isValidExtendedViewingKey(_ extvk: String) throws -> Bool
|
|
12
|
+
|
|
13
|
+
func isValidTransparentAddress(_ tAddress: String) throws -> Bool
|
|
14
|
+
|
|
15
|
+
func isValidShieldedAddress(_ zAddress: String) throws -> Bool
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public protocol KeyDeriving {
|
|
19
|
+
/**
|
|
20
|
+
Given a seed and a number of accounts, return the associated viewing keys.
|
|
21
|
+
|
|
22
|
+
- Parameter seed: the seed from which to derive viewing keys.
|
|
23
|
+
- Parameter numberOfAccounts: the number of accounts to use. Multiple accounts are not fully
|
|
24
|
+
supported so the default value of 1 is recommended.
|
|
25
|
+
|
|
26
|
+
- Returns: the viewing keys that correspond to the seed, formatted as Strings.
|
|
27
|
+
*/
|
|
28
|
+
func deriveViewingKeys(seed: [UInt8], numberOfAccounts: Int) throws -> [String]
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
Given a spending key, return the associated viewing key.
|
|
32
|
+
|
|
33
|
+
- Parameter spendingKey: the key from which to derive the viewing key.
|
|
34
|
+
|
|
35
|
+
- Returns: the viewing key that corresponds to the spending key.
|
|
36
|
+
*/
|
|
37
|
+
func deriveViewingKey(spendingKey: String) throws -> String
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
Given a seed and a number of accounts, return the associated spending keys.
|
|
41
|
+
|
|
42
|
+
- Parameter seed: the seed from which to derive spending keys.
|
|
43
|
+
- Parameter numberOfAccounts: the number of accounts to use. Multiple accounts are not fully
|
|
44
|
+
supported so the default value of 1 is recommended.
|
|
45
|
+
|
|
46
|
+
- Returns: the spending keys that correspond to the seed, formatted as Strings.
|
|
47
|
+
*/
|
|
48
|
+
func deriveSpendingKeys(seed: [UInt8], numberOfAccounts: Int) throws -> [String]
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
Given a seed and account index, return the associated address.
|
|
52
|
+
|
|
53
|
+
- Parameter seed: the seed from which to derive the address.
|
|
54
|
+
- Parameter accountIndex: the index of the account to use for deriving the address. Multiple
|
|
55
|
+
accounts are not fully supported so the default value of 1 is recommended.
|
|
56
|
+
|
|
57
|
+
- Returns: the address that corresponds to the seed and account index.
|
|
58
|
+
*/
|
|
59
|
+
func deriveShieldedAddress(seed: [UInt8], accountIndex: Int) throws -> String
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
Given a viewing key string, return the associated address.
|
|
63
|
+
|
|
64
|
+
- Parameter viewingKey: the viewing key to use for deriving the address. The viewing key is tied to
|
|
65
|
+
a specific account so no account index is required.
|
|
66
|
+
|
|
67
|
+
- Returns: the address that corresponds to the viewing key.
|
|
68
|
+
*/
|
|
69
|
+
func deriveShieldedAddress(viewingKey: String) throws -> String
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
Derives a transparent address from seedbytes, specifying account and index
|
|
73
|
+
*/
|
|
74
|
+
func deriveTransparentAddress(seed: [UInt8], account: Int, index: Int) throws -> String
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
Derives a SecretKey to spend transparent funds from a transparent secret key wif encoded
|
|
78
|
+
*/
|
|
79
|
+
func deriveTransparentPrivateKey(seed: [UInt8], account: Int, index: Int) throws -> String
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
Derives a transparent address from the given transparent Secret Key
|
|
83
|
+
*/
|
|
84
|
+
func deriveTransparentAddressFromPrivateKey(_ tsk: String) throws -> String
|
|
85
|
+
|
|
86
|
+
func deriveTransparentAddressFromPublicKey(_ pubkey: String) throws -> String
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
derives unified viewing keys from seedbytes, specifying a number of accounts
|
|
90
|
+
- Returns an array of unified viewing key tuples.
|
|
91
|
+
*/
|
|
92
|
+
func deriveUnifiedViewingKeysFromSeed(_ seed: [UInt8], numberOfAccounts: Int) throws -> [UnifiedViewingKey]
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
derives a Unified Address from a Unified Viewing Key
|
|
96
|
+
*/
|
|
97
|
+
func deriveUnifiedAddressFromUnifiedViewingKey(_ uvk: UnifiedViewingKey) throws -> UnifiedAddress
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
public enum KeyDerivationErrors: Error {
|
|
101
|
+
case derivationError(underlyingError: Error)
|
|
102
|
+
case unableToDerive
|
|
103
|
+
case invalidInput
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
public class DerivationTool: KeyDeriving {
|
|
107
|
+
var rustwelding: ZcashRustBackendWelding.Type = ZcashRustBackend.self
|
|
108
|
+
|
|
109
|
+
var networkType: NetworkType
|
|
110
|
+
|
|
111
|
+
public init(networkType: NetworkType) {
|
|
112
|
+
self.networkType = networkType
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
Given a seed and a number of accounts, return the associated viewing keys.
|
|
117
|
+
|
|
118
|
+
- Parameter seed: the seed from which to derive viewing keys.
|
|
119
|
+
- Parameter numberOfAccounts: the number of accounts to use. Multiple accounts are not fully
|
|
120
|
+
supported so the default value of 1 is recommended.
|
|
121
|
+
|
|
122
|
+
- Returns: the viewing keys that correspond to the seed, formatted as Strings.
|
|
123
|
+
*/
|
|
124
|
+
public func deriveViewingKeys(seed: [UInt8], numberOfAccounts: Int) throws -> [String] {
|
|
125
|
+
guard numberOfAccounts > 0, let numberOfAccounts = Int32(exactly: numberOfAccounts) else {
|
|
126
|
+
throw KeyDerivationErrors.invalidInput
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
do {
|
|
130
|
+
guard let keys = try rustwelding.deriveExtendedFullViewingKeys(seed: seed, accounts: numberOfAccounts, networkType: networkType) else {
|
|
131
|
+
throw KeyDerivationErrors.unableToDerive
|
|
132
|
+
}
|
|
133
|
+
return keys
|
|
134
|
+
} catch {
|
|
135
|
+
throw KeyDerivationErrors.derivationError(underlyingError: error)
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
Given a spending key, return the associated viewing key.
|
|
141
|
+
|
|
142
|
+
- Parameter spendingKey: the key from which to derive the viewing key.
|
|
143
|
+
|
|
144
|
+
- Returns: the viewing key that corresponds to the spending key.
|
|
145
|
+
*/
|
|
146
|
+
public func deriveViewingKey(spendingKey: String) throws -> String {
|
|
147
|
+
do {
|
|
148
|
+
guard let key = try rustwelding.deriveExtendedFullViewingKey(spendingKey, networkType: networkType) else {
|
|
149
|
+
throw KeyDerivationErrors.unableToDerive
|
|
150
|
+
}
|
|
151
|
+
return key
|
|
152
|
+
} catch {
|
|
153
|
+
throw KeyDerivationErrors.derivationError(underlyingError: error)
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
Given a seed and a number of accounts, return the associated spending keys.
|
|
159
|
+
|
|
160
|
+
- Parameter seed: the seed from which to derive spending keys.
|
|
161
|
+
- Parameter numberOfAccounts: the number of accounts to use. Multiple accounts are not fully
|
|
162
|
+
supported so the default value of 1 is recommended.
|
|
163
|
+
|
|
164
|
+
- Returns: the spending keys that correspond to the seed, formatted as Strings.
|
|
165
|
+
*/
|
|
166
|
+
public func deriveSpendingKeys(seed: [UInt8], numberOfAccounts: Int) throws -> [String] {
|
|
167
|
+
guard numberOfAccounts > 0, let numberOfAccounts = Int32(exactly: numberOfAccounts) else {
|
|
168
|
+
throw KeyDerivationErrors.invalidInput
|
|
169
|
+
}
|
|
170
|
+
do {
|
|
171
|
+
guard let keys = try rustwelding.deriveExtendedSpendingKeys(seed: seed, accounts: numberOfAccounts, networkType: networkType) else {
|
|
172
|
+
throw KeyDerivationErrors.unableToDerive
|
|
173
|
+
}
|
|
174
|
+
return keys
|
|
175
|
+
} catch {
|
|
176
|
+
throw KeyDerivationErrors.derivationError(underlyingError: error)
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
Given a seed and account index, return the associated address.
|
|
182
|
+
|
|
183
|
+
- Parameter seed: the seed from which to derive the address.
|
|
184
|
+
- Parameter accountIndex: the index of the account to use for deriving the address. Multiple
|
|
185
|
+
accounts are not fully supported so the default value of 1 is recommended.
|
|
186
|
+
|
|
187
|
+
- Returns: the address that corresponds to the seed and account index.
|
|
188
|
+
*/
|
|
189
|
+
public func deriveShieldedAddress(seed: [UInt8], accountIndex: Int) throws -> String {
|
|
190
|
+
guard accountIndex >= 0, let accountIndex = Int32(exactly: accountIndex) else {
|
|
191
|
+
throw KeyDerivationErrors.invalidInput
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
do {
|
|
195
|
+
guard let address = try rustwelding.deriveShieldedAddressFromSeed(seed: seed, accountIndex: accountIndex, networkType: networkType) else {
|
|
196
|
+
throw KeyDerivationErrors.unableToDerive
|
|
197
|
+
}
|
|
198
|
+
return address
|
|
199
|
+
} catch {
|
|
200
|
+
throw KeyDerivationErrors.derivationError(underlyingError: error)
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
Given a viewing key string, return the associated address.
|
|
206
|
+
|
|
207
|
+
- Parameter viewingKey: the viewing key to use for deriving the address. The viewing key is tied to
|
|
208
|
+
a specific account so no account index is required.
|
|
209
|
+
|
|
210
|
+
- Returns: the address that corresponds to the viewing key.
|
|
211
|
+
*/
|
|
212
|
+
public func deriveShieldedAddress(viewingKey: String) throws -> String {
|
|
213
|
+
do {
|
|
214
|
+
guard let zaddr = try rustwelding.deriveShieldedAddressFromViewingKey(viewingKey, networkType: networkType) else {
|
|
215
|
+
throw KeyDerivationErrors.unableToDerive
|
|
216
|
+
}
|
|
217
|
+
return zaddr
|
|
218
|
+
} catch {
|
|
219
|
+
throw KeyDerivationErrors.derivationError(underlyingError: error)
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
public func deriveTransparentAddress(seed: [UInt8], account: Int = 0, index: Int = 0) throws -> String {
|
|
224
|
+
do {
|
|
225
|
+
guard let zaddr = try rustwelding.deriveTransparentAddressFromSeed(
|
|
226
|
+
seed: seed,
|
|
227
|
+
account: account,
|
|
228
|
+
index: index,
|
|
229
|
+
networkType: networkType
|
|
230
|
+
) else {
|
|
231
|
+
throw KeyDerivationErrors.unableToDerive
|
|
232
|
+
}
|
|
233
|
+
return zaddr
|
|
234
|
+
} catch {
|
|
235
|
+
throw KeyDerivationErrors.derivationError(underlyingError: error)
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
public func deriveUnifiedViewingKeysFromSeed(_ seed: [UInt8], numberOfAccounts: Int) throws -> [UnifiedViewingKey] {
|
|
240
|
+
guard numberOfAccounts > 0 else {
|
|
241
|
+
throw KeyDerivationErrors.invalidInput
|
|
242
|
+
}
|
|
243
|
+
do {
|
|
244
|
+
return try rustwelding.deriveUnifiedViewingKeyFromSeed(seed, numberOfAccounts: numberOfAccounts, networkType: networkType)
|
|
245
|
+
} catch {
|
|
246
|
+
throw KeyDerivationErrors.derivationError(underlyingError: error)
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
derives a Unified Address from a Unified Viewing Key
|
|
252
|
+
*/
|
|
253
|
+
public func deriveUnifiedAddressFromUnifiedViewingKey(_ uvk: UnifiedViewingKey) throws -> UnifiedAddress {
|
|
254
|
+
do {
|
|
255
|
+
let tAddress = try deriveTransparentAddressFromPublicKey(uvk.extpub)
|
|
256
|
+
let zAddress = try deriveShieldedAddress(viewingKey: uvk.extfvk)
|
|
257
|
+
return ConcreteUnifiedAddress(tAddress: tAddress, zAddress: zAddress)
|
|
258
|
+
} catch {
|
|
259
|
+
throw KeyDerivationErrors.unableToDerive
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
public func deriveTransparentAddressFromPublicKey(_ pubkey: String) throws -> String {
|
|
264
|
+
guard !pubkey.isEmpty else {
|
|
265
|
+
throw KeyDerivationErrors.invalidInput
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
do {
|
|
269
|
+
return try rustwelding.derivedTransparentAddressFromPublicKey(pubkey, networkType: networkType)
|
|
270
|
+
} catch {
|
|
271
|
+
throw KeyDerivationErrors.derivationError(underlyingError: error)
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
Derives the transparent funds private key from the given seed
|
|
277
|
+
- Throws:
|
|
278
|
+
- KeyDerivationErrors.derivationError with the underlying error when it fails
|
|
279
|
+
- KeyDerivationErrors.unableToDerive when there's an unknown error
|
|
280
|
+
*/
|
|
281
|
+
public func deriveTransparentPrivateKey(seed: [UInt8], account: Int = 0, index: Int = 0) throws -> String {
|
|
282
|
+
do {
|
|
283
|
+
guard let seedKey = try rustwelding.deriveTransparentPrivateKeyFromSeed(
|
|
284
|
+
seed: seed,
|
|
285
|
+
account: account,
|
|
286
|
+
index: index,
|
|
287
|
+
networkType: networkType
|
|
288
|
+
) else {
|
|
289
|
+
throw KeyDerivationErrors.unableToDerive
|
|
290
|
+
}
|
|
291
|
+
return seedKey
|
|
292
|
+
} catch {
|
|
293
|
+
throw KeyDerivationErrors.derivationError(underlyingError: error)
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
extension DerivationTool: KeyValidation {
|
|
299
|
+
public func isValidExtendedViewingKey(_ extvk: String) throws -> Bool {
|
|
300
|
+
do {
|
|
301
|
+
return try rustwelding.isValidExtendedFullViewingKey(extvk, networkType: networkType)
|
|
302
|
+
} catch {
|
|
303
|
+
throw KeyDerivationErrors.derivationError(underlyingError: error)
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
public func isValidTransparentAddress(_ tAddress: String) throws -> Bool {
|
|
308
|
+
do {
|
|
309
|
+
return try rustwelding.isValidTransparentAddress(tAddress, networkType: networkType)
|
|
310
|
+
} catch {
|
|
311
|
+
throw KeyDerivationErrors.derivationError(underlyingError: error)
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
public func isValidShieldedAddress(_ zAddress: String) throws -> Bool {
|
|
316
|
+
do {
|
|
317
|
+
return try rustwelding.isValidShieldedAddress(zAddress, networkType: networkType)
|
|
318
|
+
} catch {
|
|
319
|
+
throw KeyDerivationErrors.derivationError(underlyingError: error)
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
Derives the transparent address from a WIF Private Key
|
|
325
|
+
- Throws:
|
|
326
|
+
- KeyDerivationErrors.derivationError with the underlying error when it fails
|
|
327
|
+
- KeyDerivationErrors.unableToDerive when there's an unknown error
|
|
328
|
+
*/
|
|
329
|
+
public func deriveTransparentAddressFromPrivateKey(_ tsk: String) throws -> String {
|
|
330
|
+
do {
|
|
331
|
+
guard let tAddr = try rustwelding.deriveTransparentAddressFromSecretKey(tsk, networkType: networkType) else {
|
|
332
|
+
throw KeyDerivationErrors.unableToDerive
|
|
333
|
+
}
|
|
334
|
+
return tAddr
|
|
335
|
+
} catch {
|
|
336
|
+
throw KeyDerivationErrors.derivationError(underlyingError: error)
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
private struct ConcreteUnifiedAddress: UnifiedAddress {
|
|
342
|
+
var tAddress: TransparentAddress
|
|
343
|
+
var zAddress: SaplingShieldedAddress
|
|
344
|
+
}
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
//
|
|
2
|
+
// PendingTransactionsManager.swift
|
|
3
|
+
// ZcashLightClientKit
|
|
4
|
+
//
|
|
5
|
+
// Created by Francisco Gindre on 11/26/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
enum TransactionManagerError: Error {
|
|
11
|
+
case couldNotCreateSpend(toAddress: String, account: Int, zatoshi: Int)
|
|
12
|
+
case encodingFailed(PendingTransactionEntity)
|
|
13
|
+
case updateFailed(PendingTransactionEntity)
|
|
14
|
+
case notPending(PendingTransactionEntity)
|
|
15
|
+
case cancelled(PendingTransactionEntity)
|
|
16
|
+
case internalInconsistency(PendingTransactionEntity)
|
|
17
|
+
case submitFailed(PendingTransactionEntity, errorCode: Int)
|
|
18
|
+
case shieldingEncodingFailed(PendingTransactionEntity, reason: String)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
class PersistentTransactionManager: OutboundTransactionManager {
|
|
22
|
+
var repository: PendingTransactionRepository
|
|
23
|
+
var encoder: TransactionEncoder
|
|
24
|
+
var service: LightWalletService
|
|
25
|
+
var queue: DispatchQueue
|
|
26
|
+
var network: NetworkType
|
|
27
|
+
|
|
28
|
+
init(
|
|
29
|
+
encoder: TransactionEncoder,
|
|
30
|
+
service: LightWalletService,
|
|
31
|
+
repository: PendingTransactionRepository,
|
|
32
|
+
networkType: NetworkType
|
|
33
|
+
) {
|
|
34
|
+
self.repository = repository
|
|
35
|
+
self.encoder = encoder
|
|
36
|
+
self.service = service
|
|
37
|
+
self.network = networkType
|
|
38
|
+
self.queue = DispatchQueue.init(label: "PersistentTransactionManager.serial.queue", qos: .userInitiated)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
func initSpend(
|
|
42
|
+
zatoshi: Int,
|
|
43
|
+
toAddress: String,
|
|
44
|
+
memo: String?,
|
|
45
|
+
from accountIndex: Int
|
|
46
|
+
) throws -> PendingTransactionEntity {
|
|
47
|
+
guard let insertedTx = try repository.find(
|
|
48
|
+
by: try repository.create(
|
|
49
|
+
PendingTransaction(
|
|
50
|
+
value: zatoshi,
|
|
51
|
+
toAddress: toAddress,
|
|
52
|
+
memo: memo,
|
|
53
|
+
account: accountIndex
|
|
54
|
+
)
|
|
55
|
+
)
|
|
56
|
+
) else {
|
|
57
|
+
throw TransactionManagerError.couldNotCreateSpend(
|
|
58
|
+
toAddress: toAddress,
|
|
59
|
+
account: accountIndex,
|
|
60
|
+
zatoshi: zatoshi
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
LoggerProxy.debug("pending transaction \(String(describing: insertedTx.id)) created")
|
|
64
|
+
return insertedTx
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
func encodeShieldingTransaction(
|
|
68
|
+
spendingKey: String,
|
|
69
|
+
tsk: String,
|
|
70
|
+
pendingTransaction: PendingTransactionEntity,
|
|
71
|
+
result: @escaping (Result<PendingTransactionEntity, Error>) -> Void
|
|
72
|
+
) {
|
|
73
|
+
queue.async { [weak self] in
|
|
74
|
+
guard let self = self else { return }
|
|
75
|
+
|
|
76
|
+
let derivationTool = DerivationTool(networkType: self.network)
|
|
77
|
+
|
|
78
|
+
guard
|
|
79
|
+
let viewingKey = try? derivationTool.deriveViewingKey(spendingKey: spendingKey),
|
|
80
|
+
let zAddr = try? derivationTool.deriveShieldedAddress(viewingKey: viewingKey)
|
|
81
|
+
else {
|
|
82
|
+
result(
|
|
83
|
+
.failure(
|
|
84
|
+
TransactionManagerError.shieldingEncodingFailed(
|
|
85
|
+
pendingTransaction,
|
|
86
|
+
reason: "There was an error Deriving your keys"
|
|
87
|
+
)
|
|
88
|
+
)
|
|
89
|
+
)
|
|
90
|
+
return
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
guard pendingTransaction.toAddress == zAddr else {
|
|
94
|
+
result(
|
|
95
|
+
.failure(
|
|
96
|
+
TransactionManagerError.shieldingEncodingFailed(
|
|
97
|
+
pendingTransaction,
|
|
98
|
+
reason: """
|
|
99
|
+
the recipient address does not match your
|
|
100
|
+
derived shielded address. Shielding transactions
|
|
101
|
+
addresses must match the ones derived from your keys.
|
|
102
|
+
This is a serious error. We are not letting you encode
|
|
103
|
+
this shielding transaction because it can lead to loss
|
|
104
|
+
of funds
|
|
105
|
+
"""
|
|
106
|
+
)
|
|
107
|
+
)
|
|
108
|
+
)
|
|
109
|
+
return
|
|
110
|
+
}
|
|
111
|
+
do {
|
|
112
|
+
let encodedTransaction = try self.encoder.createShieldingTransaction(
|
|
113
|
+
spendingKey: spendingKey,
|
|
114
|
+
tSecretKey: tsk,
|
|
115
|
+
memo: pendingTransaction.memo?.asZcashTransactionMemo(),
|
|
116
|
+
from: pendingTransaction.accountIndex
|
|
117
|
+
)
|
|
118
|
+
let transaction = try self.encoder.expandEncodedTransaction(encodedTransaction)
|
|
119
|
+
|
|
120
|
+
var pending = pendingTransaction
|
|
121
|
+
pending.encodeAttempts += 1
|
|
122
|
+
pending.raw = encodedTransaction.raw
|
|
123
|
+
pending.rawTransactionId = encodedTransaction.transactionId
|
|
124
|
+
pending.expiryHeight = transaction.expiryHeight ?? BlockHeight.empty()
|
|
125
|
+
pending.minedHeight = transaction.minedHeight ?? BlockHeight.empty()
|
|
126
|
+
|
|
127
|
+
try self.repository.update(pending)
|
|
128
|
+
|
|
129
|
+
result(.success(pending))
|
|
130
|
+
} catch StorageError.updateFailed {
|
|
131
|
+
DispatchQueue.main.async {
|
|
132
|
+
result(.failure(TransactionManagerError.updateFailed(pendingTransaction)))
|
|
133
|
+
}
|
|
134
|
+
} catch {
|
|
135
|
+
DispatchQueue.main.async {
|
|
136
|
+
result(.failure(error))
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
func encode(
|
|
143
|
+
spendingKey: String,
|
|
144
|
+
pendingTransaction: PendingTransactionEntity,
|
|
145
|
+
result: @escaping (Result<PendingTransactionEntity, Error>) -> Void
|
|
146
|
+
) {
|
|
147
|
+
queue.async { [weak self] in
|
|
148
|
+
guard let self = self else { return }
|
|
149
|
+
do {
|
|
150
|
+
let encodedTransaction = try self.encoder.createTransaction(
|
|
151
|
+
spendingKey: spendingKey,
|
|
152
|
+
zatoshi: pendingTransaction.value,
|
|
153
|
+
to: pendingTransaction.toAddress,
|
|
154
|
+
memo: pendingTransaction.memo?.asZcashTransactionMemo(),
|
|
155
|
+
from: pendingTransaction.accountIndex
|
|
156
|
+
)
|
|
157
|
+
let transaction = try self.encoder.expandEncodedTransaction(encodedTransaction)
|
|
158
|
+
|
|
159
|
+
var pending = pendingTransaction
|
|
160
|
+
pending.encodeAttempts += 1
|
|
161
|
+
pending.raw = encodedTransaction.raw
|
|
162
|
+
pending.rawTransactionId = encodedTransaction.transactionId
|
|
163
|
+
pending.expiryHeight = transaction.expiryHeight ?? BlockHeight.empty()
|
|
164
|
+
pending.minedHeight = transaction.minedHeight ?? BlockHeight.empty()
|
|
165
|
+
|
|
166
|
+
try self.repository.update(pending)
|
|
167
|
+
|
|
168
|
+
result(.success(pending))
|
|
169
|
+
} catch StorageError.updateFailed {
|
|
170
|
+
DispatchQueue.main.async {
|
|
171
|
+
result(.failure(TransactionManagerError.updateFailed(pendingTransaction)))
|
|
172
|
+
}
|
|
173
|
+
} catch {
|
|
174
|
+
do {
|
|
175
|
+
try self.updateOnFailure(transaction: pendingTransaction, error: error)
|
|
176
|
+
} catch {
|
|
177
|
+
DispatchQueue.main.async {
|
|
178
|
+
result(.failure(TransactionManagerError.updateFailed(pendingTransaction)))
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
DispatchQueue.main.async {
|
|
182
|
+
result(.failure(error))
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
func submit(
|
|
189
|
+
pendingTransaction: PendingTransactionEntity,
|
|
190
|
+
result: @escaping (Result<PendingTransactionEntity, Error>) -> Void
|
|
191
|
+
) {
|
|
192
|
+
guard let txId = pendingTransaction.id else {
|
|
193
|
+
result(.failure(TransactionManagerError.notPending(pendingTransaction)))// this transaction is not stored
|
|
194
|
+
return
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
queue.async { [weak self] in
|
|
198
|
+
guard let self = self else { return }
|
|
199
|
+
|
|
200
|
+
do {
|
|
201
|
+
guard let storedTx = try self.repository.find(by: txId) else {
|
|
202
|
+
result(.failure(TransactionManagerError.notPending(pendingTransaction)))
|
|
203
|
+
return
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
guard !storedTx.isCancelled else {
|
|
207
|
+
LoggerProxy.debug("ignoring cancelled transaction \(storedTx)")
|
|
208
|
+
result(.failure(TransactionManagerError.cancelled(storedTx)))
|
|
209
|
+
return
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
guard let raw = storedTx.raw else {
|
|
213
|
+
LoggerProxy.debug("INCONSISTENCY: attempt to send pending transaction \(txId) that has not raw data")
|
|
214
|
+
result(.failure(TransactionManagerError.internalInconsistency(storedTx)))
|
|
215
|
+
return
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
let response = try self.service.submit(spendTransaction: raw)
|
|
219
|
+
let transaction = try self.update(transaction: storedTx, on: response)
|
|
220
|
+
|
|
221
|
+
guard response.errorCode >= 0 else {
|
|
222
|
+
result(.failure(TransactionManagerError.submitFailed(transaction, errorCode: Int(response.errorCode))))
|
|
223
|
+
return
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
result(.success(transaction))
|
|
227
|
+
} catch {
|
|
228
|
+
try? self.updateOnFailure(transaction: pendingTransaction, error: error)
|
|
229
|
+
result(.failure(error))
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
func applyMinedHeight(pendingTransaction: PendingTransactionEntity, minedHeight: BlockHeight) throws -> PendingTransactionEntity {
|
|
235
|
+
guard let id = pendingTransaction.id else {
|
|
236
|
+
throw TransactionManagerError.internalInconsistency(pendingTransaction)
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
guard var transaction = try repository.find(by: id) else {
|
|
240
|
+
throw TransactionManagerError.notPending(pendingTransaction)
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
transaction.minedHeight = minedHeight
|
|
244
|
+
guard let pendingTxId = pendingTransaction.id else {
|
|
245
|
+
throw TransactionManagerError.updateFailed(pendingTransaction)
|
|
246
|
+
}
|
|
247
|
+
do {
|
|
248
|
+
try repository.applyMinedHeight(minedHeight, id: pendingTxId)
|
|
249
|
+
} catch {
|
|
250
|
+
throw TransactionManagerError.updateFailed(transaction)
|
|
251
|
+
}
|
|
252
|
+
return transaction
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
func handleReorg(at height: BlockHeight) throws {
|
|
256
|
+
guard let affectedTxs = try self.allPendingTransactions()?.filter({ $0.minedHeight >= height }) else {
|
|
257
|
+
return
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
try affectedTxs
|
|
261
|
+
.map { transaction -> PendingTransactionEntity in
|
|
262
|
+
var updatedTx = transaction
|
|
263
|
+
updatedTx.minedHeight = -1
|
|
264
|
+
return updatedTx
|
|
265
|
+
}
|
|
266
|
+
.forEach { try self.repository.update($0) }
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
func monitorChanges(byId: Int, observer: Any) {
|
|
270
|
+
// TODO: Implement this
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
func cancel(pendingTransaction: PendingTransactionEntity) -> Bool {
|
|
274
|
+
guard let id = pendingTransaction.id else { return false }
|
|
275
|
+
|
|
276
|
+
guard let transaction = try? repository.find(by: id) else { return false }
|
|
277
|
+
|
|
278
|
+
guard !transaction.isSubmitted else { return false }
|
|
279
|
+
|
|
280
|
+
guard (try? repository.cancel(transaction)) != nil else { return false }
|
|
281
|
+
|
|
282
|
+
return true
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
func allPendingTransactions() throws -> [PendingTransactionEntity]? {
|
|
286
|
+
try repository.getAll()
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// MARK: other functions
|
|
290
|
+
private func updateOnFailure(transaction: PendingTransactionEntity, error: Error) throws {
|
|
291
|
+
var pending = transaction
|
|
292
|
+
pending.errorMessage = error.localizedDescription
|
|
293
|
+
pending.encodeAttempts = transaction.encodeAttempts + 1
|
|
294
|
+
try self.repository.update(pending)
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
private func update(transaction: PendingTransactionEntity, on sendResponse: LightWalletServiceResponse) throws -> PendingTransactionEntity {
|
|
298
|
+
var pendingTx = transaction
|
|
299
|
+
pendingTx.submitAttempts += 1
|
|
300
|
+
let error = sendResponse.errorCode < 0
|
|
301
|
+
pendingTx.errorCode = error ? Int(sendResponse.errorCode) : nil
|
|
302
|
+
pendingTx.errorMessage = error ? sendResponse.errorMessage : nil
|
|
303
|
+
try repository.update(pendingTx)
|
|
304
|
+
return pendingTx
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
func delete(pendingTransaction: PendingTransactionEntity) throws {
|
|
308
|
+
do {
|
|
309
|
+
try repository.delete(pendingTransaction)
|
|
310
|
+
} catch {
|
|
311
|
+
throw TransactionManagerError.notPending(pendingTransaction)
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
enum OutboundTransactionManagerBuilder {
|
|
317
|
+
static func build(initializer: Initializer) throws -> OutboundTransactionManager {
|
|
318
|
+
PersistentTransactionManager(
|
|
319
|
+
encoder: TransactionEncoderbuilder.build(initializer: initializer),
|
|
320
|
+
service: initializer.lightWalletService,
|
|
321
|
+
repository: try PendingTransactionRepositoryBuilder.build(initializer: initializer),
|
|
322
|
+
networkType: initializer.network.networkType
|
|
323
|
+
)
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
enum PendingTransactionRepositoryBuilder {
|
|
328
|
+
static func build(initializer: Initializer) throws -> PendingTransactionRepository {
|
|
329
|
+
let dao = PendingTransactionSQLDAO(dbProvider: SimpleConnectionProvider(path: initializer.pendingDbURL.path, readonly: false))
|
|
330
|
+
try dao.createrTableIfNeeded()
|
|
331
|
+
return dao
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
enum TransactionEncoderbuilder {
|
|
336
|
+
static func build(initializer: Initializer) -> TransactionEncoder {
|
|
337
|
+
WalletTransactionEncoder(initializer: initializer)
|
|
338
|
+
}
|
|
339
|
+
}
|