solidity - 如何设置 tx ETH 数量?
问题描述
我知道用户可以手动将 ETH 发送到合约/函数,但是有没有办法直接在代码中请求特定数量,以便将其添加到 gas 费用中,例如,dxsale.app 在创建一个预售(见下面的屏幕截图)——它将 0.1 ETH 的预售成本添加到 0.0072 的汽油费中,总计 0.1072。
这可以在 ERC20 合约中完成吗?我知道我可以在函数中接收 ETH payable
,例如
function deposit() payable public {
require(msg.value > 0, "You need to send some Ether");
}
但是我可以指定我想要收到的金额(固定费用),以便将其添加到 tx 成本中吗?
谢谢
解决方案
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 对象和 Soliditymsg.value
全局变量中)始终不包括汽油费。
因此,如果您发送 0.1 ETH,则在此基础上添加汽油费,总成本可能为 0.10012345。将params.value
包含 0.1 ETH(以 wei 表示的十六进制数),以及msg.value
将包含 0.1 ETH(以 wei 表示的十进制数)。
推荐阅读
- reactjs - 从预先存在的模板在 React 中创建计算器
- android - xamarin 条码扫描与手电筒
- wix - SourceProperty as Nested Directory in CopyFile
- terraform - 阿里云CMS报警不显示数据
- php - createView 上的会话错误 - Symfony 5.0
- javascript - Chartjs 计算图表中的元素
- python - 在pyomo python中定义因变量
- php - 如何将子数组与父数组合并
- nlp - 无法设置属性“trainable_weights”,可能是因为它与现有的只读冲突
- eiffel - eiffel:当断言打开时显式执行代码的语句