foundry的测试功能很强大,然而在我使用其script的脚本与已部署的合约进行交互时遇到麻烦。 1.我如果只有合约的abi文件(没有源码),能否像ethers那样在脚本中创建一个合约实例来与之交互呢? 2.我发现可以将合约地址转为合约实例(用合约类型强转),并与之交互。但是foundry脚本的工作原理似乎是将交互对应的交易一次性提取出来,然后单独执行。如果我在某个交易后面执行console.log进行信息输出,(比如调用合约设置url后输出新的url)我发现输出的结果是交易执行之前的旧信息。也就是说,脚本是异步执行,不能按顺序同步执行。
有没有关于上面两个问题的解决方法呢?
为了确保脚本按顺序同步执行,可以使用 vm.roll 和 vm.warp 来控制区块和时间的推进
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "forge-std/Script.sol";
import "forge-std/console.sol";
interface IMyContract {
function setUrl(string calldata newUrl) external;
function getUrl() external view returns (string memory);
}
contract InteractScript is Script {
function run() external {
// 合约地址
address contractAddress = 0xYourContractAddress;
// 创建合约实例
IMyContract myContract = IMyContract(contractAddress);
// 调用合约函数设置 URL
myContract.setUrl("https://new-url.com");
// 推进区块
vm.roll(block.number + 1);
// 调用合约函数获取 URL
string memory url = myContract.getUrl();
// 打印结果
console.log("New URL:", url);
}
}