axiom_codec/types/
native.rs

1use axiom_eth::halo2curves::bn256::G1Affine;
2use ethers_core::types::{Address, Bytes, H256, U256};
3use serde::{Deserialize, Serialize};
4use serde_repr::{Deserialize_repr, Serialize_repr};
5
6#[derive(Clone, Debug, Serialize, Deserialize, Hash)]
7#[serde(rename_all = "camelCase")]
8pub struct AxiomV2ComputeQuery {
9    pub k: u8,
10    pub result_len: u16,
11    // Should be bytes32[]
12    /// The onchain vkey
13    pub vkey: Vec<H256>,
14    /// This is actually the concatenation of public instances and proof transcript
15    pub compute_proof: Bytes,
16}
17
18#[derive(Clone, Debug)]
19pub struct AxiomV2ComputeSnark {
20    /// (lhs G1 of pairing, rhs G1 of pairing) if this snark is from an aggregation circuit.
21    pub kzg_accumulator: Option<(G1Affine, G1Affine)>,
22    pub compute_results: Vec<H256>,
23    pub proof_transcript: Vec<u8>,
24}
25
26#[derive(Clone, Debug, Serialize, Deserialize, Hash)]
27#[serde(rename_all = "camelCase")]
28pub struct AxiomV2DataQuery {
29    pub source_chain_id: u64,
30    pub subqueries: Vec<Subquery>,
31}
32
33#[derive(Clone, Debug, Serialize, Deserialize, Hash)]
34#[serde(rename_all = "camelCase")]
35pub struct SubqueryResult {
36    pub subquery: Subquery,
37    /// The output of the subquery. In V2, always bytes32.
38    pub value: Bytes,
39}
40
41impl Default for SubqueryResult {
42    fn default() -> Self {
43        Self { subquery: Subquery::default(), value: Bytes::from([0u8; 32]) }
44    }
45}
46
47#[derive(Clone, Debug, Default, Serialize, Deserialize, Hash, PartialEq, Eq, PartialOrd, Ord)]
48#[serde(rename_all = "camelCase")]
49pub struct Subquery {
50    /// uint16 type of subquery
51    pub subquery_type: SubqueryType,
52    /// Subquery data encoded, _without_ the subquery type. Length is variable and **not** resized.
53    pub encoded_subquery_data: Bytes,
54}
55
56#[derive(
57    Clone,
58    Copy,
59    Debug,
60    Default,
61    Serialize_repr,
62    Deserialize_repr,
63    Hash,
64    PartialEq,
65    Eq,
66    PartialOrd,
67    Ord,
68)]
69#[repr(u16)]
70pub enum SubqueryType {
71    #[default]
72    Null = 0, // For lookup tables, important to have a null type
73    Header = 1,
74    Account = 2,
75    Storage = 3,
76    Transaction = 4,
77    Receipt = 5,
78    SolidityNestedMapping = 6,
79    // BeaconValidator = 7,
80}
81
82#[derive(Clone, Debug, Serialize, Deserialize, Hash, PartialEq, Eq, PartialOrd, Ord)]
83pub enum AnySubquery {
84    Null,
85    Header(HeaderSubquery),
86    Account(AccountSubquery),
87    Storage(StorageSubquery),
88    Transaction(TxSubquery),
89    Receipt(ReceiptSubquery),
90    SolidityNestedMapping(SolidityNestedMappingSubquery),
91}
92
93#[derive(Clone, Debug, Serialize, Deserialize, Hash, PartialEq, Eq, PartialOrd, Ord)]
94#[serde(rename_all = "camelCase")]
95pub struct HeaderSubquery {
96    pub block_number: u32,
97    pub field_idx: u32,
98}
99
100#[derive(Clone, Debug, Serialize, Deserialize, Hash, PartialEq, Eq, PartialOrd, Ord)]
101#[serde(rename_all = "camelCase")]
102pub struct AccountSubquery {
103    pub block_number: u32,
104    pub addr: Address,
105    pub field_idx: u32,
106}
107
108#[derive(Clone, Debug, Serialize, Deserialize, Hash, PartialEq, Eq, PartialOrd, Ord)]
109#[serde(rename_all = "camelCase")]
110pub struct StorageSubquery {
111    pub block_number: u32,
112    pub addr: Address,
113    pub slot: U256,
114}
115
116#[derive(Clone, Debug, Serialize, Deserialize, Hash, PartialEq, Eq, PartialOrd, Ord)]
117#[serde(rename_all = "camelCase")]
118pub struct TxSubquery {
119    /// The block number with the requested transaction.
120    pub block_number: u32,
121    /// The index of the transaction in the block.
122    pub tx_idx: u16,
123    /// Special index to specify what subquery value to extract from the transaction.
124    pub field_or_calldata_idx: u32,
125}
126
127#[derive(Clone, Debug, Serialize, Deserialize, Hash, PartialEq, Eq, PartialOrd, Ord)]
128#[serde(rename_all = "camelCase")]
129pub struct ReceiptSubquery {
130    /// The block number with the requested transaction.
131    pub block_number: u32,
132    /// The index of the transaction in the block.
133    pub tx_idx: u16,
134    /// Special index to specify what subquery value to extract from the transaction.
135    pub field_or_log_idx: u32,
136    pub topic_or_data_or_address_idx: u32,
137    pub event_schema: H256,
138}
139
140#[derive(Clone, Debug, Serialize, Deserialize, Hash, PartialEq, Eq, PartialOrd, Ord)]
141#[serde(rename_all = "camelCase")]
142pub struct SolidityNestedMappingSubquery {
143    pub block_number: u32,
144    pub addr: Address,
145    pub mapping_slot: U256,
146    /// Should be equal to `keys.len()`
147    pub mapping_depth: u8,
148    pub keys: Vec<H256>,
149}