npm package: @okxconnect/ton-provider
Description: OKX Connect TON Provider
Author: OKX Wallet
Latest version: 1.4.2

# SUI

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

## 安装及初始化

请确保更新OKX App到 6.90.1版本或以后版本，即可开始接入：

将 OKX Connect 集成到您的 DApp 中，可以使用 npm:

`npm install @okxconnect/sui-provider`

连接钱包之前，需要先创建一个对象，用于后续连接钱包、发送交易等操作。

`OKXUniversalProvider.init({metaData: {name, icon}})`

**请求参数**
- metaData - object
    - name - string: 应用名称，不会作为唯一表示
    - icon - string: 应用图标的 URL。必须是 PNG、ICO 等格式，不支持 SVG 图标。最好传递指向 180x180px PNG 图标的 url。

**返回值**
- OKXUniversalProvider

**示例**
```typescript
import { OKXUniversalProvider } from "@okxconnect/universal-provider"
const okxUniversalProvider = OKXUniversalProvider.init({dappMetaData: {
        name: "application name",
        icon: "application icon url"
    }})
```

## 连接钱包

连接钱包去获取钱包地址，作为标识符和用于签名交易的必要参数。

`okxUniversalProvider.connect(connectParams: ConnectParams);`

**请求参数**
- connectParams - ConnectParams
    - namespaces - [namespace: string]: ConnectNamespace ; 请求连接的必要信息，Sui系的key为"sui"
      ，如果请求的链中，有任何一个链钱包不支持的话，钱包会拒绝连接；
        - chains: string[]; 链id信息,
    - optionalNamespaces - [namespace: string]: ConnectNamespace; 请求连接的可选信息， EVM系的key为"eip155"，Sui系的key为"sui"
      ，如果对应的链信息钱包不支持，依然可以连接；
        - chains: string[]; 链id信息,
    - sessionConfig: object
        - redirect: string 连接成功后的跳转参数，如果是Telegram中的Mini App，这里可以设置为Telegram的deeplink: "tg://resolve"

**返回值**

- Promise`<SessionTypes.Struct | undefined>`
    - topic: string; 会话标识；
    - namespaces: `Record<string, Namespace>`; 成功连接的namespace 信息；
        - chains: string[]; 连接的链信息；
        - accounts: string[]; 连接的账户信息；
        - methods: string[]; 当前namespace下，钱包支持的方法；
        - rpcMap?: [chainId: string]: string; rpc 信息；
        - defaultChain?: string; 当前会话的默认链
    - sessionConfig?: SessionConfig
        - dappInfo: object DApp 信息；
            - name:string
            - icon:string
        - redirect?:string, 连接成功后的跳转参数；

**示例**

```typescript
var session = await okxUniversalProvider.connect({
    namespaces: {
        sui: {
            chains: ["sui:mainnet"]
        }
    },
    sessionConfig: {
        redirect: "tg://resolve"
    }
})
```

## 断开连接

断开已连接钱包,并删除当前会话,如果要切换连接钱包,请先断开当前钱包。

**示例**
```typescript
okxUniversalProvider.disconnect();
```

## 发送签名和交易

向钱包发送消息的方法，支持签名，交易，rpc请求。

首先创建一个OKXSuiProvider对象，构造函数传入OKXUniversalProvider

```typescript
import { OKXSuiProvider } from "@okxconnect/sui-provider"
let suiProvider = new OKXSuiProvider(okxUniversalProvider)

```

**签名Message**
```typescript
suiProvider.signMessage(input: SuiSignMessageInput);
```
***请求参数***
- SuiSignMessageInput - object
    - message: Uint8Array

***返回值***
- Promise - object
    - messageBytes: string
    - signature: string

**签名PersonalMessage**
```typescript
suiProvider.signPersonalMessage(input: SuiSignMessageInput);
```

***请求参数***
- SuiSignMessageInput - object
    - message: Uint8Array

***返回值***
- Promise - object
    - bytes: string
    - signature: string

**示例**

```typescript
const data = [76, 111, 103, 105, 110, 32, 119, 105, 116, 104, 32, 66, 108, 117, 101, 109, 111, 118, 101];
const uint8Array = new Uint8Array(data);
let input = {
    message: uint8Array
}
let signResult1 = await suiProvider.signMessage(input)
let signResult2 = await suiProvider.signPersonalMessage(input)

```

**签交易**
```typescript
suiProvider.signTransaction(input);
```

***请求参数***
```typescript
// txBytes与txSerialize为transactionBlock的序列化
// 和transactionBlock传入一种即可无需同时传入
interface SuiSignTransactionBlockInput {
    transactionBlock: TransactionBlock;
    chain: IdentifierString;
    txBytes: string?;
    txSerialize: string?
}
```

***返回值***
- Promise - object
    - signature: string,
    - transactionBlockBytes: string

**签一笔交易并广播上链**
```typescript
suiProvider.signAndExecuteTransaction(input);
```

***请求参数***
```typescript
// txBytes与txSerialize为transactionBlock的序列化
// 和transactionBlock传入一种即可无需同时传入
interface SuiSignTransactionBlockInput {
    transactionBlock: TransactionBlock;
    chain: IdentifierString;
    txBytes: string?;
    txSerialize: string?;
}
```

***返回值***

- Promise - object
    - confirmedLocalExecution: bool,
    - digest: string,
    - txBytes: string


**示例**

```typescript
// 定义要转移的金额和目标地址
const amount = 109; // 需要转移的金额
const recipientAddress = '0x'; // 目标地址

/// 构造一个转账的交易
const tx = new Transaction();
const [coin] = tx.splitCoins(tx.gas, [amount]);
tx.transferObjects([coin], recipientAddress)
const input = {
    transactionBlock: tx,
    chain: 'sui:mainnet',
    options: {
        showEffects: true,
    }
}

let signResult1 = await suiProvider.signTransaction(input)
let signResult2 = await suiProvider.signAndExecuteTransaction(input)

```