Copy public func getBalances(
_ chainId: String
) async throws -> [FetchedBalance]
Copy // Basic balance check
do {
// Get Ethereum balances
let ethBalances = try await portal.getBalances("eip155:1")
for balance in ethBalances {
print("Token: \(balance.symbol)")
print("Balance: \(balance.balance)")
print("Decimals: \(balance.decimals)")
}
// Get Solana balances
let solBalances = try await portal.getBalances("solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp")
for balance in solBalances {
print("Token: \(balance.symbol)")
print("Balance: \(balance.balance)")
}
} catch {
print("Error fetching balances: \(error)")
}
// Complete example with balance formatting
do {
let balances = try await portal.getBalances("eip155:1")
// Format and display balances
for balance in balances {
// Parse and format the balance string
if let balanceValue = Double(balance.balance) {
// Format with appropriate decimal places
let formatter = NumberFormatter()
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 6
if let formatted = formatter.string(from: NSNumber(value: balanceValue)),
let symbol = balance.symbol {
print("\(symbol): \(formatted)")
}
}
}
} catch {
print("Error processing balances: \(error)")
}
// Example with balance monitoring
class BalanceMonitor {
private var timer: Timer?
private let portal: Portal
private let chainId: String
init(portal: Portal, chainId: String) {
self.portal = portal
self.chainId = chainId
}
func startMonitoring() {
// Check balances every 30 seconds
timer = Timer.scheduledTimer(withTimeInterval: 30, repeats: true) { [weak self] _ in
Task {
await self?.checkBalances()
}
}
}
private func checkBalances() async {
do {
let balances = try await portal.getBalances(chainId)
// Process and display balances
for balance in balances {
if balance.balance > 0 {
print("New balance for \(balance.symbol): \(balance.balance)")
}
}
} catch {
print("Balance check failed: \(error)")
}
}
func stopMonitoring() {
timer?.invalidate()
timer = nil
}
}
Copy func calculatePortfolioValue(balances: [FetchedBalance], prices: [String: Double]) -> Double {
return balances.reduce(0) { total, balance in
guard
let symbol = balance.symbol,
let balanceValue = Double(balance.balance)
else { return total }
return total + (balanceValue * (prices[symbol] ?? 0))
}
}
// Usage example
do {
let balances = try await portal.getBalances("eip155:1")
let prices = try await fetchCurrentPrices() // Your price fetching implementation
let portfolioValue = calculatePortfolioValue(balances: balances, prices: prices)
print("Total portfolio value: $\(portfolioValue)")
} catch {
print("Error calculating portfolio value: \(error)")
}