UNPKG

@coolwallet/btc

Version:
182 lines (141 loc) 19.2 kB
"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.signBTCTransaction = signBTCTransaction; var _core = require("@coolwallet/core"); var _types = require("./config/types"); var param = _interopRequireWildcard(require("./config/param")); var txUtil = _interopRequireWildcard(require("./utils/transactionUtil")); var scriptUtil = _interopRequireWildcard(require("./utils/scriptUtil")); var _type = require("@coolwallet/core/lib/transaction/type"); var _versionUtil = require("./utils/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); }); }; } function signTransaction(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8, _x9) { return _signTransaction.apply(this, arguments); } function _signTransaction() { _signTransaction = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(transport, appId, appPrivateKey, preActions, redeemScriptType, preparedData, seVersion, confirmCB, authorizedCB) { var _yield$scriptUtil$get, actions, signatureType, signatures, transaction; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return scriptUtil.getScriptSigningActions(transport, redeemScriptType, appId, appPrivateKey, preparedData, seVersion); case 2: _yield$scriptUtil$get = _context.sent; actions = _yield$scriptUtil$get.actions; _context.t0 = redeemScriptType; _context.next = _context.t0 === _types.ScriptType.P2PKH ? 7 : _context.t0 === _types.ScriptType.P2WPKH ? 7 : _context.t0 === _types.ScriptType.P2SH_P2WPKH ? 7 : _context.t0 === _types.ScriptType.P2TR ? 9 : 11; break; case 7: signatureType = _type.SignatureType.DER; return _context.abrupt("break", 12); case 9: signatureType = _type.SignatureType.Schnorr; return _context.abrupt("break", 12); case 11: throw new _core.error.SDKError(signTransaction.name, "Unsupport ScriptType '".concat(redeemScriptType, "'")); case 12: _context.next = 14; return _core.tx.flow.getSignaturesFromCoolWalletV2(transport, preActions, actions, signatureType, confirmCB, authorizedCB); case 14: signatures = _context.sent; transaction = txUtil.composeFinalTransaction(redeemScriptType, preparedData, signatures); return _context.abrupt("return", transaction.toString('hex')); case 17: case "end": return _context.stop(); } } }, _callee); })); return _signTransaction.apply(this, arguments); } function checkRedeemScriptType(_x10) { return _checkRedeemScriptType.apply(this, arguments); } function _checkRedeemScriptType() { _checkRedeemScriptType = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(redeemScriptType) { return regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: if (!(redeemScriptType !== _types.ScriptType.P2PKH && redeemScriptType !== _types.ScriptType.P2WPKH && redeemScriptType !== _types.ScriptType.P2SH_P2WPKH && redeemScriptType !== _types.ScriptType.P2TR)) { _context2.next = 2; break; } throw new _core.error.SDKError(signTransaction.name, "Unsupport ScriptType '".concat(redeemScriptType, "'")); case 2: case "end": return _context2.stop(); } } }, _callee2); })); return _checkRedeemScriptType.apply(this, arguments); } function signBTCTransaction(_x11) { return _signBTCTransaction.apply(this, arguments); } function _signBTCTransaction() { _signBTCTransaction = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(signTxData) { var redeemScriptType, transport, inputs, output, change, version, appId, appPrivateKey, confirmCB, authorizedCB, _txUtil$createUnsigne, preparedData, seVersion, script, argument, _scriptUtil$getScript, preActions; return regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: redeemScriptType = signTxData.scriptType, transport = signTxData.transport, inputs = signTxData.inputs, output = signTxData.output, change = signTxData.change, version = signTxData.version, appId = signTxData.appId, appPrivateKey = signTxData.appPrivateKey, confirmCB = signTxData.confirmCB, authorizedCB = signTxData.authorizedCB; checkRedeemScriptType(redeemScriptType); _txUtil$createUnsigne = txUtil.createUnsignedTransactions(redeemScriptType, inputs, output, change, version), preparedData = _txUtil$createUnsigne.preparedData; _context3.next = 5; return _core.info.getSEVersion(transport); case 5: seVersion = _context3.sent; if (!((0, _versionUtil.shouldUseLegacyUtxoScript)(transport.cardType, seVersion) || redeemScriptType === _types.ScriptType.P2PKH)) { _context3.next = 13; break; } script = param.TRANSFER.script + param.TRANSFER.signature; _context3.next = 10; return scriptUtil.getBTCArgument(redeemScriptType, inputs, output, change); case 10: argument = _context3.sent; _context3.next = 24; break; case 13: if (!(redeemScriptType === _types.ScriptType.P2TR)) { _context3.next = 20; break; } script = param.WITNESS_1.script + param.WITNESS_1.signature; _context3.next = 17; return scriptUtil.getWitness1Argument(redeemScriptType, inputs, output, change); case 17: argument = _context3.sent; _context3.next = 24; break; case 20: script = param.WITNESS_0.script + param.WITNESS_0.signature; _context3.next = 23; return scriptUtil.getWitness0Argument(redeemScriptType, inputs, output, change); case 23: argument = _context3.sent; case 24: _scriptUtil$getScript = scriptUtil.getScriptSigningPreActions(transport, appId, appPrivateKey, script, argument), preActions = _scriptUtil$getScript.preActions; return _context3.abrupt("return", signTransaction(transport, appId, appPrivateKey, preActions, redeemScriptType, preparedData, seVersion, confirmCB, authorizedCB)); case 26: case "end": return _context3.stop(); } } }, _callee3); })); return _signBTCTransaction.apply(this, arguments); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zaWduLnRzIl0sIm5hbWVzIjpbInNpZ25UcmFuc2FjdGlvbiIsInRyYW5zcG9ydCIsImFwcElkIiwiYXBwUHJpdmF0ZUtleSIsInByZUFjdGlvbnMiLCJyZWRlZW1TY3JpcHRUeXBlIiwicHJlcGFyZWREYXRhIiwic2VWZXJzaW9uIiwiY29uZmlybUNCIiwiYXV0aG9yaXplZENCIiwic2NyaXB0VXRpbCIsImdldFNjcmlwdFNpZ25pbmdBY3Rpb25zIiwiYWN0aW9ucyIsIlNjcmlwdFR5cGUiLCJQMlBLSCIsIlAyV1BLSCIsIlAyU0hfUDJXUEtIIiwiUDJUUiIsInNpZ25hdHVyZVR5cGUiLCJTaWduYXR1cmVUeXBlIiwiREVSIiwiU2Nobm9yciIsImVycm9yIiwiU0RLRXJyb3IiLCJuYW1lIiwidHgiLCJmbG93IiwiZ2V0U2lnbmF0dXJlc0Zyb21Db29sV2FsbGV0VjIiLCJzaWduYXR1cmVzIiwidHJhbnNhY3Rpb24iLCJ0eFV0aWwiLCJjb21wb3NlRmluYWxUcmFuc2FjdGlvbiIsInRvU3RyaW5nIiwiY2hlY2tSZWRlZW1TY3JpcHRUeXBlIiwic2lnbkJUQ1RyYW5zYWN0aW9uIiwic2lnblR4RGF0YSIsInNjcmlwdFR5cGUiLCJpbnB1dHMiLCJvdXRwdXQiLCJjaGFuZ2UiLCJ2ZXJzaW9uIiwiY3JlYXRlVW5zaWduZWRUcmFuc2FjdGlvbnMiLCJpbmZvIiwiZ2V0U0VWZXJzaW9uIiwiY2FyZFR5cGUiLCJzY3JpcHQiLCJwYXJhbSIsIlRSQU5TRkVSIiwic2lnbmF0dXJlIiwiZ2V0QlRDQXJndW1lbnQiLCJhcmd1bWVudCIsIldJVE5FU1NfMSIsImdldFdpdG5lc3MxQXJndW1lbnQiLCJXSVRORVNTXzAiLCJnZXRXaXRuZXNzMEFyZ3VtZW50IiwiZ2V0U2NyaXB0U2lnbmluZ1ByZUFjdGlvbnMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOzs7Ozs7Ozs7O1NBRWVBLGU7Ozs7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TUFBekQsRUFBaUVDLE1BQWpFLENBcENkOztBQUFBO0FBb0NIVyxZQUFBQSxRQXBDRzs7QUFBQTtBQUFBLG9DQXVDa0J4QyxVQUFVLENBQUM2QywwQkFBWCxDQUFzQ3RELFNBQXRDLEVBQWlEQyxLQUFqRCxFQUF3REMsYUFBeEQsRUFBdUUwQyxNQUF2RSxFQUErRUssUUFBL0UsQ0F2Q2xCLEVBdUNHOUMsVUF2Q0gseUJBdUNHQSxVQXZDSDtBQUFBLDhDQXlDRUosZUFBZSxDQUNwQkMsU0FEb0IsRUFFcEJDLEtBRm9CLEVBR3BCQyxhQUhvQixFQUlwQkMsVUFKb0IsRUFLcEJDLGdCQUxvQixFQU1wQkMsWUFOb0IsRUFPcEJDLFNBUG9CLEVBUXBCQyxTQVJvQixFQVNwQkMsWUFUb0IsQ0F6Q2pCOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eCwgZXJyb3IsIGluZm8gfSBmcm9tICdAY29vbHdhbGxldC9jb3JlJztcbmltcG9ydCB7IFNjcmlwdFR5cGUsIFByZXBhcmVkRGF0YSwgQ2FsbGJhY2sgfSBmcm9tICcuL2NvbmZpZy90eXBlcyc7XG5pbXBvcnQgKiBhcyBwYXJhbSBmcm9tICcuL2NvbmZpZy9wYXJhbSc7XG5pbXBvcnQgKiBhcyB0eFV0aWwgZnJvbSAnLi91dGlscy90cmFuc2FjdGlvblV0aWwnO1xuaW1wb3J0ICogYXMgc2NyaXB0VXRpbCBmcm9tICcuL3V0aWxzL3NjcmlwdFV0aWwnO1xuaW1wb3J0IHsgc2lnblR4VHlwZSwgVHJhbnNwb3J0IH0gZnJvbSAnLi9jb25maWcvdHlwZXMnO1xuaW1wb3J0IHsgU2lnbmF0dXJlVHlwZSB9IGZyb20gJ0Bjb29sd2FsbGV0L2NvcmUvbGliL3RyYW5zYWN0aW9uL3R5cGUnO1xuaW1wb3J0IHsgc2hvdWxkVXNlTGVnYWN5VXR4b1NjcmlwdCB9IGZyb20gJy4vdXRpbHMvdmVyc2lvblV0aWwnO1xuXG5hc3luYyBmdW5jdGlvbiBzaWduVHJhbnNhY3Rpb24oXG4gIHRyYW5zcG9ydDogVHJhbnNwb3J0LFxuICBhcHBJZDogc3RyaW5nLFxuICBhcHBQcml2YXRlS2V5OiBzdHJpbmcsXG4gIHByZUFjdGlvbnM6IEFycmF5PENhbGxiYWNrPixcbiAgcmVkZWVtU2NyaXB0VHlwZTogU2NyaXB0VHlwZSxcbiAgcHJlcGFyZWREYXRhOiBQcmVwYXJlZERhdGEsXG4gIHNlVmVyc2lvbjogbnVtYmVyLFxuICBjb25maXJtQ0I/OiBDYWxsYmFjayxcbiAgYXV0aG9yaXplZENCPzogQ2FsbGJhY2tcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgYWN0aW9ucyB9ID0gYXdhaXQgc2NyaXB0VXRpbC5nZXRTY3JpcHRTaWduaW5nQWN0aW9ucyhcbiAgICB0cmFuc3BvcnQsXG4gICAgcmVkZWVtU2NyaXB0VHlwZSxcbiAgICBhcHBJZCxcbiAgICBhcHBQcml2YXRlS2V5LFxuICAgIHByZXBhcmVkRGF0YSxcbiAgICBzZVZlcnNpb25cbiAgKTtcblxuICBsZXQgc2lnbmF0dXJlVHlwZTogU2lnbmF0dXJlVHlwZTtcblxuICBzd2l0Y2ggKHJlZGVlbVNjcmlwdFR5cGUpIHtcbiAgICBjYXNlIFNjcmlwdFR5cGUuUDJQS0g6XG4gICAgY2FzZSBTY3JpcHRUeXBlLlAyV1BLSDpcbiAgICBjYXNlIFNjcmlwdFR5cGUuUDJTSF9QMldQS0g6XG4gICAgICBzaWduYXR1cmVUeXBlID0gU2lnbmF0dXJlVHlwZS5ERVI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFNjcmlwdFR5cGUuUDJUUjpcbiAgICAgIHNpZ25hdHVyZVR5cGUgPSBTaWduYXR1cmVUeXBlLlNjaG5vcnI7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IGVycm9yLlNES0Vycm9yKHNpZ25UcmFuc2FjdGlvbi5uYW1lLCBgVW5zdXBwb3J0IFNjcmlwdFR5cGUgJyR7cmVkZWVtU2NyaXB0VHlwZX0nYCk7XG4gIH1cblxuICBjb25zdCBzaWduYXR1cmVzID0gYXdhaXQgdHguZmxvdy5nZXRTaWduYXR1cmVzRnJvbUNvb2xXYWxsZXRWMihcbiAgICB0cmFuc3BvcnQsXG4gICAgcHJlQWN0aW9ucyxcbiAgICBhY3Rpb25zLFxuICAgIHNpZ25hdHVyZVR5cGUsXG4gICAgY29uZmlybUNCLFxuICAgIGF1dGhvcml6ZWRDQlxuICApO1xuICBjb25zdCB0cmFuc2FjdGlvbiA9IHR4VXRpbC5jb21wb3NlRmluYWxUcmFuc2FjdGlvbihyZWRlZW1TY3JpcHRUeXBlLCBwcmVwYXJlZERhdGEsIHNpZ25hdHVyZXMgYXMgQnVmZmVyW10pO1xuICByZXR1cm4gdHJhbnNhY3Rpb24udG9TdHJpbmcoJ2hleCcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja1JlZGVlbVNjcmlwdFR5cGUocmVkZWVtU2NyaXB0VHlwZTogU2NyaXB0VHlwZSkge1xuICBpZiAoXG4gICAgcmVkZWVtU2NyaXB0VHlwZSAhPT0gU2NyaXB0VHlwZS5QMlBLSCAmJlxuICAgIHJlZGVlbVNjcmlwdFR5cGUgIT09IFNjcmlwdFR5cGUuUDJXUEtIICYmXG4gICAgcmVkZWVtU2NyaXB0VHlwZSAhPT0gU2NyaXB0VHlwZS5QMlNIX1AyV1BLSCAmJlxuICAgIHJlZGVlbVNjcmlwdFR5cGUgIT09IFNjcmlwdFR5cGUuUDJUUlxuICApIHtcbiAgICB0aHJvdyBuZXcgZXJyb3IuU0RLRXJyb3Ioc2lnblRyYW5zYWN0aW9uLm5hbWUsIGBVbnN1cHBvcnQgU2NyaXB0VHlwZSAnJHtyZWRlZW1TY3JpcHRUeXBlfSdgKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkJUQ1RyYW5zYWN0aW9uKHNpZ25UeERhdGE6IHNpZ25UeFR5cGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgc2NyaXB0VHlwZTogcmVkZWVtU2NyaXB0VHlwZSxcbiAgICB0cmFuc3BvcnQsXG4gICAgaW5wdXRzLFxuICAgIG91dHB1dCxcbiAgICBjaGFuZ2UsXG4gICAgdmVyc2lvbixcbiAgICBhcHBJZCxcbiAgICBhcHBQcml2YXRlS2V5LFxuICAgIGNvbmZpcm1DQixcbiAgICBhdXRob3JpemVkQ0IsXG4gIH0gPSBzaWduVHhEYXRhO1xuXG4gIGNoZWNrUmVkZWVtU2NyaXB0VHlwZShyZWRlZW1TY3JpcHRUeXBlKTtcblxuICBjb25zdCB7IHByZXBhcmVkRGF0YSB9ID0gdHhVdGlsLmNyZWF0ZVVuc2lnbmVkVHJhbnNhY3Rpb25zKFxuICAgIHJlZGVlbVNjcmlwdFR5cGUsXG4gICAgaW5wdXRzLFxuICAgIG91dHB1dCxcbiAgICBjaGFuZ2UsXG4gICAgdmVyc2lvblxuICApO1xuICBjb25zdCBzZVZlcnNpb24gPSBhd2FpdCBpbmZvLmdldFNFVmVyc2lvbih0cmFuc3BvcnQpO1xuXG4gIGxldCBzY3JpcHQ7XG4gIGxldCBhcmd1bWVudDtcblxuICBpZiAoc2hvdWxkVXNlTGVnYWN5VXR4b1NjcmlwdCh0cmFuc3BvcnQuY2FyZFR5cGUsIHNlVmVyc2lvbikgfHwgcmVkZWVtU2NyaXB0VHlwZSA9PT0gU2NyaXB0VHlwZS5QMlBLSCkge1xuICAgIHNjcmlwdCA9IHBhcmFtLlRSQU5TRkVSLnNjcmlwdCArIHBhcmFtLlRSQU5TRkVSLnNpZ25hdHVyZTtcbiAgICBhcmd1bWVudCA9IGF3YWl0IHNjcmlwdFV0aWwuZ2V0QlRDQXJndW1lbnQocmVkZWVtU2NyaXB0VHlwZSwgaW5wdXRzLCBvdXRwdXQsIGNoYW5nZSk7XG4gIH0gZWxzZSBpZiAocmVkZWVtU2NyaXB0VHlwZSA9PT0gU2NyaXB0VHlwZS5QMlRSKSB7XG4gICAgc2NyaXB0ID0gcGFyYW0uV0lUTkVTU18xLnNjcmlwdCArIHBhcmFtLldJVE5FU1NfMS5zaWduYXR1cmU7XG4gICAgYXJndW1lbnQgPSBhd2FpdCBzY3JpcHRVdGlsLmdldFdpdG5lc3MxQXJndW1lbnQocmVkZWVtU2NyaXB0VHlwZSwgaW5wdXRzLCBvdXRwdXQsIGNoYW5nZSk7XG4gIH0gZWxzZSB7XG4gICAgc2NyaXB0ID0gcGFyYW0uV0lUTkVTU18wLnNjcmlwdCArIHBhcmFtLldJVE5FU1NfMC5zaWduYXR1cmU7XG4gICAgYXJndW1lbnQgPSBhd2FpdCBzY3JpcHRVdGlsLmdldFdpdG5lc3MwQXJndW1lbnQocmVkZWVtU2NyaXB0VHlwZSwgaW5wdXRzLCBvdXRwdXQsIGNoYW5nZSk7XG4gIH1cblxuICBjb25zdCB7IHByZUFjdGlvbnMgfSA9IHNjcmlwdFV0aWwuZ2V0U2NyaXB0U2lnbmluZ1ByZUFjdGlvbnModHJhbnNwb3J0LCBhcHBJZCwgYXBwUHJpdmF0ZUtleSwgc2NyaXB0LCBhcmd1bWVudCk7XG5cbiAgcmV0dXJuIHNpZ25UcmFuc2FjdGlvbihcbiAgICB0cmFuc3BvcnQsXG4gICAgYXBwSWQsXG4gICAgYXBwUHJpdmF0ZUtleSxcbiAgICBwcmVBY3Rpb25zLFxuICAgIHJlZGVlbVNjcmlwdFR5cGUsXG4gICAgcHJlcGFyZWREYXRhLFxuICAgIHNlVmVyc2lvbixcbiAgICBjb25maXJtQ0IsXG4gICAgYXV0aG9yaXplZENCXG4gICk7XG59XG4iXX0=