diff --git a/Example/ZcashLightClientSample/ZcashLightClientSample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Example/ZcashLightClientSample/ZcashLightClientSample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 6c8ed3d6..4e776bb1 100644 --- a/Example/ZcashLightClientSample/ZcashLightClientSample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Example/ZcashLightClientSample/ZcashLightClientSample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -176,7 +176,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/zcash-hackworks/zcash-light-client-ffi", "state" : { - "revision" : "d1d038d653806f23fc291931823d95f2dc411486" + "revision" : "c7e5158edf5e62af15492d30237163b78af35ce9", + "version" : "0.7.1" } } ], diff --git a/Package.resolved b/Package.resolved index a77515f2..cb45488b 100644 --- a/Package.resolved +++ b/Package.resolved @@ -122,7 +122,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/zcash-hackworks/zcash-light-client-ffi", "state" : { - "revision" : "d1d038d653806f23fc291931823d95f2dc411486" + "revision" : "c7e5158edf5e62af15492d30237163b78af35ce9", + "version" : "0.7.1" } } ], diff --git a/Package.swift b/Package.swift index 9891f59b..cf2b1d4c 100644 --- a/Package.swift +++ b/Package.swift @@ -16,8 +16,7 @@ let package = Package( dependencies: [ .package(url: "https://github.com/grpc/grpc-swift.git", from: "1.19.1"), .package(url: "https://github.com/stephencelis/SQLite.swift.git", from: "0.14.1"), - // Compiled from revision `70cce1272c26ed52fbe7bfa334be781373b64bfd`. - .package(url: "https://github.com/zcash-hackworks/zcash-light-client-ffi", revision: "d1d038d653806f23fc291931823d95f2dc411486") + .package(url: "https://github.com/zcash-hackworks/zcash-light-client-ffi", exact: "0.7.1") ], targets: [ .target( diff --git a/Sources/ZcashLightClientKit/Error/ZcashError.swift b/Sources/ZcashLightClientKit/Error/ZcashError.swift index 50f01e03..40a48134 100644 --- a/Sources/ZcashLightClientKit/Error/ZcashError.swift +++ b/Sources/ZcashLightClientKit/Error/ZcashError.swift @@ -329,10 +329,10 @@ public enum ZcashError: Equatable, Error { /// - `rustError` contains error generated by the rust layer. /// ZRUST0058 case rustListAccounts(_ rustError: String) - /// Error from rust layer when calling ZcashRustBackend.isSeedRelevantToWallet + /// Error from rust layer when calling ZcashRustBackend.rustIsSeedRelevantToAnyDerivedAccount /// - `rustError` contains error generated by the rust layer. /// ZRUST0059 - case rustIsSeedRelevantToWallet(_ rustError: String) + case rustIsSeedRelevantToAnyDerivedAccount(_ rustError: String) /// SQLite query failed when fetching all accounts from the database. /// - `sqliteError` is error produced by SQLite library. /// ZADAO0001 @@ -690,7 +690,7 @@ public enum ZcashError: Equatable, Error { case .rustGetWalletSummary: return "Error from rust layer when calling ZcashRustBackend.getWalletSummary" case .rustProposeTransferFromURI: return "Error from rust layer when calling ZcashRustBackend." case .rustListAccounts: return "Error from rust layer when calling ZcashRustBackend." - case .rustIsSeedRelevantToWallet: return "Error from rust layer when calling ZcashRustBackend.isSeedRelevantToWallet" + case .rustIsSeedRelevantToAnyDerivedAccount: return "Error from rust layer when calling ZcashRustBackend.rustIsSeedRelevantToAnyDerivedAccount" case .accountDAOGetAll: return "SQLite query failed when fetching all accounts from the database." case .accountDAOGetAllCantDecode: return "Fetched accounts from SQLite but can't decode them." case .accountDAOFindBy: return "SQLite query failed when seaching for accounts in the database." @@ -867,7 +867,7 @@ public enum ZcashError: Equatable, Error { case .rustGetWalletSummary: return .rustGetWalletSummary case .rustProposeTransferFromURI: return .rustProposeTransferFromURI case .rustListAccounts: return .rustListAccounts - case .rustIsSeedRelevantToWallet: return .rustIsSeedRelevantToWallet + case .rustIsSeedRelevantToAnyDerivedAccount: return .rustIsSeedRelevantToAnyDerivedAccount case .accountDAOGetAll: return .accountDAOGetAll case .accountDAOGetAllCantDecode: return .accountDAOGetAllCantDecode case .accountDAOFindBy: return .accountDAOFindBy diff --git a/Sources/ZcashLightClientKit/Error/ZcashErrorCode.swift b/Sources/ZcashLightClientKit/Error/ZcashErrorCode.swift index 2eb3ad15..58203333 100644 --- a/Sources/ZcashLightClientKit/Error/ZcashErrorCode.swift +++ b/Sources/ZcashLightClientKit/Error/ZcashErrorCode.swift @@ -179,8 +179,8 @@ public enum ZcashErrorCode: String { case rustProposeTransferFromURI = "ZRUST0057" /// Error from rust layer when calling ZcashRustBackend. case rustListAccounts = "ZRUST0058" - /// Error from rust layer when calling ZcashRustBackend.isSeedRelevantToWallet - case rustIsSeedRelevantToWallet = "ZRUST0059" + /// Error from rust layer when calling ZcashRustBackend.rustIsSeedRelevantToAnyDerivedAccount + case rustIsSeedRelevantToAnyDerivedAccount = "ZRUST0059" /// SQLite query failed when fetching all accounts from the database. case accountDAOGetAll = "ZADAO0001" /// Fetched accounts from SQLite but can't decode them. diff --git a/Sources/ZcashLightClientKit/Error/ZcashErrorCodeDefinition.swift b/Sources/ZcashLightClientKit/Error/ZcashErrorCodeDefinition.swift index a72d9062..a5fde898 100644 --- a/Sources/ZcashLightClientKit/Error/ZcashErrorCodeDefinition.swift +++ b/Sources/ZcashLightClientKit/Error/ZcashErrorCodeDefinition.swift @@ -356,10 +356,10 @@ enum ZcashErrorDefinition { /// - `rustError` contains error generated by the rust layer. // sourcery: code="ZRUST0058" case rustListAccounts(_ rustError: String) - /// Error from rust layer when calling ZcashRustBackend.isSeedRelevantToWallet + /// Error from rust layer when calling ZcashRustBackend.rustIsSeedRelevantToAnyDerivedAccount /// - `rustError` contains error generated by the rust layer. // sourcery: code="ZRUST0059" - case rustIsSeedRelevantToWallet(_ rustError: String) + case rustIsSeedRelevantToAnyDerivedAccount(_ rustError: String) // MARK: - Account DAO diff --git a/Sources/ZcashLightClientKit/Model/WalletSummary.swift b/Sources/ZcashLightClientKit/Model/WalletSummary.swift index 6f837cea..c0c7a9ed 100644 --- a/Sources/ZcashLightClientKit/Model/WalletSummary.swift +++ b/Sources/ZcashLightClientKit/Model/WalletSummary.swift @@ -21,9 +21,10 @@ public struct PoolBalance: Equatable { public struct AccountBalance: Equatable { public let saplingBalance: PoolBalance + public let orchardBalance: PoolBalance public let unshielded: Zatoshi - static let zero = AccountBalance(saplingBalance: .zero, unshielded: .zero) + static let zero = AccountBalance(saplingBalance: .zero, orchardBalance: .zero, unshielded: .zero) } struct ScanProgress: Equatable { @@ -53,4 +54,5 @@ struct WalletSummary: Equatable { let fullyScannedHeight: BlockHeight let scanProgress: ScanProgress? let nextSaplingSubtreeIndex: UInt32 + let nextOrchardSubtreeIndex: UInt32 } diff --git a/Sources/ZcashLightClientKit/Rust/ZcashRustBackend.swift b/Sources/ZcashLightClientKit/Rust/ZcashRustBackend.swift index 2791187a..5eb048ef 100644 --- a/Sources/ZcashLightClientKit/Rust/ZcashRustBackend.swift +++ b/Sources/ZcashLightClientKit/Rust/ZcashRustBackend.swift @@ -105,9 +105,9 @@ actor ZcashRustBackend: ZcashRustBackendWelding { return ffiBinaryKeyPtr.pointee.unsafeToUnifiedSpendingKey(network: networkType) } - func isSeedRelevantToWallet(seed: [UInt8]) async throws -> Bool { + func isSeedRelevantToAnyDerivedAccount(seed: [UInt8]) async throws -> Bool { globalDBLock.lock() - let result = zcashlc_is_seed_relevant_to_wallet( + let result = zcashlc_is_seed_relevant_to_any_derived_account( dbData.0, dbData.1, seed, @@ -118,7 +118,7 @@ actor ZcashRustBackend: ZcashRustBackendWelding { // -1 is the error sentinel. guard result >= 0 else { - throw ZcashError.rustIsSeedRelevantToWallet(lastErrorMessage(fallback: "`isSeedRelevantToWallet` failed with unknown error")) + throw ZcashError.rustIsSeedRelevantToAnyDerivedAccount(lastErrorMessage(fallback: "`isSeedRelevantToAnyDerivedAccount` failed with unknown error")) } // 0 is false, 1 is true. @@ -343,6 +343,8 @@ actor ZcashRustBackend: ZcashRustBackendWelding { return DbInitResult.success case 1: return DbInitResult.seedRequired + case 2: + return DbInitResult.seedNotRelevant default: throw ZcashError.rustInitDataDb(lastErrorMessage(fallback: "`initDataDb` failed with unknown error")) } @@ -634,7 +636,8 @@ actor ZcashRustBackend: ZcashRustBackendWelding { chainTipHeight: BlockHeight(summaryPtr.pointee.chain_tip_height), fullyScannedHeight: BlockHeight(summaryPtr.pointee.fully_scanned_height), scanProgress: summaryPtr.pointee.scan_progress?.pointee.toScanProgress(), - nextSaplingSubtreeIndex: UInt32(summaryPtr.pointee.next_sapling_subtree_index) + nextSaplingSubtreeIndex: UInt32(summaryPtr.pointee.next_sapling_subtree_index), + nextOrchardSubtreeIndex: UInt32(summaryPtr.pointee.next_orchard_subtree_index) ) } @@ -897,6 +900,7 @@ extension FfiAccountBalance { func toAccountBalance() -> AccountBalance { .init( saplingBalance: self.sapling_balance.toPoolBalance(), + orchardBalance: self.orchard_balance.toPoolBalance(), unshielded: Zatoshi(self.unshielded) ) } diff --git a/Sources/ZcashLightClientKit/Rust/ZcashRustBackendWelding.swift b/Sources/ZcashLightClientKit/Rust/ZcashRustBackendWelding.swift index c4409ff2..5f0fb115 100644 --- a/Sources/ZcashLightClientKit/Rust/ZcashRustBackendWelding.swift +++ b/Sources/ZcashLightClientKit/Rust/ZcashRustBackendWelding.swift @@ -11,11 +11,14 @@ import Foundation enum ZcashRustBackendWeldingConstants { static let validChain: Int32 = -1 } -/// Enumeration of potential return states for database initialization. If `seedRequired` -/// is returned, the caller must re-attempt initialization providing the seed + +/// Enumeration of potential return states for database initialization. +/// +/// If `seedRequired` is returned, the caller must re-attempt initialization providing the seed. public enum DbInitResult { case success case seedRequired + case seedNotRelevant } // sourcery: mockActor @@ -44,10 +47,10 @@ protocol ZcashRustBackendWelding { /// - Throws: `rustCreateAccount`. func createAccount(seed: [UInt8], treeState: TreeState, recoverUntil: UInt32?) async throws -> UnifiedSpendingKey - /// Checks whether the given seed is relevant to any of the accounts in the wallet. + /// Checks whether the given seed is relevant to any of the derived accounts in the wallet. /// /// - parameter seed: byte array of the seed - func isSeedRelevantToWallet(seed: [UInt8]) async throws -> Bool + func isSeedRelevantToAnyDerivedAccount(seed: [UInt8]) async throws -> Bool /// Scans a transaction for any information that can be decrypted by the accounts in the wallet, and saves it to the wallet. /// - parameter tx: the transaction to decrypt diff --git a/Sources/ZcashLightClientKit/Synchronizer.swift b/Sources/ZcashLightClientKit/Synchronizer.swift index 3c400f89..0fae1a29 100644 --- a/Sources/ZcashLightClientKit/Synchronizer.swift +++ b/Sources/ZcashLightClientKit/Synchronizer.swift @@ -351,11 +351,11 @@ public protocol Synchronizer: AnyObject { /// - Throws: ZcashError when failures occur and related to `synchronizer.start(retry: Bool)`, it's the only throwing operation /// during the whole endpoint change. func switchTo(endpoint: LightWalletEndpoint) async throws - - /// Checks whether the given seed is relevant to any of the accounts in the wallet. + + /// Checks whether the given seed is relevant to any of the derived accounts in the wallet. /// /// - parameter seed: byte array of the seed - func isSeedRelevantToWallet(seed: [UInt8]) async throws -> Bool + func isSeedRelevantToAnyDerivedAccount(seed: [UInt8]) async throws -> Bool } public enum SyncStatus: Equatable { diff --git a/Sources/ZcashLightClientKit/Synchronizer/SDKSynchronizer.swift b/Sources/ZcashLightClientKit/Synchronizer/SDKSynchronizer.swift index 41657487..ea80173e 100644 --- a/Sources/ZcashLightClientKit/Synchronizer/SDKSynchronizer.swift +++ b/Sources/ZcashLightClientKit/Synchronizer/SDKSynchronizer.swift @@ -603,11 +603,11 @@ public class SDKSynchronizer: Synchronizer { return subject.eraseToAnyPublisher() } - - public func isSeedRelevantToWallet(seed: [UInt8]) async throws -> Bool { - try await initializer.rustBackend.isSeedRelevantToWallet(seed: seed) + + public func isSeedRelevantToAnyDerivedAccount(seed: [UInt8]) async throws -> Bool { + try await initializer.rustBackend.isSeedRelevantToAnyDerivedAccount(seed: seed) } - + // MARK: Server switch public func switchTo(endpoint: LightWalletEndpoint) async throws { diff --git a/Tests/OfflineTests/ClosureSynchronizerOfflineTests.swift b/Tests/OfflineTests/ClosureSynchronizerOfflineTests.swift index c54e631b..9be8c336 100644 --- a/Tests/OfflineTests/ClosureSynchronizerOfflineTests.swift +++ b/Tests/OfflineTests/ClosureSynchronizerOfflineTests.swift @@ -638,7 +638,7 @@ class ClosureSynchronizerOfflineTests: XCTestCase { } func testGetTransparentBalanceSucceed() { - let expectedBalance = AccountBalance(saplingBalance: .zero, unshielded: Zatoshi(200)) + let expectedBalance = AccountBalance(saplingBalance: .zero, orchardBalance: .zero, unshielded: Zatoshi(200)) synchronizerMock.getAccountBalanceAccountIndexClosure = { receivedAccountIndex in XCTAssertEqual(receivedAccountIndex, 3) @@ -685,7 +685,13 @@ class ClosureSynchronizerOfflineTests: XCTestCase { PoolBalance( spendableValue: Zatoshi(333), changePendingConfirmation: .zero, - valuePendingSpendability: .zero), unshielded: .zero + valuePendingSpendability: .zero), + orchardBalance: + PoolBalance( + spendableValue: Zatoshi(333), + changePendingConfirmation: .zero, + valuePendingSpendability: .zero), + unshielded: .zero ) synchronizerMock.getAccountBalanceAccountIndexClosure = { receivedAccountIndex in @@ -733,7 +739,13 @@ class ClosureSynchronizerOfflineTests: XCTestCase { PoolBalance( spendableValue: .zero, changePendingConfirmation: Zatoshi(333), - valuePendingSpendability: .zero), unshielded: .zero + valuePendingSpendability: .zero), + orchardBalance: + PoolBalance( + spendableValue: .zero, + changePendingConfirmation: Zatoshi(333), + valuePendingSpendability: .zero), + unshielded: .zero ) synchronizerMock.getAccountBalanceAccountIndexClosure = { receivedAccountIndex in diff --git a/Tests/OfflineTests/CombineSynchronizerOfflineTests.swift b/Tests/OfflineTests/CombineSynchronizerOfflineTests.swift index 07cec75a..b12a4e7f 100644 --- a/Tests/OfflineTests/CombineSynchronizerOfflineTests.swift +++ b/Tests/OfflineTests/CombineSynchronizerOfflineTests.swift @@ -748,7 +748,7 @@ class CombineSynchronizerOfflineTests: XCTestCase { } func testGetTransparentBalanceSucceed() { - let expectedBalance = AccountBalance(saplingBalance: .zero, unshielded: Zatoshi(100)) + let expectedBalance = AccountBalance(saplingBalance: .zero, orchardBalance: .zero, unshielded: Zatoshi(100)) synchronizerMock.getAccountBalanceAccountIndexClosure = { receivedAccountIndex in XCTAssertEqual(receivedAccountIndex, 3) @@ -809,6 +809,11 @@ class CombineSynchronizerOfflineTests: XCTestCase { spendableValue: .zero, changePendingConfirmation: Zatoshi(333), valuePendingSpendability: .zero), + orchardBalance: + PoolBalance( + spendableValue: .zero, + changePendingConfirmation: Zatoshi(333), + valuePendingSpendability: .zero), unshielded: .zero ) @@ -871,6 +876,11 @@ class CombineSynchronizerOfflineTests: XCTestCase { spendableValue: Zatoshi(333), changePendingConfirmation: .zero, valuePendingSpendability: .zero), + orchardBalance: + PoolBalance( + spendableValue: Zatoshi(333), + changePendingConfirmation: .zero, + valuePendingSpendability: .zero), unshielded: .zero ) diff --git a/Tests/OfflineTests/SynchronizerOfflineTests.swift b/Tests/OfflineTests/SynchronizerOfflineTests.swift index 826e98ae..3d701a14 100644 --- a/Tests/OfflineTests/SynchronizerOfflineTests.swift +++ b/Tests/OfflineTests/SynchronizerOfflineTests.swift @@ -29,10 +29,13 @@ class SynchronizerOfflineTests: ZcashTestCase { } func testCallPrepareWithAlreadyUsedAliasThrowsError() async throws { + // Pick a testnet height for which both Sapling and Orchard are active. + let walletBirthday = 1900000 + let firstTestCoordinator = try await TestCoordinator( alias: .custom("alias"), container: mockContainer, - walletBirthday: 10, + walletBirthday: walletBirthday, network: network, callPrepareInConstructor: false ) @@ -40,7 +43,7 @@ class SynchronizerOfflineTests: ZcashTestCase { let secondTestCoordinator = try await TestCoordinator( alias: .custom("alias"), container: mockContainer, - walletBirthday: 10, + walletBirthday: walletBirthday, network: network, callPrepareInConstructor: false ) @@ -58,10 +61,13 @@ class SynchronizerOfflineTests: ZcashTestCase { } func testWhenSynchronizerIsDeallocatedAliasIsntUsedAnymore() async throws { + // Pick a testnet height for which both Sapling and Orchard are active. + let walletBirthday = 1900000 + var testCoordinator: TestCoordinator! = try await TestCoordinator( alias: .default, container: mockContainer, - walletBirthday: 10, + walletBirthday: walletBirthday, network: network, callPrepareInConstructor: false ) @@ -75,7 +81,7 @@ class SynchronizerOfflineTests: ZcashTestCase { testCoordinator = try await TestCoordinator( alias: .default, container: mockContainer, - walletBirthday: 10, + walletBirthday: walletBirthday, network: network, callPrepareInConstructor: false ) @@ -88,10 +94,13 @@ class SynchronizerOfflineTests: ZcashTestCase { } func testCallWipeWithAlreadyUsedAliasThrowsError() async throws { + // Pick a testnet height for which both Sapling and Orchard are active. + let walletBirthday = 1900000 + let firstTestCoordinator = try await TestCoordinator( alias: .default, container: mockContainer, - walletBirthday: 10, + walletBirthday: walletBirthday, network: network, callPrepareInConstructor: false ) @@ -99,7 +108,7 @@ class SynchronizerOfflineTests: ZcashTestCase { let secondTestCoordinator = try await TestCoordinator( alias: .default, container: mockContainer, - walletBirthday: 10, + walletBirthday: walletBirthday, network: network, callPrepareInConstructor: false ) @@ -146,10 +155,13 @@ class SynchronizerOfflineTests: ZcashTestCase { } func testPrepareCanBeCalledAfterWipeWithSameInstanceOfSDKSynchronizer() async throws { + // Pick a testnet height for which both Sapling and Orchard are active. + let walletBirthday = 1900000 + let testCoordinator = try await TestCoordinator( alias: .default, container: mockContainer, - walletBirthday: 10, + walletBirthday: walletBirthday, network: network, callPrepareInConstructor: false ) @@ -180,10 +192,13 @@ class SynchronizerOfflineTests: ZcashTestCase { } func testSendToAddressCalledWithoutPrepareThrowsError() async throws { + // Pick a testnet height for which both Sapling and Orchard are active. + let walletBirthday = 1900000 + let testCoordinator = try await TestCoordinator( alias: .default, container: mockContainer, - walletBirthday: 10, + walletBirthday: walletBirthday, network: network, callPrepareInConstructor: false ) @@ -205,10 +220,13 @@ class SynchronizerOfflineTests: ZcashTestCase { } func testShieldFundsCalledWithoutPrepareThrowsError() async throws { + // Pick a testnet height for which both Sapling and Orchard are active. + let walletBirthday = 1900000 + let testCoordinator = try await TestCoordinator( alias: .default, container: mockContainer, - walletBirthday: 10, + walletBirthday: walletBirthday, network: network, callPrepareInConstructor: false ) @@ -229,10 +247,13 @@ class SynchronizerOfflineTests: ZcashTestCase { } func testRefreshUTXOCalledWithoutPrepareThrowsError() async throws { + // Pick a testnet height for which both Sapling and Orchard are active. + let walletBirthday = 1900000 + let testCoordinator = try await TestCoordinator( alias: .default, container: mockContainer, - walletBirthday: 10, + walletBirthday: walletBirthday, network: network, callPrepareInConstructor: false ) @@ -249,10 +270,13 @@ class SynchronizerOfflineTests: ZcashTestCase { } func testRewindCalledWithoutPrepareThrowsError() async throws { + // Pick a testnet height for which both Sapling and Orchard are active. + let walletBirthday = 1900000 + let testCoordinator = try await TestCoordinator( alias: .default, container: mockContainer, - walletBirthday: 10, + walletBirthday: walletBirthday, network: network, callPrepareInConstructor: false ) diff --git a/Tests/OfflineTests/UnifiedTypecodesTests.swift b/Tests/OfflineTests/UnifiedTypecodesTests.swift index d93345a2..7ff58307 100644 --- a/Tests/OfflineTests/UnifiedTypecodesTests.swift +++ b/Tests/OfflineTests/UnifiedTypecodesTests.swift @@ -32,7 +32,7 @@ final class UnifiedTypecodesTests: XCTestCase { let typecodes = try DerivationTool(networkType: .testnet).receiverTypecodesFromUnifiedAddress(address) - XCTAssertEqual(typecodes, [.sapling, .p2pkh]) + XCTAssertEqual(typecodes, [.orchard, .sapling, .p2pkh]) } func testUnifiedAddressHasTransparentSaplingReceivers() throws { @@ -51,6 +51,7 @@ final class UnifiedTypecodesTests: XCTestCase { XCTAssertEqual( Set(typecodes), Set([ + .orchard, .sapling, .p2pkh ]) diff --git a/Tests/OfflineTests/ZcashRustBackendTests.swift b/Tests/OfflineTests/ZcashRustBackendTests.swift index 4b77e426..8293facb 100644 --- a/Tests/OfflineTests/ZcashRustBackendTests.swift +++ b/Tests/OfflineTests/ZcashRustBackendTests.swift @@ -126,6 +126,11 @@ class ZcashRustBackendTests: XCTestCase { XCTFail("not enough transparent receivers") return } + + // The first address in the wallet is created when the account is created, using + // the default receivers specified inside `zcash_client_sqlite`. The remaining + // addresses are generated here, using the receivers specified in the Swift SDK's + // FFI backend. var uAddresses: [UnifiedAddress] = [] for i in 0...2 { uAddresses.append( diff --git a/Tests/TestUtils/Sourcery/GeneratedMocks/AutoMockable.generated.swift b/Tests/TestUtils/Sourcery/GeneratedMocks/AutoMockable.generated.swift index 7fddaf26..f99690a5 100644 --- a/Tests/TestUtils/Sourcery/GeneratedMocks/AutoMockable.generated.swift +++ b/Tests/TestUtils/Sourcery/GeneratedMocks/AutoMockable.generated.swift @@ -1800,27 +1800,27 @@ class SynchronizerMock: Synchronizer { try await switchToEndpointClosure!(endpoint) } - // MARK: - isSeedRelevantToWallet + // MARK: - isSeedRelevantToAnyDerivedAccount - var isSeedRelevantToWalletSeedThrowableError: Error? - var isSeedRelevantToWalletSeedCallsCount = 0 - var isSeedRelevantToWalletSeedCalled: Bool { - return isSeedRelevantToWalletSeedCallsCount > 0 + var isSeedRelevantToAnyDerivedAccountSeedThrowableError: Error? + var isSeedRelevantToAnyDerivedAccountSeedCallsCount = 0 + var isSeedRelevantToAnyDerivedAccountSeedCalled: Bool { + return isSeedRelevantToAnyDerivedAccountSeedCallsCount > 0 } - var isSeedRelevantToWalletSeedReceivedSeed: [UInt8]? - var isSeedRelevantToWalletSeedReturnValue: Bool! - var isSeedRelevantToWalletSeedClosure: (([UInt8]) async throws -> Bool)? + var isSeedRelevantToAnyDerivedAccountSeedReceivedSeed: [UInt8]? + var isSeedRelevantToAnyDerivedAccountSeedReturnValue: Bool! + var isSeedRelevantToAnyDerivedAccountSeedClosure: (([UInt8]) async throws -> Bool)? - func isSeedRelevantToWallet(seed: [UInt8]) async throws -> Bool { - if let error = isSeedRelevantToWalletSeedThrowableError { + func isSeedRelevantToAnyDerivedAccount(seed: [UInt8]) async throws -> Bool { + if let error = isSeedRelevantToAnyDerivedAccountSeedThrowableError { throw error } - isSeedRelevantToWalletSeedCallsCount += 1 - isSeedRelevantToWalletSeedReceivedSeed = seed - if let closure = isSeedRelevantToWalletSeedClosure { + isSeedRelevantToAnyDerivedAccountSeedCallsCount += 1 + isSeedRelevantToAnyDerivedAccountSeedReceivedSeed = seed + if let closure = isSeedRelevantToAnyDerivedAccountSeedClosure { return try await closure(seed) } else { - return isSeedRelevantToWalletSeedReturnValue + return isSeedRelevantToAnyDerivedAccountSeedReturnValue } } @@ -2325,36 +2325,36 @@ actor ZcashRustBackendWeldingMock: ZcashRustBackendWelding { } } - // MARK: - isSeedRelevantToWallet + // MARK: - isSeedRelevantToAnyDerivedAccount - var isSeedRelevantToWalletSeedThrowableError: Error? - func setIsSeedRelevantToWalletSeedThrowableError(_ param: Error?) async { - isSeedRelevantToWalletSeedThrowableError = param + var isSeedRelevantToAnyDerivedAccountSeedThrowableError: Error? + func setIsSeedRelevantToAnyDerivedAccountSeedThrowableError(_ param: Error?) async { + isSeedRelevantToAnyDerivedAccountSeedThrowableError = param } - var isSeedRelevantToWalletSeedCallsCount = 0 - var isSeedRelevantToWalletSeedCalled: Bool { - return isSeedRelevantToWalletSeedCallsCount > 0 + var isSeedRelevantToAnyDerivedAccountSeedCallsCount = 0 + var isSeedRelevantToAnyDerivedAccountSeedCalled: Bool { + return isSeedRelevantToAnyDerivedAccountSeedCallsCount > 0 } - var isSeedRelevantToWalletSeedReceivedSeed: [UInt8]? - var isSeedRelevantToWalletSeedReturnValue: Bool! - func setIsSeedRelevantToWalletSeedReturnValue(_ param: Bool) async { - isSeedRelevantToWalletSeedReturnValue = param + var isSeedRelevantToAnyDerivedAccountSeedReceivedSeed: [UInt8]? + var isSeedRelevantToAnyDerivedAccountSeedReturnValue: Bool! + func setIsSeedRelevantToAnyDerivedAccountSeedReturnValue(_ param: Bool) async { + isSeedRelevantToAnyDerivedAccountSeedReturnValue = param } - var isSeedRelevantToWalletSeedClosure: (([UInt8]) async throws -> Bool)? - func setIsSeedRelevantToWalletSeedClosure(_ param: (([UInt8]) async throws -> Bool)?) async { - isSeedRelevantToWalletSeedClosure = param + var isSeedRelevantToAnyDerivedAccountSeedClosure: (([UInt8]) async throws -> Bool)? + func setIsSeedRelevantToAnyDerivedAccountSeedClosure(_ param: (([UInt8]) async throws -> Bool)?) async { + isSeedRelevantToAnyDerivedAccountSeedClosure = param } - func isSeedRelevantToWallet(seed: [UInt8]) async throws -> Bool { - if let error = isSeedRelevantToWalletSeedThrowableError { + func isSeedRelevantToAnyDerivedAccount(seed: [UInt8]) async throws -> Bool { + if let error = isSeedRelevantToAnyDerivedAccountSeedThrowableError { throw error } - isSeedRelevantToWalletSeedCallsCount += 1 - isSeedRelevantToWalletSeedReceivedSeed = seed - if let closure = isSeedRelevantToWalletSeedClosure { + isSeedRelevantToAnyDerivedAccountSeedCallsCount += 1 + isSeedRelevantToAnyDerivedAccountSeedReceivedSeed = seed + if let closure = isSeedRelevantToAnyDerivedAccountSeedClosure { return try await closure(seed) } else { - return isSeedRelevantToWalletSeedReturnValue + return isSeedRelevantToAnyDerivedAccountSeedReturnValue } } diff --git a/Tests/TestUtils/Stubs.swift b/Tests/TestUtils/Stubs.swift index b552b079..69a118ee 100644 --- a/Tests/TestUtils/Stubs.swift +++ b/Tests/TestUtils/Stubs.swift @@ -145,7 +145,7 @@ extension SynchronizerState { static var mock: SynchronizerState { SynchronizerState( syncSessionID: .nullID, - accountBalance: AccountBalance(saplingBalance: .zero, unshielded: Zatoshi(200)), + accountBalance: AccountBalance(saplingBalance: .zero, orchardBalance: .zero, unshielded: Zatoshi(200)), internalSyncStatus: .syncing(0), latestBlockHeight: 222222 ) diff --git a/Tests/TestUtils/TestDbBuilder.swift b/Tests/TestUtils/TestDbBuilder.swift index 46082fc7..1f6b2d3a 100644 --- a/Tests/TestUtils/TestDbBuilder.swift +++ b/Tests/TestUtils/TestDbBuilder.swift @@ -63,6 +63,8 @@ enum TestDbBuilder { case .success: return provider case .seedRequired: throw ZcashError.compactBlockProcessorDataDbInitFailed("Seed value required to initialize the wallet database") + case .seedNotRelevant: + throw ZcashError.compactBlockProcessorDataDbInitFailed("Relevant seed value required") } } diff --git a/Tests/TestUtils/TestVector.swift b/Tests/TestUtils/TestVector.swift index 7edf0071..4407c4c0 100644 --- a/Tests/TestUtils/TestVector.swift +++ b/Tests/TestUtils/TestVector.swift @@ -169,9 +169,9 @@ public let testVector: [[Any?]] = [ ["From https://github.com/zcash-hackworks/zcash-test-vectors/blob/master/unified_address.py"], ["p2pkh_bytes, p2sh_bytes, sapling_raw_addr, orchard_raw_addr, unknown_typecode, unknown_bytes, unified_addr, root_seed, account, diversifier_index"], - ["7bb83570b8fae146e03c5331a020b1e0892f631d", nil, "d8ef8293d26de832e7193f296ba1922d90f122c6135bc231eebd91efdb03b1a8606771cd4fd6480574d43e", nil, nil, nil, "u1l8xunezsvhq8fgzfl7404m450nwnd76zshscn6nfys7vyz2ywyh4cc5daaq0c7q2su5lqfh23sp7fkf3kt27ve5948mzpfdvckzaect2jtte308mkwlycj2u0eac077wu70vqcetkxf", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 0, 0], - ["a7244a362f49f29644a955cf0039b88a61657861", nil, "435b0bbc95b5b7d52531a3944f2b85603ee22aaf850963bc156eb561edf2cbe7cf0e770e393ae5d7049026", nil, nil, nil, "u1fl5mprj0t9p4jg92hjjy8q5myvwc60c9wv0xachauqpn3c3k4xwzlaueafq27dcg7tzzzaz5jl8tyj93wgs983y0jq0qfhzu6n4r8rakpv5f4gg2lrw4z6pyqqcrcqx04d38yunc6je", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 0, 3], - ["e256dcb03e05dde7c91212b47a7461311c415059", nil, "69a25a38699708e5f6e76e54e6a7a2ab84dcf288df0d1f2563670168d6c44ace0ef11155c60d5c225e9dec", nil, nil, nil, "u1qxqf8ctkxlsdh7xdcgkdtyw4mku7dxma8tsz45xd6ttgs322gdk7kazg3sdn52z7na3tzcrzf7lt3xrdtfp9d4pccderalchvvxk8hghduxrky5guzqlw65fmgp6x7aj4k8v5jkgwuw", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 0, 4], + ["7bb83570b8fae146e03c5331a020b1e0892f631d", nil, "d8ef8293d26de832e7193f296ba1922d90f122c6135bc231eebd91efdb03b1a8606771cd4fd6480574d43e", nil, nil, nil, "u1m2p65qdnhexpfcmejjf6hjqd485xwfsrlf3cvc6wx5xhwrcq8myrdlqyhdpklz5d87ct0epfty0cr9d6q9fqtycx0j3vdhc2tzmkeejhtdqj3zrjqk3dd5ufpqkmueg89e6a6alvpaaxcx4fxsxqk4yj7g8dayn94d3afrsx66m3vq4rk03hc0ufmtkcm8wca7xja42f9kjau9708z7", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 0, 0], + ["a7244a362f49f29644a955cf0039b88a61657861", nil, "435b0bbc95b5b7d52531a3944f2b85603ee22aaf850963bc156eb561edf2cbe7cf0e770e393ae5d7049026", nil, nil, nil, "u196qfugjlzacex3pnhj5hgkj7ppjxeg3egcwkn364rnt59nx7p2f4pp35h4v677hla3negz4w0quy9ul6an2azqv0lt7f5n4dz5pspk0uvhkqfft4ntarat6mf0zfc46s5rsvmrd63lvnp2y8kyyes2r0k439de6je9ugy85qkq9ldc7hkkvjav69gzyfl5sen8kfxk3gyhjpzn39xj0", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 0, 3], + ["e256dcb03e05dde7c91212b47a7461311c415059", nil, "69a25a38699708e5f6e76e54e6a7a2ab84dcf288df0d1f2563670168d6c44ace0ef11155c60d5c225e9dec", nil, nil, nil, "u1vs0kanmdm4vtp2jy5lfsfspty0l7umph3ny6v9xwqpamvw2adshzsh24ukvc2hamwd8wky7sfalzv4szttsrss26m5yvxnh2r0h9u5vtksr0puhw89h7gm202h5qhn53cm2pt9uj7cwnymmgp26jxe9c0lt5z3egvl03hmdrg6r923t5xudetg2f6kzzn5h6xhaye8wmufnguaj8pws", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 0, 4], ["cad268758c5e71493066446b98e71df9d1d6a5ca", nil, "9f6e0bf90a18fc0b9b83ae9f23ad4358648638482b5def8975635b66fd8a708335f9235a3186ec0f033f84", "cecbe5e689a453a3fe10ccf7617e6c1fb382819d7fc9200a1f42092ac84a30378f8c1fb90dff71a6d5042d", nil, nil, "u1pg2aaph7jp8rpf6yhsza25722sg5fcn3vaca6ze27hqjw7jvvhhuxkpcg0ge9xh6drsgdkda8qjq5chpehkcpxf87rnjryjqwymdheptpvnljqqrjqzjwkc2ma6hcq666kgwfytxwac8eyex6ndgr6ezte66706e3vaqrd25dzvzkc69kw0jgywtd0cmq52q5lkw6uh7hyvzjse8ksx", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 1, 3], ["8d653347a0fd3cd0842a790a5eaf89d8e3854659", nil, "e1adf156a07d56bcac91bdb2f7bb3ea7c44569dcfee54273c09e8065807b6823faa94a77219554d0f6e017", "24f8a60cbd97e012618d56054ad39241411a28fdd50ee35efa91152f60d5fa21172e5d458ddbcb6b709896", nil, nil, "u19mzuf4l37ny393m59v4mxx4t3uyxkh7qpqjdfvlfk9f504cv9w4fpl7cql0kqvssz8jay8mgl8lnrtvg6yzh9pranjj963acc3h2z2qt7007du0lsmdf862dyy40c3wmt0kq35k5z836tfljgzsqtdsccchayfjpygqzkx24l77ga3ngfgskqddyepz8we7ny4ggmt7q48cgvgu57mz", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 1, 7], ["e511f439b5f96cf824cd5e0e6b2eb8ee1bc83cb7", nil, "60ba572f8e379312d86897025decdd64b4b95e2c4afa9d13726b8cc393edb4988c51b976028f890f108bd2", "1f24294ed1b405c7b3b1c3f13db5b9b27b5d0f2aca9d589a69e5be00eb978621e6776e87ea326d47a34c1a", nil, nil, "u1mtxw5nras5glkxz093282sv3n2h8qs7cpxcmmaxj96vtzjzl6rmdaxs4e9es7mxwmd0h3k5wz3ce4ll5g4jz2pn9su4pufq74pxhp4t235n6j7aed3hh8ss7pf3sekf7apsf6vtg84ue5zcq2k9q3xv5yth3q50fu4czdm8sn8q4de3m5k76g2vwwyjsf50hqfxgmwxqxu0rsy22ktw", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 1, 8],