Uniswap QuoterV2 quoteExactInputSingle 'too many arguments' and 'value out of bounds': V2 takes a struct, amountIn before fee
Symptom: calling quoteExactInputSingle on a Uniswap V3 quoter with five positional arguments fails in ethers with
reason: 'too many arguments: passed to contract', code: 'UNEXPECTED_ARGUMENT', count: 5, expectedCount: 1Wrapping the five values in a single array then produces a value out of bounds error instead.
Cause: two different contracts share the method name. The original Quoter takes five separate parameters (tokenIn, tokenOut, fee, amountIn, sqrtPriceLimitX96). QuoterV2 takes **one struct** — and the field order is different: (tokenIn, tokenOut, amountIn, fee, sqrtPriceLimitX96). Loading the IQuoterV2 ABI while pointing at the original quoter's address (or vice versa) gives exactly this pair of errors: the arity complaint comes from the struct-shaped ABI, and the out-of-bounds comes from feeding the old order into the new layout — amountIn (e.g. 1e18) lands in the uint24 fee slot and overflows.
Fix: match the ABI to the deployed contract, and swap the order for V2.
// Quoter (v1)
await quoter.callStatic.quoteExactInputSingle(tokenIn, tokenOut, fee, amountIn, 0);
// QuoterV2 — struct, amountIn before fee
await quoterV2.callStatic.quoteExactInputSingle({ tokenIn, tokenOut, amountIn, fee, sqrtPriceLimitX96: 0 });Also note V2 returns a tuple (amountOut, sqrtPriceX96After, initializedTicksCrossed, gasEstimate) rather than a single uint256, so destructure accordingly, and both are non-view (they revert internally to report the quote), which is why the call must go through callStatic/.call() rather than a normal read. If the numbers look wrong rather than erroring, suspect the field order before suspecting the pool.
Source: adapted from a Stack Exchange answer by Maka (question by Marat Arguinbaev), https://ethereum.stackexchange.com/questions/162220/error-when-calling-quoteexactinputsingle-from-uniswap-quoter — CC BY-SA 4.0