ecash-lib
Version:
Library for eCash transaction building
68 lines • 2.34 kB
JavaScript
;
// Copyright (c) 2024 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseEmppScript = exports.emppScript = void 0;
const op_js_1 = require("../op.js");
const opcode_js_1 = require("../opcode.js");
const script_js_1 = require("../script.js");
/** Build an eMPP OP_RETURN script with the given pushdata */
function emppScript(pushdata) {
if (pushdata.find(pushdata => pushdata.length == 0) !== undefined) {
throw new Error('Pushdata cannot be empty');
}
return script_js_1.Script.fromOps([
opcode_js_1.OP_RETURN,
opcode_js_1.OP_RESERVED,
...pushdata.map(pushdataOpEmpp),
]);
}
exports.emppScript = emppScript;
function pushdataOpEmpp(pushdata) {
if (pushdata.length < opcode_js_1.OP_PUSHDATA1) {
return {
opcode: pushdata.length,
data: pushdata,
};
}
return (0, op_js_1.pushBytesOp)(pushdata);
}
/**
* Parse a script for EMPP push(es)
*
* EMPP may encode multiple pushdatas in a single OP_RETURN script
*
* input script is a valid EMPP OP_RETURN => returns an array of EMPP pushdata(s)
* input script is not an EMPP OP_RETURN => returns undefined
* input script is an invalid EMPP OP_RETURN => throws
*/
function parseEmppScript(script) {
const ops = script.ops();
const opreturnOp = ops.next();
if (opreturnOp === undefined ||
(0, op_js_1.isPushOp)(opreturnOp) ||
opreturnOp !== opcode_js_1.OP_RETURN) {
return undefined;
}
const opreservedOp = ops.next();
if (opreservedOp === undefined ||
(0, op_js_1.isPushOp)(opreservedOp) ||
opreservedOp !== opcode_js_1.OP_RESERVED) {
return undefined;
}
const pushdata = [];
let op = undefined;
while ((op = ops.next()) !== undefined) {
if (!(0, op_js_1.isPushOp)(op)) {
throw new Error('eMPP allows only push ops');
}
if (op.data.length === 0) {
throw new Error("eMPP doesn't allow empty pushdata");
}
pushdata.push(op.data);
}
return pushdata;
}
exports.parseEmppScript = parseEmppScript;
//# sourceMappingURL=empp.js.map