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