跳到主要内容

Wallet 用法

配置网络和配对客户端

首先确认您已经配置了网络和配对了客户端

订阅Sign发布者

当你的Sign实例收到来自对等体的请求时,它会发布一个相关事件。设置一个订阅来处理它们。

Sign.instance.sessionDeletePublisher
.receive(on: DispatchQueue.main)
.sink { [unowned self] _ in
//handle event
}.store(in: &publishers)

以下发布者可供订阅:

    public var sessionProposalPublisher: AnyPublisher<Session.Proposal, Never> 
public var sessionRequestPublisher: AnyPublisher<Request, Never>
public var socketConnectionStatusPublisher: AnyPublisher<SocketConnectionStatus, Never>
public var sessionSettlePublisher: AnyPublisher<Session, Never>
public var sessionDeletePublisher: AnyPublisher<(String, Reason), Never>
public var sessionResponsePublisher: AnyPublisher<Response, Never>
public var sessionRejectionPublisher: AnyPublisher<(Session.Proposal, Reason), Never>
public var sessionUpdatePublisher: AnyPublisher<(sessionTopic: String, namespaces: [String : SessionNamespace]), Never>
public var sessionEventPublisher: AnyPublisher<(event: Session.Event, sessionTopic: String, chainId: Blockchain?), Never>
public var sessionUpdateExpiryPublisher: AnyPublisher<(sessionTopic: String, expiry: Date), Never>

连接客户端

你的钱包应该允许用户扫描由dapps生成的二维码。你自己负责实现它。 对于测试,您可以使用我们的test dapp: https://react-app.walletconnect.com/,它是v2协议兼容的。 一旦你从二维码调用pair方法派生出一个URI:

try await Pair.instance.pair(uri: uri)

如果一切正常,你应该处理以下事件:

Sign.instance.sessionProposalPublisher
.receive(on: DispatchQueue.main)
.sink { [weak self] sessionProposal in
// present proposal to the user
}.store(in: &publishers)

会话提议是dapp发送的一个摇头信号,目的是定义会话规则。握手程序由cape -25定义。 的会话。提案对象传递了一组所需的“提案命名空间”,其中包含所需的区块链方法和事件。带有方法和钱包的Dapp请求将发出在名称空间中定义的事件。

用户要么批准会话建议(使用会话名称空间),要么拒绝它。会话命名空间必须至少包含与提议的区块链相关的请求方法、事件和帐户。 帐户必须根据CAIP10规范提供,并以链标识符为前缀。Chain_id +: + account_address。您可以在CAIP2中找到关于区块链标识符的更多信息。我们的“帐户”类型符合标准。

let account = Account("eip155:1:0xab16a96d359ec26a11e2c2b3d8f8b8942d5bfcdb")!

在会话审批中发送的账户必须至少匹配所有请求的区块链。

提议名称空间请求示例:

{
"eip155":{
"chains": ["eip155:137", "eip155:1"],
"methods": ["eth_sign"],
"events": ["accountsChanged"]
},
"cosmos":{
"chains": ["cosmos:cosmoshub-4"],
"methods": ["cosmos_signDirect"],
"events": ["someCosmosEvent"]
}
}

示例会话名称空间响应:

{
"eip155":{
"accounts": ["eip155:137:0xab16a96d359ec26a11e2c2b3d8f8b8942d5bfcdb", "eip155:1:0xab16a96d359ec26a11e2c2b3d8f8b8942d5bfcdb"],
"methods": ["eth_sign"],
"events": ["accountsChanged"]
},
"cosmos":{
"accounts": ["cosmos:cosmoshub-4:cosmos1t2uflqwqe0fsj0shcfkrvpukewcw40yjj6hdc0"],
"methods": ["cosmos_signDirect", "personal_sign"],
"events": ["someCosmosEvent", "proofFinalized"]
}
}
授予会话
 Sign.instance.approve(proposalId: "proposal_id", namespaces: [String: SessionNamespace])

当会话被成功批准sessionsettpublisher将发布一个'session

Sign.instance.sessionSettlePublisher
.receive(on: DispatchQueue.main)
.sink { [weak self] _ in
self?.reloadSessions()
}.store(in: &publishers)
}

Session对象表示与dapp的活动会话连接。它包含dapp的元数据(您可能希望使用元数据向用户显示活动会话)、名称空间和过期日期。还有一个主题属性,您将使用它将请求与相关会话链接起来.

你可以通过以下方法从客户端查询已确定的会话:

Sign.instance.getSessions()

###处理来自dapp的请求 会话建立后,dapp将请求钱包的用户签署交易或消息。请求将由以下发布者传递。

Sign.instance.sessionRequestPublisher
.receive(on: DispatchQueue.main)
.sink { [weak self] sessionRequest in
self?.showSessionRequest(sessionRequest)
}.store(in: &publishers)

当钱包接收到会话请求时,您可能希望将其显示给用户。它的方法将在会话名称空间的作用域内。它的参数由AnyCodable类型表示。一个期望的对象如下:

if sessionRequest.method == "personal_sign" {
let params = try! sessionRequest.params.get([String].self)
} else if method == "eth_signTypedData" {
let params = try! sessionRequest.params.get([String].self)
} else if method == "eth_sendTransaction" {
let params = try! sessionRequest.params.get([EthereumTransaction].self)
}

现在,您的钱包(因为它拥有用户的私钥)负责签署交易。完成此操作后,您可以向dapp发送响应。

let response: AnyCodable = sign(request: sessionRequest) // implement your signing method
try await Sign.instance.respond(topic: request.topic, requestId: request.id, response: .response(response))

更新会话

如果要更新用户会话链、帐户、方法或事件,可以使用会话更新方法。

try await Sign.instance.update(topic: session.topic, namespaces: newNamespaces)

延长会话

缺省情况下,会话生存时间设置为7天,超过该时间用户的会话将过期。但如果你认为一个会话应该被延长,你可以调用:

try await Sign.instance.extend(topic: session.topic)

以上方法可以将用户的会话时间延长到一周。

断开会话

为了更好的用户体验,你的钱包应该允许用户断开不想要的会话。为了终止一个会话,使用disconnect方法。

try await Sign.instance.disconnect(topic: session.topic)

其他

  • 试试我们的示例钱包实现,它是WalletConnectSwiftV2存储库的一部分。
  • 要深入了解协议概念,请查看我们的文档
  • 在XCode中构建API文档:Product -> Build Documentation