Skip to main content
Bitcoin and Litecoin chains support the following signature kinds:
  • Psbt, partially signed bitcoin transaction, or PSBT.
  • Bip322, generic message defined in BIP-322.

PSBT

The following payload can be used with the Sign and Sign and Broadcast endpoints.
FieldDescriptionType - Optional
blockchainKindBitcoinString
kindPsbtString
psbtThe 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. The following payload can be used with the Sign and Sign and Broadcast endpoints.
FieldDescriptionType - Optional
networkA supported Bitcoin network.String
kindBip322String
messageThe generic message hex encoded.String
formatEither 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"
}
I