目标:用Foundry创建并部署一个ERC20代币
第一步:安装Foundry(5分钟)
打开终端(Mac/Linux)或WSL(Windows),逐行执行:
1. 安装Foundry
curl -L https://foundry.paradigm.xyz | bash
2. 重启终端,然后运行
foundryup
3. 验证安装(应该显示版本号)
forge --version
cast --version
anvil --version
如果看到版本号,恭喜!安装成功!
第二步:创建项目(2分钟)
1. 创建项目文件夹
mkdir my-first-token
cd my-first-token
2. 用Foundry初始化项目
forge init
3. 查看生成的文件结构
ls -la
你会看到这样的文件夹结构:
my-first-token/
├── src/ # 放智能合约代码
├── script/ # 放部署脚本
├── test/ # 放测试代码
├── lib/ # 依赖库
└── foundry.toml # 配置文件
第三步:写一个简单代币合约(5分钟)
在 src/MyToken.sol文件中写入:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "forge-std/console.sol"; // 用于调试输出
contract MyToken {
string public name = "My First Token";
string public symbol = "MFT";
uint8 public decimals = 18;
uint256 public totalSupply = 1000000 * 10**18; // 100万代币
mapping(address => uint256) public balanceOf;
event Transfer(address indexed from, address indexed to, uint256 value);
constructor() {
balanceOf[msg.sender] = totalSupply; // 部署者获得所有代币
console.log("代币部署完成,总供应量:", totalSupply);
}
function transfer(address to, uint256 amount) external returns (bool) {
require(balanceOf[msg.sender] >= amount, "余额不足");
balanceOf[msg.sender] -= amount;
balanceOf[to] += amount;
emit Transfer(msg.sender, to, amount);
return true;
}
}
第四步:编译合约(1分钟)
在项目根目录执行
forge build
看到 Success表示编译成功!
第五步:测试合约(3分钟)
在 test/MyToken.t.sol文件中写入:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "forge-std/Test.sol";
import ".../src/MyToken.sol";
contract MyTokenTest is Test {
MyToken token;
address owner = address(0x123); // 测试账户
function setUp() public {
token = new MyToken(); // 每个测试前部署新合约
}
function testInitialBalance() public {
// 测试部署者是否有全部代币
assertEq(token.balanceOf(address(this)), 1000000 * 10**18);
}
function testTransfer() public {
address alice = address(0x456);
// 转账测试
token.transfer(alice, 1000);
// 验证余额
assertEq(token.balanceOf(alice), 1000);
assertEq(token.balanceOf(address(this)), 1000000 * 10**18 - 1000);
}
}
运行测试:
forge test
看到绿色对勾和PASS表示测试通过!
第六步:部署到测试网(10分钟)
6.1 启动本地测试网络
新开一个终端窗口
anvil
你会看到10个测试账户和私钥(记下第一个账户的私钥)
6.2 配置环境变量
回到原终端,设置环境变量
export PRIVATE_KEY=刚才记下的私钥(去掉0x前缀)
export RPC_URL=http://127.0.0.1:8545
6.3 部署合约
forge create src/MyToken.sol:MyToken --private-key PRIVATE_KEY --rpc-url RPC_URL
部署成功后,你会看到:
Deployed to: 0x5FbDB2315678afecb367f032d93F642f64180aa3
Transaction hash: 0x...
第七步:与合约交互(5分钟)
用cast工具测试转账:
1. 查询部署者余额
cast call <合约地址> "balanceOf(address)" --rpc-url $RPC_URL <部署者地址>
2. 转账给另一个账户
cast send <合约地址> "transfer(address,uint256)" <接收地址> 1000 --private-key PRIVATE_KEY --rpc-url RPC_URL
3. 验证转账成功
cast call <合约地址> "balanceOf(address)" --rpc-url $RPC_URL <接收地址>
部署:
1. 重新设置环境变量(根据图片中的指导)
export PRIVATE_KEY=ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 # 去掉0x前缀的私钥
export RPC_URL=http://127.0.0.1:8545
2. 验证变量是否设置成功
echo $RPC_URL # 应该显示 http://127.0.0.1:8545
echo $PRIVATE_KEY # 应该显示私钥内容
添加 --broadcast 参数进行真实部署
forge create src/MyToken.sol:MyToken --private-key PRIVATE_KEY --rpc-url RPC_URL --broadcast

测试
cast send 0x5FbDB2315678afecb367f032d93F642f64180aa3 "transfer(address,uint256)(bool)" 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 1000 --private-key ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --rpc-url http://127.0.0.1:8545