5创建交互合约

203 阅读2分钟

5.创建交互合约

备注

水龙头网站 将 weth 添加到钱包

目标

  • 创建可读写合约
  • 调用合约,写入信息

概念

创建可读写合约实例

声明可写的Contract变量的规则:其中address为合约地址,abi是合约的abi接口,signerwallet对象。这里需要提供signer,而在创建可读合约时你只需要提供provider

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

如何与可读写合约交互

在第三节课介绍了读取合约信息。它不需要gas。这里我们介绍写入合约信息,你需要构建交易,并且支付gas。该交易将由整个网络上的每个节点以及矿工验证,并改变区块链状态。

// 发送交易
const tx = await contract.METHOD_NAME(args [, overrides])
// 等待链上确认交易
await tx.wait()

其中METHOD_NAME为调用的函数名,args为函数参数,[, overrides]是可以选择传入的数据,包括:

  • gasPrice:gas价格
  • gasLimit:gas上限
  • value:调用时传入的ether(单位是wei)
  • nonce:nonce

**注意:**此方法不能获取合约运行的返回值,如有需要,要使用Solidity事件记录,然后利用交易收据去查询。函数返回值(函数返回值),是无法获取到的,要通过 事件去获取

代码部分

// 1.创建 provider 实例
const testProvider = new ethers.providers.JsonRpcProvider(testNetWork)
// 2.创建 钱包实例
const privateKey = '5e34716a60a0926d67c629fae8752cdc9fbe742095a093d40e5b1a2834cc981e'
const wallet = new ethers.Wallet(privateKey,testProvider)
// 3. 创建可读写合约实例
// 3.1 通过
const contractAddress = '0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6'
const abiWETH = [
    "function balanceOf(address) public view returns(uint)",
    "function deposit() public payable",
    "function transfer(address, uint) public returns (bool)",
    "function withdraw(uint) public",
];
const contractWETH = new ethers.Contract(contractAddress, abiWETH,wallet)
const walletAddress = await wallet.getAddress()
console.log('walletAddress',walletAddress)
// 这种调用合约方法是没有返回值的,要使用`Solidity`事件记录,然后利用交易收据去查询。
// 读取WETH合约的链上信息(WETH abi)
const address = await wallet.getAddress()
const balanceWETH = await contractWETH.balanceOf(address)
const balanceETH = await wallet.getBalance()
console.log("\n1. 读取WETH余额")
console.log(`存款前WETH持仓: ${ethers.utils.formatEther(balanceWETH)}\n`)

console.log("\n2. 读取ETH余额")
console.log(`存款前ETH持仓: ${ethers.utils.formatEther(balanceETH)}\n`)

console.log('\n3 -------将ETH转成WETH--------')
// const tx = await contractWETH.deposit({value: ethers.utils.parseEther("0.1")})
// // 等待交易上链
// await tx.wait()
// console.log(`交易详情:`)
// console.log(tx)
// console.log('\n4 交易后的 WETH 持仓')
// const balanceEnd = await contractWETH.balanceOf(address)
// console.log('交易后的WETH 持仓:',ethers.utils.formatEther(balanceEnd))
// 使用 WETH 向V神账号的 转账
// 向V神账号转帐
const tx2 = await contractWETH.transfer('vitalik.eth',ethers.utils.parseEther('0.001'))
await tx2.wait()
const balanceWETH_transfer =  await contractWETH.balanceOf(address)
console.log('转帐后的持仓', `${ethers.utils.formatEther(balanceWETH_transfer)}`)