React Native DApp 开发全栈实战·从 0 到 1 系列(一键发token)

前言

本文通过 OpenZeppelin 与 ethers.js 打通前端与合约,实现 ERC20 代币的一键发行,完成最小可行闭环。

前置准备

  • 启动自定义网络:ganache 把账号导入钱包中
  • 使用hardhat构建编写,编译合约
  • OpenZeppelin简化合约开发
  • 表格总结:
工具 作用 一条命令
Ganache 本地测试链 ganache-cli
Hardhat 编译 npx hardhat compile
MetaMask 浏览器钱包 把 Ganache 私钥导入即可

合约部分

合约说明 :基于ERC20实现标准代币,不设权限所有账号都可以发布自己的代币

typescript 复制代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

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

contract MyToken is ERC20 {
    // 一键发币:部署时把全部供应量打给部署者
    constructor(
        string memory name,
        string memory symbol,
        uint256 totalSupply
    ) ERC20(name, symbol) {
        _mint(msg.sender, totalSupply * 10 ** decimals());
    }
}

编译说明 :编译合约生成代币xx.json文件,用于前端部分使用

编译指令 :npx hardhat compile

编译说明 :执行此指令会生成新的文件夹《contracts》在此文件中找到对应的json文件

前端使用 :例如:/contracts/MyToken.sol/MyToken.json,把MyToken.json导入到前端项目中

补充说明 :关于hardhat相关的内容可以查看作者写的另一篇文章《智能合约开发、测试、部署全流程(实操篇)》

前端部分

一键发币核心代码

typescript 复制代码
import { useRouter } from "expo-router";
import { abi, bytecode } from "@/abi/MyToken.json";//合约编译生成的.json
import * as ethers from 'ethers';
const provider = new ethers.providers.Web3Provider(window.ethereum);
const router=useRouter();//路由
const deploy = async () => {
        await provider.send('eth_requestAccounts', []); // 唤起钱包
        const signer = await provider.getSigner();
        const factory = new ethers.ContractFactory(abi, bytecode, signer);
        console.log(factory)
        const contract = await factory.deploy(name,symbol,supply);
        await contract.deployed();
        console.log("tokenAddress",contract.address);
        console.log(contract)
        if(contract.address){
        //部署成功后进行后续操作 例如:
            router.push({
                pathname:"/home/addToken",
                params:{
                    address:contract.address
                }
            })
        }
    }

合约交互核心代币

ini 复制代码
# 代币部署成功后,查看代币基本信息,以及调用代币事件
import { useRouter,useLocalSearchParams } from "expo-router";
import { abi, bytecode } from "@/abi/MyToken.json";//合约编译生成的.json
import * as ethers from 'ethers';
import { useState } from 'react';
//读取代币基本信息
const { address } = useLocalSearchParams();//合约地址
const [TokenName,setTokenName]=useState('');
const [TokenSymbol,setTokenSymbol]=useState(''); 
const [TokenDecimals,setTokenDecimals]=useState(0);
const [TokenTotalSupply,setTokenTotalSupply]=useState(0);
const tokenDetailFn= async ()=>{
    const provider = new ethers.providers.Web3Provider(window.ethereum);
    // await provider.send('eth_requestAccounts', []); // 唤起钱包
    // const signer = await provider.getSigner();
    const contract = new ethers.Contract(address as string, abi, provider);
    const name = await contract.name();
    const symbol = await contract.symbol();
    const decimals = await contract.decimals();
    const totalSupply = await contract.totalSupply();
    const totalReadable = ethers.utils.formatUnits(totalSupply, decimals);//代币单位转换
    console.log(name,symbol,decimals,totalReadable)
    setTokenName(name);
    setTokenSymbol(symbol);
    setTokenDecimals(decimals);
    setTokenTotalSupply(Number(totalReadable));
    //也可以调用合约的事件:如下表
}

代币事件列表

事件 触发时机 参数
Transfer 发生代币转移(transfer、transferFrom 成功时) from, to, value
Approval 授权额度被更新(approve/permit 成功时) owner, spender, value

效果图

总结

以上就是实现 ERC20 代币的一键发行,完成最小可行闭环,如果想进一步完善可以补充权限管理、白名单、Mint 策略等高级功能。

相关推荐
木西5 天前
AI 驱动的去中心化资产管理:QuantixAI 核心金库与智能风控架构解析
web3·智能合约·solidity
m0_547486667 天前
《Web开发技术基础》全套PPT课件2026
web3·web开发
徐征6398 天前
邮件安全防护体系技术拆解:从入口过滤到大模型研判的检测流水线 北京方向标
web3·生活
米小虾8 天前
币安 63 亿美元被盗:被攻破的不是私钥,是那台负责签名的机器
黑客·web3
OxYGC10 天前
[Web3] 的⛽ Gas 革命:五大协议群组如何终结“Gas 痛点
web3·1024程序员节·layer2·gas·erc-4337
OxYGC10 天前
[Web3] 去中心化基石 - BIP铁三角(BIP32/39/44)
web3·1024程序员节·钱包·bip32·bip44
磐链科技10 天前
IM聊天Web3钱包定制开发指南:从业务场景梳理、系统功能规划到产品迭代与生态扩展
web3
limit007512 天前
三维 WebGIS 工具选型:加载、样式、分析、交付,一套界面能做完什么
android·前端·web3·安卓·webgl
木西12 天前
dAppOS 意图执行网络核心技术剖析:从智能账户、生息资产金库到 OMS 乐观质押仲裁的 Solidity 0.8.28 实现
web3·智能合约·solidity
limit007513 天前
公开 WMTS / XYZ 瓦片接入 Cesium:6 类常见问题与排查顺序
chrome·低代码·arcgis·web3·旅游