Как получить данные о результате смарт-контракта?

Скажем, например, у нас есть транзакция с этими входными данными и этим результатом смарт-контракта.

  • Входные данные: issueNonFungible@415344@415344
  • Результат: @ok@4153442d383661353439

Это простое создание новой коллекции NFT. Его можно увидеть в сети разработчиков по адресу txHash: 290498e8730975ea6d2703f4c5e0dc2c657b9480b9afc2a62c4c8818636cf062

Я пытаюсь получить ответ смарт-контракта. Это код, который у меня есть сейчас, в котором consts.walletAddress является адресом кошелька отправителя начальной транзакции.

      var txHash = new TransactionHash("290498e8730975ea6d2703f4c5e0dc2c657b9480b9afc2a62c4c8818636cf062");
var toTest = await this.provider.getTransaction(txHash, new Address(consts.walletAddress), true);
var scResults = await toTest.getSmartContractResults();
console.log(scResults)

Вот что console.log выходы:

Проблема в том, что для результатов смарт-контракта не выводятся данные, поэтому я не могу получить ответ смарт-контракта. Я что-то делаю не так или это ошибка в erdJs?

1 ответ

Решение

Ваш код в порядке. В последней версии erdjs, распространяемой через npm, есть небольшая ошибка.

в TransactionOnNetwork class код в пакете в настоящее время выглядит так:

          static fromHttpResponse(response) {
        let transactionOnNetwork = new TransactionOnNetwork();
        transactionOnNetwork.type = new TransactionOnNetworkType(response.type || "");
        transactionOnNetwork.nonce = new nonce_1.Nonce(response.nonce || 0);
        transactionOnNetwork.round = response.round;
        transactionOnNetwork.epoch = response.epoch || 0;
        transactionOnNetwork.value = balance_1.Balance.fromString(response.value);
        transactionOnNetwork.sender = address_1.Address.fromBech32(response.sender);
        transactionOnNetwork.receiver = address_1.Address.fromBech32(response.receiver);
        transactionOnNetwork.gasPrice = new networkParams_1.GasPrice(response.gasPrice);
        transactionOnNetwork.gasLimit = new networkParams_1.GasLimit(response.gasLimit);
        transactionOnNetwork.data = transactionPayload_1.TransactionPayload.fromEncoded(response.data);
        transactionOnNetwork.status = new transaction_1.TransactionStatus(response.status);
        transactionOnNetwork.hyperblockNonce = new nonce_1.Nonce(response.hyperblockNonce || 0);
        transactionOnNetwork.hyperblockHash = new hash_1.Hash(response.hyperblockHash);
        transactionOnNetwork.receipt = Receipt.fromHttpResponse(response.receipt || {});
        transactionOnNetwork.results = smartContractResults_1.SmartContractResults.fromHttpResponse(response.results || []);
        return transactionOnNetwork;
    }

Как видите, он пытается проанализировать результаты SmartContract из results поле в ответе.

Однако правильнее было бы вместо этого разобрать поле.

Это также можно увидеть на официальном гитхабе, где эта проблема, похоже, уже исправлена.

Так что пока вы можете вручную исправить transactionOnNetwork.js файл в вашем node_modules использовать smartContractResults или вы переходите на более низкую версию, пока эта проблема не будет решена в последнем пакете npm.

Другие вопросы по тегам