Skip to main content

miner_api/
state.rs

1use bytemuck::{Pod, Zeroable};
2
3/// Dyskryminatory kont.
4pub const CONFIG_DISCRIMINATOR: u64 = 1;
5pub const ROUND_DISCRIMINATOR: u64 = 2;
6pub const MINER_DISCRIMINATOR: u64 = 3;
7
8/// Globalna konfiguracja programu (PDA "config", singleton).
9#[repr(C)]
10#[derive(Clone, Copy, Debug, Pod, Zeroable)]
11pub struct Config {
12    pub discriminator: u64,
13    /// Admin (update_config). Docelowo multisig/timelock.
14    pub admin: [u8; 32],
15    /// Mint tokena (mint authority = PDA "treasury").
16    pub mint: [u8; 32],
17    /// Indeks bieżącej (otwartej) rundy.
18    pub current_round: u64,
19    /// Timestamp startu bieżącej rundy.
20    pub round_start_ts: i64,
21    /// Minimalna trudność hasha (wiodące bity zerowe).
22    pub min_difficulty: u64,
23    /// Waga bazowa free tier w natywnych jednostkach tokena
24    /// (~$1; docelowo aktualizowana z EMA ceny poola).
25    pub base_weight: u64,
26    /// Długość rundy w sekundach (kadencja submitów; budżet rundy
27    /// skaluje się pro-rata, więc emisja/min jest stała).
28    pub round_seconds: u64,
29    /// Bump PDA config.
30    pub config_bump: u64,
31    /// Bump PDA treasury.
32    pub treasury_bump: u64,
33}
34
35/// Jedna runda dystrybucji (PDA "round" + index LE).
36/// Runda jest otwarta gdy index == config.current_round; rozliczalna gdy
37/// index < config.current_round; zamykalna (odzysk rentu) po ROUND_RETENTION.
38#[repr(C)]
39#[derive(Clone, Copy, Debug, Pod, Zeroable)]
40pub struct Round {
41    pub discriminator: u64,
42    pub index: u64,
43    /// Suma wag wszystkich submitów w rundzie (jednostki natywne tokena).
44    pub total_weight: u64,
45    /// Timestamp otwarcia rundy.
46    pub start_ts: i64,
47    /// Budżet emisji rundy (zamrożony przy otwarciu z config.round_seconds,
48    /// żeby zmiana kadencji nie ruszała rozliczeń starych rund).
49    pub budget: u64,
50}
51
52/// Konto minera (PDA "miner" + authority).
53#[repr(C)]
54#[derive(Clone, Copy, Debug, Pod, Zeroable)]
55pub struct Miner {
56    pub discriminator: u64,
57    /// Wallet-właściciel (burner z przeglądarki albo podłączony wallet).
58    pub authority: [u8; 32],
59    /// Session key uprawniony do submitów (zero = brak).
60    pub session_key: [u8; 32],
61    /// Bieżące challenge PoW.
62    pub challenge: [u8; 32],
63    /// Indeks rundy ostatniego submitu.
64    pub last_round: u64,
65    /// Waga zgłoszona w rundzie last_round (nierozliczona, jeśli > 0).
66    pub last_round_weight: u64,
67    /// Saldo tokenów przy ostatnim submicie (reguła min-salda / anty-cycling).
68    pub last_balance: u64,
69    /// Naliczone, nieodebrane nagrody (jednostki natywne).
70    pub pending_rewards: u64,
71    /// Statystyki lifetime.
72    pub total_mined: u64,
73    pub total_hashes: u64,
74    /// Bump PDA.
75    pub bump: u64,
76}
77
78impl Config {
79    pub const SIZE: usize = core::mem::size_of::<Config>();
80}
81impl Round {
82    pub const SIZE: usize = core::mem::size_of::<Round>();
83}
84impl Miner {
85    pub const SIZE: usize = core::mem::size_of::<Miner>();
86}