pub struct Call {Show 28 fields
pub index: u32,
pub parent_index: u32,
pub depth: u32,
pub call_type: i32,
pub caller: Vec<u8>,
pub address: Vec<u8>,
pub address_delegates_to: Option<Vec<u8>>,
pub value: Option<BigInt>,
pub gas_limit: u64,
pub gas_consumed: u64,
pub return_data: Vec<u8>,
pub input: Vec<u8>,
pub executed_code: bool,
pub suicide: bool,
pub keccak_preimages: HashMap<String, String>,
pub storage_changes: Vec<StorageChange>,
pub balance_changes: Vec<BalanceChange>,
pub nonce_changes: Vec<NonceChange>,
pub logs: Vec<Log>,
pub code_changes: Vec<CodeChange>,
pub gas_changes: Vec<GasChange>,
pub status_failed: bool,
pub status_reverted: bool,
pub failure_reason: String,
pub state_reverted: bool,
pub begin_ordinal: u64,
pub end_ordinal: u64,
pub account_creations: Vec<AccountCreation>,
}Fields§
§index: u32§parent_index: u32§depth: u32§call_type: i32§caller: Vec<u8>§address: Vec<u8>§address_delegates_to: Option<Vec<u8>>AddressDelegatesTo contains the address from which the actual code to execute will be loaded as defined per EIP-7702 rules. If the Call’s address value resolves to a code that delegates to another address, this field will be populated with the address that the call is delegated to. It will be empty in all other situations.
Assumes that a ‘SetCode’ transaction set address 0xA to delegates to address 0xB,
then when a call is made to 0xA, the Call object would have:
- caller =
- address = 0xA
- address_delegates_to = 0xB
Again, it’s important to emphasize that this field relates to EIP-7702, if the call is a DELEGATE or CALLCODE type, this field will not be populated and will remain empty.
It will be populated only if EIP-7702 is active on the chain (Prague fork) and if the ‘address’ of the call was pointing to another address at time of execution.
value: Option<BigInt>§gas_limit: u64§gas_consumed: u64§return_data: Vec<u8>§input: Vec<u8>Known Issues
-
Version 3: When call is
CREATEorCREATE2, this field is not populated. A couple of suggestions: 1. You can get the contract’s code in thecode_changesfield. 2. In the rootCREATEcall, you can directly use theTransactionTrace’s input field.Fixed in
Version 4, see https://docs.substreams.dev/reference-material/chains-and-endpoints/ethereum-data-model for information about block versions.
executed_code: boolIndicates whether the call executed code.
Known Issues
-
Version 3: This may be incorrectly set to
falsefor accounts with code handling native value transfers, as well as for certain precompiles with no input. The value is initially set based oncall.type != CREATE && len(call.input) > 0and later adjusted if the tracer detects an account without code.Fixed in
Version 4, see https://docs.substreams.dev/reference-material/chains-and-endpoints/ethereum-data-model for information about block versions.
suicide: bool§keccak_preimages: HashMap<String, String>hex representation of the hash -> preimage
storage_changes: Vec<StorageChange>Known Issues
-
Version 3: The data might be not be in order.
Fixed in
Version 4, see https://docs.substreams.dev/reference-material/chains-and-endpoints/ethereum-data-model for information about block versions.
balance_changes: Vec<BalanceChange>§nonce_changes: Vec<NonceChange>§logs: Vec<Log>§code_changes: Vec<CodeChange>§gas_changes: Vec<GasChange>Known Issues
- Version 3:
Some gas changes are not correctly tracked:
1. Gas refunded due to data returned to the chain (occurs at the end of a transaction, before buyback).
2. Initial gas allocation (0 -> GasLimit) at the start of a call.
3. Final gas deduction (LeftOver -> 0) at the end of a call (if applicable).
Fixed in
Version 4, see https://docs.substreams.dev/reference-material/chains-and-endpoints/ethereum-data-model for information about block versions.
status_failed: boolIn Ethereum, a call can be either:
- Successful, execution passes without any problem encountered
- Failed, execution failed, and remaining gas should be consumed
- Reverted, execution failed, but only gas consumed so far is billed, remaining gas is refunded
When a call is either failed or reverted, the status_failed field
below is set to true. If the status is reverted, then both status_failed
and status_reverted are going to be set to true.
status_reverted: bool§failure_reason: StringPopulated when a call either failed or reverted, so when status_failed == true,
see above for details about those flags.
state_reverted: boolThis field represents whether or not the state changes performed by this call were correctly recorded by the blockchain.
On Ethereum, a transaction can record state changes even if some
of its inner nested calls failed. This is problematic however since
a call will invalidate all its state changes as well as all state
changes performed by its child call. This means that even if a call
has a status of SUCCESS, the chain might have reverted all the state
changes it performed.
Trx 1
Call #1 <Failed>
Call #2 <Execution Success>
Call #3 <Execution Success>
|--- Failure here
Call #4In the transaction above, while Call #2 and Call #3 would have the
status EXECUTED.
If you check all calls and check only state_reverted flag, you might be missing
some balance changes and nonce changes. This is because when a full transaction fails
in ethereum (e.g. calls.all(x.state_reverted == true)), there is still the transaction
fee that are recorded to the chain.
Refer to [TransactionTrace#status] field for more details about the handling you must perform.
begin_ordinal: u64Known Issues
-
Version 3:
- The block’s global ordinal when the call started executing, refer to [Block] documentation for further information about ordinals and total ordering.
- The transaction root call
begin_ordialis always0(also in the GENESIS block), which can cause issues when sorting by this field. To ensure proper execution order, set it as follows:trx.Calls\[0\].BeginOrdinal = trx.BeginOrdinal.
Fixed in
Version 4, see https://docs.substreams.dev/reference-material/chains-and-endpoints/ethereum-data-model for information about block versions.
end_ordinal: u64Known Issues
-
Version 3:
- The block’s global ordinal when the call finished executing, refer to [Block] documentation for further information about ordinals and total ordering.
- The root call of the GENESIS block is always
0. To fix it, you can set it as follows:rx.Calls\[0\].EndOrdinal = max.Uint64.
Fixed in
Version 4, see https://docs.substreams.dev/reference-material/chains-and-endpoints/ethereum-data-model for information about block versions.
account_creations: Vec<AccountCreation>Known Issues
- Version 4: AccountCreations are NOT SUPPORTED anymore. DO NOT rely on them.
Implementations§
Source§impl Call
impl Call
Sourcepub fn call_type(&self) -> CallType
pub fn call_type(&self) -> CallType
Returns the enum value of call_type, or the default if the field is set to an invalid enum value.
Sourcepub fn set_call_type(&mut self, value: CallType)
pub fn set_call_type(&mut self, value: CallType)
Sets call_type to the provided enum value.
Sourcepub fn address_delegates_to(&self) -> &[u8] ⓘ
pub fn address_delegates_to(&self) -> &[u8] ⓘ
Returns the value of address_delegates_to, or the default value if address_delegates_to is unset.
Trait Implementations§
Source§impl Message for Call
impl Message for Call
Source§fn encoded_len(&self) -> usize
fn encoded_len(&self) -> usize
Source§fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>where
Self: Sized,
fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>where
Self: Sized,
Source§fn encode_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
fn encode_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
Source§fn encode_length_delimited(
&self,
buf: &mut impl BufMut,
) -> Result<(), EncodeError>where
Self: Sized,
fn encode_length_delimited(
&self,
buf: &mut impl BufMut,
) -> Result<(), EncodeError>where
Self: Sized,
Source§fn encode_length_delimited_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
fn encode_length_delimited_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
Source§fn decode(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
fn decode(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
Source§fn decode_length_delimited(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
fn decode_length_delimited(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
Source§fn merge(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
fn merge(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
self. Read moreSource§fn merge_length_delimited(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
fn merge_length_delimited(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
self.