# Provider API

### 简介

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

```javascript
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;
  
  // 也可以使用官方的SDK连接到Nabox
```

### 连接钱包

```javascript
const { accounts } = await NaboxWallet.sui.features['standard:connect'].connect();
// accounts
[{
    address: '0x0451ff5a1b06f....272366aef69b369',
    chains: ['sui:mainnet'],
    features: ['sui:signAndExecuteTransactionBlock', 'sui:signTransactionBlock', 'sui:signMessage'],
    publicKey: 'sui publicKey'
}]
```

### signAndExecuteTransactionBlock(签名并广播交易)

```typescript
const txParameters = {
    transactionBlock: '', // sui transaction block
    options: { showEffects: true }
};
const transactionBlockResponse = await NaboxWallet.sui.features['sui:signAndExecuteTransactionBlock'].signAndExecuteTransactionBlock(txParameters);

interface SuiTransactionBlockResponse {
	balanceChanges?: BalanceChange[] | null;
	/**
	 * The checkpoint number when this transaction was included and hence finalized. This is only returned
	 * in the read api, not in the transaction execution api.
	 */
	checkpoint?: string | null;
	confirmedLocalExecution?: boolean | null;
	digest: string;
	effects?: TransactionEffects | null;
	errors?: string[];
	events?: SuiEvent[] | null;
	objectChanges?: SuiObjectChange[] | null;
	rawEffects?: number[];
	/**
	 * BCS encoded [SenderSignedData] that includes input object references returns empty array if
	 * `show_raw_transaction` is false
	 */
	rawTransaction?: string;
	timestampMs?: string | null;
	/** Transaction input data */
	transaction?: SuiTransactionBlock | null;
};

```

### signTransactionBlock(签名交易)

```typescript
const txParameters = {
    transactionBlockSerialized: '', // sui序列化交易
    options: { showEffects: true }
};
const signedTransaction = await NaboxWallet.sui.features['sui:signTransactionBlock'].signTransactionBlock(txParameters);
// signedTransaction
{
    transactionBlockBytes: '交易字节',
    signature: 'signature string' // 签名后的交易hex
}
```

### signMessage(消息签名)

```javascript
const messsageParameters = {
    message: '' // 需要将具体的message转换为 Uint8Array 类型
};
const signedMessage = await NaboxWalllet.sui.features['sui:signMessage'].signMessage({ message });

// signedMessage 
{
    signature,
    messageBytes
}
```

### 事件

```javascript
// 账户改变
NaboxWalllet.sui.features['standard:events'].on('accountChanged', (publicKey) => {
  if (publicKey) {
      console.log(publicKey);
  }
});

// 连接成功
NaboxWalllet.sui.features['standard:events'].on("connect", () => console.log("connected!"));

// 断开连接
NaboxWalllet.sui.features['standard:events'].on("disconnect", () => console.log("disconnected!"));
```
