getAssets

Retrieves a collection of assets (tokens and NFTs) for the specified blockchain.

Function Signature

public func getAssets(
    _ chainId: String
) async throws -> AssetsResponse

Parameters

  • chainId: The chain identifier in CAIP-2 format (e.g., "eip155:1" for Ethereum mainnet, "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp" for Solana mainnet)

Returns

An AssetsResponse object containing:

  • nativeBalance: Native token balance information (e.g., ETH for Ethereum)

    • balance: Current balance as string

    • decimals: Number of decimal places

    • name: Token name

    • symbol: Token symbol

    • rawBalance: Raw balance value

    • metadata: Contains token logo and thumbnail URLs

  • tokenBalances: Array of ERC20 token balances, each containing:

    • balance: Current balance as string

    • decimals: Number of decimal places

    • name: Token name

    • symbol: Token symbol

    • rawBalance: Raw balance value

    • metadata: Additional token information including:

      • tokenAddress: Contract address

      • verifiedContract: Contract verification status

      • totalSupply: Total token supply

      • percentageRelativeToTotalSupply: Holder's percentage of total supply

  • nfts: Array of NFT assets, each containing:

    • nftID: Unique identifier

    • name: NFT name

    • description: NFT description

    • imageURL: NFT image URL

    • chainID: Blockchain identifier

    • contractAddress: NFT contract address

    • tokenID: Token identifier

    • collection: Collection information

    • lastSale: Last sale information (price, currency, date)

    • rarity: Rarity information (rank and score)

    • floorPrice: Current floor price information

    • detailedInfo: Extended NFT information including:

      • Ownership details

      • Collection statistics

      • Marketplace information

      • Media previews and metadata

Example Usage

// Fetch and display all assets
do {
    let assets = try await portal.getAssets("eip155:1")
    
    // Display native token balance
    if let native = assets.nativeBalance {
        print("Native Token:")
        print("Name: \(native.name ?? "Unknown")")
        print("Balance: \(native.balance ?? "0")")
        print("Symbol: \(native.symbol ?? "?")")
    }
    
    // Display ERC20 token balances
    print("\nERC20 Tokens:")
    assets.tokenBalances?.forEach { token in
        guard let name = token.name,
              let symbol = token.symbol,
              let balance = token.balance else {
            return
        }
        print("\(name) (\(symbol)): \(balance)")
    }
    
    // Display NFTs with detailed information
    print("\nNFTs:")
    assets.nfts?.forEach { nft in
        print("\nNFT: \(nft.name ?? "Unnamed")")
        print("ID: \(nft.nftID ?? "Unknown")")
        
        if let lastSale = nft.lastSale,
           let price = lastSale.price,
           let currency = lastSale.currency {
            print("Last Sale: \(price) \(currency)")
        }
        
        if let floorPrice = nft.floorPrice,
           let price = floorPrice.price,
           let currency = floorPrice.currency {
            print("Floor Price: \(price) \(currency)")
        }
        
        // Display marketplace information
        nft.detailedInfo?.marketplaceInfo?.forEach { marketplace in
            if let name = marketplace.marketplaceName {
                print("Listed on: \(name)")
            }
        }
    }
} catch {
    print("Error fetching assets: \(error)")
}

// Example with portfolio value calculation
do {
    let assets = try await portal.getAssets("eip155:1")
    var totalValue = 0.0
    
    // Add native token value
    if let nativeBalance = assets.nativeBalance?.balance,
       let nativePrice = await getCurrentPrice(symbol: assets.nativeBalance?.symbol ?? "ETH"),
       let balance = Double(nativeBalance) {
        totalValue += balance * nativePrice
    }
    
    // Add ERC20 token values
    assets.tokenBalances?.forEach { token in
        if let balance = token.balance,
           let symbol = token.symbol,
           let price = await getCurrentPrice(symbol: symbol),
           let balanceValue = Double(balance) {
            totalValue += balanceValue * price
        }
    }
    
    // Add NFT values using floor prices
    assets.nfts?.forEach { nft in
        if let floorPrice = nft.floorPrice?.price {
            totalValue += floorPrice
        }
    }
    
    print("Total Portfolio Value: $\(String(format: "%.2f", totalValue))")
} catch {
    print("Error calculating portfolio value: \(error)")
}

Implementation Notes

  • All balance fields are optional and should be safely unwrapped

  • Token balances are returned as strings to maintain precision

  • NFT data includes extensive metadata useful for marketplace integration

Last updated

Was this helpful?