From 6a56536b5a610c47d44ff2316541876d2e9ae5ce Mon Sep 17 00:00:00 2001 From: Radmir Date: Mon, 10 Aug 2026 13:14:08 +0800 Subject: [PATCH] Resolve names through the API client directly The name service only forwarded its single call to the API client, and the protocol it conformed to duplicated one that already existed in Primitives. --- ios/Features/Contacts/Package.swift | 2 -- .../ManageContactAddressViewModelTests.swift | 1 - .../ManageContactViewModelTests.swift | 1 - ios/Features/Onboarding/Package.swift | 2 -- .../ImportWalletSceneViewModel.swift | 1 - .../ImportWalletSceneViewModelTests.swift | 1 - ios/Features/Transfer/Package.swift | 2 -- .../ViewModels/RecipientSceneViewModel.swift | 1 - .../Tests/RecipientSceneViewModelTests.swift | 1 - ios/Gem/Services/AppResolver+Services.swift | 8 ++++---- ios/Gem/Services/ServicesFactory.swift | 6 ++---- ios/Gem/Services/ViewModelFactory.swift | 5 ++--- ios/Gem/Types/Environment.swift | 6 +++--- ios/Gem/ViewModels/RootSceneViewModel.swift | 5 ++--- .../NameService/NameService.swift | 17 ----------------- ios/Packages/ChainServices/Package.swift | 19 ------------------- .../GemAPI/Sources/GemAPIService.swift | 6 +----- .../NameServiceable+PrimitivesTestKit.swift} | 15 ++++----------- 18 files changed, 18 insertions(+), 81 deletions(-) delete mode 100644 ios/Packages/ChainServices/NameService/NameService.swift rename ios/Packages/{ChainServices/NameService/TestKit/NameService+TestKit.swift => Primitives/TestKit/NameServiceable+PrimitivesTestKit.swift} (50%) diff --git a/ios/Features/Contacts/Package.swift b/ios/Features/Contacts/Package.swift index 41b779b79e..dec220b682 100644 --- a/ios/Features/Contacts/Package.swift +++ b/ios/Features/Contacts/Package.swift @@ -41,7 +41,6 @@ let package = Package( "GemstonePrimitives", "QRScanner", .product(name: "ContactService", package: "FeatureServices"), - .product(name: "NameService", package: "ChainServices"), ], path: "Sources", ), @@ -54,7 +53,6 @@ let package = Package( .product(name: "PrimitivesTestKit", package: "Primitives"), .product(name: "StoreTestKit", package: "Store"), .product(name: "ContactService", package: "FeatureServices"), - .product(name: "NameServiceTestKit", package: "ChainServices"), ], ), ], diff --git a/ios/Features/Contacts/Tests/ContactsTests/ManageContactAddressViewModelTests.swift b/ios/Features/Contacts/Tests/ContactsTests/ManageContactAddressViewModelTests.swift index 02252b57a0..5f5215d67d 100644 --- a/ios/Features/Contacts/Tests/ContactsTests/ManageContactAddressViewModelTests.swift +++ b/ios/Features/Contacts/Tests/ContactsTests/ManageContactAddressViewModelTests.swift @@ -2,7 +2,6 @@ import Components @testable import Contacts -import NameServiceTestKit import Primitives import PrimitivesTestKit import Testing diff --git a/ios/Features/Contacts/Tests/ContactsTests/ManageContactViewModelTests.swift b/ios/Features/Contacts/Tests/ContactsTests/ManageContactViewModelTests.swift index 4031a36429..b012fe93f7 100644 --- a/ios/Features/Contacts/Tests/ContactsTests/ManageContactViewModelTests.swift +++ b/ios/Features/Contacts/Tests/ContactsTests/ManageContactViewModelTests.swift @@ -3,7 +3,6 @@ import Components @testable import Contacts import ContactService -import NameServiceTestKit import Primitives import PrimitivesTestKit import StoreTestKit diff --git a/ios/Features/Onboarding/Package.swift b/ios/Features/Onboarding/Package.swift index a8225ed493..fc8976d7b5 100644 --- a/ios/Features/Onboarding/Package.swift +++ b/ios/Features/Onboarding/Package.swift @@ -40,7 +40,6 @@ let package = Package( "Style", "Localization", "PrimitivesComponents", - .product(name: "NameService", package: "ChainServices"), "QRScanner", "Keystore", .product(name: "WalletService", package: "FeatureServices"), @@ -61,7 +60,6 @@ let package = Package( .product(name: "WalletSessionService", package: "FeatureServices"), .product(name: "WalletSessionServiceTestKit", package: "FeatureServices"), .product(name: "KeystoreTestKit", package: "Keystore"), - .product(name: "NameServiceTestKit", package: "ChainServices"), .product(name: "StoreTestKit", package: "Store"), ], path: "Tests", diff --git a/ios/Features/Onboarding/Sources/ViewModels/ImportWalletSceneViewModel.swift b/ios/Features/Onboarding/Sources/ViewModels/ImportWalletSceneViewModel.swift index 118c6e8656..8a454ab9ee 100644 --- a/ios/Features/Onboarding/Sources/ViewModels/ImportWalletSceneViewModel.swift +++ b/ios/Features/Onboarding/Sources/ViewModels/ImportWalletSceneViewModel.swift @@ -4,7 +4,6 @@ import GemstonePrimitives import enum Keystore.KeystoreImportType import enum Keystore.Mnemonic import Localization -import NameService import Primitives import PrimitivesComponents import Style diff --git a/ios/Features/Onboarding/Tests/ImportWalletSceneViewModelTests.swift b/ios/Features/Onboarding/Tests/ImportWalletSceneViewModelTests.swift index 64ef93515c..103f2e10cb 100644 --- a/ios/Features/Onboarding/Tests/ImportWalletSceneViewModelTests.swift +++ b/ios/Features/Onboarding/Tests/ImportWalletSceneViewModelTests.swift @@ -2,7 +2,6 @@ import Keystore import KeystoreTestKit -import NameServiceTestKit @testable import Onboarding import Primitives import PrimitivesTestKit diff --git a/ios/Features/Transfer/Package.swift b/ios/Features/Transfer/Package.swift index 0ea7735f00..99d7a70f08 100644 --- a/ios/Features/Transfer/Package.swift +++ b/ios/Features/Transfer/Package.swift @@ -80,7 +80,6 @@ let package = Package( .product(name: "EarnService", package: "FeatureServices"), .product(name: "PerpetualService", package: "FeatureServices"), .product(name: "ExplorerService", package: "ChainServices"), - .product(name: "NameService", package: "ChainServices"), .product(name: "AddressNameService", package: "FeatureServices"), .product(name: "ActivityService", package: "FeatureServices"), .product(name: "FiatService", package: "FeatureServices"), @@ -109,7 +108,6 @@ let package = Package( .product(name: "KeystoreTestKit", package: "Keystore"), .product(name: "WalletSessionService", package: "FeatureServices"), .product(name: "WalletSessionServiceTestKit", package: "FeatureServices"), - .product(name: "NameServiceTestKit", package: "ChainServices"), .product(name: "NodeServiceTestKit", package: "ChainServices"), .product(name: "PriceServiceTestKit", package: "FeatureServices"), .product(name: "AssetsServiceTestKit", package: "FeatureServices"), diff --git a/ios/Features/Transfer/Sources/ViewModels/RecipientSceneViewModel.swift b/ios/Features/Transfer/Sources/ViewModels/RecipientSceneViewModel.swift index ed737b5e19..7533c6e6e0 100644 --- a/ios/Features/Transfer/Sources/ViewModels/RecipientSceneViewModel.swift +++ b/ios/Features/Transfer/Sources/ViewModels/RecipientSceneViewModel.swift @@ -6,7 +6,6 @@ import Foundation import GemstonePrimitives import Keystore import Localization -import NameService import NodeService import Primitives import PrimitivesComponents diff --git a/ios/Features/Transfer/Tests/RecipientSceneViewModelTests.swift b/ios/Features/Transfer/Tests/RecipientSceneViewModelTests.swift index b068cac662..4b1098eb12 100644 --- a/ios/Features/Transfer/Tests/RecipientSceneViewModelTests.swift +++ b/ios/Features/Transfer/Tests/RecipientSceneViewModelTests.swift @@ -3,7 +3,6 @@ import BigInt import Components import Formatters -import NameServiceTestKit import Primitives import PrimitivesTestKit import Testing diff --git a/ios/Gem/Services/AppResolver+Services.swift b/ios/Gem/Services/AppResolver+Services.swift index b0c6cb6b7d..6ebbb8baa0 100644 --- a/ios/Gem/Services/AppResolver+Services.swift +++ b/ios/Gem/Services/AppResolver+Services.swift @@ -17,16 +17,16 @@ import EventPresenterService import ExplorerService import FiatService import Foundation -import NameService import NFTService import NodeService import NotificationService import PerpetualService import PriceAlertService import PriceService +import Primitives import RewardsService -import ServiceStatusService import ScanService +import ServiceStatusService import StakeService import StreamService import SupportChatService @@ -79,7 +79,7 @@ extension AppResolver { let walletConnectorManager: WalletConnectorManager let perpetualService: PerpetualService let hyperliquidObserverService: any PerpetualObservable - let nameService: NameService + let nameService: any NameServiceable let addressNameService: AddressNameService let activityService: ActivityService let eventPresenterService: EventPresenterService @@ -134,7 +134,7 @@ extension AppResolver { walletConnectorManager: WalletConnectorManager, perpetualService: PerpetualService, hyperliquidObserverService: any PerpetualObservable, - nameService: NameService, + nameService: any NameServiceable, addressNameService: AddressNameService, activityService: ActivityService, eventPresenterService: EventPresenterService, diff --git a/ios/Gem/Services/ServicesFactory.swift b/ios/Gem/Services/ServicesFactory.swift index 3a8865762b..dd9d0a0106 100644 --- a/ios/Gem/Services/ServicesFactory.swift +++ b/ios/Gem/Services/ServicesFactory.swift @@ -24,7 +24,6 @@ import GemAPI import GemAPIDevice import GemstonePrimitives import Keystore -import NameService import NativeProviderService import NFTService import NodeService @@ -288,7 +287,6 @@ struct ServicesFactory { perpetualService: perpetualService, ) - let nameService = NameService(provider: apiService) let scanService = ScanService(apiService: apiService) let addressNameService = AddressNameService(addressStore: storeManager.addressStore, apiService: apiService) let activityService = ActivityService(store: storeManager.recentActivityStore) @@ -335,7 +333,7 @@ struct ServicesFactory { stakeService: stakeService, earnService: earnService, amountService: AmountService(earnDataProvider: earnService), - nameService: nameService, + nameService: apiService, balanceService: balanceService, priceService: priceService, transactionStateScheduler: transactionStateScheduler, @@ -390,7 +388,7 @@ struct ServicesFactory { walletConnectorManager: walletConnectorManager, perpetualService: perpetualService, hyperliquidObserverService: hyperliquidObserverService, - nameService: nameService, + nameService: apiService, addressNameService: addressNameService, activityService: activityService, eventPresenterService: eventPresenterService, diff --git a/ios/Gem/Services/ViewModelFactory.swift b/ios/Gem/Services/ViewModelFactory.swift index 919e8139c4..ab761d522c 100644 --- a/ios/Gem/Services/ViewModelFactory.swift +++ b/ios/Gem/Services/ViewModelFactory.swift @@ -12,7 +12,6 @@ import FiatConnect import FiatService import Foundation import Keystore -import NameService import PerpetualService import Preferences import PriceAlertService @@ -44,7 +43,7 @@ public struct ViewModelFactory: Sendable { let stakeService: StakeService let earnService: EarnService let amountService: AmountService - let nameService: NameService + let nameService: any NameServiceable let balanceService: BalanceService let priceService: PriceService let transactionStateScheduler: TransactionStateScheduler @@ -69,7 +68,7 @@ public struct ViewModelFactory: Sendable { stakeService: StakeService, earnService: EarnService, amountService: AmountService, - nameService: NameService, + nameService: any NameServiceable, balanceService: BalanceService, priceService: PriceService, transactionStateScheduler: TransactionStateScheduler, diff --git a/ios/Gem/Types/Environment.swift b/ios/Gem/Types/Environment.swift index 7ae2a6117b..d414751453 100644 --- a/ios/Gem/Types/Environment.swift +++ b/ios/Gem/Types/Environment.swift @@ -18,16 +18,16 @@ import ExplorerService import Foundation import GRDB import Keystore -import NameService import NFTService import NodeService import NotificationService import PerpetualService import PriceAlertService import PriceService +import Primitives import RewardsService -import ServiceStatusService import ScanService +import ServiceStatusService import StakeService import Store import StreamService @@ -71,7 +71,7 @@ extension EnvironmentValues { @Entry var perpetualService: PerpetualService = AppResolver.main.services.perpetualService @Entry var hyperliquidObserverService: any PerpetualObservable = AppResolver.main.services.hyperliquidObserverService @Entry var transactionStateScheduler: TransactionStateScheduler = AppResolver.main.services.transactionStateScheduler - @Entry var nameService: NameService = AppResolver.main.services.nameService + @Entry var nameService: any NameServiceable = AppResolver.main.services.nameService @Entry var addressNameService: AddressNameService = AppResolver.main.services.addressNameService @Entry var activityService: ActivityService = AppResolver.main.services.activityService @Entry var eventPresenterService: EventPresenterService = AppResolver.main.services.eventPresenterService diff --git a/ios/Gem/ViewModels/RootSceneViewModel.swift b/ios/Gem/ViewModels/RootSceneViewModel.swift index 213cdb75b6..ab8d5f987d 100644 --- a/ios/Gem/ViewModels/RootSceneViewModel.swift +++ b/ios/Gem/ViewModels/RootSceneViewModel.swift @@ -10,7 +10,6 @@ import Foundation import GemstonePrimitives import Localization import LockManager -import NameService import Onboarding import Preferences import Primitives @@ -39,7 +38,7 @@ final class RootSceneViewModel { let walletSetupService: WalletSetupService let walletService: WalletService let walletSessionService: any WalletSessionManageable - let nameService: NameService + let nameService: any NameServiceable let avatarService: AvatarService let walletConnectorPresenter: WalletConnectorPresenter let lockManager: any LockWindowManageable @@ -89,7 +88,7 @@ final class RootSceneViewModel { walletService: WalletService, walletSessionService: any WalletSessionManageable, walletSetupService: WalletSetupService, - nameService: NameService, + nameService: any NameServiceable, releaseAlertService: ReleaseAlertService, rateService: RateService, eventPresenterService: EventPresenterService, diff --git a/ios/Packages/ChainServices/NameService/NameService.swift b/ios/Packages/ChainServices/NameService/NameService.swift deleted file mode 100644 index d157d3a50a..0000000000 --- a/ios/Packages/ChainServices/NameService/NameService.swift +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c). Gem Wallet. All rights reserved. - -import Foundation -import GemAPI -import Primitives - -public final class NameService: NameServiceable, Sendable { - private let provider: any GemAPINameService - - public init(provider: any GemAPINameService) { - self.provider = provider - } - - public func getName(name: String, chain: String) async throws -> NameRecord? { - try await provider.getName(name: name, chain: chain) - } -} diff --git a/ios/Packages/ChainServices/Package.swift b/ios/Packages/ChainServices/Package.swift index 66a228f535..86cf4db4f9 100644 --- a/ios/Packages/ChainServices/Package.swift +++ b/ios/Packages/ChainServices/Package.swift @@ -9,8 +9,6 @@ let package = Package( .macOS(.v15), ], products: [ - .library(name: "NameService", targets: ["NameService"]), - .library(name: "NameServiceTestKit", targets: ["NameServiceTestKit"]), .library(name: "StakeService", targets: ["StakeService"]), .library(name: "StakeServiceTestKit", targets: ["StakeServiceTestKit"]), .library(name: "NodeService", targets: ["NodeService"]), @@ -35,23 +33,6 @@ let package = Package( .package(name: "reown-swift", path: "../../Submodules/reown-swift"), ], targets: [ - .target( - name: "NameService", - dependencies: [ - "Primitives", - "GemAPI", - ], - path: "NameService", - exclude: ["TestKit"], - ), - .target( - name: "NameServiceTestKit", - dependencies: [ - "NameService", - .product(name: "PrimitivesTestKit", package: "Primitives"), - ], - path: "NameService/TestKit", - ), .target( name: "StakeService", dependencies: [ diff --git a/ios/Packages/GemAPI/Sources/GemAPIService.swift b/ios/Packages/GemAPI/Sources/GemAPIService.swift index 9056ed8642..b2a542eedf 100644 --- a/ios/Packages/GemAPI/Sources/GemAPIService.swift +++ b/ios/Packages/GemAPI/Sources/GemAPIService.swift @@ -37,10 +37,6 @@ public extension GemAPIAssetsService { } } -public protocol GemAPINameService: Sendable { - func getName(name: String, chain: String) async throws -> NameRecord? -} - public protocol GemAPIAddressNamesService: Sendable { func getAddressNames(requests: [ChainAddress]) async throws -> [AddressName] } @@ -178,7 +174,7 @@ extension GemAPIService: GemAPIConfigService { } } -extension GemAPIService: GemAPINameService { +extension GemAPIService: NameServiceable { public func getName(name: String, chain: String) async throws -> NameRecord? { try await requestDevice(.getNameRecord(name: name, chain: chain)) .mapResponse(as: NameRecord?.self) diff --git a/ios/Packages/ChainServices/NameService/TestKit/NameService+TestKit.swift b/ios/Packages/Primitives/TestKit/NameServiceable+PrimitivesTestKit.swift similarity index 50% rename from ios/Packages/ChainServices/NameService/TestKit/NameService+TestKit.swift rename to ios/Packages/Primitives/TestKit/NameServiceable+PrimitivesTestKit.swift index b8a4f7d5e6..b2f7dbf494 100644 --- a/ios/Packages/ChainServices/NameService/TestKit/NameService+TestKit.swift +++ b/ios/Packages/Primitives/TestKit/NameServiceable+PrimitivesTestKit.swift @@ -1,25 +1,18 @@ // Copyright (c). Gem Wallet. All rights reserved. import Foundation -@testable import NameService -import Primitives -import PrimitivesTestKit +@testable import Primitives public extension NameServiceable where Self == MockNameService { - static func mock( - canResolve: Bool = true, - nameRecord: NameRecord? = nil, - ) -> MockNameService { - MockNameService(canResolve: canResolve, nameRecord: nameRecord) + static func mock(nameRecord: NameRecord? = nil) -> MockNameService { + MockNameService(nameRecord: nameRecord) } } public struct MockNameService: NameServiceable { - let canResolve: Bool let nameRecord: NameRecord? - public init(canResolve: Bool = true, nameRecord: NameRecord? = nil) { - self.canResolve = canResolve + public init(nameRecord: NameRecord? = nil) { self.nameRecord = nameRecord }