Provider API#
什么是 Injected provider API?#
OKX Injected Providers API 基于 JavaScript 模型,由 OKX 嵌入用户访问网站中。DApp 项目可以通过调用此 API 请求用户账户信息,从用户所连接的区块链中读取数据,并协助用户进行消息和交易的签署。
connect#
okxwallet.bitcoin.connect()
描述
连接钱包
参数
无
返回值
- Promise - object
- address - string:当前账户的地址
- publicKey - string:当前账户的公钥
 
示例
const result = await okxwallet.bitcoin.connect()
// example
{
  address: 'bc1pwqye6x35g2n6xpwalywhpsvsu39k3l6086cvdgqazlw9mz2meansz9knaq',
  publicKey: '4a627f388196639041ce226c0229560127ef9a5a39d4885123cd82dc82d8b497'
}
requestAccounts#
okxwallet.bitcoin.requestAccounts()
描述
请求连接当前账户
参数
无
返回值
- Promise - string[]:当前账户的地址
示例
try {
  let accounts = await okxwallet.bitcoin.requestAccounts();
  console.log('connect success', accounts);
} catch (e) {
  console.log('connect failed');
}
// example
['tb1qrn7tvhdf6wnh790384ahj56u0xaa0kqgautnnz'];
getAccounts#
okxwallet.bitcoin.getAccounts()
描述
获取当前账户地址
参数
无
返回值
- Promise - string[]:当前账户地址
示例
try {
  let res = await okxwallet.bitcoin.getAccounts();
  console.log(res);
} catch (e) {
  console.log(e);
}
// example
['tb1qrn7tvhdf6wnh790384ahj56u0xaa0kqgautnnz'];
getNetwork#
- 不支持测试网络。
- 此字段仅适用于插件端版本 2.77.1 或更高。
okxwallet.bitcoin.getNetwork()
描述
获取网络
参数
无
返回值
- Promise - string:网络
示例
try {
  let res = await okxwallet.bitcoin.getNetwork();
  console.log(res);
} catch (e) {
  console.log(e);
}
// example
livenet;
getPublicKey#
okxwallet.bitcoin.getPublicKey()
描述
获取当前账户的公钥
参数
无
返回值
- Promise - string:公钥
示例
try {
  let res = await okxwallet.bitcoin.getPublicKey();
  console.log(res)
} catch (e) {
  console.log(e);
}
// example
03cbaedc26f03fd3ba02fc936f338e980c9e2172c5e23128877ed46827e935296f
getBalance#
okxwallet.bitcoin.getBalance()
描述
获取 BTC 余额
参数
无
返回值
- Promise - object:
- confirmed - number:已确认的聪数量
- unconfirmed - number:未经确认的聪数量
- total - number:总聪量
 
示例
try {
  let res = await okxwallet.bitcoin.getBalance();
  console.log(res)
} catch (e) {
  console.log(e);
}
// example
{
  "confirmed":0,
  "unconfirmed":100000,
  "total":100000
}
getInscriptions#
okxwallet.bitcoin.getInscriptions()
描述
获取当前账户的铭文列表
参数
- cursor - number: (可选) 偏移量,从 0 开始,默认值是 0
- size - number: (可选) 每页的数量,默认值是 20
返回值
- Promise - object:
- total - number:总数
- list - object[]:
- inscriptionId - string:铭文 ID
- inscriptionNumber - string: 铭文编号
- address - string:铭文地址
- outputValue - string:铭文的输出值
- contentLength - string:铭文的内容长度
- contentType - number:铭文的内容类型
- timestamp - number:铭文的区块时间
- offset - number:铭文的偏移量
- output - string:当前铭文所在 UTXO 的标识
- genesisTransaction - string:创世交易的交易 ID
- location - string:当前位置的 txid 和 vout
 
 
示例
try {
  let res = await okxwallet.bitcoin.getInscriptions(0, 20);
  console.log(res)
} catch (e) {
  console.log(e);
}
// example
{
  "total":10,
  "list":[
    {
      inscriptionId: '6037b17df2f48cf87f6b6e6ff89af416f6f21dd3d3bc9f1832fb1ff560037531i0',
      inscriptionNumber: 55878989,
      address: 'bc1q8h8s4zd9y0lkrx334aqnj4ykqs220ss735a3gh',
      outputValue: 546,
      contentLength: 53,
      contentType: 'text/plain',
      timestamp: 1705406294,
      location: '6037b17df2f48cf87f6b6e6ff89af416f6f21dd3d3bc9f1832fb1ff560037531:0:0',
      output: '6037b17df2f48cf87f6b6e6ff89af416f6f21dd3d3bc9f1832fb1ff560037531:0',
      offset: 0,
      genesisTransaction: '02c9eae52923fdb21fe16ee9eb873c7d66fe412a61b75147451d8a47d089def4'
    }
  ]
}
sendBitcoin#
okxwallet.bitcoin.sendBitcoin(toAddress, satoshis, options)
描述
发送比特币
参数
- toAddress - string:发送地址
- satoshis - number:1. 发送的聪数量
- options - object: (可选)
- feeRate - number:网络资费率
 
返回值
- Promise- string:交易哈希
示例
try {
  let txid = await okxwallet.bitcoin.sendBitcoin(
    'tb1qrn7tvhdf6wnh790384ahj56u0xaa0kqgautnnz',
    1000
  );
  console.log(txid);
} catch (e) {
  console.log(e);
}
send#
okxwallet.bitcoin.send({ from, to, value, satBytes })
描述
转移比特币 (支持 memo 字段)
参数
- from - string:当前连接的钱包的 BTC 地址
- to - string:接受 BTC 的地址
- value - string:发送 BTC 的数量
- satBytes - string: (可选) 自定义费率
- memo - string: (可选) 指定 outputs OP_RETURN 内容 示例
- memoPos - number: (可选) 指定 outputs OP_RETURN 输出位置,如果传了 memo 则必须传入 memoPos 指定位置,否则 memo 不生效
返回值
- Promise - object
- txhash:交易哈希
 
示例
const result = await window.okxwallet.bitcoin.send({
  from: 'bc1p4k9ghlrynzuum080a4zk6e2my8kjzfhptr5747afzrn7xmmdtj6sgrhd0m',
  to: 'bc1plklsxq4wtv44dv8nm49fj0gh0zm9zxewm6ayzahrxc8yqtennc2s9udmcd',
  value: '0.000012',
});
// example
{
  txhash: 'd153136cd74512b69d24c68b2d2c715c3629e607540c3f6cd3acc1140ca9bf57';
}
sendInscription#
okxwallet.bitcoin.sendInscription(address, inscriptionId, options)
描述
发送铭文
参数
- 
address - string:接收者地址 
- 
inscriptionId - string:铭文 ID + 协议,没有传协议则默认是 Ordinals NFT ,目前仅支持 Ordinals 及 Atomicals 协议 协议 描述 Ordinals Ordinals 协议 Atomicals Atomicals 协议 
- 
options - object: (可选) - feeRate - number:自定义费率
 
返回值
- Promise - string:交易哈希
示例
// 发送 Ordinals NFT
try {
  let txid = await okxwallet.bitcoin.sendInscription(
    'tb1q8h8s4zd9y0lkrx334aqnj4ykqs220ss7mjxzny',
    'e9b86a063d78cc8a1ed17d291703bcc95bcd521e087ab0c7f1621c9c607def1ai0',
    { feeRate: 15 }
  );
  console.log(
    'send Ordinal NFT to tb1q8h8s4zd9y0lkrx334aqnj4ykqs220ss7mjxzny',
    { txid }
  );
} catch (e) {
  console.log(e);
}
// 发送 Atomicals NFT
try {
  let txid = await okxwallet.bitcoin.sendInscription(
    'tb1q8h8s4zd9y0lkrx334aqnj4ykqs220ss7mjxzny',
    'ab12349dca49643fcc55c8e6a685ad0481047139c5b1af5af85387973fc7ceafi0-Atomicals',
    { feeRate: 15 }
  );
  console.log(
    'send Atomicals NFT to tb1q8h8s4zd9y0lkrx334aqnj4ykqs220ss7mjxzny',
    { txid }
  );
} catch (e) {
  console.log(e);
}
transferNft#
okxwallet.bitcoin.transferNft({ from, to, data })
描述
发送铭文
transferNft 方法支持批量转移,sendInscription 方法只支持单个转移
参数
- 
from - string:当前连接的钱包的 BTC 地址 
- 
to - string:接受 NFT 的地址 
- 
data - string | string[]:发送的 NFT tokenId + 协议,如果是数组,则是批量转移多个 NFT , 没有传协议则默认是 Ordinals NFT ,目前仅支持 Ordinals 及 Atomicals 协议 协议 描述 Ordinals Ordinals 协议 Atomicals Atomicals 协议 
返回值
- Promise - object
- txhash - string:交易哈希
 
示例
// 发送 Ordinals NFT
try {
  let res = await window.okxwallet.bitcoin.transferNft({
    from: 'bc1p8qfrmxdlmynr076uu28vlszxavwujwe7dus0r8y9thrnp5lgfh6qu2ctrr',
    to: 'bc1p8qfrmxdlmynr076uu28vlszxavwujwe7dus0r8y9thrnp5lgfh6qu2ctrr',
    data: [
      '2f285ba4c457c98c35dcb008114b96cee7c957f00a6993690efb231f91ccc2d9i0-Ordinals',
      '2f2532f59d6e46931bc84e496cc6b45f87966b149b85ed3199265cb845550d58i0-Ordinals',
    ],
  });
  console.log(res);
} catch (e) {
  console.log(e);
}
// example
{
  txhash: 'df409c3ce3c4d7d840b681fab8a3a5b8e32b1600636cc5409d84d2c06365a5fc';
}
// 发送 Atomicals NFT
try {
  let res = await window.okxwallet.bitcoin.transferNft({
    from: 'bc1p8qfrmxdlmynr076uu28vlszxavwujwe7dus0r8y9thrnp5lgfh6qu2ctrr',
    to: 'bc1p8qfrmxdlmynr076uu28vlszxavwujwe7dus0r8y9thrnp5lgfh6qu2ctrr',
    data: [
      'ab12349dca49643fcc55c8e6a685ad0481047139c5b1af5af85387973fc7ceafi0-Atomicals',
    ],
  });
  console.log(res);
} catch (e) {
  console.log(e);
}
// example
{
  txhash: 'df409c3ce3c4d7d840b681fab8a3a5b8e32b1600636cc5409d84d2c06365a5fc';
}
signMessage#
okxwallet.bitcoin.signMessage(signStr[, type])
描述
签名消息
参数
- signStr - string:需要签名的数据
- type - string: (可选) "ecdsa" | "bip322-simple",默认值是 "ecdsa"。(请注意:版本低于 6.51.0 的应用仅支持“ecdsa”签名算法,而版本为 6.51.0 或更高的应用可支持所有签名算法类型。)
返回值
- Promise - string:签名结果
示例
const signStr = 'need sign string';
const result = await window.okxwallet.bitcoin.signMessage(signStr, 'ecdsa')
// example
INg2ZeG8b6GsiYLiWeQQpvmfFHqCt3zC6ocdlN9ZRQLhSFZdGhgYWF8ipar1wqJtYufxzSYiZm5kdlAcnxgZWQU=
pushTx#
okxwallet.bitcoin.pushTx(rawTx)
描述
推送交易
参数
- rawTx - string:上链的原始交易
返回值
- Promise - string:交易哈希
示例
try {
  let txid = await okxwallet.bitcoin.pushTx('0200000000010135bd7d...');
  console.log(txid);
} catch (e) {
  console.log(e);
}
splitUtxo#
okxwallet.bitcoin.splitUtxo({ from, amount })
描述
拆分 UTXO,初始化钱包
拆分是因为签名算法需要
 
参数
- object
- from - string:当前连接的钱包的 BTC 地址
- amount - number: (可选) 拆分的数量,默认值是 2
 
返回值
- Promise - {utxos: array}: UTXO 和签名
示例
try {
  let { utxos } = await window.okxwallet.bitcoin.splitUtxo({
    from: 'bc1pkrym02ck30phct287l0rktjjjnapavkl2qhsy78aeeeuk3qaaulqh90v6s',
  });
  console.log(utxos);
} catch (e) {
  console.log(e);
}
// example
{
  utxos: [
    {
      txId: '1e0f92720ef34ab75eefc5d691b551fb2f783eac61503a69cdf63eb7305d2306',
      vOut: 0,
      amount: 546,
      rawTransaction: 'xxxx',
    },
    {
      txId: '1e0f92720ef34ab75eefc5d691b551fb2f783eac61503a69cdf63eb7305d2306',
      vOut: 1,
      amount: 546,
      rawTransaction: 'xxxx',
    },
  ];
}
inscribe#
okxwallet.bitcoin.inscribe({ type, from, tick, tid })
描述
铭刻可转移的 BRC-20
参数
- 
type - number:交易类型,详情见下表 类型 描述 51 默认值,BRC-20 的转移铭刻 
- 
from - string:当前连接的钱包的 BTC 地址 
- 
tick - string:BRC-20 的代币名称 (来自于链上) 
返回值
- Promise - string:揭示交易的哈希
示例
try {
  let txid = await okxwallet.bitcoin.inscribe({
    from: 'bc1pkrym02ck30phct287l0rktjjjnapavkl2qhsy78aeeeuk3qaaulqh90v6s',
    tick: 'ordi',
  });
  console.log(txid);
} catch (e) {
  console.log(e);
}
mint#
okxwallet.bitcoin.mint({ type, from, inscriptions })
描述
支持 Ordinal 协议的通用铭刻,支持批量铭刻
参数
- 
type - number:要发送的铭刻交易类型,详情见下表 类型 描述 60 BRC-20 deploy 铭刻 50 BRC-20 mint 铭刻 51 BRC-20 transfer 铭刻 62 图片铭刻,需要将图片转换为图片字节流的 16 进制字符串表示 61 纯文本 
- 
from - string:当前连接钱包的 BTC 地址 
- 
inscriptions - object[]:铭刻的数组。单个数组项是对象类型,其拥有的字段及其含义,如下表所示: 字段 类型 默认值 描述 contentType string "text/plain;charset=utf-8" 所铭刻内容的类型, MIME 类型的值,Ordinals 协议规定,详情可查看:https://docs.ordinals.com/inscriptions.html body string 无 所铭刻的内容 不同铭刻类型传入的 contentType 和 body 入参: 铭刻类型 contentType body 图片铭刻 "image/png" 、"image/jpeg" 等 需要将图片转换为图片字节流的 16 进制字符串表示 BRC-20 "text/plain;charset=utf-8" 通过 JSON.stringify 转换为字符串即可 纯文本 "text/plain;charset=utf-8" 直接传入纯文本即可 
返回值
- Promise - object,其拥有的字段及其含义,如下所示:
- commitTx - string:铭刻时,commit 交易的哈希值
- revealTxs - string[]:铭刻时,reveal 交易的哈希值。如果是批量铭刻,则分别对应于 reveal 交易的哈希值
- commitTxFee - number:commit 交易花费的网络费用
- revealTxFees - number[]:reveal 交易花费的网络费用。如果是批量铭刻,则分别对应于 reveal 交易的网路费用
- commitAddrs - string[]:commit 交易的 to 地址,即代打地址
- feeRate - number:铭刻时,网络费率
- size - number:铭刻时,铭文的大小
 
示例
okxwallet.bitcoin.mint({
    type: 61,
    from: 'bc1p4k9ghlrynzuum080a4zk6e2my8kjzfhptr5747afzrn7xmmdtj6sgrhd0m',
    inscriptions: [{
        contentType: 'text/plain;charset=utf-8',
        body: 'hello'
    }, {
        contentType: 'text/plain;charset=utf-8',
        body: 'world'
    }]
})
// response
{
    "commitAddrs": [
        "bc1p9trqtf68gfeq3f3hlktaapp0eapufh02ly8dr6swfwffflvncncqwvtuen",
        "bc1p5ttl7q2mpvfhjq3wqffka4c05sv5jcfphcl5qeuj0pmsx7evfhcqhm60rk"
    ],
    "commitTx": "453e126346bbaaef0aaaa208acd3426cd14a39f825bd76cb8d9892957e2a5bda",
    "revealTxs": [
        "526ff04e4ba34617ee28826412bdc8e22484890635320f880c5ec50f10d6b189",
        "0f65f79456a59b3e0cd4ef00e279d0d6da57582e114eafbada95b51759a845b2"
    ],
    "commitTxFee": 1379,
    "revealTxFees": [
        973,
        973
    ],
    feeRate: 80,
    size: 546,
}
signPsbt#
okxwallet.bitcoin.signPsbt(psbtHex[, options])
描述
签名 psbt,该方法将遍历所有与当前地址匹配的输入进行签名
参数
- psbtHex - string:要签名的 psbt 的十六进制字符串
构建交易生成 psbt (string 类型),如果遇到 input 地址是 Taproot 类型,需要提供公钥。
示例:可参考下面的 txInput 和 publicKey。
const txInputs: utxoInput[] = [];
txInputs.push({
      txId: "1e0f92720ef34ab75eefc5d691b551fb2f783eac61503a69cdf63eb7305d2306",
      vOut: 2,
      amount: 341474,
      address: "tb1q8h8....mjxzny",
      privateKey: "0s79......ldjejke",
      publicKey: "tb1q8h8....mjxzny",
      bip32Derivation: [
          {
              "masterFingerprint": "a22e8e32",
              "pubkey": "tb1q8h8....mjxzny",
              "path": "m/49'/0'/0'/0/0",
          },
      ],
  });
- 
options - 
autoFinalized - boolean:签名后是否完成 psbt,默认为 true 
- 
toSignInputs - array: - index - number:要签名的输入
- address - string:用于签名的相应私钥所对应的地址
- publicKey - string:用于签名的相应私钥所对应的公钥
- sighashTypes - number[]: (可选) sighashTypes
- disableTweakSigner - boolean: (可选) 签名和解锁 Taproot 地址时, 默认使用 tweakSigner 来生成签名,启用此选项允许使用原始私钥进行签名
 
 
- 
- 对于移动端版本低于 6.51.0 和插件端版本低于 2.77.1 的情况:不支持options,并且 autoFinalized默认为 false。
- 对于移动端版本为 6.51.0 或更高以及插件端版本为 2.77.1 或更高的情况:支持 options,并且 autoFinalized 是布尔值, 默认为 true。
返回值
- Promise - string:已签名 psbt 的十六进制字符串
示例
try {
  let res = await okxwallet.bitcoin.signPsbt('70736274ff01007d....', {
    autoFinalized: false,
    toSignInputs: [
      {
        index: 0,
        address: 'tb1q8h8....mjxzny',
      },
      {
        index: 1,
        publicKey: 'tb1q8h8....mjxzny',
        sighashTypes: [1],
      },
      {
        index: 2,
        publicKey: '02062...8779693f',
      },
    ],
  });
  console.log(res);
} catch (e) {
  console.log(e);
}
okxwallet.bitcoin.signPsbt('xxxxxxxx', {
  toSignInputs: [{ index: 0, publicKey: 'xxxxxx', disableTweakSigner: true }],
  autoFinalized: false,
});
signPsbts#
okxwallet.bitcoin.signPsbts(psbtHexs[, options])
描述
签署多个 psbt,该方法将遍历所有与当前地址匹配的输入进行签名
参数
- psbtHexs - string[]:要签名的 psbt 的十六进制字符串
构建交易生成 psbt (string 类型),如果遇到 input 地址是 Taproot 类型,需要提供公钥。
示例:可参考下面的 txInput 和 publicKey。
const txInputs: utxoInput[] = [];
txInputs.push({
      txId: "1e0f92720ef34ab75eefc5d691b551fb2f783eac61503a69cdf63eb7305d2306",
      vOut: 2,
      amount: 341474,
      address: "tb1q8h8....mjxzny",
      privateKey: "0s79......ldjejke",
      publicKey: "tb1q8h8....mjxzny",
      bip32Derivation: [
          {
              "masterFingerprint": "a22e8e32",
              "pubkey": "tb1q8h8....mjxzny",
              "path": "m/49'/0'/0'/0/0",
          },
      ],
  });
- options - object[]:签署 psbt 的选项
- autoFinalized - boolean:签名后是否完成 psbt,默认为 true
- toSignInputs - array:
- index - number:要签名的输入
- address - string:用于签名的相应私钥所对应的地址
- publicKey - string:用于签名的相应私钥所对应的公钥
- sighashTypes - number[]: (可选) sighashTypes
 
 
返回值
- Promise - string[]:已签名 psbt 的十六进制字符串
示例
try {
  let res = await okxwallet.bitcoin.signPsbts([
    '70736274ff01007d...',
    '70736274ff01007d...',
  ]);
  console.log(res);
} catch (e) {
  console.log(e);
}
pushPsbt#
okxwallet.bitcoin.pushPsbt(psbtHex)
描述
广播 psbt 交易
参数
- psbtHex - string:要推送的 psbt 的十六进制字符串
返回值
- Promise - string:交易哈希
示例
try {
  let res = await okxwallet.bitcoin.pushPsbt('70736274ff01007d....');
  console.log(res);
} catch (e) {
  console.log(e);
}
sendPsbt#
okxwallet.bitcoin.sendPsbt(txs, from)
描述
广播 psbt 交易
- sendPsbt方法支持批量上链,- pushPsbt方法只支持单个上链
- sendPsbt支持传入- type参数,使钱包内的交易历史展示更精确,而通过- pushPsbt方法上链的交易在交易历史展示的比较简单
参数
- txs - array:要发布的 psbt 交易
- from - string:当前连接钱包的 BTC 地址
| 类型 | 描述 | 
|---|---|
| 52 | 发送 BRC-20 | 
| 20 | 发送 NFT | 
返回值
- Promise - array:交易哈希
示例
okxwallet.bitcoin.sendPsbt([{
    itemId: "xxxxx0", // 批量唯一标识,多笔交易内不重复即可
    signedTx: '70736274ff01007d....', // 签名串
    type: 52, // 类型 BRC-20 传递 52, NFT 传递 20
    extJson: { // 拆UTXO的交易,可不传
        // NFTID
         inscription:"885441055c7bb5d1c54863e33f5c3a06e5a14cc4749cb61a9b3ff1dbe52a5bbbi0",
    }
},{
    itemId: "xxxxx1", // 批量唯一标识
    signedTx: '70736274ff01007d....', // 签名串或者要上链的psbt
    dependItemId: ['xxxxx0'], // 依赖的交易itemId,没有依赖的话,这个字段可以不传
    type: 52, // 类型 BRC-20 传递 52, NFT 传递 20
    extJson: {
        // NFTID
         inscription:"885441055c7bb5d1c54863e33f5c3a06e5a14cc4749cb61a9b3ff1dbe52a5bbbi0",
    }
}], from)
// response
[
    {"xxxxx0":"txId1"},{"xxxxx1":"txId2"}  // 失败txId返回空
]
accountChanged#
描述
OKX Wallet允许用户从单个扩展程序或移动应用程序中无缝管理多个账户。每当用户切换账户时,OKX Wallet都会发出一个 accountChanged 事件
如果用户在已连接到应用程序时更改账户,并且新账户已经将该应用程序列入白名单,那么用户将保持连接状态并且OKX Wallet将传递新账户的公钥:
用法
window.okxwallet.bitcoin.on('accountChanged', (addressInfo) => {
  console.log(addressInfo);
  {
    "address": "bc1pwqye6x35g2n6xpwalywhpsvsu39k3l6086cvdgqazlw9mz2meansz9knaq",
    "publicKey": "4a627f388196639041ce226c0229560127ef9a5a39d4885123cd82dc82d8b497",
    "compressedPublicKey": "034a627f388196639041ce226c0229560127ef9a5a39d4885123cd82dc82d8b497"
  }
});
accountsChanged#
描述
每当用户暴露的账户地址发生变化时,就会发出该消息
用法
window.okxwallet.bitcoin.on('accountsChanged', (accounts) => {
  console.log(accounts)[
    // example
    'tb1qrn7tvhdf6wnh790384ahj56u0xaa0kqgautnnz'
  ];
});
