Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move and rename crate::policy::semantic::Policy to crate::r#abstract::Abstract #604

Closed
wants to merge 8 commits into from
Closed
3 changes: 2 additions & 1 deletion examples/htlc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ use std::str::FromStr;

use miniscript::bitcoin::Network;
use miniscript::descriptor::Wsh;
use miniscript::policy::{Concrete, Liftable};
use miniscript::policy::concrete::Policy as Concrete;
use miniscript::r#abstract::Liftable;

fn main() {
// HTLC policy with 10:1 odds for happy (co-operative) case compared to uncooperative case.
Expand Down
2 changes: 1 addition & 1 deletion examples/taproot.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use miniscript::bitcoin::key::{KeyPair, XOnlyPublicKey};
use miniscript::bitcoin::secp256k1::rand;
use miniscript::bitcoin::Network;
use miniscript::descriptor::DescriptorType;
use miniscript::policy::Concrete;
use miniscript::policy::concrete::Policy as Concrete;
use miniscript::{translate_hash_fail, Descriptor, Miniscript, Tap, TranslatePk, Translator};

// Refer to https://github.com/sanket1729/adv_btc_workshop/blob/master/workshop.md#creating-a-taproot-descriptor
Expand Down
4 changes: 2 additions & 2 deletions fuzz/fuzz_targets/compile_descriptor.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
use std::str::FromStr;

use honggfuzz::fuzz;
use miniscript::r#abstract::Liftable;
use miniscript::{policy, Miniscript, Segwitv0};
use policy::Liftable;

type Script = Miniscript<String, Segwitv0>;
type Policy = policy::Concrete<String>;
type Policy = policy::concrete::Policy<String>;

fn do_test(data: &[u8]) {
let data_str = String::from_utf8_lossy(data);
Expand Down
2 changes: 1 addition & 1 deletion fuzz/fuzz_targets/roundtrip_concrete.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use honggfuzz::fuzz;
use miniscript::policy;
use regex::Regex;

type Policy = policy::Concrete<String>;
type Policy = policy::concrete::Policy<String>;

fn do_test(data: &[u8]) {
let data_str = String::from_utf8_lossy(data);
Expand Down
3 changes: 1 addition & 2 deletions fuzz/fuzz_targets/roundtrip_semantic.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
use std::str::FromStr;

use honggfuzz::fuzz;
use miniscript::policy;

type Policy = policy::Semantic<String>;
type Policy = miniscript::r#abstract::Abstract<String>;

fn do_test(data: &[u8]) {
let data_str = String::from_utf8_lossy(data);
Expand Down
528 changes: 528 additions & 0 deletions src/abstract/lift.rs

Large diffs are not rendered by default.

501 changes: 255 additions & 246 deletions src/policy/semantic.rs → src/abstract/mod.rs

Large diffs are not rendered by default.

8 changes: 3 additions & 5 deletions src/descriptor/bare.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ use crate::expression::{self, FromTree};
use crate::miniscript::context::{ScriptContext, ScriptContextError};
use crate::miniscript::satisfy::{Placeholder, Satisfaction, Witness};
use crate::plan::AssetProvider;
use crate::policy::{semantic, Liftable};
use crate::prelude::*;
use crate::r#abstract::{Abstract, Liftable};
use crate::util::{varint_len, witness_to_scriptsig};
use crate::{
BareCtx, Error, ForEachKey, Miniscript, MiniscriptKey, Satisfier, ToPublicKey, TranslateErr,
Expand Down Expand Up @@ -165,7 +165,7 @@ impl<Pk: MiniscriptKey> fmt::Display for Bare<Pk> {
}

impl<Pk: MiniscriptKey> Liftable<Pk> for Bare<Pk> {
fn lift(&self) -> Result<semantic::Policy<Pk>, Error> { self.ms.lift() }
fn lift(&self) -> Result<Abstract<Pk>, Error> { self.ms.lift() }
}

impl_from_tree!(
Expand Down Expand Up @@ -362,9 +362,7 @@ impl<Pk: MiniscriptKey> fmt::Display for Pkh<Pk> {
}

impl<Pk: MiniscriptKey> Liftable<Pk> for Pkh<Pk> {
fn lift(&self) -> Result<semantic::Policy<Pk>, Error> {
Ok(semantic::Policy::Key(self.pk.clone()))
}
fn lift(&self) -> Result<Abstract<Pk>, Error> { Ok(Abstract::Key(self.pk.clone())) }
}

impl_from_tree!(
Expand Down
6 changes: 1 addition & 5 deletions src/descriptor/key.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1153,11 +1153,7 @@ mod test {
#[cfg(feature = "serde")]
use serde_test::{assert_tokens, Token};

use super::{
DescriptorKeyParseError, DescriptorMultiXKey, DescriptorPublicKey, DescriptorSecretKey,
MiniscriptKey, Wildcard,
};
use crate::prelude::*;
use super::*;

#[test]
fn parse_descriptor_key_errors() {
Expand Down
8 changes: 3 additions & 5 deletions src/descriptor/segwitv0.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ use crate::expression::{self, FromTree};
use crate::miniscript::context::{ScriptContext, ScriptContextError};
use crate::miniscript::satisfy::{Placeholder, Satisfaction, Witness};
use crate::plan::AssetProvider;
use crate::policy::{semantic, Liftable};
use crate::prelude::*;
use crate::r#abstract::{Abstract, Liftable};
use crate::util::varint_len;
use crate::{
Error, ForEachKey, Miniscript, MiniscriptKey, Satisfier, Segwitv0, ToPublicKey, TranslateErr,
Expand Down Expand Up @@ -220,7 +220,7 @@ pub enum WshInner<Pk: MiniscriptKey> {
}

impl<Pk: MiniscriptKey> Liftable<Pk> for Wsh<Pk> {
fn lift(&self) -> Result<semantic::Policy<Pk>, Error> {
fn lift(&self) -> Result<Abstract<Pk>, Error> {
match self.inner {
WshInner::SortedMulti(ref smv) => smv.lift(),
WshInner::Ms(ref ms) => ms.lift(),
Expand Down Expand Up @@ -469,9 +469,7 @@ impl<Pk: MiniscriptKey> fmt::Display for Wpkh<Pk> {
}

impl<Pk: MiniscriptKey> Liftable<Pk> for Wpkh<Pk> {
fn lift(&self) -> Result<semantic::Policy<Pk>, Error> {
Ok(semantic::Policy::Key(self.pk.clone()))
}
fn lift(&self) -> Result<Abstract<Pk>, Error> { Ok(Abstract::Key(self.pk.clone())) }
}

impl_from_tree!(
Expand Down
6 changes: 3 additions & 3 deletions src/descriptor/sh.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ use crate::expression::{self, FromTree};
use crate::miniscript::context::ScriptContext;
use crate::miniscript::satisfy::{Placeholder, Satisfaction};
use crate::plan::AssetProvider;
use crate::policy::{semantic, Liftable};
use crate::prelude::*;
use crate::r#abstract::{Abstract, Liftable};
use crate::util::{varint_len, witness_to_scriptsig};
use crate::{
push_opcode_size, Error, ForEachKey, Legacy, Miniscript, MiniscriptKey, Satisfier, Segwitv0,
Expand Down Expand Up @@ -49,10 +49,10 @@ pub enum ShInner<Pk: MiniscriptKey> {
}

impl<Pk: MiniscriptKey> Liftable<Pk> for Sh<Pk> {
fn lift(&self) -> Result<semantic::Policy<Pk>, Error> {
fn lift(&self) -> Result<Abstract<Pk>, Error> {
match self.inner {
ShInner::Wsh(ref wsh) => wsh.lift(),
ShInner::Wpkh(ref pk) => Ok(semantic::Policy::Key(pk.as_inner().clone())),
ShInner::Wpkh(ref pk) => Ok(Abstract::Key(pk.as_inner().clone())),
ShInner::SortedMulti(ref smv) => smv.lift(),
ShInner::Ms(ref ms) => ms.lift(),
}
Expand Down
16 changes: 7 additions & 9 deletions src/descriptor/sortedmulti.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,10 @@ use crate::miniscript::limits::MAX_PUBKEYS_PER_MULTISIG;
use crate::miniscript::satisfy::{Placeholder, Satisfaction};
use crate::plan::AssetProvider;
use crate::prelude::*;
use crate::r#abstract::{Abstract, Liftable};
use crate::{
errstr, expression, policy, script_num_size, Error, ForEachKey, Miniscript, MiniscriptKey,
Satisfier, ToPublicKey, TranslateErr, Translator,
errstr, expression, script_num_size, Error, ForEachKey, Miniscript, MiniscriptKey, Satisfier,
ToPublicKey, TranslateErr, Translator,
};

/// Contents of a "sortedmulti" descriptor
Expand Down Expand Up @@ -195,14 +196,11 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> SortedMultiVec<Pk, Ctx> {
pub fn max_satisfaction_size(&self) -> usize { 1 + 73 * self.k }
}

impl<Pk: MiniscriptKey, Ctx: ScriptContext> policy::Liftable<Pk> for SortedMultiVec<Pk, Ctx> {
fn lift(&self) -> Result<policy::semantic::Policy<Pk>, Error> {
let ret = policy::semantic::Policy::Threshold(
impl<Pk: MiniscriptKey, Ctx: ScriptContext> Liftable<Pk> for SortedMultiVec<Pk, Ctx> {
fn lift(&self) -> Result<Abstract<Pk>, Error> {
let ret = Abstract::Threshold(
self.k,
self.pks
.iter()
.map(|k| policy::semantic::Policy::Key(k.clone()))
.collect(),
self.pks.iter().map(|k| Abstract::Key(k.clone())).collect(),
);
Ok(ret)
}
Expand Down
20 changes: 10 additions & 10 deletions src/descriptor/tr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,8 @@ use crate::expression::{self, FromTree};
use crate::miniscript::satisfy::{Placeholder, Satisfaction, SchnorrSigType, Witness};
use crate::miniscript::Miniscript;
use crate::plan::AssetProvider;
use crate::policy::semantic::Policy;
use crate::policy::Liftable;
use crate::prelude::*;
use crate::r#abstract::{Abstract, Liftable};
use crate::util::{varint_len, witness_size};
use crate::{
errstr, Error, ForEachKey, MiniscriptKey, Satisfier, ScriptContext, Tap, ToPublicKey,
Expand Down Expand Up @@ -617,11 +616,11 @@ fn split_once(inp: &str, delim: char) -> Option<(&str, &str)> {
}

impl<Pk: MiniscriptKey> Liftable<Pk> for TapTree<Pk> {
fn lift(&self) -> Result<Policy<Pk>, Error> {
fn lift_helper<Pk: MiniscriptKey>(s: &TapTree<Pk>) -> Result<Policy<Pk>, Error> {
fn lift(&self) -> Result<Abstract<Pk>, Error> {
fn lift_helper<Pk: MiniscriptKey>(s: &TapTree<Pk>) -> Result<Abstract<Pk>, Error> {
match *s {
TapTree::Tree { ref left, ref right, height: _ } => {
Ok(Policy::Threshold(1, vec![lift_helper(left)?, lift_helper(right)?]))
Ok(Abstract::Threshold(1, vec![lift_helper(left)?, lift_helper(right)?]))
}
TapTree::Leaf(ref leaf) => leaf.lift(),
}
Expand All @@ -633,12 +632,13 @@ impl<Pk: MiniscriptKey> Liftable<Pk> for TapTree<Pk> {
}

impl<Pk: MiniscriptKey> Liftable<Pk> for Tr<Pk> {
fn lift(&self) -> Result<Policy<Pk>, Error> {
fn lift(&self) -> Result<Abstract<Pk>, Error> {
match &self.tree {
Some(root) => {
Ok(Policy::Threshold(1, vec![Policy::Key(self.internal_key.clone()), root.lift()?]))
}
None => Ok(Policy::Key(self.internal_key.clone())),
Some(root) => Ok(Abstract::Threshold(
1,
vec![Abstract::Key(self.internal_key.clone()), root.lift()?],
)),
None => Ok(Abstract::Key(self.internal_key.clone())),
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/expression.rs
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ where
#[cfg(test)]
mod tests {

use super::parse_num;
use super::*;

#[test]
fn test_parse_num() {
Expand Down
8 changes: 4 additions & 4 deletions src/iter/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,9 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> TreeLike for Arc<Miniscript<Pk, Ctx>
}
}

impl<'a, Pk: MiniscriptKey> TreeLike for &'a policy::Concrete<Pk> {
impl<'a, Pk: MiniscriptKey> TreeLike for &'a policy::concrete::Policy<Pk> {
fn as_node(&self) -> Tree<Self> {
use policy::Concrete::*;
use policy::concrete::Policy::*;
match *self {
Unsatisfiable | Trivial | Key(_) | After(_) | Older(_) | Sha256(_) | Hash256(_)
| Ripemd160(_) | Hash160(_) => Tree::Nullary,
Expand All @@ -82,9 +82,9 @@ impl<'a, Pk: MiniscriptKey> TreeLike for &'a policy::Concrete<Pk> {
}
}

impl<'a, Pk: MiniscriptKey> TreeLike for Arc<policy::Concrete<Pk>> {
impl<'a, Pk: MiniscriptKey> TreeLike for Arc<policy::concrete::Policy<Pk>> {
fn as_node(&self) -> Tree<Self> {
use policy::Concrete::*;
use policy::concrete::Policy::*;
match self.as_ref() {
Unsatisfiable | Trivial | Key(_) | After(_) | Older(_) | Sha256(_) | Hash256(_)
| Ripemd160(_) | Hash160(_) => Tree::Nullary,
Expand Down
7 changes: 4 additions & 3 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ mod pub_macros;
use internals::hex::exts::DisplayHex;
pub use pub_macros::*;

pub mod r#abstract;
pub mod descriptor;
pub mod expression;
pub mod interpreter;
Expand Down Expand Up @@ -474,7 +475,7 @@ pub enum Error {
/// Errors related to policy
PolicyError(policy::concrete::PolicyError),
/// Errors related to lifting
LiftError(policy::LiftError),
LiftError(crate::r#abstract::LiftError),
/// Forward script context related errors
ContextError(miniscript::context::ScriptContextError),
/// Recursion depth exceeded when parsing policy/miniscript from string
Expand Down Expand Up @@ -644,8 +645,8 @@ where
}

#[doc(hidden)]
impl From<policy::LiftError> for Error {
fn from(e: policy::LiftError) -> Error { Error::LiftError(e) }
impl From<crate::r#abstract::LiftError> for Error {
fn from(e: crate::r#abstract::LiftError) -> Error { Error::LiftError(e) }
}

#[doc(hidden)]
Expand Down
2 changes: 1 addition & 1 deletion src/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ macro_rules! ms_str {
/// `policy_str!("wsh(c:or_i(pk({}),pk({})))", pk1, pk2)`
#[cfg(all(feature = "compiler", test))]
macro_rules! policy_str {
($($arg:tt)*) => ($crate::policy::Concrete::from_str(&format!($($arg)*)).unwrap())
($($arg:tt)*) => ($crate::policy::concrete::Policy::from_str(&format!($($arg)*)).unwrap())
}

/// Macro for implementing FromTree trait. This avoids copying all the Pk::Associated type bounds
Expand Down
5 changes: 2 additions & 3 deletions src/miniscript/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -606,11 +606,10 @@ mod tests {
use bitcoin::{self, secp256k1, Sequence};
use sync::Arc;

use super::{Miniscript, ScriptContext, Segwitv0, Tap};
use super::*;
use crate::miniscript::types::{self, ExtData, Property, Type};
use crate::miniscript::Terminal;
use crate::policy::Liftable;
use crate::prelude::*;
use crate::r#abstract::Liftable;
use crate::test_utils::{StrKeyTranslator, StrXOnlyKeyTranslator};
use crate::{hex_script, ExtParams, Satisfier, ToPublicKey, TranslatePk};

Expand Down
4 changes: 2 additions & 2 deletions src/policy/compiler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ use crate::miniscript::context::SigType;
use crate::miniscript::limits::MAX_PUBKEYS_PER_MULTISIG;
use crate::miniscript::types::{self, ErrorKind, ExtData, Property, Type};
use crate::miniscript::ScriptContext;
use crate::policy::Concrete;
use crate::policy::concrete::Policy as Concrete;
use crate::prelude::*;
use crate::{policy, Miniscript, MiniscriptKey, Terminal};

Expand Down Expand Up @@ -1156,7 +1156,7 @@ mod tests {

use super::*;
use crate::miniscript::{Legacy, Segwitv0, Tap};
use crate::policy::Liftable;
use crate::r#abstract::Liftable;
use crate::{script_num_size, ToPublicKey};

type SPolicy = Concrete<String>;
Expand Down
26 changes: 11 additions & 15 deletions src/policy/concrete.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,10 @@ use std::error;
use bitcoin::{absolute, Sequence};
#[cfg(feature = "compiler")]
use {
crate::descriptor::TapTree,
crate::miniscript::ScriptContext,
crate::policy::compiler::CompilerError,
crate::policy::compiler::OrdF64,
crate::policy::{compiler, Concrete, Liftable, Semantic},
crate::Descriptor,
crate::Miniscript,
crate::Tap,
crate::descriptor::TapTree, crate::miniscript::ScriptContext, crate::policy::compiler,
crate::policy::compiler::CompilerError, crate::policy::compiler::OrdF64,
crate::policy::concrete::Policy as Concrete, crate::r#abstract::Abstract,
crate::r#abstract::Liftable, crate::Descriptor, crate::Miniscript, crate::Tap,
core::cmp::Reverse,
};

Expand Down Expand Up @@ -98,9 +94,9 @@ pub enum PolicyError {
ZeroTime,
/// `after` fragment can only have `n < 2^31`.
TimeTooFar,
/// Semantic Policy Error: `And` `Or` fragments must take args: `k > 1`.
/// Abstract Policy Error: `And` `Or` fragments must take args: `k > 1`.
InsufficientArgsforAnd,
/// Semantic policy error: `And` `Or` fragments must take args: `k > 1`.
/// Abstract policy error: `And` `Or` fragments must take args: `k > 1`.
InsufficientArgsforOr,
/// Entailment max terminals exceeded.
EntailmentMaxTerminals,
Expand Down Expand Up @@ -140,10 +136,10 @@ impl fmt::Display for PolicyError {
}
PolicyError::ZeroTime => f.write_str("Time must be greater than 0; n > 0"),
PolicyError::InsufficientArgsforAnd => {
f.write_str("Semantic Policy 'And' fragment must have at least 2 args ")
f.write_str("Abstract Policy 'And' fragment must have at least 2 args ")
}
PolicyError::InsufficientArgsforOr => {
f.write_str("Semantic Policy 'Or' fragment must have at least 2 args ")
f.write_str("Abstract Policy 'Or' fragment must have at least 2 args ")
}
PolicyError::EntailmentMaxTerminals => {
write!(f, "Policy entailment only supports {} terminals", ENTAILMENT_MAX_TERMINALS)
Expand Down Expand Up @@ -238,8 +234,8 @@ impl<Pk: MiniscriptKey> Policy<Pk> {
for key in concrete_keys.into_iter() {
if semantic_policy
.clone()
.satisfy_constraint(&Semantic::Key(key.clone()), true)
== Semantic::Trivial
.satisfy_constraint(&Abstract::Key(key.clone()), true)
== Abstract::Trivial
{
match key_prob_map.get(&Concrete::Key(key.clone())) {
Some(val) => {
Expand Down Expand Up @@ -557,7 +553,7 @@ impl<Pk: MiniscriptKey> ForEachKey<Pk> for Policy<Pk> {
impl<Pk: MiniscriptKey> Policy<Pk> {
/// Converts a policy using one kind of public key to another type of public key.
///
/// For example usage please see [`crate::policy::semantic::Policy::translate_pk`].
/// For example usage please see [`crate::abstract::Abstract::translate_pk`].
pub fn translate_pk<Q, E, T>(&self, t: &mut T) -> Result<Policy<Q>, E>
where
T: Translator<Pk, Q, E>,
Expand Down
Loading