生成FUCK代币,并用程序进行转账的过程
1.安装FORGE工具套装
foundry - Ethereum Development Framework
从这个地方下载foundry的全套工具,然后解压缩后,复制到/usr/local/bin目录下
https://github.com/foundry-rs/foundry/releases/download/nightly-ac0411d0e3b9632247c9aea9535472eda09a57ae/foundry_nightly_alpine_amd64.tar.gz
执行forge,有输出就说明安装好了。
2.安装node npm这一套
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc # 立即生效# 2. 安装 Node.js 22
nvm install 22 # 安装最新 22.x 版本 # 3. 验证和使用
nvm use 22 # 切换到 Node 22
node -v # 检查版本
3.运行anvil, 单机链
输出一堆有ETH的测试账号。
(0) 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 (10000.000000000000000000 ETH) (1) 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 (10000.000000000000000000 ETH) (2) 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC (10000.000000000000000000 ETH) (3) 0x90F79bf6EB2c4f870365E785982E1f101E93b906 (10000.000000000000000000 ETH) (4) 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 (10000.000000000000000000 ETH) (5) 0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc (10000.000000000000000000 ETH) (6) 0x976EA74026E726554dB657fA54763abd0C3a0aa9 (10000.000000000000000000 ETH) (7) 0x14dC79964da2C08b23698B3D3cc7Ca32193d9955 (10000.000000000000000000 ETH) (8) 0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f (10000.000000000000000000 ETH) (9) 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 (10000.000000000000000000 ETH)
账号对应的私钥:(hahaha,是不是眼睛直了)
(0) 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 (1) 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d (2) 0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a (3) 0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6 (4) 0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a (5) 0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba (6) 0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e (7) 0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356 (8) 0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97 (9) 0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6
4.写一个ERC20合约
forge init
写一个合约,保存为src/MyToken.sol
// contracts/MyToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;import "openzeppelin-contracts/contracts/token/ERC20/ERC20.sol";contract MyToken is ERC20 {constructor() ERC20("MyToken", "FUCK") {_mint(msg.sender, 10000 ether); // 10000个}
}
forge install
forge build
5.部署合约
部署成功私钥我们就选第一个账户的
forge create --rpc-url http://127.0.0.1:8545 --private-key <Anvil账户私钥> src/MyToken.sol:MyTokenforge create --rpc-url http://127.0.0.1:8545 --private-key \0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \src/MyToken.sol:MyToken
部署成功后会返回一个合约地址:
[⠊] Compiling...
[⠢] Compiling 1 files with Solc 0.8.25
[⠆] Solc 0.8.25 finished in 118.05ms
Compiler run successful!
Deployer: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
Deployed to: 0xa513E6E4b8f2a923D98304ec87F64353C4D5C853
Transaction hash: 0x88fffbc3fbdddb8967a2b4330d1ce65ecec31eb8b7c0070be88fb4ab75516715
这个就是合约的地址:
0xa513E6E4b8f2a923D98304ec87F64353C4D5C853
6. 写一个js程序进行转账。
初始代码,安装依赖
npm init -y
npm install ethers dotenv
建立.env文件,写入一些重要信息
PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 # Anvil 启动时会打印出来的一组私钥
RPC_URL=http://127.0.0.1:8545
TOKEN_ADDRESS=0xa513E6E4b8f2a923D98304ec87F64353C4D5C853
TO_ADDRESS=0x70997970C51812dc3A010C7d01b50e0d17dc79C8
核心代码 t.js( 里面的内容不需要修改)
require("dotenv").config();
const { ethers } = require("ethers");// ERC-20 最小 ABI,只包含 transfer 方法
const ERC20_ABI = ["function transfer(address to, uint256 amount) public returns (bool)","function decimals() public view returns (uint8)"
];async function main() {// 连接本地 Anvil 节点const provider = new ethers.JsonRpcProvider(process.env.RPC_URL);// 用你的私钥创建 signerconst wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider);// 初始化合约对象const token = new ethers.Contract(process.env.TOKEN_ADDRESS, ERC20_ABI, wallet);// 获取 token 精度(例如 USDT 是 6,标准是 18)const decimals = await token.decimals();// 构造转账数量:10 * 10^decimalsconst amount = ethers.parseUnits("10", decimals);console.log(`Transferring 10 tokens to ${process.env.TO_ADDRESS}...`);// 发起交易const tx = await token.transfer(process.env.TO_ADDRESS, amount);console.log(`Transaction sent: ${tx.hash}`);// 等待上链await tx.wait();console.log(`✅ Transfer complete.`);
}main().catch((err) => {console.error(err);process.exit(1);
});
7.运行和查看
node t.js
查看需要安装一个插件来观察本地的anvil链。
google浏览器上安装一个Rivet的插件, (Developer wallet & DevTools for Ethereum)
查看账户的FUCK 代币。