Commit Graph

939 Commits

Author SHA1 Message Date
Michal Fousek 3ba751ff64
Merge pull request #1000 from Chlup/upgrade_mnemonic
Upgrade SPM packages in the SDK sample app
2023-04-20 17:29:18 +02:00
Michal Fousek 08d9d3986e Upgrade SPM packages in the SDK sample app 2023-04-20 15:21:09 +02:00
Francisco Gindre 9fa59cf13b
[#985] Release 0.21.0-beta (#986)
Closes #985
2023-04-19 14:32:48 -03:00
Francisco Gindre c238e443ab
[#983] Update FFI Framework to 0.3.0 (#984)
Closes #983
Closes #914
2023-04-18 11:49:00 -03:00
Michal Fousek 7b3b45adca
Merge pull request #978 from zcash/969_clear_cache_on_error
[#969] Clear blocks cache when error occurs
2023-04-18 14:26:46 +02:00
Francisco Gindre 802aaa437d
[#959] Fix `v_transactions` view issues with value (#963)
This change switches to a new (future) version of the rust crates
that will get rid of the sent and received transactions Views in
favor of a `v_transaction` view that will do better accounting of
outgoing and incoming funds. Additionally it will support an
outputs view for seeing the inner details of transactions enabling
the SDKs tell the users the precise movement of value that a tx
causes in its multiple possible ways according to the protocol.

the `v_tx_outputs` view is not yet implemented.

Sent and Received transaction sub-types are kept for compatibility
purposes but they are generated from Overviews instead of queried
from a specific view.

In the transaction Overview the value represents the whole value
transfer for the transaction from the point of view of a given
account including fees. This means that the value for a single
transaction Overview struct represents the addition or subtraction
of ZEC value to the account's balance.

Future updates will give clients the possibility to drill into the
inner workings of those value changes in a per-output basis for
each transaction.

Also, the field `pending_unmined` field was added to `v_transactions`
so that wallets can query `DataDb` for pending but yet unmined txs

This will prepare the field for removing the notion of a "PendingDb"
and its nuances.

Also updated test database `darkside_data.db`

Closes #959

Closes #971 ZcashLightClientKitSample main target broken swiftlint script

Demo App improvements: Show Short date and value on transaction list
2023-04-18 09:10:56 -03:00
Michal Fousek 488864ec55 [#969] Clear blocks cache when error occurs
Closes #969.
2023-04-18 12:41:12 +02:00
Lukas Korba 99b24c2081
[#908] Add last and latest blocks data to Synchronizer State (#911)
- attached to the processor's timer
- added latest scanned time and latest block height
- sample app showing the new values alongside with the %
- unit tests fixed
- latestBlock() API added
- the transaction repository is no longer used to update the exposed values during the syncing
2023-04-14 09:08:37 +02:00
Michal Fousek b73ac78960
Merge pull request #958 from Chlup/fix_SynchronizerDarksideTests
Fix SynchronizerDarksideTests
2023-04-12 20:57:08 +02:00
Michal Fousek cd4450e43f Fix SynchronizerDarksideTests 2023-04-12 16:04:28 +02:00
Michal Fousek 420b699d68
Merge pull request #920 from zcash/feature/888_make_ZcashRustBackendWelding_actor
[#888] Make actor from ZcashRustBackendWelding
2023-04-12 14:04:29 +02:00
Michal Fousek 2bbc5800bd [#888] Make actor from ZcashRustBackendWelding
Closes #888.

- `ZcashRustBackend` is actor now. So majority of methods in this actor
  are now async.
- Some methods stayed `static` in `ZcashRustBackend`. It would be hard
  to pass instance of the `ZcashRustBackend` to the places where these
  methods are used in static manner. And it would change lot of APIs.
  But it isn't problem from technical perspective because these methods
  would be `nonisolated` otherwise.
- Methods `lastError()` and `getLastError()` in `ZcashRustBackend` are
  now private. This makes sure that ther won't be aby race condition
  between other methods and these two error methods.
- All the methods for which was `lastError()` used in code now throw
  error. So `lastError()` is no longer needed outside of the
  `ZcashRustBackend`.
- There are in the public API related to `DerivationTool`.
- `DerivationTool` now requires instance of the `ZcashRustBackend`. And
  `ZcashRustBackend` isn't public type. So `DerivationTool` doesn't have
  any public constructor now. It can be created only via
  `Initializer.makeDerivationTool()` instance method.
- `deriveUnifiedSpendingKey()` and `deriveUnifiedFullViewingKey()` in
  `DerivationTool` are now async. It is because these are using
  `ZcashRustBackend` inside. `DerivationTool` offers alternative
  (closure and combine) APIs. But downside is that there is no sync API
  to dervie spending key or viewing key.
- Some methods of the `DerivationTool` are now static. These methods
  don't use anything that requires instance of the `DerivationTool`
  inside.

[#888] Use Sourcery to generate mocks

- I wrote mock for `Synchronizer` manually. And it's tedious and long
  and boring work.
- Now `ZcashRustBackendWelding` is changed a lot so it means
  `MockRustBackend` must be changed a lot. So I decided to introduce
  `sourcery` to generate mocks from protocols so we don't have to do it
  manually ever.
- To generate mocks go to `ZcashLightClientKit/Tests/TestUtils/Sourcery`
  directory and run `generateMocks.sh` script.
- Your protocol must be mentioned in `AutoMockable.swift` file.
  Generated mocks are in `AutoMockable.generated.swift` file.

[#888] Fix Offline tests

- Offline tests target now runs and tests are green.
- There is log of changes in tests. But logic is not changed.
- Updated `AutoMockable.stencil` so sourcery is able to generate mock as
  actor when protocol is marked with: `// sourcery: mockActor`.
- Last few updates in `ZcashRustBackendWelding`. In previous PR `rewindCacheToHeight`
  methods was overlooked and it didn't throw error.
- Removed `MockRustBackend` and using generated
  `ZCashRustBackendWeldingMock` instead.
- Using generated `SynchronizerMock`.

[#888] Fix NetworkTests

- Changed a bit how rust backend mock is used in the tests. Introduced
  `RustBackendMockHelper`. There are some state variables that must be
  preserved within one instance of the mock. This helper does exactly
  this. It keeps this state variables in the memory and helping mock to
  work as expected.

[#888] Fix Darkside tests

Create ZcashKeyDeriving internal protocol

Use New DerivationTool that does not require RustBackend

Remove duplicated methods that had been copied over

[#888] Fix potentially broken tests

I broke the tests because I moved `testTempDirectory` from each
`TestCase` to the `Environment`. By this I caused that each tests uses
exactly same URL. Which is directly against purpose of
`testTempDirectory`.

So now each test calls this one and store it to local variable. So each
test has unique URL.

[#888] Add ability to mock nonisolated methods to AutoMockable.stencil

[#888] Add changelog and fix the documentation in ZcashRustBackendWelding

[#888] Rename derivation rust backend protocol and remove static methods

- Renamed `ZcashKeyDeriving` to `ZcashKeyDerivationBackendWelding`. So
  the naming scheme is same as for `ZcashRustBackendWelding`.
- `ZcashKeyDerivationBackend` is now struct instead of enum.
- Methods in `ZcashKeyDerivationBackendWelding` (except one) are no
  longer static. Because of this the respective methods in
  `DerivationTool` aren't also static anymore.
2023-04-11 17:51:28 +02:00
Francisco Gindre 6b7fbdd908
[#895] Add Sync Session ID Synchronizer State (#906)
Closes #895

Add Sync Session ID to `SynchronizerState`.

A SyncSession is an attempt to sync the blockchain within the lifetime of a Synchronizer.
A Synchronizer can sync many times, when synced it will refresh every ~20 seconds +- random padding.
each sync attempt will have a different UUID even if it's from the same instance of SDKSynchronizer.

**How are SyncSessions are delimited? With `SyncStatus` changes.**

changes from [`.unprepared`|`.error`|`.disconnected`|`.stopped`] to `.syncing` assign a new sessionID to the synchronizer.

Any other transitions won't.

`areTwoStatusesDifferent ` was refactored to a helper function of `SyncStatus`

**How are IDs generated?**

ID generation is not mandated but delegated to a protocol `SyncSessionIDGenerator`.
Tests inject their own deterministic generator to avoid test flakiness.

Default implementation of SyncSessionIDGenerator is

````Swift
struct UniqueSyncSessionIDGenerator {}

extension UniqueSyncSessionIDGenerator: SyncSessionIDGenerator {
    func nextID() -> UUID {
        UUID()
    }
}
````

**SyncSession Pseudo-Atomicity and thread safety**

SyncSession is a type alias of a GenericActor holding a UUID

````
typealias SyncSession = GenericActor<UUID>

extension SyncSession {
    /// updates the current sync session to a new value with the given generator
    /// - Parameters generator: a `SyncSessionIDGenerator`
    /// - returns: the `UUID` of the newly updated value.
    @discardableResult
    func newSession(with generator: SyncSessionIDGenerator) async -> UUID {
        return await self.update(generator.nextID())
    }
}
````

Closes #895

SessionTicker struct to control session transitions.

switching to `.unprepared` now makes syncID to be `.nullID`
2023-04-07 09:02:05 -03:00
Michal Fousek e3bc06b694
Merge pull request #903 from zcash/release/0.20.1-beta
Release/0.20.1 beta
2023-04-03 19:19:23 +02:00
Michal Fousek ab603802bb Merge branch 'main' into release/0.20.1-beta 2023-04-03 17:21:10 +02:00
Michal Fousek 8983b01f6c Rename Single and Completable 2023-04-03 17:19:40 +02:00
Lukas Korba 16d70cfead
[#896] Fix SDK compilation fail caused by Swift 5.8 (#897)
- Fixed the guard with explicit self
2023-04-03 09:16:07 +02:00
Francisco Gindre e8c2aeecc3
[#889] fix branches that will be built with CodeQL (#894) 2023-03-31 15:08:31 -03:00
Francisco Gindre 2537296db0
[#889] Add github action for CodeQL beta (#890)
Closes 889

switch to from autobuild to swift build

configure swift build

fix architecture parameter

remove CodeQL on pushes
2023-03-31 13:29:27 -03:00
Michal Fousek 34ac9ff7c5
Merge pull request #891 from Chlup/877_OutboundTransactionManager_async
[#877] OutboundTransactionManager to async
2023-03-31 16:40:05 +02:00
Michal Fousek cb7faf4614
Merge pull request #892 from Chlup/878_UnspentTransactionOutputRepository_async
[#878] UnspentTransactionOutputRepository to async
2023-03-31 16:39:50 +02:00
Michal Fousek d7eef113ff
Merge pull request #893 from Chlup/remove_notifications
Remove anything related to Notifications
2023-03-31 16:39:36 +02:00
Michal Fousek 866fe3d6f0 Remove anything related to Notifications
- There was still some code inside the SDK related to NotificationCenter
  and notifications. But notifications are no longer needed. So all this
  code can go away.
2023-03-31 11:04:39 +02:00
Michal Fousek 7826258e24 [#878] UnspentTransactionOutputRepository to async
Closes #878.
2023-03-31 10:59:46 +02:00
Michal Fousek f420c81ceb [#877] OutboundTransactionManager to async
Closes #877.

- Most of the methods in `OutboundTransactionManager` were already async
  so this is not big of a change.
- Some methods/properties in the `SDKSynchronizer` were made async. But
  these were async in the `Synchronizer` already. So let's not consider
  this change of the public API.
2023-03-31 10:49:06 +02:00
Michal Fousek 10281c712c
Merge pull request #887 from Chlup/462_remove_xctestcase_wait
[#462] Get rid of XCTestCase.wait
2023-03-31 10:09:43 +02:00
Michal Fousek 96f763d42f [#462] Get rid of XCTestCase.wait 2023-03-31 08:58:19 +02:00
Michal Fousek 3764054db4
Merge pull request #886 from Chlup/469_rust_async
[#469] Make ZcashRustBackendWelding async
2023-03-31 08:41:53 +02:00
Michal Fousek c4f7f6ff1e [#469] Make ZcashRustBackendWelding async
Closes #469.

- Methods defined in `ZcashRustBackendWelding` protocol which are doing
  some IO operations are now async.
- `Initializer` no longer have methods to get balance. Only
  `Synchronizer` now have these methods. These methods are newly async.
  And `Initilializer` doesn't have alternative APIs.
- There is lot of changes in tests but those are mostly adding `await`.
  No logic is changed.
2023-03-30 19:08:56 +02:00
Francisco Gindre ae971d526c
[#874] Release 0.20.0-beta (#881)
Cloese #874

Update MIGRATING.md
2023-03-30 07:45:42 -03:00
Francisco Gindre c4d3f74205
[#880] Make some deprecations effective (#885)
* Deprecate `func getShieldedBalance(accountIndex: Int) -> Int64`

* Deprecate `func getShieldedVerifiedBalance(accountIndex: Int) -> Int64`

* deprecate `func getBalance(account index: Int = 0) -> Int64`

* deprecate `func defaultFee(for height: BlockHeight) -> Int64`

* deprecate `func getReceivedMemoAsUTF8(dbData:idNote:networkType:) -> String?`

* Deprecate `func getSentMemoAsUTF8(dbData:idNote:networkType:) -> String?`

* deprecate `getVerifiedBalance`

Closes #880
2023-03-28 15:56:14 -03:00
Michal Fousek 5a2496f2fb
Merge pull request #882 from Chlup/876_multiple_synchronizers_tests
[#876] Add tests which runs multiple instances of the SDKSynchronizer
2023-03-28 16:35:44 +02:00
Michal Fousek 94f016ecf9
Merge pull request #884 from Chlup/883_fix_test
[#883] Use async in TransactionSQLDAO
2023-03-28 16:20:06 +02:00
Michal Fousek 8e5db5e0b5 [#876] Add tests which runs multiple instances of the SDKSynchronizer
Closes #876.

- Add `testMultipleSynchronizersCanRunAtOnce()` test which creates
  multiple instances of the `SDKSynchronizer` and then executes sync in
  parallel.
- To achieve this it's required to have multiple instances of the
  lightwalletd in the darkside mode. Because of this new test is in the
  new target `AliasDarksideTests`. It's little bit harder to run this
  test than to run regular darkside tests. So it has it's own target.
- Fix bug when all the instances of the `SDKSynchronizer` used same data
  DB even with different aliases.
- Add script to run multiple instances of the lightwalletd in
  darkside mode. And add script to stop these instances and clean after
  those.
- Update `DarksideWalletService` a little so the endpoint can be passed
  to it. Without this it would always use default endpoint when created
  with service.
- Small cleanup in `TestCoordinator`.
2023-03-28 16:11:13 +02:00
Michal Fousek bb17299695 [#883] Use async in TransactionSQLDAO 2023-03-28 15:54:58 +02:00
Michal Fousek d7e6a413b7
Merge pull request #879 from Chlup/484_transactions_repository_async
[#484] Use async for TransactionsRepository
2023-03-28 12:49:41 +02:00
Michal Fousek 3971f80eef [#484] Use async for TransactionsRepository
Closes #484.

- `TransactionRepository` has async API. `Synchronizer` and alternative
  APIs are updated accordingly.

These methods and properties in the `Synchronizer` are async now:
- `cancelSpend(transaction:)`
- All the variants of the `getMemos(for:)` method.
- All the variants fo the `getRecipients(for:)` method.
- `allConfirmedTransactions(from:limit:)`
- `pendingTransactions`
- `clearedTransactions`
- `sentTransactions`
- `receivedTransactions`
2023-03-28 10:17:14 +02:00
Michal Fousek 026a96ffba
Merge pull request #875 from zcash/feature/209_support_multiple_instances
[#209] Add support for multiple instances of the SDKSynchronizer
2023-03-27 21:32:09 +02:00
Michal Fousek 5c979f42e6 [#209] Add support for multiple instances of the SDKSynchronizer
Closes #209.

[#845] Introduce ZcashSynchronizerAlias enum

Closes #845.

[#852] SDKSynchronizer using queues label based on the alias

Closes #852.

[#847] Remove posibility to use DatabaseStorageManager as singleton

Closes #847.

[#850] Remove synchronizerConnectionStateChanged notification

Closes #850.

[#855] Add check if the Alias is already used

Closes #855

- Added `UsedAliasesChecker` utility which is used to register aliases
  that are in use.
- `prepare()` and `wipe()` methods now check if the current alias can't
  be used and if not then `InitializerError.aliasAlreadyInUse` is
  thrown/emitted.
- Some public methods that could cause harm if used with the Alias that
  is already in use now throw `SynchronizerError.notPrepared`. Thanks to
  this the client app is forced to call `prepare()` first. And
  `prepare()` does check for the Alias.
- Added tests for new conditions.

[#849] Make InternalSyncProgress aware of the Alias

Closes #849.

[#853] Only instance with default Alias migrates legacy cache DB

Closes #853.

[#851] Apply the Alias to the URLs

Closes #851.

- `Initializer` now updates paths according to alias before paths are
  used anywhere in the SDK.
- Paths update can fail. It would be incovenient for the client apps to
  handle errors thrown from `Initiliazer` constructor. So the error is
  then handled in `SDKSynchronizer.prepare()` or `SDKSynchronizer.wipe()`.

[#846] Stop using SDKMetrics as singleton (#862)

- metrics are not longer a singleton
- tests fixed
- metrics outside init of the synchronizer

[#848] Make logger aware of the alias

- logger is now an instance passed throughout the sdk instead of a static proxy

[#848] Make logger aware of the alias (#868)

- comments addressed

[#848] Make logger aware of the alias (#868)

- returning protocol back

Fix typos

[#856] Add possibility to test multiple synchronizers in the sample app

Closes #856.

- Added `alias` property to `Synchronizer`.
- Added `SyncBlocksListViewController` which provides UI to use multiple
  synchronizers at once.

[#209] Add changelog

- Add changelog for #209.
- Overall improve readability of the rendered changelog. Tickets
  references are now prefixed with `###` instead of `- `.

Fix compilation
2023-03-27 20:42:52 +02:00
Michal Fousek 2ff6b81b4b
Merge pull request #873 from Chlup/871_async_cleanup
[#871] Cleanup internals of the SDK and use async where applicable
2023-03-27 20:37:21 +02:00
Michal Fousek c2d9c6f1e8 [#871] Cleanup internals of the SDK and use async where applicable
Closes #871.
2023-03-27 16:16:42 +02:00
Michal Fousek 1d6b30116c
Merge pull request #872 from Chlup/870_grpc_to_async
[#870] LightWalletGRPCService is using only async streamer
2023-03-27 15:57:47 +02:00
Michal Fousek ce83dcef12 [#870] LightWalletGRPCService is using only async streamer
Closes #870.
2023-03-27 13:45:22 +02:00
Michal Fousek 52d5e00850
Merge pull request #860 from Chlup/fix_testListTransparentReceivers_test
Fix flaky testListTransparentReceivers test
2023-03-23 13:28:45 +01:00
Michal Fousek 21f90fe93c Fix flaky testListTransparentReceivers test
Data DB name is derived from timestamp in TemporaryDbBuilder. Timestamp
is converted to seconds before it's used to generate Data DB name. So
if the test is super fast and can run twice in one seconds it fails.
Solution is to always remove data DB at the end of the test.
2023-03-23 12:46:11 +01:00
Michal Fousek 56f195f2cc
Merge pull request #844 from zcash/feature/831_solve_async_nonasync
[#831] Add SDKSynchronizer wrappers for non-async API
2023-03-23 09:06:54 +01:00
Michal Fousek 436fa1fc47 [#831] Add SDKSynchronizer wrappers for non-async API
This change introduces two new protocols: `ClosureSynchronizer` and
`CombineSynchronizer`. These two protocols define API that doesn't use
`async`. So the client can choose exactly which API it wants to use.
    This change also introduces two new objects: `ClosureSDKSynchronizer`
and `CombineSDKSynchronizer`. These two implement the respective protocols
mentioned above. Both are structures. Neither of these two keeps any state.
Thanks to this each is very cheap to create. And usage of these two isn't
mutually exclusive. So devs can really choose the best SDK API for each
part of the client app.

[#831] Use async inside of the SDKSynchronizer

- In general lot of methods inside the `SDKSynchronizer` and
  `CompactBlockProcessoer` which weren't async are now async. And other
  changes are made because of this change.
- `CompactBlockProcessor` no longer uses Combine to communicate with
  `SDKSynchronizer`. Reason for this is that Combine doesn't play great
  with async. Closure passed to `sink` isn't async.
- Because of this and because of how our tests work (receiving signals
  from CBP directly) `CompactBlockProcessor` must be able to handle more
  event closures. Not just one. So it now has `eventClosures`
  dictionary. It's little bit strange but it works fine.
- `SyncStatus` inside the `SDKSynchronizer` was previously protected by
  lock. Now it's protected by simple actor wrapper.
- Changes in tests are minimal. Changes were mady only because
  `CompactBlockProcessor` changes from Combine to closures.

[#831] Add tests for ClosureSDKSynchronizer

- Added tests are testing in general if the `ClosuresSDKSynchronizer` is correctly
  calling `Synchronizer` and if the values are correctly returned.
- `ClosuresSDKSynchronizer` doesn't contain any logic but it is public
  API and we should be sure that it works correctly.

[#831] Add tests for CombineSDKSynchronizer

[#831] Add changelog
2023-03-21 22:47:19 +01:00
Michal Fousek c88fd684e8
Merge pull request #834 from Chlup/724_change_notifications
[#724] Switch from NotificationCenter to Combine
2023-03-17 10:19:09 +01:00
Michal Fousek a38e8134b8 [#724] Switch from NotificationCenter to Combine
Closes #724

- All the notifications are gone. Only
  `synchronizerConnectionStateChanged` stayed because it's used
  internally. Let's deal with this one in another task.
- Synchronizer has now two new publishers (`stateStream` and
  (`eventStream`) which are used to notify the client app about
  what is going on. These publishers replace notifications.
- There is also new property `latestState` which can be used to get the
  SDK state in synchronous manner.
- `SDKSynchronizer.status` is no longer public. It is used internally to
  refresh `latestState` and emit new values from `stateStream.
- When `SDKSynchronizer.status` is update `notify()` function is
  triggered. And this function is now responsible for generating new
  snapshot of `SynchronizerState` and updating `latestState` and
  `stateStream`.
2023-03-17 10:18:51 +01:00
Lukas Korba 7f69f643b9
[#832] Check for missing spending and output params is not full (#833)
- fixed copy paste bug
- fixed params not being downloaded when transparent funds available
- verified checks are not necessary, removed
2023-03-17 10:18:35 +01:00