Bitcoin / Litecoin

Bitcoin and Litecoin chains support the following signature kinds:

  • Psbt, partially signed bitcoin transaction, or PSBT.

  • Bip322, generic message defined in BIP-322.

PSBT

Signs a partially signed bitcoin transaction.

Field
Description
Type - Optional

blockchainKind

Bitcoin

String

kind

Psbt

String

psbt

The hex encoded PSBT.

String

{
  "blockchainKind": "Bitcoin",
  "kind": "Psbt",
  "psbt": "0x70736274ff0100710200000001ca17431a33a13d3ef8bfb041c8546071f9d3a609abe3c91efbed83265e1426730100000000ffffffff02e803000000000000160014a40a65b46ff36c53f1afb8e35e25a4c0bcfc9979d6d1150000000000160014237ad8ba2ffd992f6ebc7ab388e77f00fc87d1c9000000000001011f54d6150000000000160014237ad8ba2ffd992f6ebc7ab388e77f00fc87d1c9000000"
}

Typescript Example with BitcoinJS

First install the BitcoinJS SDK. You can find the full documentation here: https://github.com/bitcoinjs/bitcoinjs-lib

Here a code sample to generate a signature via the Dfns TypeScript SDK:

import { networks, payments, Psbt } from 'bitcoinjs-lib'
import axios from 'axios'

const walletId = 'wa-6lbfv-9esgj-xxxxxxxxxxxxxxxx'
const wallet = await dfnsClient.wallets.getWallet({ walletId })
const publicKey = Buffer.from(wallet.signingKey.publicKey, 'hex')

const network = networks.testnet
const { address } = payments.p2wpkh({
  pubkey: publicKey,
  network,
})

const txid = '87872516c6e93f136fc6c493c7172596b11c695e27889de7532abffcac2a4b5e'
const n = 1
const utxo = (
  await axios.post(BITCOIN_NODE_URL, {
    jsonrpc: '2.0',
    id: 'gettxout',
    method: 'gettxout',
    params: [txid, n, false],
  })
).data.result

const balance = utxo.balance * 100000000
const amount = 1
const fee = 150

const psbt = new Psbt({ network })
psbt.addInput({
  hash: txid,
  index: n,
  witnessUtxo: {
    script: Buffer.from(utxo.scriptPubKey.hex, 'hex'),
    value: balance,
  },
})

psbt.addOutput({
  address: 'tb1q5s9xtdr07dk98ud0hr34ufdycz70exte2kehm2',
  value: amount,
})

psbt.addOutput({
  address,
  value: balance - amount - fee,
})

const res = await dfnsClient.wallets.generateSignature({
  walletId,
  body: { kind: 'Psbt', psbt: `0x${psbt.toHex()}` },
})

BIP-322

Signs a generic message using BIP-322. Note: signing payload construction depends on the targeted blockchain. Therefore it's tied to a specific network rather than the blockchain kind.

Field
Description
Type - Optional

network

A supported Bitcoin network.

String

kind

Bip322

String

message

The generic message hex encoded.

String

format

Either Simple or Full. Defaults to Simple if not present. The formatted signature is returned in the signedData field in the response.

String (optional)

{
  "network": "Bitcoin",
  "kind": "Bip322",
  "message": "0x49206c6f76652044666e73"
}

Last updated