ethers连接rpc进行链上操作
·
1.导入ethers并连接你的rpc
const { ethers } = require("ethers"); // 导入
const rpcUrl = 'xxx' // rpc
const provider = new ethers.JsonRpcProvider(rpcUrl); // 连接rpc
2.目前的provider只能进行读取操作,要操作链上的数据需要你的私钥
// 注意⚠️,私钥是极其重要的,需要保管好,如果丢失,那么得到者可以将你当前地址的一切资产转移
const privateKey = "xxx";// 私钥
const signatureWallet = new ethers.Wallet(privateKey, provider);// 签名钱包
// 转账函数(简易版)
/*
to:接收地址
value:转账数额,需要转成bigint类型,当然这也需要看你的币种精度,
parseUnits这个函数是ethers内部的,第一个参数为你需要转账的数量,第二个为币种精度(默认是18)
hash:可以通过hash查询交易是否成功
*/
const transferFn = async () => {
const { hash } = await signatureWallet.sendTransaction({
to: toAddress,
value: parseUnits(num),
});
return hash;
};
// 转账函数(稍微难的)
/*
from:发送地址
gasLimit,gasPrice : 这两个参数是用来控制gas的,
个人建议只改变gasPrice,因为有的链gasLimit有最低限制,不熟悉的话容易出错
nonce:发送事务所需的下一个nonce
*/
const transferFn = async () => {
const { hash } = await signatureWallet.sendTransaction({
from: fromAddress,
to: toAddress,
value: parseUnits(num),
gasLimit,
gasPrice,
nonce,
});
return hash;
};
这是发送主网币的
3.合约的上链操作
const abi = require(""); // 合约abi文件
const address = 'xxx' // 合约地址
// new出代币合约实例
const tokenContract = new ethers.Contract(
address,
abi,
signatureWallet
);
// 接下来就可以进行合约操作了,可以调用合约里面的事件了
// 比如转账函数
const transferFn = async () => {
try {
const { hash } = await tokenContract.transfer(toAddress, value)
return hash;
} catch (e) {
console.log("交易函数失败", e);
}
};
// 如果想要控制nonce gasLimit gasPrice 等则
const transferFn = async () => {
try {
const { hash } = await tokenContract.transfer(
toAddress,
value,
// 组成对象当做参数传入
{
gasLimit,
gasPrice,
nonce,
}
)
return hash;
} catch (e) {
console.log("交易函数失败", e);
}
};
4.使用hash去查询交易是否成功和交易的数据(里面会有合约返回的你数据)
// 查看交易是否成功
const listenerTransferF = (hash) => {
return new Promise((reslove, reject) => {
provider?.once(hash, (receipt) => {
if (receipt.status) {
reslove(true);
}
reslove(false);
});
});
};
/*
hash:hash哈希
evenName:合约事件名称,注意第一个字母大写(问问合约开发)
parameterName:要获取的参数名 (问问合约开发)
*/
const getReturnContract = async (
hash: string,
evenName: string,
parameterName: string
) => {
try {
// 获取交易的事件日志
const receipt = await provider.getTransactionReceipt(hash);
// 获取返回的创建的订阅的id
if (receipt) {
// 遍历logs
for (const log of receipt.logs) {
// 通过合约的interface属性的parseLog的方法去解析返回的数据
const parsedLog = contract.interface.parseLog((log as any)) || [];
// 通过传入的参数判断是否结束函数并结果把return出去
if (parsedLog.name === evenName) {
return parsedLog.args[parameterName]
}
}
}
} catch (e) {
console.log('函数错误', e);
}
}
如果没有创建签名钱包,那么provider只能进行读取操作,创建了话,读取基本都可以了
温馨提示:千万要保存好你的私钥
更多推荐

所有评论(0)