在去中心化金融(DeFi)和区块链技术快速发展的今天,许多开发者和项目方希望通过发行代币来构建社区、融资或实现生态价值,EUL链(Ethereum Ultra Chain,以太坊超链)作为兼容以太坊虚拟机(EVM)的高性能公链,凭借低Gas费、高TPS和良好的生态兼容性,成为中小项目方发行代币的热门选择,本文将详细介绍在EUL链上发行代币的完整步骤,涵盖环境准备、合约编写、测试验证到主网上线的全流程,助你轻松完成发

发币前的准备工作:明确目标与工具选择
在开始发币流程前,需明确代币的核心属性与目标,这直接影响后续的技术选型与合约设计。
确定代币核心属性
代币的发行需先明确以下关键信息:
- 代币名称:用户识别的名称,如“Ultra Token”(需注意与现有代币重名风险)。
- 代币符号:交易所和钱包中显示的简称,通常2-5个字符,如“ULT”。
- 总供应量:代币发行总量,如“1,000,000,000”(10亿),需考虑小数位数(通常18位,与以太坊兼容)。
- 代币类型:常见为ERC-20标准( fungible token,同质化代币,适用于支付、治理等场景),若需NFT功能则选择ERC-721/ERC-1155,本文以ERC-20为例。
- 特殊功能:是否包含手续费(如每笔转账自动燃烧1%给团队)、权限控制(如只有指定地址可 mint)等,需在合约中提前定义。
准备开发环境
- 钱包工具:使用MetaMask(小狐狸钱包),创建并备份好钱包助记词,确保钱包内有足够的EUL链代币(用于支付Gas费)。
- 开发框架:Hardhat(推荐,适合Solidity合约开发与测试)或Truffle,本文以Hardhat为例。
- 代码编辑器:VS Code,安装Solidity插件(语法高亮、错误提示)。
- 测试网络:EUL链测试网(如Goerli测试网,需在MetaMask中添加测试网RPC节点,获取测试代币用于Gas费)。
编写ERC-20代币合约:核心逻辑实现
ERC-20是以太坊生态中最通用的代币标准,定义了代币的基本功能(如转账、余额查询、授权等),EUL链兼容EVM,可直接使用Solidity编写ERC-20合约。
安装开发依赖
在项目目录下打开终端,安装Hardhat和相关依赖:
# 初始化Hardhat项目 npx hardhat init # 安装依赖(OpenZeppelin提供安全的ERC-20合约模板) npm install @openzeppelin/contracts npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox
编写合约代码
在contracts目录下创建新文件UltraToken.sol,编写ERC-20合约,以下为包含基础功能(总供应量、转账、权限控制)的完整代码:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract UltraToken is ERC20, Ownable {
constructor(
string memory name,
string memory symbol,
uint256 initialSupply
) ERC20(name, symbol) Ownable(msg.sender) {
_mint(msg.sender, initialSupply * 10**decimals()); // 默认18位小数
}
// 仅owner可mint(增发代币)
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
// 销毁代币(burn)
function burn(uint256 amount) public {
_burn(msg.sender, amount);
}
}
代码解析:
ERC20:继承OpenZeppelin的ERC-20标准合约,实现transfer、balanceOf等基础功能。Ownable:实现权限控制,仅合约创建者(owner)可执行mint(增发)、burn(销毁)等操作。_mint:在构造函数中初始化总供应量,并铸造给部署者(msg.sender)。decimals():返回代币小数位数(默认18位,与以太坊一致)。
编译合约
在终端运行编译命令,检查代码是否有误:
npx hardhat compile
编译成功后,合约ABI(应用程序二进制接口)和字节码会生成在artifacts/contracts/目录下,后续部署时需用到。
测试合约功能:确保逻辑正确
在主网部署前,需在测试网上验证合约功能,避免因代码错误导致资产损失。
配置测试网络
在hardhat.config.js中添加EUL测试网配置(以Goerli测试网为例):
require("@nomicfoundation/hardhat-toolbox");
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
solidity: "0.8.20",
networks: {
eul_testnet: {
url: "https://rpc.eul-testnet.xyz", // 替换为EUL测试网RPC
accounts: ["你的钱包私钥"], // 从MetaMask导出的私钥(仅测试用,主网勿泄露)
},
},
};
编写测试脚本
在test目录下创建ultraToken.test.js,编写测试用例(覆盖转账、mint、burn等核心功能):
const { expect } = require("chai");
const { ethers } = require("hardhat");
describe("UltraToken", function () {
let token;
let owner;
let addr1;
beforeEach(async function () {
[owner, addr1] = await ethers.getSigners();
const Token = await ethers.getContractFactory("UltraToken");
token = await Token.deploy("Ultra Token", "ULT", ethers.parseUnits("1000000", 18)); // 初始供应100万
await token.waitForDeployment();
});
it("Should assign the total supply of tokens to the owner", async function () {
const ownerBalance = await token.balanceOf(owner.address);
expect(await token.totalSupply()).to.equal(ownerBalance);
});
it("Should transfer tokens between accounts", async function () {
await token.transfer(addr1.address, ethers.parseUnits("1000", 18));
expect(await token.balanceOf(addr1.address)).to.equal(ethers.parseUnits("1000", 18));
});
it("Should allow owner to mint tokens", async function () {
await token.mint(addr1.address, ethers.parseUnits("500", 18));
expect(await token.balanceOf(addr1.address)).to.equal(ethers.parseUnits("1500", 18));
});
it("Should not allow non-owner to mint tokens", async function () {
await expect(token.connect(addr1).mint(addr1.address, ethers.parseUnits("500", 18)))
.to.be.revertedWith("Ownable: caller is not the owner");
});
});
运行测试
执行测试命令,检查所有用例是否通过:
npx hardhat test --network eul_testnet
若测试通过,说明合约逻辑正确;若失败,需根据错误提示修改代码并重新编译测试。
部署合约到EUL主网:正式发币
测试通过后,即可将合约部署到EUL主网,完成代币正式发行。
准备主网环境
- MetaMask配置:添加EUL主网RPC节点(如
https://rpc.eulscan.com),确保钱包内有足够的EUL代币(用于支付Gas费,建议至少预留10-20 EUL)。 - 获取私钥:在MetaMask中点击“账户详情”→“导出私钥”(注意:私钥等同于钱包密码,切勿泄露给他人)。
修改部署脚本
在scripts目录下创建deploy.js,编写部署脚本(使用ethers.js与合约交互):
async function main() {
const [deployer] = await ethers.getSigners();
console.log("Deploying contracts with the account:", deployer.address);
const Token = await ethers.getContractFactory("UltraToken");
const token = await Token.deploy(
"Ultra Token", // 代币名称
"ULT", // 代币符号
ethers.parseUnits("1000000000", 18) // 总供应量10亿(18