@coolwallet/btc
Version:
Coolwallet Bitcoin sdk
912 lines (746 loc) • 100 kB
JavaScript
"use strict";
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getScriptSigningActions = getScriptSigningActions;
exports.getScriptSigningPreActions = getScriptSigningPreActions;
exports.getBTCArgument = getBTCArgument;
exports.getWitness0Argument = getWitness0Argument;
exports.getWitness1Argument = getWitness1Argument;
exports.getUSDTArgument = getUSDTArgument;
exports.getUSDTNewArgument = getUSDTNewArgument;
var _core = require("@coolwallet/core");
var cryptoUtil = _interopRequireWildcard(require("./cryptoUtil"));
var bufferUtil = _interopRequireWildcard(require("./bufferUtil"));
var txUtil = _interopRequireWildcard(require("./transactionUtil"));
var varuint = _interopRequireWildcard(require("./varuintUtil"));
var _param = require("../config/param");
var _types = require("../config/types");
var _param2 = require("@coolwallet/core/lib/config/param");
var _versionUtil = require("./versionUtil");
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
// script type 14, 15 only support for se version greater than 330.
var getExtraTransactionType = function getExtraTransactionType(cardType, seVersion, redeemScriptType) {
if ((0, _versionUtil.shouldUseLegacyScript10Or11)(cardType, seVersion)) {
return redeemScriptType === _types.ScriptType.P2PKH ? '10' : '11';
} else {
return redeemScriptType === _types.ScriptType.P2PKH ? '14' : '15';
}
};
var getPath = /*#__PURE__*/function () {
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(addressIndex, purpose, pathType) {
var path;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return _core.utils.getPath(_param.COIN_TYPE, addressIndex, 5, pathType, purpose);
case 2:
path = _context.sent;
path = '15' + path;
return _context.abrupt("return", path);
case 5:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return function getPath(_x, _x2, _x3) {
return _ref.apply(this, arguments);
};
}();
function getScriptSigningActions(_x4, _x5, _x6, _x7, _x8, _x9) {
return _getScriptSigningActions.apply(this, arguments);
}
function _getScriptSigningActions() {
_getScriptSigningActions = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee9(transport, redeemScriptType, appId, appPrivateKey, preparedData, seVersion) {
var utxoArguments, extraTransactionType, actions, _actions, _utxoArguments, _actions2;
return regeneratorRuntime.wrap(function _callee9$(_context9) {
while (1) {
switch (_context9.prev = _context9.next) {
case 0:
if (!((0, _versionUtil.shouldUseLegacyUtxoScript)(transport.cardType, seVersion) || redeemScriptType === _types.ScriptType.P2PKH)) {
_context9.next = 7;
break;
}
utxoArguments = preparedData.preparedInputs.map( /*#__PURE__*/function () {
var _ref4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(preparedInput) {
var path, SEPath, outPoint, inputScriptType, inputAmount, inputHash;
return regeneratorRuntime.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
_context4.next = 2;
return getPath(preparedInput.addressIndex);
case 2:
path = _context4.sent;
SEPath = Buffer.from("".concat(path), 'hex');
outPoint = preparedInput.preOutPointBuf;
// TODO
if (redeemScriptType === _types.ScriptType.P2PKH || redeemScriptType === _types.ScriptType.P2WPKH || redeemScriptType === _types.ScriptType.P2SH_P2WPKH) {
inputScriptType = varuint.encode(0);
} else {
//(scriptType == ScriptType.P2WSH)
inputScriptType = varuint.encode(1);
}
inputAmount = preparedInput.preValueBuf.reverse();
inputHash = cryptoUtil.hash160(preparedInput.pubkeyBuf);
return _context4.abrupt("return", Buffer.concat([SEPath, outPoint, inputScriptType, inputAmount, inputHash]).toString('hex'));
case 9:
case "end":
return _context4.stop();
}
}
}, _callee4);
}));
return function (_x32) {
return _ref4.apply(this, arguments);
};
}());
extraTransactionType = getExtraTransactionType(transport.cardType, seVersion, redeemScriptType);
actions = utxoArguments.map(function (utxoArgument) {
return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {
return regeneratorRuntime.wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
_context5.t0 = _core.tx.command;
_context5.t1 = transport;
_context5.t2 = appId;
_context5.t3 = appPrivateKey;
_context5.next = 6;
return utxoArgument;
case 6:
_context5.t4 = _context5.sent;
_context5.t5 = extraTransactionType;
return _context5.abrupt("return", _context5.t0.executeUtxoScript.call(_context5.t0, _context5.t1, _context5.t2, _context5.t3, _context5.t4, _context5.t5));
case 9:
case "end":
return _context5.stop();
}
}
}, _callee5);
}));
});
return _context9.abrupt("return", {
actions: actions
});
case 7:
if (!(redeemScriptType === _types.ScriptType.P2TR)) {
_context9.next = 12;
break;
}
_actions = preparedData.preparedInputs.map(function (preparedInput, index) {
return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6() {
var SEPath;
return regeneratorRuntime.wrap(function _callee6$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
_context6.t0 = Buffer;
_context6.next = 3;
return getPath(preparedInput.addressIndex, preparedInput.purposeIndex, _param2.PathType.BIP340);
case 3:
_context6.t1 = _context6.sent;
SEPath = _context6.t0.from.call(_context6.t0, _context6.t1, 'hex');
return _context6.abrupt("return", _core.tx.command.executeUtxoSegmentScript(transport, appId, appPrivateKey, Buffer.concat([SEPath, bufferUtil.toReverseUintBuffer(index, 4)]).toString('hex')));
case 6:
case "end":
return _context6.stop();
}
}
}, _callee6);
}));
});
return _context9.abrupt("return", {
actions: _actions
});
case 12:
_utxoArguments = preparedData.preparedInputs.map( /*#__PURE__*/function () {
var _ref7 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee7(preparedInput) {
var SEPath, outPoint, inputScript, _pubkeyToAddressAndOu, outScript, inputAmount;
return regeneratorRuntime.wrap(function _callee7$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
_context7.t0 = Buffer;
_context7.next = 3;
return getPath(preparedInput.addressIndex, preparedInput.purposeIndex);
case 3:
_context7.t1 = _context7.sent;
SEPath = _context7.t0.from.call(_context7.t0, _context7.t1, 'hex');
outPoint = preparedInput.preOutPointBuf;
_context7.t2 = redeemScriptType;
_context7.next = _context7.t2 === _types.ScriptType.P2SH_P2WPKH ? 9 : _context7.t2 === _types.ScriptType.P2WPKH ? 9 : _context7.t2 === _types.ScriptType.P2WSH ? 12 : 14;
break;
case 9:
_pubkeyToAddressAndOu = (0, txUtil.pubkeyToAddressAndOutScript)(preparedInput.pubkeyBuf, _types.ScriptType.P2PKH), outScript = _pubkeyToAddressAndOu.outScript;
inputScript = outScript;
return _context7.abrupt("break", 15);
case 12:
inputScript = Buffer.from('', 'hex');
return _context7.abrupt("break", 15);
case 14:
throw new _core.error.SDKError(getScriptSigningActions.name, "Unsupport ScriptType '".concat(redeemScriptType, "'"));
case 15:
inputAmount = preparedInput.preValueBuf;
return _context7.abrupt("return", Buffer.concat([SEPath, outPoint, Buffer.from(inputScript.length.toString(16), 'hex'), inputScript, inputAmount]).toString('hex'));
case 17:
case "end":
return _context7.stop();
}
}
}, _callee7);
}));
return function (_x33) {
return _ref7.apply(this, arguments);
};
}());
_actions2 = _utxoArguments.map(function (utxoArgument) {
return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee8() {
return regeneratorRuntime.wrap(function _callee8$(_context8) {
while (1) {
switch (_context8.prev = _context8.next) {
case 0:
_context8.t0 = _core.tx.command;
_context8.t1 = transport;
_context8.t2 = appId;
_context8.t3 = appPrivateKey;
_context8.next = 6;
return utxoArgument;
case 6:
_context8.t4 = _context8.sent;
return _context8.abrupt("return", _context8.t0.executeUtxoSegmentScript.call(_context8.t0, _context8.t1, _context8.t2, _context8.t3, _context8.t4));
case 8:
case "end":
return _context8.stop();
}
}
}, _callee8);
}));
});
return _context9.abrupt("return", {
actions: _actions2
});
case 15:
case "end":
return _context9.stop();
}
}
}, _callee9);
}));
return _getScriptSigningActions.apply(this, arguments);
}
function getScriptSigningPreActions(transport, appId, appPrivateKey, script, inputArgument) {
// const argument = "00" + getBTCArgument(redeemScriptType, inputs, output, change);// keylength zero
var argument = '00' + inputArgument; // keylength zero
console.debug('argument: ', argument);
var preActions = [];
var sendScript = /*#__PURE__*/function () {
var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
return regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.next = 2;
return _core.tx.command.sendScript(transport, script);
case 2:
case "end":
return _context2.stop();
}
}
}, _callee2);
}));
return function sendScript() {
return _ref2.apply(this, arguments);
};
}();
preActions.push(sendScript);
var sendArgument = /*#__PURE__*/function () {
var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
return regeneratorRuntime.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
_context3.next = 2;
return _core.tx.command.executeScript(transport, appId, appPrivateKey, argument);
case 2:
case "end":
return _context3.stop();
}
}
}, _callee3);
}));
return function sendArgument() {
return _ref3.apply(this, arguments);
};
}();
preActions.push(sendArgument);
return {
preActions: preActions
};
}
function getBTCArgument(_x10, _x11, _x12, _x13) {
return _getBTCArgument.apply(this, arguments);
}
function _getBTCArgument() {
_getBTCArgument = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee10(scriptType, inputs, output, change) {
var _txUtil$addressToOutS, outputType, outputHash, outputScriptType, outputHashBuf, outputAmount, haveChange, changeScriptType, changeAmount, changePath, prevouts, hashPrevouts, sequences, hashSequence;
return regeneratorRuntime.wrap(function _callee10$(_context10) {
while (1) {
switch (_context10.prev = _context10.next) {
case 0:
_txUtil$addressToOutS = txUtil.addressToOutScript(output.address), outputType = _txUtil$addressToOutS.scriptType, outputHash = _txUtil$addressToOutS.outHash;
if (outputHash) {
_context10.next = 3;
break;
}
throw new _core.error.SDKError(getBTCArgument.name, "OutputHash Undefined");
case 3:
if (!(outputType === _types.ScriptType.P2PKH || outputType === _types.ScriptType.P2SH_P2WPKH || outputType === _types.ScriptType.P2WPKH)) {
_context10.next = 8;
break;
}
outputScriptType = varuint.encode(outputType);
outputHashBuf = Buffer.from("000000000000000000000000".concat(outputHash.toString('hex')), 'hex');
_context10.next = 14;
break;
case 8:
if (!(outputType === _types.ScriptType.P2WSH)) {
_context10.next = 13;
break;
}
outputScriptType = varuint.encode(outputType);
outputHashBuf = Buffer.from(outputHash.toString('hex'), 'hex');
_context10.next = 14;
break;
case 13:
throw new _core.error.SDKError(getBTCArgument.name, "Unsupport ScriptType '".concat(outputType, "'"));
case 14:
outputAmount = bufferUtil.toUintBuffer(output.value, 8); //[haveChange(1B)] [changeScriptType(1B)] [changeAmount(8B)] [changePath(21B)]
if (!change) {
_context10.next = 28;
break;
}
if (change.pubkeyBuf) {
_context10.next = 18;
break;
}
throw new _core.error.SDKError(getBTCArgument.name, 'Public Key not exists !!');
case 18:
haveChange = varuint.encode(1);
changeScriptType = bufferUtil.toUintBuffer(scriptType, 1);
changeAmount = bufferUtil.toUintBuffer(change.value, 8);
_context10.t0 = Buffer;
_context10.next = 24;
return _core.utils.getPath(_param.COIN_TYPE, change.addressIndex);
case 24:
_context10.t1 = _context10.sent;
changePath = _context10.t0.from.call(_context10.t0, _context10.t1, 'hex');
_context10.next = 32;
break;
case 28:
haveChange = Buffer.from('00', 'hex');
changeScriptType = Buffer.from('00', 'hex');
changeAmount = bufferUtil.toUintBuffer(0, 8); //)Buffer.from('0000000000000000', 'hex');
changePath = bufferUtil.toUintBuffer(0, 21); //Buffer.from('000000000000000000000000000000000000000000', 'hex');
case 32:
prevouts = inputs.map(function (input) {
return Buffer.concat([Buffer.from(input.preTxHash, 'hex').reverse(), bufferUtil.toReverseUintBuffer(input.preIndex, 4)]);
});
hashPrevouts = cryptoUtil.doubleSha256(Buffer.concat(prevouts));
sequences = inputs.map(function (input) {
return Buffer.concat([input.sequence ? bufferUtil.toReverseUintBuffer(input.sequence, 4) : Buffer.from('ffffffff', 'hex')]);
});
hashSequence = cryptoUtil.doubleSha256(Buffer.concat(sequences));
return _context10.abrupt("return", Buffer.concat([outputScriptType, outputAmount, outputHashBuf, haveChange, changeScriptType, changeAmount, changePath, hashPrevouts, hashSequence]).toString('hex'));
case 37:
case "end":
return _context10.stop();
}
}
}, _callee10);
}));
return _getBTCArgument.apply(this, arguments);
}
function getWitness0Argument(_x14, _x15, _x16, _x17) {
return _getWitness0Argument.apply(this, arguments);
}
function _getWitness0Argument() {
_getWitness0Argument = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee11(scriptType, inputs, output, change) {
var _txUtil$addressToOutS2, outputType, scriptPubKey, reverseVersion, prevouts, hashPrevouts, sequences, hashSequences, zeroPadding, outputScriptType, outputHashBuf, outputAmount, haveChange, changeScriptType, changeAmount, changePath, reverseSequence, reverseLockTime, reverseHashType;
return regeneratorRuntime.wrap(function _callee11$(_context11) {
while (1) {
switch (_context11.prev = _context11.next) {
case 0:
_txUtil$addressToOutS2 = txUtil.addressToOutScript(output.address), outputType = _txUtil$addressToOutS2.scriptType, scriptPubKey = _txUtil$addressToOutS2.scriptPubKey;
if (scriptPubKey) {
_context11.next = 3;
break;
}
throw new _core.error.SDKError(getWitness0Argument.name, "OutputHash Undefined");
case 3:
reverseVersion = Buffer.from('02000000', 'hex');
prevouts = inputs.map(function (input) {
return Buffer.concat([Buffer.from(input.preTxHash, 'hex').reverse(), bufferUtil.toReverseUintBuffer(input.preIndex, 4)]);
});
hashPrevouts = cryptoUtil.doubleSha256(Buffer.concat(prevouts));
sequences = inputs.map(function (input) {
return Buffer.concat([input.sequence ? bufferUtil.toReverseUintBuffer(input.sequence, 4) : Buffer.from('ffffffff', 'hex')]);
});
hashSequences = cryptoUtil.doubleSha256(Buffer.concat(sequences));
zeroPadding = Buffer.from('00000000', 'hex');
if (!(outputType === _types.ScriptType.P2PKH || outputType === _types.ScriptType.P2SH_P2WPKH || outputType === _types.ScriptType.P2WPKH)) {
_context11.next = 14;
break;
}
outputScriptType = varuint.encode(outputType);
outputHashBuf = Buffer.from("000000000000000000000000".concat(scriptPubKey.toString('hex')), 'hex');
_context11.next = 20;
break;
case 14:
if (!(outputType === _types.ScriptType.P2WSH || outputType === _types.ScriptType.P2TR)) {
_context11.next = 19;
break;
}
outputScriptType = varuint.encode(outputType);
outputHashBuf = scriptPubKey;
_context11.next = 20;
break;
case 19:
throw new _core.error.SDKError(getBTCArgument.name, "Unsupport ScriptType '".concat(outputType, "'"));
case 20:
outputAmount = bufferUtil.toUintBuffer(output.value, 8); //[haveChange(1B)] [changeScriptType(1B)] [changeAmount(8B)] [changePath(21B)]
if (!change) {
_context11.next = 34;
break;
}
if (change.pubkeyBuf) {
_context11.next = 24;
break;
}
throw new _core.error.SDKError(getWitness0Argument.name, 'Public Key not exists !!');
case 24:
haveChange = varuint.encode(1);
changeScriptType = bufferUtil.toUintBuffer(scriptType, 1);
changeAmount = bufferUtil.toUintBuffer(change.value, 8);
_context11.t0 = Buffer;
_context11.next = 30;
return _core.utils.getPath(_param.COIN_TYPE, change.addressIndex, 5, _param2.PathType.BIP32, change.purposeIndex);
case 30:
_context11.t1 = _context11.sent;
changePath = _context11.t0.from.call(_context11.t0, _context11.t1, 'hex');
_context11.next = 38;
break;
case 34:
haveChange = Buffer.from('00', 'hex');
changeScriptType = Buffer.from('00', 'hex');
changeAmount = bufferUtil.toUintBuffer(0, 8); //)Buffer.from('0000000000000000', 'hex');
changePath = bufferUtil.toUintBuffer(0, 21); //Buffer.from('000000000000000000000000000000000000000000', 'hex');
case 38:
reverseSequence = Buffer.from('fdffffff', 'hex');
reverseLockTime = Buffer.from('00000000', 'hex');
reverseHashType = Buffer.from('01000000', 'hex');
return _context11.abrupt("return", Buffer.concat([reverseVersion, hashPrevouts, hashSequences, zeroPadding, outputScriptType, outputAmount, outputHashBuf, haveChange, changeScriptType, changeAmount, changePath, reverseSequence, reverseLockTime, reverseHashType]).toString('hex'));
case 42:
case "end":
return _context11.stop();
}
}
}, _callee11);
}));
return _getWitness0Argument.apply(this, arguments);
}
function getWitness1Argument(_x18, _x19, _x20, _x21) {
return _getWitness1Argument.apply(this, arguments);
}
function _getWitness1Argument() {
_getWitness1Argument = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee12(scriptType, inputs, output, change) {
var _txUtil$addressToOutS3, outputType, scriptPubKey, reverseVersion, reverseLockTime, prevouts, hashPrevouts, amounts, hashAmounts, scriptPubkeys, hashScriptPubkeys, sequences, hashSequences, zeroPadding, outputHashBuf, outputScriptType, outputAmount, haveChange, changeScriptType, changeAmount, changePath;
return regeneratorRuntime.wrap(function _callee12$(_context12) {
while (1) {
switch (_context12.prev = _context12.next) {
case 0:
_txUtil$addressToOutS3 = txUtil.addressToOutScript(output.address), outputType = _txUtil$addressToOutS3.scriptType, scriptPubKey = _txUtil$addressToOutS3.scriptPubKey;
if (scriptPubKey) {
_context12.next = 3;
break;
}
throw new _core.error.SDKError(getWitness1Argument.name, "OutputHash Undefined");
case 3:
reverseVersion = Buffer.from('02000000', 'hex');
reverseLockTime = Buffer.from('00000000', 'hex');
prevouts = inputs.map(function (input) {
return Buffer.concat([Buffer.from(input.preTxHash, 'hex').reverse(), bufferUtil.toReverseUintBuffer(input.preIndex, 4)]);
});
hashPrevouts = cryptoUtil.sha256(Buffer.concat(prevouts));
amounts = inputs.map(function (input) {
return Buffer.concat([(0, txUtil.toReverseUintBuffer)(input.preValue, 8)]);
});
hashAmounts = cryptoUtil.sha256(Buffer.concat(amounts));
scriptPubkeys = inputs.map(function (input) {
var inputScript;
switch (scriptType) {
case _types.ScriptType.P2SH_P2WPKH:
case _types.ScriptType.P2WPKH:
case _types.ScriptType.P2TR:
{
if (!input.pubkeyBuf) {
throw new _core.error.SDKError(getWitness1Argument.name, 'Public Key not exists !!');
}
var _pubkeyToAddressAndOu2 = (0, txUtil.pubkeyToAddressAndOutScript)(input.pubkeyBuf, scriptType),
outScript = _pubkeyToAddressAndOu2.outScript;
inputScript = outScript;
break;
}
case _types.ScriptType.P2WSH:
inputScript = Buffer.from('', 'hex');
break;
default:
throw new _core.error.SDKError(getScriptSigningActions.name, "Unsupport ScriptType '".concat(scriptType));
}
return Buffer.concat([Buffer.from(inputScript.length.toString(16), 'hex'), inputScript]);
});
hashScriptPubkeys = cryptoUtil.sha256(Buffer.concat(scriptPubkeys));
sequences = inputs.map(function (input) {
return Buffer.concat([input.sequence ? bufferUtil.toReverseUintBuffer(input.sequence, 4) : Buffer.from('fdffffff', 'hex')]);
});
hashSequences = cryptoUtil.sha256(Buffer.concat(sequences));
zeroPadding = Buffer.from('00000000', 'hex');
if (!(outputType === _types.ScriptType.P2PKH || outputType === _types.ScriptType.P2SH_P2WPKH || outputType === _types.ScriptType.P2WPKH)) {
_context12.next = 18;
break;
}
outputHashBuf = Buffer.from("000000000000000000000000".concat(scriptPubKey.toString('hex')), 'hex');
_context12.next = 23;
break;
case 18:
if (!(outputType === _types.ScriptType.P2WSH || outputType === _types.ScriptType.P2TR)) {
_context12.next = 22;
break;
}
outputHashBuf = scriptPubKey;
_context12.next = 23;
break;
case 22:
throw new _core.error.SDKError(getBTCArgument.name, "Unsupport ScriptType '".concat(outputType, "'"));
case 23:
outputScriptType = varuint.encode(outputType);
outputAmount = bufferUtil.toUintBuffer(output.value, 8); //[haveChange(1B)] [changeScriptType(1B)] [changeAmount(8B)] [changePath(21B)]
if (!change) {
_context12.next = 38;
break;
}
if (change.pubkeyBuf) {
_context12.next = 28;
break;
}
throw new _core.error.SDKError(getWitness1Argument.name, 'Public Key not exists !!');
case 28:
haveChange = varuint.encode(1);
changeScriptType = bufferUtil.toUintBuffer(scriptType, 1);
changeAmount = bufferUtil.toUintBuffer(change.value, 8);
_context12.t0 = Buffer;
_context12.next = 34;
return _core.utils.getPath(_param.COIN_TYPE, change.addressIndex, 5, _param2.PathType.BIP340, change.purposeIndex);
case 34:
_context12.t1 = _context12.sent;
changePath = _context12.t0.from.call(_context12.t0, _context12.t1, 'hex');
_context12.next = 42;
break;
case 38:
haveChange = Buffer.from('00', 'hex');
changeScriptType = Buffer.from('00', 'hex');
changeAmount = bufferUtil.toUintBuffer(0, 8); //)Buffer.from('0000000000000000', 'hex');
changePath = bufferUtil.toUintBuffer(0, 21); //Buffer.from('000000000000000000000000000000000000000000', 'hex');
case 42:
return _context12.abrupt("return", Buffer.concat([reverseVersion, reverseLockTime, hashPrevouts, hashAmounts, hashScriptPubkeys, hashSequences, zeroPadding, outputScriptType, outputAmount, outputHashBuf, haveChange, changeScriptType, changeAmount, changePath]).toString('hex'));
case 43:
case "end":
return _context12.stop();
}
}
}, _callee12);
}));
return _getWitness1Argument.apply(this, arguments);
}
function getUSDTArgument(_x22, _x23, _x24, _x25, _x26) {
return _getUSDTArgument.apply(this, arguments);
}
function _getUSDTArgument() {
_getUSDTArgument = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee13(scriptType, inputs, output, value, change) {
var _txUtil$addressToOutS4, outputType, outputHash, outputScriptType, outputHashBuf, outputAmount, haveChange, changeScriptType, changeAmount, changePath, prevouts, hashPrevouts, sequences, hashSequence, usdtAmount;
return regeneratorRuntime.wrap(function _callee13$(_context13) {
while (1) {
switch (_context13.prev = _context13.next) {
case 0:
_txUtil$addressToOutS4 = txUtil.addressToOutScript(output.address), outputType = _txUtil$addressToOutS4.scriptType, outputHash = _txUtil$addressToOutS4.outHash;
if (outputHash) {
_context13.next = 3;
break;
}
throw new _core.error.SDKError(getBTCArgument.name, "OutputHash Undefined");
case 3:
if (!(outputType === _types.ScriptType.P2PKH || outputType === _types.ScriptType.P2SH_P2WPKH || outputType === _types.ScriptType.P2WPKH)) {
_context13.next = 8;
break;
}
outputScriptType = varuint.encode(outputType);
outputHashBuf = Buffer.from("000000000000000000000000".concat(outputHash.toString('hex')), 'hex');
_context13.next = 14;
break;
case 8:
if (!(outputType === _types.ScriptType.P2WSH)) {
_context13.next = 13;
break;
}
outputScriptType = varuint.encode(outputType);
outputHashBuf = Buffer.from(outputHash.toString('hex'), 'hex');
_context13.next = 14;
break;
case 13:
throw new _core.error.SDKError(getBTCArgument.name, "Unsupport ScriptType '".concat(outputType, "'"));
case 14:
outputAmount = bufferUtil.toUintBuffer(output.value, 8); //[haveChange(1B)] [changeScriptType(1B)] [changeAmount(8B)] [changePath(21B)]
if (!change) {
_context13.next = 28;
break;
}
if (change.pubkeyBuf) {
_context13.next = 18;
break;
}
throw new _core.error.SDKError(getBTCArgument.name, 'Public Key not exists !!');
case 18:
haveChange = varuint.encode(1);
changeScriptType = bufferUtil.toUintBuffer(scriptType, 1);
changeAmount = bufferUtil.toUintBuffer(change.value, 8);
_context13.t0 = Buffer;
_context13.next = 24;
return _core.utils.getPath(_param.COIN_TYPE, change.addressIndex);
case 24:
_context13.t1 = _context13.sent;
changePath = _context13.t0.from.call(_context13.t0, _context13.t1, 'hex');
_context13.next = 32;
break;
case 28:
haveChange = Buffer.from('00', 'hex');
changeScriptType = Buffer.from('00', 'hex');
changeAmount = bufferUtil.toUintBuffer(0, 8); //)Buffer.from('0000000000000000', 'hex');
changePath = bufferUtil.toUintBuffer(0, 21); //Buffer.from('000000000000000000000000000000000000000000', 'hex');
case 32:
prevouts = inputs.map(function (input) {
return Buffer.concat([Buffer.from(input.preTxHash, 'hex').reverse(), bufferUtil.toReverseUintBuffer(input.preIndex, 4)]);
});
hashPrevouts = cryptoUtil.doubleSha256(Buffer.concat(prevouts));
sequences = inputs.map(function (input) {
return Buffer.concat([input.sequence ? bufferUtil.toReverseUintBuffer(input.sequence, 4) : Buffer.from('ffffffff', 'hex')]);
});
hashSequence = cryptoUtil.doubleSha256(Buffer.concat(sequences));
usdtAmount = bufferUtil.toUintBuffer(value, 8);
return _context13.abrupt("return", Buffer.concat([outputScriptType, outputAmount, outputHashBuf, haveChange, changeScriptType, changeAmount, changePath, hashPrevouts, hashSequence, usdtAmount]).toString('hex'));
case 38:
case "end":
return _context13.stop();
}
}
}, _callee13);
}));
return _getUSDTArgument.apply(this, arguments);
}
function getUSDTNewArgument(_x27, _x28, _x29, _x30, _x31) {
return _getUSDTNewArgument.apply(this, arguments);
}
function _getUSDTNewArgument() {
_getUSDTNewArgument = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee14(scriptType, inputs, output, value, change) {
var _txUtil$addressToOutS5, outputType, outputHash, reverseVersion, prevouts, hashPrevouts, sequences, hashSequences, zeroPadding, usdtDust, outputScriptType, outputHashBuf, usdtAmount, haveChange, changeScriptType, changeAmount, changePath, reverseSequence, reverseLockTime, reverseHashType;
return regeneratorRuntime.wrap(function _callee14$(_context14) {
while (1) {
switch (_context14.prev = _context14.next) {
case 0:
_txUtil$addressToOutS5 = txUtil.addressToOutScript(output.address), outputType = _txUtil$addressToOutS5.scriptType, outputHash = _txUtil$addressToOutS5.outHash;
if (outputHash) {
_context14.next = 3;
break;
}
throw new _core.error.SDKError(getBTCArgument.name, "OutputHash Undefined");
case 3:
reverseVersion = Buffer.from('02000000', 'hex');
prevouts = inputs.map(function (input) {
return Buffer.concat([Buffer.from(input.preTxHash, 'hex').reverse(), bufferUtil.toReverseUintBuffer(input.preIndex, 4)]);
});
hashPrevouts = cryptoUtil.doubleSha256(Buffer.concat(prevouts));
sequences = inputs.map(function (input) {
return Buffer.concat([input.sequence ? bufferUtil.toReverseUintBuffer(input.sequence, 4) : Buffer.from('ffffffff', 'hex')]);
});
hashSequences = cryptoUtil.doubleSha256(Buffer.concat(sequences));
zeroPadding = Buffer.from('00000000', 'hex');
usdtDust = bufferUtil.toUintBuffer(output.value, 8);
if (!(outputType === _types.ScriptType.P2PKH || outputType === _types.ScriptType.P2SH_P2WPKH || outputType === _types.ScriptType.P2WPKH)) {
_context14.next = 15;
break;
}
outputScriptType = varuint.encode(outputType);
outputHashBuf = Buffer.from("000000000000000000000000".concat(outputHash.toString('hex')), 'hex');
_context14.next = 21;
break;
case 15:
if (!(outputType === _types.ScriptType.P2WSH)) {
_context14.next = 20;
break;
}
outputScriptType = varuint.encode(outputType);
outputHashBuf = Buffer.from(outputHash.toString('hex'), 'hex');
_context14.next = 21;
break;
case 20:
throw new _core.error.SDKError(getBTCArgument.name, "Unsupport ScriptType '".concat(outputType, "'"));
case 21:
usdtAmount = bufferUtil.toUintBuffer(value, 8); //[haveChange(1B)] [changeScriptType(1B)] [changeAmount(8B)] [changePath(21B)]
if (!change) {
_context14.next = 35;
break;
}
if (change.pubkeyBuf) {
_context14.next = 25;
break;
}
throw new _core.error.SDKError(getWitness1Argument.name, 'Public Key not exists !!');
case 25:
haveChange = varuint.encode(1);
changeScriptType = bufferUtil.toUintBuffer(scriptType, 1);
changeAmount = bufferUtil.toUintBuffer(change.value, 8);
_context14.t0 = Buffer;
_context14.next = 31;
return _core.utils.getPath(_param.COIN_TYPE, change.addressIndex, 5, _param2.PathType.BIP32, change.purposeIndex);
case 31:
_context14.t1 = _context14.sent;
changePath = _context14.t0.from.call(_context14.t0, _context14.t1, 'hex');
_context14.next = 39;
break;
case 35:
haveChange = Buffer.from('00', 'hex');
changeScriptType = Buffer.from('00', 'hex');
changeAmount = bufferUtil.toUintBuffer(0, 8); //)Buffer.from('0000000000000000', 'hex');
changePath = bufferUtil.toUintBuffer(0, 21); //Buffer.from('000000000000000000000000000000000000000000', 'hex');
case 39:
reverseSequence = Buffer.from('fdffffff', 'hex');
reverseLockTime = Buffer.from('00000000', 'hex');
reverseHashType = Buffer.from('01000000', 'hex');
return _context14.abrupt("return", Buffer.concat([reverseVersion, hashPrevouts, hashSequences, zeroPadding, outputScriptType, usdtDust, usdtAmount, outputHashBuf, haveChange, changeScriptType, changeAmount, changePath, reverseSequence, reverseLockTime, reverseHashType]).toString('hex'));
case 43:
case "end":
return _context14.stop();
}
}
}, _callee14);
}));
return _getUSDTNewArgument.apply(this, arguments);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zY3JpcHRVdGlsLnRzIl0sIm5hbWVzIjpbImdldEV4dHJhVHJhbnNhY3Rpb25UeXBlIiwiY2FyZFR5cGUiLCJzZVZlcnNpb24iLCJyZWRlZW1TY3JpcHRUeXBlIiwiU2NyaXB0VHlwZSIsIlAyUEtIIiwiZ2V0UGF0aCIsImFkZHJlc3NJbmRleCIsInB1cnBvc2UiLCJwYXRoVHlwZSIsInV0aWxzIiwiQ09JTl9UWVBFIiwicGF0aCIsImdldFNjcmlwdFNpZ25pbmdBY3Rpb25zIiwidHJhbnNwb3J0IiwiYXBwSWQiLCJhcHBQcml2YXRlS2V5IiwicHJlcGFyZWREYXRhIiwidXR4b0FyZ3VtZW50cyIsInByZXBhcmVkSW5wdXRzIiwibWFwIiwicHJlcGFyZWRJbnB1dCIsIlNFUGF0aCIsIkJ1ZmZlciIsImZyb20iLCJvdXRQb2ludCIsInByZU91dFBvaW50QnVmIiwiUDJXUEtIIiwiUDJTSF9QMldQS0giLCJpbnB1dFNjcmlwdFR5cGUiLCJ2YXJ1aW50IiwiZW5jb2RlIiwiaW5wdXRBbW91bnQiLCJwcmVWYWx1ZUJ1ZiIsInJldmVyc2UiLCJpbnB1dEhhc2giLCJjcnlwdG9VdGlsIiwiaGFzaDE2MCIsInB1YmtleUJ1ZiIsImNvbmNhdCIsInRvU3RyaW5nIiwiZXh0cmFUcmFuc2FjdGlvblR5cGUiLCJhY3Rpb25zIiwidXR4b0FyZ3VtZW50IiwidHgiLCJjb21tYW5kIiwiZXhlY3V0ZVV0eG9TY3JpcHQiLCJQMlRSIiwiaW5kZXgiLCJwdXJwb3NlSW5kZXgiLCJQYXRoVHlwZSIsIkJJUDM0MCIsImV4ZWN1dGVVdHhvU2VnbWVudFNjcmlwdCIsImJ1ZmZlclV0aWwiLCJ0b1JldmVyc2VVaW50QnVmZmVyIiwiUDJXU0giLCJvdXRTY3JpcHQiLCJpbnB1dFNjcmlwdCIsImVycm9yIiwiU0RLRXJyb3IiLCJuYW1lIiwibGVuZ3RoIiwiZ2V0U2NyaXB0U2lnbmluZ1ByZUFjdGlvbnMiLCJzY3JpcHQiLCJpbnB1dEFyZ3VtZW50IiwiYXJndW1lbnQiLCJjb25zb2xlIiwiZGVidWciLCJwcmVBY3Rpb25zIiwic2VuZFNjcmlwdCIsInB1c2giLCJzZW5kQXJndW1lbnQiLCJleGVjdXRlU2NyaXB0IiwiZ2V0QlRDQXJndW1lbnQiLCJzY3JpcHRUeXBlIiwiaW5wdXRzIiwib3V0cHV0IiwiY2hhbmdlIiwidHhVdGlsIiwiYWRkcmVzc1RvT3V0U2NyaXB0IiwiYWRkcmVzcyIsIm91dHB1dFR5cGUiLCJvdXRwdXRIYXNoIiwib3V0SGFzaCIsIm91dHB1dFNjcmlwdFR5cGUiLCJvdXRwdXRIYXNoQnVmIiwib3V0cHV0QW1vdW50IiwidG9VaW50QnVmZmVyIiwidmFsdWUiLCJoYXZlQ2hhbmdlIiwiY2hhbmdlU2NyaXB0VHlwZSIsImNoYW5nZUFtb3VudCIsImNoYW5nZVBhdGgiLCJwcmV2b3V0cyIsImlucHV0IiwicHJlVHhIYXNoIiwicHJlSW5kZXgiLCJoYXNoUHJldm91dHMiLCJkb3VibGVTaGEyNTYiLCJzZXF1ZW5jZXMiLCJzZXF1ZW5jZSIsImhhc2hTZXF1ZW5jZSIsImdldFdpdG5lc3MwQXJndW1lbnQiLCJzY3JpcHRQdWJLZXkiLCJyZXZlcnNlVmVyc2lvbiIsImhhc2hTZXF1ZW5jZXMiLCJ6ZXJvUGFkZGluZyIsIkJJUDMyIiwicmV2ZXJzZVNlcXVlbmNlIiwicmV2ZXJzZUxvY2tUaW1lIiwicmV2ZXJzZUhhc2hUeXBlIiwiZ2V0V2l0bmVzczFBcmd1bWVudCIsInNoYTI1NiIsImFtb3VudHMiLCJwcmVWYWx1ZSIsImhhc2hBbW91bnRzIiwic2NyaXB0UHVia2V5cyIsImhhc2hTY3JpcHRQdWJrZXlzIiwiZ2V0VVNEVEFyZ3VtZW50IiwidXNkdEFtb3VudCIsImdldFVTRFROZXdBcmd1bWVudCIsInVzZHREdXN0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTs7QUFDQTs7Ozs7Ozs7OztBQUVBO0FBQ0EsSUFBTUEsdUJBQXVCLEdBQUcsU0FBMUJB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