Лучший способ запросить функции просмотра в солидности из react с ether.js?

#reactjs #ethereum #solidity #use-effect #ethers.js

Вопрос:

js для взаимодействия с моим смарт-контрактом. В моем контракте есть такая функция, например:

   function getOfferById(uint256 _tokenId) public view returns (uint256) {
    require(_tokenId < MAX_B, "This tokenId does not exist");
    uint256 offer = bOffers[_tokenId];
    require(offer > 0, "There is no offer for this token");
    return offer;
}
 

Теперь, что нужно запросить эти данные при загрузке страницы или всякий раз, когда происходит новое событие и эти данные могут измениться, я сделал это так:

 useEffect(() => {
    async function getOfferById() {
      if (myContracts) {
        const _getOfferById = myContracts.getOfferById;
        if (_getOfferById amp;amp; id) {
          try {
            const _offer = await _getOfferById(id);
            setoffer(formatUnits(_offer, 'ether'));
          } catch (e) {
            setoffer(0);
          }
        }
      }
    }
    getOfferById();
  }, [myContracts, id, myEventOfferCreated, myEventOfferCanceled]);
 

Но таким образом, я все время получаю много ошибок консоли от своей метамаски, потому что оператор require часто срабатывает.

Каков был бы лучший способ для этого?

Комментарии:

1. На чем require() он терпит неудачу? Первый или второй? … Если первый, вы запрашиваете несколько id s по одному и тому же контракту или по нескольким контрактам? Реализуют ли контракты ERC721Enumerable ? … Если второе, является bOffers public ли свойство a?