5.创建交互合约
备注
水龙头网站 将 weth 添加到钱包
目标
- 创建可读写合约
- 调用合约,写入信息
概念
创建可读写合约实例
声明可写的Contract
变量的规则:其中address
为合约地址,abi
是合约的abi
接口,signer
是wallet
对象。这里需要提供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)}`)