You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elrond Rust测试框架设置NFT名称后读取返回异常问题

问题描述

使用 elrond-wasm 0.32.0 版本编写智能合约测试用例时,读取 ESDT NFT 名称会出现异常:合约返回 ESDT 代币标识符,而非预先设置的 NFT 名称。

复现步骤
  • 调用set_nft_balance_all_properties方法设置ESDT代币的名称属性,代码如下:
blockchain_wrapper.set_nft_balance_all_properties::<Empty>(
        &cf_wrapper.address_ref(),
        &ITEM_TO_EQUIP_ID,
        ITEM_TO_EQUIP_NONCE,
        &rust_biguint!(2u64),
        &Empty,
        0,
        Option::Some(&owner_address),
        Option::Some(ITEM_TO_EQUIP_NAME),
        Option::Some(b""),
        &[],
    );
  • 属性设置完成后,调用get_esdt_token_data方法读取ESDT代币名称,代码如下:
blockchain_wrapper
        .execute_query(&cf_wrapper, |sc| {
            let data = sc.blockchain().get_esdt_token_data(
                &ManagedAddress::from_address(&cf_wrapper.address_ref()),
                &TokenIdentifier::from_esdt_bytes(ITEM_TO_EQUIP_ID),
                ITEM_TO_EQUIP_NONCE,
            );

            // data.name equals ITEM_TO_EQUIP_ID, so it fail
            assert_eq!(data.name, ManagedBuffer::new_from_bytes(ITEM_TO_EQUIP_NAME));
        })
        .assert_ok();
  • 执行测试时data.name字段返回值为ITEM_TO_EQUIP_ID(即代币ID),和预期设置的ITEM_TO_EQUIP_NAME不一致,导致断言失败,需要确认问题是操作配置遗漏还是框架本身存在bug。
完整测试代码片段
#[test]
fn set_name_test() {
    const WASM_PATH: &'static str = "sc-customize-nft/output/customize_nft.wasm";

    const ITEM_TO_EQUIP_ID: &[u8] = b"ITEM-a1a1a1";
    const ITEM_TO_EQUIP_NAME: &[u8] = b"item name";
    const ITEM_TO_EQUIP_NONCE: u64 = 1;

    let rust_zero = rust_biguint!(0u64);
    let mut blockchain_wrapper = BlockchainStateWrapper::new();
    let owner_address = blockchain_wrapper.create_user_account(&rust_zero);
    let cf_wrapper = blockchain_wrapper.create_sc_account(
        &rust_zero,
        Some(&owner_address),
        customize_nft::contract_obj,
        WASM_PATH,
    );

    // deploy contract
    blockchain_wrapper
        .execute_tx(&owner_address, &cf_wrapper, &rust_zero, |sc| {
            let result = sc.init(managed_token_id!(PENGUIN_TOKEN_ID));
            assert_eq!(result, SCResult::Ok(()));
        })
        .assert_ok();
    blockchain_wrapper.add_mandos_set_account(cf_wrapper.address_ref());

    blockchain_wrapper.set_nft_balance_all_properties::<Empty>(
        &cf_wrapper.address_ref(),
        &ITEM_TO_EQUIP_ID,
        ITEM_TO_EQUIP_NONCE,
        &rust_biguint!(2u64),
        &Empty,
        0,
        Option::Some(&owner_address),
        Option::Some(ITEM_TO_EQUIP_NAME),
        Option::Some(b""),
        &[],
    );

    blockchain_wrapper
        .execute_query(&cf_wrapper, |sc| {
            let data = sc.blockchain().get_esdt_token_data(
                &ManagedAddress::from_address(&cf_wrapper.address_ref()),
                &TokenIdentifier::from_esdt_bytes(ITEM_TO_EQUIP_ID),
                ITEM_TO_EQUIP_NONCE,
            );

            println!("Name is {:?}", data.name);
            assert_eq!(data.name, ManagedBuffer::new_from_bytes(ITEM_TO_EQUIP_NAME));
        })
        .assert_ok();
}

内容的提问来源于stack exchange,提问作者Fargerik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 00:51:24