连接浏览器插件钱包

Provider API#

什么是 Injected provider API?#

欧易 Injected providers API 是一个 JavaScript API,欧易将其注入用户访问的网站。您的 DApp 可以使用此 API 请求用户帐户,从用户连接的区块链读取数据,帮助用户签署消息和交易。

获取 wallet 对象#

Sui 钱包使用的是 wallet standard,相比其他异构链有些不同,可以通过事件通知的方式获取 wallet 对象:

const GlobalWallet = {
      register: (wallet) => {
          GlobalWallet[wallet.chainName] = wallet
      }
  }
  const event = new CustomEvent('wallet-standard:app-ready', { detail: GlobalWallet });
  window.dispatchEvent(event);

  const suiWallet = GlobalWallet.suiMainnet

获取账户#

通过以上获取到的 suiWallet 对象,可以获取到账户:

const suiAccounts = suiWallet.connectedAccounts

// suiAccounts 结构:
[
  {
      "address": "0x7995ca23961fe06d8cea7da58ca751567ce820d7cba77b4a373249034eecca4a",
      "publicKey": "tUvCYrG22rHKR0c306MxgnhXOSf16Ot6H3GMO7btwDI=",
      "chains": [
          "sui:mainnet"
      ],
      "features": [
          "sui:signAndExecuteTransactionBlock",
          "sui:signTransactionBlock",
          "sui:signMessage"
      ]
  }
]

第一笔交易#

suiWallet.features['sui:signAndExecuteTransactionBlock'].signAndExecuteTransactionBlock

签名并发送交易

Sui 钱包使用的是 wallet standard,相比其他异构链有些不同,所有方法都挂在 features[] 里 创建交易后,Web 应用程序可能会要求用户的欧易 Web3 钱包签署并发送交易。如果接受,欧易 Web3 钱包将使用用户的私钥签署交易并通过 SUI JSON RPC 连接提交。在 suiWallet 上调用 signAndExecuteTransactionBlock 方法会为已签名的交易返回 promise

const handleTransaction = async () => {
    const tx = new TransactionBlock()
    tx.moveCall({
      target: `${packageId}::${moduleName}::${functionName}`,
      arguments: [
        tx.pure(params1),
        tx.pure(params2),
      ],
      typeArguments: [],
    })
    const result = await suiWallet.features['sui:signAndExecuteTransactionBlock'].signAndExecuteTransactionBlock({
      transactionBlock: tx,
      options: { showEffects: true },
    })
    console.log('result', result)
    // 通过result?.effects?.status?.status获取交易状态,成功为 'success',失败为'failure'
}

拆币

在发交易时,付 gas 费的 objectId,如果这个 object 本身就要被发送,还要用来付 gas 费,这时候就需要用到拆币(split coin)

const handleTransaction = async () => {
    const tx = new TransactionBlock()

    const value = '300000000'  // 这里是想要拆出的目标值
    const [coins] = tx.splitCoins(tx.gas, [
      tx.pure(BigInt(value)),
    ])
    tx.moveCall({
      target: `${packageId}::${moduleName}::${functionName}`,
      arguments: [
        tx.pure(参数1),
        tx.pure(参数2),
        tx.makeMoveVec({ objects: [coins] }),
      ],
      typeArguments: [],
    })
    const result = await suiWallet.features['sui:signAndExecuteTransactionBlock'].signAndExecuteTransactionBlock({
      transactionBlock: tx,
      options: { showEffects: true },
    })
    console.log('result', result)
    // 通过result?.effects?.status?.status获取交易状态,成功为 'success',失败为'failure'
}

对交易块进行签名

通过 provider 上的 signTransactionBlock 方法可以签署一个交易块(多个交易的集合)。

const tx = new TransactionBlock();
tx.moveCall({
  target: 'xxx',
  arguments: [
    tx.pure('okx'),
    tx.pure('wallet'),
  ],
});
const input = {
  transactionBlockSerialized: tx.serialize(),
  options: {
    showEffects: true,
  }
}l
const transaction = await suiWallet.features['sui:signTransactionBlock'].signTransactionBlock({ transactionBlock: tx })

签名信息#

对单个交易签名(不发送)

创建交易后,Web 应用程序可能会要求用户的欧易 Web3 钱包签署交易,而无需将其提交到网络。调用 signMessage 方法会为已签名的交易返回 Promise

import { ethers } from 'ethers';
// 这里借用 ethers 库来帮我们处理 message,将其转为 Uint8Array 类型

const message = ethers.utils.toUtf8Bytes('okx')
const { signature, messageBytes } = await suiWallet.features['sui:signMessage'].signMessage({ message })

错误码#

错误码
标题
描述
4900断开连接OKX Wallet could not connect to the network.
4100未授权The requested method and/or account has not been authorized by the user.
4001用户拒绝请求The user rejected the request through OKX wallet.
-32000无效输入Missing or invalid parameters.
-32002请求资源不可用This error occurs when a dapp attempts to submit a new transaction while OKX wallet's approval dialog is already open for a previous transaction. Only one approve window can be open at a time. Users should approve or reject their transaction before initiating a new transaction.
-32003拒绝交易OKX Wallet does not recognize a valid transaction.
-32601未找到方法OKX Wallet does not recognize the method.
-32603内部错误Something went wrong within OKX wallet.

连接账户#

suiWallet.features['standard:connect'].connect()

描述

连接到欧易 Web3 钱包可以通过调用 suiWallet.features['standard:connect'].connect()

connect 调用将返回一个 Promise 对象,该 Promise 对象在用户接受连接请求时 resolve,并在用户拒绝请求或关闭弹出窗口时 reject。有关欧易 Web3 钱包可能发生错误的详细信息,请参考 错误码。 当用户接受连接请求时,suiWallet.features['standard:events'] 也会触发连接事件。

suiWallet.features['standard:events'].on("connect", () => console.log("connected!"));

一旦 Web 应用程序连接到欧易 Web3 钱包,它将能够读取连接账户的公钥并提示用户进行其他交易。

例子

codeopen中打开。

事件#

成功连接

连接到欧易 Web3 钱包可以通过调用 suiWallet.features['standard:events'].on。 当用户接受连接请求时,会触发连接事件。

用法

suiWallet.features['standard:events'].on("connect", () => console.log("connected!"));

断开连接

断开连接与连接过程相同。但是,钱包也有可能发起断开连接,而不是应用程序本身。

用法

suiWallet.features['standard:events'].on("disconnect", () => {
  console.log("disconnected!")
});

账户变更

欧易 Web3 钱包允许用户从单个扩展程序或移动应用程序中无缝管理多个账户。每当用户切换账户时,欧易 Web3 钱包都会发出一个 accountChanged 事件。

如果用户在已连接到应用程序时更改账户,并且新账户已经将该应用程序列入白名单,那么用户将保持连接状态并且欧易 Web3 钱包将传递新账户的公钥:

用法

suiWallet.features['standard:events'].on('accountChanged', (publicKey) => {
  if (publicKey) {
      console.log(`Switched to account ${publicKey.toBase58()}`);
  }
});