warp_controller/
state.rs

1use warp_controller_pkg::account::Account;
2use cosmwasm_std::Addr;
3use cw_storage_plus::{Index, IndexList, IndexedMap, Item, MultiIndex, UniqueIndex};
4
5use warp_controller_pkg::job::Job;
6use warp_controller_pkg::{Config, State};
7
8pub struct JobIndexes<'a> {
9    pub reward: UniqueIndex<'a, (u128, u64), Job>,
10    pub publish_time: MultiIndex<'a, u64, Job, u64>,
11}
12
13impl IndexList<Job> for JobIndexes<'_> {
14    fn get_indexes(&'_ self) -> Box<dyn Iterator<Item = &'_ dyn Index<Job>> + '_> {
15        let v: Vec<&dyn Index<Job>> = vec![&self.reward, &self.publish_time];
16        Box::new(v.into_iter())
17    }
18}
19
20#[allow(non_snake_case)]
21pub fn PENDING_JOBS<'a>() -> IndexedMap<'a, u64, Job, JobIndexes<'a>> {
22    let indexes = JobIndexes {
23        reward: UniqueIndex::new(
24            |job| (job.reward.u128(), job.id.u64()),
25            "pending_jobs__reward_v3",
26        ),
27        publish_time: MultiIndex::new(
28            |_pk, job| job.last_update_time.u64(),
29            "pending_jobs_v3",
30            "pending_jobs__publish_timestamp_v3",
31        ),
32    };
33    IndexedMap::new("pending_jobs_v3", indexes)
34}
35
36#[allow(non_snake_case)]
37pub fn FINISHED_JOBS<'a>() -> IndexedMap<'a, u64, Job, JobIndexes<'a>> {
38    let indexes = JobIndexes {
39        reward: UniqueIndex::new(
40            |job| (job.reward.u128(), job.id.u64()),
41            "finished_jobs__reward_v3",
42        ),
43        publish_time: MultiIndex::new(
44            |_pk, job| job.last_update_time.u64(),
45            "finished_jobs_v3",
46            "finished_jobs__publish_timestamp_v3",
47        ),
48    };
49    IndexedMap::new("finished_jobs_v3", indexes)
50}
51
52pub struct AccountIndexes<'a> {
53    pub account: UniqueIndex<'a, Addr, Account>,
54}
55
56impl IndexList<Account> for AccountIndexes<'_> {
57    fn get_indexes(&'_ self) -> Box<dyn Iterator<Item = &'_ dyn Index<Account>> + '_> {
58        let v: Vec<&dyn Index<Account>> = vec![&self.account];
59        Box::new(v.into_iter())
60    }
61}
62
63#[allow(non_snake_case)]
64pub fn ACCOUNTS<'a>() -> IndexedMap<'a, Addr, Account, AccountIndexes<'a>> {
65    let indexes = AccountIndexes {
66        account: UniqueIndex::new(|account| account.account.clone(), "accounts__account"),
67    };
68    IndexedMap::new("accounts", indexes)
69}
70
71pub const QUERY_PAGE_SIZE: u32 = 50;
72pub const CONFIG: Item<Config> = Item::new("config");
73pub const STATE: Item<State> = Item::new("state");