diff --git a/Podfile b/Podfile index 8ca86db79a..cbf56873ac 100644 --- a/Podfile +++ b/Podfile @@ -24,7 +24,7 @@ use_frameworks! inhibit_all_warnings! def tangem_sdk_pod - pod 'TangemSdk', :git => 'https://github.com/Tangem/tangem-sdk-ios.git', :tag => 'develop-282' + pod 'TangemSdk', :git => 'https://github.com/Tangem/tangem-sdk-ios.git', :tag => 'develop-284' #pod 'TangemSdk', :path => '../tangem-sdk-ios' end diff --git a/Podfile.lock b/Podfile.lock index 0cb308fc4a..ca3a568ccb 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -219,7 +219,7 @@ DEPENDENCIES: - Kingfisher (~> 7.9.0) - Moya - Solana.Swift (from `https://github.com/tangem/Solana.Swift`, tag `1.2.0-tangem1`) - - TangemSdk (from `https://github.com/Tangem/tangem-sdk-ios.git`, tag `develop-282`) + - TangemSdk (from `https://github.com/Tangem/tangem-sdk-ios.git`, tag `develop-284`) - WalletConnectSwiftV2 (from `https://github.com/WalletConnect/WalletConnectSwiftV2`, tag `1.8.4`) SPEC REPOS: @@ -276,7 +276,7 @@ EXTERNAL SOURCES: :tag: 1.2.0-tangem1 TangemSdk: :git: https://github.com/Tangem/tangem-sdk-ios.git - :tag: develop-282 + :tag: develop-284 WalletConnectSwiftV2: :git: https://github.com/WalletConnect/WalletConnectSwiftV2 :tag: 1.8.4 @@ -299,7 +299,7 @@ CHECKOUT OPTIONS: :tag: 1.2.0-tangem1 TangemSdk: :git: https://github.com/Tangem/tangem-sdk-ios.git - :tag: develop-282 + :tag: develop-284 WalletConnectSwiftV2: :git: https://github.com/WalletConnect/WalletConnectSwiftV2 :tag: 1.8.4 @@ -346,6 +346,6 @@ SPEC CHECKSUMS: TweetNacl: 3abf4d1d2082b0114e7a67410e300892448951e6 WalletConnectSwiftV2: c1c2c2fbd0495860baf71515be1b943f0c5dce0c -PODFILE CHECKSUM: 75971d0262ccc981143ad55dcbb8e88817f974fd +PODFILE CHECKSUM: a7018e359c7a7784791e7d860844d1b5ee793a5c COCOAPODS: 1.15.2 diff --git a/Tangem/App/Services/UserTokensManager/CommonUserTokensManager.swift b/Tangem/App/Services/UserTokensManager/CommonUserTokensManager.swift index 57cba74a82..3f7c00ed75 100644 --- a/Tangem/App/Services/UserTokensManager/CommonUserTokensManager.swift +++ b/Tangem/App/Services/UserTokensManager/CommonUserTokensManager.swift @@ -61,9 +61,10 @@ class CommonUserTokensManager { return tokenItem.blockchainNetwork } - private func addInternal(_ tokenItems: [TokenItem], shouldUpload: Bool) { - let entries = tokenItems.map { tokenItem in + private func addInternal(_ tokenItems: [TokenItem], shouldUpload: Bool) throws { + let entries = try tokenItems.map { tokenItem in let blockchainNetwork = getBlockchainNetwork(for: tokenItem) + try validateDerivation(for: tokenItem) return StorageEntry(blockchainNetwork: blockchainNetwork, token: tokenItem.token) } @@ -92,6 +93,14 @@ class CommonUserTokensManager { let tokenItems = converter.convertToTokenItem(nonCustomTokens) swapAvailabilityController.loadSwapAvailability(for: tokenItems, forceReload: forceReload, userWalletId: userWalletId.stringValue) } + + private func validateDerivation(for tokenItem: TokenItem) throws { + if let derivationPath = tokenItem.blockchainNetwork.derivationPath, + tokenItem.blockchain.curve == .ed25519_slip0010, + derivationPath.nodes.contains(where: { !$0.isHardened }) { + throw TangemSdkError.nonHardenedDerivationNotSupported + } + } } // MARK: - UserTokensManager protocol conformance @@ -144,6 +153,8 @@ extension CommonUserTokensManager: UserTokensManager { throw Error.failedSupportedLongHahesTokens(blockchainDisplayName: tokenItem.blockchain.displayName) } + try validateDerivation(for: tokenItem) + return } @@ -168,7 +179,12 @@ extension CommonUserTokensManager: UserTokensManager { } func add(_ tokenItems: [TokenItem], completion: @escaping (Result) -> Void) { - addInternal(tokenItems, shouldUpload: true) + do { + try addInternal(tokenItems, shouldUpload: true) + } catch { + completion(.failure(error.toTangemSdkError())) + return + } deriveIfNeeded(completion: completion) } @@ -192,16 +208,22 @@ extension CommonUserTokensManager: UserTokensManager { } func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem], completion: @escaping (Result) -> Void) { - update(itemsToRemove: itemsToRemove, itemsToAdd: itemsToAdd) + do { + try update(itemsToRemove: itemsToRemove, itemsToAdd: itemsToAdd) + } catch { + completion(.failure(error.toTangemSdkError())) + return + } + deriveIfNeeded(completion: completion) } - func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem]) { + func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem]) throws { itemsToRemove.forEach { removeInternal($0, shouldUpload: false) } - addInternal(itemsToAdd, shouldUpload: false) + try addInternal(itemsToAdd, shouldUpload: false) loadSwapAvailbilityStateIfNeeded(forceReload: true) userTokenListManager.upload() } diff --git a/Tangem/App/Services/UserTokensManager/LockedUserTokensManager.swift b/Tangem/App/Services/UserTokensManager/LockedUserTokensManager.swift index 7d1f2ea6ce..fd04bddffb 100644 --- a/Tangem/App/Services/UserTokensManager/LockedUserTokensManager.swift +++ b/Tangem/App/Services/UserTokensManager/LockedUserTokensManager.swift @@ -18,7 +18,7 @@ struct LockedUserTokensManager: UserTokensManager { func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem], completion: @escaping (Result) -> Void) {} - func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem]) {} + func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem]) throws {} func addTokenItemPrecondition(_ tokenItem: TokenItem) throws {} diff --git a/Tangem/App/Services/UserTokensManager/UserTokensManager.swift b/Tangem/App/Services/UserTokensManager/UserTokensManager.swift index 4cc906425e..1fb50c2805 100644 --- a/Tangem/App/Services/UserTokensManager/UserTokensManager.swift +++ b/Tangem/App/Services/UserTokensManager/UserTokensManager.swift @@ -27,7 +27,7 @@ protocol UserTokensManager: UserTokensReordering { /// Update storage with derivation func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem], completion: @escaping (Result) -> Void) /// Update storage without derivtion - func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem]) + func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem]) throws /// Check condition for adding token func addTokenItemPrecondition(_ tokenItem: TokenItem) throws diff --git a/Tangem/Modules/AddCustomToken/AddCustomTokenViewModel.swift b/Tangem/Modules/AddCustomToken/AddCustomTokenViewModel.swift index 734da55b0c..727c4d9aba 100644 --- a/Tangem/Modules/AddCustomToken/AddCustomTokenViewModel.swift +++ b/Tangem/Modules/AddCustomToken/AddCustomTokenViewModel.swift @@ -93,12 +93,12 @@ final class AddCustomTokenViewModel: ObservableObject, Identifiable { try checkLocalStorage() try userWalletModel.userTokensManager.addTokenItemPrecondition(tokenItem) + try userWalletModel.userTokensManager.update(itemsToRemove: [], itemsToAdd: [tokenItem]) } catch { self.error = error.alertBinder return } - userWalletModel.userTokensManager.update(itemsToRemove: [], itemsToAdd: [tokenItem]) logSuccess(tokenItem: tokenItem) closeModule() diff --git a/Tangem/Modules/ManageTokensNetworkSelector/ManageTokensNetworkSelectorViewModel.swift b/Tangem/Modules/ManageTokensNetworkSelector/ManageTokensNetworkSelectorViewModel.swift index 4c21b0a680..d30491a8d0 100644 --- a/Tangem/Modules/ManageTokensNetworkSelector/ManageTokensNetworkSelectorViewModel.swift +++ b/Tangem/Modules/ManageTokensNetworkSelector/ManageTokensNetworkSelectorViewModel.swift @@ -157,12 +157,12 @@ final class ManageTokensNetworkSelectorViewModel: Identifiable, ObservableObject } } - private func saveChanges() { + private func saveChanges() throws { guard let userTokensManager = dataSource.selectedUserWalletModel?.userTokensManager else { return } - userTokensManager.update( + try userTokensManager.update( itemsToRemove: pendingRemove, itemsToAdd: pendingAdd ) @@ -199,7 +199,7 @@ final class ManageTokensNetworkSelectorViewModel: Identifiable, ObservableObject } } - saveChanges() + try saveChanges() } private func bindSelection(_ tokenItem: TokenItem) -> Binding { diff --git a/Tangem/Preview Content/Fakes/FakeUserTokensManager.swift b/Tangem/Preview Content/Fakes/FakeUserTokensManager.swift index dbffdb52b1..9b11521160 100644 --- a/Tangem/Preview Content/Fakes/FakeUserTokensManager.swift +++ b/Tangem/Preview Content/Fakes/FakeUserTokensManager.swift @@ -48,7 +48,7 @@ class FakeUserTokensManager: UserTokensManager { completion(.success(())) } - func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem]) {} + func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem]) throws {} func canRemove(_ tokenItem: TokenItem) -> Bool { false diff --git a/Tangem/Preview Content/Mocks/UserTokensManagerMock.swift b/Tangem/Preview Content/Mocks/UserTokensManagerMock.swift index 5f913077ab..c4651d073d 100644 --- a/Tangem/Preview Content/Mocks/UserTokensManagerMock.swift +++ b/Tangem/Preview Content/Mocks/UserTokensManagerMock.swift @@ -18,7 +18,7 @@ struct UserTokensManagerMock: UserTokensManager { func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem], completion: @escaping (Result) -> Void) {} - func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem]) {} + func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem]) throws {} func addTokenItemPrecondition(_ tokenItem: TokenItem) throws {}