iota_indexer/models/
address_metrics.rs

1// Copyright (c) Mysten Labs, Inc.
2// Modifications Copyright (c) 2024 IOTA Stiftung
3// SPDX-License-Identifier: Apache-2.0
4
5use std::collections::HashMap;
6
7use diesel::{prelude::*, sql_types::BigInt};
8use iota_json_rpc_types::AddressMetrics;
9
10use crate::schema::{active_addresses, address_metrics, addresses};
11
12/// Represents a sender or receiver address.
13#[derive(Clone, Debug, Queryable, Insertable)]
14#[diesel(table_name = addresses)]
15pub struct StoredAddress {
16    pub address: Vec<u8>,
17    pub first_appearance_tx: i64,
18    pub first_appearance_time: i64,
19    pub last_appearance_tx: i64,
20    pub last_appearance_time: i64,
21}
22
23/// Represents a sender address.
24#[derive(Clone, Debug, Queryable, Insertable)]
25#[diesel(table_name = active_addresses)]
26pub struct StoredActiveAddress {
27    pub address: Vec<u8>,
28    pub first_appearance_tx: i64,
29    pub first_appearance_time: i64,
30    pub last_appearance_tx: i64,
31    pub last_appearance_time: i64,
32}
33
34impl From<StoredAddress> for StoredActiveAddress {
35    fn from(address: StoredAddress) -> Self {
36        StoredActiveAddress {
37            address: address.address,
38            first_appearance_tx: address.first_appearance_tx,
39            first_appearance_time: address.first_appearance_time,
40            last_appearance_tx: address.last_appearance_tx,
41            last_appearance_time: address.last_appearance_time,
42        }
43    }
44}
45
46#[derive(Clone, Debug, Default, Queryable, Insertable, QueryableByName)]
47#[diesel(table_name = address_metrics)]
48pub struct StoredAddressMetrics {
49    #[diesel(sql_type = BigInt)]
50    pub checkpoint: i64,
51    #[diesel(sql_type = BigInt)]
52    pub epoch: i64,
53    #[diesel(sql_type = BigInt)]
54    pub timestamp_ms: i64,
55    #[diesel(sql_type = BigInt)]
56    pub cumulative_addresses: i64,
57    #[diesel(sql_type = BigInt)]
58    pub cumulative_active_addresses: i64,
59    #[diesel(sql_type = BigInt)]
60    pub daily_active_addresses: i64,
61}
62
63impl From<StoredAddressMetrics> for AddressMetrics {
64    fn from(metrics: StoredAddressMetrics) -> Self {
65        Self {
66            checkpoint: metrics.checkpoint as u64,
67            epoch: metrics.epoch as u64,
68            timestamp_ms: metrics.timestamp_ms as u64,
69            cumulative_addresses: metrics.cumulative_addresses as u64,
70            cumulative_active_addresses: metrics.cumulative_active_addresses as u64,
71            daily_active_addresses: metrics.daily_active_addresses as u64,
72        }
73    }
74}
75
76#[derive(Clone, Debug)]
77pub struct AddressInfoToCommit {
78    pub address: Vec<u8>,
79    pub tx_seq: i64,
80    pub timestamp_ms: i64,
81}
82
83pub fn dedup_addresses(addrs_to_commit: Vec<AddressInfoToCommit>) -> Vec<StoredAddress> {
84    let mut compressed_addr_map: HashMap<_, StoredAddress> = HashMap::new();
85    for addr_to_commit in addrs_to_commit {
86        let entry = compressed_addr_map
87            .entry(addr_to_commit.address.clone())
88            .or_insert_with(|| StoredAddress {
89                address: addr_to_commit.address.clone(),
90                first_appearance_time: addr_to_commit.timestamp_ms,
91                first_appearance_tx: addr_to_commit.tx_seq,
92                last_appearance_time: addr_to_commit.timestamp_ms,
93                last_appearance_tx: addr_to_commit.tx_seq,
94            });
95
96        if addr_to_commit.timestamp_ms < entry.first_appearance_time {
97            entry.first_appearance_time = addr_to_commit.timestamp_ms;
98            entry.first_appearance_tx = addr_to_commit.tx_seq;
99        }
100        if addr_to_commit.timestamp_ms > entry.last_appearance_time {
101            entry.last_appearance_time = addr_to_commit.timestamp_ms;
102            entry.last_appearance_tx = addr_to_commit.tx_seq;
103        }
104    }
105    compressed_addr_map.values().cloned().collect()
106}
107
108#[derive(Clone, Debug)]
109pub struct TxTimestampInfo {
110    pub tx_seq: i64,
111    pub timestamp_ms: i64,
112}