issue_and_set_all_roles 回复 "token name is not human readable"

issue_and_set_all_roles responds with "token name is not human readable"

我有一个智能合约功能,它在内部调用 issue_and_set_all_roles 来发出 SFT 并设置所有角色,但无论代币名称如何,它都会以“代币名称不是人类可读的”作为响应。

智能合约功能:

  #[only_owner]
  #[payable("EGLD")]
  #[endpoint]
  fn initiate_sft(
    &self,
    #[payment] issue_cost: BigUint<Self::Api>,
    token_display_name: ManagedBuffer<Self::Api>,
    token_ticker: ManagedBuffer<Self::Api>,
  ) {
    let caller = self.blockchain().get_caller();

    self
      .send()
      .esdt_system_sc_proxy()
      .issue_and_set_all_roles(
        issue_cost,
        token_display_name,
        token_ticker,
        EsdtTokenType::SemiFungible,
        0,
      )
      .async_call()
      .with_callback(self.callbacks().initiate_sft_callback(&caller))
      .call_and_exit();
  }

示例 TX:https://testnet-explorer.elrond.com/transactions/49fa9e32267448ea0c49bfd8ecf8603ba5207ab9fb3dc697cf5e5f391254fadb

设置“token name is not human readable”错误的验证逻辑:https://github.com/ElrondNetwork/elrond-go/blob/d6b1389a59f36095203d7cb583318be6adcfa032/vm/systemSmartContracts/esdt.go#L677

根据验证逻辑,“Dummy”之类的名称是可以的。此外,我尝试使用测试网钱包发行具有相同令牌名称的 SFT,并且从测试网钱包生成的 TX 成功。 (TX:https://testnet-explorer.elrond.com/transactions/ebc8a2a87ebd474baf94c8f3a0905e765756c05b733c25d60cfb61616b47dbd1#smart

我错过了什么?

问题似乎出在尾随的 LF(0A 十六进制)行以令牌名称结尾。

“智能”版本的输入数据中不显示行尾,因此很容易错过。删除它解决了问题。

P.s.: 如果您使用 shell 交互与智能合约交互,删除尾随 LF 的一种方法是使用 | tr -d '\n',例如:

    TOKEN_DISPLAY_NAME="someName123"
    TOKEN_DISPLAY_NAME_HEX=$(echo ${TOKEN_DISPLAY_NAME} | tr -d '\n' | xxd -p)