loom_node_debug_provider::debugprovider

Struct AnvilDebugProvider

Source
pub struct AnvilDebugProvider<PN, PA, TN, TA, N>
where N: Network, TA: Transport + Clone, TN: Transport + Clone, PN: Provider<TN, N> + Send + Sync + Clone + 'static, PA: Provider<TA, N> + Send + Sync + Clone + 'static,
{ _node: PN, _anvil: PA, _anvil_instance: Option<Arc<AnvilInstance>>, block_number: BlockNumberOrTag, _ta: PhantomData<TA>, _tn: PhantomData<TN>, _n: PhantomData<N>, }

Fields§

§_node: PN§_anvil: PA§_anvil_instance: Option<Arc<AnvilInstance>>§block_number: BlockNumberOrTag§_ta: PhantomData<TA>§_tn: PhantomData<TN>§_n: PhantomData<N>

Implementations§

Source§

impl<PN, PA, TN, TA, N> AnvilDebugProvider<PN, PA, TN, TA, N>
where TN: Transport + Clone, TA: Transport + Clone, N: Network, PA: Provider<TA, N> + Send + Sync + Clone + 'static, PN: Provider<TN, N> + Send + Sync + Clone + 'static,

Source

pub fn new(_node: PN, _anvil: PA, block_number: BlockNumberOrTag) -> Self

Source

pub fn node(&self) -> &PN

Source

pub fn anvil(&self) -> &PA

Source

pub fn privkey(&self) -> Result<SecretKey>

Trait Implementations§

Source§

impl<PN, PA, TN, TA, N> AnvilProviderExt<TA, N> for AnvilDebugProvider<PN, PA, TN, TA, N>
where N: Network, TN: Transport + Clone, TA: Transport + Clone, PN: Provider<TN, N> + Send + Sync + Clone + 'static, PA: Provider<TA, N> + Send + Sync + Clone + 'static,

Source§

fn snapshot(&self) -> impl Future<Output = TransportResult<u64>> + Send

Source§

fn revert( &self, snap_id: u64, ) -> impl Future<Output = TransportResult<bool>> + Send

Source§

fn mine(&self) -> impl Future<Output = TransportResult<u64>> + Send

Source§

fn set_automine( &self, to_mine: bool, ) -> impl Future<Output = TransportResult<()>> + Send

Source§

fn set_code( &self, address: Address, code: Bytes, ) -> impl Future<Output = TransportResult<()>> + Send

Source§

fn set_balance( &self, address: Address, balance: U256, ) -> impl Future<Output = TransportResult<()>> + Send

Source§

fn set_storage( &self, address: Address, cell: B256, value: B256, ) -> impl Future<Output = TransportResult<bool>> + Send

Source§

impl<PN, PA, TN, TA, N> Clone for AnvilDebugProvider<PN, PA, TN, TA, N>
where N: Network + Clone, TA: Transport + Clone + Clone, TN: Transport + Clone + Clone, PN: Provider<TN, N> + Send + Sync + Clone + 'static + Clone, PA: Provider<TA, N> + Send + Sync + Clone + 'static + Clone,

Source§

fn clone(&self) -> AnvilDebugProvider<PN, PA, TN, TA, N>

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<PN, PA, TN, TA, N> Debug for AnvilDebugProvider<PN, PA, TN, TA, N>
where N: Network + Debug, TA: Transport + Clone + Debug, TN: Transport + Clone + Debug, PN: Provider<TN, N> + Send + Sync + Clone + 'static + Debug, PA: Provider<TA, N> + Send + Sync + Clone + 'static + Debug,

Source§

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

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

impl<PN, PA, TN, TA, N> DebugProviderExt<TA, N> for AnvilDebugProvider<PN, PA, TN, TA, N>
where TN: Transport + Clone, TA: Transport + Clone, N: Network, PN: Provider<TN, N> + Send + Sync + Clone + 'static, PA: Provider<TA, N> + Send + Sync + Clone + 'static,

Source§

fn geth_debug_trace_call<'life0, 'async_trait>( &'life0 self, tx: TransactionRequest, block: BlockId, trace_options: GethDebugTracingCallOptions, ) -> Pin<Box<dyn Future<Output = TransportResult<GethTrace>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Source§

fn geth_debug_trace_block_by_number<'life0, 'async_trait>( &'life0 self, block: BlockNumberOrTag, trace_options: GethDebugTracingOptions, ) -> Pin<Box<dyn Future<Output = TransportResult<Vec<TraceResult>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Source§

fn geth_debug_trace_block_by_hash<'life0, 'async_trait>( &'life0 self, block: BlockHash, trace_options: GethDebugTracingOptions, ) -> Pin<Box<dyn Future<Output = TransportResult<Vec<TraceResult>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Source§

impl<PN, PA, TA> Provider<TA> for AnvilDebugProvider<PN, PA, BoxTransport, TA, Ethereum>
where TA: Transport + Clone, PN: Provider<BoxTransport, Ethereum> + Send + Sync + Clone + 'static, PA: Provider<TA, Ethereum> + Send + Sync + Clone + 'static,

Source§

fn root(&self) -> &RootProvider<TA, Ethereum>

Returns the root provider.
Source§

fn get_block_number(&self) -> ProviderCall<TA, NoParams, U64, BlockNumber>

Get the last block number available.
§

fn builder() -> ProviderBuilder<Identity, Identity, N>
where Self: Sized,

Returns the ProviderBuilder to build on.
§

fn client(&self) -> &RpcClientInner<T>

Returns the RPC client used to send requests. Read more
§

fn weak_client(&self) -> Weak<RpcClientInner<T>>

Returns a Weak RPC client used to send requests. Read more
§

fn get_accounts(&self) -> ProviderCall<T, [(); 0], Vec<Address>>

Gets the accounts in the remote node. This is usually empty unless you’re using a local node.
§

fn get_blob_base_fee(&self) -> ProviderCall<T, [(); 0], Uint<128, 2>, u128>

Returns the base fee per blob gas (blob gas price) in wei.
§

fn call<'req>( &self, tx: &'req <N as Network>::TransactionRequest, ) -> EthCall<'req, T, N, Bytes>

Execute a smart contract call with a transaction request and state overrides, without publishing a transaction. Read more
§

fn simulate<'req>( &self, payload: &'req SimulatePayload, ) -> RpcWithBlock<T, &'req SimulatePayload, Vec<SimulatedBlock<<N as Network>::BlockResponse>>>

Executes an arbitrary number of transactions on top of the requested state. Read more
§

fn get_chain_id(&self) -> ProviderCall<T, [(); 0], Uint<64, 1>, u64>

Gets the chain ID.
§

fn create_access_list<'a>( &self, request: &'a <N as Network>::TransactionRequest, ) -> RpcWithBlock<T, &'a <N as Network>::TransactionRequest, AccessListResult>

Create an EIP-2930 access list.
§

fn estimate_gas<'req>( &self, tx: &'req <N as Network>::TransactionRequest, ) -> EthCall<'req, T, N, Uint<64, 1>, u64>

Create an [EthCall] future to estimate the gas required for a transaction. Read more
§

fn estimate_eip1559_fees<'life0, 'async_trait>( &'life0 self, estimator: Option<fn(_: u128, _: &[Vec<u128>]) -> Eip1559Estimation>, ) -> Pin<Box<dyn Future<Output = Result<Eip1559Estimation, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Estimates the EIP1559 maxFeePerGas and maxPriorityFeePerGas fields. Read more
§

fn get_fee_history<'life0, 'life1, 'async_trait>( &'life0 self, block_count: u64, last_block: BlockNumberOrTag, reward_percentiles: &'life1 [f64], ) -> Pin<Box<dyn Future<Output = Result<FeeHistory, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, Self: 'async_trait,

Returns a collection of historical gas information [FeeHistory] which can be used to calculate the EIP1559 fields maxFeePerGas and maxPriorityFeePerGas. block_count can range from 1 to 1024 blocks in a single request.
§

fn get_gas_price(&self) -> ProviderCall<T, [(); 0], Uint<128, 2>, u128>

Gets the current gas price in wei.
§

fn get_account(&self, address: Address) -> RpcWithBlock<T, Address, Account>

Retrieves account information (Account) for the given [Address] at the particular [BlockId].
§

fn get_balance( &self, address: Address, ) -> RpcWithBlock<T, Address, Uint<256, 4>>

Gets the balance of the account. Read more
§

fn get_block<'life0, 'async_trait>( &'life0 self, block: BlockId, kind: BlockTransactionsKind, ) -> Pin<Box<dyn Future<Output = Result<Option<<N as Network>::BlockResponse>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Gets a block by either its hash, tag, or number, with full transactions or only hashes.
§

fn get_block_by_hash<'life0, 'async_trait>( &'life0 self, hash: FixedBytes<32>, kind: BlockTransactionsKind, ) -> Pin<Box<dyn Future<Output = Result<Option<<N as Network>::BlockResponse>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Gets a block by its [BlockHash], with full transactions or only hashes.
§

fn get_block_by_number<'life0, 'async_trait>( &'life0 self, number: BlockNumberOrTag, kind: BlockTransactionsKind, ) -> Pin<Box<dyn Future<Output = Result<Option<<N as Network>::BlockResponse>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Get a block by its number.
§

fn get_block_receipts( &self, block: BlockId, ) -> ProviderCall<T, (BlockId,), Option<Vec<<N as Network>::ReceiptResponse>>>

Gets the selected block [BlockId] receipts.
§

fn get_code_at(&self, address: Address) -> RpcWithBlock<T, Address, Bytes>

Gets the bytecode located at the corresponding [Address].
§

fn watch_blocks<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<PollerBuilder<T, (Uint<256, 4>,), Vec<FixedBytes<32>>>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Watch for new blocks by polling the provider with eth_getFilterChanges. Read more
§

fn watch_pending_transactions<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<PollerBuilder<T, (Uint<256, 4>,), Vec<FixedBytes<32>>>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Watch for new pending transaction by polling the provider with eth_getFilterChanges. Read more
§

fn watch_logs<'life0, 'life1, 'async_trait>( &'life0 self, filter: &'life1 Filter, ) -> Pin<Box<dyn Future<Output = Result<PollerBuilder<T, (Uint<256, 4>,), Vec<Log>>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, Self: 'async_trait,

Watch for new logs using the given filter by polling the provider with eth_getFilterChanges. Read more
§

fn watch_full_pending_transactions<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<PollerBuilder<T, (Uint<256, 4>,), Vec<<N as Network>::TransactionResponse>>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Watch for new pending transaction bodies by polling the provider with eth_getFilterChanges. Read more
§

fn get_filter_changes<'life0, 'async_trait, R>( &'life0 self, id: Uint<256, 4>, ) -> Pin<Box<dyn Future<Output = Result<Vec<R>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: Sized + 'async_trait, R: 'async_trait + RpcReturn,

Get a list of values that have been added since the last poll. Read more
§

fn get_filter_changes_dyn<'life0, 'async_trait>( &'life0 self, id: Uint<256, 4>, ) -> Pin<Box<dyn Future<Output = Result<FilterChanges, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Get a list of values that have been added since the last poll. Read more
§

fn watch_pending_transaction<'life0, 'async_trait>( &'life0 self, config: PendingTransactionConfig, ) -> Pin<Box<dyn Future<Output = Result<PendingTransaction, PendingTransactionError>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Watch for the confirmation of a single pending transaction with the given configuration. Read more
§

fn get_logs<'life0, 'life1, 'async_trait>( &'life0 self, filter: &'life1 Filter, ) -> Pin<Box<dyn Future<Output = Result<Vec<Log>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, Self: 'async_trait,

Retrieves a Vec<Log> with the given [Filter].
§

fn get_proof( &self, address: Address, keys: Vec<FixedBytes<32>>, ) -> RpcWithBlock<T, (Address, Vec<FixedBytes<32>>), EIP1186AccountProofResponse>

Get the account and storage values of the specified account including the merkle proofs. Read more
§

fn get_storage_at( &self, address: Address, key: Uint<256, 4>, ) -> RpcWithBlock<T, (Address, Uint<256, 4>), Uint<256, 4>>

Gets the specified storage value from [Address].
§

fn get_transaction_by_hash( &self, hash: FixedBytes<32>, ) -> ProviderCall<T, (FixedBytes<32>,), Option<<N as Network>::TransactionResponse>>

Gets a transaction by its [TxHash].
§

fn get_transaction_by_block_hash_and_index( &self, block_hash: FixedBytes<32>, index: usize, ) -> ProviderCall<T, (FixedBytes<32>, Index), Option<<N as Network>::TransactionResponse>>

Gets a transaction by block hash and transaction index position.
§

fn get_raw_transaction_by_block_hash_and_index( &self, block_hash: FixedBytes<32>, index: usize, ) -> ProviderCall<T, (FixedBytes<32>, Index), Option<Bytes>>

Gets a raw transaction by block hash and transaction index position.
§

fn get_transaction_by_block_number_and_index( &self, block_number: BlockNumberOrTag, index: usize, ) -> ProviderCall<T, (BlockNumberOrTag, Index), Option<<N as Network>::TransactionResponse>>

Gets a transaction by block number and transaction index position.
§

fn get_raw_transaction_by_block_number_and_index( &self, block_number: BlockNumberOrTag, index: usize, ) -> ProviderCall<T, (BlockNumberOrTag, Index), Option<Bytes>>

Gets a raw transaction by block number and transaction index position.
§

fn get_raw_transaction_by_hash( &self, hash: FixedBytes<32>, ) -> ProviderCall<T, (FixedBytes<32>,), Option<Bytes>>

Returns the EIP-2718 encoded transaction if it exists, see also Decodable2718. Read more
§

fn get_transaction_count( &self, address: Address, ) -> RpcWithBlock<T, Address, Uint<64, 1>, u64>

Gets the transaction count (AKA “nonce”) of the corresponding address.
§

fn get_transaction_receipt( &self, hash: FixedBytes<32>, ) -> ProviderCall<T, (FixedBytes<32>,), Option<<N as Network>::ReceiptResponse>>

Gets a transaction receipt if it exists, by its [TxHash].
§

fn get_uncle<'life0, 'async_trait>( &'life0 self, tag: BlockId, idx: u64, ) -> Pin<Box<dyn Future<Output = Result<Option<<N as Network>::BlockResponse>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Gets an uncle block through the tag [BlockId] and index u64.
§

fn get_uncle_count<'life0, 'async_trait>( &'life0 self, tag: BlockId, ) -> Pin<Box<dyn Future<Output = Result<u64, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Gets the number of uncles for the block specified by the tag [BlockId].
§

fn get_max_priority_fee_per_gas( &self, ) -> ProviderCall<T, [(); 0], Uint<128, 2>, u128>

Returns a suggestion for the current maxPriorityFeePerGas in wei.
§

fn new_block_filter<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Uint<256, 4>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Notify the provider that we are interested in new blocks. Read more
§

fn new_filter<'life0, 'life1, 'async_trait>( &'life0 self, filter: &'life1 Filter, ) -> Pin<Box<dyn Future<Output = Result<Uint<256, 4>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, Self: 'async_trait,

Notify the provider that we are interested in logs that match the given filter. Read more
§

fn new_pending_transactions_filter<'life0, 'async_trait>( &'life0 self, full: bool, ) -> Pin<Box<dyn Future<Output = Result<Uint<256, 4>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Notify the provider that we are interested in new pending transactions. Read more
§

fn send_raw_transaction<'life0, 'life1, 'async_trait>( &'life0 self, encoded_tx: &'life1 [u8], ) -> Pin<Box<dyn Future<Output = Result<PendingTransactionBuilder<T, N>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, Self: 'async_trait,

Broadcasts a raw transaction RLP bytes to the network. Read more
§

fn send_transaction<'life0, 'async_trait>( &'life0 self, tx: <N as Network>::TransactionRequest, ) -> Pin<Box<dyn Future<Output = Result<PendingTransactionBuilder<T, N>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Broadcasts a transaction to the network. Read more
§

fn send_tx_envelope<'life0, 'async_trait>( &'life0 self, tx: <N as Network>::TxEnvelope, ) -> Pin<Box<dyn Future<Output = Result<PendingTransactionBuilder<T, N>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Broadcasts a transaction envelope to the network. Read more
§

fn subscribe_blocks<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Subscription<<N as Network>::HeaderResponse>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Subscribe to a stream of new block headers. Read more
§

fn subscribe_pending_transactions<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Subscription<FixedBytes<32>>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Subscribe to a stream of pending transaction hashes. Read more
§

fn subscribe_full_pending_transactions<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Subscription<<N as Network>::TransactionResponse>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Subscribe to a stream of pending transaction bodies. Read more
§

fn subscribe_logs<'life0, 'life1, 'async_trait>( &'life0 self, filter: &'life1 Filter, ) -> Pin<Box<dyn Future<Output = Result<Subscription<Log>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, Self: 'async_trait,

Subscribe to a stream of logs matching given filter. Read more
§

fn subscribe<'life0, 'async_trait, P, R>( &'life0 self, params: P, ) -> Pin<Box<dyn Future<Output = Result<Subscription<R>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: RpcParam + 'async_trait, R: RpcReturn + 'async_trait, Self: Sized + 'async_trait,

Subscribe to an RPC event.
§

fn unsubscribe<'life0, 'async_trait>( &'life0 self, id: FixedBytes<32>, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Cancels a subscription given the subscription ID.
§

fn syncing(&self) -> ProviderCall<T, [(); 0], SyncStatus>

Gets syncing info.
§

fn get_client_version(&self) -> ProviderCall<T, [(); 0], String>

Gets the client version.
§

fn get_sha3(&self, data: &[u8]) -> ProviderCall<T, (String,), FixedBytes<32>>

Gets the Keccak-256 hash of the given data.
§

fn get_net_version(&self) -> ProviderCall<T, [(); 0], Uint<64, 1>, u64>

Gets the network ID. Same as eth_chainId.
§

fn raw_request<'life0, 'async_trait, P, R>( &'life0 self, method: Cow<'static, str>, params: P, ) -> Pin<Box<dyn Future<Output = Result<R, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: RpcParam + 'async_trait, R: RpcReturn + 'async_trait, Self: Sized + 'async_trait,

Sends a raw JSON-RPC request. Read more
§

fn raw_request_dyn<'life0, 'life1, 'async_trait>( &'life0 self, method: Cow<'static, str>, params: &'life1 RawValue, ) -> Pin<Box<dyn Future<Output = Result<Box<RawValue>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, Self: 'async_trait,

Sends a raw JSON-RPC request with type-erased parameters and return. Read more
§

fn transaction_request(&self) -> <N as Network>::TransactionRequest

Creates a new TransactionRequest.

Auto Trait Implementations§

§

impl<PN, PA, TN, TA, N> Freeze for AnvilDebugProvider<PN, PA, TN, TA, N>
where PN: Freeze, PA: Freeze,

§

impl<PN, PA, TN, TA, N> RefUnwindSafe for AnvilDebugProvider<PN, PA, TN, TA, N>

§

impl<PN, PA, TN, TA, N> Send for AnvilDebugProvider<PN, PA, TN, TA, N>

§

impl<PN, PA, TN, TA, N> Sync for AnvilDebugProvider<PN, PA, TN, TA, N>

§

impl<PN, PA, TN, TA, N> Unpin for AnvilDebugProvider<PN, PA, TN, TA, N>
where PN: Unpin, PA: Unpin, TA: Unpin, TN: Unpin, N: Unpin,

§

impl<PN, PA, TN, TA, N> UnwindSafe for AnvilDebugProvider<PN, PA, TN, TA, N>
where PN: UnwindSafe, PA: UnwindSafe, TA: UnwindSafe, TN: UnwindSafe, N: UnwindSafe,

Blanket Implementations§

§

impl<N, T, P> AnvilApi<N, T> for P
where N: Network, T: Transport + Clone, P: Provider<T, N>,

§

fn anvil_impersonate_account<'life0, 'async_trait>( &'life0 self, address: Address, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Send transactions impersonating specific account and contract addresses.
§

fn anvil_stop_impersonating_account<'life0, 'async_trait>( &'life0 self, address: Address, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Stops impersonating an account if previously set with anvil_impersonateAccount.
§

fn anvil_auto_impersonate_account<'life0, 'async_trait>( &'life0 self, enabled: bool, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

If set to true will make every account impersonated.
§

fn anvil_get_auto_mine<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<bool, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Returns true if auto mining is enabled, and false.
§

fn anvil_set_auto_mine<'life0, 'async_trait>( &'life0 self, enabled: bool, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Enables or disables, based on the single boolean argument, the automatic mining of new blocks with each new transaction submitted to the network.
§

fn anvil_mine<'life0, 'async_trait>( &'life0 self, num_blocks: Option<Uint<256, 4>>, interval: Option<Uint<256, 4>>, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Mines a series of blocks.
§

fn anvil_set_interval_mining<'life0, 'async_trait>( &'life0 self, secs: u64, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Sets the mining behavior to interval with the given interval (seconds).
§

fn anvil_drop_transaction<'life0, 'async_trait>( &'life0 self, tx_hash: FixedBytes<32>, ) -> Pin<Box<dyn Future<Output = Result<Option<FixedBytes<32>>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Removes transactions from the pool.
§

fn anvil_drop_all_transactions<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Removes all transactions from the pool.
§

fn anvil_reset<'life0, 'async_trait>( &'life0 self, forking: Option<Forking>, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Reset the fork to a fresh forked state, and optionally update the fork config. Read more
§

fn anvil_set_chain_id<'life0, 'async_trait>( &'life0 self, chain_id: u64, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Sets the chain ID.
§

fn anvil_set_balance<'life0, 'async_trait>( &'life0 self, address: Address, balance: Uint<256, 4>, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Modifies the balance of an account.
§

fn anvil_set_code<'life0, 'async_trait>( &'life0 self, address: Address, code: Bytes, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Sets the code of a contract.
§

fn anvil_set_nonce<'life0, 'async_trait>( &'life0 self, address: Address, nonce: Uint<256, 4>, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Sets the nonce of an address.
§

fn anvil_set_storage_at<'life0, 'async_trait>( &'life0 self, address: Address, slot: Uint<256, 4>, val: FixedBytes<32>, ) -> Pin<Box<dyn Future<Output = Result<bool, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Writes a single slot of the account’s storage.
§

fn anvil_set_logging<'life0, 'async_trait>( &'life0 self, enable: bool, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Enable or disable logging.
§

fn anvil_set_min_gas_price<'life0, 'async_trait>( &'life0 self, gas: Uint<256, 4>, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Set the minimum gas price for the node.
§

fn anvil_set_next_block_base_fee_per_gas<'life0, 'async_trait>( &'life0 self, basefee: Uint<256, 4>, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Sets the base fee of the next block.
§

fn anvil_set_coinbase<'life0, 'async_trait>( &'life0 self, address: Address, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Sets the coinbase address.
§

fn anvil_dump_state<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Bytes, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Create a buffer that represents all state on the chain, which can be loaded to separate process by calling anvil_loadState
§

fn anvil_load_state<'life0, 'async_trait>( &'life0 self, buf: Bytes, ) -> Pin<Box<dyn Future<Output = Result<bool, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Append chain state buffer to current chain. Will overwrite any conflicting addresses or storage.
§

fn anvil_node_info<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<NodeInfo, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Retrieves the Anvil node configuration params.
§

fn anvil_metadata<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Metadata, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Retrieves metadata about the Anvil instance.
§

fn anvil_remove_pool_transactions<'life0, 'async_trait>( &'life0 self, address: Address, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Removes all transactions from the pool for a specific address.
§

fn anvil_snapshot<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Uint<256, 4>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Snapshot the state of the blockchain at the current block.
§

fn anvil_revert<'life0, 'async_trait>( &'life0 self, id: Uint<256, 4>, ) -> Pin<Box<dyn Future<Output = Result<bool, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Revert the state of the blockchain to a previous snapshot. Takes a single parameter, which is the snapshot id to revert to.
§

fn anvil_increase_time<'life0, 'async_trait>( &'life0 self, seconds: Uint<256, 4>, ) -> Pin<Box<dyn Future<Output = Result<i64, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Jump forward in time by the given amount of time, in seconds.
§

fn anvil_set_next_block_timestamp<'life0, 'async_trait>( &'life0 self, seconds: u64, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Similar to evm_increaseTime but takes the exact timestamp that you want in the next block.
§

fn anvil_set_time<'life0, 'async_trait>( &'life0 self, timestamp: u64, ) -> Pin<Box<dyn Future<Output = Result<u64, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Sets the specific timestamp and returns the number of seconds between the given timestamp and the current time.
§

fn anvil_set_block_gas_limit<'life0, 'async_trait>( &'life0 self, gas_limit: Uint<256, 4>, ) -> Pin<Box<dyn Future<Output = Result<bool, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Set the next block gas limit.
§

fn anvil_set_block_timestamp_interval<'life0, 'async_trait>( &'life0 self, seconds: u64, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Sets an interval for the block timestamp.
§

fn anvil_remove_block_timestamp_interval<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<bool, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Unsets the interval for the block timestamp.
§

fn evm_mine<'life0, 'async_trait>( &'life0 self, opts: Option<MineOptions>, ) -> Pin<Box<dyn Future<Output = Result<String, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Mine blocks, instantly. This will mine the blocks regardless of the configured mining mode.
§

fn anvil_mine_detailed<'life0, 'async_trait>( &'life0 self, opts: Option<MineOptions>, ) -> Pin<Box<dyn Future<Output = Result<Vec<Block>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Mine blocks, instantly and return the mined blocks. This will mine the blocks regardless of the configured mining mode.
§

fn anvil_set_rpc_url<'life0, 'async_trait>( &'life0 self, url: String, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Sets the backend rpc url.
§

fn anvil_reorg<'life0, 'async_trait>( &'life0 self, options: ReorgOptions, ) -> Pin<Box<dyn Future<Output = Result<(), RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Reorg the chain
§

fn eth_send_unsigned_transaction<'life0, 'async_trait>( &'life0 self, request: <N as Network>::TransactionRequest, ) -> Pin<Box<dyn Future<Output = Result<FixedBytes<32>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Execute a transaction regardless of signature status.
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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dst: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<N, T, P> DebugApi<N, T> for P
where N: Network, T: Transport + Clone, P: Provider<T, N>,

§

fn debug_get_raw_header<'life0, 'async_trait>( &'life0 self, block: BlockId, ) -> Pin<Box<dyn Future<Output = Result<Bytes, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Returns an RLP-encoded header.
§

fn debug_get_raw_block<'life0, 'async_trait>( &'life0 self, block: BlockId, ) -> Pin<Box<dyn Future<Output = Result<Bytes, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Retrieves and returns the RLP encoded block by number, hash or tag.
§

fn debug_get_raw_transaction<'life0, 'async_trait>( &'life0 self, hash: FixedBytes<32>, ) -> Pin<Box<dyn Future<Output = Result<Bytes, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Returns an EIP-2718 binary-encoded transaction.
§

fn debug_get_raw_receipts<'life0, 'async_trait>( &'life0 self, block: BlockId, ) -> Pin<Box<dyn Future<Output = Result<Vec<Bytes>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Returns an array of EIP-2718 binary-encoded receipts.
§

fn debug_get_bad_blocks<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Vec<BadBlock>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Returns an array of recent bad blocks that the client has seen on the network.
§

fn debug_trace_chain<'life0, 'async_trait>( &'life0 self, start_exclusive: BlockNumberOrTag, end_inclusive: BlockNumberOrTag, ) -> Pin<Box<dyn Future<Output = Result<Vec<BlockTraceResult>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Returns the structured logs created during the execution of EVM between two blocks (excluding start) as a JSON object.
§

fn debug_trace_block<'life0, 'life1, 'async_trait>( &'life0 self, rlp_block: &'life1 [u8], trace_options: GethDebugTracingOptions, ) -> Pin<Box<dyn Future<Output = Result<Vec<TraceResult<GethTrace, String>>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, P: 'async_trait,

The debug_traceBlock method will return a full stack trace of all invoked opcodes of all transaction that were included in this block. Read more
§

fn debug_trace_transaction<'life0, 'async_trait>( &'life0 self, hash: FixedBytes<32>, trace_options: GethDebugTracingOptions, ) -> Pin<Box<dyn Future<Output = Result<GethTrace, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Reruns the transaction specified by the hash and returns the trace. Read more
§

fn debug_trace_block_by_hash<'life0, 'async_trait>( &'life0 self, block: FixedBytes<32>, trace_options: GethDebugTracingOptions, ) -> Pin<Box<dyn Future<Output = Result<Vec<TraceResult<GethTrace, String>>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Return a full stack trace of all invoked opcodes of all transaction that were included in this block. Read more
§

fn debug_trace_block_by_number<'life0, 'async_trait>( &'life0 self, block: BlockNumberOrTag, trace_options: GethDebugTracingOptions, ) -> Pin<Box<dyn Future<Output = Result<Vec<TraceResult<GethTrace, String>>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Same as debug_trace_block_by_hash but block is specified by number. Read more
§

fn debug_trace_call<'life0, 'async_trait>( &'life0 self, tx: TransactionRequest, block: BlockId, trace_options: GethDebugTracingCallOptions, ) -> Pin<Box<dyn Future<Output = Result<GethTrace, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Executes the given transaction without publishing it like eth_call and returns the trace of the execution. Read more
§

fn debug_trace_call_many<'life0, 'async_trait>( &'life0 self, bundles: Vec<Bundle>, state_context: StateContext, trace_options: GethDebugTracingCallOptions, ) -> Pin<Box<dyn Future<Output = Result<Vec<GethTrace>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Same as debug_trace_call but it used to run and trace multiple transactions at once. 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
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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<N, T, P> TraceApi<N, T> for P
where N: Network, T: Transport + Clone, P: Provider<T, N>,

§

fn trace_call<'a, 'b>( &self, request: &'a <N as Network>::TransactionRequest, trace_types: &'b [TraceType], ) -> RpcWithBlock<T, (&'a <N as Network>::TransactionRequest, &'b [TraceType]), TraceResults>

Executes the given transaction and returns a number of possible traces. Read more
§

fn trace_call_many<'a>( &self, request: &'a [(<N as Network>::TransactionRequest, &'a [TraceType])], ) -> RpcWithBlock<T, (&'a [(<N as Network>::TransactionRequest, &'a [TraceType])],), Vec<TraceResults>>

Traces multiple transactions on top of the same block, i.e. transaction n will be executed on top of the given block with all n - 1 transaction applied first. Read more
§

fn trace_transaction<'life0, 'async_trait>( &'life0 self, hash: FixedBytes<32>, ) -> Pin<Box<dyn Future<Output = Result<Vec<LocalizedTransactionTrace>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Parity trace transaction.
§

fn trace_get<'life0, 'async_trait>( &'life0 self, hash: FixedBytes<32>, index: usize, ) -> Pin<Box<dyn Future<Output = Result<LocalizedTransactionTrace, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Traces of the transaction on the given positions Read more
§

fn trace_raw_transaction<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, data: &'life1 [u8], trace_types: &'life2 [TraceType], ) -> Pin<Box<dyn Future<Output = Result<TraceResults, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, P: 'async_trait,

Trace the given raw transaction.
§

fn trace_filter<'life0, 'life1, 'async_trait>( &'life0 self, tracer: &'life1 TraceFilter, ) -> Pin<Box<dyn Future<Output = Result<Vec<LocalizedTransactionTrace>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, P: 'async_trait,

Traces matching given filter.
§

fn trace_block<'life0, 'async_trait>( &'life0 self, block: BlockId, ) -> Pin<Box<dyn Future<Output = Result<Vec<LocalizedTransactionTrace>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, P: 'async_trait,

Trace all transactions in the given block. Read more
§

fn trace_replay_transaction<'life0, 'life1, 'async_trait>( &'life0 self, hash: FixedBytes<32>, trace_types: &'life1 [TraceType], ) -> Pin<Box<dyn Future<Output = Result<TraceResults, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, P: 'async_trait,

Replays a transaction.
§

fn trace_replay_block_transactions<'life0, 'life1, 'async_trait>( &'life0 self, block: BlockId, trace_types: &'life1 [TraceType], ) -> Pin<Box<dyn Future<Output = Result<Vec<TraceResultsWithTransactionHash>, RpcError<TransportErrorKind>>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, P: 'async_trait,

Replays all transactions in the given block.
§

impl<T> TryClone for T
where T: Clone,

§

fn try_clone(&self) -> Result<T, Error>

Clones self, possibly returning an error.
Source§

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

Source§

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

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
§

impl<T> ErasedDestructor for T
where T: 'static,

§

impl<T> MaybeSendSync for T

Layout§

Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.