SDK#
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({dappMetaData: {name, icon}})
请求参数
- dappMetaData - object
- name - string: 应用名称,不会作为唯一表示
- icon - string: 应用图标的 URL。必须是 PNG、ICO 等格式,不支持 SVG 图标。最好传递指向 180x180px PNG 图标的 url。
返回值
- OKXUniversalProvider
示例
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"
- namespaces - [namespace: string]: ConnectNamespace ; 请求连接的必要信息,Sui系的key为"sui"
,如果请求的链中,有任何一个链钱包不支持的话,钱包会拒绝连接
返回值
- 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, 连接成功后的跳转参数
- dappInfo: object DApp 信息
示例
var session = await okxUniversalProvider.connect({
namespaces: {
sui: {
chains: ["sui:mainnet"]
}
},
sessionConfig: {
redirect: "tg://resolve"
}
})
判断钱包是否已连接#
获取当前是否有连接钱包
返回值
- boolean
示例
okxUniversalProvider.connected()
断开连接#
断开已连接钱包,并删除当前会话,如果要切换连接钱包,请先断开当前钱包。
示例
okxUniversalProvider.disconnect()
准备交易#
向钱包发送消息的方法,支持签名,交易
首先创建一个OKXSuiProvider对象,构造函数传入OKXUniversalProvider
import { OKXSuiProvider } from "@okxconnect/sui-provider"
let suiProvider = new OKXSuiProvider(okxUniversalProvider)
获取账户信息#
suiProvider.getAccount();
返回值
- Object
- address: string 钱包地址
- publicKey: string 公钥(需要App 6.92.0以后版本支持)
示例
let result = suiProvider.getAccount()
//返回结构
{
"address": "0x7995ca23961fe06d8cea7da58ca751567ce820d7cba77b4a373249034eecca4a",
"publicKey": "tUvCYrG22rHKR0c306MxgnhXOSf16Ot6H3GMO7btwDI=",
}
签名Message#
suiProvider.signMessage(input: SuiSignMessageInput);
请求参数
- SuiSignMessageInput - object
- message: Uint8Array
返回值
- Promise - object
- messageBytes: string
- signature: string
签名PersonalMessage#
suiProvider.signPersonalMessage(input: SuiSignMessageInput);
请求参数
- SuiSignMessageInput - object
- message: Uint8Array
返回值
- Promise - object
- bytes: string
- signature: string
示例
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)
签交易#
suiProvider.signTransaction(input)
请求参数
// txBytes与txSerialize为transactionBlock的序列化
// 和transactionBlock传入一种即可无需同时传入
interface SuiSignTransactionBlockInput {
transactionBlock: TransactionBlock;
chain: IdentifierString;
txBytes: string?;
txSerialize: string?
}
返回值
- Promise - object
- signature: string,
- transactionBlockBytes: string
签交易并广播上链#
suiProvider.signAndExecuteTransaction(input)
请求参数
// txBytes与txSerialize为transactionBlock的序列化
// 和transactionBlock传入一种即可无需同时传入
interface SuiSignTransactionBlockInput {
transactionBlock: TransactionBlock;
chain: IdentifierString;
txBytes: string?;
txSerialize: string?;
}
返回值
- Promise - object
- confirmedLocalExecution: bool,
- digest: string,
- txBytes: string
示例
// 定义要转移的金额和目标地址
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)
Event事件#
// 生成 universalLink
okxUniversalProvider.on("display_uri", (uri) => {
console.log(uri);
});
// session 信息变更会触发该事件;
okxUniversalProvider.on("session_update", (session) => {
console.log(JSON.stringify(session));
});
// 断开连接会触发该事件;
okxUniversalProvider.on("session_delete", ({topic}) => {
console.log(topic);
});
错误码#
在连接,交易,断开连接的过程中可能抛出的异常
异常
错误码 | 描述 |
---|---|
OKX_CONNECT_ERROR_CODES.UNKNOWN_ERROR | 未知异常 |
OKX_CONNECT_ERROR_CODES.ALREADY_CONNECTED_ERROR | 钱包已连接 |
OKX_CONNECT_ERROR_CODES.NOT_CONNECTED_ERROR | 钱包未连接 |
OKX_CONNECT_ERROR_CODES.USER_REJECTS_ERROR | 用户拒绝 |
OKX_CONNECT_ERROR_CODES.METHOD_NOT_SUPPORTED | 方法不支持 |
OKX_CONNECT_ERROR_CODES.CHAIN_NOT_SUPPORTED | 链不支持 |
OKX_CONNECT_ERROR_CODES.WALLET_NOT_SUPPORTED | 钱包不支持 |
OKX_CONNECT_ERROR_CODES.CONNECTION_ERROR | 连接异常 |
export enum OKX_CONNECT_ERROR_CODES {
UNKNOWN_ERROR = 0,
ALREADY_CONNECTED_ERROR = 11,
NOT_CONNECTED_ERROR = 12,
USER_REJECTS_ERROR = 300,
METHOD_NOT_SUPPORTED = 400,
CHAIN_NOT_SUPPORTED = 500,
WALLET_NOT_SUPPORTED = 600,
CONNECTION_ERROR = 700
}