# SDK

## 安装及初始化

请确保更新到 6.92.0或以后版本，即可开始接入：将 OKX Connect 集成到您的 DApp 中，可以使用 npm:

```
npm install @okxconnect/universal-provider
```

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

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

**请求参数**

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

**返回值**

- OKXUniversalProvider

**示例**

```typescript
import { OKXUniversalProvider } from "@okxconnect/universal-provider";

const okxUniversalProvider = await OKXUniversalProvider.init({
    dappMetaData: {
        name: "application name",
        icon: "application icon url"
    },
})
```

## 连接钱包

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

`okxUniversalProvider.connect(connectParams: ConnectParams);`

**请求参数**

- connectParams - ConnectParams
    - namespaces - [namespace: string]: ConnectNamespace ; 请求连接的可选信息， EVM系的key为"eip155"，BTC系的key为"btc"，如果请求的链中，有任何一个链钱包不支持的话，钱包会拒绝连接；
        - chains: string[]; 链id信息,
        - defaultChain?: string; 默认链
    - optionalNamespaces - [namespace: string]: ConnectNamespace; 请求连接的可选信息， EVM系的key为"eip155"，BTC系的key为"btc"，如果对应的链信息钱包不支持，依然可以连接；
        - chains: string[]; 链id信息,
        - defaultChain?: string; 默认链
    - 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下，钱包支持的方法；
        - defaultChain?: string; 当前会话的默认链
    - sessionConfig?: SessionConfig
        - dappInfo: object DApp 信息；
            - name:string
            - icon:string
        - redirect?:string, 连接成功后的跳转参数；
**示例**

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

## 判断钱包是否已连接

获取当前是否有连接钱包;

**返回值**
- boolean

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

## 准备交易

首先创建一个OKXBtcProvider对象，构造函数传入OKXUniversalProvider
```typescript
import { OKXBtcProvider } from "@okxconnect/universal-provider";
let okxBtcProvider = new OKXBtcProvider(okxUniversalProvider)
```

## 获取账户信息

`okxBtcProvider.getAccount(chainId);`

***请求参数***
- chainId: 请求的链，如btc:mainnet, fractal:mainnet

***返回值***
- Object
    - address: string 钱包地址
    - publicKey: string 公钥

***示例***
```typescript
let result = okxBtcProvider.getAccount("btc:mainnet")
//返回结构
{
    "address": "038936b367d47b3796b430a31694320918afdc458d81dea9bb7dd35c0aad8bc694",
    "publicKey": "048936b367d47b3796b430a31694320918afdc458d81dea9bb7dd35c0aad8bc6944e52a5317613cc39d67a9ea036db4de87328f77d3e3f7fdcac9b294d",
}
```


**签名**

`okxBtcProvider.signMessage(chain, message, type?);`


***请求参数***

- chain - string, 请求执行方法的链
- signStr - string 需要签名的消息
- type -  (可选) "ecdsa" | "bip322-simple"，默认值是 "ecdsa"。

***返回值***

- Promise - string: 签名结果

***示例***
```ts
let chain = "btc:mainnet"
let signStr = "data need to sign ..."

let result = okxBtcProvider.signMessage(chain, signStr)
//返回结构: "H83jZpulbMDDGUiTA4M8QNChmWwaKxwPCm8U5EBvftKlSMMzuvtVxBHlygtof5NBbdSVPiAtCvOUwZmz2vViHHU="
```

## 发送Bitcoin

`okxBtcProvider.sendBitcoin(chainId, toAddress, satoshis, options);`

***请求参数***

- chainId - string, 请求签名执行的链，必传参数，如btc:mainnet
- toAddress - string, string, 接收的地址
- satoshis - number, 发送的聪数量
- options - Object  (可选)
    - feeRate - number (可选) 自定义费率

***返回值***

- Promise - string 交易哈希

***示例***
```ts
let chain = "btc:mainnet"
let toAddress = '1NKnZ3uAuQLnmE...4u1efwCgTiAxBn'
let satoshis = 17000
let options = {
    feeRate: 16
}
let result = okxBtcProvider.sendBitcoin(chain, toAddress, satoshis, options)

/**
 返回结构:
 "ff18d01ef6abed3b7fd23247a1fc457ca...f49b6bb4529a19a5fb637f18ce2e"
 */
```

## signPsbt

`okxBtcProvider.signPsbt(chainId, psbtHex, options);`

***请求参数***

- chain - string, 请求签名执行的链，必传参数，如btc:mainnet
- psbtHex - string, 要签名的 psbt 的十六进制字符串
- options:
    - autoFinalized - boolean：签名后是否完成 psbt，默认为 true
    - toSignInputs - array：
        - index - number：要签名的输入
        - address - string：用于签名的相应私钥所对应的地址
        - publicKey - string：用于签名的相应私钥所对应的公钥
        - sighashTypes - number[]： (可选) sighashTypes
        - disableTweakSigner - boolean： (可选) 签名和解锁 Taproot 地址时， 默认使用 tweakSigner 来生成签名，启用此选项允许使用原始私钥进行签名

***返回值***

- Promise - string 已签名psbt的十六进制字符串;

***示例***
```ts
let chain = "btc:mainnet"
let psbtHex = ""
let options = { autoFinalized: false }
let result = okxBtcProvider.signPsbt(chain, psbtHex, options)

/**
 返回结构:
 "cHNidP8BAP0GAQIAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA/////yjWH1Uvx225V01diYYZ2i5jVAORF4nLWUWCg5bBaLQwAAAAAAD/////AwEAAAAAAAAAIlEgwSVNrUCq6hIeU+DOwJmGNi9s1CInltGUjJR5GzUoHLUBAAAAAAAAACJRIMElTa1AquoSHlPgzsCZhjYvbNQiJ5bRlIyUeRs1KBy1AIb9jA0AAAAiUSDwUTBk/h5bXDG+3/Q7lD8vEhHRSrKJFockGxONIUiI4wAAAAAAAQErAQAAAAAAAAAiUSDBJU2tQKrqEh5T4M7AmYY2L2zUIieW0ZSMlHkbNSgctQETQD9magM5RHYbdRd4KZ70FfVEAW5hw3rLjrocWIyn2Gi2P2c6Gri0E/S/wREhgjM8u5zQ3GrpcSaC8KhCRxBq5/oBFyANVBOudKlTUiKevmZzGqdVcp6Y8XbMOTfPV03fEyLOFgABASsBAAAAAAAAACJRIMElTa1AquoSHlPgzsCZhjYvbNQiJ5bRlIyUeRs1KBy1ARNA83DNEJj5u/mgUoOhCWL07enXpb6RX/WfEBh97tyrXLlA/e0CowU1fpgrKn+PQ+9Z/5/EXGwcr1UkYaqBJ0ZpKQEXIA1UE650qVNSIp6+ZnMap1Vynpjxdsw5N89XTd8TIs4WAAEBK+gDAAAAAAAAIlEg8FEwZP4eW1wxvt/0O5Q/LxIR0UqyiRaHJBsTjSFIiOMBAwSDAAAAARNBZcHpcb6YDNWF+eIcFckjF1c8C83uRmEhS/8jJQOBFkIQol8hBCTYXOFAaeu6/4o2MsS20iITiM/rAOAOBZkXC4MBFyANVBOudKlTUiKevmZzGqdVcp6Y8XbMOTfPV03fEyLOFgABBSBhbicyOEDuDCrkNNmYJn+BFwmIupR3943NAPwkeifbQAABBSBhbicyOEDuDCrkNNmYJn+BFwmIupR3943NAPwkeifbQAABBSCJNrNn1Hs3lrQwoxaUMgkYr9xFjYHeqbt901wKrYvGlAA="
 */
```

## signPsbts

`okxBtcProvider.signPsbts(chainId, psbtHexs, options);`

***请求参数***

- chainId - string, 请求签名执行的链，必传参数，如btc:mainnet
- psbtHex - string[], 要签名的 psbt 的十六进制字符串
- options - object[]
    - autoFinalized - boolean：签名后是否完成 psbt，默认为 true
    - toSignInputs - array：
        - index - number：要签名的输入
        - address - string：用于签名的相应私钥所对应的地址
        - publicKey - string：用于签名的相应私钥所对应的公钥
        - sighashTypes - number[]： (可选) sighashTypes
        - disableTweakSigner - boolean： (可选) 签名和解锁 Taproot 地址时， 默认使用 tweakSigner 来生成签名，启用此选项允许使用原始私钥进行签名

***返回值***

- Promise - string[] 已签名 psbt 的十六进制字符串

***示例***
```ts
let chain = "btc:mainnet"
let psbtHexs = [""]
let options = [{ autoFinalized: false }]
let result = okxBtcProvider.signPsbts(chain, psbtHexs, options)

/**
 返回结构:
 ["cHNidP8BAP0GAQIAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA/////yjWH1Uvx225V01diYYZ2i5jVAORF4nLWUWCg5bBaLQwAAAAAAD/////AwEAAAAAAAAAIlEgwSVNrUCq6hIeU+DOwJmGNi9s1CInltGUjJR5GzUoHLUBAAAAAAAAACJRIMElTa1AquoSHlPgzsCZhjYvbNQiJ5bRlIyUeRs1KBy1AIb9jA0AAAAiUSDwUTBk/h5bXDG+3/Q7lD8vEhHRSrKJFockGxONIUiI4wAAAAAAAQErAQAAAAAAAAAiUSDBJU2tQKrqEh5T4M7AmYY2L2zUIieW0ZSMlHkbNSgctQETQD9magM5RHYbdRd4KZ70FfVEAW5hw3rLjrocWIyn2Gi2P2c6Gri0E/S/wREhgjM8u5zQ3GrpcSaC8KhCRxBq5/oBFyANVBOudKlTUiKevmZzGqdVcp6Y8XbMOTfPV03fEyLOFgABASsBAAAAAAAAACJRIMElTa1AquoSHlPgzsCZhjYvbNQiJ5bRlIyUeRs1KBy1ARNA83DNEJj5u/mgUoOhCWL07enXpb6RX/WfEBh97tyrXLlA/e0CowU1fpgrKn+PQ+9Z/5/EXGwcr1UkYaqBJ0ZpKQEXIA1UE650qVNSIp6+ZnMap1Vynpjxdsw5N89XTd8TIs4WAAEBK+gDAAAAAAAAIlEg8FEwZP4eW1wxvt/0O5Q/LxIR0UqyiRaHJBsTjSFIiOMBAwSDAAAAARNBZcHpcb6YDNWF+eIcFckjF1c8C83uRmEhS/8jJQOBFkIQol8hBCTYXOFAaeu6/4o2MsS20iITiM/rAOAOBZkXC4MBFyANVBOudKlTUiKevmZzGqdVcp6Y8XbMOTfPV03fEyLOFgABBSBhbicyOEDuDCrkNNmYJn+BFwmIupR3943NAPwkeifbQAABBSBhbicyOEDuDCrkNNmYJn+BFwmIupR3943NAPwkeifbQAABBSCJNrNn1Hs3lrQwoxaUMgkYr9xFjYHeqbt901wKrYvGlAA="]
 */
```

## 签名且广播 signAndPushPsbt
> App required: >= 6.93.0

```
okxBtcProvider.signAndPushPsbt(chainId, psbtHex, options);
```

***请求参数***

- chain - string, 请求签名执行的链，必传参数，如btc:mainnet
- psbtHex - string, 要签名的 psbt 的十六进制字符串
- options: - object
    - autoFinalized - boolean：签名后是否完成 psbt，默认为 true
    - toSignInputs - array：
        - index - number：要签名的输入
        - address - string：用于签名的相应私钥所对应的地址
        - publicKey - string：用于签名的相应私钥所对应的公钥
        - sighashTypes - number[]： (可选) sighashTypes
        - disableTweakSigner - boolean： (可选) 签名和解锁 Taproot 地址时， 默认使用 tweakSigner 来生成签名，启用此选项允许使用原始私钥进行签名

***返回值***

- Promise - object
    - txhash 交易hash
    - signature 已签名 psbt 的十六进制字符串

***示例***
```ts
let chain = "btc:mainnet"
let psbtHex = ""
let options = { autoFinalized: false }
let result = okxBtcProvider.signAndPushPsbt(chain, psbtHex, options)

/**
 返回结构:
 {
 txhash: "",
 signature: ""
 }
 */
```

## 断开钱包连接

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

```typescript
okxUniversalProvider.disconnect();
```