Ethers.js发布合约及查询合约

1.生成相关发布所需文件

通过foundry创建solidity MyToken.sol基于ERC20创建代币合约

Foundry安装

构建ERC20代币合约代码:MyToken.sol

bash 复制代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.33;

// ERC20标准
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; 
// Ownable权限管理
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; 
contract MyToken is ERC20, Ownable {
    constructor(
        string memory _name,
        string memory _symbol
    ) ERC20(_name, _symbol) Ownable(msg.sender) {
         // 在合约中铸造amount个代币 每个代币有18个小数位
        _mint(msg.sender, 1000000 * 10 ** uint256(decimals()));
    }

    function mint(address to, uint256 amount) external {
        // 在合约中铸造amount个代币 每个代币有18个小数位
        _mint(to, amount * 10 ** uint256(decimals()));
    }

    // 合约部署者可以调用此函数
    function freeze(address account) external onlyOwner {
        // 将账户标记为冻结状态,禁止转账或其他操作
    }

    // 可以自己写其他功能
}

Build abi和bytecode

bash 复制代码
forge build -o MyToken.sol

生成ABI:MyToken.abi(只保留部分,需要自己生成自己的)

Go 复制代码
[{"type":"constructor","inputs":[{"name":"_name","type":"string","internalType":"string"},{"name":"_symbol","type":"string","internalType":"string"}],"stateMutability":"nonpayable"},{"type":"function","name":"allowance","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"approve","inputs":.............................

生成bytecode:MyToken.bin(只保留部分,需要自己生成自己的)

Go 复制代码
0x608060405234801561000f575f5ffd5b50604051611f40380380611f40833981810160405281019061003191906105cd565b33828281600390816100439190610864565b5080600490816100539190610864565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100c6575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100bd9190610972565b60405180910390fd5b6100d58161011760201b60201c565b50610110336100e86101da60201b60201c565b60ff16600a6100f79190610ae7565b620f42406101059190610b31565b6101e260201b60201c565b5050610c02565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffff.............................
2.发布合约

其中API KEY 和私钥(MetaMask上)自己去获取

javascript 复制代码
import { ethers } from "ethers"
import fs from "fs"
import 'dotenv/config';

/**
 * 部署合约
 */
async function deploy() {
    // API KEY
    const provider = new ethers.providers.JsonRpcProvider(`${process.env.SEPOLIA_RPC_URL}`)
    // 私钥
    const wallet = new ethers.Wallet(`${PRIVATE_KEY}`, provider)
    // 读取编译后的合约
    const abi = JSON.parse(fs.readFileSync('./src/MyToken.abi', 'utf8'));
    console.log(abi)
    const bytecode = fs.readFileSync('./src/MyToken.bin', 'utf8');
    console.log(bytecode)
    // 部署合约
    const factory = new ethers.ContractFactory(abi, bytecode, wallet);
    const contract = await factory.deploy("MYTO","MT");
    await contract.deployed();
    console.log(`合约部署地址: ${contract.address}`);
    // 测试合约
    await contract.mint(contract.address,100)
    const balance = await contract.balanceOf(contract.address);
    console.log(`合约账户余额: ${ethers.utils.formatEther(balance)} ETH`);
    console.log(`合约账户名称: ${await contract.name()}`);
    console.log(`合约账户代号: ${await contract.symbol()}`);
}

deploy();
3.查询合约信息

以下是通过Human-Readable Abi方式读取合约信息,也可通过ABI形式读取>>可参考

javascript 复制代码
import { ethers } from "ethers"
import 'dotenv/config';
/**
 * 查询合约信息
 */

async function displayContracInfo() {
    const contractAddress = "your contract address"
    const abi = ["function name() public view returns (string memory)",
        "function symbol() public view returns (string memory)",
        "function balanceOf(address account) public view returns (uint256)"
    ]
    const provider = new ethers.providers.JsonRpcProvider(`${process.env.SEPOLIA_RPC_URL}`)
    const erc20 = new ethers.Contract(contractAddress,abi,provider)
    const name = await erc20.name()
    const symbol = await erc20.symbol()
    const balance = await erc20.balanceOf(contractAddress)
    console.log("读取合约信息:")
    console.log(`合约地址:${contractAddress}`)
    console.log(`合约名称:${name}`)
    console.log(`合约代号:${symbol}`)
    console.log(`合约余额:${ethers.utils.formatEther(balance)} ETH`)
}

displayContracInfo()

通过以上步骤可deploy合约,查询合约信息,如有疑问欢迎留言!!!

相关推荐
子兮曰6 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰6 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
小羊没烦恼!6 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
爱勇宝6 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
胡写代码6 天前
别再前后端各写一套表单校验了
java·后端
伞伞悦读6 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
大勇前进6 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
yuzhi_liu6 天前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端
alsmile6 天前
Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现
后端·开源·go
大白806 天前
PHP 内存溢出排查思路:看懂报错日志,精准定位问题
后端