# 使用批量钱包打ETH铭文

By [LLindon](https://paragraph.com/@llindon) · 2023-07-26

---

Ethscript火了有一段时间了，相对于其他域名，比如说BRC20、LTC20，使用metamask插件钱包总需要一个一个打，还要提前把想要打的数据转换为十六进制，速度很慢，对于一些需要抢速度的项目来说，完全没有优势。所以我写了一个使用JS打ethscript的脚本，可以使用多个钱包，每个钱包自定义打多少张。

**使用方法**

在桌面上建立两个excel文件，一个wallet.xlsx，在A列储存钱包私钥，每个钱包提前存好一定量的eth。另外一个命名为data.xlsx，在A列输入自己想要打的铭文，每行一个。运行JS代码，会批量让这些钱包顺序打这些铭文。（批量钱包的原因主要是在于有些铭文对每个钱包打的数量有限制）

**下面是代码**

    import { ethers } from "ethers";
    import xlsx  from "xlsx";
    //链接网络
    const ETH_URL = '去Infura.io申请API';
    const provider = new ethers.JsonRpcProvider(ETH_URL);
    
    //****参数设定******
    //  需要几个钱包
    const numWallet = 5
    //  单个钱包打的铭文数量 
    const N = 10;
    //  计数器
    let K = 0;
    let m = 0;
    //  给自己发送的数额和每个钱包需要的最小金额计算
    const value = ethers.parseEther("0");
    const balanceThreshold = ethers.formatEther(ethers.parseEther("0.01")); 
    
    //1.读取data数据
    // 读取 Excel 文件
    const workbook = xlsx.readFile('C:/Users/yelin/Desktop/data.xlsx'); 
    // 获取第一个 worksheet 
    const worksheet = workbook.Sheets[workbook.SheetNames[0]];
    // 定义结果数组
    let dataArray = [];
    // 遍历每一行
    for (let row in worksheet) {
      // 如果是 A 列
      if (row[0] === 'A') {  
        // 获取单元格的值
        let value = worksheet[row].v;   
        // 转为字符串存入结果数组
        dataArray.push(String(value)); 
      }
    }
    
    //2.读取wallet
    // 读取 Excel 文件
    const workbook1 = xlsx.readFile('C:/Users/yelin/Desktop/wallet.xlsx');
    const sheet = workbook1.Sheets[workbook1.SheetNames[0]];
    // 存储生成的钱包
    const wallets = [];
    // 遍历每一行
    for (let row in sheet) {
        // 检查是否为 A 列 
        if(row[0] === 'A') {
          // 读取单元格的值作为私钥  
          let privateKey = sheet[row].v;
          // 创建新钱包
          let wallet = new ethers.Wallet(privateKey,provider); 
          // 添加到数组
          wallets.push(wallet);
          m++;
          console.log(`第${m}个钱包，钱包地址为${wallet.address}`);
        }
      }
    
    
    // 3. 为每个钱包生成交易
    for (let i = 0; i < numWallet; i++) {
      // 获取钱包余额
      const balance = await provider.getBalance(wallets[i])
      if(ethers.formatEther(balance) < balanceThreshold) {
        console.log(`钱包 ${i+1}:${wallets[i].address} 余额不足,跳过`); 
        continue;
      }
      const to = wallets[i].address; 
      const nonce = await provider.getTransactionCount(to);
      for (let j = 0; j < N; j++) {
        const bytes = Buffer.from(dataArray[K]); 
        const data = ethers.hexlify(bytes);
        const tx = {
            to: to,
            nonce: nonce+j,
            value: ethers.parseEther("0"),
            data:data,
        }
        // 发送交易
        console.log(`\n等待交易在区块链确认`)
        await wallets[i].sendTransaction(tx);
        K++;
        console.log(`第${i+1}个钱包${to}的第${K}笔交易已经完成`)
      }
    }

---

*Originally published on [LLindon](https://paragraph.com/@llindon/eth)*
