【问题标题】:create a smart contract that holds and sends funds to set wallets创建一个智能合约,持有并发送资金以设置钱包
【发布时间】:2021-03-05 15:13:11
【问题描述】:

您好,我是智能合约的新手,并试图创建一个在创始人之间存储和分配资金的合约,这已经接近尾声了,或者任何人都可以帮助我。谢谢

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.7.4;

import './Ownable.sol';

interface wallet {

    function getCut(address _from, address _to, uint _value) external returns(bool success);

    function splitFoundersCut(uint _amount, address Ceo, address Cfo, address Cto) external returns(bool success);
}

interface ERC20 {
    function totalSupply() external view returns(uint supply);

    function balanceOf(address _owner) external view returns(uint balance);

    function transfer(address _to, uint _value) external returns(bool success);

    function transferFrom(address _from, address _to, uint _value) external returns(bool success);

    function approve(address _spender, uint _value) external returns(bool success);

    function allowance(address _owner, address _spender) external view returns(uint remaining);

    function decimals() external view returns(uint digits);
    event Approval(address indexed _owner, address indexed _spender, uint _value);

    function deposit() external payable;

    function withdraw(uint256 wad) external;
}

contract FoundersWallet is Ownable {

    address payable Ceo = 0x471F9361ec8Fc947d371B95e5a5f5820C7A42A1B;
    address payable Cto = 0x471F9361ec8Fc947d371B95e5a5f5820C7A42A1B;
    address payable Cfo = 0x471F9361ec8Fc947d371B95e5a5f5820C7A42A1B;

    uint256 amount = address(this).balance;

    function withdraw() internal returns(bool) {

        if(amount > 0) {
            Ceo.transfer((amount / 40));
            Cto.transfer((amount / 40));
            Cfo.transfer((amount / 20));
        }

        else {
            return false;
        }
    }
}

【问题讨论】:

    标签: solidity smartcontracts ether


    【解决方案1】:

    您的代码仅在创建合约时分配 uint256 amount 的值,而不是在余额更改时更新它。这将导致 amount 的值始终为 0

    注意:我不计算边缘情况,例如在部署合约之前合约地址已经具有 ETH 价值,或者使用 selfdestruct() 将 ETH 发送到您的合约。这些都是有效的案例,但超出了这个问题的范围。

    withdraw() 函数应返回布尔值。但是当你不返回任何值时,调用者可能会将其解释为false。所以如果转移成功,我会建议return true

    另外,您可能希望能够在外部调用withdraw() 函数,因此将其标记为external 而不是internal但这取决于您的用例,也许您已经在内部从另一个未在您的问题中显示的函数调用它。

    pragma solidity ^0.7.4;
    
    contract FoundersWallet is Ownable {
    
        address payable Ceo = 0x471F9361ec8Fc947d371B95e5a5f5820C7A42A1B;
        address payable Cto = 0x471F9361ec8Fc947d371B95e5a5f5820C7A42A1B;
        address payable Cfo = 0x471F9361ec8Fc947d371B95e5a5f5820C7A42A1B;
    
        function withdraw() external returns(bool) { // visibility `external`
            // moved the `amount` here so that it's recalculated on each function call
            uint256 amount = address(this).balance;
    
            if(amount > 0) {
                Ceo.transfer((amount / 40));
                Cto.transfer((amount / 40));
                Cfo.transfer((amount / 20));
                
                return true; // added the return value
            }
            
            // don't need the `else` because of the early return
            return false;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-09-28
      • 2022-06-17
      • 2021-10-01
      • 1970-01-01
      • 2021-07-21
      • 2021-12-17
      • 2021-12-12
      • 2019-01-19
      • 2022-01-02
      相关资源
      最近更新 更多