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
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use cosmwasm_std::{CanonicalAddr, StdResult, Storage};
use cw721::{ContractInfoResponse, Expiration};
use cw_storage_plus::{Index, IndexList, IndexedMap, Item, Map, MultiIndex};
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct TokenInfo {
pub owner: CanonicalAddr,
pub approvals: Vec<Approval>,
pub name: String,
pub description: String,
pub image: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)]
pub struct Approval {
pub spender: CanonicalAddr,
pub expires: Expiration,
}
pub const CONTRACT_INFO: Item<ContractInfoResponse> = Item::new(b"nft_info");
pub const MINTER: Item<CanonicalAddr> = Item::new(b"minter");
pub const TOKEN_COUNT: Item<u64> = Item::new(b"num_tokens");
pub const OPERATORS: Map<(&[u8], &[u8]), Expiration> = Map::new(b"operators");
pub fn num_tokens<S: Storage>(storage: &S) -> StdResult<u64> {
Ok(TOKEN_COUNT.may_load(storage)?.unwrap_or_default())
}
pub fn increment_tokens<S: Storage>(storage: &mut S) -> StdResult<u64> {
let val = num_tokens(storage)? + 1;
TOKEN_COUNT.save(storage, &val)?;
Ok(val)
}
pub struct TokenIndexes<'a, S: Storage> {
pub owner: MultiIndex<'a, S, TokenInfo>,
}
impl<'a, S: Storage> IndexList<S, TokenInfo> for TokenIndexes<'a, S> {
fn get_indexes(&'_ self) -> Box<dyn Iterator<Item = &'_ dyn Index<S, TokenInfo>> + '_> {
let v: Vec<&dyn Index<S, TokenInfo>> = vec![&self.owner];
Box::new(v.into_iter())
}
}
pub fn tokens<'a, S: Storage>() -> IndexedMap<'a, &'a str, TokenInfo, S, TokenIndexes<'a, S>> {
let indexes = TokenIndexes {
owner: MultiIndex::new(|d| d.owner.to_vec(), b"tokens", b"tokens__owner"),
};
IndexedMap::new(b"tokens", indexes)
}