#[non_exhaustive]pub struct UpstreamVoucherRejected {
pub reason: VoucherRejectReason,
pub bundle: Option<WatermarkBundle>,
pub proof_generation: Option<u64>,
}Expand description
Typed sentinel for the upstream rejecting a voucher we presented mid-stream
(#857) — e.g. a stale nonce (#852), deposit exhaustion, or a wrong-channel
mismatch. This is OUR payment-side fault, not the provider’s, so the pull
orchestrator downcast_refs it to skip the candidate WITHOUT recording a
reputation observation (mirroring the buyer channel-open-failure arm). Named
with the Upstream prefix to disambiguate from the protocol-level
StreamError::VoucherRejected reason enum, whose reason it carries verbatim
(the Copy VoucherRejectReason, not a lossy stringification) so a future
caller can branch on retry-vs-top-up-vs-abandon without re-parsing a message.
Display keeps the stable voucher rejected text for logs.
bundle mirrors the wire WatermarkBundle verbatim (issue #1481): Some
only for a watermark-gated reason (VoucherRejectReason::is_watermark_gated),
and only when the node verified the rejected voucher recovered to the pool
capability’s pinned signer before attaching it. A caller that sees Some
can self-heal when the bundle advances its ledger — reseed to the bundle’s
watermark (crate::ledger::Cumulative::from) and resume from
bytes_delivered — or, on Underpaid, rebase down to it, rather than
treating the rejection as terminal. SpendingCapExhausted
with bundle: None means there is no signer-verified watermark to resume
from (or, more commonly, that a wallet-less delegate simply has no local
means to add deposit) — the caller must surface that to the app rather
than loop. CapabilityExpired and PoolExhausted are never
watermark-gated (no bundle is ever attached) and are always terminal —
the fix is a fresh capability or an owner top-up, not a resync.
Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.reason: VoucherRejectReasonWhy the seller refused the voucher.
bundle: Option<WatermarkBundle>The seller’s signer-verified watermark, when it sent one, so the buyer
can resync its cumulative state and retry. None means there is
nothing to resync from and the caller must surface the failure.
proof_generation: Option<u64>The ledger generation the rejected voucher was signed under
(StreamProof::Voucher), when the stream knows it. None for a
rejected reveal, or a rejection read before this stream claimed
anything; PoolLedger::rebase treats it as current.
Trait Implementations§
Source§impl Debug for UpstreamVoucherRejected
impl Debug for UpstreamVoucherRejected
Source§impl Display for UpstreamVoucherRejected
impl Display for UpstreamVoucherRejected
Source§impl Error for UpstreamVoucherRejected
impl Error for UpstreamVoucherRejected
1.30.0 · Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
use the Display impl or to_string()
Auto Trait Implementations§
impl Freeze for UpstreamVoucherRejected
impl RefUnwindSafe for UpstreamVoucherRejected
impl Send for UpstreamVoucherRejected
impl Sync for UpstreamVoucherRejected
impl Unpin for UpstreamVoucherRejected
impl UnsafeUnpin for UpstreamVoucherRejected
impl UnwindSafe for UpstreamVoucherRejected
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
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 moreimpl<T> MaybeSend for Twhere
T: Send,
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> ToStringFallible for Twhere
T: Display,
impl<T> ToStringFallible for Twhere
T: Display,
Source§fn try_to_string(&self) -> Result<String, TryReserveError>
fn try_to_string(&self) -> Result<String, TryReserveError>
ToString::to_string, but without panic on OOM.