一、Provider链接网络provider就是用于链接网络的,链接到了EVM相关网络,查可以链上查询相关数据,也才能进行操作。1、BrowserProvider这种就是通过链接安装的浏览器插件钱包,钱包链接网络。MetaMask钱包就用这个就行。如果安装了MetaMask钱包,它会注入一
provider就是用于链接网络的,链接到了EVM相关网络,查可以链上查询相关数据,也才能进行操作。
这种就是通过链接安装的浏览器插件钱包,钱包链接网络。 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")
});
})
可以通过传入RPC节点来链接网络,节点可以调用第三方的,比如infura,可以在infura上注册一个账号,每个网络都可以生成一个RPC URL,
provider = new JsonRpcProvider("https://goerli.infura.io/v3/xxxxxx")
获取到链接网络的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主要是用来创建新账号,或者通过私钥助记词等导入账号
let w = Wallet.createRandom(provider);
console.log("privateKey:", w.privateKey) //私钥
console.log("address:", w.address) //地址
console.log("phrase:", w.mnemonic?.phrase) //助记词
let w = new Wallet(input_your_privateKey, provider)
console.log("address:", w.address)
注意一下,助记词中间是有空格的哈。
let w = Wallet.fromPhrase(input_your_phrase, provider)
console.log("privateKey:", w.privateKey)
console.log("address:", w.address)
w.sendTransaction 发送交易 w.signMessage 发起签名
需要传入合约地址,abi,以及signer
let contract = new Contract(合约地址, abi, signer)
这里的signer可以是BrowserProvider.getSigner()方法获取到的signer,也可以是Wallet和HDNodeWallet,因为他们都继承自Signer。
调用这个合约上的读取方法,是不消耗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}`)
比如调用ERC20的转账transfer。
let amount = parseUnits("1.0", decimals)
let tx = await contract.transfer("0xCe06B0A53b08C10fa508BF16D02bBdDc6961E3B3", amount)
await tx.wait()
监听Transfer事件
contract.on("Transfer", (from, to, amount, event) => { })
用* 可以监听所有事件
contract.on("*", (event) => { })
查询历史Transfer事件
let filter = contract.filters.Transfer
let events = await contract.queryFilter(filter, -100)
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!