1use crate::schema::{
5 kv_transactions, tx_affected_addresses, tx_affected_objects, tx_balance_changes, tx_calls,
6 tx_digests, tx_kinds,
7};
8use diesel::{
9 backend::Backend,
10 deserialize::{self, FromSqlRow},
11 expression::AsExpression,
12 prelude::*,
13 serialize,
14 sql_types::SmallInt,
15};
16use serde::{Deserialize, Serialize};
17use sui_field_count::FieldCount;
18use sui_types::object::Owner;
19
20#[derive(Debug, Clone, Serialize, Deserialize)]
21pub enum BalanceChange {
22 V1 {
23 owner: Owner,
25
26 coin_type: String,
28
29 amount: i128,
32 },
33}
34
35#[derive(Insertable, Debug, Clone, FieldCount, Queryable)]
36#[diesel(table_name = kv_transactions)]
37pub struct StoredTransaction {
38 pub tx_digest: Vec<u8>,
39 pub cp_sequence_number: i64,
40 pub timestamp_ms: i64,
41 pub raw_transaction: Vec<u8>,
42 pub raw_effects: Vec<u8>,
43 pub events: Vec<u8>,
44 pub user_signatures: Vec<u8>,
45}
46
47#[derive(Insertable, Debug, Clone, FieldCount, Queryable)]
48#[diesel(table_name = tx_affected_addresses)]
49pub struct StoredTxAffectedAddress {
50 pub tx_sequence_number: i64,
51 pub affected: Vec<u8>,
54 pub sender: Vec<u8>,
55}
56
57#[derive(Insertable, Debug, Clone, FieldCount, Queryable)]
58#[diesel(table_name = tx_affected_objects)]
59pub struct StoredTxAffectedObject {
60 pub tx_sequence_number: i64,
61 pub affected: Vec<u8>,
64 pub sender: Vec<u8>,
65}
66
67#[derive(Insertable, Selectable, Debug, Clone, FieldCount, Queryable)]
68#[diesel(table_name = tx_balance_changes)]
69pub struct StoredTxBalanceChange {
70 pub tx_sequence_number: i64,
71 pub balance_changes: Vec<u8>,
72}
73
74#[derive(Insertable, Debug, Clone, FieldCount, Queryable)]
75#[diesel(table_name = tx_calls)]
76pub struct StoredTxCalls {
77 pub package: Vec<u8>,
78 pub module: String,
79 pub function: String,
80 pub tx_sequence_number: i64,
81 pub sender: Vec<u8>,
82}
83
84#[derive(Insertable, Debug, Clone, FieldCount, Queryable)]
85#[diesel(table_name = tx_digests)]
86pub struct StoredTxDigest {
87 pub tx_sequence_number: i64,
88 pub tx_digest: Vec<u8>,
89}
90
91#[derive(AsExpression, FromSqlRow, Copy, Clone, Debug)]
92#[diesel(sql_type = SmallInt)]
93#[repr(i16)]
94pub enum StoredKind {
95 SystemTransaction = 0,
96 ProgrammableTransaction = 1,
97}
98
99#[derive(Insertable, Debug, Clone, FieldCount, Queryable)]
100#[diesel(table_name = tx_kinds)]
101pub struct StoredTxKind {
102 pub tx_sequence_number: i64,
103 pub tx_kind: StoredKind,
104}
105
106impl<DB: Backend> serialize::ToSql<SmallInt, DB> for StoredKind
107where
108 i16: serialize::ToSql<SmallInt, DB>,
109{
110 fn to_sql<'b>(&'b self, out: &mut serialize::Output<'b, '_, DB>) -> serialize::Result {
111 match self {
112 StoredKind::SystemTransaction => 0.to_sql(out),
113 StoredKind::ProgrammableTransaction => 1.to_sql(out),
114 }
115 }
116}
117
118impl<DB: Backend> deserialize::FromSql<SmallInt, DB> for StoredKind
119where
120 i16: deserialize::FromSql<SmallInt, DB>,
121{
122 fn from_sql(raw: DB::RawValue<'_>) -> deserialize::Result<Self> {
123 Ok(match i16::from_sql(raw)? {
124 0 => StoredKind::SystemTransaction,
125 1 => StoredKind::ProgrammableTransaction,
126 k => return Err(format!("Unexpected StoredTxKind: {k}").into()),
127 })
128 }
129}