Adding an htlc model file
This commit is contained in:
80
side-node/src/bitcoin/htlc.rs
Normal file
80
side-node/src/bitcoin/htlc.rs
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use bdk_wallet::miniscript::descriptor::Wsh;
|
||||||
|
use bdk_wallet::miniscript::policy::{self, Concrete, Liftable};
|
||||||
|
use bitcoin::Address;
|
||||||
|
|
||||||
|
/// A hash time locked contract between two parties.
|
||||||
|
///
|
||||||
|
/// If the hash preimage of the hashlock is revealed, the value is sent to the redeem_identity.
|
||||||
|
///
|
||||||
|
/// Alternately, if the refund timelock expires, the value can be refunded to the refund_identity.
|
||||||
|
pub(crate) struct Htlc {
|
||||||
|
value: u64,
|
||||||
|
redeem_identity: Address,
|
||||||
|
hashlock: String,
|
||||||
|
refund_timelock: u64,
|
||||||
|
refund_indentiy: Address,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Htlc {
|
||||||
|
/// Create a new HTLC.
|
||||||
|
pub(crate) fn new(
|
||||||
|
value: u64,
|
||||||
|
redeem_identity: Address,
|
||||||
|
hashlock: String,
|
||||||
|
refund_timelock: u64,
|
||||||
|
refund_indentiy: Address,
|
||||||
|
) -> Self {
|
||||||
|
Self {
|
||||||
|
value,
|
||||||
|
redeem_identity,
|
||||||
|
hashlock,
|
||||||
|
refund_timelock,
|
||||||
|
refund_indentiy,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn to_miniscript_policy(&self) -> policy::Concrete<bitcoin::PublicKey> {
|
||||||
|
Concrete::<bitcoin::PublicKey>::from_str(&format!(
|
||||||
|
"or(10@and(sha256({secret_hash}),pk({redeem_identity})),1@and(older({expiry}),pk({refund_identity})))",
|
||||||
|
secret_hash = self.hashlock,
|
||||||
|
redeem_identity = self.redeem_identity,
|
||||||
|
refund_identity = self.refund_indentiy,
|
||||||
|
expiry = self.refund_timelock
|
||||||
|
)).expect("Policy compilation only fails on resource limits or mixed timelocks")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn to_miniscript_descriptor(&self) -> Wsh<bitcoin::PublicKey> {
|
||||||
|
Wsh::new(
|
||||||
|
self.to_miniscript_policy()
|
||||||
|
.compile()
|
||||||
|
.expect("Policy compilation only fails on resource limits or mixed timelocks"),
|
||||||
|
)
|
||||||
|
.expect("Resource limits")
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Translate the HTLC to Bitcoin op_codes.
|
||||||
|
pub(crate) fn to_script(&self) -> String {
|
||||||
|
format!(
|
||||||
|
"OP_IF
|
||||||
|
OP_SHA256
|
||||||
|
{}
|
||||||
|
OP_EQUALVERIFY
|
||||||
|
OP_DUP
|
||||||
|
OP_HASH160
|
||||||
|
{}
|
||||||
|
OP_ELSE
|
||||||
|
{}
|
||||||
|
OP_CHECKLOCKTIMEVERIFY
|
||||||
|
OP_DROP
|
||||||
|
OP_DUP
|
||||||
|
OP_HASH160
|
||||||
|
{}
|
||||||
|
OP_ENDIF
|
||||||
|
OP_EQUALVERIFY
|
||||||
|
OP_CHECKSIG",
|
||||||
|
self.hashlock, self.redeem_identity, self.refund_timelock, self.refund_indentiy
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
pub mod clients;
|
pub mod clients;
|
||||||
pub mod driver;
|
pub mod driver;
|
||||||
|
pub mod htlc;
|
||||||
pub mod keys;
|
pub mod keys;
|
||||||
|
|||||||
Reference in New Issue
Block a user