@arklabs/wallet-sdk
Version:
Bitcoin wallet SDK with Taproot and Ark integration
82 lines (81 loc) • 3.76 kB
JavaScript
import { Script } from "@scure/btc-signer";
import { CLTVMultisigTapscript, ConditionCSVMultisigTapscript, ConditionMultisigTapscript, CSVMultisigTapscript, MultisigTapscript, } from './tapscript.js';
import { hex } from "@scure/base";
import { VtxoScript } from './base.js';
// 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)
export var VHTLC;
(function (VHTLC) {
class Script extends VtxoScript {
constructor(options) {
const { sender, receiver, server, preimageHash, refundLocktime, unilateralClaimDelay, unilateralRefundDelay, unilateralRefundWithoutReceiverDelay, } = options;
const conditionScript = preimageConditionScript(preimageHash);
const claimScript = ConditionMultisigTapscript.encode({
conditionScript,
pubkeys: [receiver, server],
}).script;
const refundScript = MultisigTapscript.encode({
pubkeys: [sender, receiver, server],
}).script;
const refundWithoutReceiverScript = CLTVMultisigTapscript.encode({
absoluteTimelock: refundLocktime,
pubkeys: [sender, server],
}).script;
const unilateralClaimScript = ConditionCSVMultisigTapscript.encode({
conditionScript,
timelock: unilateralClaimDelay,
pubkeys: [receiver],
}).script;
const unilateralRefundScript = CSVMultisigTapscript.encode({
timelock: unilateralRefundDelay,
pubkeys: [sender, receiver],
}).script;
const unilateralRefundWithoutReceiverScript = CSVMultisigTapscript.encode({
timelock: unilateralRefundWithoutReceiverDelay,
pubkeys: [sender],
}).script;
super([
claimScript,
refundScript,
refundWithoutReceiverScript,
unilateralClaimScript,
unilateralRefundScript,
unilateralRefundWithoutReceiverScript,
]);
this.options = options;
this.claimScript = hex.encode(claimScript);
this.refundScript = hex.encode(refundScript);
this.refundWithoutReceiverScript = hex.encode(refundWithoutReceiverScript);
this.unilateralClaimScript = hex.encode(unilateralClaimScript);
this.unilateralRefundScript = hex.encode(unilateralRefundScript);
this.unilateralRefundWithoutReceiverScript = 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 || (VHTLC = {}));
function preimageConditionScript(preimageHash) {
return Script.encode(["HASH160", preimageHash, "EQUAL"]);
}