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 Client
let url = URL(string: "wss://relay.walletconnect.org")!
let options = WalletClientOptions(apiKey: String, name: String, isController: true, metadata: AppMetadata(name: String?, description: String?, url: String?, icons: [String]?), relayURL: url)
let client = WalletConnectClient(options: options)
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: SessionType.Proposal) {
client.approve(proposal: proposal, accounts: [String])
}
...
or
func didReceive(sessionProposal: SessionType.Proposal) {
client.reject(proposal: proposal, reason: Reason)
}
NOTE: addresses provided in accounts
array should follow CAPI10 semantics.
Handle Delegate methods
func didSettle(session: SessionType.Settled) {
// handle settled session
}
func didReceive(sessionProposal: SessionType.Proposal) {
// 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: 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