Skip to main content

Proposal

Struct Proposal 

Source
pub struct Proposal<FeeRuleT, NoteRef> { /* private fields */ }
Expand description

A proposal for a series of transactions to be created.

Each step of the proposal represents a separate transaction to be created. At present, only transparent outputs of earlier steps may be spent in later steps; the ability to chain shielded transaction steps may be added in a future update.

Implementations§

Source§

impl<FeeRuleT, NoteRef> Proposal<FeeRuleT, NoteRef>

Source

pub fn multi_step( fee_rule: FeeRuleT, min_target_height: TargetHeight, confirmations_policy: ConfirmationsPolicy, steps: NonEmpty<Step<NoteRef>>, ) -> Result<Self, ProposalError>

Constructs a validated multi-step Proposal.

This operation validates the proposal for agreement between outputs and inputs in the case of multi-step proposals, and ensures that no double-spends are being proposed.

Parameters:

  • fee_rule: The fee rule observed by the proposed transaction.
  • min_target_height: The minimum block height at which the transaction may be created.
  • steps: A vector of steps that make up the proposal.
Source

pub fn single_step( transaction_request: TransactionRequest, payment_pools: BTreeMap<usize, PoolType>, transparent_inputs: Vec<WalletTransparentOutput<()>>, shielded_inputs: Option<ShieldedInputs<NoteRef>>, anchor_height: BlockHeight, balance: TransactionBalance, fee_rule: FeeRuleT, min_target_height: TargetHeight, confirmations_policy: ConfirmationsPolicy, is_shielding: bool, ironwood_active: bool, ) -> Result<Self, ProposalError>

Constructs a validated Proposal having only a single 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.
  • transparent_inputs: The set of previous transparent outputs to be spent.
  • shielded_inputs: The sets of previous shielded outputs to be spent.
  • anchor_height: See Step::from_parts.
  • balance: The change outputs to be added the transaction and the fee to be paid.
  • fee_rule: The fee rule observed by the proposed transaction.
  • min_target_height: The minimum block height at which the transaction may be created.
  • is_shielding: A flag that identifies whether this is a wallet-internal shielding transaction.
  • ironwood_active: See Step::from_parts.
Source

pub fn fee_rule(&self) -> &FeeRuleT

Returns the fee rule to be used by the transaction builder.

Source

pub fn min_target_height(&self) -> TargetHeight

Returns the target height for which the proposal was prepared.

The chain must contain at least this many blocks in order for the proposal to be executed.

Source

pub fn confirmations_policy(&self) -> ConfirmationsPolicy

Returns the confirmations policy under which the proposal was constructed. It is used to resolve the anchor for a step that carries no explicit anchor height (a purely transparent step; see Step::anchor_height).

Source

pub fn proposed_version(&self) -> Option<TxVersion>

Returns the transaction version explicitly requested when the proposal was constructed, if any. When None, the transaction is built at the version implied by the target height (version 6 from NU6.3 onward).

Source

pub fn with_proposed_version(self, proposed_version: Option<TxVersion>) -> Self

Returns this proposal with its requested transaction version set to the given value.

This records the version passed to proposal construction so that it is carried through to transaction building; it does not re-validate the proposal against the version.

Source

pub fn steps(&self) -> &NonEmpty<Step<NoteRef>>

Returns the steps of the proposal. Each step corresponds to an independent transaction to be generated as a result of this proposal.

Source

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

Returns the total number of inputs across all steps of this proposal that belong to the given pool.

For a shielded pool this is the number of spent notes of that pool (Ironwood notes are counted for [PoolType::IRONWOOD], not [PoolType::ORCHARD]); for [PoolType::Transparent] it is the number of transparent inputs. See Step::input_count_in_pool.

Source

pub fn estimated_serialized_size(&self) -> usize

Returns a conservative upper-bound estimate of the total serialized byte size of all transactions this proposal describes, by summing the per-step estimates (see Step::estimated_serialized_size). Each step is estimated independently, so the total is the sum of the per-step serialized sizes, not the size of a single transaction.

The estimate is conservative (it never under-counts). See Step::estimated_serialized_size for the per-element costs and the mineability caveat.

Source

pub fn check_transaction_size(&self) -> Result<(), ProposalError>

Checks whether every step’s estimated serialized size fits within the maximum a Zcash block may carry, returning ProposalError::TransactionTooLarge for the first step that does not.

This is called by the public propose_transfer / propose_shielding wrappers and the create_proposed_transactions / create_pczt_from_proposal build entry points, so it protects all input selectors (including third-party ones) and all build paths. It is not called during proposal deserialization, so previously-persisted proposals remain recoverable.

Trait Implementations§

Source§

impl<FeeRuleT: Clone, NoteRef: Clone> Clone for Proposal<FeeRuleT, 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<FeeRuleT: Debug, NoteRef> Debug for Proposal<FeeRuleT, NoteRef>

Source§

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

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

impl<FeeRuleT: Eq, NoteRef: Eq> Eq for Proposal<FeeRuleT, NoteRef>

Source§

impl<FeeRuleT: PartialEq, NoteRef: PartialEq> PartialEq for Proposal<FeeRuleT, 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<FeeRuleT: PartialEq, NoteRef: PartialEq> StructuralPartialEq for Proposal<FeeRuleT, NoteRef>

Auto Trait Implementations§

§

impl<FeeRuleT, NoteRef> Freeze for Proposal<FeeRuleT, NoteRef>
where FeeRuleT: Freeze, NonEmpty<Step<NoteRef>>: Freeze,

§

impl<FeeRuleT, NoteRef> RefUnwindSafe for Proposal<FeeRuleT, NoteRef>
where FeeRuleT: RefUnwindSafe, NonEmpty<Step<NoteRef>>: RefUnwindSafe,

§

impl<FeeRuleT, NoteRef> Send for Proposal<FeeRuleT, NoteRef>
where FeeRuleT: Send, NonEmpty<Step<NoteRef>>: Send,

§

impl<FeeRuleT, NoteRef> Sync for Proposal<FeeRuleT, NoteRef>
where FeeRuleT: Sync, NonEmpty<Step<NoteRef>>: Sync,

§

impl<FeeRuleT, NoteRef> Unpin for Proposal<FeeRuleT, NoteRef>
where FeeRuleT: Unpin, NonEmpty<Step<NoteRef>>: Unpin,

§

impl<FeeRuleT, NoteRef> UnsafeUnpin for Proposal<FeeRuleT, NoteRef>
where FeeRuleT: UnsafeUnpin, NonEmpty<Step<NoteRef>>: UnsafeUnpin,

§

impl<FeeRuleT, NoteRef> UnwindSafe for Proposal<FeeRuleT, NoteRef>
where FeeRuleT: UnwindSafe, NonEmpty<Step<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