Skip to main content

Step

Struct Step 

Source
pub struct Step<NoteRef> { /* private fields */ }
Expand description

The inputs to be consumed and outputs to be produced in a proposed transaction.

Implementations§

Source§

impl<NoteRef> Step<NoteRef>

Source

pub fn from_parts( prior_steps: &[Step<NoteRef>], transaction_request: TransactionRequest, payment_pools: BTreeMap<usize, PoolType>, transparent_inputs: Vec<WalletTransparentOutput<()>>, shielded_inputs: Option<ShieldedInputs<NoteRef>>, anchor_height: Option<BlockHeight>, prior_step_inputs: Vec<StepOutput>, balance: TransactionBalance, is_shielding: bool, ironwood_active: bool, ) -> Result<Self, ProposalError>

Constructs a validated Step from its constituent parts.

This operation validates the proposal for balance consistency and agreement between the is_shielding flag and the structure of the proposal.

Parameters:

  • transaction_request: The ZIP 321 transaction request describing the payments to be made.
  • payment_pools: A map from payment index to pool type. The set of payment indices provided here must exactly match the set of payment indices in the TransactionRequest, and the selected pool for an index must correspond to a valid receiver of the address at that index (or the address itself in the case of bare transparent or Sapling addresses).
  • transparent_inputs: The set of previous transparent outputs to be spent.
  • shielded_inputs: The sets of previous shielded outputs to be spent.
  • anchor_height: The anchor height that binds every shielded-tree lookup performed while building this step’s transaction — both shielded-input witnesses and shielded-output anchors. A step that produces a shielded bundle (spends shielded notes, pays to a shielded pool, or returns shielded change) must provide Some; only a purely transparent step may pass None.
  • balance: The change outputs to be added the transaction and the fee to be paid.
  • is_shielding: A flag that identifies whether this is a wallet-internal shielding transaction.
  • ironwood_active: Whether the Ironwood pool is active at the target height for which this step is proposed. When active, the step is checked against the Orchard turnstile: no payment may be directed to the Orchard pool, and change may be returned to it only when strictly less value returns than the step’s Orchard inputs remove.
Source

pub fn transaction_request(&self) -> &TransactionRequest

Returns the transaction request that describes the payments to be made.

Source

pub fn payment_pools(&self) -> &BTreeMap<usize, PoolType>

Returns the map from payment index to the pool that has been selected for the output that will fulfill that payment.

Source

pub fn transparent_inputs(&self) -> &[WalletTransparentOutput<()>]

Returns the transparent inputs that have been selected to fund the transaction.

Source

pub fn shielded_inputs(&self) -> Option<&ShieldedInputs<NoteRef>>

Returns the shielded inputs that have been selected to fund the transaction.

Source

pub fn anchor_height(&self) -> Option<BlockHeight>

Returns the anchor height that binds every shielded-tree lookup performed while building this step’s transaction, or None for a purely transparent step that performs no such lookup.

Source

pub fn prior_step_inputs(&self) -> &[StepOutput]

Returns the inputs that should be obtained from the outputs of the transaction created to satisfy a previous step of the proposal.

Source

pub fn balance(&self) -> &TransactionBalance

Returns the change outputs to be added to the transaction and the fee to be paid.

Source

pub fn is_shielding(&self) -> bool

Returns a flag indicating whether or not the proposed transaction is exclusively wallet-internal (if it does not involve any external recipients).

Source

pub fn involves(&self, pool_type: PoolType) -> bool

Returns whether or not this proposal requires interaction with the specified pool.

Source

pub fn input_in_pool(&self, pool_type: PoolType) -> bool

Returns whether or not this step spends any inputs from the given pool.

For a shielded pool this is true when a note of that protocol is spent; for [PoolType::Transparent] it is true when the step is a shielding step or has any transparent inputs.

Source

pub fn output_in_pool(&self, pool_type: PoolType) -> bool

Returns whether or not this step directs any payment output to the given pool.

This does not consider change outputs; use Step::change_in_pool for those.

Source

pub fn change_in_pool(&self, pool_type: PoolType) -> bool

Returns whether or not this step directs any change output to the given pool.

Source

pub fn input_count_in_pool(&self, pool_type: PoolType) -> usize

Returns the number of inputs to this step that belong to the given pool.

For a shielded pool this is the number of spent notes of that protocol; for [PoolType::Transparent] it is the number of transparent inputs.

Source

pub fn output_count_in_pool(&self, pool_type: PoolType) -> usize

Returns the number of payment outputs of this step that are directed to the given pool.

This does not include change outputs; use Step::change_count_in_pool for those.

Source

pub fn change_count_in_pool(&self, pool_type: PoolType) -> usize

Returns the number of change outputs of this step that are directed to the given pool.

Source

pub fn is_canonical_crossing<P: PoolMigrationConstants>( &self, params: &P, canonical_fee: Zatoshis, ) -> bool

Available on crate feature orchard only.

Returns whether this step is a canonical crossing: a step whose whole shape is indistinguishable from a ZIP 318 migration transfer, and which is therefore built with a single unpadded Ironwood action so that it joins that anonymity set. See Step::ironwood_bundle_padding.

A migration transfer spends one Orchard note, pads its Orchard bundle to the default two-action floor (the spend plus its change, or a dummy when the note’s value exactly covers the crossing and its fee), outputs one canonical denomination into the Ironwood pool, and is proved against a boundary of the anchor bucket grid. Every one of those is required here:

  • exactly one Orchard input and at most one Orchard change output, so that the Orchard bundle is exactly two actions;
  • no change in any other pool;
  • no Ironwood spends, a step funded from Ironwood crossing nothing;
  • no Ironwood change, leaving a single Ironwood output;
  • that output’s value is a canonical denomination under params;
  • the step’s anchor lies on params’ anchor bucket grid;
  • the fee equals canonical_fee, which the caller obtains from fees::canonical_crossing_fee for the consensus parameters and target height the transaction will actually be built against.

Dropping the Ironwood padding without the rest would not buy anonymity but destroy it: an unpadded Ironwood bundle beside an Orchard bundle of the wrong size, or against a chain-tip anchor, is a shape nothing else on the network emits — a fingerprint rather than a disguise.

Source

pub fn ironwood_bundle_padding(&self) -> BundlePadding

Available on crate feature orchard only.

The transactional bundle padding the transaction builder must use for this step’s Ironwood bundle: the padding the ChangeStrategy recorded when it computed the fee.

This is READ, not re-derived. The builder must produce exactly the action count the fee was charged against, and a second derivation could disagree with the first — which is precisely what happens for a condition only one of them can evaluate, such as whether the resulting fee is itself canonical.

Source

pub fn orchard_action_count( &self, padding: BundlePadding, bundle_version: BundleVersion, ) -> Result<usize, &'static str>

Available on crate feature orchard only.

Returns the number of actions the transaction builder will produce for this step’s Orchard-pool bundle, given the bundle padding and version it will be configured with.

The count depends upon the bundle version: prior to NU6.3, an action may carry both a spend and an output, so a bundle requires max(spends, outputs) actions; from NU6.3 onwards the Orchard pool disables cross-address transfers, and each requested spend and output is instead paired with a fabricated zero-valued counterpart, so a bundle requires spends + outputs actions. The padding determines the floor applied on top of that count.

The caller must pass the same padding and version the transaction builder will be configured with, otherwise the count will not match the bundle that is built. bundle_version_for_branch returns the version applicable to a given consensus branch and pool. The Orchard bundle is always padded to the default floor; only the Ironwood bundle’s padding varies, and Step::ironwood_bundle_padding derives it.

A step describes a wallet spend, which is never a coinbase transaction, so this takes a [BundlePadding] rather than a full bundle type: coinbase construction is a property of the whole transaction and is not representable here.

§Errors

Returns an error if this step’s Orchard spend and output counts are incompatible with the given padding and version.

Source

pub fn ironwood_action_count( &self, padding: BundlePadding, bundle_version: BundleVersion, ) -> Result<usize, &'static str>

Available on crate feature orchard only.

Returns the number of actions the transaction builder will produce for this step’s Ironwood-pool bundle, given the bundle padding and version it will be configured with.

See Step::orchard_action_count for how the count is determined; the Ironwood pool permits cross-address transfers, so an Ironwood bundle requires max(spends, outputs) actions before padding.

§Errors

Returns an error if this step’s Ironwood spend and output counts are incompatible with the given padding and version.

Trait Implementations§

Source§

impl<NoteRef: Clone> Clone for Step<NoteRef>

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
Source§

impl<NoteRef> Debug for Step<NoteRef>

Source§

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

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

impl<NoteRef: Eq> Eq for Step<NoteRef>

Source§

impl<NoteRef: PartialEq> PartialEq for Step<NoteRef>

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

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

Inequality operator !=. Read more
Source§

impl<NoteRef: PartialEq> StructuralPartialEq for Step<NoteRef>

Auto Trait Implementations§

§

impl<NoteRef> Freeze for Step<NoteRef>
where Option<ShieldedInputs<NoteRef>>: Freeze,

§

impl<NoteRef> RefUnwindSafe for Step<NoteRef>

§

impl<NoteRef> Send for Step<NoteRef>
where Option<ShieldedInputs<NoteRef>>: Send,

§

impl<NoteRef> Sync for Step<NoteRef>
where Option<ShieldedInputs<NoteRef>>: Sync,

§

impl<NoteRef> Unpin for Step<NoteRef>
where Option<ShieldedInputs<NoteRef>>: Unpin,

§

impl<NoteRef> UnsafeUnpin for Step<NoteRef>

§

impl<NoteRef> UnwindSafe for Step<NoteRef>
where Option<ShieldedInputs<NoteRef>>: 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
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

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
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSend for T
where T: Any + Send,

§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Sync + Send>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send> ⓘ

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

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

Source§

fn __clone_box(&self, _: Private) -> *mut ()

§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
§

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

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PossiblyOption<T> for T

§

fn to_option(self) -> Option<T>

Convert this object into an Option<T>
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
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
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

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.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more