Как получить длину массива, хранящегося в отображении на интерфейсе?

У меня есть контракт со следующим отображением:

mapping (uint16 => uint256[]) public barLengthToBarIndexForSale;

Каков наилучший способ получить длину массива для данного ключа во внешнем интерфейсе с помощью трюфеля?

Что-то вроде этого...

barERC721Inst.barLengthToBarIndexForSale(5).length;

... кажется, не работает.

Использование дополнительной функции в моем контракте для получения длины...

    function getBarLengthToBarIndexForSaleLength(uint16 _length) external view returns (uint) {
    return barLengthToBarIndexForSale[_length].length;
}

... кажется, тоже не работает :(

Я попытался вызвать его на интерфейсе следующим образом:

barERC721Inst.barLengthToBarAmtForSale.call(5)

и

barERC721Inst.barLengthToBarAmtForSale(5)

оба выдают ошибки.

Любая помощь приветствуется.

Ваш второй подход должен работать нормально. Единственное, что я хотел бы изменить, это имя входного аргумента — from _lengthto _index. Кроме того, вам нужно будет объяснить, что именно «кажется, тоже не работает».

Ответы (1)

Вы можете просто написать функцию-получатель в своем контракте, которая возвращает длину массива. Обязательно сделайте это view.

function getSize(uint16 key) public view returns (uint){
    return barLengthToBarAmtForSale[5].length
}

если это невозможно (контракт уже развернут), вы можете «попробовать» перебрать массив (это не требует газа), пока не получите ошибку. Это немного грязно, но должно работать.

Надеюсь, поможет.