Class VHTLCv2NonInteractiveRefund
The optional nonInteractiveRefund leaf: server + receiver + a covenant-tweaked emulator
co-signer, pinned to SenderPkScript, no timelock.
public sealed record VHTLCv2NonInteractiveRefund : IEquatable<VHTLCv2NonInteractiveRefund>
- Inheritance
-
VHTLCv2NonInteractiveRefund
- Implements
- Inherited Members
Remarks
Every OTHER refund-side leaf requires the sender's own signature, so if the sender permanently loses that key none of them are reachable. This leaf is the exception: it needs neither the sender's presence nor their key, and the covenant is what still guarantees the payout can only reach the sender's pre-committed address. It does need the receiver — deliberately, because that is what lets server and receiver release the refund the moment they agree the swap failed, rather than making the sender wait out the locktime.
WithoutReceiver adds the one refund tier that needs NO participant signature at
all: the server plus this same covenant co-signer, after RefundLocktime. refund and
refundWithoutReceiver need the sender's key, nonInteractiveRefund needs the
receiver's; a sender who funds a lockup and then vanishes is refundable through this leaf alone,
by anyone, and still only to their pre-committed address.
It is opt-in because it APPENDS A NINTH LEAF and so moves the address. The two shapes are different contracts, not variants of one: a lockup already funded in the eight-leaf shape keeps it permanently, since a leaf cannot be retrofitted onto an address already committed to. Both leaves pin the same destination and so share one covenant key, which is why they are one record rather than two — deriving the key twice would make that agreement a coincidence.
Constructors
VHTLCv2NonInteractiveRefund(byte[], ECXOnlyPubKey, bool)
The optional nonInteractiveRefund leaf: server + receiver + a covenant-tweaked emulator
co-signer, pinned to SenderPkScript, no timelock.
public VHTLCv2NonInteractiveRefund(byte[] SenderPkScript, ECXOnlyPubKey EmulatorPubKey, bool WithoutReceiver = false)
Parameters
SenderPkScriptbyte[]Where the refund must pay — the sender's P2TR scriptPubKey (34 bytes).
EmulatorPubKeyECXOnlyPubKeyThe emulator key the covenant tweaks.
WithoutReceiverboolAlso append the timelocked twin,
nonInteractiveRefundWithoutReceiver. Defaults tofalse, which is the eight-leaf shape every lockup funded so far carries.
Remarks
Every OTHER refund-side leaf requires the sender's own signature, so if the sender permanently loses that key none of them are reachable. This leaf is the exception: it needs neither the sender's presence nor their key, and the covenant is what still guarantees the payout can only reach the sender's pre-committed address. It does need the receiver — deliberately, because that is what lets server and receiver release the refund the moment they agree the swap failed, rather than making the sender wait out the locktime.
WithoutReceiver adds the one refund tier that needs NO participant signature at
all: the server plus this same covenant co-signer, after RefundLocktime. refund and
refundWithoutReceiver need the sender's key, nonInteractiveRefund needs the
receiver's; a sender who funds a lockup and then vanishes is refundable through this leaf alone,
by anyone, and still only to their pre-committed address.
It is opt-in because it APPENDS A NINTH LEAF and so moves the address. The two shapes are different contracts, not variants of one: a lockup already funded in the eight-leaf shape keeps it permanently, since a leaf cannot be retrofitted onto an address already committed to. Both leaves pin the same destination and so share one covenant key, which is why they are one record rather than two — deriving the key twice would make that agreement a coincidence.
Properties
EmulatorPubKey
The emulator key the covenant tweaks.
public ECXOnlyPubKey EmulatorPubKey { get; init; }
Property Value
- ECXOnlyPubKey
SenderPkScript
Where the refund must pay — the sender's P2TR scriptPubKey (34 bytes).
public byte[] SenderPkScript { get; init; }
Property Value
- byte[]
WithoutReceiver
Also append the timelocked twin, nonInteractiveRefundWithoutReceiver. Defaults to
false, which is the eight-leaf shape every lockup funded so far carries.
public bool WithoutReceiver { get; init; }