UI#
安装及初始化#
请确保更新OKX App到 6.92.0版本或以后版本,即可开始接入:
将 OKX Connect 集成到您的 DApp 中,可以使用 npm:
npm install @okxconnect/ui
npm install @okxconnect/universal-provider
连接钱包之前,需要先创建一个可以提供UI界面的对象,用于后续连接钱包、发送交易等操作。
OKXUniversalConnectUI.init(dappMetaData, actionsConfiguration, uiPreferences, language)
请求参数
- dappMetaData - object
- name - string: 应用名称,不会作为唯一表示
- icon - string: 应用图标的 URL。必须是 PNG、ICO 等格式,不支持 SVG 图标。最好传递指向 180x180px PNG 图标的 url
- actionsConfiguration - object
- modals - ('before' | 'success' | 'error')[] | 'all' 交易过程中的提醒界面展示模式,默认为'before'
- returnStrategy -string 'none' |
${string}://${string}
; 针对app 钱包,指定当用户签署/拒绝请求时深层链接的返回策略,如果是在telegram中,可以配置tg://resolve - tmaReturnUrl -string 'back' | 'none' |
${string}://${string}
; Telegram Mini Wallet 钱包中,用户签署/拒绝请求时深层链接的返回策略,一般配置back,表示签名后关闭钱包,会自动展示出dapp;none 表示签名后不做处理;默认为back;
- uiPreferences -object
- theme - Theme 可以是:THEME.DARK, THEME.LIGHT, "SYSTEM"
- language - "en_US" | "ru_RU" | "zh_CN" | "ar_AE" | "cs_CZ" | "de_DE" | "es_ES" | "es_LAT" | "fr_FR" | "id_ID" | "it_IT" | "nl_NL" | "pl_PL" | "pt_BR" | "pt_PT" | "ro_RO" | "tr_TR" | "uk_UA" | "vi_VN"; , 默认为en_US
返回值
- OKXUniversalConnectUI
示例
import { OKXUniversalConnectUI } from "@okxconnect/ui";
const okxUniversalConnectUI = await OKXUniversalConnectUI.init({
dappMetaData: {
icon: "https://static.okx.com/cdn/assets/imgs/247/58E63FEA47A2B7D7.png",
name: "OKX Connect Demo"
},
actionsConfiguration: {
returnStrategy: 'tg://resolve',
modals:"all"
},
language: "en_US",
uiPreferences: {
theme: THEME.LIGHT
},
});
连接钱包#
连接钱包去获取钱包地址,作为标识符和用于签名交易的必要参数
okxUniversalConnectUI.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"
- namespaces - [namespace: string]: ConnectNamespace ; 请求连接的可选信息, EVM系的key为"eip155",BTC系的key为"btc",如果请求的链中,有任何一个链钱包不支持的话,钱包会拒绝连接
返回值
- 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 okxUniversalConnectUI.connect({
namespaces: {
btc: {
chains: [
"btc:mainnet",
// "fractal:mainnet"
],
}
},
sessionConfig: {
redirect: "tg://resolve"
}
})
连接钱包并签名#
连接钱包获取钱包地址,并对数据进行签名;签名结果会在"connect_signResponse"的event中回调
await okxUniversalConnectUI.openModalAndSign(connectParams: ConnectParams, signRequest: RequestParams[])
请求参数
- connectParams - ConnectParams
- namespaces - [namespace: string]: ConnectNamespace ; 请求连接的可选信息,BTC系的key为"btc",如果请求的链中,有任何一个链钱包不支持的话,钱包会拒绝连接
- chains: string[]; 链id信息
- defaultChain?: string; 默认链
- optionalNamespaces - [namespace: string]: ConnectNamespace; 请求连接的可选信息,BTC系的key为"btc",如果对应的链信息钱包不支持,依然可以连接
- chains: string[]; 链id信息
- defaultChain?: string; 默认链
- sessionConfig: object
- redirect: string 连接成功后的跳转参数,如果是Telegram中的Mini App,这里可以设置为Telegram的deeplink: "tg://resolve"
- namespaces - [namespace: string]: ConnectNamespace ; 请求连接的可选信息,BTC系的key为"btc",如果请求的链中,有任何一个链钱包不支持的话,钱包会拒绝连接
- signRequest - RequestParams[]; 请求连接并签名的方法, 同时最多只能支持一个方法
- method: string; 请求的方法名称, BTC系支持的方法有:"btc_signMessage"
- chainId: string; 执行方法所在的链的ID, 该chainId必须包含在上面的namespaces中
- params: unknown[] | Record
<string, unknown>
| object | undefined; 请求的方法对应的参数
返回值
- 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
- dappInfo: object DApp 信息
示例
// 先添加签名结果监听
okxUniversalConnectUI.on("connect_signResponse", (signResponse) => {
console.log(signResponse);
});
var session = await okxUniversalConnectUI.openModalAndSign({
namespaces: {
btc: {
chains: [
"btc:mainnet",
// "fractal:mainnet"
],
}
},
sessionConfig: {
redirect: "tg://resolve"
}
},
[
{
method: "btc_signMessage",
chainId: "btc:mainnet",
params: {
message: "Welcome to BTC"
}
}
])
判断钱包是否已连接#
获取当前是否有连接钱包
返回值
- boolean
示例
universalUi.connected()
准备交易#
首先创建一个OKXBtcProvider对象,构造函数传入okxUniversalConnectUI
import { OKXBtcProvider } from "@okxconnect/universal-provider";
let okxBtcProvider = new OKXBtcProvider(okxUniversalConnectUI)
获取钱包账户信息#
okxBtcProvider.getAccount(chainId)
请求参数
- chainId: 请求的链,如btc:mainnet, fractal:mainnet
返回值
- Object
- address: string 钱包地址
- publicKey: string 公钥
示例
let result = okxBtcProvider.getAccount("btc:mainnet")
//返回结构
{
"address": "038936b367d47b3796b430a31694320918afdc458d81dea9bb7dd35c0aad8bc694",
"publicKey": "03cbaedc26f03fd3ba02fc936f338e980c9e2172c5e23128877ed46827e935296f"
}
签名#
okxBtcProvider.signMessage(chain, message, type?)
请求参数
- chain - string, 请求执行方法的链
- signStr - string 需要签名的消息
- type - (可选) "ecdsa" | "bip322-simple",默认值是 "ecdsa"
返回值
- Promise - string: 签名结果
示例
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 交易哈希
示例
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的十六进制字符串
示例
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 的十六进制字符串
示例
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 的十六进制字符串
示例
let chain = "btc:mainnet"
let psbtHex = ""
let options = { autoFinalized: false }
let result = okxBtcProvider.signAndPushPsbt(chain, psbtHex, options)
/**
返回结构:
{
txhash: "",
signature: ""
}
*/
断开钱包连接#
断开已连接钱包,并删除当前会话,如果要切换连接钱包,请先断开当前钱包
okxUniversalConnectUI.disconnect()
Event事件#
// 生成 universalLink
okxUniversalConnectUI.on("display_uri", (uri) => {
console.log(uri);
});
// session 信息变更会触发该事件;
okxUniversalConnectUI.on("session_update", (session) => {
console.log(JSON.stringify(session));
});
// 断开连接会触发该事件;
okxUniversalConnectUI.on("session_delete", ({topic}) => {
console.log(topic);
});
// 连接并签名时,签名结果会触发该事件;
okxUniversalConnectUI.on("connect_signResponse", (signResponse) => {
console.log(signResponse);
});
错误码#
在连接,交易,断开连接的过程中可能抛出的异常
异常
错误码 | 描述 |
---|---|
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
}