Trait ChangeStrategy

Source
pub trait ChangeStrategy {
    type FeeRule: FeeRule + Clone;
    type Error;
    type MetaSource: InputSource;
    type AccountMetaT;

    // Required methods
    fn fee_rule(&self) -> &Self::FeeRule;
    fn fetch_wallet_meta(
        &self,
        meta_source: &Self::MetaSource,
        account: <Self::MetaSource as InputSource>::AccountId,
        exclude: &[<Self::MetaSource as InputSource>::NoteRef],
    ) -> Result<Self::AccountMetaT, <Self::MetaSource as InputSource>::Error>;
    fn compute_balance<P: Parameters, NoteRefT: Clone>(
        &self,
        params: &P,
        target_height: BlockHeight,
        transparent_inputs: &[impl InputView],
        transparent_outputs: &[impl OutputView],
        sapling: &impl BundleView<NoteRefT>,
        orchard: &impl BundleView<NoteRefT>,
        ephemeral_balance: Option<&EphemeralBalance>,
        wallet_meta: &Self::AccountMetaT,
    ) -> Result<TransactionBalance, ChangeError<Self::Error, NoteRefT>>;
}
Expand description

A trait that represents the ability to compute the suggested change and fees that must be paid by a transaction having a specified set of inputs and outputs.

Required Associated Types§

Source

type FeeRule: FeeRule + Clone

Source

type Error

Source

type MetaSource: InputSource

The type of metadata source that this change strategy requires in order to be able to retrieve required wallet metadata. If more capabilities are required of the backend than are exposed in the InputSource trait, the implementer of this trait should define their own trait that descends from InputSource and adds the required capabilities there, and then implement that trait for their desired database backend.

Source

type AccountMetaT

Tye type of wallet metadata that this change strategy relies upon in order to compute change.

Required Methods§

Source

fn fee_rule(&self) -> &Self::FeeRule

Returns the fee rule that this change strategy will respect when performing balance computations.

Source

fn fetch_wallet_meta( &self, meta_source: &Self::MetaSource, account: <Self::MetaSource as InputSource>::AccountId, exclude: &[<Self::MetaSource as InputSource>::NoteRef], ) -> Result<Self::AccountMetaT, <Self::MetaSource as InputSource>::Error>

Uses the provided metadata source to obtain the wallet metadata required for change creation determinations.

Source

fn compute_balance<P: Parameters, NoteRefT: Clone>( &self, params: &P, target_height: BlockHeight, transparent_inputs: &[impl InputView], transparent_outputs: &[impl OutputView], sapling: &impl BundleView<NoteRefT>, orchard: &impl BundleView<NoteRefT>, ephemeral_balance: Option<&EphemeralBalance>, wallet_meta: &Self::AccountMetaT, ) -> Result<TransactionBalance, ChangeError<Self::Error, NoteRefT>>

Computes the totals of inputs, suggested change amounts, and fees given the provided inputs and outputs being used to construct a transaction.

The fee computed as part of this operation should take into account the prospective change outputs recommended by this operation. If insufficient funds are available to supply the requested outputs and required fees, implementations should return ChangeError::InsufficientFunds.

If the inputs include notes or UTXOs that are not economic to spend in the context of this input selection, a ChangeError::DustInputs error can be returned indicating inputs that should be removed from the selection (all of which will have value less than or equal to the marginal fee). The caller should order the inputs from most to least preferred to spend within each pool, so that the most preferred ones are less likely to be indicated to remove.

  • ephemeral_balance: if the transaction is to be constructed with either an ephemeral transparent input or an ephemeral transparent output this argument may be used to provide the value of that input or output. The value of this argument should be None in the case that there are no such items.
  • wallet_meta: Additional wallet metadata that the change strategy may use in determining how to construct change outputs. This wallet metadata value should be computed excluding the inputs provided in the transparent_inputs, sapling, and orchard arguments.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§

Source§

impl<R, I> ChangeStrategy for MultiOutputChangeStrategy<R, I>
where R: Zip317FeeRule + Clone, I: InputSource, <R as FeeRule>::Error: From<BalanceError>,

Source§

type FeeRule = R

Source§

type Error = <R as FeeRule>::Error

Source§

type MetaSource = I

Source§

type AccountMetaT = AccountMeta

Source§

impl<R, I> ChangeStrategy for SingleOutputChangeStrategy<R, I>
where R: Zip317FeeRule + Clone, I: InputSource, <R as FeeRule>::Error: From<BalanceError>,

Source§

type FeeRule = R

Source§

type Error = <R as FeeRule>::Error

Source§

type MetaSource = I

Source§

type AccountMetaT = ()