1use 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}