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只能进行读取操作,创建了话,读取基本都可以了

温馨提示:千万要保存好你的私钥

更多推荐