pub struct WithComputedOrigin<InnerBarrier, LocalUniversal, MaxPrefixes>(/* private fields */);
Expand description

A derivative barrier, which scans the first MaxPrefixes instructions for origin-alterers and then evaluates should_execute of the InnerBarrier based on the remaining instructions and the newly computed origin.

This effectively allows for the possibility of distinguishing an origin which is acting as a router for its derivative locations (or as a bridge for a remote location) and an origin which is actually trying to send a message for itself. In the former case, the message will be prefixed with origin-mutating instructions.

Any barriers which should be interpreted based on the computed origin rather than the original message origin should be subject to this. This is the case for most barriers since the effective origin is generally more important than the routing origin. Any other barriers, and especially those which should be interpreted only the routing origin should not be subject to this.

E.g.

type MyBarrier = (
	TakeWeightCredit,
	AllowTopLevelPaidExecutionFrom<DirectCustomerLocations>,
	WithComputedOrigin<(
		AllowTopLevelPaidExecutionFrom<DerivativeCustomerLocations>,
		AllowUnpaidExecutionFrom<ParentLocation>,
		AllowSubscriptionsFrom<AllowedSubscribers>,
		AllowKnownQueryResponses<TheResponseHandler>,
	)>,
);

In the above example, AllowUnpaidExecutionFrom appears once underneath WithComputedOrigin. This is in order to distinguish between messages which are notionally from a derivative location of ParentLocation but that just happened to be sent via ParentLocaction rather than messages that were sent by the parent.

Similarly AllowTopLevelPaidExecutionFrom appears twice: once inside of WithComputedOrigin where we provide the list of origins which are derivative origins, and then secondly outside of WithComputedOrigin where we provide the list of locations which are direct origins. It’s reasonable for these lists to be merged into one and that used both inside and out.

Finally, we see AllowSubscriptionsFrom and AllowKnownQueryResponses are both inside of WithComputedOrigin. This means that if a message begins with origin-mutating instructions, then it must be the finally computed origin which we accept subscriptions or expect a query response from. For example, even if an origin appeared in the AllowedSubscribers list, we would ignore this rule if it began with origin mutators and they changed the origin to something which was not on the list.

Trait Implementations§

source§

impl<InnerBarrier: ShouldExecute, LocalUniversal: Get<InteriorLocation>, MaxPrefixes: Get<u32>> ShouldExecute for WithComputedOrigin<InnerBarrier, LocalUniversal, MaxPrefixes>

source§

fn should_execute<Call>( origin: &Location, instructions: &mut [Instruction<Call>], max_weight: Weight, properties: &mut Properties ) -> Result<(), ProcessMessageError>

Returns true if the given message may be executed. Read more

Auto Trait Implementations§

§

impl<InnerBarrier, LocalUniversal, MaxPrefixes> Freeze for WithComputedOrigin<InnerBarrier, LocalUniversal, MaxPrefixes>

§

impl<InnerBarrier, LocalUniversal, MaxPrefixes> RefUnwindSafe for WithComputedOrigin<InnerBarrier, LocalUniversal, MaxPrefixes>
where InnerBarrier: RefUnwindSafe, LocalUniversal: RefUnwindSafe, MaxPrefixes: RefUnwindSafe,

§

impl<InnerBarrier, LocalUniversal, MaxPrefixes> Send for WithComputedOrigin<InnerBarrier, LocalUniversal, MaxPrefixes>
where InnerBarrier: Send, LocalUniversal: Send, MaxPrefixes: Send,

§

impl<InnerBarrier, LocalUniversal, MaxPrefixes> Sync for WithComputedOrigin<InnerBarrier, LocalUniversal, MaxPrefixes>
where InnerBarrier: Sync, LocalUniversal: Sync, MaxPrefixes: Sync,

§

impl<InnerBarrier, LocalUniversal, MaxPrefixes> Unpin for WithComputedOrigin<InnerBarrier, LocalUniversal, MaxPrefixes>
where InnerBarrier: Unpin, LocalUniversal: Unpin, MaxPrefixes: Unpin,

§

impl<InnerBarrier, LocalUniversal, MaxPrefixes> UnwindSafe for WithComputedOrigin<InnerBarrier, LocalUniversal, MaxPrefixes>
where InnerBarrier: UnwindSafe, LocalUniversal: UnwindSafe, MaxPrefixes: 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> CheckedConversion for T

source§

fn checked_from<T>(t: T) -> Option<Self>
where Self: TryFrom<T>,

Convert from a value of T into an equivalent instance of Option<Self>. Read more
source§

fn checked_into<T>(self) -> Option<T>
where Self: TryInto<T>,

Consume self to return Some equivalent value of Option<T>. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

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

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

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, U> IntoKey<U> for T
where U: FromKey<T>,

source§

fn into_key(self) -> U

source§

impl<T> IsType<T> for T

source§

fn from_ref(t: &T) -> &T

Cast reference.
source§

fn into_ref(&self) -> &T

Cast reference.
source§

fn from_mut(t: &mut T) -> &mut T

Cast mutable reference.
source§

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

Cast mutable reference.
source§

impl<T, Outer> IsWrappedBy<Outer> for T
where Outer: AsRef<T> + AsMut<T> + From<T>, T: From<Outer>,

source§

fn from_ref(outer: &Outer) -> &T

Get a reference to the inner from the outer.

source§

fn from_mut(outer: &mut Outer) -> &mut T

Get a mutable reference to the inner from the outer.

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> SaturatedConversion for T

source§

fn saturated_from<T>(t: T) -> Self
where Self: UniqueSaturatedFrom<T>,

Convert from a value of T into an equivalent instance of Self. Read more
source§

fn saturated_into<T>(self) -> T
where Self: UniqueSaturatedInto<T>,

Consume self to return an equivalent value of T. Read more
source§

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

§

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>,

§

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<T, U> TryIntoKey<U> for T
where U: TryFromKey<T>,

§

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

source§

fn try_into_key(self) -> Result<U, <U as TryFromKey<T>>::Error>

source§

impl<S, T> UncheckedInto<T> for S
where T: UncheckedFrom<S>,

source§

fn unchecked_into(self) -> T

The counterpart to unchecked_from.
source§

impl<T, S> UniqueSaturatedInto<T> for S
where T: Bounded, S: TryInto<T>,

source§

fn unique_saturated_into(self) -> T

Consume self to return an equivalent value of T.
source§

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

source§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

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

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<T> JsonSchemaMaybe for T

source§

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