如何测试Solidity Payable合约?求助Foundry模拟以太币支付内置方法
Foundry测试中模拟Payable函数支付以太的方法
Foundry的测试合约(继承自Test)提供了几个实用的内置函数,能轻松模拟带以太支付的payable函数调用:
deal(address account, uint256 amount):给指定地址转入指定数量的以太,用于预先为测试账户或合约充值,确保调用payable函数时有足够余额。
示例代码:deal(address(this), 1 ether); // 给当前测试合约转入1ETH deal(userAddr, 5 ether); // 给自定义的用户地址转入5ETHhoax(address from, uint256 amount):一站式完成「给地址充以太+切换调用身份」的操作,非常适合模拟外部用户带以太调用合约payable方法的场景。
示例代码:hoax(userAddr, 2 ether); // 调用合约的payable函数并附带1ETH yourContract.targetPayableFunc{value: 1 ether}();prank(address from):仅切换后续调用的发起身份,不会自动充以太。需要配合deal先给目标地址充值,再切换身份调用。
示例代码:deal(userAddr, 3 ether); prank(userAddr); // 以userAddr身份调用payable函数,附带0.5ETH payable(yourContract).call{value: 0.5 ether}("");
另外,直接使用Solidity的{value: amount}语法,配合上述身份切换或余额准备操作,就能完成带支付的函数调用。比如测试合约自身调用时,可直接在函数调用时附加以太:
yourContract.targetPayableFunc{value: 1.5 ether}();
注意:Foundry测试合约默认有充足以太,但自定义的外部测试账户初始余额为0,必须先通过deal或hoax充值才能发起支付操作。
内容的提问来源于stack exchange,提问作者MenzD
相关产品推荐
相关产品推荐

