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}