Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.privacyboost.io/llms.txt

Use this file to discover all available pages before exploring further.

Transaction History

This guide covers querying and filtering transaction history in the Privacy Boost iOS SDK.

Basic Usage

do {
    let transactions = try await sdk.getTransactionHistory(
        txType: nil,
        tokenAddress: nil,
        limit: nil
    )

    for tx in transactions {
        print("\(tx.txType): \(tx.amount) - \(tx.txHash)")
    }
} catch {
    print("Failed to get history: \(error)")
}

Transaction Type

struct Transaction {
    let txHash: String           // Transaction hash
    let txType: String           // "deposit", "withdraw", or "transfer"
    let tokenAddress: String     // Token contract address
    let amount: String           // Amount in wei
    let direction: String        // "incoming" or "outgoing"
    let senderPubKey: String     // Sender's public key
    let receiverPubKeys: [String] // Receiver public keys
    let createdAt: UInt64        // Unix timestamp
}

Filtering History

By Transaction Type

// Only deposits
let deposits = try await sdk.getTransactionHistory(
    txType: "deposit",
    tokenAddress: nil,
    limit: nil
)

// Only withdrawals
let withdrawals = try await sdk.getTransactionHistory(
    txType: "withdraw",
    tokenAddress: nil,
    limit: nil
)

// Only transfers
let transfers = try await sdk.getTransactionHistory(
    txType: "transfer",
    tokenAddress: nil,
    limit: nil
)

By Token

let usdcHistory = try await sdk.getTransactionHistory(
    txType: nil,
    tokenAddress: "0x...usdc-address",
    limit: nil
)

With Limit

// Get last 10 transactions
let recent = try await sdk.getTransactionHistory(
    txType: nil,
    tokenAddress: nil,
    limit: 10
)

Combined Filters

// Last 5 USDC deposits
let recentUsdcDeposits = try await sdk.getTransactionHistory(
    txType: "deposit",
    tokenAddress: "0x...usdc-address",
    limit: 5
)

Filter Parameters

ParameterTypeDescription
txTypeString?Filter by type: "deposit", "withdraw", "transfer"
tokenAddressString?Filter by token contract address
limitUInt32?Maximum number of results

Displaying Transactions in SwiftUI

struct TransactionHistoryView: View {
    @State private var transactions: [Transaction] = []
    @State private var isLoading = true
    @State private var selectedFilter = "all"

    let filters = ["all", "deposit", "withdraw", "transfer"]

    var body: some View {
        VStack {
            // Filter picker
            Picker("Filter", selection: $selectedFilter) {
                ForEach(filters, id: \.self) { filter in
                    Text(filter.capitalized).tag(filter)
                }
            }
            .pickerStyle(.segmented)
            .padding(.horizontal)

            // Transaction list
            List {
                if isLoading {
                    ProgressView("Loading transactions...")
                } else if transactions.isEmpty {
                    Text("No transactions found")
                        .foregroundColor(.secondary)
                } else {
                    ForEach(transactions, id: \.txHash) { tx in
                        TransactionRow(transaction: tx)
                    }
                }
            }
        }
        .task { await loadTransactions() }
        .onChange(of: selectedFilter) { _ in
            Task { await loadTransactions() }
        }
        .refreshable {
            await loadTransactions()
        }
    }

    private func loadTransactions() async {
        isLoading = true
        do {
            let typeFilter = selectedFilter == "all" ? nil : selectedFilter
            transactions = try await sdk.getTransactionHistory(
                txType: typeFilter,
                tokenAddress: nil,
                limit: 50
            )
        } catch {
            print("Failed to load transactions: \(error)")
        }
        isLoading = false
    }
}

struct TransactionRow: View {
    let transaction: Transaction

    var icon: String {
        switch transaction.txType {
        case "deposit": return "arrow.down.circle.fill"
        case "withdraw": return "arrow.up.circle.fill"
        case "transfer": return "arrow.left.arrow.right.circle.fill"
        default: return "circle.fill"
        }
    }

    var formattedDate: String {
        let date = Date(timeIntervalSince1970: TimeInterval(transaction.createdAt))
        let formatter = DateFormatter()
        formatter.dateStyle = .medium
        formatter.timeStyle = .short
        return formatter.string(from: date)
    }

    var body: some View {
        HStack {
            Image(systemName: icon)
                .foregroundColor(transaction.txType == "deposit" ? .green : .blue)

            VStack(alignment: .leading) {
                Text(transaction.txType.capitalized)
                    .font(.headline)
                Text(formattedDate)
                    .font(.caption)
                    .foregroundColor(.secondary)
            }

            Spacer()

            Text(transaction.amount)
                .font(.subheadline)
                .monospacedDigit()
        }
    }
}

Error Handling

do {
    let transactions = try await sdk.getTransactionHistory(
        txType: nil,
        tokenAddress: nil,
        limit: nil
    )
} catch SDKError.notAuthenticated {
    print("Please log in first")
} catch SDKError.networkError(let message) {
    print("Network error: \(message)")
} catch {
    print("Failed to get history: \(error)")
}

Best Practices

1. Paginate Results

For apps with many transactions, use the limit parameter to load in pages:
func loadPage(offset: Int, pageSize: UInt32 = 20) async throws -> [Transaction] {
    return try await sdk.getTransactionHistory(
        txType: nil,
        tokenAddress: nil,
        limit: pageSize
    )
}

2. Refresh After Operations

Fetch updated history after deposits, withdrawals, or transfers to show the latest state:
let shieldResult = try await sdk.shield(
    tokenAddress: tokenAddress,
    amount: amount
)

// Refresh transaction list
let updatedHistory = try await sdk.getTransactionHistory(
    txType: nil,
    tokenAddress: nil,
    limit: 20
)

Next Steps