ERC20的创建及合约之间的调用(合约调用合约)

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

ERC20 Token

ERC20是一个token合约标准,具体的概念和友好的合约库,可参考openzeppelin.接下来的代码创建一个erc20 token

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

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

contract IcoToken is ERC20{
    constructor(uint256 initialSupply) ERC20("xoToken","XO"){
        _mint(msg.sender,initialSupply);
    }
}

注:solidity 0.6.8版本以后增加的SPDX申明,许可证标识符是必须要有的

合约与合约间的调用

关于合约与合约的调用我们以ICO作为示例来展示

什么是ICO,大致意思是,你有一个很好的项目需要融资,对方给你ETH,你发行代币(ERC20 Token)给投资人

所以ICO会是一个独立的合约,ERC20 Token又是另外一个合约,代码在上一个代码片段已体现,接下来通过ICO合约 展示合约间的调用

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "./a_IcoToken.sol";

contract IcoExchange{
    using SafeMath for uint256;
    // ico的状态定义
    enum IcoState {Before,Start,End}
    IcoState public icoState = IcoState.Before;
    address private owner;
    // ico的token地址
    IcoToken public icoToken ;
    uint256 public totalSupply= 1000000 * (10**18);
    uint256 public exchangeTokenTotal = 0;
    uint256 public rate =2;

    constructor(){
        // 申明ico属主
        // 创建ico token
        owner = msg.sender;
        icoToken=new IcoToken(totalSupply);
    }

    event ReceiveICO(address from,uint256 ethValue,uint256 icoTokenValue);
    event StartICO(address who);
    event EndICO(address who,uint256 allEth,uint256 exchangeTokenTotal);

    // 判断ico属主
    modifier isOwner(){
        require(owner== msg.sender,"must the owner");
        _;
    }
    // 判断当前状态
    modifier inBefore(){
        require(icoState==IcoState.Before,"icoState is not Before");
        _;
    }
    modifier inStart(){
        require(icoState==IcoState.Start,"icoState is not Start");
        _;
    }
    // ico的状态控制
    function startICO() public isOwner inBefore {
        icoState = IcoState.Start;
        emit StartICO(msg.sender);
    }
    function endICO() public isOwner inStart{
        emit EndICO(msg.sender,address(this).balance,exchangeTokenTotal);
        // eth提取
        payable(owner).transfer(address(this).balance);
        // 剩余代币返还给ico的发起人
        icoToken.transfer(owner,totalSupply.sub(exchangeTokenTotal));
        icoState = IcoState.End;
    }
    function inICO() public inStart payable{
        require(msg.value>0,"inICO can't <=0");
        // 发送代币给对方
        uint256 bossTokenValue = rate.mul(msg.value);
        require(totalSupply.sub(exchangeTokenTotal)>bossTokenValue,"icoTOken balance not enough");
        icoToken.transfer(msg.sender,bossTokenValue);
        exchangeTokenTotal = exchangeTokenTotal.add(bossTokenValue);
        emit ReceiveICO(msg.sender,msg.value,bossTokenValue);
    }
    receive() external payable{
        inICO();
    }

}

测试方式:你可以再remix完成编译部署和测试

前置: 运行环境(ENVIRONMENT)选择= Remix VM(London)

1.编译和部署 假设A地址部署合约

2.测试开启ICO:A地址触发合约方法:startICO

3.测试投资:其它地址直接向合约地址转ETH,或调用合约方法inICO

4.测试结束投资: A地址触发合约方法: endICO

结束时 测试结果示例

ERC20的创建及合约之间的调用(合约调用合约)

上个例子展示的是创建合约+合约间的调用,那么传入合约地址,怎么调用合约方法呢

很简单 示例如下:

        1. 引入合约的接口或直接就合约引入

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

        2. 如下方式得到合约实例并调用合约方法,erc20实例代码

                IERC20(合约地址).totalSupply()          // 查询某一个erc20合约的token发行量文章来源地址https://www.toymoban.com/news/detail-460098.html

到了这里,关于ERC20的创建及合约之间的调用(合约调用合约)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 前端VUE使用web3调用小狐狸(metamask)和合约(ERC20)交互

    1.创建vue项目 2.安装web3 npm install web3 3.项目web3 main.js 项目结构 页面代码中引用web3,倒入ERC20代币的abi 项目页面   调用小狐狸metamask演示   项目任何难题,可以加入qq群:981921011      

    2024年02月15日
    浏览(30)
  • 创建你自己的ERC-721代币:一个简单的以太坊游戏智能合约模板

    区块链游戏正在成为一种新兴的游戏形式,其中代币化的游戏资产成为了一个重要的组成部分。今天,我们将介绍一个简单的ERC-721智能合约模板,这个模板可以帮助你在以太坊区块链上创建你自己的ERC-721代币,让你的游戏更有趣。 源码下载 ERC-721是一种免费的开放标准,它

    2024年02月07日
    浏览(40)
  • ERC20合约入门

    这篇文章会手把手的教你开发智能合约的基本流程,带你快速入门智能合约的开发。这篇文章假设你了解区块链的基础知识,有一定的开发经验,如果不懂的可以私信我,我发给你一些资料。 智能合约的开发流程是 智能合约最简单的开发方式是用 Remix 在线编辑程序开发,这

    2024年02月03日
    浏览(33)
  • 以太坊数字资产的发行和流通:以太坊上的数字资产定义、ERC 20代币合约标准、ERC 20标准接口、ERC 721代币合约标准、

    以太坊设计的目标就是让各种数字资产能以智能合约的形式运行在以太坊虚拟机上。目前,众多智能合约中最广泛应用的是代币合约(Token Contract)。是负责管理账户以及其拥有的代币的智能合约,实质可以理解为一张账户地址和对应账户代币余额的映射表。 即:代币可以被

    2023年04月11日
    浏览(44)
  • 智能合约 之 ERC-20介绍

    ERC20 全称为 Ethereum Request for Comment 20 ,是一种 智能合约标准 ,用于以太坊网络上的代币发行 姊妹篇 - 如何部署ERC20 代币化资产,例如:USDT 是一种以美元为背书的ERC20代币,每个USDT代币都代表着1美元的价值,用户可以随时兑换成等值的美元 去中心化加以所,许多去中心化交

    2024年04月15日
    浏览(27)
  • 关于以太坊ERC-20通证智能合约协议

    ERC代表“Etuereum Request for Comment”,以太坊社区为了创建一个以太坊平台的标准,开发人员提交了一个以太坊改进方案(EIP),改进方案中包括协议规范和合约标准。最终确定的EIP为以太坊开发者提供了一套可实施的标准。这使得智能合约可以遵循这些通用的接口标准来构建。可

    2024年02月04日
    浏览(36)
  • 智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击

    Safful发现了一个有趣的错误,有可能成为一些 DeFi 项目的攻击媒介。这个错误尤其与著名的 ERC777 代币标准有关。此外,它不仅仅是众所周知的黑客中常见的简单的重入问题。 这篇文章对 ERC777 进行了全面的解释,涵盖了所有必要的细节。深入研究 ERC777 代币的具体细节的资源

    2024年02月04日
    浏览(29)
  • 【solidity三】Solidity中继承、创建合约和外部调用、合约事件event、solidity中元祖的使用、new、delete关键字的使用、solisity创建合约和外部调用

    - 最重要的两个全局变量 msg.sender 每一次和以太坊交互时都会产生一笔交易,这笔交易的执行人就是msg.sender。简而言之:谁调用的,msg.sender就是谁,每笔交易的msg.sender都可以不同。举例: 部署合约的时候,msg.sender就是部署的账户。 调用setMessage时,msg.sender就是调用账户。

    2024年02月03日
    浏览(35)
  • 如何在智能合约中调用另一个合约的函数

    智能合约是在区块链中被执行的一段程序,因为它们在区块链上执行,所以不依赖于任何的中心化服务器。目前最主流的智能合约编程语言是 Solidity。 在以太坊区块链中,智能合约可以和其他已经部署的智能合约进行交互。除了以太坊,其他 EVM 兼容的区块链(使用以太坊虚

    2024年01月22日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包