Solidity
為什麼這個庫方法返回 0?
有這個我在契約中多次使用的庫方法,但在一個特定的函式中返回 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
中,您將結果除以mulDivDown
10 ** 36。這是一個相當大的數字,如果結果mulDivDown
低於該數字,您將得到 0。