UNPKG

@bitgo/utxo-ord

Version:

Utilities for building ordinals with BitGo utxo-lib

67 lines (64 loc) 7.38 kB
"use strict"; /* https://github.com/casey/ord/blob/master/bip.mediawiki#terminology-and-notation > A satpoint may be used to indicate the location of a sat within an output. > A satpoint consists of an outpoint, i.e., a transaction ID and output index, with the addition of > the offset of the ordinal within that output. For example, if the sat in question is at offset 6 > in the first output of a transaction, its satpoint is: > `680df1e4d43016571e504b0b142ee43c5c0b83398a97bdcfd94ea6f287322d22:0:6` */ Object.defineProperty(exports, "__esModule", { value: true }); exports.parseOutputId = parseOutputId; exports.parseSatPoint = parseSatPoint; exports.formatSatPoint = formatSatPoint; exports.isSatPoint = isSatPoint; /** * Parse an output ID (txid:vout) into its components. */ function parseOutputId(outputId) { const colonIndex = outputId.lastIndexOf(':'); if (colonIndex === -1) { throw new Error(`Invalid output id format: missing colon`); } const txid = outputId.slice(0, colonIndex); const voutStr = outputId.slice(colonIndex + 1); if (txid.length !== 64 || !/^[0-9a-fA-F]+$/.test(txid)) { throw new Error(`Invalid txid: must be 64 hex characters`); } const vout = parseInt(voutStr, 10); if (isNaN(vout) || vout < 0) { throw new Error(`Invalid vout: must be non-negative integer`); } return { txid, vout }; } function parseSatPoint(p) { const parts = p.split(':'); if (parts.length !== 3) { throw new Error(`expected format txid:vout:sat`); } const [txid, vout, offsetStr] = parts; const offset = BigInt(offsetStr); if (offset.toString() !== offsetStr) { throw new Error(`SatPoint offset must be base-10`); } if (offset < 0) { throw new Error(`SatPoint offset must be positive`); } return { ...parseOutputId([txid, vout].join(':')), offset, }; } function formatSatPoint(p) { return `${p.txid}:${p.vout}:${p.offset}`; } function isSatPoint(v) { try { parseSatPoint(v); return true; } catch { return false; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2F0UG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvU2F0UG9pbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7O0VBVUU7O0FBT0Ysc0NBZUM7QUFFRCxzQ0FpQkM7QUFFRCx3Q0FFQztBQUVELGdDQU9DO0FBbEREOztHQUVHO0FBQ0gsU0FBZ0IsYUFBYSxDQUFDLFFBQWdCO0lBQzVDLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0MsSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQy9DLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN2RCxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbkMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUN4QixDQUFDO0FBRUQsU0FBZ0IsYUFBYSxDQUFDLENBQVc7SUFDdkMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDdEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pDLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQ0QsSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELE9BQU87UUFDTCxHQUFHLGFBQWEsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEMsTUFBTTtLQUNQLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLENBQWlEO0lBQzlFLE9BQU8sR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBVyxDQUFDO0FBQ3BELENBQUM7QUFFRCxTQUFnQixVQUFVLENBQUMsQ0FBUztJQUNsQyxJQUFJLENBQUM7UUFDSCxhQUFhLENBQUMsQ0FBYSxDQUFDLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5cbmh0dHBzOi8vZ2l0aHViLmNvbS9jYXNleS9vcmQvYmxvYi9tYXN0ZXIvYmlwLm1lZGlhd2lraSN0ZXJtaW5vbG9neS1hbmQtbm90YXRpb25cblxuPiBBIHNhdHBvaW50IG1heSBiZSB1c2VkIHRvIGluZGljYXRlIHRoZSBsb2NhdGlvbiBvZiBhIHNhdCB3aXRoaW4gYW4gb3V0cHV0LlxuPiBBIHNhdHBvaW50IGNvbnNpc3RzIG9mIGFuIG91dHBvaW50LCBpLmUuLCBhIHRyYW5zYWN0aW9uIElEIGFuZCBvdXRwdXQgaW5kZXgsIHdpdGggdGhlIGFkZGl0aW9uIG9mXG4+IHRoZSBvZmZzZXQgb2YgdGhlIG9yZGluYWwgd2l0aGluIHRoYXQgb3V0cHV0LiBGb3IgZXhhbXBsZSwgaWYgdGhlIHNhdCBpbiBxdWVzdGlvbiBpcyBhdCBvZmZzZXQgNlxuPiBpbiB0aGUgZmlyc3Qgb3V0cHV0IG9mIGEgdHJhbnNhY3Rpb24sIGl0cyBzYXRwb2ludCBpczpcbj4gYDY4MGRmMWU0ZDQzMDE2NTcxZTUwNGIwYjE0MmVlNDNjNWMwYjgzMzk4YTk3YmRjZmQ5NGVhNmYyODczMjJkMjI6MDo2YFxuXG4qL1xuXG5leHBvcnQgdHlwZSBTYXRQb2ludCA9IGAke3N0cmluZ306JHtudW1iZXJ9OiR7YmlnaW50fWA7XG5cbi8qKlxuICogUGFyc2UgYW4gb3V0cHV0IElEICh0eGlkOnZvdXQpIGludG8gaXRzIGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU91dHB1dElkKG91dHB1dElkOiBzdHJpbmcpOiB7IHR4aWQ6IHN0cmluZzsgdm91dDogbnVtYmVyIH0ge1xuICBjb25zdCBjb2xvbkluZGV4ID0gb3V0cHV0SWQubGFzdEluZGV4T2YoJzonKTtcbiAgaWYgKGNvbG9uSW5kZXggPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG91dHB1dCBpZCBmb3JtYXQ6IG1pc3NpbmcgY29sb25gKTtcbiAgfVxuICBjb25zdCB0eGlkID0gb3V0cHV0SWQuc2xpY2UoMCwgY29sb25JbmRleCk7XG4gIGNvbnN0IHZvdXRTdHIgPSBvdXRwdXRJZC5zbGljZShjb2xvbkluZGV4ICsgMSk7XG4gIGlmICh0eGlkLmxlbmd0aCAhPT0gNjQgfHwgIS9eWzAtOWEtZkEtRl0rJC8udGVzdCh0eGlkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0eGlkOiBtdXN0IGJlIDY0IGhleCBjaGFyYWN0ZXJzYCk7XG4gIH1cbiAgY29uc3Qgdm91dCA9IHBhcnNlSW50KHZvdXRTdHIsIDEwKTtcbiAgaWYgKGlzTmFOKHZvdXQpIHx8IHZvdXQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZvdXQ6IG11c3QgYmUgbm9uLW5lZ2F0aXZlIGludGVnZXJgKTtcbiAgfVxuICByZXR1cm4geyB0eGlkLCB2b3V0IH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNhdFBvaW50KHA6IFNhdFBvaW50KTogeyB0eGlkOiBzdHJpbmc7IHZvdXQ6IG51bWJlcjsgb2Zmc2V0OiBiaWdpbnQgfSB7XG4gIGNvbnN0IHBhcnRzID0gcC5zcGxpdCgnOicpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCBmb3JtYXQgdHhpZDp2b3V0OnNhdGApO1xuICB9XG4gIGNvbnN0IFt0eGlkLCB2b3V0LCBvZmZzZXRTdHJdID0gcGFydHM7XG4gIGNvbnN0IG9mZnNldCA9IEJpZ0ludChvZmZzZXRTdHIpO1xuICBpZiAob2Zmc2V0LnRvU3RyaW5nKCkgIT09IG9mZnNldFN0cikge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2F0UG9pbnQgb2Zmc2V0IG11c3QgYmUgYmFzZS0xMGApO1xuICB9XG4gIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTYXRQb2ludCBvZmZzZXQgbXVzdCBiZSBwb3NpdGl2ZWApO1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4ucGFyc2VPdXRwdXRJZChbdHhpZCwgdm91dF0uam9pbignOicpKSxcbiAgICBvZmZzZXQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTYXRQb2ludChwOiB7IHR4aWQ6IHN0cmluZzsgdm91dDogbnVtYmVyOyBvZmZzZXQ6IGJpZ2ludCB9KTogU2F0UG9pbnQge1xuICByZXR1cm4gYCR7cC50eGlkfToke3Audm91dH06JHtwLm9mZnNldH1gIGFzIGNvbnN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTYXRQb2ludCh2OiBzdHJpbmcpOiB2IGlzIFNhdFBvaW50IHtcbiAgdHJ5IHtcbiAgICBwYXJzZVNhdFBvaW50KHYgYXMgU2F0UG9pbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==