跳到主要内容

Wallet 用法

Sign API在钱包和dapp之间建立会话,以便公开一组区块链帐户,这些帐户可以使用带有方法和事件的安全远程JSON-RPC传输对事务或消息进行签名。这个库兼容NodeJS,浏览器和React-Native应用程序(NodeJS模块需要React-Native的polyfills)。

信息

关于示例实现,请参考我们的react-wallet-v2 example

从v1.x迁移

我们建议您同时安装v1和v2以获得最大的兼容性。 如果你的钱包已经在使用 @walletconnect/client@1.x.x, 应该添加 @walletconnect/sign-client@2.x.x 不会有任何问题. 如果您遇到依赖冲突,或者您同时需要@walletconnect/types@1.x.x@walletconnect/types@2.x.x 在你的钱包的顶级依赖中,请参考' legacy '包,它是专门为此目的发布的。

在上面的场景中,您将用@walletconnect/legacy-types替换@walletconnect/types@1.x.x,然后安装@walletconnect/types@2.x.x

有关更多信息,请查看我们的迁移指南'历史的存储库

初始化客户端

使用你的项目id将客户端初始化为控制器。

const signClient = await SignClient.init({
projectId: "<YOUR PROJECT ID>",
// optional parameters
relayUrl: "<YOUR RELAY URL>",
metadata: {
name: "Wallet name",
description: "A short description for your wallet",
url: "<YOUR WALLET'S URL>",
icons: ["<URL TO WALLET'S LOGO/ICON>"],
},
});

设置事件监听器

WalletConnect v2.0允许发出任何方法或事件。要举办某一活动,必须满足以下条件:

1. 为所需的SignClient事件添加监听器。

信息

要收听与配对相关的事件,请遵循配对API事件监听器的指导。

signClient.on("session_proposal", (event) => {
// Show session proposal data to the user i.e. in a modal with options to approve / reject it

interface Event {
id: number;
params: {
id: number;
expiry: number;
relays: { protocol: string; data?: string }[];
proposer: {
publicKey: string;
metadata: {
name: string;
description: string;
url: string;
icons: string[];
};
};
requiredNamespaces: Record<
string,
{
chains: string[];
methods: string[];
events: string[];
extension?: {
chains: string[];
methods: string[];
events: string[];
}[];
}
>;
pairingTopic?: string;
};
}
});

signClient.on("session_event", (event) => {
// Handle session events, such as "chainChanged", "accountsChanged", etc.

interface Event {
id: number;
topic: string;
params: {
event: { name: string; data: any };
chainId: string;
};
}
});

signClient.on("session_request", (event) => {
// Handle session method requests, such as "eth_sign", "eth_sendTransaction", etc.

interface Event {
id: number;
topic: string;
params: {
request: { method: string; params: any };
chainId: string;
};
}
});

signClient.on("session_ping", (event) => {
// React to session ping event

interface Event {
id: number;
topic: string;
}
});

signClient.on("session_delete", (event) => {
// React to session delete event

interface Event {
id: number;
topic: string;
}
});

配对和会话权限

URI

钱包和dapp之间的配对提议使用URI实现。在WalletConnect v2.0中,会话和配对是相互分离的。这意味着共享一个URI来构造一个配对提议,只有在解决了配对之后,dapp才能使用该配对提议一个会话。简单地说,dapp生成一个URI,钱包可使用该URI进行配对。

命名空间

namespaces参数用于指定要在会话中使用的名称空间和链。举例如下:

namespaces: {
eip155: {
accounts: ["eip155:1:0x0000000000..., eip155:2:0x0000000000..."],
methods: ["personal_sign", "eth_sendTransaction"],
events: ["accountsChanged"],
extension: [
{
accounts: ["eip155:2:0x0000000000..."],
methods: ["eth_sign"],
events: [],
},
],
},
};

扩展

extension参数用于指定不是由命名空间的所有帐户/链共享的方法。例如,链A可能有一个不被链B共享的特殊方法——在这种情况下,我们将创建一个只包含链B的扩展。

extension: [
{
accounts: ["eip:137"],
methods: ["eth_sign"],
events: [],
},
];

使用 uri 配对

要创建一个配对请求,只需将从dapp接收到的 uri 传递到 signClient.pair() 函数。

警告

从2.0.0(稳定)开始,直接在 signClient 上调用特定于配对的方法(如signClient.pair())将继续工作,但被认为已弃用,并将在未来的主要版本中删除。

建议直接通过paired API调用这些方法,例如:signclient .core.pair .pair()

// This will trigger the `session_proposal` event
await signClient.pair({ uri });

// Approve session proposal, use id from session proposal event and respond with namespace(s) that satisfy dapps request and contain approved accounts
const { topic, acknowledged } = await signClient.approve({
id: 123,
namespaces: {
eip155: {
accounts: ["eip155:1:0x0000000000..."],
methods: ["personal_sign", "eth_sendTransaction"],
events: ["accountsChanged"],
extension: [
{
accounts: ["eip:137"],
methods: ["eth_sign"],
events: [],
},
],
},
},
});

// Optionally await acknowledgement from dapp
const session = await acknowledged();

// Or reject session proposal
await signClient.reject({
id: 123,
reason: {
code: 1,
message: "rejected",
},
});

使用二维码配对

为了提供更好的用户体验,可以通过扫描二维码将钱包与dapp配对。这可以通过使用任何二维码扫描库来实现(例如,react-qr-reader)。扫描二维码后,将获得的' uri '传递到' signClient.pair() '函数中。实现QR码配对的有用参考是react wallet示例