首页 > 其他分享 >世界杯竞猜项目Dapp-第三章(ERC20)

世界杯竞猜项目Dapp-第三章(ERC20)

时间:2022-12-13 16:01:31浏览次数:50  
标签:function 竞猜 returns Dapp Token 李四 address public ERC20

ERC20 是标准的以太坊 Token 协议,它也是一个合约代码,只要在该合约内部实现了特定的 6 个方法,就会被系统判定为代币合约,具体总结为:6 个必要接口,2 个必要事件,3 个可选接口,详情如下:

6 个必要接口

// 代币总发行量
function totalSupply() public view returns(uint256)

// 内部维护一个 mapping,返回余额
function balanceOf(address _owner) public view returns(uint 256 balance)

// token 持有人调用,进行转账(写操作,花钱)
// 张三 -> 李四, 100 * 10**18
function transfer(address _to, uint256 _value) public returns(bool success)

// 张三是 token 持有人, 作为 owner, 1w
// 张三将 1w 授权给李四
function approve(address _spender, uint256 _value) public returns(bool success)
allowanace[张三][李四] += 1w

function allowance(address _owner, address _spender) public view returns (uint256 remaining)
// 李四是被授权人,spender
// 王五是接受 token 的人,receiver

// 李四是张三的授权人,李四调用 transferFrom 给王五转账
function transferFrom(address _from, address _to, uint256 _value) public returns(bool success)

2 个必要事件

// 在tranfer 和transferFrom内部使用
event Transfer(address indexed _from, address indexed _to, uint256 _value)

// 在approve方法中使用
event Approval(address indexed _owner, address indexed _spender, uint256 _value)

3 个可选接口

// Token 名称
function name() public view returns (string)

// Token 标识,比如 ETH
function symbol() public view returns (string) 

// USDT:  6, 10000000 * 10**6
// WBTC:  8, 10000000 * 10**8
// 其他Token:18, 10000000 * 10**18
// 精度
function decimals() public view returns (uint8)

常见使用场景

  • 张三为 Token 持有人,李四为张三的委托人(被授权),王五是收款人
  • 张三调用 USDT 的 Approve 方法,授权李四可以支配 50w Token,调用格式为:USDT.Approve(李四, 50w)
  • 此时在 USDT 合约内部,会通过 allowance 进行记录:allowance[张三][李四] += 50w
  • 此时李四便可以支配张三的 50w USDT,并调用 transferFrom 给王五转转,调用形式为:USDT.transferFrom(张三, 王五, 1w)
  • 转账过后,张三的 Token 减少 1w,王五点 Token 增加 1w,李四被授权的额度减少 1w

实战发行 ERC20 Token

我们发行一个 worldCupToken,用于后续对参与竞猜的用户进行奖励,token信息如下:

  • Name:World Cup Token
  • Symbol:WCT
  • Decimals:18
  • TotalSupply:1w
    首先在 node_modules 目录下安装标准 openzeppeline 包以引入 ERC20
npm i @openzeppelin/contracts

创建 WorldCupToken.sol,如下:

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

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

contract WorldCupToken is ERC20 {
    // 一次性 mint 出来,不允许后续 mint
    // name:名称,symbol:token 标识,toalSupply:总发行量
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 totalSupply_
    ) ERC20(name_, symbol_) {
        _mint(msg.sender, totalSupply_);
    }
}

创建部署脚本 deployMockERc20.ts

import { ethers } from "hardhat";

async function main() {

  const totalSupply = ethers.utils.parseUnits('10000000', 18)
  console.log('totalSupply:', totalSupply);

  const FHTToken = await ethers.getContractFactory('WorldCupToken');
  const fht = await FHTToken.deploy("World Cup Token", "WCT", totalSupply);

  await fht.deployed();

  console.log(`new World Cup Token deployed to ${fht.address}`);
}

// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

编译部署合约:

# new World Cup Token deployed to 0x8fe664FA864C61054D2dec3dEB54b204a427d8A8
npx hardhat run scripts/deployMockERc20.ts --network goerli

// verify
npx hardhat verify --contract contracts/WorldCupToken.sol:WorldCupToken 0x8fe664FA864C61054D2dec3dEB54b204a427d8A8 "World Cup Token" "WCT" "10000000000000000000000000" --network goerli

标签:function,竞猜,returns,Dapp,Token,李四,address,public,ERC20
From: https://www.cnblogs.com/pandacode/p/16979043.html

相关文章

  • C# .NET 从dapper调用存储过程,该存储过程接受用户定义表类型的列表【实战】
    dapper给存储过程传《用户自定义表类型》tabledapper给存储过程传用户自定义表类型tabledapper给存储过程传table存储过程​​InsertUserInfo​​​,该存储过程接受《用......
  • 泰山众筹dapp项目开发原理分析(源码搭建)
    泰山众筹”是一种以卖货为主的一种电商商业模式。众筹模式是商城快速驱动用户自我裂变的一种促销活动。通过用户主动发起链接人脉,好友互助的模式,以更低的门槛参与并完成项......
  • 如何用vue+免费的webdb 实现一个世界杯足球竞猜系统
    一、前言最近世界杯在如火如荼的进行。我们都知道,中国也派出了我们的一支强大的队伍:中国建筑队,全程参与了世界杯的所有比赛。哈哈开个玩笑,不过说到世界杯,还真有不少朋友,不......
  • DApp实战:开发属于你的第一个DApp - 我的日记本
    效果预览项目的视频教程部分已经发布到了b站​​https://space.bilibili.com/391924926/channel/seriesdetail?sid=2745034​​初始化状态添加删除开发环境准备系统环境Remi......
  • 世界杯竞猜项目Dapp-第一章(合约开发)
    前言最近卡塔尔世界杯如火如荼,让我们一起来尝试利用solidity语言做一个世界杯竞猜的Dapp实战项目,本次实战学习主要参考:https://github.com/dukedaily/solidity-expert......
  • .NET6之MiniAPI(二十六):封装Dapper
    在上一篇说过,Dapper是通过扩展IDbConnection来达到实现的,那带来的一个问题就是隔离性不好,比如在做单元测试时,mock就有点困难,所以在实践中,我对Dapper作了扩展,下面分享出......
  • .NET6之MiniAPI(二十六):封装Dapper
    在上一篇说过,Dapper是通过扩展IDbConnection来达到实现的,那带来的一个问题就是隔离性不好,比如在做单元测试时,mock就有点困难,所以在实践中,我对Dapper作了扩展,下面分享出......
  • .NET6之MiniAPI(二十五):Dapper
    注:如果你使用Dapper一段时间了,这篇你可以跳过去了。在第十二篇中,我们聊过官方的ORM——EntityFramework,它可以把SQL细节都隐藏,这对于一些标准化的关系数据库项目......
  • .NET6之MiniAPI(二十五):Dapper
    注:如果你使用Dapper一段时间了,这篇你可以跳过去了。在第十二篇中,我们聊过官方的ORM——EntityFramework,它可以把SQL细节都隐藏,这对于一些标准化的关系数据库项目非......
  • .NET6之MiniAPI(二十五):Dapper
    注:如果你使用Dapper一段时间了,这篇你可以跳过去了。在第十二篇中,我们聊过官方的ORM——EntityFramework,它可以把SQL细节都隐藏,这对于一些标准化的关系数据库项目......