@arklabs/wallet-sdk
Version:
Bitcoin wallet SDK with Taproot and Ark integration
85 lines (84 loc) • 3.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.VHTLC = void 0;
const btc_signer_1 = require("@scure/btc-signer");
const tapscript_1 = require("./tapscript");
const base_1 = require("@scure/base");
const base_2 = require("./base");
// VHTLC is an Hashed Timelock Contract VtxoScript implementation
// - claim (preimage + receiver)
// - refund (sender + receiver + server)
// - refundWithoutReceiver (at refundLocktime, sender + receiver + server)
// - unilateralClaim (preimage + receiver after unilateralClaimDelay)
// - unilateralRefund (sender + receiver after unilateralRefundDelay)
// - unilateralRefundWithoutReceiver (sender after unilateralRefundWithoutReceiverDelay)
var VHTLC;
(function (VHTLC) {
class Script extends base_2.VtxoScript {
constructor(options) {
const { sender, receiver, server, preimageHash, refundLocktime, unilateralClaimDelay, unilateralRefundDelay, unilateralRefundWithoutReceiverDelay, } = options;
const conditionScript = preimageConditionScript(preimageHash);
const claimScript = tapscript_1.ConditionMultisigTapscript.encode({
conditionScript,
pubkeys: [receiver, server],
}).script;
const refundScript = tapscript_1.MultisigTapscript.encode({
pubkeys: [sender, receiver, server],
}).script;
const refundWithoutReceiverScript = tapscript_1.CLTVMultisigTapscript.encode({
absoluteTimelock: refundLocktime,
pubkeys: [sender, server],
}).script;
const unilateralClaimScript = tapscript_1.ConditionCSVMultisigTapscript.encode({
conditionScript,
timelock: unilateralClaimDelay,
pubkeys: [receiver],
}).script;
const unilateralRefundScript = tapscript_1.CSVMultisigTapscript.encode({
timelock: unilateralRefundDelay,
pubkeys: [sender, receiver],
}).script;
const unilateralRefundWithoutReceiverScript = tapscript_1.CSVMultisigTapscript.encode({
timelock: unilateralRefundWithoutReceiverDelay,
pubkeys: [sender],
}).script;
super([
claimScript,
refundScript,
refundWithoutReceiverScript,
unilateralClaimScript,
unilateralRefundScript,
unilateralRefundWithoutReceiverScript,
]);
this.options = options;
this.claimScript = base_1.hex.encode(claimScript);
this.refundScript = base_1.hex.encode(refundScript);
this.refundWithoutReceiverScript = base_1.hex.encode(refundWithoutReceiverScript);
this.unilateralClaimScript = base_1.hex.encode(unilateralClaimScript);
this.unilateralRefundScript = base_1.hex.encode(unilateralRefundScript);
this.unilateralRefundWithoutReceiverScript = base_1.hex.encode(unilateralRefundWithoutReceiverScript);
}
claim() {
return this.findLeaf(this.claimScript);
}
refund() {
return this.findLeaf(this.refundScript);
}
refundWithoutReceiver() {
return this.findLeaf(this.refundWithoutReceiverScript);
}
unilateralClaim() {
return this.findLeaf(this.unilateralClaimScript);
}
unilateralRefund() {
return this.findLeaf(this.unilateralRefundScript);
}
unilateralRefundWithoutReceiver() {
return this.findLeaf(this.unilateralRefundWithoutReceiverScript);
}
}
VHTLC.Script = Script;
})(VHTLC || (exports.VHTLC = VHTLC = {}));
function preimageConditionScript(preimageHash) {
return btc_signer_1.Script.encode(["HASH160", preimageHash, "EQUAL"]);
}