Wallet Connect v.2 – Swift
Swift implementation of WalletConnect v.2 protocol for native iOS applications.
Requirements
- iOS 13
- XCode 13
- Swift 5
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,
apiKey: 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: SessionProposal) {
client.approve(proposal: proposal, accounts: [String]) { result in ... }
}
...
or
func didReceive(sessionProposal: SessionProposal) {
client.reject(proposal: proposal, reason: Reason)
}
NOTE: addresses provided in accounts
array should follow CAPI10 semantics.
Handle Delegate methods
func didReceive(sessionProposal: SessionProposal) {
// handle session proposal
}
func didReceive(sessionRequest: SessionRequest) {
// handle session request
}
JSON-RPC Payloads
Receive
You can parse JSON-RPC Requests received from “Requester” in didReceive(sessionRequest: SessionRequest)
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-Labs/WalletConnectSwiftV2", .branch("main")),
],
Example App
open Example/ExampleApp.xcodeproj
License
LGPL-3.0