Swiftpack.co -  WalletConnect/WalletConnectSwift as Swift Package
Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.
WalletConnect Swift SDK
.package(url: "https://github.com/WalletConnect/WalletConnectSwift.git", from: "1.5.0")


Swift SDK implementing WalletConnect 1.x.x protocol for native iOS Dapps and Wallets.


  • Server (wallet)

    • Create, reconnect, disconnect, and update session
    • Flexible, extendable request handling with Codable support via JSON RPC 2.0
    • Example App:
      • Connecting via QR code reader
      • Connecting via deep link ("wc" scheme)
      • Reconnecting after restart
      • Examples of request handlers
  • Client (native dapp)

    • Create, reconnect, disconnect, and update session
    • Default implementation of WalletConnect SDK API
      • personal_sign
      • eth_sign
      • eth_signTypedData
      • eth_sendTransaction
      • eth_signTransaction
      • eth_sendRawTransaction
    • Send custom RPC requests with Codable support via JSON RPC 2.0
    • Example App:
      • Generating QR-code with WC URL
      • Connecting via deep link
      • Reconnecting after restart
      • WalletConnect SDK requests
      • Custom request (Ethereum JSON RPC)

Usage in a Wallet

To start connections, you need to create and retain a Server object to which you provide a delegate:

let server = Server(delegate: self)

The library handles WalletConnect-specific session requests for you - wc_sessionRequest and wc_sessionUpdate.

To register for the important session update events, implement the delegate methods shouldStart, didConnect, didDisconnect and didFailToConnect.

By default, the server cannot handle any other reqeusts - you need to provide your implementation.

You do this by registering request handlers. You have the flexibility to register one handler per request method, or a catch-all request handler.

server.register(handler: PersonalSignHandler(for: self, server: server, wallet: wallet))

Handlers are asked (in order of registration) whether they can handle each request. First handler that returns true from canHandle(request:) method will get the handle(request:) call. All other handlers will be skipped.

In the request handler, check the incoming request's method in canHandle implementation, and handle actual request in the handle(request:) implementation.

func canHandle(request: Request) -> Bool {
   return request.method == "eth_signTransaction"

You can send back response for the request through the server using send method:

func handle(request: Request) {
  // do you stuff here ...
  // error response - rejected by user

  // or send actual response - assuming the request.id exists, and MyCodableStruct type defined
  try server.send(Response(url: request.url, value: MyCodableStruct(value: "Something"), id: request.id!))

For more details, see the ExampleApps/ServerApp

Usage in a Dapp

To start connections, you need to create and keep alive a Client object to which you provide DappInfo and a delegate:

let client = Client(delegate: self, dAppInfo: dAppInfo)

The delegate then will receive calls when connection established, failed, or disconnected.

Upon successful connection, you can invoke various API methods on the Client.

try? client.personal_sign(url: session.url, message: "Hi there!", account: session.walletInfo!.accounts[0]) {
      [weak self] response in
      // handle the response from Wallet here

You can also send a custom request. The request ID required by JSON RPC is generated and handled by the library internally.

try? client.send(Request(url: url, method: "eth_gasPrice")) { [weak self] response in
    // handle the response

You can convert the received response result to a Decodable type.

let nonceString = try response.result(as: String.self)

You can also check if the wallet responded with error:

if let error = response.error { // NSError
  // handle error

For more details, see the ExampleApps/ClientApp

Running Example Apps

Please open ExampleApps/ExampleApps.xcodeproj



  • iOS 11.0 or macOS 10.14
  • Swift 5

WalletConnectSwift dependencies

  • CryptoSwift - for cryptography operations
  • Starscream - for WebSocket operations prior to iOS 13

Swift Package Manager

In your Package.swift:

dependencies: [
    .package(url: "https://github.com/WalletConnect/WalletConnectSwift.git", .upToNextMinor(from: "1.2.0"))


In your Podfile:

platform :ios, '11.0'

target 'MyApp' do
  pod 'WalletConnectSwift'


In your Cartfile:

github "WalletConnect/WalletConnectSwift"

Run carthage update to build the framework and drag the WalletConnectSwift.framework in your Xcode project.


We'd like to thank Trust Wallet team for inspiration in imlpementing this library.



MIT License (see the LICENSE file).


Stars: 58
Last commit: 22 hours ago

Ad: Job Offers

iOS Software Engineer @ Perry Street Software
Perry Street Software is Jack’d and SCRUFF. We are two of the world’s largest gay, bi, trans and queer social dating apps on iOS and Android. Our brands reach more than 20 million members worldwide so members can connect, meet and express themselves on a platform that prioritizes privacy and security. We invest heavily into SwiftUI and using Swift Packages to modularize the codebase.

Release Notes

Align with latest changes in protocol
3 weeks ago
  • Take chainId into consideration
  • Add new Server and Client delegate methods
  • Technical improvements

Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API