Skip to content

ant013/WalletConnectSwiftV2

 
 

Repository files navigation

Wallet Connect v.2 - Swift

Swift implementation of WalletConnect v.2 protocol for native iOS applications.

Requirements

  • iOS 13
  • XCode 13
  • Swift 5

Documentation

In order to build documentation in XCode go to Product -> Build Documentation

Usage

Responder

Responder client is usually a wallet.

Instantiate a Client

You usually want to have a single instance of a client in you app.

        let metadata = AppMetadata(name: String?,
                                   description: String?,
                                   url: String?,
                                   icons: [String]?)
        let client = WalletConnectClient(metadata: AppMetadata,
                            projectId: String,
                            isController: Bool,
                            relayHost: String)

The controller client will always be the "wallet" which is exposing blockchain accounts to a "dapp" and therefore is also in charge of signing.

After instantiation of a client set its delegate.

Pair Clients

Pair client with a uri generated by the proposer client.

let uri = "wc:..."
try! client.pair(uri: uri)

Approve Session

Sessions are always proposed by the Proposer client so Responder client needs either reject or approve a session proposal.

class ClientDelegate: WalletConnectClientDelegate {
...
    func didReceive(sessionProposal: Session.Proposal) {
        client.approve(proposal: proposal, accounts: [String])
    }
...

or

    func didReceive(sessionProposal: Session.Proposal) {
        client.reject(proposal: proposal, reason: Reason)
    }

NOTE: addresses provided in accounts array should follow CAPI10 semantics.

Handle Delegate methods

    func didReceive(sessionProposal: Session.Proposal) {
        // handle session proposal
    }
    func didReceive(sessionRequest: Request) {
        // handle session request
    }

JSON-RPC Payloads

Receive

You can parse JSON-RPC Requests received from "Requester" in didReceive(sessionRequest: Request) delegate function.

Request parameters can be type casted based on request method as below:

            let params = try! sessionRequest.request.params.get([EthSendTransaction].self)
Respond
            let jsonrpcResponse = JSONRPCResponse<AnyCodable>(id: request.id, result: AnyCodable(responseParams))
            client.respond(topic: sessionRequest.topic, response: .response(jsonrpcResponse))

Installation

Swift Package Manager

Add .package(url:_:) to your Package.swift:

dependencies: [
    .package(url: "https://github.com/WalletConnect/WalletConnectSwiftV2", .branch("main")),
],

Example App

open Example/ExampleApp.xcodeproj

License

Apache 2.0

Packages

No packages published

Languages

  • Swift 99.8%
  • Other 0.2%