-
Notifications
You must be signed in to change notification settings - Fork 289
Expand file tree
/
Copy pathautomation.rs
More file actions
100 lines (79 loc) · 2.81 KB
/
Copy pathautomation.rs
File metadata and controls
100 lines (79 loc) · 2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
use ore_mint_api::consts::ONE_ORE;
use serde::{Deserialize, Serialize};
use steel::*;
use crate::state::{automation_pda, OreAccount};
#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Pod, Zeroable, Serialize, Deserialize)]
pub struct Automation {
/// The amount of SOL to deploy on each territory per round.
pub amount: u64,
/// The authority of this automation account.
pub authority: Pubkey,
/// The amount of SOL this automation has left.
pub balance: u64,
/// The executor of this automation account.
pub executor: Pubkey,
/// The amount of SOL the executor should receive in fees.
pub fee: u64,
/// The strategy this automation uses.
pub strategy: u64,
/// The mask of squares this automation should deploy to if preferred strategy.
/// If strategy is Random, first bit is used to determine how many squares to deploy to.
pub mask: u64,
/// Whether or not to auto-reload SOL winnings into the automation balance.
pub reload: u64,
/// The total SOL spent (lost to fees) by this automation.
pub total_sol_spent: u64,
/// The total ORE earned by this automation.
pub total_ore_earned: u64,
/// Conditions that must be met for the automation to deploy.
pub conditions: AutomationConditions,
}
/// Conditions that gate whether an automation deploys in a given round.
#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Pod, Zeroable, Serialize, Deserialize)]
pub struct AutomationConditions {
/// Max production cost EMA (lamports per whole ORE). Deploy blocked if EMA exceeds this.
/// Default: u64::MAX (no upper bound).
pub max_production_cost: u64,
/// Min motherlode amount (ORE units). Deploy blocked if motherlode is below this.
/// Default: 0 (no lower bound).
pub min_motherlode: u64,
/// Max motherlode amount (ORE units). Deploy blocked if motherlode exceeds this.
/// Default: u64::MAX (no upper bound).
pub max_motherlode: u64,
}
#[repr(u8)]
#[derive(Clone, Copy, Debug, PartialEq, IntoPrimitive, TryFromPrimitive)]
pub enum AutomationStrategy {
Random = 0,
Preferred = 1,
Discretionary = 2,
}
impl AutomationStrategy {
pub fn from_u64(value: u64) -> Self {
Self::try_from(value as u8).unwrap()
}
}
impl Default for AutomationConditions {
fn default() -> Self {
Self {
max_production_cost: u64::MAX,
min_motherlode: 0,
max_motherlode: u64::MAX,
}
}
}
impl Automation {
pub fn pda(&self) -> (Pubkey, u8) {
automation_pda(self.authority)
}
pub fn production_cost(&self) -> u64 {
if self.total_ore_earned == 0 {
return 0;
}
((self.total_sol_spent as u128) * (ONE_ORE as u128) / (self.total_ore_earned as u128))
as u64
}
}
account!(OreAccount, Automation);