首页 > 解决方案 > 如何在不使用设置 msg.value 的情况下将资金从 msg.sender(amount) 转移到收件人地址

问题描述

我们可以将资金从地址(这个)转移到收件人。但是有没有办法将资金直接转移到 msg.sender 钱包给收件人?我无法在调用 payoutBonus 时设置 msg.value。因为我只能在 payoutBonus 方法中获得金额。

function payoutBonus(address recipient) public payable returns (bool) {
    // bonus = calculateBonus();
    //transfer this bonus to recipient from msg.sender;
    return true;
}

标签: ethereumsolidity

解决方案


msg.value是反映传入事务值的只读属性。如果您想发送 ETH 金额,您可以通过以下两种方式之一进行。

笔记:

  • 这些示例适用于 Solidity 0.8。一些以前的版本还允许send()现在不推荐使用的方法,不需要payable类型,并且该方法的语法略有不同call()
  • bonus是 wei 的数量(1 ETH 是 10^18 wei)

transfer()方法_

uint256 bonus = calculateBonus();
payable(msg.sender).transfer(bonus);

transfer()方法仅允许消耗 2300 gas,这对于非合约接收者来说已经足够了。如果接收方是需要超过 2300 个 gas 才能接收 ETH 的合约(例如,它设置了一些局部变量),则交易将恢复。

低级call()

uint256 bonus = calculateBonus();
msg.sender.call{value: bonus}("");

使用低级call()方法,您还可以指定气体限制、要调用的函数及其参数。仅当您知道自己在做什么时才使用此方法。


推荐阅读