pub struct AccountKeychain {
pub keys: <Mapping<Address, Mapping<Address, AuthorizedKey>> as StorableType>::Handler,
pub spending_limits: <Mapping<B256, Mapping<Address, SpendingLimitState>> as StorableType>::Handler,
pub key_scopes: <Mapping<B256, KeyScope> as StorableType>::Handler,
pub transaction_key: <Address as StorableType>::Handler,
pub tx_origin: <Address as StorableType>::Handler,
address: Address,
storage: StorageCtx,
}Fields§
§keys: <Mapping<Address, Mapping<Address, AuthorizedKey>> as StorableType>::Handler§spending_limits: <Mapping<B256, Mapping<Address, SpendingLimitState>> as StorableType>::Handler§key_scopes: <Mapping<B256, KeyScope> as StorableType>::Handler§transaction_key: <Address as StorableType>::Handler§tx_origin: <Address as StorableType>::Handler§address: Address§storage: StorageCtxImplementations§
Source§impl AccountKeychain
impl AccountKeychain
Sourcepub fn new() -> Self
pub fn new() -> Self
Creates an instance of the precompile.
Caution: This does not initialize the account, see Self::initialize.
fn __new(address: Address) -> Self
fn __initialize(&mut self) -> Result<()>
fn emit_event(&mut self, event: impl IntoLogData) -> Result<()>
pub fn emitted_events(&self) -> &Vec<LogData>
test-utils only.pub fn clear_emitted_events(&mut self)
test-utils only.pub fn assert_emitted_events(&self, expected: Vec<impl IntoLogData>)
test-utils only.Source§impl AccountKeychain
impl AccountKeychain
Sourcepub fn spending_limit_key(account: Address, key_id: Address) -> B256
pub fn spending_limit_key(account: Address, key_id: Address) -> B256
Create a hash key for account+key scoped storage rows.
This is used to access account-key rows like spending_limits[key][token] and
key_scopes[key]. The hash combines account and key_id to avoid triple nesting.
fn t3_spending_limit_cap(limit: U256) -> Result<u128>
Sourcepub fn initialize(&mut self) -> Result<()>
pub fn initialize(&mut self) -> Result<()>
Initializes the account keychain precompile.
Registers a new access key with signature type, expiry, and optional per-token spending limits. Only callable with the account’s main key (not a session key).
§Errors
UnauthorizedCaller— only the main key can authorize/revoke and, for contract callers on T2+,msg.sendermust matchtx.originZeroPublicKey—keyIdcannot be the zero addressExpiryInPast— expiry must be in the future (enforced since T0)KeyAlreadyExists— a key with this ID is already registeredKeyAlreadyRevoked— revoked keys cannot be re-authorizedInvalidSignatureType— must be Secp256k1, P256, or WebAuthn
Sourcepub fn revoke_key(
&mut self,
msg_sender: Address,
call: revokeKeyCall,
) -> Result<()>
pub fn revoke_key( &mut self, msg_sender: Address, call: revokeKeyCall, ) -> Result<()>
Permanently revokes an access key. Once revoked, a key ID can never be re-authorized for
this account, preventing replay of old KeyAuthorization signatures.
§Errors
UnauthorizedCaller— only the main key can authorize/revoke and, for contract callers on T2+,msg.sendermust matchtx.originKeyNotFound— no key registered with this ID
Sourcepub fn update_spending_limit(
&mut self,
msg_sender: Address,
call: updateSpendingLimitCall,
) -> Result<()>
pub fn update_spending_limit( &mut self, msg_sender: Address, call: updateSpendingLimitCall, ) -> Result<()>
Updates the spending limit for a key-token pair. Can also convert an unlimited key into a
limited one. Delegates to load_active_key for existence/revocation/expiry checks.
§Errors
UnauthorizedCaller— the transaction wasn’t signed by the main key, or on T2+ contract callers wheremsg.sender != tx.originKeyAlreadyRevoked— the target key has been permanently revokedKeyNotFound— no key is registered under the givenkeyIdKeyExpired— the key’s expiry is at or before the current block timestamp
Sourcepub fn get_key(&self, call: getKeyCall) -> Result<KeyInfo>
pub fn get_key(&self, call: getKeyCall) -> Result<KeyInfo>
Returns key info for the given account-key pair, or a blank entry if inexistent or revoked.
Sourcepub fn get_remaining_limit(&self, call: getRemainingLimitCall) -> Result<U256>
pub fn get_remaining_limit(&self, call: getRemainingLimitCall) -> Result<U256>
Returns the remaining spending limit for a key-token pair.
T2+ returns zero for missing, revoked, or expired keys. Pre-T2 preserves the historical behavior of reading the raw stored remaining amount so old blocks reexecute identically.
Sourcepub fn get_remaining_limit_with_period(
&self,
call: getRemainingLimitWithPeriodCall,
) -> Result<getRemainingLimitReturn>
pub fn get_remaining_limit_with_period( &self, call: getRemainingLimitWithPeriodCall, ) -> Result<getRemainingLimitReturn>
Returns the remaining spending limit together with the active period end timestamp.
Missing, revoked, or expired keys report zeroed values instead of erroring.
Sourcepub fn set_allowed_calls(
&mut self,
msg_sender: Address,
call: setAllowedCallsCall,
) -> Result<()>
pub fn set_allowed_calls( &mut self, msg_sender: Address, call: setAllowedCallsCall, ) -> Result<()>
Root-only create-or-replace updates for one or more target call scopes.
Sourcepub fn remove_allowed_calls(
&mut self,
msg_sender: Address,
call: removeAllowedCallsCall,
) -> Result<()>
pub fn remove_allowed_calls( &mut self, msg_sender: Address, call: removeAllowedCallsCall, ) -> Result<()>
Root-only removal of one target call scope.
Sourcepub fn get_allowed_calls(
&self,
call: getAllowedCallsCall,
) -> Result<getAllowedCallsReturn>
pub fn get_allowed_calls( &self, call: getAllowedCallsCall, ) -> Result<getAllowedCallsReturn>
Returns whether an account key is call-scoped together with its configured call scopes.
isScoped = false means unrestricted. isScoped = true with an empty scopes vec means
the key is scoped but currently allows no targets. Missing, revoked, or expired access
keys also report scoped deny-all so this getter never exposes stale persisted scope state.
Sourcepub fn get_transaction_key(
&self,
_call: getTransactionKeyCall,
_msg_sender: Address,
) -> Result<Address>
pub fn get_transaction_key( &self, _call: getTransactionKeyCall, _msg_sender: Address, ) -> Result<Address>
Returns the access key used to authorize the current transaction (Address::ZERO = root key).
Sourcepub fn set_transaction_key(&mut self, key_id: Address) -> Result<()>
pub fn set_transaction_key(&mut self, key_id: Address) -> Result<()>
Internal: Set the transaction key (called during transaction validation)
SECURITY CRITICAL: This must be called by the transaction validation logic BEFORE the transaction is executed, to store which key authorized the transaction.
- If key_id is Address::ZERO (main key), this should store Address::ZERO
- If key_id is a specific key address, this should store that key
This creates a secure channel between validation and the precompile to ensure only the main key can authorize/revoke other keys. Uses transient storage, so the key is automatically cleared after the transaction.
Sourcepub fn set_tx_origin(&mut self, origin: Address) -> Result<()>
pub fn set_tx_origin(&mut self, origin: Address) -> Result<()>
Sets the transaction origin (tx.origin) for the current transaction.
Called by the handler before transaction execution. Uses transient storage, so it’s automatically cleared after the transaction.
Persists the authorization-time restrictions for a freshly created key.
T0-T2 only store raw spending limits. T3 additionally seeds periodic metadata and replaces the key’s call-scope tree in one pass.
Sourcepub fn validate_call_scope_for_transaction(
&self,
account: Address,
key_id: Address,
to: &TxKind,
input: &[u8],
) -> Result<()>
pub fn validate_call_scope_for_transaction( &self, account: Address, key_id: Address, to: &TxKind, input: &[u8], ) -> Result<()>
Validates a top-level call against scoped permissions for this key.
Validation walks the scope tree from coarse to fine:
is_scoped = false=> unrestricted key- target missing from
targets=> target denied - target present with
selectors = []=> allow any selector on that target - selector missing from
selectors=> selector denied - selector present with
recipients = []=> allow any recipient for that selector
Sourcefn replace_allowed_calls(
&mut self,
account_key: B256,
allowed_calls: Option<&[CallScope]>,
) -> Result<()>
fn replace_allowed_calls( &mut self, account_key: B256, allowed_calls: Option<&[CallScope]>, ) -> Result<()>
Replaces the full call-scope tree for an account key.
None switches the key back to unrestricted mode, while Some([]) preserves scoped mode
with no targets so reads can distinguish scoped deny-all from unrestricted mode. This is
the only place where an empty top-level list means deny-all; below the key level, empty
child sets mean “no further restriction”.
Sourcefn clear_all_target_scopes(&mut self, account_key: B256) -> Result<()>
fn clear_all_target_scopes(&mut self, account_key: B256) -> Result<()>
Deletes every persisted target scope under an account key.
Sourcefn remove_target_scope(
&mut self,
account_key: B256,
target: Address,
) -> Result<()>
fn remove_target_scope( &mut self, account_key: B256, target: Address, ) -> Result<()>
Deletes one target scope and all nested selector/recipient rows beneath it.
Sourcefn clear_target_selectors(
&mut self,
account_key: B256,
target: Address,
) -> Result<()>
fn clear_target_selectors( &mut self, account_key: B256, target: Address, ) -> Result<()>
Clears every selector scope stored under one target.
Sourcefn upsert_target_scope(
&mut self,
account_key: B256,
scope: &CallScope,
) -> Result<()>
fn upsert_target_scope( &mut self, account_key: B256, scope: &CallScope, ) -> Result<()>
Creates or replaces one target scope, including all nested selector rules.
Sourcefn validate_call_scopes(&self, scopes: &[CallScope]) -> Result<()>
fn validate_call_scopes(&self, scopes: &[CallScope]) -> Result<()>
Validates a list of CallScopes.
Sourcefn validate_selector_rules(
&self,
target: Address,
rules: &[SelectorRule],
) -> Result<()>
fn validate_selector_rules( &self, target: Address, rules: &[SelectorRule], ) -> Result<()>
Validates per-selector scope rules for one target before they are persisted.
recipients = [] is an explicit allow-all sentinel at the selector level. To deny a
selector entirely, omit it from selectorRules or remove the target scope instead of
leaving behind an empty child set via incremental mutation.
Sourcefn ensure_admin_caller(&self, msg_sender: Address) -> Result<()>
fn ensure_admin_caller(&self, msg_sender: Address) -> Result<()>
Ensures admin operations are authorized for this caller.
Rules:
- transaction must be signed by the main key (
transaction_key == Address::ZERO) - T2+: caller must match tx.origin
§Errors
UnauthorizedCallerwhen called via an access keyUnauthorizedCalleron T2+ whenmsg.sender != tx.origin- storage read errors from transient key/origin or account metadata lookups
The T2 check prevents transaction-global root-key status from being reused by intermediate contracts (confused-deputy self-administration).
tx_origin is seeded by the handler before validation/execution.
If origin is not seeded (zero), admin ops are rejected.
Sourcefn load_active_key(
&self,
account: Address,
key_id: Address,
current_timestamp: u64,
) -> Result<AuthorizedKey>
fn load_active_key( &self, account: Address, key_id: Address, current_timestamp: u64, ) -> Result<AuthorizedKey>
Load and validate a key exists, is not revoked, and is not expired.
Returns the key if valid, or an error if:
- Key doesn’t exist (expiry == 0)
- Key has been revoked
- Key has expired at or before
current_timestamp
Validate keychain authorization (existence, revocation, expiry, and optionally signature type).
§Arguments
account- The account that owns the keykey_id- The key identifier to validatecurrent_timestamp- Current block timestamp for expiry checkexpected_sig_type- The signature type from the actual signature (0=Secp256k1, 1=P256, 2=WebAuthn). PassNoneto skip validation (for backward compatibility pre-T1).
§Errors
KeyAlreadyRevoked— the key has been permanently revokedKeyNotFound— no key is registered under the givenkey_idKeyExpired—current_timestampis at or past the key’s expirySignatureTypeMismatch— the key’s stored type differs fromexpected_sig_type
Sourcepub fn effective_remaining_limit(
&self,
account: Address,
key_id: Address,
token: Address,
current_timestamp: u64,
) -> Result<U256>
pub fn effective_remaining_limit( &self, account: Address, key_id: Address, token: Address, current_timestamp: u64, ) -> Result<U256>
Computes the effective remaining limit at current_timestamp without mutating storage.
Sourcefn effective_limit_state(
&self,
account: Address,
key_id: Address,
token: Address,
current_timestamp: u64,
) -> Result<(U256, u64)>
fn effective_limit_state( &self, account: Address, key_id: Address, token: Address, current_timestamp: u64, ) -> Result<(U256, u64)>
Computes the effective remaining limit and period end at current_timestamp
without mutating storage.
Sourcepub fn verify_and_update_spending(
&mut self,
account: Address,
key_id: Address,
token: Address,
amount: U256,
) -> Result<()>
pub fn verify_and_update_spending( &mut self, account: Address, key_id: Address, token: Address, amount: U256, ) -> Result<()>
Deducts amount from the key’s remaining spending limit for token, failing if exceeded.
§Errors
KeyAlreadyRevoked— the key has been permanently revokedKeyNotFound— no key is registered under the givenkey_idSpendingLimitExceeded—amountexceeds the key’s remaining limit fortoken
Sourcepub fn refund_spending_limit(
&mut self,
account: Address,
token: Address,
amount: U256,
) -> Result<()>
pub fn refund_spending_limit( &mut self, account: Address, token: Address, amount: U256, ) -> Result<()>
Refund spending limit after a fee refund.
Restores the spending limit by the refunded amount. Should be called after a fee refund to avoid permanently reducing the spending limit. On T3, this should never restore more than the configured max in the current fee flow, but we still clamp as defense in depth in case a future caller violates that invariant.
Authorize a token transfer with access key spending limits.
This method checks if the transaction is using an access key, and if so, verifies and updates the spending limits for that key. Should be called before executing a transfer.
§Errors
KeyAlreadyRevoked— the session key has been permanently revokedKeyNotFound— no key is registered for the current transaction keySpendingLimitExceeded—amountexceeds the key’s remaining limit fortoken
Authorize a token approval with access key spending limits.
This method checks if the transaction is using an access key, and if so, verifies and updates the spending limits for that key. Should be called before executing an approval.
§Errors
KeyAlreadyRevoked— the session key has been permanently revokedKeyNotFound— no key is registered for the current transaction keySpendingLimitExceeded— the approval increase exceeds the remaining limit fortoken
Source§impl AccountKeychain
impl AccountKeychain
Sourcepub fn create_precompile(cfg: &CfgEnv<TempoHardfork>) -> DynPrecompile
pub fn create_precompile(cfg: &CfgEnv<TempoHardfork>) -> DynPrecompile
Creates the EVM precompile for this type.
Trait Implementations§
Source§impl ContractStorage for AccountKeychain
impl ContractStorage for AccountKeychain
Source§fn storage(&self) -> &StorageCtx
fn storage(&self) -> &StorageCtx
Source§fn storage_mut(&mut self) -> &mut StorageCtx
fn storage_mut(&mut self) -> &mut StorageCtx
Source§fn is_initialized(&self) -> Result<bool>
fn is_initialized(&self) -> Result<bool>
Source§impl Default for AccountKeychain
impl Default for AccountKeychain
Source§impl Precompile for AccountKeychain
impl Precompile for AccountKeychain
Auto Trait Implementations§
impl !Freeze for AccountKeychain
impl !RefUnwindSafe for AccountKeychain
impl Send for AccountKeychain
impl !Sync for AccountKeychain
impl Unpin for AccountKeychain
impl UnsafeUnpin for AccountKeychain
impl UnwindSafe for AccountKeychain
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
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<TxEnv, T> FromRecoveredTx<&T> for TxEnvwhere
TxEnv: FromRecoveredTx<T>,
impl<TxEnv, T> FromRecoveredTx<&T> for TxEnvwhere
TxEnv: FromRecoveredTx<T>,
§fn from_recovered_tx(tx: &&T, sender: Address) -> TxEnv
fn from_recovered_tx(tx: &&T, sender: Address) -> TxEnv
TxEnv] from a transaction and a sender address.§impl<TxEnv, T> FromTxWithEncoded<&T> for TxEnvwhere
TxEnv: FromTxWithEncoded<T>,
impl<TxEnv, T> FromTxWithEncoded<&T> for TxEnvwhere
TxEnv: FromTxWithEncoded<T>,
§fn from_encoded_tx(tx: &&T, sender: Address, encoded: Bytes) -> TxEnv
fn from_encoded_tx(tx: &&T, sender: Address, encoded: Bytes) -> TxEnv
TxEnv] from a transaction, its sender, and encoded transaction bytes.§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
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 more§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request§impl<L> LayerExt<L> for L
impl<L> LayerExt<L> for L
§fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
Layered].§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
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) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
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
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
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
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
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
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§impl<T> ServiceExt for T
impl<T> ServiceExt for T
§fn propagate_header(self, header: HeaderName) -> PropagateHeader<Self>where
Self: Sized,
fn propagate_header(self, header: HeaderName) -> PropagateHeader<Self>where
Self: Sized,
propagate-header only.§fn add_extension<T>(self, value: T) -> AddExtension<Self, T>where
Self: Sized,
fn add_extension<T>(self, value: T) -> AddExtension<Self, T>where
Self: Sized,
add-extension only.§fn map_request_body<F>(self, f: F) -> MapRequestBody<Self, F>where
Self: Sized,
fn map_request_body<F>(self, f: F) -> MapRequestBody<Self, F>where
Self: Sized,
map-request-body only.§fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>where
Self: Sized,
fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>where
Self: Sized,
map-response-body only.§fn compression(self) -> Compression<Self>where
Self: Sized,
fn compression(self) -> Compression<Self>where
Self: Sized,
compression-br or compression-deflate or compression-gzip or compression-zstd only.§fn decompression(self) -> Decompression<Self>where
Self: Sized,
fn decompression(self) -> Decompression<Self>where
Self: Sized,
decompression-br or decompression-deflate or decompression-gzip or decompression-zstd only.§fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
Self: Sized,
fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
Self: Sized,
trace only.§fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
Self: Sized,
fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
Self: Sized,
trace only.§fn follow_redirects(self) -> FollowRedirect<Self>where
Self: Sized,
fn follow_redirects(self) -> FollowRedirect<Self>where
Self: Sized,
follow-redirect only.§fn sensitive_headers(
self,
headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveRequestHeaders<SetSensitiveResponseHeaders<Self>>where
Self: Sized,
fn sensitive_headers(
self,
headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveRequestHeaders<SetSensitiveResponseHeaders<Self>>where
Self: Sized,
sensitive-headers only.§fn sensitive_request_headers(
self,
headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveRequestHeaders<Self>where
Self: Sized,
fn sensitive_request_headers(
self,
headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveRequestHeaders<Self>where
Self: Sized,
sensitive-headers only.§fn sensitive_response_headers(
self,
headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveResponseHeaders<Self>where
Self: Sized,
fn sensitive_response_headers(
self,
headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveResponseHeaders<Self>where
Self: Sized,
sensitive-headers only.§fn override_request_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetRequestHeader<Self, M>where
Self: Sized,
fn override_request_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetRequestHeader<Self, M>where
Self: Sized,
set-header only.§fn append_request_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetRequestHeader<Self, M>where
Self: Sized,
fn append_request_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetRequestHeader<Self, M>where
Self: Sized,
set-header only.§fn insert_request_header_if_not_present<M>(
self,
header_name: HeaderName,
make: M,
) -> SetRequestHeader<Self, M>where
Self: Sized,
fn insert_request_header_if_not_present<M>(
self,
header_name: HeaderName,
make: M,
) -> SetRequestHeader<Self, M>where
Self: Sized,
set-header only.§fn override_response_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetResponseHeader<Self, M>where
Self: Sized,
fn override_response_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetResponseHeader<Self, M>where
Self: Sized,
set-header only.§fn append_response_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetResponseHeader<Self, M>where
Self: Sized,
fn append_response_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetResponseHeader<Self, M>where
Self: Sized,
set-header only.§fn insert_response_header_if_not_present<M>(
self,
header_name: HeaderName,
make: M,
) -> SetResponseHeader<Self, M>where
Self: Sized,
fn insert_response_header_if_not_present<M>(
self,
header_name: HeaderName,
make: M,
) -> SetResponseHeader<Self, M>where
Self: Sized,
set-header only.§fn set_request_id<M>(
self,
header_name: HeaderName,
make_request_id: M,
) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
fn set_request_id<M>(
self,
header_name: HeaderName,
make_request_id: M,
) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
request-id only.§fn set_x_request_id<M>(self, make_request_id: M) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
fn set_x_request_id<M>(self, make_request_id: M) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
request-id only.x-request-id as the header name. Read more§fn propagate_request_id(
self,
header_name: HeaderName,
) -> PropagateRequestId<Self>where
Self: Sized,
fn propagate_request_id(
self,
header_name: HeaderName,
) -> PropagateRequestId<Self>where
Self: Sized,
request-id only.§fn propagate_x_request_id(self) -> PropagateRequestId<Self>where
Self: Sized,
fn propagate_x_request_id(self) -> PropagateRequestId<Self>where
Self: Sized,
request-id only.x-request-id as the header name. Read more§fn catch_panic(self) -> CatchPanic<Self, DefaultResponseForPanic>where
Self: Sized,
fn catch_panic(self) -> CatchPanic<Self, DefaultResponseForPanic>where
Self: Sized,
catch-panic only.500 Internal Server responses. Read more§fn request_body_limit(self, limit: usize) -> RequestBodyLimit<Self>where
Self: Sized,
fn request_body_limit(self, limit: usize) -> RequestBodyLimit<Self>where
Self: Sized,
limit only.413 Payload Too Large responses. Read more§fn trim_trailing_slash(self) -> NormalizePath<Self>where
Self: Sized,
fn trim_trailing_slash(self) -> NormalizePath<Self>where
Self: Sized,
normalize-path only.§fn append_trailing_slash(self) -> NormalizePath<Self>where
Self: Sized,
fn append_trailing_slash(self) -> NormalizePath<Self>where
Self: Sized,
normalize-path only.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.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
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.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
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.§impl<T> TryConv for T
impl<T> TryConv for T
§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<T> ErasedDestructor for Twhere
T: 'static,
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 488 bytes