UNPKG

@bsv/wallet-toolbox-client

Version:
106 lines 4.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createAction = createAction; exports.processAction = processAction; const sdk_1 = require("@bsv/sdk"); const buildSignableTransaction_1 = require("./buildSignableTransaction"); const completeSignedTransaction_1 = require("./completeSignedTransaction"); const WERR_errors_1 = require("../../sdk/WERR_errors"); async function createAction(wallet, auth, vargs) { var _a; const r = {}; let prior = undefined; if (vargs.isNewTx) { prior = await createNewTx(wallet, vargs); if (vargs.isSignAction) { return makeSignableTransactionResult(prior, wallet, vargs); } prior.tx = await (0, completeSignedTransaction_1.completeSignedTransaction)(prior, {}, wallet); r.txid = prior.tx.id('hex'); const beef = new sdk_1.Beef(); if (prior.dcr.inputBeef) beef.mergeBeef(prior.dcr.inputBeef); beef.mergeTransaction(prior.tx); (0, completeSignedTransaction_1.verifyUnlockScripts)(r.txid, beef); r.noSendChange = (_a = prior.dcr.noSendChangeOutputVouts) === null || _a === void 0 ? void 0 : _a.map(vout => `${r.txid}.${vout}`); if (!vargs.options.returnTXIDOnly) r.tx = beef.toBinaryAtomic(r.txid); } const { sendWithResults, notDelayedResults } = await processAction(prior, wallet, auth, vargs); r.sendWithResults = sendWithResults; r.notDelayedResults = notDelayedResults; return r; } async function createNewTx(wallet, args) { const storageArgs = removeUnlockScripts(args); const dcr = await wallet.storage.createAction(storageArgs); const reference = dcr.reference; const { tx, amount, pdi } = (0, buildSignableTransaction_1.buildSignableTransaction)(dcr, args, wallet); const prior = { reference, dcr, args, amount, tx, pdi }; return prior; } function makeSignableTransactionResult(prior, wallet, args) { var _a; if (!prior.dcr.inputBeef) throw new WERR_errors_1.WERR_INTERNAL('prior.dcr.inputBeef must be valid'); const txid = prior.tx.id('hex'); const r = { noSendChange: args.isNoSend ? (_a = prior.dcr.noSendChangeOutputVouts) === null || _a === void 0 ? void 0 : _a.map(vout => `${txid}.${vout}`) : undefined, signableTransaction: { reference: prior.dcr.reference, tx: makeSignableTransactionBeef(prior.tx, prior.dcr.inputBeef) } }; wallet.pendingSignActions[r.signableTransaction.reference] = prior; return r; } function makeSignableTransactionBeef(tx, inputBEEF) { // This is a special case beef for transaction signing. // We only need the transaction being signed, and for each input, the raw source transaction. const beef = new sdk_1.Beef(); for (const input of tx.inputs) { if (!input.sourceTransaction) throw new WERR_errors_1.WERR_INTERNAL('Every signableTransaction input must have a sourceTransaction'); beef.mergeRawTx(input.sourceTransaction.toBinary()); } beef.mergeRawTx(tx.toBinary()); return beef.toBinaryAtomic(tx.id('hex')); } function removeUnlockScripts(args) { let storageArgs = args; if (!storageArgs.inputs.every(i => i.unlockingScript === undefined)) { // Never send unlocking scripts to storage, all it needs is the script length. storageArgs = { ...args, inputs: [] }; for (const i of args.inputs) { const di = { ...i, unlockingScriptLength: i.unlockingScript !== undefined ? i.unlockingScript.length : i.unlockingScriptLength }; delete di.unlockingScript; storageArgs.inputs.push(di); } } return storageArgs; } async function processAction(prior, wallet, auth, vargs) { const args = { isNewTx: vargs.isNewTx, isSendWith: vargs.isSendWith, isNoSend: vargs.isNoSend, isDelayed: vargs.isDelayed, reference: prior ? prior.reference : undefined, txid: prior ? prior.tx.id('hex') : undefined, rawTx: prior ? prior.tx.toBinary() : undefined, sendWith: vargs.isSendWith ? vargs.options.sendWith : [] }; const r = await wallet.storage.processAction(args); return r; } function makeDummyTransactionForOutputSatoshis(vout, satoshis) { const tx = new sdk_1.Transaction(); for (let i = 0; i < vout; i++) tx.addOutput({ lockingScript: new sdk_1.Script(), satoshis: 0 }); tx.addOutput({ lockingScript: new sdk_1.Script(), satoshis }); return tx; } //# sourceMappingURL=createAction.js.map