如何写个众筹合约

这篇具有很好参考价值的文章主要介绍了如何写个众筹合约。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

编写众筹合约涉及使用 Solidity 语言来定义智能合约。以下是一个简单的众筹合约示例,基于以太坊的 ERC-20 代币标准。请注意,这只是一个基础示例,实际应用中可能需要更多的安全性和功能。

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

contract Crowdfunding {
    address public owner;
    IERC20 public token; // 使用的代币合约地址
    uint256 public goal; // 众筹目标
    uint256 public deadline; // 截止日期
    uint256 public raisedAmount; // 已筹集金额
    mapping(address => uint256) public contributions; // 参与者的贡献记录
    bool public fundingGoalReached = false; // 众筹目标是否达成
    bool public crowdsaleClosed = false; // 众筹是否关闭

    event Contribution(address indexed contributor, uint256 amount);
    event FundingGoalReached(uint256 amountRaised);
    event CrowdsaleClosed();

    modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can call this function");
        _;
    }

    modifier notClosed() {
        require(!crowdsaleClosed, "Crowdsale is closed");
        _;
    }

    modifier afterDeadline() {
        require(block.timestamp >= deadline, "Crowdsale deadline has not passed");
        _;
    }

    constructor(
        address _token,
        uint256 _goal,
        uint256 _durationInMinutes
    ) {
        owner = msg.sender;
        token = IERC20(_token);
        goal = _goal;
        deadline = block.timestamp + _durationInMinutes * 1 minutes;
    }

    function contribute(uint256 _amount) external notClosed {
        require(block.timestamp < deadline, "Crowdsale has ended");
        require(raisedAmount + _amount <= goal, "Contribution exceeds the goal");

        token.transferFrom(msg.sender, address(this), _amount);
        contributions[msg.sender] += _amount;
        raisedAmount += _amount;

        emit Contribution(msg.sender, _amount);

        if (raisedAmount >= goal) {
            fundingGoalReached = true;
            emit FundingGoalReached(raisedAmount);
        }
    }

    function withdraw() external afterDeadline {
        require(fundingGoalReached, "Funding goal not reached");
        uint256 amount = contributions[msg.sender];
        contributions[msg.sender] = 0;
        token.transfer(msg.sender, amount);
    }

    function closeCrowdsale() external onlyOwner {
        require(!crowdsaleClosed, "Crowdsale already closed");
        crowdsaleClosed = true;
        emit CrowdsaleClosed();
    }
}
```

上述合约使用了 OpenZeppelin 的 ERC20 合约库,确保了在代币交互方面的安全性。在实际使用中,你需要引入相关的库文件,可以通过 [OpenZeppelin GitHub](https://github.com/OpenZeppelin/openzeppelin-contracts) 获取。

此众筹合约支持以下功能:

1. 设置众筹目标、截止日期和代币。
2. 参与者可以通过 `contribute` 函数贡献代币。
3. 在达到众筹目标后,参与者可以通过 `withdraw` 函数提取代币。
4. 合约拥有者可以通过 `closeCrowdsale` 函数关闭众筹。

请确保在实际使用前仔细测试和审查合约,以确保其符合项目需求并且安全可靠。

具体可以参照下面的合约适当修改,仅供学习参考。文章来源地址https://www.toymoban.com/news/detail-808303.html

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

contract Crowdfunding {
    address public owner;
    IERC20 public token; // 使用的代币合约地址
    uint256 public goal; // 众筹目标
    uint256 public deadline; // 截止日期
    uint256 public raisedAmount; // 已筹集金额
    mapping(address => uint256) public contributions; // 参与者的贡献记录
    bool public fundingGoalReached = false; // 众筹目标是否达成
    bool public crowdsaleClosed = false; // 众筹是否关闭

    event Contribution(address indexed contributor, uint256 amount);
    event FundingGoalReached(uint256 amountRaised);
    event CrowdsaleClosed();

    modifier onlyOwner() {
        require(msg.sender == owner, "Only the owner can call this function");
        _;
    }

    modifier notClosed() {
        require(!crowdsaleClosed, "Crowdsale is closed");
        _;
    }

    modifier afterDeadline() {
        require(block.timestamp >= deadline, "Crowdsale deadline has not passed");
        _;
    }

    constructor(
        address _token,
        uint256 _goal,
        uint256 _durationInMinutes
    ) {
        owner = msg.sender;
        token = IERC20(_token);
        goal = _goal;
        deadline = block.timestamp + _durationInMinutes * 1 minutes;
    }

    function contribute(uint256 _amount) external notClosed {
        require(block.timestamp < deadline, "Crowdsale has ended");
        require(raisedAmount + _amount <= goal, "Contribution exceeds the goal");

        token.transferFrom(msg.sender, address(this), _amount);
        contributions[msg.sender] += _amount;
        raisedAmount += _amount;

        emit Contribution(msg.sender, _amount);

        if (raisedAmount >= goal) {
            fundingGoalReached = true;
            emit FundingGoalReached(raisedAmount);
        }
    }

    function withdraw() external afterDeadline {
        require(fundingGoalReached, "Funding goal not reached");
        uint256 amount = contributions[msg.sender];
        contributions[msg.sender] = 0;
        token.transfer(msg.sender, amount);
    }

    function closeCrowdsale() external onlyOwner {
        require(!crowdsaleClosed, "Crowdsale already closed");
        crowdsaleClosed = true;
        emit CrowdsaleClosed();
    }
}

到了这里,关于如何写个众筹合约的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【区块链 | 智能合约】Ethereum源代码 - 智能合约地址生成算法

    当提交智能合约部署后,会返回智能合约的地址。智能合约地址的生成逻辑在eth.api.go的submitTransaction函数中:

    2024年02月13日
    浏览(49)
  • solidity案例详解(七)复杂众筹合约

    自己原创智能合约,有作业需求可加下面的图片中的裙 1、在 Remix 中,以 Account1 完成“众筹项目”合约的编译和部署。(显示合约、函数、状态变量、结构体、事件的命名) 2、在 Remix 中,以 Account2 完成“参与众筹”合约的编译和部署。 3、显示合约中的众筹项目数量。 4、

    2024年02月04日
    浏览(41)
  • 区块链java开发智能合约nf(部署第一个NFT智能合约)

    手把手教你区块链java开发智能合约nft-第二篇(部署第一个NFT智能合约) 刚搞区块链开发真的是太累了,自己摸石头过河,动不动就报错,网上搜索错误,一律看不出什么问题,或者报错的信息太少,问同事同事不鸟,问领导,领导也烦,无奈,对于英文不好的我,只能被迫

    2024年02月12日
    浏览(57)
  • 区块链智能合约代码示例

            以下是一个简单的区块链智能合约代码示例: 该合约具有以下功能: 定义了一个名为 SimpleContract 的合约。 定义了一个名为 myData 的公共整数变量。 定义了一个名为 setMyData 的公共函数,该函数接受一个 uint 类型的参数 newData,并将其设置为 myData 的新值。 在 So

    2024年02月14日
    浏览(47)
  • 区块链智能合约

    合同(Contract)又称契约、协议,是平等主体的自然人、法人、其他组织之间设立、变更、终止民事权利义务关系的协议。本质上讲,合同是当事双方或多方在并没有充足信任的情况下,通过文字的约定和法律的权威,对各自的权利与义务进行的约定。 制订合同的目的就在于

    2024年01月18日
    浏览(50)
  • 区块链与智能合约

    要想理解什么区块链,我们先来从本质上认识一下它 区块链:本质上是一个去中心化的分布式账本数据库,是指通过去中心化和去信任的方式集体维护一个可靠数据库的技术方法。 没有基础的人可能理解起来有点困难,我们来解释一下里边的名词 分布式账本数据库:了解过

    2024年03月26日
    浏览(91)
  • 区块链智能合约基础

    什么是智能合约 简单来说,智能合约是一种满足在一定条件时,就执行的程序,例如自动售货机就类似一个智能合约系统。 1.向自动售货机投入足够硬币,按下按钮 2.售货机供出商品 3.售货机回到初始状态 智能合约的工作原理 智能合约是一段程序(代码和数据的集合),可

    2024年02月13日
    浏览(44)
  • 区块链智能合约开发学习

    最近正在肝区块链知识学习,入手学习智能合约的开发,由于网上资料实在是太少了,好不容易东拼西凑完成了智能合约的开发、编译、部署、web3js调用(网页页面)和web3j调用(java调用),赶紧趁热把重点提炼出来。 先上图,是我最近学习知识点的一个概括总结,此外还包

    2023年04月18日
    浏览(42)
  • 区块链之智能合约

    智能合约( Smart Contract)是以计算机为主要工具,将数学算法嵌入到程序中,用以证明某个事件是否符合约定条件,并保证各方在约定时间内按照约定条件达成一致,以验证和执行合同条款的计算机文本。简单来说智能合约是一个计算机程序,可以在不需要第三方介入的情况

    2024年02月07日
    浏览(46)
  • 【区块链 | 审计】智能合约审计指南

    区块链技术正在改变各行各业的游戏规则,而智能合约是这一进程的关键部分。智能合约通过消除第三方中介机构来确保各方之间的信任,有助于降低成本,同时也增加透明度。如果你要写一个智能合约,关键是你要对代码进行审计,以确保它能正常工作--而且不会有任何错

    2024年02月07日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包