Ошибка теста трюфеля из-за другого типа данных, чем ожидалось

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

Когда я пытаюсь запустить тесты, чтобы убедиться, что мой контракт работает правильно, я получаю интересные данные, которых не ожидал.

Когда я чеканю токен, используя этот тест:

describe("mint", () => {
    it("Created token with specified attributes", async () => {
        let instance = await Token.deployed();
        let owner = await instance.owner();

        let tokenId = await instance.mint(5, 2, 5, 10, 5);

        describe("Expected output: ", tokenId);

        let attributes = await instance.getToken(0);
        assert.equal(attributes, [5, 2, 5, 10, 5]);
    });
});

Я ожидал, что эта функция вернет [5, 2, 5, 10, 5]:

function getToken( uint _TokenId ) public view returns(
    uint256 value1,
    uint256 value2,
    uint256 value3,
    uint256 value4,
    uint16 value5
    ){
    Token memory _token = tokens[_TokenId];
    value1 = _token.value1;
    value2 = _token.value2;
    value3 = _token.value3;
    value4 = _token.value4;
    value5 = _token.value5;
}

Но вместо этого атрибуты переменных, как сообщается, возвращают эту странную структуру данных, которая выглядит как массив из 5 с 3 сопоставлениями символов «c», «e», «s» в переменную. "c" содержит значение, на которое я надеялся:

{"c" : [5]  "e" : 0 "s" : 1}
{"c" : [2]  "e" : 0 "s" : 1}
{"c" : [5]  "e" : 0 "s" : 1}
{"c" : [10] "e" : 1 "s" : 1}
{"c" : [5]  "e" : 0 "s" : 1}

Мой вопрос: почему я получаю эту структуру данных? Разве я не должен получать ожидаемые результаты? Я считаю, что отображение "e" - это количество цифр - 1, но я не знаю, что представляет собой "s". Я мог бы пройти и создать массив с каждым из отображений «c», но я не знаю, лучший ли это способ справиться с этим.

Ответы (1)

TLDR; использоватьtokenId.toString()

Массив, который вы получаете, представляет собой представление BigNumber, которое возвращается из блокчейна. Или на самом деле блокчейн возвращает uint256(или сколько битов вы используете), а затем преобразуется в BigNumber.

«Проблема» с BigNumber заключается в том, что вы не можете отображать его значение таким образом. Я не совсем уверен, что представляют собой значения массива, но я полагаю , что сама библиотека https://github.com/MikeMcl/bignumber.js/ .

В любом случае, чтобы отобразить удобную для человека версию числа, вы можете просто использовать value.toString().