sui_indexer/models/
tx_indices.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use crate::{
5    schema::{
6        tx_affected_addresses, tx_affected_objects, tx_calls_fun, tx_calls_mod, tx_calls_pkg,
7        tx_changed_objects, tx_digests, tx_input_objects, tx_kinds,
8    },
9    types::TxIndex,
10};
11use diesel::prelude::*;
12use itertools::Itertools;
13
14#[derive(QueryableByName)]
15pub struct TxSequenceNumber {
16    #[diesel(sql_type = diesel::sql_types::BigInt)]
17    pub tx_sequence_number: i64,
18}
19
20#[derive(QueryableByName)]
21pub struct TxDigest {
22    #[diesel(sql_type = diesel::sql_types::Binary)]
23    pub transaction_digest: Vec<u8>,
24}
25
26#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
27#[diesel(table_name = tx_affected_addresses)]
28pub struct StoredTxAffectedAddresses {
29    pub tx_sequence_number: i64,
30    pub affected: Vec<u8>,
31    pub sender: Vec<u8>,
32}
33
34#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
35#[diesel(table_name = tx_affected_objects)]
36pub struct StoredTxAffectedObjects {
37    pub tx_sequence_number: i64,
38    pub affected: Vec<u8>,
39    pub sender: Vec<u8>,
40}
41
42#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
43#[diesel(table_name = tx_input_objects)]
44pub struct StoredTxInputObject {
45    pub tx_sequence_number: i64,
46    pub object_id: Vec<u8>,
47    pub sender: Vec<u8>,
48}
49
50#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
51#[diesel(table_name = tx_changed_objects)]
52pub struct StoredTxChangedObject {
53    pub tx_sequence_number: i64,
54    pub object_id: Vec<u8>,
55    pub sender: Vec<u8>,
56}
57
58#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
59#[diesel(table_name = tx_calls_pkg)]
60pub struct StoredTxPkg {
61    pub tx_sequence_number: i64,
62    pub package: Vec<u8>,
63    pub sender: Vec<u8>,
64}
65
66#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
67#[diesel(table_name = tx_calls_mod)]
68pub struct StoredTxMod {
69    pub tx_sequence_number: i64,
70    pub package: Vec<u8>,
71    pub module: String,
72    pub sender: Vec<u8>,
73}
74
75#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
76#[diesel(table_name = tx_calls_fun)]
77pub struct StoredTxFun {
78    pub tx_sequence_number: i64,
79    pub package: Vec<u8>,
80    pub module: String,
81    pub func: String,
82    pub sender: Vec<u8>,
83}
84
85#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
86#[diesel(table_name = tx_digests)]
87pub struct StoredTxDigest {
88    pub tx_digest: Vec<u8>,
89    pub tx_sequence_number: i64,
90}
91
92#[derive(Queryable, Insertable, Selectable, Debug, Clone, Default)]
93#[diesel(table_name = tx_kinds)]
94pub struct StoredTxKind {
95    pub tx_kind: i16,
96    pub tx_sequence_number: i64,
97}
98
99#[allow(clippy::type_complexity)]
100impl TxIndex {
101    pub fn split(
102        self: TxIndex,
103    ) -> (
104        Vec<StoredTxAffectedAddresses>,
105        Vec<StoredTxAffectedObjects>,
106        Vec<StoredTxInputObject>,
107        Vec<StoredTxChangedObject>,
108        Vec<StoredTxPkg>,
109        Vec<StoredTxMod>,
110        Vec<StoredTxFun>,
111        Vec<StoredTxDigest>,
112        Vec<StoredTxKind>,
113    ) {
114        let tx_sequence_number = self.tx_sequence_number as i64;
115
116        let tx_affected_addresses = self
117            .recipients
118            .iter()
119            .chain(self.payers.iter())
120            .chain(std::iter::once(&self.sender))
121            .unique()
122            .map(|a| StoredTxAffectedAddresses {
123                tx_sequence_number,
124                affected: a.to_vec(),
125                sender: self.sender.to_vec(),
126            })
127            .collect();
128
129        let tx_affected_objects = self
130            .affected_objects
131            .iter()
132            .map(|o| StoredTxAffectedObjects {
133                tx_sequence_number,
134                affected: o.to_vec(),
135                sender: self.sender.to_vec(),
136            })
137            .collect();
138
139        let tx_input_objects = self
140            .input_objects
141            .iter()
142            .map(|o| StoredTxInputObject {
143                tx_sequence_number,
144                object_id: bcs::to_bytes(&o).unwrap(),
145                sender: self.sender.to_vec(),
146            })
147            .collect();
148
149        let tx_changed_objects = self
150            .changed_objects
151            .iter()
152            .map(|o| StoredTxChangedObject {
153                tx_sequence_number,
154                object_id: bcs::to_bytes(&o).unwrap(),
155                sender: self.sender.to_vec(),
156            })
157            .collect();
158
159        let mut packages = Vec::new();
160        let mut packages_modules = Vec::new();
161        let mut packages_modules_funcs = Vec::new();
162
163        for (pkg, pkg_mod, pkg_mod_func) in self
164            .move_calls
165            .iter()
166            .map(|(p, m, f)| (*p, (*p, m.clone()), (*p, m.clone(), f.clone())))
167        {
168            packages.push(pkg);
169            packages_modules.push(pkg_mod);
170            packages_modules_funcs.push(pkg_mod_func);
171        }
172
173        let tx_pkgs = packages
174            .iter()
175            .map(|p| StoredTxPkg {
176                tx_sequence_number,
177                package: p.to_vec(),
178                sender: self.sender.to_vec(),
179            })
180            .collect();
181
182        let tx_mods = packages_modules
183            .iter()
184            .map(|(p, m)| StoredTxMod {
185                tx_sequence_number,
186                package: p.to_vec(),
187                module: m.to_string(),
188                sender: self.sender.to_vec(),
189            })
190            .collect();
191
192        let tx_calls = packages_modules_funcs
193            .iter()
194            .map(|(p, m, f)| StoredTxFun {
195                tx_sequence_number,
196                package: p.to_vec(),
197                module: m.to_string(),
198                func: f.to_string(),
199                sender: self.sender.to_vec(),
200            })
201            .collect();
202
203        let stored_tx_digest = StoredTxDigest {
204            tx_digest: self.transaction_digest.into_inner().to_vec(),
205            tx_sequence_number,
206        };
207
208        let tx_kind = StoredTxKind {
209            tx_kind: self.tx_kind as i16,
210            tx_sequence_number,
211        };
212
213        (
214            tx_affected_addresses,
215            tx_affected_objects,
216            tx_input_objects,
217            tx_changed_objects,
218            tx_pkgs,
219            tx_mods,
220            tx_calls,
221            vec![stored_tx_digest],
222            vec![tx_kind],
223        )
224    }
225}