20 foundry的脚本怎样与已部署的合约进行交互?

foundry的测试功能很强大,然而在我使用其script的脚本与已部署的合约进行交互时遇到麻烦。 1.我如果只有合约的abi文件(没有源码),能否像ethers那样在脚本中创建一个合约实例来与之交互呢? 2.我发现可以将合约地址转为合约实例(用合约类型强转),并与之交互。但是foundry脚本的工作原理似乎是将交互对应的交易一次性提取出来,然后单独执行。如果我在某个交易后面执行console.log进行信息输出,(比如调用合约设置url后输出新的url)我发现输出的结果是交易执行之前的旧信息。也就是说,脚本是异步执行,不能按顺序同步执行。

有没有关于上面两个问题的解决方法呢?

请先 登录 后评论

最佳答案 2024-05-16 10:24

为了确保脚本按顺序同步执行,可以使用 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);
    }
}
请先 登录 后评论

其它 1 个回答

kugool
请先 登录 后评论
  • 2 关注
  • 0 收藏,1491 浏览
  • kugool 提出于 2024-05-15 16:12