ether.js—3—contract

使用合约的代码流程(用 ethers.js)

  1. 先拿到合约地址
    • 这个地址是合约部署后生成的唯一标识
    • 来源:
    • 你自己部署合约时得到的
    • 或者别人已经部署好的合约地址(公开项目、链上查询)

  1. 准备 ABI(合约的接口描述)
    • ABI 是合约编译后自动生成的 JSON,描述合约方法和事件
    • 来源:
    • 你自己写合约用 Remix、Hardhat 编译后生成的 ABI 文件
    • 如果是公共合约,比如 ERC-20,标准 ABI 可以直接拿(网上或者官方文档)
    • 也可以用 etherscan 上合约页面直接复制 ABI

  1. new 一个合约实例

const contract = new ethers.Contract(address, abi, providerOrSigner);

•	传入三个东西:
•	合约地址(必需)
•	ABI(必需)
•	Provider 或 Signer(决定调用的是只读还是可写接口)

Provider vs Signer 的区别
• Provider:只能调用合约的 view 或 pure 函数(即只读,不花 gas)
• Signer:有权限发起交易,调用修改链上状态的函数(需要 gas)

所以:

const readContract = new ethers.Contract(address, abi, provider); // 只读
const writeContract = new ethers.Contract(address, abi, signer); // 可写(发交易)

  1. 之后就可以调用合约方法
    • 只读方法可以直接 await contract.name() 等调用,得到返回值
    • 可写方法调用返回交易对象 tx = await contract.transfer(…),然后 await tx.wait() 等交易确认

简单示例流程(拿 ERC-20 查询和转账为例)

// 1. 合约地址(比如 USDT)
const address = “0xdAC17F958D2ee523a2206206994597C13D831ec7”;

// 2. 标准 ERC20 ABI(这里只写几个方法)
const abi = [
“function name() view returns (string)”,
“function symbol() view returns (string)”,
“function balanceOf(address) view returns (uint256)”,
“function transfer(address to, uint amount) returns (bool)”
];

// 3. 创建 provider 和 signer(假设是浏览器内注入的 Metamask)
const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();

// 4. 创建合约实例
const contractRead = new ethers.Contract(address, abi, provider); // 只读
const contractWrite = new ethers.Contract(address, abi, signer); // 可写

// 5. 调用只读方法
const name = await contractRead.name();
const symbol = await contractRead.symbol();
console.log(name, symbol);

// 6. 调用可写方法(转账)
const tx = await contractWrite.transfer(“0xRecipientAddress”, ethers.utils.parseUnits(“1.0”, 6));
await tx.wait();
console.log(“Transfer confirmed”);

总结

步骤 说明 来源/举例

  1. 合约地址 合约在链上的地址 自己部署、别人公开的地址
  2. ABI 合约接口定义,json格式或简写签名 编译生成、Etherscan、官方
  3. 创建合约实例 new Contract(address, abi, providerOrSigner) 传入 provider 只读,signer 可写
  4. 调用函数 await contract.readFunc() / await contract.writeFunc() 只读直接取值,写调用交易等待确认

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值