<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>LLindon</title>
        <link>https://paragraph.com/@llindon</link>
        <description>Alpha Reserch/Tool </description>
        <lastBuildDate>Sat, 09 May 2026 06:01:58 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[使用批量钱包打ETH铭文]]></title>
            <link>https://paragraph.com/@llindon/eth</link>
            <guid>xV5yAl5JhB3Pb8xdclAA</guid>
            <pubDate>Wed, 26 Jul 2023 11:39:09 GMT</pubDate>
            <description><![CDATA[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); //****参数设定****** // 需要几个钱包 con...]]></description>
            <content:encoded><![CDATA[<p>Ethscript火了有一段时间了，相对于其他域名，比如说BRC20、LTC20，使用metamask插件钱包总需要一个一个打，还要提前把想要打的数据转换为十六进制，速度很慢，对于一些需要抢速度的项目来说，完全没有优势。所以我写了一个使用JS打ethscript的脚本，可以使用多个钱包，每个钱包自定义打多少张。</p><p><strong>使用方法</strong></p><p>在桌面上建立两个excel文件，一个wallet.xlsx，在A列储存钱包私钥，每个钱包提前存好一定量的eth。另外一个命名为data.xlsx，在A列输入自己想要打的铭文，每行一个。运行JS代码，会批量让这些钱包顺序打这些铭文。（批量钱包的原因主要是在于有些铭文对每个钱包打的数量有限制）</p><p><strong>下面是代码</strong></p><pre data-type="codeBlock" text="import { ethers } from &quot;ethers&quot;;
import xlsx  from &quot;xlsx&quot;;
//链接网络
const ETH_URL = &apos;去Infura.io申请API&apos;;
const provider = new ethers.JsonRpcProvider(ETH_URL);

//****参数设定******
//  需要几个钱包
const numWallet = 5
//  单个钱包打的铭文数量 
const N = 10;
//  计数器
let K = 0;
let m = 0;
//  给自己发送的数额和每个钱包需要的最小金额计算
const value = ethers.parseEther(&quot;0&quot;);
const balanceThreshold = ethers.formatEther(ethers.parseEther(&quot;0.01&quot;)); 

//1.读取data数据
// 读取 Excel 文件
const workbook = xlsx.readFile(&apos;C:/Users/yelin/Desktop/data.xlsx&apos;); 
// 获取第一个 worksheet 
const worksheet = workbook.Sheets[workbook.SheetNames[0]];
// 定义结果数组
let dataArray = [];
// 遍历每一行
for (let row in worksheet) {
  // 如果是 A 列
  if (row[0] === &apos;A&apos;) {  
    // 获取单元格的值
    let value = worksheet[row].v;   
    // 转为字符串存入结果数组
    dataArray.push(String(value)); 
  }
}

//2.读取wallet
// 读取 Excel 文件
const workbook1 = xlsx.readFile(&apos;C:/Users/yelin/Desktop/wallet.xlsx&apos;);
const sheet = workbook1.Sheets[workbook1.SheetNames[0]];
// 存储生成的钱包
const wallets = [];
// 遍历每一行
for (let row in sheet) {
    // 检查是否为 A 列 
    if(row[0] === &apos;A&apos;) {
      // 读取单元格的值作为私钥  
      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 &lt; numWallet; i++) {
  // 获取钱包余额
  const balance = await provider.getBalance(wallets[i])
  if(ethers.formatEther(balance) &lt; 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 &lt; N; j++) {
    const bytes = Buffer.from(dataArray[K]); 
    const data = ethers.hexlify(bytes);
    const tx = {
        to: to,
        nonce: nonce+j,
        value: ethers.parseEther(&quot;0&quot;),
        data:data,
    }
    // 发送交易
    console.log(`\n等待交易在区块链确认`)
    await wallets[i].sendTransaction(tx);
    K++;
    console.log(`第${i+1}个钱包${to}的第${K}笔交易已经完成`)
  }
}
"><code><span class="hljs-keyword">import</span> { <span class="hljs-title">ethers</span> } <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">"ethers"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-title">xlsx</span>  <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">"xlsx"</span>;
<span class="hljs-comment">//链接网络</span>
const ETH_URL <span class="hljs-operator">=</span> <span class="hljs-string">'去Infura.io申请API'</span>;
const provider <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> ethers.JsonRpcProvider(ETH_URL);

<span class="hljs-comment">//****参数设定******</span>
<span class="hljs-comment">//  需要几个钱包</span>
const numWallet <span class="hljs-operator">=</span> <span class="hljs-number">5</span>
<span class="hljs-comment">//  单个钱包打的铭文数量 </span>
const N <span class="hljs-operator">=</span> <span class="hljs-number">10</span>;
<span class="hljs-comment">//  计数器</span>
let K <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;
let m <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;
<span class="hljs-comment">//  给自己发送的数额和每个钱包需要的最小金额计算</span>
const value <span class="hljs-operator">=</span> ethers.parseEther(<span class="hljs-string">"0"</span>);
const balanceThreshold <span class="hljs-operator">=</span> ethers.formatEther(ethers.parseEther(<span class="hljs-string">"0.01"</span>)); 

<span class="hljs-comment">//1.读取data数据</span>
<span class="hljs-comment">// 读取 Excel 文件</span>
const workbook <span class="hljs-operator">=</span> xlsx.readFile(<span class="hljs-string">'C:/Users/yelin/Desktop/data.xlsx'</span>); 
<span class="hljs-comment">// 获取第一个 worksheet </span>
const worksheet <span class="hljs-operator">=</span> workbook.Sheets[workbook.SheetNames[<span class="hljs-number">0</span>]];
<span class="hljs-comment">// 定义结果数组</span>
let dataArray <span class="hljs-operator">=</span> [];
<span class="hljs-comment">// 遍历每一行</span>
<span class="hljs-keyword">for</span> (let row in worksheet) {
  <span class="hljs-comment">// 如果是 A 列</span>
  <span class="hljs-keyword">if</span> (row[<span class="hljs-number">0</span>] <span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-string">'A'</span>) {  
    <span class="hljs-comment">// 获取单元格的值</span>
    let value <span class="hljs-operator">=</span> worksheet[row].v;   
    <span class="hljs-comment">// 转为字符串存入结果数组</span>
    dataArray.<span class="hljs-built_in">push</span>(String(value)); 
  }
}

<span class="hljs-comment">//2.读取wallet</span>
<span class="hljs-comment">// 读取 Excel 文件</span>
const workbook1 <span class="hljs-operator">=</span> xlsx.readFile(<span class="hljs-string">'C:/Users/yelin/Desktop/wallet.xlsx'</span>);
const sheet <span class="hljs-operator">=</span> workbook1.Sheets[workbook1.SheetNames[<span class="hljs-number">0</span>]];
<span class="hljs-comment">// 存储生成的钱包</span>
const wallets <span class="hljs-operator">=</span> [];
<span class="hljs-comment">// 遍历每一行</span>
<span class="hljs-keyword">for</span> (let row in sheet) {
    <span class="hljs-comment">// 检查是否为 A 列 </span>
    <span class="hljs-keyword">if</span>(row[<span class="hljs-number">0</span>] <span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-string">'A'</span>) {
      <span class="hljs-comment">// 读取单元格的值作为私钥  </span>
      let privateKey <span class="hljs-operator">=</span> sheet[row].v;
      <span class="hljs-comment">// 创建新钱包</span>
      let wallet <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> ethers.Wallet(privateKey,provider); 
      <span class="hljs-comment">// 添加到数组</span>
      wallets.<span class="hljs-built_in">push</span>(wallet);
      m<span class="hljs-operator">+</span><span class="hljs-operator">+</span>;
      console.log(`第${m}个钱包，钱包地址为${wallet.<span class="hljs-built_in">address</span>}`);
    }
  }


<span class="hljs-comment">// 3. 为每个钱包生成交易</span>
<span class="hljs-keyword">for</span> (let i <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i <span class="hljs-operator">&#x3C;</span> numWallet; i<span class="hljs-operator">+</span><span class="hljs-operator">+</span>) {
  <span class="hljs-comment">// 获取钱包余额</span>
  const balance <span class="hljs-operator">=</span> await provider.getBalance(wallets[i])
  <span class="hljs-keyword">if</span>(ethers.formatEther(balance) <span class="hljs-operator">&#x3C;</span> balanceThreshold) {
    console.log(`钱包 ${i<span class="hljs-operator">+</span><span class="hljs-number">1</span>}:${wallets[i].<span class="hljs-built_in">address</span>} 余额不足,跳过`); 
    <span class="hljs-keyword">continue</span>;
  }
  const to <span class="hljs-operator">=</span> wallets[i].<span class="hljs-built_in">address</span>; 
  const nonce <span class="hljs-operator">=</span> await provider.getTransactionCount(to);
  <span class="hljs-keyword">for</span> (let j <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; j <span class="hljs-operator">&#x3C;</span> N; j<span class="hljs-operator">+</span><span class="hljs-operator">+</span>) {
    const <span class="hljs-keyword">bytes</span> <span class="hljs-operator">=</span> Buffer.from(dataArray[K]); 
    const data <span class="hljs-operator">=</span> ethers.hexlify(<span class="hljs-keyword">bytes</span>);
    const <span class="hljs-built_in">tx</span> <span class="hljs-operator">=</span> {
        to: to,
        nonce: nonce<span class="hljs-operator">+</span>j,
        <span class="hljs-built_in">value</span>: ethers.parseEther(<span class="hljs-string">"0"</span>),
        data:data,
    }
    <span class="hljs-comment">// 发送交易</span>
    console.log(`\n等待交易在区块链确认`)
    await wallets[i].sendTransaction(<span class="hljs-built_in">tx</span>);
    K<span class="hljs-operator">+</span><span class="hljs-operator">+</span>;
    console.log(`第${i<span class="hljs-operator">+</span><span class="hljs-number">1</span>}个钱包${to}的第${K}笔交易已经完成`)
  }
}
</code></pre>]]></content:encoded>
            <author>llindon@newsletter.paragraph.com (LLindon)</author>
        </item>
        <item>
            <title><![CDATA[如何套利（以VMPX为例）]]></title>
            <link>https://paragraph.com/@llindon/vmpx</link>
            <guid>L7tBiqafZnH3KkYOyTTg</guid>
            <pubDate>Tue, 25 Jul 2023 03:18:07 GMT</pubDate>
            <description><![CDATA[前一段时间Jack又搞事情，除了在ordinals发布了VMPX之后，又继续在ETH上mint VMPX，真是矿工的好朋友。那么我们获取到这个信息之后怎么进行套利呢。 以下是流程： 第一步，根据gas费判断mint 一定量的VMPX的费用； 第二步，查出uniswap，mint出来的VMPX能够兑换多少ETH； 第三步，如果套利超过5%，判断可以进行套利； 第四步，套利，mint VMPX； 第五步，UNISWAP出售，计算此时套利。 将以上过程使用JS进行import { ethers} from "ethers"; const api = 'https://mainnet.infura.io/v3/你的ID'; const provider = new ethers.JsonRpcProvider(api); const privateKey = '私钥'; const wallet = new ethers.Wallet(privateKey, provider); const VMPX_ABI = [ ]; const VMPX_ADDRESS = "0xb48Eb836...]]></description>
            <content:encoded><![CDATA[<p>前一段时间Jack又搞事情，除了在ordinals发布了VMPX之后，又继续在ETH上mint VMPX，真是矿工的好朋友。那么我们获取到这个信息之后怎么进行套利呢。</p><p>以下是流程：</p><p>第一步，根据gas费判断mint 一定量的VMPX的费用；</p><p>第二步，查出uniswap，mint出来的VMPX能够兑换多少ETH；</p><p>第三步，如果套利超过5%，判断可以进行套利；</p><p>第四步，套利，mint VMPX；</p><p>第五步，UNISWAP出售，计算此时套利。</p><p>将以上过程使用JS进行</p><pre data-type="codeBlock" text="import { ethers} from &quot;ethers&quot;;
const api = &apos;https://mainnet.infura.io/v3/你的ID&apos;;
const provider = new ethers.JsonRpcProvider(api);

const privateKey = &apos;私钥&apos;;
const wallet = new ethers.Wallet(privateKey, provider);

const VMPX_ABI = [ ];
const VMPX_ADDRESS = &quot;0xb48Eb8368c9C6e9b0734de1Ef4ceB9f484B80b9C&quot;; 

const UNISWAP_ROUTER_ABI = [];
const UNISWAP_ROUTER_ADDRESS = &quot;0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD&quot;;

const vmpxContract = new ethers.Contract(VMPX_ADDRESS, VMPX_ABI, wallet);
const uniswapRouter = new ethers.Contract(UNISWAP_ROUTER_ADDRESS, UNISWAP_ROUTER_ABI, wallet);

async function arbitrage() {
  // 1. 计算mint的gas费
  const mintAmount = 100;
  const tx = await vmpxContract.populateTransaction.mint(mintAmount); 
  const mintGasCost = tx.gasPrice * tx.gasLimit;  

  // 2. 查询mint出来的token能兑换的ETH数量
  const vmpxAmount = ethers.BigNumber.from(mintAmount).mul(200); 
  const wethAmount = await uniswapRouter.getAmountsOut(vmpxAmount, [VMPX_ADDRESS, WETH_ADDRESS]);

  // 3. 计算利润率 
  const profitRatio = wethAmount / mintGasCost;
  if (profitRatio &lt; 1.05) {
    console.log(&quot;套利率不足5%,不执行套利&quot;);  
    return;
  }

  // 4. 执行mint
  const mintTx = await vmpxContract.mint(100);
  await mintTx.wait();

  // 5. 兑换ETH
  const swapTx = await uniswapRouter.swapExactTokensForTokens(
    vmpxAmount, 
    0, 
    [VMPX_ADDRESS, WETH_ADDRESS],
    wallet.address,
    Date.now() + 1000 * 60 * 10
  );
  await swapTx.wait();
 

  console.log(&quot;套利完成!&quot;);
}

arbitrage();
"><code><span class="hljs-keyword">import</span> { <span class="hljs-title">ethers</span>} <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">"ethers"</span>;
const api <span class="hljs-operator">=</span> <span class="hljs-string">'https://mainnet.infura.io/v3/你的ID'</span>;
const provider <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> ethers.JsonRpcProvider(api);

const privateKey <span class="hljs-operator">=</span> <span class="hljs-string">'私钥'</span>;
const wallet <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> ethers.Wallet(privateKey, provider);

const VMPX_ABI <span class="hljs-operator">=</span> [ ];
const VMPX_ADDRESS <span class="hljs-operator">=</span> <span class="hljs-string">"0xb48Eb8368c9C6e9b0734de1Ef4ceB9f484B80b9C"</span>; 

const UNISWAP_ROUTER_ABI <span class="hljs-operator">=</span> [];
const UNISWAP_ROUTER_ADDRESS <span class="hljs-operator">=</span> <span class="hljs-string">"0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD"</span>;

const vmpxContract <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> ethers.Contract(VMPX_ADDRESS, VMPX_ABI, wallet);
const uniswapRouter <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> ethers.Contract(UNISWAP_ROUTER_ADDRESS, UNISWAP_ROUTER_ABI, wallet);

async <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">arbitrage</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-comment">// 1. 计算mint的gas费</span>
  const mintAmount <span class="hljs-operator">=</span> <span class="hljs-number">100</span>;
  const <span class="hljs-built_in">tx</span> <span class="hljs-operator">=</span> await vmpxContract.populateTransaction.mint(mintAmount); 
  const mintGasCost <span class="hljs-operator">=</span> <span class="hljs-built_in">tx</span>.gasPrice <span class="hljs-operator">*</span> <span class="hljs-built_in">tx</span>.gasLimit;  

  <span class="hljs-comment">// 2. 查询mint出来的token能兑换的ETH数量</span>
  const vmpxAmount <span class="hljs-operator">=</span> ethers.BigNumber.from(mintAmount).mul(<span class="hljs-number">200</span>); 
  const wethAmount <span class="hljs-operator">=</span> await uniswapRouter.getAmountsOut(vmpxAmount, [VMPX_ADDRESS, WETH_ADDRESS]);

  <span class="hljs-comment">// 3. 计算利润率 </span>
  const profitRatio <span class="hljs-operator">=</span> wethAmount <span class="hljs-operator">/</span> mintGasCost;
  <span class="hljs-keyword">if</span> (profitRatio <span class="hljs-operator">&#x3C;</span> <span class="hljs-number">1.05</span>) {
    console.log(<span class="hljs-string">"套利率不足5%,不执行套利"</span>);  
    <span class="hljs-keyword">return</span>;
  }

  <span class="hljs-comment">// 4. 执行mint</span>
  const mintTx <span class="hljs-operator">=</span> await vmpxContract.mint(<span class="hljs-number">100</span>);
  await mintTx.wait();

  <span class="hljs-comment">// 5. 兑换ETH</span>
  const swapTx <span class="hljs-operator">=</span> await uniswapRouter.swapExactTokensForTokens(
    vmpxAmount, 
    <span class="hljs-number">0</span>, 
    [VMPX_ADDRESS, WETH_ADDRESS],
    wallet.<span class="hljs-built_in">address</span>,
    Date.now() <span class="hljs-operator">+</span> <span class="hljs-number">1000</span> <span class="hljs-operator">*</span> <span class="hljs-number">60</span> <span class="hljs-operator">*</span> <span class="hljs-number">10</span>
  );
  await swapTx.wait();
 

  console.log(<span class="hljs-string">"套利完成!"</span>);
}

arbitrage();
</code></pre>]]></content:encoded>
            <author>llindon@newsletter.paragraph.com (LLindon)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/5a329372daa8a05aac8e0913d39f2badef3f2be57dc523fa6e84cec04f7937fa.jpg" length="0" type="image/jpg"/>
        </item>
    </channel>
</rss>