UNPKG

@arklabs/wallet-sdk

Version:

Bitcoin wallet SDK with Taproot and Ark integration

82 lines (81 loc) 3.76 kB
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"]); }