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.
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
}
}