Skip to content

Aptos/Movement

Aptos 是基于 Layer 1 的公链项目,旨在建设可扩展、可升级、安全可信的 Web3 基础设施。Aptos 最初由 Facebook 稳定币项目 Libra (后改名为 Diem) 的团队创建,现由部分团队成员独立开发。Aptos 采用了 Move 智能合约语言,常见的 Aptos 兼容网络包括 Movement 等。

什么是 Injected provider API?

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

AIP-62

AIP-62 是 Aptos 改进提案(Aptos Improvement Proposal)中的一项,旨在标准化钱包与 dApp 之间的交互接口。这个提案的主要目标是为 Aptos 生态系统中的钱包和 dApp 开发者提供一个统一的标准,以便更好地集成和交互。

AIP-62 的主要特点包括:

  1. 标准化接口:定义了一套标准的方法和事件,使钱包和 dApp 之间的通信更加一致和可预测。

  2. 改善用户体验:通过统一的接口,用户在不同的 dApp 中使用钱包时可以获得更一致的体验。

  3. 简化开发:为开发者提供了清晰的指南,减少了实现钱包集成时的复杂性。

  4. 增强互操作性:使不同的钱包和 dApp 能够更容易地相互兼容和集成。

  5. 安全性考虑:在设计过程中考虑了安全性,以保护用户的资产和隐私。

通过实施 AIP-62,Aptos 生态系统中的钱包和 dApp 开发者可以更轻松地创建兼容的产品,从而促进整个生态系统的发展和用户采用。

获取 wallet 对象

和Sui,Solana相似,Aptos钱包使用的是 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 aptosWallet = GlobalWallet.walletList.find(wallet => wallet.name === 'Bybit Wallet' && wallet.chains.includes('aptos:mainnet'));

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

开发者也可以通过Aptos官方的Dapp SDK来连接钱包,SDK的使用方法如下: https://aptos.dev/en/build/sdks/wallet-adapter

连接账户

使用的方法:window.bybitWallet.aptos.connect()

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

js
const res = await window.bybitWallet.aptos.connect();

// res 结构:
{
    status: 'Approved',
    args: {
        address: AccountInstance,
        publicKey: PublicKeyInstance
    }
}

获取当前账户信息(不会拉起弹窗)

使用的方法:window.bybitWallet.aptos.account()

返回的数据和上面connect方法返回的数据结构一致,只是不会拉起弹窗。

js
const account = await window.bybitWallet.aptos.account();

获取当前连接的网络

使用的方法:window.bybitWallet.aptos.network()

调用 window.bybitWallet.aptos.network(),将会获取当前 Dapp 链接的网络信息,将会返回链接的网络名称。目前Bybit Wallet只支持Mainnet | Movement Testnet

js
const network = await window.bybitWallet.aptos.network();
console.log('network', network); // 返回值为 'Mainnet'

交易签名

签名并发送交易

使用的方法:window.bybitWallet.aptos.signAndExecuteTransactionBlock(transaction)

通过调用 window.bybitWallet.aptos.signAndSubmitTransaction(transaction) 方法来发起一笔 Aptos 链上交易,这个方法将会返回一个交易Hash,这个交易Hash可以用来查询交易状态。

js
const transaction = {
  arguments: [address, '717'],
  function: '0x1::coin::transfer',
  type: 'entry_function_payload',
  type_arguments: ['0x1::aptos_coin::AptosCoin'],
};

try {
  const pendingTransaction = await window.bybitWallet.aptos.signAndSubmitTransaction(transaction);

  const client = new AptosClient('https://fullnode.mainnet.aptoslabs.com/');
  const txn = await client.waitForTransactionWithResult(
      pendingTransaction.hash,
  );
} catch (error) {
  // see "Errors"
}

仅签名交易,不广播

使用的方法:window.bybitWallet.aptos.signTransactionBlock(transaction)

仅仅是签名交易,而不发起上链操作,此方法将返回一个签名的Buffer对象。

js
const transaction = {
  arguments: [address, '717'],
  function: '0x1::coin::transfer',
  type: 'entry_function_payload',
  type_arguments: ['0x1::aptos_coin::AptosCoin'],
};

const signedTransaction = await window.bybitWallet.aptos.signTransactionBlock(transaction);

对信息签名

使用的方法:window.bybitWallet.aptos.signMessage(message)

通过调用 window.bybitWallet.aptos.signMessage(message) 方法来对信息进行签名,将返回签名成功的信息、签名信息、入参和返回信息。结构如下:

入参:

typescript
type AptosSignMessageInput = {
    address?: boolean;
    application?: boolean;
    chainId?: boolean;
    message: string;
    nonce: string;
};

返回:

typescript
type AptosSignMessageOutput = {
    address?: string;
    application?: string;
    chainId?: number;
    fullMessage: string;
    message: string;
    nonce: string;
    prefix: 'APTOS';
    signature: Signature;
};

签名消息验证

例子:

js
import nacl from 'tweetnacl';

const message = 'hello';
const nonce = 'random_string';

try {
    const response = await window.bybitWallet.aptos.signMessage({
        message,
        nonce,
    });
    const { publicKey } = await window.bybitWallet.aptos.account();
    // Remove the 0x prefix
    const key = publicKey!.slice(2, 66);
    const verified = nacl.sign.detached.verify(
        Buffer.from(response.fullMessage),
        Buffer.from(response.signature, 'hex'),
        Buffer.from(key, 'hex'),
);
    console.log(verified);
} catch (error) {
    console.error(error);
}

事件

成功连接

当钱包连接的时候, 并不会有connect事件触发,不过可以通过accountChanged事件来监听账户变更。如果accountChanged事件触发后,account为['xxxxxxx'],则表示钱包连接成功。

用法

js
window.bybitWallet.aptos.onAccountChange((newAccount) => {
  if (newAccount.length > 0) {
    console.log("connected!");
  }
});

断开连接

当钱包断开连接的时候, 并不会有disconnect事件触发,不过可以通过accountChanged事件来监听账户变更。如果accountChanged事件触发后,account为[],则表示钱包断开连接。

示例:

js
window.bybitWallet.aptos.onAccountChange((newAccount) => {
  if (newAccount.length === 0) {
    console.log("disconnected!");
  }
});

用法

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

账户变更

当用户在切换账户的时候,需要监听钱包切换事件:onAccountChange

示例:

js
let currentAccount = await window.bybitWallet.aptos.account();

// event listener for disconnecting
window.bybitWallet.aptos.onAccountChange((newAccount) => {
  // If the new account has already connected to your app then the newAccount will be returned
  if (newAccount) {
    currentAccount = newAccount;
  } else {
    // Otherwise you will need to ask to connect to the new account
    currentAccount = window.bybitWallet.aptos.connect();
  }
});