I am building a React webapp attempting to deposit some ETH coin to certain strategy; before user press the deposit button, browser would pop up MetaMask extension to let user connect wallet.
However, at the code side, after calling depositLiquidity() , this error occurred:
cannot estimate gas; transaction may fail or may require manual gas limit [ See: https://links.ethers.org/v5-errors-UNPREDICTABLE_GAS_LIMIT ] (reason="execution reverted: msg.value != _inputAmount", method="estimateGas", transaction={"from":"0x1A1f6bB945914e79a01b9c243Aef7Ca99Bd7871F","to":"0xBaf1b741FEf2D06169543372ca547db6f696F1B0","data":"0xb35924a1000000000000000000000000fcb00b689fbb30848a7603312051446a7549a3ab000000000000000000000000000000000000000000000000000000000000000100000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab100000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000131a936","accessList":null}, error={"code":-32603,"message":"Internal JSON-RPC error.","data":{"code":3,"data":"0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000196d73672e76616c756520213d205f696e707574416d6f756e7400000000000000","message":"execution reverted: msg.value != _inputAmount"},"stack":"{\n "code": -32603,\n "message": "Internal JSON-RPC error.",\n "data": {\n "code": 3,\n "data": "0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000196d73672e76616c756520213d205f696e707574416d6f756e7400000000000000",\n "message": "execution reverted: msg.value != _inputAmount"\n },\n "stack": "Error: Internal JSON-RPC error.\n
const provider = new ethers.providers.Web3Provider(window.ethereum);
await provider.send('eth_requestAccounts', []);
const signer = await provider.getSigner();
const swapContract = new ethers.Contract(MinimumSwapOutAmountCalculatorAddr, minimumSwapOutAbi, provider);
const { minimumSwapOutAmount, swapInAmount } = await swapContract.getDepositMinimumSwapOutAmount(
WethArbStrategyAddr, tokenAddrs[selectedTokenName].address,
depositValue);
console.log("getDepositMinimumSwapOutAmount: ", minimumSwapOutAmount, swapInAmount);
const farmContract = new ethers.Contract(FarmContractAddr, FarmAbi, signer);
console.log(WethArbStrategyAddr, true,
tokenAddrs[selectedTokenName].address,
"depositValue:", depositValue,
"swapInAmount:", parseInt(swapInAmount._hex, 16),
"swapOutAmount:", parseInt(minimumSwapOutAmount._hex, 16)
);
const result = await farmContract.depositLiquidity(
WethArbStrategyAddr,
true,
tokenAddrs[selectedTokenName].address,
depositValue,
parseInt(swapInAmount._hex, 16),
parseInt(minimumSwapOutAmount._hex, 16)
);
console.log("farmContract ", result);
Here is part of the abi:
{
"inputs": [
{
"internalType": "address",
"name": "_strategyContract",
"type": "address"
},
{
"internalType": "bool",
"name": "_isETH",
"type": "bool"
},
{
"internalType": "address",
"name": "_inputToken",
"type": "address"
},
{
"internalType": "uint256",
"name": "_inputAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_swapInAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_minimumSwapOutAmount",
"type": "uint256"
}
],
"name": "depositLiquidity",
"outputs": [
],
"stateMutability": "payable",
"type": "function"
}
I am sure that all of the parameters passed into depositLiquidity() is correct, because I have examined it with etherscan website.
Might someone tell me where I wrote wrongly?
It turns out that I lack the passing of msg.value.
As a result, this modification of inserting another parameter works:
Note: The unit of the depositValue variable is wei.