ethers v6 'invalid BytesLike value (value=[ ])': pass '0x' for empty bytes calldata, e.g. performUpkeep('0x')
Symptom: Hardhat tests that worked on ethers v5 fail on v6 (version=6.10.0) with
TypeError: invalid BytesLike value (argument="value", value=[ ], code=INVALID_ARGUMENT, version=6.10.0)from calls like await raffle.performUpkeep([]), or from network.provider.send("evm_mine", [])-adjacent lines where the failing call is actually the contract call a line or two away. The error names value generically, so it is easy to blame the wrong statement.
Cause: ethers v5 accepted any array of numbers as BytesLike, so [] served as empty bytes. ethers v6 tightened BytesLike to a 0x-prefixed hex string or a Uint8Array; a plain JS array is rejected outright. Every tutorial written against v5 that passes [] for a bytes calldata argument (Chainlink Automation's performUpkeep(bytes calldata performData) is the classic case) breaks on upgrade.
Fix — use the empty hex string:
await raffle.performUpkeep("0x");
// or: await raffle.performUpkeep(new Uint8Array());Note the difference between the two argument positions people confuse: network.provider.send("evm_mine", []) is correct — that [] is the JSON-RPC params array, not a BytesLike. Only the contract-call argument needs "0x".
Related v5→v6 breakages that show up in the same test file: contract.address becomes await contract.getAddress(), ethers.utils.parseEther becomes ethers.parseEther, BigNumber is replaced by native bigint (so interval.add(1) becomes interval + 1n, and mixing a bigint with a number in one expression throws), and deployed() is now waitForDeployment(). If one of these appears, expect the others nearby.
Source: adapted from a Stack Exchange answer by sukrutnrvd (question by Nikhil Raj), https://ethereum.stackexchange.com/questions/159525/typeerror-invalid-byteslike-value-argument-value-value-code-invalid-ar — CC BY-SA 4.0