Skip to content

Commit de1c0ba

Browse files
Merge pull request #2142 from multiversx/add-data-esdt-token-properties
add extra data to `get_token_properties` query
2 parents 7e99c9d + 253da68 commit de1c0ba

File tree

5 files changed

+64
-11
lines changed

5 files changed

+64
-11
lines changed

chain/core/src/types/flags/esdt_token_type.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,18 @@ impl EsdtTokenType {
3838
EsdtTokenType::Invalid => 255,
3939
}
4040
}
41+
42+
pub fn collection_from_string(token_type: &str) -> Self {
43+
match token_type {
44+
"NonFungibleESDT" => EsdtTokenType::NonFungibleV2,
45+
"SemiFungibleESDT" => EsdtTokenType::SemiFungible,
46+
"MetaESDT" => EsdtTokenType::MetaFungible,
47+
"DynamicNonFungibleESDT" => EsdtTokenType::DynamicNFT,
48+
"DynamicSemiFungibleESDT" => EsdtTokenType::DynamicSFT,
49+
"DynamicMetaESDT" => EsdtTokenType::DynamicMeta,
50+
_ => EsdtTokenType::Invalid,
51+
}
52+
}
4153
}
4254

4355
impl From<u8> for EsdtTokenType {

framework/base/src/types/interaction/system_proxy/token_properties_result.rs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use alloc::string::String;
2+
use multiversx_chain_core::types::{Address, EsdtTokenType};
13
use multiversx_sc_codec::{
24
DecodeErrorHandler, TopDecodeInput, TopDecodeMulti, TopDecodeMultiInput,
35
};
@@ -20,8 +22,11 @@ const PREFIXES: &[&[u8]] = &[
2022
b"NumWiped-",
2123
];
2224

23-
#[derive(Debug, Clone, Default)]
25+
#[derive(Debug, Clone)]
2426
pub struct TokenPropertiesResult {
27+
pub token_name: String,
28+
pub token_type: EsdtTokenType,
29+
pub owner_address: Address,
2530
pub num_decimals: usize,
2631
pub is_paused: bool,
2732
pub can_upgrade: bool,
@@ -63,6 +68,27 @@ impl TokenPropertiesResult {
6368
}
6469
}
6570
}
71+
72+
fn default() -> Self {
73+
TokenPropertiesResult {
74+
token_name: String::new(),
75+
token_type: EsdtTokenType::Invalid,
76+
owner_address: Address::zero(),
77+
num_decimals: 0,
78+
is_paused: false,
79+
can_upgrade: false,
80+
can_mint: false,
81+
can_burn: false,
82+
can_change_owner: false,
83+
can_pause: false,
84+
can_freeze: false,
85+
can_wipe: false,
86+
can_add_special_roles: false,
87+
can_transfer_nft_create_role: false,
88+
nft_create_stopped: false,
89+
num_wiped: 0,
90+
}
91+
}
6692
}
6793

6894
impl TopDecodeMulti for TokenPropertiesResult {
@@ -72,6 +98,11 @@ impl TopDecodeMulti for TokenPropertiesResult {
7298
H: DecodeErrorHandler,
7399
{
74100
let mut token_properties = TokenPropertiesResult::default();
101+
102+
token_properties.token_name = String::multi_decode_or_handle_err(input, h)?;
103+
let token_type = String::multi_decode_or_handle_err(input, h)?;
104+
token_properties.token_type = EsdtTokenType::collection_from_string(token_type.as_str());
105+
token_properties.owner_address = Address::multi_decode_or_handle_err(input, h)?;
75106
while input.has_next() {
76107
let value = input.next_value_input(h)?;
77108
let mut buffer = [0u8; MAX_BUFFER_SIZE];

framework/scenario/tests/token_properties_result_test.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
use multiversx_sc::{codec::TopDecodeMulti, imports::TokenPropertiesResult};
1+
use multiversx_sc::{
2+
codec::TopDecodeMulti,
3+
imports::{Bech32Address, TokenPropertiesResult},
4+
types::EsdtTokenType,
5+
};
26

37
fn hex_decode(hex: &[u8]) -> Option<Vec<u8>> {
48
if hex.len() % 2 != 0 {
@@ -23,15 +27,20 @@ fn hex_decode(hex: &[u8]) -> Option<Vec<u8>> {
2327

2428
#[test]
2529
fn multi_decode_from_api_response() {
26-
let raw_input = b"@6f6b@544553544e4654@44796e616d69634e6f6e46756e6769626c6545534454@0139472eff6886771a982f3083da5d421f24c29181e63888228dc81ca60d69e1@30@30@4e756d446563696d616c732d3138@49735061757365642d66616c7365@43616e557067726164652d74727565@43616e4d696e742d66616c7365@43616e4275726e2d74727565@43616e4368616e67654f776e65722d66616c7365@43616e50617573652d66616c7365@43616e467265657a652d66616c7365@43616e576970652d66616c7365@43616e4164645370656369616c526f6c65732d74727565@43616e5472616e736665724e4654437265617465526f6c652d66616c7365@4e465443726561746553746f707065642d66616c7365@4e756d57697065642d30";
30+
let raw_input = b"@544553544e4654@44796e616d69634e6f6e46756e6769626c6545534454@0139472eff6886771a982f3083da5d421f24c29181e63888228dc81ca60d69e1@30@30@4e756d446563696d616c732d3138@49735061757365642d66616c7365@43616e557067726164652d74727565@43616e4d696e742d66616c7365@43616e4275726e2d74727565@43616e4368616e67654f776e65722d66616c7365@43616e50617573652d66616c7365@43616e467265657a652d66616c7365@43616e576970652d66616c7365@43616e4164645370656369616c526f6c65732d74727565@43616e5472616e736665724e4654437265617465526f6c652d66616c7365@4e465443726561746553746f707065642d66616c7365@4e756d57697065642d30";
2731
let mut input: Vec<Vec<u8>> = raw_input
2832
.split(|&b| b == b'@')
2933
.filter(|slice| !slice.is_empty())
3034
.map(|slice| hex_decode(slice).unwrap())
3135
.collect();
3236

3337
let token_properties = TokenPropertiesResult::multi_decode(&mut input).unwrap();
34-
38+
assert!(token_properties.token_name == "TESTNFT");
39+
assert!(token_properties.token_type == EsdtTokenType::DynamicNFT);
40+
assert!(
41+
Bech32Address::from(token_properties.owner_address).to_bech32_str()
42+
== "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"
43+
);
3544
assert!(token_properties.num_decimals == 18usize);
3645
assert!(!token_properties.is_paused);
3746
assert!(token_properties.can_upgrade);

tools/interactor-system-func-calls/src/system_sc_interact.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -227,11 +227,11 @@ pub async fn system_sc_interact_cli() {
227227
}
228228

229229
pub struct SysFuncCallsInteract {
230-
interactor: Interactor,
231-
wallet_address: Bech32Address,
232-
other_wallet_address: Bech32Address,
230+
pub interactor: Interactor,
231+
pub wallet_address: Bech32Address,
232+
pub other_wallet_address: Bech32Address,
233233
#[allow(unused)]
234-
state: State,
234+
pub state: State,
235235
}
236236

237237
impl SysFuncCallsInteract {
@@ -260,10 +260,8 @@ impl SysFuncCallsInteract {
260260

261261
let res = self
262262
.interactor
263-
.tx()
264-
.from(&self.wallet_address)
263+
.query()
265264
.to(ESDTSystemSCAddress)
266-
.gas(100_000_000u64)
267265
.typed(ESDTSystemSCProxy)
268266
.get_token_properties(token_id)
269267
.returns(ReturnsResult)

tools/interactor-system-func-calls/tests/chain_simulator_token_tests.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,9 @@ async fn get_token_properties() {
344344
.get_token_properties(dynamic_meta_esdt_token_id.as_bytes())
345345
.await;
346346

347+
assert!(token_properties.owner_address == interact.wallet_address.to_address());
348+
assert!(token_properties.token_name == "TESTMETA");
349+
assert!(token_properties.token_type == EsdtTokenType::DynamicMeta);
347350
assert!(token_properties.num_decimals == 18usize);
348351
assert!(!token_properties.is_paused);
349352
assert!(token_properties.can_upgrade);

0 commit comments

Comments
 (0)