> For the complete documentation index, see [llms.txt](https://help.tokenpocket.pro/developer-cn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.tokenpocket.pro/developer-cn/extension-wallet/api-reference/sui-provider-api.md).

# Sui Provider API

TokenPocket Extension 会在页面中注入 Sui Provider，并支持 Sui Wallet Standard。开发者可通过传统 Provider 对象或 Wallet Standard 接入 Sui 钱包能力。

## Provider 注入

页面中可使用以下对象：

```ts
window.sui
window.tokenpocket.sui
```

同时，TokenPocket 支持 Sui Wallet Standard，可被标准钱包发现流程识别。

## 快速开始

### 连接钱包

```ts
const res = await window.sui.features['standard:connect'].connect();
console.log(res.accounts);
```

### 签名 Personal Message

```ts
const account = (await window.sui.features['standard:connect'].connect()).accounts[0];

const res =
  await window.sui.features['sui:signPersonalMessage'].signPersonalMessage({
    account,
    message: new TextEncoder().encode('hello tokenpocket'),
  });

console.log(res);
```

## API 列表

Sui Provider 主要通过 Wallet Standard Features 暴露能力。

### standard:connect

连接当前站点到 Sui 账户。

```ts
connect(): Promise<{
  accounts: ReadonlyWalletAccount[];
}>
```

说明：

* 返回的账户对象包含地址、公钥、链信息和支持的功能列表

### sui:signTransactionBlock

签名 `TransactionBlock`。

```ts
signTransactionBlock(input: {
  account: ReadonlyWalletAccount;
  chain?: string;
  transactionBlock: any;
}): Promise<any>
```

### sui:signTransaction

签名交易但不广播。

```ts
signTransaction(input: {
  account: ReadonlyWalletAccount;
  chain?: string;
  transaction: any;
}): Promise<{
  bytes: string;
  signature: string;
}>
```

说明：

* 当前返回值会归一化为 `bytes` 和 `signature`

### sui:signAndExecuteTransactionBlock

签名并执行 `TransactionBlock`。

```ts
signAndExecuteTransactionBlock(input: {
  account: ReadonlyWalletAccount;
  chain?: string;
  transactionBlock: any;
  options?: Record<string, any>;
}): Promise<any>
```

### sui:signAndExecuteTransaction

签名并执行交易。

```ts
signAndExecuteTransaction(input: {
  account: ReadonlyWalletAccount;
  chain?: string;
  transaction: any;
  options?: Record<string, any>;
}): Promise<{
  bytes: string;
  signature: string;
  digest: string;
  effects: any;
}>
```

说明：

* 当前返回值会归一化为 `bytes`、`signature`、`digest` 和 `effects`

### sui:signPersonalMessage

签名 Personal Message。

```ts
signPersonalMessage(input: {
  account: ReadonlyWalletAccount;
  message: Uint8Array;
}): Promise<any>
```

说明：

* 会同时提交字节消息和 UTF-8 字符串形式供钱包确认

### sui:reportTransactionEffects

上报交易 effects。

```ts
reportTransactionEffects(input: any): Promise<void>
```

说明：

* 当前接口可调用，但不返回额外结果

## Wallet Standard

TokenPocket 当前支持以下 Sui Wallet Standard 能力：

* `standard:connect`
* `standard:events`
* `sui:signPersonalMessage`
* `sui:signTransactionBlock`
* `sui:signTransaction`
* `sui:signAndExecuteTransactionBlock`
* `sui:signAndExecuteTransaction`
* `sui:reportTransactionEffects`

官方参考：

* [Wallet Standard 官方文档](https://wallet-standard.github.io/wallet-standard/)
* [Sui 官方 Wallet Standard 文档](https://docs.sui.io/onchain-finance/asset-custody/wallets/wallet-standard)

链支持如下：

```ts
['sui:mainnet']
```

### 接入示例

```ts
const wallet = window.sui;
const { accounts } = await wallet.features['standard:connect'].connect();
const account = accounts[0];

const result =
  await wallet.features['sui:signTransaction'].signTransaction({
    account,
    chain: 'sui:mainnet',
    transaction,
  });

console.log(result.bytes);
console.log(result.signature);
```

> 提示
>
> 对于新接入的 dApp，推荐统一使用 Wallet Standard Features，而不是自行假设传统钱包私有接口。

## 错误处理

建议所有 Provider 调用都使用 `try/catch`。

```ts
try {
  const { accounts } = await window.sui.features['standard:connect'].connect();
  console.log(accounts[0].address);
} catch (error) {
  console.error(error);
}
```

常见失败场景：

* 用户拒绝连接
* 用户拒绝签名或执行交易
* 交易对象缺失或格式不正确
* 当前站点未授权

## 兼容性说明

* TokenPocket 同时暴露 `window.sui` 与 `window.tokenpocket.sui`
* 推荐优先使用 Wallet Standard 接入
* 当前链能力以 `sui:mainnet` 为准
