// // BalanceService.swift // OS Vault // // Author: Simon-Pierre Boucher // Mail: contact@spboucher.ai // import Foundation import BigInt /// Fetches the native ETH balance (gas money) plus every registered /// stablecoin's `balanceOf` for the current network. public struct Balances: Sendable { public var ethWei: BigUInt public var tokenUnits: [String: BigUInt] // keyed by token symbol public init(ethWei: BigUInt = 0, tokenUnits: [String: BigUInt] = [:]) { self.ethWei = ethWei self.tokenUnits = tokenUnits } } public enum BalanceService { public static func fetch(address: String, network: Network, rpc: RPCService) async throws -> Balances { var balances = Balances() balances.ethWei = try await rpc.balance(of: address) for token in Token.available(on: network) { guard let contract = token.address(on: network), let calldata = Hex.erc20BalanceOfData(owner: address) else { continue } let result = try await rpc.call(to: contract, data: calldata) balances.tokenUnits[token.symbol] = Hex.toBigUInt(result) ?? 0 } return balances } }