【问题标题】:Testing a Payable Function in Solidity在 Solidity 中测试应付函数
【发布时间】:2021-12-07 19:52:53
【问题描述】:

因此,我正在尝试使用 truffle 框架在以下智能合约上测试支付功能:

contract FundMe {
    using SafeMathChainlink for uint256;

    mapping(address => uint256) public addressToAmountFunded;
    address[] public funders;
    address public owner;
    AggregatorV3Interface public priceFeed;

    constructor(address _priceFeed) public {
        priceFeed = AggregatorV3Interface(_priceFeed);
        owner = msg.sender;
    }

    function fund() public payable {
        uint256 mimimumUSD = 50 * 10**18;
        require(
            getConversionRate(msg.value) >= mimimumUSD,
            "You need to spend more ETH!"
        );
        addressToAmountFunded[msg.sender] += msg.value;
        funders.push(msg.sender);
    }

我特别想测试支付功能,我在互联网上看到了一些东西,人们用初始余额创建其他合约,然后向他们的测试合约发送一些 eth。但我只想抓住一个本地 ganache 钱包并向合约发送一些 eth,然后对其进行测试,如果有人可以向我展示一些测试 JavaScript 代码来解决这个问题,我将不胜感激!

【问题讨论】:

    标签: solidity truffle


    【解决方案1】:

    要让合约能够接收 ETH(或任何原生代币 - 币安智能链上的 BNB、Tron 网络上的 TRX,...)无需调用任何函数,您需要定义为receive() (docs) 或 fallback() (docs) 这些函数中的至少一个。

    contract FundMe {
    
        // intentionally missing the `function` keyword
        receive() external payable {
            // can be empty
        }
    
        // ... rest of your code
    }
    

    然后你可以发送一个普通的交易到松露合约地址(docs):

    const instance = await MyContract.at(contractAddress);
    await instance.send(web3.toWei(1, "ether"));
    

    请注意,由于 receive()fallback() 不是常规函数,您不能使用 truffle 自动生成的方法调用它们:myContract.functionName()


    如果你想执行支付功能发送 ETH,你可以使用transaction params (docs)。在所有常规函数参数之后,它始终是最后一个参数。

    const instance = await MyContract.at(contractAddress);
    await instance.fund({
        value: web3.toWei(1, "ether")
    });
    

    注意:如果 fund() 函数有 1 个参数(假设是 bool),则 transaction params 将是第二个:

    await instance.fund(true, {
        value: web3.toWei(1, "ether")
    });
    

    【讨论】:

    • 所以,如果我想做一些事情,比如更新给定变量或将其转发到另一个函数,它会在该接收函数中发生吗?
    • @SonnyVesali 我也用这个案例更新了我的答案。一开始,我把你的问题理解为只向合约发送 ETH 而不执行任何功能。
    • 这是现在向合约支付 ETH 的唯一方式吗?以前,payable 可以标记在任何函数上,但在将我的 payable 函数更改为 receive() external payable 之前,我在使用最新的 Solidity 版本时遇到了无法解释的还原错误。
    • @Neo 您可以在任何函数上使用payable 修饰符。您获得的还原似乎与 payable 的功能无关。
    猜你喜欢
    • 2022-11-10
    • 2023-01-17
    • 2021-09-04
    • 2022-01-24
    • 2019-05-09
    • 2018-10-21
    • 1970-01-01
    • 2020-12-17
    • 2019-02-03
    相关资源
    最近更新 更多