欢迎来到 Wizz Wallet 开发者文档!本文档旨在帮助你学习如何在DApp中接入 Wizz Wallet 。
入门
在接入 Wizz Wallet 前,首先需要在你的终端上安装 Wizz Wallet。点击此处下载
安装并运行 Wizz Wallet 后,你会发现新打开的浏览器标签页在开发者控制台中可访问 window.wizz
对象。
示例
浏览器检测
要验证浏览器是否运行了 Wizz Wallet,请将下面的代码复制粘贴到你的网页浏览器的开发者控制台中:
if (typeof window.wizz !== 'undefined') {
console.log('Wizz Wallet is installed!');
}
你可以在这里查看 window.wizz
对象的完整 API。
连接 Wizz Wallet
“连接”或“登录”到 Wizz Wallet 实际上意味着“访问用户的比特币账户”。
你应该只在响应用户操作(如点击按钮)时发起连接请求。在连接请求进行中时,你应该始终禁用“连接”按钮。不要在页面加载时发起连接请求。
我们建议你添加一个按钮,允许用户将 Wizz Wallet 连接到你的 dapp。点击此按钮以调用以下方法:
wizz.requestAccounts()
可以从这里获取 Provider Api
的定义
pnpm add @wizz-btc/provider
方法
getVersion
获取插件当前的版本。 (仅插件支持)
const version = await wizz.getVersion();
console.log({ version });
参数
无
返回
Promise
返回 string
:当前插件版本。
requestAccounts
wizz.requestAccounts()
连接当前账户。
参数
无
返回
Promise
返回 string[]
:当前账户的地址。
示例
try {
let accounts = await window.wizz.requestAccounts();
console.log('connect success', accounts);
} catch (e) {
console.log('connect failed');
}
> connect success ['tb1qrn7tvhdf6wnh790384ahj56u0xaa0kqgautnnz']
isBiHelixAddress
查看当前钱包地址是否支持 BiHelix 网络。
wizz.isBiHelixAddress();
返回
Promise<boolean>
- 查看当前钱包地址是否支持 BiHelix 网络。
示例
wizz.isBiHelixAddress().then((v) => {
console.log('isBiHelixAddress:', v);
}).catch((e) => {
console.error('error:', e);
});
requestCPFP
创建 CPFP
加速交易请求(仅插件支持,且要求版本至少为 2.9.1)。
wizz.requestCPFP('52c965f7...d854800');
参数
txid
- string
- 要加速的交易 ID。
返回
Promise<string>
- 加速的交易 ID。
示例
wizz.requestCPFP('52c965f7...d854800').then((txid) => {
console.log('CPFP txid:', txid);
}).catch((e) => {
console.error('CPFP error:', e);
});
requestMint
发送请求以铸造各种类型的数字资产。(仅插件支持)
参数
options
- RequestMintParams
: 铸造请求的选项,根据被铸造的资产类型而有所不同。这是一个对象,可以根据 type
字段具有不同的属性。
type
- string
: 指定铸造操作的类型。可能的值有 'mint_arc20'
, 'mint_nft'
, 'mint_realm'
, 'mint_container'
, 和 'mint_dmitem'
。
对于 'mint_arc20'
类型:
atomicalId
- string
(可选): 要铸造的 ARC20 的原子 ID。
arc20
- string
(可选): 要铸造的ARC20的名字,和atomical id二选一
对于 'mint_nft'
类型:
fileBytes
- Uint8Array
(可选): 文件内容的字节。
fileName
- string
(可选): 文件的名称。
contentType
- string
(可选): 文件的 MIME 类型。
bitworkc
- string
(可选): 提交交易的挖矿难度,必须是带有单个可选的 点 的十六进制,与 1 到 15 之间的数字分隔,不超过 10 个十六进制字符。例如:0123 或 3456.12。长度在 4-10 位数字之间。
bitworkr
- string
(可选): 揭示交易的挖矿难度,格式同上。
satsIn
- number
(可选): nft 中的 sats 数量。
对于 'mint_dmitem'
类型:
atomicalId
- string
(可选): 要铸造的容器的 ID。
dmitem
- Record<string,any>:
dmitem 的 json 文件
satsIn
- number
(可选): dmitem 中的 sats 数量。
对于 'mint_realm'
类型:
bitworkc
- string
(可选): 提交交易的挖矿难度,格式同上。
satsIn
- number
(可选): realm 中的 sats 数量。
对于 'mint_subrealm'
类型:
satsIn
- number
(可选): subrealm 中的 sats 数量。
realm
- string
(可选): 父realm的名称,如果为unicode字符,需要先转为ASCII字符
subrealm
- string
(可选): 待mint的subrealm名称
对于 'mint_container'
类型:
bitworkc
- string
(可选): 提交交易的挖矿难度,格式同上。
satsIn
- number
(可选): container 中的 sats 数量。
返回
示例
// mint Arc20
wizz.requestMint({
type: 'mint_arc20',
arc20: 'atom' // 可选
}).catch(error => {
console.error('Error minting ARC20:', error);
})
//mint Realm
wizz.requestMint({
type: 'mint_realm',
realm: 'sats1573', // 可选
bitworkc: '12345.6', // 可选
satsIn: 888 // 可选
}).catch(error => {
console.error('Error minting Realm:', error);
})
// mintSubrealm
wizz.requestMint({
type: 'mint_subrealm',
realm: 'hello', // 可选
subrealm: '123456', // 可选
satsIn: 789 // 可选
}).catch(error => {
console.error('Error minting Subrealm:', error);
})
//mintContainer
wizz.requestMint({
type: 'mint_container',
container: 'sats1573', // 可选
satsIn: 666 // 可选
}).catch(error => {
console.error('Error minting Container:', error);
})
//mintDmitem
wizz.requestMint({
type: 'mint_dmitem',
collection: 'xxxx', // 可选
collectionId: 'xxx', // 可选
atomicalId: '00000b94ff2b25b8f51118aa65dd22dece0acd28609ae90bc564a276c33d5af2i0', // 可选
dmitem: {
'mainHash': '26af0bf67e433afe6c5637d07aaa9b17701efbe52d01e00e586635bcbf25dd36',
'data': {
'args': {
'request_dmitem': '878',
'main': 'image.svg',
'i': true,
'proof': [
{
'p': false,
'd': '13576b4c9ae48ae86adf82c21f9876531825db8e5727a10eaf4b90e2e3de8bbe',
},
{
'p': true,
'd': '0b0276c54bf8c0d790df490d91f26ca94463edf9937a6660be27f4c3339a0dc3',
},
{
'p': true,
'd': '44b1c7be4aa863ea5e4fbefd5bd994d8dcf6878b387b46989ac9dadd71af4411',
},
{
'p': true,
'd': '0be312c85b53777b274be59457c0895bb37d9accee8333e2836e027c4473e6c1',
},
{
'p': true,
'd': '89e5a2d475b4e7d05adfc1d14583b18dd34a7a21f39aa4d9141939238653e0d9',
},
{
'p': false,
'd': 'fca8254d88845c95a050449e255d7a06a576f747e61a17cba3dcc27bfd963c93',
},
{
'p': false,
'd': '94cc56fcfa9f494a286e72bbb40c1823a3f07a0f74546542df369513c819d540',
},
{
'p': true,
'd': '2a57764d24fd91bdccd0bc6b899dfa99be652acc921ceacc745fcb8e3c57952d',
},
{
'p': false,
'd': '4a9a30fea16b07b2232282afc1c95e52354c6d5c1d0589dc6be9a87650a43d7f',
},
{
'p': false,
'd': 'e07e43e2b753905a6ef99eaa3f656b342c0b781d344cb80ecce6a5e1dddf4757',
},
],
'parent_container': '00000b94ff2b25b8f51118aa65dd22dece0acd28609ae90bc564a276c33d5af2i0',
'bitworkc': '8888.8',
'bitworkr': '8888.8',
},
'image.svg': {
'$b': '3c7376672077696474683d2232303022206865696768743d223230302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667223e0a20203c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d2223303030303030222f3e0a20203c7465787420783d223530252220793d223435252220666f6e742d66616d696c793d22417269616c2220666f6e742d73697a653d223530222066696c6c3d2277686974652220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c65223ee681903c2f746578743e0a20203c7465787420783d223530252220793d223735252220666f6e742d66616d696c793d22417269616c2220666f6e742d73697a653d223230222066696c6c3d2277686974652220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c65223e6536383139303c2f746578743e0a3c2f7376673e',
},
},
'targetVector': '878:any:any:image.svg:26af0bf67e433afe6c5637d07aaa9b17701efbe52d01e00e586635bcbf25dd36',
'targethash': '26af0bf67e433afe6c5637d07aaa9b17701efbe52d01e00e586635bcbf25dd36',
},
satsIn: 666 // 可选
}).catch(error => {
console.error('Error minting DMItem:', error);
})
//mintNFT
wizz.requestMint({
type: 'mint_nft',
fileBytes: new Uint8Array([...]), // 可选
fileName: 'item-988.json', // 可选
contentType: 'application/json', // 可选
bitworkc: '8888.8', // 可选
bitworkr: '8888.8', // 可选
satsIn: 555 // 可选
}).catch(error => {
console.error('Error minting NFT:', error);
})
sendBitcoin
发送BTC交易。 (要求插件版本>=2.6.0)
const txid = await window.wizz.sendBitcoin('bc1p...', 1000, { feeRate: 100 });
console.log({ txid });
参数
返回
Promise
- string
: 交易的txid
sendARC20
发送ARC20交易。 (要求插件版本>=2.6.0) (仅插件支持)
const txid = await window.wizz.sendARC20('bc1p...', 'atom', 1000, { feeRate: 100 });
console.log({ txid });
参数
返回
Promise
- string
:交易的txid
sendAtomicals
发送Atomcials交易 (要求插件版本>=2.6.0) (仅插件支持)
const txid = await window.wizz.sendAtomicals('bc1p...', ['O9adf....', '80ea...'], { feeRate: 100 });
console.log({ txid });
参数
atomicalIds
待发送Atomicals ID列表
返回
Promise
- string
:交易的txid
getBalance
获取当前连接账号的余额 (要求插件版本>=2.6.0)
const { confirmed, unconfirmed, total } = await window.wizz.getBalance();
console.log({ confirmed, unconfirmed, total });
参数
无
返回
Promise
- { confirmed: number, unconfirmed: number, total: number }
: 当前账户的余额
getAccounts
获取当前账户的地址
参数
无
返回
Promise
- string[]
:当前账户的地址
示例
try {
let res = await window.wizz.getAccounts();
console.log(res)
} catch (e) {
console.log(e);
}
> ["tb1qrn7tvhdf6wnh790384ahj56u0xaa0kqgautnnz"]
getNetwork
获取网络
参数
无
返回
Promise
- string
:livenet
和 testnet
网络
示例
try {
let res = await window.wizz.getNetwork();
console.log(res)
} catch (e) {
console.log(e);
}
> 0
switchNetwork
wizz.switchNetwork(network)
切换网络
参数
network
- string
: livenet
和 testnet
网络
返回
无
示例
try {
let res = await window.wizz.switchNetwork("livenet");
console.log(res)
} catch (e) {
console.log(e);
}
> livenet
getPublicKey
获取当前账户的公钥。
参数
无
返回
Promise
- string
: 公钥
示例
try {
let res = await window.wizz.getPublicKey();
console.log(res)
} catch (e) {
console.log(e);
}
> 03cbaedc26f03fd3ba02fc936f338e980c9e2172c5e23128877ed46827e935296f
getInscriptions
wizz.getInscriptions(cursor, size)
列出当前账户的铭文
参数
无
返回
Promise
- Object
:
total
- number
: 总数
list
- Object[]
:
inscriptionId
- string
: 铭文的 ID。
inscriptionNumber
- string
: 铭文的编号。
address
- string
: 铭文的地址。
outputValue
- string
: 铭文的输出值。
content
- string
: 铭文的内容 URL。
contentLength
- string
: 铭文内容的长度。
contentType
- number
: 铭文内容的类型。
preview
- number
: 预览链接
timestamp
- number
: 铭文的区块时间。
offset
- number
: 铭文的偏移量。
genesisTransaction
- string
: 创世交易的 txid
location
- string
: 当前位置的 txid 和 vout
示例
try {
let res = await window.wizz.getInscriptions(0, 10);
console.log(res)
} catch (e) {
console.log(e);
}
> {
"total":10,
"list":[
{
inscriptionId: '6037b17df2f48cf87f6b6e6ff89af416f6f21dd3d3bc9f1832fb1ff560037531i0',
inscriptionNumber: 959941,
address: 'bc1q8h8s4zd9y0lkrx334aqnj4ykqs220ss735a3gh',
outputValue: 546,
preview: '<https://ordinals.com/preview/6037b17df2f48cf87f6b6e6ff89af416f6f21dd3d3bc9f1832fb1ff560037531i0>',
content: '<https://ordinals.com/content/6037b17df2f48cf87f6b6e6ff89af416f6f21dd3d3bc9f1832fb1ff560037531i0>',
contentLength: 53,
contentType: 'text/plain;charset=utf-8',
timestamp: 1680865285,
genesisTransaction: '6037b17df2f48cf87f6b6e6ff89af416f6f21dd3d3bc9f
1832fb1ff560037531',
location: '6037b17df2f48cf87f6b6e6ff89af416f6f21dd3d3bc9f1832fb1ff560037531:0:0',
output: '6037b17df2f48cf87f6b6e6ff89af416f6f21dd3d3bc9f1832fb1ff560037531:0',
offset: 0
}
]
}
signMessage
wizz.signMessage(msg[, type])
签名消息
参数
msg
- string
: 要签名的字符串
type
- string
: (可选) "ecdsa" | "bip322-simple"。默认为 "ecdsa"
返回
Promise
- string
: 签名。
示例
// 使用 ecdsa 签名
try {
let res = await window.wizz.signMessage("abcdefghijk123456789");
console.log(res)
} catch (e) {
console.log(e);
}
> G+LrYa7T5dUMDgQduAErw+i6ebK4GqTXYVWIDM+snYk7Yc6LdPitmaqM6j+iJOeID1CsMXOJFpVopvPiHBdulkE=
// 使用 bip322-simple 签名
try {
let res = await window.wizz.signMessage("abcdefghijk123456789","bip322-simple");
console.log(res)
} catch (e) {
console.log(e);
}
> AkcwRAIgeHUcjr0jODaR7GMM8cenWnIj0MYdGmmrpGyMoryNSkgCICzVXWrLIKKp5cFtaCTErY7FGNXTFe6kuEofl4G+Vi5wASECaIeVi8xMtvjATqSSYPDRDjEsQbr0hSUpU7FHJNtVKqw=
pushTx
推送交易
参数
options
- Object
:rawtx
- string
: 要推送的原始交易
返回
Promise
- string
: 交易 ID
示例
try {
let txid = await window.wizz.pushTx({
rawtx:"0200000000010135bd7d..."
});
console.log(txid)
} catch (e) {
console.log(e);
}
signPsbt
wizz.signPsbt(psbtHex[, options])
签名 PSBT
此方法将遍历所有与当前地址匹配的输入以进行签名。
参数
psbtHex
- string
: 要签名的 PSBT 的十六进制字符串
options
autoFinalized
- boolean
: 签名后是否自动完成 PSBT,默认为 true
toSignInputs
- array
:
index
- number
: 要签名的输入
address
- string
: (至少指定地址或公钥中的一个) 用于签名的私钥对应的地址
publicKey
- string
: (至少指定地址或公钥中的一个) 用于签名的私钥对应的公钥
sighashTypes
- number[]
: (可选) 签名哈希类型
disableTweakSigner
- boolean
:(可选)
在签名和解锁 Taproot 地址时,默认使用 tweakSigner
生成签名。启用此选项允许使用原始私钥进行签名。
返回
Promise
- string
: 签名后的 PSBT 的十六进制字符串
示例
try {
let res = await window.wizz.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);
}
wizz.signPsbt("xxxxxxxx",{toSignInputs:[{index:0,publicKey:"xxxxxx",disableTweakSigner:true}],autoFinalized:false})
pushPsbt
wizz.pushPsbt(psbtHex)
推送交易
参数
psbtHex
- string
: 要推送的 PSBT 的十六进制字符串
返回
Promise
- string
: 交易 ID
示例
try {
let res = await window.wizz.pushPsbt("70736274ff01007d....");
console.log(res)
} catch (e) {
console.log(e);
}
事件
accountsChanged
wizz.on('accountsChanged', handler: (accounts: Array<string>) => void);
wizz.removeListener('accountsChanged', handler: (accounts: Array<string>) => void);
当用户公开的账户地址发生变化时,将触发 accountsChanged
事件。
networkChanged
wizz.on('networkChanged', handler: (network: string) => void);
wizz.removeListener('networkChanged', handler: (network: string) => void);
当用户的网络发生变化时,将触发 networkChanged
事件。