btcSignTransaction

Bitcoin: sign transaction

Asks device to sign given inputs and outputs of pre-composed transaction. User is asked to confirm all transaction details on OneKey.

const result = await HardwareSDK.btcSignTransaction(connectId, deviceId, params);

Params

Optional common params

  • coin - required string Determines network definition specified in bitcoin.json file. Coin shortcut, name or label can be used.

  • inputs - required Array of TxInputType,

  • outputs - required Array of TxOutputType,

  • refTxs - required Array of RefTransaction. Zcash and Komodo refTxs should also contains expiry, version_group_id and extra_data fields.

  • locktime - optional number,

  • version - optional number transaction version,

  • expiry - optional number, only for Decred and Zcash,

  • versionGroupId - optional number only for Zcash, nVersionGroupId when overwintered is set,

  • overwintered - optional boolean only for Zcash

  • timestamp - optional number only for Capricoin, transaction timestamp,

  • branchId - optional number, only for Zcash, BRANCH_ID when overwintered is set

Help tool

build input

private buildHardwareInput = async (
  input: TxInput,
  path: string,
): Promise<Messages.TxInputType> => {
  const { getHDPath, getScriptType } = await CoreSDKLoader();
  const addressN = getHDPath(path);
  const scriptType = getScriptType(addressN);
  const utxo = input.utxo as UTXO;

  // @ts-expect-error
  return {
    prev_index: utxo.vout,
    prev_hash: utxo.txid,
    amount: utxo.value.integerValue().toString(),
    address_n: addressN,
    script_type: scriptType,
  };
};

build Output

private buildHardwareOutput = async (
  output: TxOutput,
): Promise<Messages.TxOutputType> => {
  const { isCharge, bip44Path } = output.payload || {};

  if (isCharge && bip44Path) {
    const { getHDPath, getOutputScriptType } = await CoreSDKLoader();
    const addressN = getHDPath(bip44Path);
    const scriptType = getOutputScriptType(addressN);
    return {
      script_type: scriptType,
      address_n: addressN,
      amount: output.value.integerValue().toString(),
    };
  }

  return {
    script_type: 'PAYTOADDRESS',
    address: output.address,
    amount: output.value.integerValue().toString(),
  };
};

buildPrevTx

import * as BitcoinJS from 'bitcoinjs-lib';
private buildPrevTx = (rawTx: string): RefTransaction => {
    const tx = BitcoinJS.Transaction.fromHex(rawTx);

    return {
      hash: tx.getId(),
      version: tx.version,
      inputs: tx.ins.map((i) => ({
        prev_hash: i.hash.reverse().toString('hex'),
        prev_index: i.index,
        script_sig: i.script.toString('hex'),
        sequence: i.sequence,
      })),
      bin_outputs: tx.outs.map((o) => ({
        amount: o.value,
        script_pubkey: o.script.toString('hex'),
      })),
      lock_time: tx.locktime,
    };
  };

Example

PAYTOADDRESS

HardwareSDK.btcSignTransaction(connectId, deviceId, {
    inputs: [
        {
            address_n: [(44 | 0x80000000) >>> 0, (0 | 0x80000000) >>> 0, (2 | 0x80000000) >>> 0, 1, 0],
            prev_index: 0,
            prev_hash: 'b035d89d4543ce5713c553d69431698116a822c57c03ddacf3f04b763d1999ac',
        }
    ],
    outputs: [
        {
            address_n: [(44 | 0x80000000) >>> 0, (0 | 0x80000000) >>> 0, (2 | 0x80000000) >>> 0, 1, 1],
            amount: '3181747',
            script_type: 'PAYTOADDRESS',
        }, {
            address: '18WL2iZKmpDYWk1oFavJapdLALxwSjcSk2',
            amount: '200000',
            script_type: 'PAYTOADDRESS',
        }
    ],
    coin: 'btc'
});

SPENDP2SHWITNESS

HardwareSDK.btcSignTransaction({
    inputs: [
        {
            address_n: [(49 | 0x80000000) >>> 0, (0 | 0x80000000) >>> 0, (2 | 0x80000000) >>> 0, 1, 0],
            prev_index: 0,
            prev_hash: 'b035d89d4543ce5713c553d69431698116a822c57c03ddacf3f04b763d1999ac',
            amount: '3382047',
            script_type: 'SPENDP2SHWITNESS',
        }
    ],
    outputs: [
        {
            address_n: [(49 | 0x80000000) >>> 0, (0 | 0x80000000) >>> 0, (2 | 0x80000000) >>> 0, 1, 1],
            amount: '3181747',
            script_type: 'PAYTOP2SHWITNESS',
        }, {
            address: '18WL2iZKmpDYWk1oFavJapdLALxwSjcSk2',
            amount: '200000',
            script_type: 'PAYTOADDRESS',
        }
    ],
    coin: 'btc'
});

PAYTOADDRESS with refTxs (transaction data provided from custom backend)

HardwareSDK.btcSignTransaction({
    inputs: [
        {
            address_n: [(44 | 0x80000000) >>> 0, (0 | 0x80000000) >>> 0, (2 | 0x80000000) >>> 0, 1, 0],
            prev_index: 0,
            prev_hash: 'b035d89d4543ce5713c553d69431698116a822c57c03ddacf3f04b763d1999ac',
        }
    ],
    outputs: [
        {
            address_n: [(44 | 0x80000000) >>> 0, (0 | 0x80000000) >>> 0, (2 | 0x80000000) >>> 0, 1, 1],
            amount: '3181747',
            script_type: 'PAYTOADDRESS',
        }, {
            address: '18WL2iZKmpDYWk1oFavJapdLALxwSjcSk2',
            amount: '200000',
            script_type: 'PAYTOADDRESS',
        }
    ],
    refTxs: [
        {
            hash: 'b035d89d4543ce5713c553d69431698116a822c57c03ddacf3f04b763d1999ac',
            inputs: [
                {
                    prev_hash: '448946a44f1ef514601ccf9b22cc3e638c69ea3900b67b87517ea673eb0293dc',
                    prev_index: 0,
                    script_sig: '47304402202872cb8459eed053dcec0f353c7e293611fe77615862bfadb4d35a5d8807a4cf022015057aa0aaf72ab342b5f8939f86f193ad87b539931911a72e77148a1233e022012103f66bbe3c721f119bb4b8a1e6c1832b98f2cf625d9f59242008411dd92aab8d94',
                    sequence: 4294967295,
                }
            ],
            bin_outputs: [
                {
                    amount: 3431747,
                    script_pubkey: '76a91441352a84436847a7b660d5e76518f6ebb718dedc88ac',
                },
                {
                    amount: 10000,
                    script_pubkey: '76a9141403b451c79d34e6a7f6e36806683308085467ac88ac',
                }
            ],
            lock_time: 0,
            version: 1,
        },
    ],
    coin: 'btc'
});

Result

{
    success: true,
    payload: {
        signatures: Array<string>, // Array of signer signatures
        serializedTx: string,        // serialized transaction
        txid?: string,             // broadcasted transaction id
    }
}

Error

{
    success: false,
    payload: {
        error: string, // error message
        code: number // error code
    }
}

Last updated