Connect to App or Mini Wallet

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'

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;

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 CodeDescription
OKX_CONNECT_ERROR_CODES.UNKNOWN_ERRORUnknown Error
OKX_CONNECT_ERROR_CODES.ALREADY_CONNECTED_ERRORWallet Already Connected
OKX_CONNECT_ERROR_CODES.NOT_CONNECTED_ERRORWallet Not Connected
OKX_CONNECT_ERROR_CODES.USER_REJECTS_ERRORUser Rejected
OKX_CONNECT_ERROR_CODES.METHOD_NOT_SUPPORTEDMethod Not Supported
OKX_CONNECT_ERROR_CODES.CHAIN_NOT_SUPPORTEDChain Not Supported
OKX_CONNECT_ERROR_CODES.WALLET_NOT_SUPPORTEDWallet Not Supported
OKX_CONNECT_ERROR_CODES.CONNECTION_ERRORConnection 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
}