Solidity

為什麼這個庫方法返回 0?

  • April 4, 2022

有這個我在契約中多次使用的庫方法,但在一個特定的函式中返回 0,即使我正在登錄庫本身生成的值並檢查它是否確實返回了一個值。

那麼為什麼當我只在這個特定函式中從合約中呼叫它時它是 0 呢?

Library:

library FixedPointMathLib { 
  function mulDivDown(
       uint256 x,
       uint256 y,
       uint256 denominator
   ) internal view returns (uint256) {
       uint z;
       assembly {
           z := mul(x, y)

           if iszero(and(iszero(iszero(denominator)), or(iszero(x), eq(div(z, x), y)))) {
               revert(0, 0)
           }

           z := div(z, denominator)
       }
       console.log(z); //returns a value in both convertToShares() and convertToAssets()
       return z;
   }
...
}

Contract:

contract ERC4626 {
  AppStorage s;
  using FixedPointMathLib for uint256;

  function convertToShares(uint256 assets) public view virtual returns (uint256) { 
       return s.index.mulDivDown(assets * 100, 10 ** 22); //returns a value
  }

  function convertToAssets(uint256 shares) public view virtual returns (uint256) {
       uint vaultBalance = IERC20(s.crvTricrypto).balanceOf(address(this));

       uint256 assets = shares.mulDivDown(vaultBalance, 100 * 1 ether) / 10 ** 36;
       console.log(assets); // <------- returns 0
       
       return assets;
   }
...
}

convertToAssets中,您將結果除以mulDivDown10 ** 36。這是一個相當大的數字,如果結果mulDivDown低於該數字,您將得到 0。

引用自:https://ethereum.stackexchange.com/questions/125449