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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
use anchor_lang::{prelude::*, AnchorDeserialize, AnchorSerialize};
use clockwork_utils::thread::{ClockData, SerializableInstruction, Trigger};
pub const SEED_THREAD: &[u8] = b"thread";
#[account]
#[derive(Debug)]
pub struct Thread {
pub authority: Pubkey,
pub bump: u8,
pub created_at: ClockData,
pub exec_context: Option<ExecContext>,
pub fee: u64,
pub id: Vec<u8>,
pub instructions: Vec<SerializableInstruction>,
pub name: String,
pub next_instruction: Option<SerializableInstruction>,
pub paused: bool,
pub rate_limit: u64,
pub trigger: Trigger,
}
impl Thread {
pub fn pubkey(authority: Pubkey, id: Vec<u8>) -> Pubkey {
Pubkey::find_program_address(
&[SEED_THREAD, authority.as_ref(), id.as_slice()],
&crate::ID,
)
.0
}
}
impl PartialEq for Thread {
fn eq(&self, other: &Self) -> bool {
self.authority.eq(&other.authority) && self.id.eq(&other.id)
}
}
impl Eq for Thread {}
pub trait ThreadAccount {
fn pubkey(&self) -> Pubkey;
fn realloc(&mut self) -> Result<()>;
}
impl ThreadAccount for Account<'_, Thread> {
fn pubkey(&self) -> Pubkey {
Thread::pubkey(self.authority, self.id.clone())
}
fn realloc(&mut self) -> Result<()> {
let data_len = 8 + self.try_to_vec()?.len();
self.to_account_info().realloc(data_len, false)?;
Ok(())
}
}
#[derive(AnchorDeserialize, AnchorSerialize, Clone, Copy, Debug, PartialEq, Eq)]
pub struct ExecContext {
pub exec_index: u64,
pub execs_since_reimbursement: u64,
pub execs_since_slot: u64,
pub last_exec_at: u64,
pub trigger_context: TriggerContext,
}
#[derive(AnchorDeserialize, AnchorSerialize, Clone, Copy, Debug, PartialEq, Eq)]
pub enum TriggerContext {
Account {
data_hash: u64,
},
Cron {
started_at: i64,
},
Now,
Slot {
started_at: u64,
},
Epoch {
started_at: u64,
},
}
#[derive(AnchorSerialize, AnchorDeserialize)]
pub struct ThreadSettings {
pub fee: Option<u64>,
pub instructions: Option<Vec<SerializableInstruction>>,
pub name: Option<String>,
pub rate_limit: Option<u64>,
pub trigger: Option<Trigger>,
}