A TypeScript client for the Blockstream Jade hardware wallet, modeled on jadepy.
npm install jadets
# or
yarn add jadets
his is an npm package written using typescript to talk to the jade hardware deviceimport { TCPTransport } from 'jadets/transport'
import { JadeInterface } from 'jadets/interfaces'
import { Jade } from 'jadets'
import { randomBytes } from 'crypto'
import { SignerDescriptor, MultisigDescriptor } from 'jadets/types'
const transport = new TCPTransport('localhost', 30121)
const client = new Jade(new JadeInterface(transport))
await client.connect()
await client.cleanReset()
await client.ping()
// set up wallet
await client.setMnemonic(MNEMONIC)
await client.setEpoch(Math.floor(Date.now()/1000))
// derive an xpub and fingerprint
const xpub = await client.getXpub('testnet', [84+0x80000000,0+0x80000000,0+0x80000000])
const fp = getFingerprintFromXpub(xpub,'testnet')
// register a simple 1-of-1 multisig
const signer: SignerDescriptor = { fingerprint: fp, derivation: [1], xpub, path: [] }
const desc: MultisigDescriptor = {
variant: 'sh(multi(k))',
sorted: false,
threshold: 1,
signers: [signer],
}
await client.registerMultisig('testnet','demo-wallet',desc)
// sign a message
const sig = await client.signMessage([0],'hello jade')
console.log(sig)
// sign a PSBT
const result = await client.signPSBT('testnet', rawPsbtBytes)
console.log(Buffer.from(result).toString('base64'))
await client.disconnect()
- connect() →
Promise<void> - disconnect() →
Promise<void> - cleanReset() →
Promise<boolean> - ping() →
Promise<number> - setMnemonic(mnemonic: string) →
Promise<boolean> - getXpub(network: string, path: number[]) →
Promise<string> - registerMultisig(network: string, name: string, desc: MultisigDescriptor) →
Promise<boolean> - getRegisteredMultisigs() →
Promise<Record<string, MultisigSummary>> - getRegisteredMultisig(name: string) →
Promise<RegisteredMultisig> - signMessage(path: number[], msg: string) →
Promise<Uint8Array> - signPSBT(network: string, psbt: Uint8Array) →
Promise<Uint8Array>