如何测试一个函数调用动态calldata数组?



我有一个像下面这样的合约函数

function updateDeps(uint16 parent, uint16[] calldata deps) public

和我试图创建单元测试与以下

的混音
contract TestContract is MyContract {
uint16[] deps;
function testUpdateDeps() {
deps.push(uint16(2));
deps.push(uint16(3));
deps.push(uint16(4));
(bool success, bytes memory result) = address(this).delegatecall(abi.encodeWithSignature("updateDeps(uint16, uint16[])", 1, deps));
Assert.ok(success, "should succeed");
}
}

我这样写测试是因为固定大小数组和动态数组之间的差异,并且calldata不能是契约变量,只能在函数调用中创建,因此delegatecall。然而,事务失败。

如何测试以calldata动态数组为参数的函数?

使用abi编码字符串,字符串中的参数之间不能有空格,即updateDeps(uint16,uint16[])可以工作但updateDeps(uint16, uint16[])不能

注:一个额外的提示,如果你在代码中使用uint,它是uint256的别名,在abi签名字符串中你必须指定uint256,而不是uint

最新更新