SDK#
Installation and Initialization#
Make sure to update to version 6.92.0 or later to get started with access: to integrate OKX Connect into your DApp, you can use npm:
npm install @okxconnect/universal-provider
Before connecting to a wallet, you need to create an object that will be used to connect to the wallet, send transactions, and so on.
OKXUniversalProvider.init({dappMetaData: {name, icon}})
Request parameters
- dappMetaData - object
- name - string: the name of the application, will not be used as a unique representation.
- icon - string: URL of the application icon, must be in PNG, ICO, etc. SVG icons are not supported. SVG icons are not supported. It is better to pass a url pointing to a 180x180px PNG icon.
Returns a value
- OKXUniversalProvider
Examples
import { OKXUniversalProvider } from "@okxconnect/universal-provider";
const okxUniversalProvider = await OKXUniversalProvider.init({
dappMetaData: {
name: "application name",
icon: "application icon url"
},
})
Connecting to a wallet#
Connect to the wallet to get the wallet address as an identifier and the necessary parameters for signing transactions.
okxUniversalProvider.connect(connectParams: ConnectParams);
Request Parameters
- connectParams - ConnectParams
- namespaces - [namespace: string]: ConnectNamespace ; Optional information for the requested connection, the key is 'eip155' for EVM and 'btc' for BTC, if any of the requested chain is not supported by the wallet, the wallet will reject the connection;
- chains: string[]; Chain id information, the
- defaultChain?: string; default chain
- optionalNamespaces - [namespace: string]: ConnectNamespace; optional information for connection request, the key is 'eip155' for EVM system and 'btc' for BTC system, if the corresponding chain information is not supported by the wallet, you can still connect;
- chains: string[]; Chain id information, chain information of the wallet, chain information of the wallet.
- defaultChain?: string; default chain
- sessionConfig: object
- redirect: string Jump parameter after successful connection, if it is Mini App in Telegram, here can be set to Telegram's deeplink: 'tg://resolve'
- namespaces - [namespace: string]: ConnectNamespace ; Optional information for the requested connection, the key is 'eip155' for EVM and 'btc' for BTC, if any of the requested chain is not supported by the wallet, the wallet will reject the connection;
Return value
- Promise
<SessionTypes.Struct | undefined>
- topic: string; the session identifier;
- namespaces:
Record<string, Namespace>
; namespace information for a successful connection;- chains: string[]; Chain information for the connection;
- accounts: string[]; accounts information for the connection;
- methods: string[]; methods supported by the wallet under the current namespace;
- defaultChain?: string; The default chain for the current session.
- sessionConfig?: SessionConfig
- dappInfo: object DApp information;
- name:string
- icon:string
- redirect?: string, the redirect parameter after successful connection;
- dappInfo: object DApp information;
Example
var session = await okxUniversalProvider.connect({
namespaces: {
btc: {
chains: [
"btc:mainnet",
// "fractal:mainnet"
],
}
},
sessionConfig: {
redirect: "tg://resolve"
}
})
Determine if the wallet is connected#
Gets whether the wallet is currently connected.
Return Value
- boolean
Example
okxUniversalProvider.connected();
Send signature and transaction#
First create an OKXBtcProvider object and pass OKXUniversalProvider into the constructor.
import { OKXBtcProvider } from "@okxconnect/universal-provider";
let okxBtcProvider = new OKXBtcProvider(okxUniversalProvider)
getAccount
okxBtcProvider.getAccount(chainId);
Request parameters
- chainId: the requested chain, e.g. btc:mainnet, fractal:mainnet
Return value
- Object
- address: string wallet address
- publicKey: string public key
Example
let result = okxBtcProvider.getAccount("btc:mainnet")
// Return structure
{
"address": "038936b367d47b3796b430a31694320918afdc458d81dea9bb7dd35c0aad8bc694",
"publicKey": "03cbaedc26f03fd3ba02fc936f338e980c9e2172c5e23128877ed46827e935296f"
}
Signature
okxBtcProvider.signMessage(chain, message, type?);
Request parameters
- chain - string, the chain of the requested execution method
- signStr - string the message to be signed
- type - (optional) 'ecdsa' | 'bip322-simple', default is 'ecdsa'.
Return Value
- Promise - string: Signature result
Example
let chain = "btc:mainnet"
let signStr = "data need to sign ..."
let result = okxBtcProvider.signMessage(chain, signStr)
// Return structure: "H83jZpulbMDDGUiTA4M8QNChmWwaKxwPCm8U5EBvftKlSMMzuvtVxBHlygtof5NBbdSVPiAtCvOUwZmz2vViHHU="
Send#
okxBtcProvider.send(chainId, input);
Request parameters
- chainId - string, the chain for which the signature is requested to be executed, mandatory parameter, e.g. btc:mainnet
- input - Object
- from - string, the BTC address of the currently connected wallet
- to - string, the address of the wallet receiving BTC
- value - string, the amount of BTC to send
- satBytes - string, (optional) customised rate
- memo - string, (optional) specify outputs OP_RETURN content example
- memoPos - number, (optional) Specify the outputs OP_RETURN output position, if you pass memo then you must pass in memoPos to specify the position, otherwise memo will not take effect.
Return Value
- Promise - Object
- txHash The transaction hash.
Example
let chain = "btc:mainnet"
let input = {
from: '',
to: '1NKnZ3uAuQLnm....Y44u1efwCgTiAxBn',
value: '0.000015'
}
let result = okxBtcProvider.send(chain, input)
/**
Return structure:
{"txhash":"ff18d01ef6abed3b7fd23247a1fc457ca...f49b6bb4529a19a5fb637f18ce2e"}
*/
Send Bitcoin
okxBtcProvider.sendBitcoin(chainId, toAddress, satoshis, options);
Request parameters
- chainId - string, the chain for which the signature is requested to be executed, mandatory parameter, e.g. btc:mainnet
- toAddress - string, string, accepted address
- satoshis - number, the number of satoshis to be sent
- options - Object (optional)
- feeRate - number (optional) customised fee rate
Return Value
- Promise - string The transaction hash
Example
let chain = "btc:mainnet"
let toAddress = '1NKnZ3uAuQLnmE...4u1efwCgTiAxBn' // pattern测试钱包的legacy地址
let satoshis = 17000
let options = {
feeRate: 16
}
let result = okxBtcProvider.sendBitcoin(chain, toAddress, satoshis, options)
/**
Return structure:
"ff18d01ef6abed3b7fd23247a1fc457ca...f49b6bb4529a19a5fb637f18ce2e"
*/
signPsbt#
okxBtcProvider.signPsbt(chainId, psbtHex, options);
Request parameters
- chain - string, the chain for which the signature is requested, must be passed, e.g. btc:mainnet
- psbtHex - string, the hexadecimal string of the psbt to be signed.
- options.
- autoFinalized - boolean: if or not the psbt is finalised after signing, default is true
- toSignInputs - array:
- index - number: the input to sign
- address - string: the address of the corresponding private key to be used for signing
- publicKey - string: the public key of the corresponding private key to be used for signature
- sighashTypes - number[]: (optional) sighashTypes
- disableTweakSigner - boolean: (optional) When signing and unlocking Taproot addresses, tweakSigner is used to generate signatures by default, enable this option to allow signing with the original private key.
Return Values
- Promise - string hex string of the signed psbt.
Example
let chain = "btc:mainnet"
let psbtHex = ""
let options = { autoFinalized: false }
let result = okxBtcProvider.signPsbt(chain, psbtHex, options)
/**
Return structure:
"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="
*/
Sign multiple Psbt#
okxBtcProvider.signAndPushPsbt(chainId, psbtHex, options);
Request Parameters
- chainId - string, the chain for which the signature execution is requested, mandatory parameter, e.g. btc:mainnet
- psbtHex - string[], hexadecimal string of the psbt to be signed.
- options - object[], a hexadecimal string of the psbt to be signed.
- autoFinalized - boolean: if or not the psbt is finalised after signing, default is true
- toSignInputs - array:
- index - number: the input to sign
- address - string: the address of the corresponding private key to be used for signing
- publicKey - string: the public key of the corresponding private key to be used for signature
- sighashTypes - number[]: (optional) sighashTypes
- disableTweakSigner - boolean: (optional) When signing and unlocking Taproot addresses, tweakSigner is used to generate signatures by default, enable this option to allow signing with the original private key.
Return Values
- Promise - string[] Hexadecimal string of the signed psbt.
Example
let chain = "btc:mainnet"
let psbtHexs = [""]
let options = [{ autoFinalized: false }]
let result = okxBtcProvider.signPsbts(chain, psbtHexs, options)
/**
Return structure:
["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="]
*/
Sign and Broadcast signAndPushPsbt#
required App: >= 6.93.0
okxBtcProvider.signAndPushPsbt(chainId, psbtHex, options);
Request parameters
- chain - string, the chain for which the signature is requested, must be passed, e.g. btc:mainnet
- psbtHex - string, the hexadecimal string of the psbt to be signed.
- options: - object
- autoFinalized - boolean: if or not the psbt is finalised after signing, default is true
- toSignInputs - array:
- index - number: the input to sign
- address - string: the address of the corresponding private key to be used for signing
- publicKey - string: the public key of the corresponding private key to be used for signing
- sighashTypes - number[]: (optional) sighashTypes
- disableTweakSigner - boolean: (optional) When signing and unlocking Taproot addresses, tweakSigner is used to generate signatures by default, enable this option to allow signing with the original private key.
Returns a value
- Promise - object
- txhash Transaction hash
- signature Hexadecimal string of the signed psbt.
Example
let chain = "btc:mainnet"
let psbtHex = ""
let options = { autoFinalized: false }
let result = okxBtcProvider.signAndPushPsbt(chain, psbtHex, options)
/**
Return structure:
{
txhash: "",
signature: ""
}
*/
Disconnect wallet#
Disconnect the connected wallet and delete the current session. If you want to switch the connected wallet, please disconnect the current wallet first.
okxUniversalProvider.disconnect();
Event#
// Generate universalLink
okxUniversalProvider.on('display_uri', (uri) => {
console.log(uri);
}).
// Session information changes will trigger this event;
okxUniversalProvider.on('session_update', (session) => {
console.log(JSON.stringify(session)); }); // Session information changes (e.g., adding a custom chain).
// Disconnecting triggers this event;
okxUniversalProvider.on('session_delete', ({topic}) => {
console.log(topic);
});
Error codes#
Exceptions that may be thrown during connection, transaction, and disconnection.
Exception
Error Code | Description |
---|---|
OKX_CONNECT_ERROR_CODES.UNKNOWN_ERROR | Unknown Error |
OKX_CONNECT_ERROR_CODES.ALREADY_CONNECTED_ERROR | Wallet Already Connected |
OKX_CONNECT_ERROR_CODES.NOT_CONNECTED_ERROR | Wallet Not Connected |
OKX_CONNECT_ERROR_CODES.USER_REJECTS_ERROR | User Rejected |
OKX_CONNECT_ERROR_CODES.METHOD_NOT_SUPPORTED | Method Not Supported |
OKX_CONNECT_ERROR_CODES.CHAIN_NOT_SUPPORTED | Chain Not Supported |
OKX_CONNECT_ERROR_CODES.WALLET_NOT_SUPPORTED | Wallet Not Supported |
OKX_CONNECT_ERROR_CODES.CONNECTION_ERROR | 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
}