我知道用户可以手动将 ETH 发送到合约/函数,但是有没有办法直接在代码中请求特定金额,以便将其添加到 gas 费用中,例如,dxsale.app 的方式创建预售时(请参见下面的屏幕截图)- 它将 0.1 ETH 的预售成本添加到 0.0072 汽油费中,总计 0.1072。
这可以在 ERC20 合约中完成吗?我知道我可以在 payable
函数中接收 ETH,例如
function deposit() payable public {
require(msg.value > 0, "You need to send some Ether");
}
但是我可以指定我想要收到的金额(固定费用),以便将其添加到交易成本中吗?
谢谢
答案 0 :(得分:1)
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 为单位的十进制数)。