我有一份合同,它试图根据流动性池中的准备金计算象征性的价格。当我调用契约函数getTokenPriceAB()并输入WBTC的对地址作为参数时,它成功地返回了金额。
但是,当我将它改为另一个类似WETH的函数时,它会返回0。
function getTokenPriceAB(address pairAddress) public override view returns(uint) {
IUniswapV2Pair pair = IUniswapV2Pair(pairAddress);
IERC20 token1 = IERC20(pair.token1());
(uint Res0, uint Res1,) = pair.getReserves();
require(Res1 != 0, "Division by zero");
// decimals
uint res0 = Res0.mul(10**token1.decimals());
// return amount of _tokenA needed to buy _tokenB
// to improve precision, multiply before dividing
return((1000000000000000000*res0)/Res1);
}我期待的任何其他结果,而不是0独立于对地址。
我还确保在那里输入了一个有效的地址,并检查了这个池在以太扫描上的流动性。
发布于 2023-01-14 02:04:05
停止使用getReserves(),使用kLast()
function getTokenPriceAB(address pairAddress) public view returns(uint256) {
IUniswapV2Pair pair = IUniswapV2Pair(pairAddress);
uint256 price = pair.kLast();
return price;
}在这个上下文中,使用kLast()函数而不是getReserves()是有意义的,因为它返回令牌对的最后交易价格。它不返回令牌对的当前储备,而是返回令牌对的最后交易价格,该交易价格是以token0价格与token1价格的比率计算的。
发布于 2023-01-17 17:37:06
我尝试在以太扫描上对kLast()使用WETH-USDC对 (),但是即使是read契约函数对于kLast()也总是返回0。所以我至少正确地调用了这个函数。为什么这个值总是0?流动性池中显然有资金,因此它应该能够计算出kLast的价格。
在检查getReserves()函数时,它成功地返回了两个值。
这完全没有意义,我在文档中也找不到任何信息。
https://ethereum.stackexchange.com/questions/142895
复制相似问题