ethers.js v6使用!

  • dlnuchunge
  • 更新于 2023-12-04 16:15
  • 阅读 2175

一、Provider链接网络provider就是用于链接网络的,链接到了EVM相关网络,查可以链上查询相关数据,也才能进行操作。1、BrowserProvider这种就是通过链接安装的浏览器插件钱包,钱包链接网络。MetaMask钱包就用这个就行。如果安装了MetaMask钱包,它会注入一

一、Provider 链接网络

provider就是用于链接网络的,链接到了EVM相关网络,查可以链上查询相关数据,也才能进行操作。

1、BrowserProvider

这种就是通过链接安装的浏览器插件钱包,钱包链接网络。 MetaMask钱包就用这个就行。如果安装了MetaMask钱包,它会注入一个window.ethereum;

  let ethereum = (window as any).ethereum;
  let provider = new BrowserProvider(ethereum);

如果安装了Ronin钱包,它会注入一个window.ronin。

  let ronin = (window as any).ronin;
  let provider = new BrowserProvider(ronin.provider);

其他钱包应该也类似,都是注入了一个变量。

调用provider.getSigner()方法,如果没有链接过钱包的话,会弹出链接钱包界面,链接成功以后可以获取钱包的地址,也可以发起签名请求和交易等

请求签名:

 (provider as BrowserProvider).getSigner().then((signer) =>{
         console.log("r.address:", signer.address)
         signer.signMessage("我需要签名")
  })

发起交易:

 (provider as BrowserProvider).getSigner().then((signer) =>{
         console.log("r.address:", signer.address)
         signer.sendTransaction({
          to: "0xCe06B0A53b08C10fa508BF16D02bBdDc6961E3B3",
          value: parseEther("0.01")
        });
  })

2、JsonRpcProvider

可以通过传入RPC节点来链接网络,节点可以调用第三方的,比如infura,可以在infura上注册一个账号,每个网络都可以生成一个RPC URL,

 provider = new JsonRpcProvider("https://goerli.infura.io/v3/xxxxxx")

3、Provider的一些方法

获取到链接网络的Provider后,就可以操作了,有很多方法,我大概介绍一下吧。

(1)、getBalance 可以获取某个账号的链代币余额

(2)、getNetwork 可以获取当前链接的网络信息

(3)、getBlock 和 getBlockNumber获取区块信息

(4)、getResolver、getAvatar、resolveName、lookupAddress则是查询ENS域名相关方法

(5)、getTransaction、getTransactionResult、getTransactionReceipt、getTransactionCount则是用于查询交易相关信息。

(6)、getSigner、listAccounts 是BrowserProvider专有的,getSigner上面说过了。

二、Wallet 管理账号

Wallet主要是用来创建新账号,或者通过私钥助记词等导入账号

1、创建一个钱包账号 Wallet.createRandom()

 let w = Wallet.createRandom(provider);
 console.log("privateKey:", w.privateKey)  //私钥
 console.log("address:", w.address)  //地址
 console.log("phrase:", w.mnemonic?.phrase)  //助记词

2、导入私钥获取钱包信息 new Wallet(privateKey)

 let w = new Wallet(input_your_privateKey, provider)
 console.log("address:", w.address)

3、导入助记词获取钱包信息 Wallet.fromPhrase(phrase)

注意一下,助记词中间是有空格的哈。

let w = Wallet.fromPhrase(input_your_phrase, provider)
console.log("privateKey:", w.privateKey)
console.log("address:", w.address)

4、一些方法

w.sendTransaction 发送交易 w.signMessage 发起签名

三、Contract

1、new Contract() 调用合约

需要传入合约地址,abi,以及signer

 let contract = new Contract(合约地址, abi, signer)

这里的signer可以是BrowserProvider.getSigner()方法获取到的signer,也可以是Wallet和HDNodeWallet,因为他们都继承自Signer。

2、调用合约方法

调用这个合约上的读取方法,是不消耗gas的,如silidity的pure和view修饰的方法 比如ERC20上面的balanceOf方法,symbol和decimals的get方法

let sym = await contract.symbol()
let decimals = await contract.decimals()
let balance = await contract.balanceOf(signer.address)
console.log(`balance: ${formatUnits(balance, decimals)} ${sym}`)

3、调用改变状态方法

比如调用ERC20的转账transfer。

let amount = parseUnits("1.0", decimals)
let tx = await contract.transfer("0xCe06B0A53b08C10fa508BF16D02bBdDc6961E3B3", amount)
await tx.wait()

4、监听事件

监听Transfer事件

contract.on("Transfer", (from, to, amount, event) => { })

用* 可以监听所有事件

contract.on("*", (event) => { })

查询历史Transfer事件

let filter = contract.filters.Transfer 
let events = await contract.queryFilter(filter, -100)
点赞 2
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
dlnuchunge
dlnuchunge
0x0d2e...8b3F
看好Web3,自学Web3前端,想找份Web3相关工作!