Enum ExprInner

Source
pub enum ExprInner<T: ExtParam> {
Show 18 variants Const(i64), CurrInputIdx, Input(IdxExpr), Output(IdxExpr), InputIssue(IdxExpr), InputReIssue(IdxExpr), Add(Box<Expr<T>>, Box<Expr<T>>), Sub(Box<Expr<T>>, Box<Expr<T>>), Mul(Box<Expr<T>>, Box<Expr<T>>), Div(Box<Expr<T>>, Box<Expr<T>>), Mod(Box<Expr<T>>, Box<Expr<T>>), BitAnd(Box<Expr<T>>, Box<Expr<T>>), BitOr(Box<Expr<T>>, Box<Expr<T>>), Xor(Box<Expr<T>>, Box<Expr<T>>), Invert(Box<Expr<T>>), Negate(Box<Expr<T>>), PriceOracle1(T, u64), PriceOracle1W(T, u64),
}
Expand description

Enum representing arithmetic operations with transaction amounts. Every variant of this enum pushes a single singed 64 bit BE number on stack top. All of introspection opcodes explicitly assert the amount is explicit.

This will abort when - Any of operations are on confidential amounts. The Null case is automatically converted to explicit zero. - Supplied index is out of bounds. - Any of the operations overflow. Refer to tapscript opcodes spec for overflow specification - In extreme cases, when recursive operations exceed 400 depth

Variants§

§

Const(i64)

A constant i64 value Minimal push of this <i64>

§

CurrInputIdx

Value under the current executing input INSPECTCURRENTINPUTINDEX INPSECTINPUTVALUE <1> EQUALVERIFY

§

Input(IdxExpr)

Explicit amount at the given input index i INPSECTINPUTVALUE <1> EQUALVERIFY

§

Output(IdxExpr)

Explicit amount at the given output index i INPSECTOUTPUTVALUE <1> EQUALVERIFY

§

InputIssue(IdxExpr)

Explicit issuance amount at this input index i OP_INSPECTINPUTISSUANCE DROP DROP <1> EQUALVERIFY NIP NIP

§

InputReIssue(IdxExpr)

Explicit re-issuance amount at this input index i OP_INSPECTINPUTISSUANCE DROP DROP DROP DROP <1> EQUALVERIFY

§

Add(Box<Expr<T>>, Box<Expr<T>>)

Add two Arith expressions. [X] [Y] ADD64 <1> EQUALVERIFY

§

Sub(Box<Expr<T>>, Box<Expr<T>>)

Subtract (X-Y) [X] [Y] SUB64 <1> EQUALVERIFY

§

Mul(Box<Expr<T>>, Box<Expr<T>>)

Multiply two Expr expressions. (a*b) [X] [Y] MUL64 <1> EQUALVERIFY

§

Div(Box<Expr<T>>, Box<Expr<T>>)

Divide two Expr expressions. (a//b) The division operation pushes the quotient(a//b) such that the remainder a%b (must be non-negative and less than |b|). [X] [Y] DIV64 <1> EQUALVERIFY NIP

§

Mod(Box<Expr<T>>, Box<Expr<T>>)

Modulo operation (a % b) The division operation the remainder a%b (must be non-negative and less than |b|). [X] [Y] DIV64 <1> EQUALVERIFY DROP

§

BitAnd(Box<Expr<T>>, Box<Expr<T>>)

BitWise And (a & b) [X] [Y] AND (cannot fail)

§

BitOr(Box<Expr<T>>, Box<Expr<T>>)

BitWise or (a | b) [X] [Y] OR (cannot fail)

§

Xor(Box<Expr<T>>, Box<Expr<T>>)

BitWise or (a ^ b) [X] [Y] XOR (cannot fail)

§

Invert(Box<Expr<T>>)

BitWise invert (!a) [X] INVERT (cannot fail)

§

Negate(Box<Expr<T>>)

Negate -a [X] NEG64 <1> EQUALVERIFY

§

PriceOracle1(T, u64)

Push the price as LE64 signed from oracle. 2DUP TOALTSTACK <T> OP_GREATERTHANEQ VERIFY CAT SHA256 <K> CHECKSIGFROMSTACKVERIFY OP_FROMATLSTACK The fragment checks that the input timestamp is less than time at which the price was signed with the given oracle key. The asset of which price is being checked is implicitly decided by the public key

§

PriceOracle1W(T, u64)

Same as Self::PriceOracle1 but wrapped in an TOALTSTACK and FROMALTSTACK and SWAP TOALTSTACK 2DUP TOALTSTACK <T> OP_GREATERTHANEQ VERIFY CAT SHA256 <K> CHECKSIGFROMSTACKVERIFY OP_FROMATLSTACK FROMALTSTACK SWAP We need to swap at the end to make sure that the price pushed by this fragment is on top of the stack In regular miniscript, all operations are commutative, but here some operations like sub and div are not and hence we need to maintain the exact order of operations.

Trait Implementations§

Source§

impl<T: Clone + ExtParam> Clone for ExprInner<T>

Source§

fn clone(&self) -> ExprInner<T>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T: Debug + ExtParam> Debug for ExprInner<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T: Hash + ExtParam> Hash for ExprInner<T>

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl<T: Ord + ExtParam> Ord for ExprInner<T>

Source§

fn cmp(&self, other: &ExprInner<T>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl<T: PartialEq + ExtParam> PartialEq for ExprInner<T>

Source§

fn eq(&self, other: &ExprInner<T>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<T: PartialOrd + ExtParam> PartialOrd for ExprInner<T>

Source§

fn partial_cmp(&self, other: &ExprInner<T>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl<T: Eq + ExtParam> Eq for ExprInner<T>

Source§

impl<T: ExtParam> StructuralPartialEq for ExprInner<T>

Auto Trait Implementations§

§

impl<T> Freeze for ExprInner<T>
where T: Freeze,

§

impl<T> RefUnwindSafe for ExprInner<T>
where T: RefUnwindSafe,

§

impl<T> Send for ExprInner<T>
where T: Send,

§

impl<T> Sync for ExprInner<T>
where T: Sync,

§

impl<T> Unpin for ExprInner<T>
where T: Unpin,

§

impl<T> UnwindSafe for ExprInner<T>
where T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V