Native Swift port of wagmi for iOS and macOS. Built on viem-swift.
Ported to Swift by Backseats
Documentation: backseats.com/wagmi-swift
- iOS 17+ / macOS 14+
- Swift 6.1+
Add to your Package.swift:
dependencies: [
.package(url: "https://github.com/backseats/wagmi-swift.git", from: "0.1.0"),
]Then add Wagmi to your target:
.target(name: "MyApp", dependencies: [
.product(name: "Wagmi", package: "wagmi-swift"),
]),import SwiftUI
import Wagmi
@main
struct MyApp: App {
let config = WagmiConfig(chains: [.mainnet, .base, .arbitrum])
var body: some Scene {
WindowGroup {
ContentView()
.environment(config)
}
}
}struct ContentView: View {
@Environment(WagmiConfig.self) var config
var body: some View {
if config.isConnected {
Text("Connected: \(config.currentAddress?.checksummed ?? "")")
Text("Chain: \(config.currentChain?.name ?? "Unknown")")
} else {
Button("Connect") {
Task { try await config.connect() }
}
}
}
}struct BalanceView: View {
@Environment(WagmiConfig.self) var config
@State private var balance = UseBalance()
var body: some View {
VStack {
if balance.isLoading {
ProgressView()
} else if let data = balance.data {
Text("\(data) wei")
}
}
.task {
await balance.fetch(config: config, address: config.currentAddress!)
}
}
}Since Wagmi re-exports ViemSwift, you get full access to low-level Ethereum primitives:
import Wagmi // also gives you ViemSwift types
// ABI encoding
let calldata = try ABIEncoder.encodeFunctionData(
signature: "transfer(address,uint256)",
values: [.address(recipient), .uint(amount)]
)
// Keccak-256 hashing
let hash = Keccak256.hash(data: someData)
// Public client for read-only RPC calls
let client = try PublicClient(chain: .mainnet)
let blockNumber = try await client.getBlockNumber()wagmi-swift depends on viem-swift, mirroring the TypeScript ecosystem:
- viem-swift — Low-level Ethereum client (ABI, RLP, keccak, signing, JSON-RPC, chains)
- wagmi-swift — High-level config, wallet connectors, SwiftUI hooks
Every item below links to the source definition in this repo.
WagmiConfig—connect,disconnect,switchChain,reconnect,publicClientUseConfigUseChainIdUseChainsUseConnectorsUseConnect—connect,resetUseReconnect—reconnect,resetUseDisconnect—disconnect,resetUseAccountUseConnectionUseConnectionsUseSwitchAccount—switchAccount,resetUseSwitchConnection—switchConnection,resetUseSwitchChain—switchChain,resetUsePublicClientUseClientUseConnectorClientUseWalletClient
UseBalance—fetch,resetUseBlock—fetch,resetUseBlockNumber—fetch,resetUseBlockTransactionCount—fetch,resetUseBytecode—fetch,resetUseCall—fetch,resetUseContractEvents—fetch,resetUseEnsName—fetch,resetUseEnsAddress—fetch,resetUseEnsAvatar—fetch,resetUseEnsResolver—fetch,resetUseEnsText—fetch,resetUseEstimateFeesPerGas—fetch,resetUseEstimateGas—fetch,resetUseEstimateMaxPriorityFeePerGas—fetch,resetUseFeeHistory—fetch,resetUseGasPrice—fetch,resetUseProof—fetch,resetUsePrepareTransactionRequest—fetch,resetUseReadContract—fetch,resetUseReadContracts—fetch,resetUseStorageAt—fetch,resetUseToken—fetch,resetUseTokenBalance—fetch,resetUseTransaction—fetch,resetUseTransactionConfirmations—fetch,resetUseTransactionCount—fetch,resetUseTransactionReceipt—fetch,resetUseWaitForTransactionReceipt—wait,reset
UseDeployContract—deploy,resetUseSendTransaction—sendTransaction,resetUseSignMessage—signMessage,resetUseSignTransaction—signTransaction,resetUseSignTypedData—signTypedData,resetUseSimulateContract—fetch,resetUseWriteContract—writeContract,resetUseVerifyMessage—verify,resetUseVerifyTypedData—verify,reset
UseWatchAsset—watchAsset,resetUseWatchBlockNumber—watch,stopUseWatchBlocks—watch,stopUseWatchContractEvent—watch,stopUseWatchPendingTransactions—watch,stop
UseSendCalls—sendCalls,resetUseCallsStatus—fetch,resetUseWaitForCallsStatus—wait,resetUseShowCallsStatus—showCallsStatus,reset
ConnectorMockConnector—connect,disconnect,switchChain, plus simulation helpers for testsWalletConnectConnector—connect,disconnect,switchChain,personalSign,sendTransactionCoinbaseWalletConnector—connect,disconnect,switchChain
