@okxweb3/coin-bitcoin
Version:
@okxweb3/coin-bitcoin is a Bitcoin SDK for building Web3 wallets and applications. It supports BTC, BSV, DOGE, LTC, and TBTC, enabling private key management, transaction signing, address generation, and inscriptions like BRC-20, Runes, CAT, and Atomicals
136 lines • 4.54 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.oneKeyBuildBtcTx = void 0;
const bitcoinjs_lib_1 = require("./bitcoinjs-lib");
const bufferutils_1 = require("./bitcoinjs-lib/bufferutils");
const coin_base_1 = require("@okxweb3/coin-base");
const wallet_1 = require("./wallet");
const txBuild_1 = require("./txBuild");
const networks_1 = require("./bitcoinjs-lib/networks");
const addressTypeToOneKeyInputScriptType = {
"legacy": "SPENDADDRESS",
"segwit_native": "SPENDWITNESS",
"segwit_nested": "SPENDP2SHWITNESS",
"segwit_taproot": "SPENDTAPROOT",
};
const addressTypeToOneKeyOutputScriptType = {
"legacy": "PAYTOADDRESS",
"segwit_native": "PAYTOWITNESS",
"segwit_nested": "PAYTOP2SHWITNESS",
"segwit_taproot": "PAYTOTAPROOT",
};
function oneKeyBuildBtcTx(txData, network = networks_1.bitcoin) {
const tx = (0, wallet_1.convert2UtxoTx)(txData);
if (tx.omni) {
const coinType = (0, wallet_1.number2Hex)(tx.omni.coinType || 31, 8);
const amount = (0, wallet_1.number2Hex)(tx.omni.amount, 16);
const omniScript = "6f6d6e69" + "0000" + "0000" + coinType + amount;
tx.outputs.push({
address: "",
amount: 0,
omniScript,
});
}
const changeAmount = parseInt((0, txBuild_1.signBtc)(tx, "", network, undefined, true, true));
const dustSize = txData.dustSize || 546;
if (changeAmount >= dustSize) {
tx.outputs.push({
address: tx.address,
amount: changeAmount,
derivationPath: tx.derivationPath,
isChange: true,
});
}
const inputs = [];
const refTxs = [];
tx.inputs.forEach((input) => {
const address_n = parseDerivationPath(input.derivationPath);
inputs.push({
address_n,
prev_hash: input.txId,
prev_index: input.vOut,
amount: input.amount.toString(),
script_type: addressTypeToOneKeyInputScriptType[(0, txBuild_1.getAddressType)(input.address, network)],
});
refTxs.push(parseRefTx(input.nonWitnessUtxo, input.txId));
});
const outputs = [];
tx.outputs.forEach((output) => {
if (output.isChange) {
outputs.push({
address_n: parseDerivationPath(output.derivationPath),
amount: output.amount.toString(),
script_type: addressTypeToOneKeyOutputScriptType[(0, txBuild_1.getAddressType)(output.address, network)],
});
}
else if (output.omniScript) {
outputs.push({
amount: "0",
op_return_data: output.omniScript,
script_type: "PAYTOOPRETURN",
});
}
else {
outputs.push({
address: output.address,
amount: output.amount.toString(),
script_type: "PAYTOADDRESS",
});
}
});
return {
inputs: inputs,
outputs: outputs,
refTxs: refTxs,
coin: "btc",
};
}
exports.oneKeyBuildBtcTx = oneKeyBuildBtcTx;
function parseRefTx(rawTx, txId) {
const transaction = bitcoinjs_lib_1.Transaction.fromHex(rawTx);
const refInputs = [];
transaction.ins.forEach(input => {
refInputs.push({
prev_hash: coin_base_1.base.toHex((0, bufferutils_1.reverseBuffer)(input.hash)),
prev_index: input.index,
script_sig: coin_base_1.base.toHex(input.script),
sequence: input.sequence,
});
});
const refOutputs = [];
transaction.outs.forEach(output => {
refOutputs.push({
amount: output.value,
script_pubkey: coin_base_1.base.toHex(output.script),
});
});
return {
hash: txId,
inputs: refInputs,
bin_outputs: refOutputs,
lock_time: transaction.locktime,
version: transaction.version,
};
}
function parseDerivationPath(path) {
let splitPath = path.split('/');
if (splitPath[0] === 'm') {
splitPath = splitPath.slice(1);
}
const address_n = [];
splitPath.forEach(indexStr => {
let index;
if (indexStr.slice(-1) === `'`) {
index = harden(parseInt(indexStr.slice(0, -1), 10));
}
else {
index = parseInt(indexStr, 10);
}
address_n.push(index);
});
return address_n;
}
function harden(num) {
return 0x80000000 + num;
}
//# sourceMappingURL=onekey.js.map