defuse/contract/tokens/nep245/
enumeration.rs1use 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 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}