Skip to content

SUI网络

Sui 又称 Sui Network,是第一个从零开始设计,且能够使开发者为十亿 Web3 新用户构建全新体验的 Layer 1 区块链。Sui 可横向扩展,能够高速且低成本地支持多样的 DApp 开发。Sui 开创了通用区块链的先河,为用户带来高吞吐量、超快结算速度、丰富的链上资产、以及用户友好的 Web3 体验。Sui 是区块链技术的一个跨越式的进步,从底层开始设计,以满足加密货币中所有相关方的需求。

什么是 Injected provider API?

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

获取 wallet 对象

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

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

const suiWallet = GlobalWallet.walletList.find(wallet => wallet.name === 'BybitSuiMainnet');

通过Sui官方的Dapp SDK连接钱包(强烈建议)

开发者也可以通过Sui官方的Dapp SDK来连接钱包,SDK的使用方法如下: https://sdk.mystenlabs.com/dapp-kit/

连接账户

使用的方法:suiWallet.features['standard:connect'].connect()

连接到Bybit Wallet可以通过调用 suiWallet.features['standard:connect'].connect()connect 调用将返回一个 Pr对象: Promiseresolve,并在用户拒绝请求或关闭弹出窗口时 reject。有关Bybit Wallet可能发生错误的详细信息,请参考 错误码。 当用户接受连接请求时,suiWallet.features['standard:events']` 也会触发连接事件。

js
const suiAccounts = await suiWallet.features['standard:connect'].connect();

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

交易签名

签名并发送交易

使用的方法:suiWallet.features['sui:signAndExecuteTransactionBlock'].signAndExecuteTransactionBlock

通过以上获取到的 suiWallet 对象,可以进行交易签名:

js
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)

js
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('params1'),
        tx.pure('params2'),
        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 方法可以签署一个交易块(多个交易的集合)。

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

对信息签名

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

js
import { ethers } from 'ethers';
// 这里借用 ethers 库来帮我们处理 message,将其转为 Uint8Array 类型
// 当然,您也可以使用其他方法将 message 转为 Uint8Array 类型

const message = ethers.utils.toUtf8Bytes('hello, bybit');
const { signature, messageBytes } = await suiWallet.features['sui:signMessage'].signMessage({ message });
console.log('signature', signature);
console.log('messageBytes', messageBytes);

事件

成功连接

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

用法

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

断开连接

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

用法

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

账户变更

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

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

用法

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