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");