Accept serialized signing prevouts

This commit is contained in:
matcha committed 2026-10-05 06:06:28 +00:00
1 parent b7cee2ed71
commit cae96877c4
1 file changed
+12 -4
+12 -4
View File
@@ -1,4 +1,4 @@
import { Address, Signer, Tx } from "@cmdcode/tapscript";
import { Address, Script, Signer, Tx } from "@cmdcode/tapscript";
import { schnorr, secp256k1 } from "@noble/curves/secp256k1";
import { bytesToHex } from "@noble/curves/abstract/utils";
@@ -22,14 +22,22 @@ function hydrate(hex, prevouts) {
if (!Array.isArray(prevouts) || prevouts.length !== tx.vin.length) throw new Error("Prevout set does not match transaction inputs.");
tx.vin.forEach((input, i) => {
const prevout = prevouts[i];
if (!Number.isSafeInteger(prevout?.value) || prevout.value < 0 || !Array.isArray(prevout?.scriptPubKey)) throw new Error("Invalid signing prevout.");
input.prevout = { value: prevout.value, scriptPubKey: prevout.scriptPubKey };
const script = prevout?.scriptPubKey;
const scriptOk = Array.isArray(script) || (typeof script === "string" && /^(?:[0-9a-f]{2})+$/i.test(script));
if (!Number.isSafeInteger(prevout?.value) || prevout.value < 0 || !scriptOk) throw new Error("Invalid signing prevout.");
input.prevout = { value: prevout.value, scriptPubKey: script };
});
return tx;
}
function scriptHex(script) {
return typeof script === "string" ? script.toLowerCase() : Script.encode(script).hex.toLowerCase();
}
function assertOwnKeyPath(me, tx, inputIndex) {
if (JSON.stringify(tx.vin[inputIndex]?.prevout?.scriptPubKey) !== JSON.stringify(["OP_1", me.pubkey])) {
const actual = tx.vin[inputIndex]?.prevout?.scriptPubKey;
const expected = Script.encode(["OP_1", me.pubkey]).hex.toLowerCase();
if (!actual || scriptHex(actual) !== expected) {
throw new Error("Refusing key-path signature for an input not owned by Inscriboor.");
}
}