因为我想每次获取一批代币的交易价格,所以我暂时想到的是在solidity中批量调用pancakeswap的getAmountsOut()方法,目的是想减少rpc调用的次数,但是本人不太熟悉solidity,下面是我的一段solidity代码,然后我用web3.js调用报错 `// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.8.2 <0.9.0;
interface Pancakeswap {
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
}
contract EnhanceSwap {
address constant private pancakeswapAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E;
enum TradeType {
BUY,
SELL
}
struct AmountOutEntity {
address amountOutAddress;
uint amountIn;
address[] path;
TradeType tradeType;
}
struct AmountOutResult {
uint amountIn;
uint[] amountOut;
address amountOutAddress;
TradeType tradeType;
}
/**
* 批量处理多个代币合约兑换数量
**/
function getAmountsOutForBatch(AmountOutEntity[] memory amountOutEntity) external view returns (AmountOutResult[] memory amounts){
//用来存储多个结果
AmountOutResult[] memory amountOutResults = new AmountOutResult[](amountOutEntity.length);
if (amountOutEntity.length == 0) {
return amountOutResults;
}
uint[] memory zeroAmountOuts;
zeroAmountOuts[0] = 0;
//从pancakeswap获取数据
for(uint i = 0; i < amountOutEntity.length; i++) {
try Pancakeswap(pancakeswapAddress).getAmountsOut(amountOutEntity[i].amountIn, amountOutEntity[i].path) returns(uint[] memory results) {
AmountOutResult memory aor = AmountOutResult(
amountOutEntity[i].amountIn,
results,
amountOutEntity[i].amountOutAddress,
amountOutEntity[i].tradeType
);
amountOutResults[i] = aor;
}catch Error(string memory) {
AmountOutResult memory aor = AmountOutResult(
amountOutEntity[i].amountIn,
zeroAmountOuts,
amountOutEntity[i].amountOutAddress,
amountOutEntity[i].tradeType
);
amountOutResults[i] = aor;
}catch {
AmountOutResult memory aor = AmountOutResult(
amountOutEntity[i].amountIn,
zeroAmountOuts,
amountOutEntity[i].amountOutAddress,
amountOutEntity[i].tradeType
);
amountOutResults[i] = aor;
}
}
return amountOutResults;
}
}` 麻烦大佬有空指点一下,或者提供一下别的思路,感谢~ 我的目的就是想一批批的获取代币价格