Skip to content

[Wallet/iOS] Fix #35986: Persist balance in Portfolio Assets #22029

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Feb 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ struct AddCustomAssetView: View {
@ObservedObject var userAssetStore: UserAssetsStore
var tokenNeedsTokenId: BraveWallet.BlockchainToken?
var supportedTokenTypes: [TokenType] = [.token, .nft]
var onNewAssetAdded: (() -> Void)?

@Environment(\.presentationMode) @Binding private var presentationMode

Expand Down Expand Up @@ -377,7 +376,6 @@ struct AddCustomAssetView: View {
}
userAssetStore.addUserAsset(token) { [self] success in
if success {
onNewAssetAdded?()
presentationMode.dismiss()
} else {
showError = true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ struct EditUserAssetsView: View {
var networkStore: NetworkStore
var keyringStore: KeyringStore
@ObservedObject var userAssetsStore: UserAssetsStore
var assetsUpdated: () -> Void

@Environment(\.presentationMode) @Binding private var presentationMode
@State private var query = ""
Expand Down Expand Up @@ -173,7 +172,6 @@ struct EditUserAssetsView: View {
}
ToolbarItemGroup(placement: .confirmationAction) {
Button(action: {
assetsUpdated()
presentationMode.dismiss()
}) {
Text(Strings.done)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,7 @@ struct PortfolioView: View {
networkStore: networkStore,
keyringStore: keyringStore,
userAssetsStore: portfolioStore.userAssetsStore
) {
cryptoStore.updateAssets()
}
)
})
.background(Color.clear
.sheet(isPresented: $isPresentingAssetsFilters) {
Expand Down Expand Up @@ -93,9 +91,7 @@ struct PortfolioView: View {
keyringStore: keyringStore,
userAssetStore: cryptoStore.nftStore.userAssetsStore,
supportedTokenTypes: [.nft]
) {
cryptoStore.updateAssets()
}
)
})
.background(Color.clear
.sheet(isPresented: $isPresentingNFTsFilters) {
Expand Down
37 changes: 25 additions & 12 deletions ios/brave-ios/Sources/BraveWallet/Crypto/Stores/CryptoStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,12 @@ public class CryptoStore: ObservableObject, WalletObserverStore {
self.ethTxManagerProxy = ethTxManagerProxy
self.solTxManagerProxy = solTxManagerProxy
self.ipfsApi = ipfsApi
self.userAssetManager = WalletUserAssetManager(rpcService: rpcService, walletService: walletService)
self.userAssetManager = WalletUserAssetManager(
keyringService: keyringService,
rpcService: rpcService,
walletService: walletService,
txService: txService
)
self.origin = origin

self.networkStore = .init(
Expand Down Expand Up @@ -246,7 +251,7 @@ public class CryptoStore: ObservableObject, WalletObserverStore {
guard let isUpdatingUserAssets = self?.isUpdatingUserAssets, !isUpdatingUserAssets else { return }
self?.isUpdatingUserAssets = true
Preferences.Wallet.migrateCoreToWalletUserAssetCompleted.reset()
WalletUserAssetGroup.removeAllGroup() {
self?.userAssetManager.removeUserAssetsAndBalance(for: nil) {
self?.userAssetManager.migrateUserAssets(completion: {
self?.updateAssets()
self?.isUpdatingUserAssets = false
Expand Down Expand Up @@ -334,6 +339,9 @@ public class CryptoStore: ObservableObject, WalletObserverStore {
marketStore.setupObservers()
settingsStore.setupObservers()

// user asset manager's observers
userAssetManager.setupObservers()

accountActivityStore?.setupObservers()
assetDetailStore?.setupObservers()
nftDetailStore?.setupObservers()
Expand All @@ -343,7 +351,7 @@ public class CryptoStore: ObservableObject, WalletObserverStore {
swapTokenStore?.setupObservers()
}

// A manual tear-down that nil all the wallet service observer classes
// A manual tear-down that nil all the wallet service observer classes
public func tearDown() {
keyringServiceObserver = nil
walletServiceObserver = nil
Expand All @@ -358,6 +366,9 @@ public class CryptoStore: ObservableObject, WalletObserverStore {
marketStore.tearDown()
settingsStore.tearDown()

// user asset manager
userAssetManager.tearDown()

accountActivityStore?.tearDown()
assetDetailStore?.tearDown()
nftDetailStore?.tearDown()
Expand Down Expand Up @@ -561,7 +572,7 @@ public class CryptoStore: ObservableObject, WalletObserverStore {
}
let store = SignMessageRequestStore(
requests: requests,
keyringService: keyringService,
keyringService: keyringService,
rpcService: rpcService,
assetRatioService: assetRatioService,
blockchainRegistry: blockchainRegistry,
Expand Down Expand Up @@ -591,11 +602,13 @@ public class CryptoStore: ObservableObject, WalletObserverStore {
}

func updateAutoDiscoveredAssets() {
// at this point, all auto-discovered assets have been added to CD
// update `Portfolio/Assets`
portfolioStore.update()
// fetch junk NFTs from SimpleHash which will also update `Portfolio/NFTs`
nftStore.fetchJunkNFTs()
// at this point, all auto-discovered assets have been added to CD. We now need to fetch and cache their balance
userAssetManager.refreshBalances { [weak self] in
// update `Portfolio/Assets`
self?.portfolioStore.update()
// fetch junk NFTs from SimpleHash which will also update `Portfolio/NFTs`
self?.nftStore.fetchJunkNFTs()
}
}

func prepare(isInitialOpen: Bool = false) {
Expand Down Expand Up @@ -633,7 +646,7 @@ public class CryptoStore: ObservableObject, WalletObserverStore {
self.pendingRequest = newPendingRequest
}
}

@MainActor
func fetchPendingTransactions() async -> [BraveWallet.TransactionInfo] {
let allAccounts = await keyringService.allAccounts().accounts
Expand All @@ -644,7 +657,7 @@ public class CryptoStore: ObservableObject, WalletObserverStore {
}
return await txService.pendingTransactions(networksForCoin: allNetworksForCoin, for: allAccounts)
}

@MainActor
func fetchPendingWebpageRequest() async -> PendingRequest? {
if let chainRequest = await rpcService.pendingAddChainRequests().first {
Expand Down Expand Up @@ -688,7 +701,7 @@ public class CryptoStore: ObservableObject, WalletObserverStore {
}
return pendingRequest != nil
}

// Helper to store the completion block of an Add Network dapp request.
typealias AddNetworkCompletion = (_ error: String?) -> Void
// The completion closure(s) are handled in `onAddEthereumChainRequestCompleted`
Expand Down
22 changes: 19 additions & 3 deletions ios/brave-ios/Sources/BraveWallet/Crypto/Stores/NFTStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ public class NFTStore: ObservableObject, WalletObserverStore {
}
}
}

/// Current group to display
@Published var displayType: NFTDisplayType = .visible
/// View model for all NFT include visible, hidden and spams
Expand Down Expand Up @@ -194,6 +194,9 @@ public class NFTStore: ObservableObject, WalletObserverStore {
self.assetManager = userAssetManager
self.txService = txService

// user asset data update observer
self.assetManager.addUserAssetDataObserver(self)

self.setupObservers()

keyringService.isLocked { [self] isLocked in
Expand Down Expand Up @@ -267,6 +270,9 @@ public class NFTStore: ObservableObject, WalletObserverStore {
func update(forceUpdateNFTBalances: Bool = false) {
self.updateTask?.cancel()
self.updateTask = Task { @MainActor in
let isLocked = await keyringService.isLocked()
guard !isLocked else { return } // `update() will be called after unlock`

self.allAccounts = await keyringService.allAccounts().accounts
.filter { account in
WalletConstants.supportedCoinTypes().contains(account.coin)
Expand Down Expand Up @@ -544,7 +550,7 @@ public class NFTStore: ObservableObject, WalletObserverStore {
)

let allUserNFTs = (userVisibleNFTs + userHiddenNFTs + spams).flatMap(\.tokens)

let groups: [NFTGroupViewModel]
switch filters.groupBy {
case .none:
Expand Down Expand Up @@ -623,7 +629,7 @@ public class NFTStore: ObservableObject, WalletObserverStore {
guard let self else { return }
let selectedAccounts = self.filters.accounts.filter(\.isSelected).map(\.model)
let selectedNetworks = self.filters.networks.filter(\.isSelected).map(\.model)

let unionedSpamNFTs = computeSpamNFTs(
selectedNetworks: selectedNetworks,
selectedAccounts: selectedAccounts,
Expand Down Expand Up @@ -662,6 +668,16 @@ extension NFTStore: PreferencesObserver {
}
}

extension NFTStore: WalletUserAssetDataObserver {
public func cachedBalanceRefreshed() {
update()
}

public func userAssetUpdated() {
update()
}
}

private extension Array where Element == NFTAssetViewModel {
/// Optionally filters out NFTs not belonging to the given `selectedAccounts`.
func optionallyFilterUnownedNFTs(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -310,8 +310,8 @@ public class NetworkStore: ObservableObject, WalletObserverStore {
if network.id.lowercased() == defaultSelectedChainId.lowercased() {
rpcService.setNetwork(BraveWallet.MainnetChainId, coin: .eth, origin: nil, completion: { _ in })
}
// delete local stored user assets that in this custom network
assetManager.removeGroup(for: network.walletUserAssetGroupId, completion: nil)
// delete local stored user assets' balances that in this custom network
assetManager.removeUserAssetsAndBalance(for: network, completion: nil)
Task {
await updateChainList()
}
Expand Down
Loading