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

代币的发行需先明确以下关键信息:
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主网,完成代币正式发行。
https://rpc.eulscan.com),确保钱包内有足够的EUL代币(用于支付Gas费,建议至少预留10-20 EUL)。 在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
本文由用户投稿上传,若侵权请提供版权资料并联系删除!