Skip to main content

defuse/contract/tokens/nep245/
enumeration.rs

1use crate::contract::{Contract, ContractExt};
2use defuse_core::token_id::TokenIdType;
3use defuse_nep245::{Token, enumeration::MultiTokenEnumeration};
4use near_sdk::{AccountId, json_types::U128, near};
5
6#[near]
7impl MultiTokenEnumeration for Contract {
8    fn mt_tokens(&self, from_index: Option<U128>, limit: Option<u32>) -> Vec<Token> {
9        let from_index = from_index.map_or(0, |v| v.0);
10        let from_index: usize = from_index.try_into().unwrap();
11
12        let iter = self
13            .state
14            .total_supplies
15            .iter()
16            .skip(from_index)
17            .map(|(token_id, _amount)| Token {
18                token_id: token_id.to_string(),
19                // Note: There is no way to fill this field currently (which is required for NEP-171/NFTs),
20                // as it requires reverse look-up for tokens and that's expensive for storage.
21                // We will postpone this decision for the future when it's needed.
22                owner_id: None,
23            });
24
25        match limit {
26            Some(l) => iter.take(l.try_into().unwrap()).collect(),
27            None => iter.collect(),
28        }
29    }
30
31    fn mt_tokens_for_owner(
32        &self,
33        account_id: AccountId,
34        from_index: Option<U128>,
35        limit: Option<u32>,
36    ) -> Vec<Token> {
37        let from_index = from_index.map_or(0, |v| v.0);
38        let from_index: usize = from_index.try_into().unwrap();
39
40        let Some(account) = self.accounts.get(&account_id) else {
41            return Vec::new();
42        };
43
44        let iter = account
45            .as_inner_unchecked()
46            .state
47            .token_balances
48            .iter()
49            .skip(from_index)
50            .map(|(token_id, _amount)| Token {
51                token_id: token_id.to_string(),
52                owner_id: match TokenIdType::from(token_id) {
53                    TokenIdType::Nep171 => Some(account_id.clone()),
54                    TokenIdType::Nep141 | TokenIdType::Nep245 | TokenIdType::Imt => None,
55                },
56            });
57
58        match limit {
59            Some(l) => iter.take(l.try_into().unwrap()).collect(),
60            None => iter.collect(),
61        }
62    }
63}