转账时拆分ETH

Splitting ETH when transferring

如果你能帮我解决这个简单的问题,我将不胜感激!

我想在智能合约中拆分资金:10% 给我朋友,90% 给我。我创建了一个变量,在withdraw()函数中写了如下代码:

address private constant _friend = 0xAb8483F64d9C6d1EcF9b849Aeblablalbasomeaddress;

在合同开始时:

function withdraw() public payable onlyOwner {
    uint balance = address(this).balance;
    payable(msg.sender).transfer(balance / 100 * 10);
    payable(_friend).transfer(balance / 100 * 90);
}

我在测试网上对此进行了测试,但我有点偏执。此代码有效吗?

为什么我觉得这可能有问题? 发送ETH的时候是要交手续费的,所以如果我发送msg.sender,那么我发送这个90%+佣金,我有足够的钱发送10%吗?

payable(msg.sender).transfer(balance / 100 * 10);
payable(_friend).transfer(balance / 100 * 90);

对于可被 100 整除的金额(以 wei 为单位),这将按预期工作。不能被 100 整除的金额将导致舍入错误,因为您正在处理 整数[=65 的除法=](不是小数)。所以你们中的任何一个都可能比预期的少一点。

示例:

  • balance = 200魏

    • msg.sender 得到 (200 / 100) * 10 = (2) * 10 = 20
    • _friend 得到 (200 / 100) * 90 = (2) * 90 = 180
  • balance = 150魏

    • msg.sender 得到 (150 / 100) * 10 = (1) * 10 = 10
    • _friend 得到 (150 / 100) * 90 = (1) * 90 = 90
    • 剩余60wei留在合约地址

Solidity 从左边解析两个运算符。因此,它首先计算 balance / 100,然后将结果乘以 1090


When sending ETH, you have to pay a commission

您可能是指汽油费。这是由执行 withdraw() 函数的地址在交易 value 之上支付的。汽油费 不会 影响将由每个 transfer() 函数生成的内部交易(及其 value)。

示例:

  1. 您正在发送 1 个 ETH(或 1000000000000000000 wei)value 以及执行 withdraw() 函数的交易。汽油费为 0.001 ETH,因此您支付的总金额为 1.001 ETH。但是,费用转到了网络,因此合约仍然只收到 1 ETH 的 value

  2. 然后它被分成两个内部交易 - 0.1 ETH 给你(作为 msg.sender)和 0.9 ETH 到 _friend 地址。这些内部交易的 gas 费已经包含在主交易(第 1 点)费用中。