Skip to content

dynamic-labs/swift-sdk-and-sample-app

Repository files navigation

Dynamic Swift SDK

iOS SDK for Dynamic's authentication and Web3 wallet infrastructure.

Features

  • Authentication: Social (Google, Apple, Farcaster), Email/SMS OTP, Passkey, External JWT
  • Multi-Chain Wallets: EVM (Ethereum, Polygon, Base, etc.) and Solana
  • Wallet Operations: Balances, signing, transactions, network switching
  • Security: MFA/TOTP, Passkey management, Recovery codes
  • Reactive State: Combine framework integration

Requirements

  • iOS 15.0+ / Xcode 14.0+ / Swift 5.9+

Installation

Swift Package Manager

dependencies: [
    .package(url: "https://github.com/dynamic-labs/swift-sdk-and-sample-app.git", from: "1.0.1")
]

Or via Xcode: File → Add Package Dependencies → Enter repository URL

Quick Start

Initialize

import SwiftUI
import DynamicSDKSwift

@main
struct YourApp: App {
    init() {
        _ = DynamicSDK.initialize(
            props: ClientProps(
                environmentId: "YOUR_ENVIRONMENT_ID",
                appLogoUrl: "https://yourdomain.com/logo.png",
                appName: "Your App Name",
                redirectUrl: "yourapp://",
                appOrigin: "https://yourdomain.com"
            )
        )
    }

    var body: some Scene {
        WindowGroup { ContentView() }
    }
}

Access SDK

let sdk = DynamicSDK.instance()

Authentication

Built-in UI

sdk.ui.showAuth()

Social Providers

try await sdk.auth.social.connect(provider: .google)  // or .apple, .farcaster

Email OTP

try await sdk.auth.email.sendOTP(email: "[email protected]")
try await sdk.auth.email.verifyOTP(token: "123456")

SMS OTP

let phoneData = PhoneData(countryCode: "1", phoneNumber: "5555551234")
try await sdk.auth.sms.sendOTP(phoneData: phoneData)
try await sdk.auth.sms.verifyOTP(token: "123456")

Passkey

try await sdk.auth.passkey.signIn()
try await sdk.passkeys.registerPasskey()

External JWT

try await sdk.auth.externalAuth.signInWithExternalJwt(
    props: SignInWithExternalJwtParams(jwt: "your-jwt-token")
)

Auth State

let user = sdk.auth.authenticatedUser

sdk.auth.authenticatedUserChanges
    .receive(on: DispatchQueue.main)
    .sink { user in /* handle user changes */ }
    .store(in: &cancellables)

try await sdk.auth.logout()

Wallet Operations

Get Wallets & Balance

let wallets = sdk.wallets.userWallets
let balance = try await sdk.wallets.getBalance(wallet: wallet)
let network = try await sdk.wallets.getNetwork(wallet: wallet)

Network & Primary Wallet

try await sdk.wallets.switchNetwork(wallet: wallet, network: targetNetwork)
try await sdk.wallets.setPrimary(walletId: walletId)

Sign Message

let signature = try await sdk.wallets.signMessage(wallet: wallet, message: "Hello!")

EVM Transactions

Send Transaction

let client = try await sdk.evm.createPublicClient(chainId: chainId)
let gasPrice = try await client.getGasPrice()

let transaction = EthereumTransaction(
    to: recipientAddress,
    value: amountInWei,
    gasLimit: 21000,
    maxFeePerGas: Int(gasPrice.value * 2),
    maxPriorityFeePerGas: Int(gasPrice.value * 2)
)

let txHash = try await sdk.evm.sendTransaction(transaction: transaction, wallet: wallet)

Sign Typed Data (EIP-712)

let signature = try await sdk.wallets.signTypedData(wallet: wallet, typedDataJson: typedDataJson)

ERC20 & Contract Interactions

let input = WriteContractInput(
    contractAddress: tokenContractAddress,
    functionName: "transfer",
    args: [recipientAddress, tokenAmount],
    abi: Erc20.abi
)

let txHash = try await sdk.evm.writeContract(wallet: wallet, input: input)

Solana Transactions

Sign & Send

let connection = try await sdk.solana.createConnection()
let signer = try await sdk.solana.createSigner(wallet: wallet)
let blockhash = try await connection.getLatestBlockhash()

let signature = try await signer.signAndSendEncodedTransaction(base64Transaction: base64Tx)

MFA

Device Management

let devices = try await sdk.mfa.getUserDevices()

// Add TOTP device
let device = try await sdk.mfa.addDevice(type: .totp)
try await sdk.mfa.verifyDevice(code: "123456", type: .totp)

// Delete device
let token = try await sdk.mfa.createMfaToken(singleUse: true)
try await sdk.mfa.deleteUserDevice(deviceId: deviceId, mfaAuthToken: token)

Recovery Codes

let codes = try await sdk.mfa.getRecoveryCodes(generateNewCodes: false)
try await sdk.mfa.authenticateRecoveryCode(code: recoveryCode)

Passkey Management

let passkeys = try await sdk.passkeys.getPasskeys()
try await sdk.passkeys.registerPasskey()
try await sdk.passkeys.deletePasskey(DeletePasskeyRequest(passkeyPublicKeyId: passkeyId))

User Profile

sdk.ui.showUserProfile()

if let user = sdk.auth.authenticatedUser {
    print("User ID: \(user.userId)")
    print("Email: \(user.email ?? "N/A")")
}

Networks

let evmNetworks = sdk.networks.evm      // Ethereum, Polygon, Arbitrum, Base, etc.
let solanaNetworks = sdk.networks.solana // Mainnet, Devnet, Testnet

Example App

  1. Open ExampleApp/DynamicSDKExample.xcodeproj
  2. Update environmentId in DynamicSDKExampleApp.swift
  3. Run on iOS Simulator or device

Demonstrates all auth flows, wallet operations, EVM/Solana transactions, MFA, and passkeys.

Support

About

Official Dynamic SDK for Swift

Resources

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •  

Languages