如何设置 tx ETH 金额?

问题描述

我知道用户可以手动将 ETH 发送到合约/函数,但是有没有办法直接在代码中请求特定金额,以便将其添加到 gas 费用中,例如,dxsale.app 的方式创建预售时(请参见下面的屏幕截图)- 它将 0.1 ETH 的预售成本添加到 0.0072 汽油费中,总计 0.1072。

Dxsale.app Presale cost is included in the transaction fee

这可以在 ERC20 合约中完成吗?我知道我可以在 payable 函数中接收 ETH,例如

    function deposit() payable public {
        require(msg.value > 0,"You need to send some Ether");
    }

但是我可以指定我想要收到的金额(固定费用),以便将其添加到交易成本中吗?

谢谢

解决方法

TLDR:在交易发送后执行合约功能。所以无法从合约中设置交易参数。


是否可以直接在代码中请求特定金额

不在 Solidity 代码中。如果发送的金额不是预期值,您只能抛出异常。

function deposit() payable public {
    require(msg.value == 0.1 ether,"You need to send 0.1 Ether");
}

您可以在创建交易请求时指定金额。例如 MetaMask 使用 Ethereum Provider API,因此您可以预定义 MetaMask 将显示的数量。

const params = [
  {
    from: '0xb60e8dd61c5d32be8058bb8eb970870f07233155',to: '0xd46e8dd67c5d32be8058bb8eb970870f07244567',value: '0x9184e72a',// 2441406250
  },];

ethereum
  .request({
    method: 'eth_sendTransaction',params,});

但用户可以在他们的钱包中覆盖此选项,或者他们始终可以使用不同的方式提交交易(不使用自定义值请求)。


该值(在 params JS 对象和 Solidity msg.value 全局变量中)始终不包括 gas 费用。

因此,如果您发送 0.1 ETH,则在此基础上添加 gas 费用,总成本可能为 0.10012345。 params.value 将包含 0.1 ETH(以 wei 为单位的十六进制数),而 msg.value 将包含 0.1 ETH(以 wei 为单位的十进制数)。