Skip to content

Commit 6087024

Browse files
authored
Merge pull request #2920 from tangem/IOS-5986_validate_derivation
IOS-5986 Validate derivation for edslip
2 parents c250cd5 + aa51fd1 commit 6087024

File tree

9 files changed

+41
-19
lines changed

9 files changed

+41
-19
lines changed

Podfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use_frameworks!
2424
inhibit_all_warnings!
2525

2626
def tangem_sdk_pod
27-
pod 'TangemSdk', :git => 'https://github.com/Tangem/tangem-sdk-ios.git', :tag => 'develop-282'
27+
pod 'TangemSdk', :git => 'https://github.com/Tangem/tangem-sdk-ios.git', :tag => 'develop-284'
2828
#pod 'TangemSdk', :path => '../tangem-sdk-ios'
2929
end
3030

Podfile.lock

+4-4
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ DEPENDENCIES:
219219
- Kingfisher (~> 7.9.0)
220220
- Moya
221221
- Solana.Swift (from `https://github.com/tangem/Solana.Swift`, tag `1.2.0-tangem1`)
222-
- TangemSdk (from `https://github.com/Tangem/tangem-sdk-ios.git`, tag `develop-282`)
222+
- TangemSdk (from `https://github.com/Tangem/tangem-sdk-ios.git`, tag `develop-284`)
223223
- WalletConnectSwiftV2 (from `https://github.com/WalletConnect/WalletConnectSwiftV2`, tag `1.8.4`)
224224

225225
SPEC REPOS:
@@ -276,7 +276,7 @@ EXTERNAL SOURCES:
276276
:tag: 1.2.0-tangem1
277277
TangemSdk:
278278
:git: https://github.com/Tangem/tangem-sdk-ios.git
279-
:tag: develop-282
279+
:tag: develop-284
280280
WalletConnectSwiftV2:
281281
:git: https://github.com/WalletConnect/WalletConnectSwiftV2
282282
:tag: 1.8.4
@@ -299,7 +299,7 @@ CHECKOUT OPTIONS:
299299
:tag: 1.2.0-tangem1
300300
TangemSdk:
301301
:git: https://github.com/Tangem/tangem-sdk-ios.git
302-
:tag: develop-282
302+
:tag: develop-284
303303
WalletConnectSwiftV2:
304304
:git: https://github.com/WalletConnect/WalletConnectSwiftV2
305305
:tag: 1.8.4
@@ -346,6 +346,6 @@ SPEC CHECKSUMS:
346346
TweetNacl: 3abf4d1d2082b0114e7a67410e300892448951e6
347347
WalletConnectSwiftV2: c1c2c2fbd0495860baf71515be1b943f0c5dce0c
348348

349-
PODFILE CHECKSUM: 75971d0262ccc981143ad55dcbb8e88817f974fd
349+
PODFILE CHECKSUM: a7018e359c7a7784791e7d860844d1b5ee793a5c
350350

351351
COCOAPODS: 1.15.2

Tangem/App/Services/UserTokensManager/CommonUserTokensManager.swift

+28-6
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,10 @@ class CommonUserTokensManager {
6161
return tokenItem.blockchainNetwork
6262
}
6363

64-
private func addInternal(_ tokenItems: [TokenItem], shouldUpload: Bool) {
65-
let entries = tokenItems.map { tokenItem in
64+
private func addInternal(_ tokenItems: [TokenItem], shouldUpload: Bool) throws {
65+
let entries = try tokenItems.map { tokenItem in
6666
let blockchainNetwork = getBlockchainNetwork(for: tokenItem)
67+
try validateDerivation(for: tokenItem)
6768
return StorageEntry(blockchainNetwork: blockchainNetwork, token: tokenItem.token)
6869
}
6970

@@ -92,6 +93,14 @@ class CommonUserTokensManager {
9293
let tokenItems = converter.convertToTokenItem(nonCustomTokens)
9394
swapAvailabilityController.loadSwapAvailability(for: tokenItems, forceReload: forceReload, userWalletId: userWalletId.stringValue)
9495
}
96+
97+
private func validateDerivation(for tokenItem: TokenItem) throws {
98+
if let derivationPath = tokenItem.blockchainNetwork.derivationPath,
99+
tokenItem.blockchain.curve == .ed25519_slip0010,
100+
derivationPath.nodes.contains(where: { !$0.isHardened }) {
101+
throw TangemSdkError.nonHardenedDerivationNotSupported
102+
}
103+
}
95104
}
96105

97106
// MARK: - UserTokensManager protocol conformance
@@ -144,6 +153,8 @@ extension CommonUserTokensManager: UserTokensManager {
144153
throw Error.failedSupportedLongHahesTokens(blockchainDisplayName: tokenItem.blockchain.displayName)
145154
}
146155

156+
try validateDerivation(for: tokenItem)
157+
147158
return
148159
}
149160

@@ -168,7 +179,12 @@ extension CommonUserTokensManager: UserTokensManager {
168179
}
169180

170181
func add(_ tokenItems: [TokenItem], completion: @escaping (Result<Void, TangemSdkError>) -> Void) {
171-
addInternal(tokenItems, shouldUpload: true)
182+
do {
183+
try addInternal(tokenItems, shouldUpload: true)
184+
} catch {
185+
completion(.failure(error.toTangemSdkError()))
186+
return
187+
}
172188
deriveIfNeeded(completion: completion)
173189
}
174190

@@ -192,16 +208,22 @@ extension CommonUserTokensManager: UserTokensManager {
192208
}
193209

194210
func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem], completion: @escaping (Result<Void, TangemSdkError>) -> Void) {
195-
update(itemsToRemove: itemsToRemove, itemsToAdd: itemsToAdd)
211+
do {
212+
try update(itemsToRemove: itemsToRemove, itemsToAdd: itemsToAdd)
213+
} catch {
214+
completion(.failure(error.toTangemSdkError()))
215+
return
216+
}
217+
196218
deriveIfNeeded(completion: completion)
197219
}
198220

199-
func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem]) {
221+
func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem]) throws {
200222
itemsToRemove.forEach {
201223
removeInternal($0, shouldUpload: false)
202224
}
203225

204-
addInternal(itemsToAdd, shouldUpload: false)
226+
try addInternal(itemsToAdd, shouldUpload: false)
205227
loadSwapAvailbilityStateIfNeeded(forceReload: true)
206228
userTokenListManager.upload()
207229
}

Tangem/App/Services/UserTokensManager/LockedUserTokensManager.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ struct LockedUserTokensManager: UserTokensManager {
1818

1919
func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem], completion: @escaping (Result<Void, TangemSdkError>) -> Void) {}
2020

21-
func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem]) {}
21+
func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem]) throws {}
2222

2323
func addTokenItemPrecondition(_ tokenItem: TokenItem) throws {}
2424

Tangem/App/Services/UserTokensManager/UserTokensManager.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ protocol UserTokensManager: UserTokensReordering {
2727
/// Update storage with derivation
2828
func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem], completion: @escaping (Result<Void, TangemSdkError>) -> Void)
2929
/// Update storage without derivtion
30-
func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem])
30+
func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem]) throws
3131

3232
/// Check condition for adding token
3333
func addTokenItemPrecondition(_ tokenItem: TokenItem) throws

Tangem/Modules/AddCustomToken/AddCustomTokenViewModel.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,12 @@ final class AddCustomTokenViewModel: ObservableObject, Identifiable {
9393
try checkLocalStorage()
9494

9595
try userWalletModel.userTokensManager.addTokenItemPrecondition(tokenItem)
96+
try userWalletModel.userTokensManager.update(itemsToRemove: [], itemsToAdd: [tokenItem])
9697
} catch {
9798
self.error = error.alertBinder
9899
return
99100
}
100101

101-
userWalletModel.userTokensManager.update(itemsToRemove: [], itemsToAdd: [tokenItem])
102102
logSuccess(tokenItem: tokenItem)
103103

104104
closeModule()

Tangem/Modules/ManageTokensNetworkSelector/ManageTokensNetworkSelectorViewModel.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -157,12 +157,12 @@ final class ManageTokensNetworkSelectorViewModel: Identifiable, ObservableObject
157157
}
158158
}
159159

160-
private func saveChanges() {
160+
private func saveChanges() throws {
161161
guard let userTokensManager = dataSource.selectedUserWalletModel?.userTokensManager else {
162162
return
163163
}
164164

165-
userTokensManager.update(
165+
try userTokensManager.update(
166166
itemsToRemove: pendingRemove,
167167
itemsToAdd: pendingAdd
168168
)
@@ -199,7 +199,7 @@ final class ManageTokensNetworkSelectorViewModel: Identifiable, ObservableObject
199199
}
200200
}
201201

202-
saveChanges()
202+
try saveChanges()
203203
}
204204

205205
private func bindSelection(_ tokenItem: TokenItem) -> Binding<Bool> {

Tangem/Preview Content/Fakes/FakeUserTokensManager.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class FakeUserTokensManager: UserTokensManager {
4848
completion(.success(()))
4949
}
5050

51-
func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem]) {}
51+
func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem]) throws {}
5252

5353
func canRemove(_ tokenItem: TokenItem) -> Bool {
5454
false

Tangem/Preview Content/Mocks/UserTokensManagerMock.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ struct UserTokensManagerMock: UserTokensManager {
1818

1919
func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem], completion: @escaping (Result<Void, TangemSdkError>) -> Void) {}
2020

21-
func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem]) {}
21+
func update(itemsToRemove: [TokenItem], itemsToAdd: [TokenItem]) throws {}
2222

2323
func addTokenItemPrecondition(_ tokenItem: TokenItem) throws {}
2424

0 commit comments

Comments
 (0)