iota_indexer/models/
tx_indices.rs

1// Copyright (c) Mysten Labs, Inc.
2// Modifications Copyright (c) 2024 IOTA Stiftung
3// SPDX-License-Identifier: Apache-2.0
4
5use diesel::prelude::*;
6
7use crate::{
8    schema::{
9        optimistic_tx_calls_fun, optimistic_tx_calls_mod, optimistic_tx_calls_pkg,
10        optimistic_tx_changed_objects, optimistic_tx_input_objects, optimistic_tx_kinds,
11        optimistic_tx_recipients, optimistic_tx_senders, tx_calls_fun, tx_calls_mod, tx_calls_pkg,
12        tx_changed_objects, tx_digests, tx_input_objects, tx_kinds, tx_recipients, tx_senders,
13    },
14    types::TxIndex,
15};
16
17#[derive(QueryableByName)]
18pub struct TxSequenceNumber {
19    #[diesel(sql_type = diesel::sql_types::BigInt)]
20    pub tx_sequence_number: i64,
21}
22
23#[derive(QueryableByName)]
24pub struct TxDigest {
25    #[diesel(sql_type = diesel::sql_types::Binary)]
26    pub transaction_digest: Vec<u8>,
27}
28
29#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
30#[diesel(table_name = tx_senders)]
31pub struct StoredTxSenders {
32    pub tx_sequence_number: i64,
33    pub sender: Vec<u8>,
34}
35
36#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
37#[diesel(table_name = tx_recipients)]
38pub struct StoredTxRecipients {
39    pub tx_sequence_number: i64,
40    pub recipient: Vec<u8>,
41    pub sender: Vec<u8>,
42}
43
44#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
45#[diesel(table_name = tx_input_objects)]
46pub struct StoredTxInputObject {
47    pub tx_sequence_number: i64,
48    pub object_id: Vec<u8>,
49    pub sender: Vec<u8>,
50}
51
52#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
53#[diesel(table_name = tx_changed_objects)]
54pub struct StoredTxChangedObject {
55    pub tx_sequence_number: i64,
56    pub object_id: Vec<u8>,
57    pub sender: Vec<u8>,
58}
59
60#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
61#[diesel(table_name = tx_calls_pkg)]
62pub struct StoredTxPkg {
63    pub tx_sequence_number: i64,
64    pub package: Vec<u8>,
65    pub sender: Vec<u8>,
66}
67
68#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
69#[diesel(table_name = tx_calls_mod)]
70pub struct StoredTxMod {
71    pub tx_sequence_number: i64,
72    pub package: Vec<u8>,
73    pub module: String,
74    pub sender: Vec<u8>,
75}
76
77#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
78#[diesel(table_name = tx_calls_fun)]
79pub struct StoredTxFun {
80    pub tx_sequence_number: i64,
81    pub package: Vec<u8>,
82    pub module: String,
83    pub func: String,
84    pub sender: Vec<u8>,
85}
86
87#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
88#[diesel(table_name = tx_digests)]
89pub struct StoredTxDigest {
90    pub tx_digest: Vec<u8>,
91    pub tx_sequence_number: i64,
92}
93
94#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
95#[diesel(table_name = tx_kinds)]
96pub struct StoredTxKind {
97    pub tx_kind: i16,
98    pub tx_sequence_number: i64,
99}
100
101#[expect(clippy::type_complexity)]
102impl TxIndex {
103    pub fn split(
104        self: TxIndex,
105    ) -> (
106        Vec<StoredTxSenders>,
107        Vec<StoredTxRecipients>,
108        Vec<StoredTxInputObject>,
109        Vec<StoredTxChangedObject>,
110        Vec<StoredTxPkg>,
111        Vec<StoredTxMod>,
112        Vec<StoredTxFun>,
113        Vec<StoredTxDigest>,
114        Vec<StoredTxKind>,
115    ) {
116        let tx_sequence_number = self.tx_sequence_number as i64;
117        let tx_sender = StoredTxSenders {
118            tx_sequence_number,
119            sender: self.sender.to_vec(),
120        };
121        let tx_recipients = self
122            .recipients
123            .iter()
124            .map(|s| StoredTxRecipients {
125                tx_sequence_number,
126                recipient: s.to_vec(),
127                sender: self.sender.to_vec(),
128            })
129            .collect();
130        let tx_input_objects = self
131            .input_objects
132            .iter()
133            .map(|o| StoredTxInputObject {
134                tx_sequence_number,
135                object_id: bcs::to_bytes(&o).unwrap(),
136                sender: self.sender.to_vec(),
137            })
138            .collect();
139        let tx_changed_objects = self
140            .changed_objects
141            .iter()
142            .map(|o| StoredTxChangedObject {
143                tx_sequence_number,
144                object_id: bcs::to_bytes(&o).unwrap(),
145                sender: self.sender.to_vec(),
146            })
147            .collect();
148
149        let mut packages = Vec::new();
150        let mut packages_modules = Vec::new();
151        let mut packages_modules_funcs = Vec::new();
152
153        for (pkg, pkg_mod, pkg_mod_func) in self
154            .move_calls
155            .iter()
156            .map(|(p, m, f)| (*p, (*p, m.clone()), (*p, m.clone(), f.clone())))
157        {
158            packages.push(pkg);
159            packages_modules.push(pkg_mod);
160            packages_modules_funcs.push(pkg_mod_func);
161        }
162
163        let tx_pkgs = packages
164            .iter()
165            .map(|p| StoredTxPkg {
166                tx_sequence_number,
167                package: p.to_vec(),
168                sender: self.sender.to_vec(),
169            })
170            .collect();
171
172        let tx_mods = packages_modules
173            .iter()
174            .map(|(p, m)| StoredTxMod {
175                tx_sequence_number,
176                package: p.to_vec(),
177                module: m.to_string(),
178                sender: self.sender.to_vec(),
179            })
180            .collect();
181
182        let tx_calls = packages_modules_funcs
183            .iter()
184            .map(|(p, m, f)| StoredTxFun {
185                tx_sequence_number,
186                package: p.to_vec(),
187                module: m.to_string(),
188                func: f.to_string(),
189                sender: self.sender.to_vec(),
190            })
191            .collect();
192
193        let stored_tx_digest = StoredTxDigest {
194            tx_digest: self.transaction_digest.into_inner().to_vec(),
195            tx_sequence_number,
196        };
197
198        let tx_kind = StoredTxKind {
199            tx_kind: self.tx_kind as i16,
200            tx_sequence_number,
201        };
202
203        (
204            vec![tx_sender],
205            tx_recipients,
206            tx_input_objects,
207            tx_changed_objects,
208            tx_pkgs,
209            tx_mods,
210            tx_calls,
211            vec![stored_tx_digest],
212            vec![tx_kind],
213        )
214    }
215}
216
217#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
218#[diesel(table_name = optimistic_tx_senders)]
219pub struct OptimisticTxSenders {
220    pub tx_insertion_order: i64,
221    pub sender: Vec<u8>,
222}
223
224#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
225#[diesel(table_name = optimistic_tx_recipients)]
226pub struct OptimisticTxRecipients {
227    pub tx_insertion_order: i64,
228    pub recipient: Vec<u8>,
229    pub sender: Vec<u8>,
230}
231
232#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
233#[diesel(table_name = optimistic_tx_input_objects)]
234pub struct OptimisticTxInputObject {
235    pub tx_insertion_order: i64,
236    pub object_id: Vec<u8>,
237    pub sender: Vec<u8>,
238}
239
240#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
241#[diesel(table_name = optimistic_tx_changed_objects)]
242pub struct OptimisticTxChangedObject {
243    pub tx_insertion_order: i64,
244    pub object_id: Vec<u8>,
245    pub sender: Vec<u8>,
246}
247
248#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
249#[diesel(table_name = optimistic_tx_calls_pkg)]
250pub struct OptimisticTxPkg {
251    pub tx_insertion_order: i64,
252    pub package: Vec<u8>,
253    pub sender: Vec<u8>,
254}
255
256#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
257#[diesel(table_name = optimistic_tx_calls_mod)]
258pub struct OptimisticTxMod {
259    pub tx_insertion_order: i64,
260    pub package: Vec<u8>,
261    pub module: String,
262    pub sender: Vec<u8>,
263}
264
265#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
266#[diesel(table_name = optimistic_tx_calls_fun)]
267pub struct OptimisticTxFun {
268    pub tx_insertion_order: i64,
269    pub package: Vec<u8>,
270    pub module: String,
271    pub func: String,
272    pub sender: Vec<u8>,
273}
274
275#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
276#[diesel(table_name = optimistic_tx_kinds)]
277pub struct OptimisticTxKind {
278    pub tx_kind: i16,
279    pub tx_insertion_order: i64,
280}
281
282optimistic_from_into_checkpoint!(OptimisticTxSenders, StoredTxSenders, { sender });
283optimistic_from_into_checkpoint!(OptimisticTxRecipients, StoredTxRecipients, { recipient, sender });
284optimistic_from_into_checkpoint!(OptimisticTxInputObject, StoredTxInputObject, { object_id, sender });
285optimistic_from_into_checkpoint!(OptimisticTxChangedObject, StoredTxChangedObject, { object_id, sender });
286optimistic_from_into_checkpoint!(OptimisticTxPkg, StoredTxPkg, { package, sender });
287optimistic_from_into_checkpoint!(OptimisticTxMod, StoredTxMod, { package, module, sender });
288optimistic_from_into_checkpoint!(OptimisticTxFun, StoredTxFun, { package, module, func, sender });
289optimistic_from_into_checkpoint!(OptimisticTxKind, StoredTxKind, { tx_kind });
290
291pub struct OptimisticTxIndices {
292    pub optimistic_tx_senders: Vec<OptimisticTxSenders>,
293    pub optimistic_tx_recipients: Vec<OptimisticTxRecipients>,
294    pub optimistic_tx_input_objects: Vec<OptimisticTxInputObject>,
295    pub optimistic_tx_changed_objects: Vec<OptimisticTxChangedObject>,
296    pub optimistic_tx_pkgs: Vec<OptimisticTxPkg>,
297    pub optimistic_tx_mods: Vec<OptimisticTxMod>,
298    pub optimistic_tx_funs: Vec<OptimisticTxFun>,
299    pub optimistic_tx_kinds: Vec<OptimisticTxKind>,
300}