微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

创建一个智能合约,持有并发送资金以设置钱包

如何解决创建一个智能合约,持有并发送资金以设置钱包

嗨,我是智能合约的新手,我正在尝试创建一个在创始人之间存储和分配资金的合约,这是否接近或任何人都可以帮助我。谢谢

// 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,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;
        }
    }
}

解决方法

您的代码仅在创建合同时分配 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;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?