sui_indexer_alt_schema/
transactions.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use 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 whose balance changed
24        owner: Owner,
25
26        /// Type of the Coin (just the one-time witness type).
27        coin_type: String,
28
29        /// The amount the balance changed by. A negative amount means the net flow of value is
30        /// from the owner, and a positive amount means the net flow of value is to the owner.
31        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    /// Address affected by the transaction, including the sender, the gas payer
52    /// and any recipients of objects.
53    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    /// Object affected by the transaction, including deleted, wrapped, mutated,
62    /// and created objects.
63    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}