﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Get Started with web3 Development Easily Based on Ethereum Using FMZ (7)</title>
  <id>~/topic/25692/get-started-with-web3-development-easily-based-on-ethereum-using-fmz-(7)/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-12T00:17:02Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=25692" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/80282/</id>
    <title type="text">### Execute Read method calldata For the execution of the ```calldata``` of the Read method, we use ...</title>
    <published>2024-04-16T05:12:05Z</published>
    <updated>2024-04-16T05:12:05Z</updated>
    <author>
      <name>FMZ</name>
      <uri>https://stocksharp.com/users/186354/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">### Execute Read method calldata&lt;br /&gt;&lt;br /&gt;For the execution of the ```calldata``` of the Read method, we use the previously learned RPC method: ```eth_call``` to execute it. We explained the ```eth_call``` RPC method of the Ethereum only did a demonstration of the ```Write``` method of the smart contract, in this section, we use the ```calldata``` method to demonstrate the execution of the smart contract Read method call. Let&amp;#39;s use the ```balanceOf``` method of the WETH contract to read the current balance of WETH tokens in the wallet.&lt;br /&gt;&lt;br /&gt;We use the debugging tool to test on the Ethereum mainnet at:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function toAmount(s, decimals) {&lt;br /&gt;    return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())&lt;br /&gt;}&lt;br /&gt;function main() {&lt;br /&gt;    // ABI for WETH contracts&lt;br /&gt;    var abiWETH = `[{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;guy&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;approve&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;totalSupply&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;src&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;dst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;transferFrom&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;withdraw&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;decimals&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint8&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;balanceOf&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;symbol&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;dst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;transfer&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;deposit&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;payable&amp;quot;:true,&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;allowance&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;payable&amp;quot;:true,&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;fallback&amp;quot;},{&amp;quot;anonymous&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;src&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;guy&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;Approval&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;event&amp;quot;},{&amp;quot;anonymous&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;src&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;dst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;Transfer&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;event&amp;quot;},{&amp;quot;anonymous&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;dst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;Deposit&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;event&amp;quot;},{&amp;quot;anonymous&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;src&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;Withdrawal&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;event&amp;quot;}]`&lt;br /&gt;&lt;br /&gt;    // WETH contract address&lt;br /&gt;    var wethAddress = &amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;&lt;br /&gt;&lt;br /&gt;    // Register ABI for WETH contracts&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, wethAddress, abiWETH)&lt;br /&gt;&lt;br /&gt;    // The wallet address of the currently configured exchange object&lt;br /&gt;    var walletAddress = exchange.IO(&amp;quot;address&amp;quot;)&lt;br /&gt;&lt;br /&gt;    // Coded WETH contract&amp;#39;s deposit method call&lt;br /&gt;    var calldataForDeposit = exchange.IO(&amp;quot;encode&amp;quot;, wethAddress, &amp;quot;balanceOf(address)&amp;quot;, walletAddress)&lt;br /&gt;    Log(&amp;quot;calldataForDeposit:&amp;quot;, &amp;quot;0x&amp;quot; + calldataForDeposit)&lt;br /&gt;&lt;br /&gt;    // Construct the transaction as the first parameter of eth_call&lt;br /&gt;    var transaction = {&lt;br /&gt;        &amp;quot;from&amp;quot; : walletAddress,&lt;br /&gt;        &amp;quot;to&amp;quot; : wethAddress,&lt;br /&gt;        &amp;quot;data&amp;quot; : &amp;quot;0x&amp;quot; + calldataForDeposit,&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // The second parameter of eth_call&lt;br /&gt;    var blockNumber = &amp;quot;latest&amp;quot;&lt;br /&gt;&lt;br /&gt;    // Call with eth_call&lt;br /&gt;    var ret = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_call&amp;quot;, transaction, blockNumber)&lt;br /&gt;    var wethBalance = exchange.IO(&amp;quot;decode&amp;quot;, &amp;quot;uint256&amp;quot;, ret)   // You can use exchange.IO(&amp;quot;decode&amp;quot;, ...) function to decode&lt;br /&gt;    Log(&amp;quot;wethBalance:&amp;quot;, toAmount(wethBalance, 18))            // Converted from wei to WETH units&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Run in the debugging tool:&lt;br /&gt;&lt;br /&gt;```run&lt;br /&gt;2023-06-15 11:51:31		Info	wethBalance: 0.015&lt;br /&gt;2023-06-15 11:51:31		Info	calldataForDeposit: 0x70a082310000000000000000000000006b3f11d807809b0b1e5e3243df04a280d9f94bf4&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;If the method of a smart contract has a return value, you can use the ```exchange.IO(&amp;quot;decode&amp;quot;, ...)``` function to decode it. You can see that the passing ```calldata``` method is the same as calling the smart contract&amp;#39;s ```balanceOf``` method directly, getting the WETH balance of 0.015 WETH for my test wallet.&lt;br /&gt;&lt;br /&gt;### Execute Write method calldata&lt;br /&gt;&lt;br /&gt;For the execution of the Write method calldata, it is necessary to use the RPC method: ```eth_sendRawTransaction```.&lt;br /&gt;&lt;br /&gt;Let&amp;#39;s use the debugging tool and test it on the Ethereum mainnet at:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function toAmount(s, decimals) {&lt;br /&gt;    return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())&lt;br /&gt;}&lt;br /&gt;function toInnerAmount(s, decimals) {&lt;br /&gt;    return (BigDecimal(s)*BigDecimal(Math.pow(10, decimals))).toFixed(0)&lt;br /&gt;}&lt;br /&gt;function main() {&lt;br /&gt;    // ABI for WETH contracts&lt;br /&gt;    var abiWETH = `[{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;guy&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;approve&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;totalSupply&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;src&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;dst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;transferFrom&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;withdraw&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;decimals&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint8&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;balanceOf&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;symbol&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;dst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;transfer&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;deposit&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;payable&amp;quot;:true,&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;allowance&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;payable&amp;quot;:true,&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;fallback&amp;quot;},{&amp;quot;anonymous&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;src&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;guy&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;Approval&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;event&amp;quot;},{&amp;quot;anonymous&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;src&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;dst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;Transfer&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;event&amp;quot;},{&amp;quot;anonymous&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;dst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;Deposit&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;event&amp;quot;},{&amp;quot;anonymous&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;src&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;Withdrawal&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;event&amp;quot;}]`&lt;br /&gt;&lt;br /&gt;    // WETH contract address&lt;br /&gt;    var wethAddress = &amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;&lt;br /&gt;&lt;br /&gt;    // Register ABI for WETH contract&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, wethAddress, abiWETH)&lt;br /&gt;&lt;br /&gt;    // The wallet address of the currently configured exchange object&lt;br /&gt;    var walletAddress = exchange.IO(&amp;quot;address&amp;quot;)&lt;br /&gt;&lt;br /&gt;    // Coded WETH contract&amp;#39;s deposit method call&lt;br /&gt;    var calldataForDeposit = exchange.IO(&amp;quot;encode&amp;quot;, wethAddress, &amp;quot;deposit&amp;quot;)&lt;br /&gt;    Log(&amp;quot;calldataForDeposit:&amp;quot;, &amp;quot;0x&amp;quot; + calldataForDeposit)&lt;br /&gt;&lt;br /&gt;    // Get nonce&lt;br /&gt;    var nonce = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getTransactionCount&amp;quot;, walletAddress, &amp;quot;pending&amp;quot;)&lt;br /&gt;&lt;br /&gt;    // Get gasPrice&lt;br /&gt;    var gasPrice = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_gasPrice&amp;quot;)&lt;br /&gt;&lt;br /&gt;    // Call the deposit method to change ETH to WETH, you need to transfer ETH, here we convert 0.01ETH to a hexadecimal value in wei&lt;br /&gt;    var innerAmount = BigInt(Number(toInnerAmount(0.005, 18))).toString(16)&lt;br /&gt;&lt;br /&gt;    // The transaction call object:&lt;br /&gt;    var obj = {&lt;br /&gt;        &amp;quot;from&amp;quot; : walletAddress,&lt;br /&gt;        &amp;quot;to&amp;quot;  : wethAddress,&lt;br /&gt;        &amp;quot;gasPrice&amp;quot; : gasPrice,&lt;br /&gt;        &amp;quot;value&amp;quot; : &amp;quot;0x&amp;quot; + innerAmount,&lt;br /&gt;        &amp;quot;data&amp;quot; : &amp;quot;0x&amp;quot; + calldataForDeposit,&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Calculate gasLimit&lt;br /&gt;    var gasLimit = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_estimateGas&amp;quot;, obj)&lt;br /&gt;&lt;br /&gt;    // Construct a transaction&lt;br /&gt;    var transaction = {&lt;br /&gt;        &amp;quot;to&amp;quot;: wethAddress,&lt;br /&gt;        &amp;quot;value&amp;quot;: toAmount(&amp;quot;0x&amp;quot; + innerAmount, 0),   // Convert to decimal&lt;br /&gt;        &amp;quot;data&amp;quot;: &amp;quot;0x&amp;quot; + calldataForDeposit,&lt;br /&gt;        &amp;quot;gasLimit&amp;quot;: toAmount(gasLimit, 0),   // Convert to decimal&lt;br /&gt;        &amp;quot;gasPrice&amp;quot;: toAmount(gasPrice, 0),   // Convert to decimal&lt;br /&gt;        &amp;quot;nonce&amp;quot;: toAmount(nonce, 0),         // Convert to decimal&lt;br /&gt;        &amp;quot;chainId&amp;quot;: 1,                        // Ethereum mainnet Id&lt;br /&gt;    }&lt;br /&gt;    Log(&amp;quot;transaction:&amp;quot;, transaction)&lt;br /&gt;&lt;br /&gt;    // Signature, your key is replaced with your private key&lt;br /&gt;    var signedTx = Encode(&amp;quot;signTx&amp;quot;, &amp;quot;string&amp;quot;, &amp;quot;hex&amp;quot;, JSON.stringify(transaction), &amp;quot;hex&amp;quot;, &amp;quot;0x&amp;quot; + &amp;quot;your key&amp;quot;)&lt;br /&gt;    Log(&amp;quot;signedTx:&amp;quot;, &amp;quot;0x&amp;quot; + signedTx)&lt;br /&gt;&lt;br /&gt;    // Call eth_sendRawTransaction to send a transaction&lt;br /&gt;    var ret = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_sendRawTransaction&amp;quot;, &amp;quot;0x&amp;quot; + signedTx)&lt;br /&gt;    return ret &lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Run in the debugging tool:&lt;br /&gt;&lt;br /&gt;```run&lt;br /&gt;2023-06-15 09:58:50		Info	signedTx: 0xf86f4f8504202067888...&lt;br /&gt;2023-06-15 09:58:50		Info	transaction: {&amp;quot;to&amp;quot;:&amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;,&amp;quot;value&amp;quot;:5000000000000000,&amp;quot;data&amp;quot;:&amp;quot;0xd0e30db0&amp;quot;,&amp;quot;gasLimit&amp;quot;:27938,&amp;quot;gasPrice&amp;quot;:17718863752,&amp;quot;nonce&amp;quot;:79,&amp;quot;chainId&amp;quot;:1}&lt;br /&gt;2023-06-15 09:58:50		Info	calldataForDeposit: 0xd0e30db0&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Execute ```var ret = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_sendRawTransaction&amp;quot;, &amp;quot;0x&amp;quot; + signedTx)``` function and the returned Transaction Hash is: ``` 0x2ff585504b0fe59b0122f696e8808abfe2f3ce263448066533f3bb8a4f55e8e6```. The ```eth_sendRawTransaction``` call executes the calldata in it, calling the ```deposit``` method of the WETH contract to swap the 0.005 ETH sent for WETH.&lt;br /&gt;&lt;br /&gt;## Listening to mempool&lt;br /&gt;&lt;br /&gt;Before a user&amp;#39;s transaction is packaged into the Ethereum blockchain by miners, all transactions will be pooled in ```Mempool``` (transaction memory pool), where &amp;quot;miners&amp;quot; also look for transactions with high fees to be packaged first, in order to maximize mining benefits. Therefore, usually the higher the transaction&amp;#39;s gasPrice setting, the more likely it is to be packaged.&lt;br /&gt;&lt;br /&gt;Some transaction scripts will also sniff ```Mempool``` in the hope of finding some profitable transactions. For example, if a transaction is set with a high exchange slippage, the transaction could be subject to a &amp;quot;sandwich attack&amp;#39;&amp;#39; by these transactionscripts. So how do these scripts listen for ```pending``` (pending, to-be-packaged) transactions in ```Mempool```?&lt;br /&gt;&lt;br /&gt;### Listening with the REST protocol&lt;br /&gt;&lt;br /&gt;Use the RPC method we learned before: ```eth_getBlockByNumber```, but we do not pass the specific ```blockNumber``` this time, we use the ```&amp;quot;pending&amp;quot;``` tag.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function main() {&lt;br /&gt;    var data = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getBlockByNumber&amp;quot;, &amp;quot;pending&amp;quot;, true)&lt;br /&gt;    if (Array.isArray(data.transactions)) {&lt;br /&gt;        for (var i = 0; i &amp;lt; data.transactions.length; i++) {&lt;br /&gt;            Log(data.transactions[i])&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Run in the debugging tool:&lt;br /&gt;&lt;br /&gt;```run&lt;br /&gt;2023-06-18 19:23:05		Info	{&amp;quot;blockNumber&amp;quot;:&amp;quot;0x10b2027&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;0x2&amp;quot;,&amp;quot;accessList&amp;quot;:[],&amp;quot;blockHash&amp;quot;:&amp;quot;0xf833ed36435c53d63bd7109bb1e85383075534410c14573881bf26d912f46a89&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;0xd50521974d62f1fa34b8e81cb742ccf6147d05ff&amp;quot;,&amp;quot;gasPrice&amp;quot;:&amp;quot;0x32ea2db37&amp;quot;,&amp;quot;hash&amp;quot;:&amp;quot;0xf8f10f8f473c340b021298feb48d0affe529e8737a309c4cc1902e8989ef0914&amp;quot;,&amp;quot;input&amp;quot;:&amp;quot;0xa22cb4650000000000000000000000001e0049783f008a0085193e00003d00cd54003c710000000000000000000000000000000000000000000000000000000000000001&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;0x0&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;0x0&amp;quot;,&amp;quot;maxFeePerGas&amp;quot;:&amp;quot;0x48a413364&amp;quot;,&amp;quot;maxPriorityFeePerGas&amp;quot;:&amp;quot;0x5f5e100&amp;quot;,&amp;quot;nonce&amp;quot;:&amp;quot;0x8&amp;quot;,&amp;quot;r&amp;quot;:&amp;quot;0x8c1cc36f43b02c9e9e454153588cc9d38757f1da69ec49d3cfdda74ab69e06a8&amp;quot;,&amp;quot;s&amp;quot;:&amp;quot;0x2f3dd3e5ddf9e5d42c128a8e900026aca7568fa83c68cf332e1328066ee8d03a&amp;quot;,&amp;quot;transactionIndex&amp;quot;:&amp;quot;0x3a&amp;quot;,&amp;quot;chainId&amp;quot;:&amp;quot;0x1&amp;quot;,&amp;quot;gas&amp;quot;:&amp;quot;0x1142d&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;0x8c3c0274c33f263f0a55d129cfc8eaa3667a9e8b&amp;quot;}&lt;br /&gt;2023-06-18 19:23:05		Info	{&amp;quot;input&amp;quot;:&amp;quot;0x646174613a2c7b2270223a226572632d3230222c226f70223a226d696e74222c227469636b223a2265746873222c226964223a223139323732222c22616d74223a2231303030227d&amp;quot;,&amp;quot;nonce&amp;quot;:&amp;quot;0x1d&amp;quot;,&amp;quot;blockHash&amp;quot;:&amp;quot;0xf833ed36435c53d63bd7109bb1e85383075534410c14573881bf26d912f46a89&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;0xe7fa86855af674837cea1b58f88b5352543ca27b&amp;quot;,&amp;quot;gas&amp;quot;:&amp;quot;0x81cc&amp;quot;,&amp;quot;gasPrice&amp;quot;:&amp;quot;0x32ea2db37&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;0xe7fa86855af674837cea1b58f88b5352543ca27b&amp;quot;,&amp;quot;chainId&amp;quot;:&amp;quot;0x1&amp;quot;,&amp;quot;transactionIndex&amp;quot;:&amp;quot;0x39&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;0x2&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;0x0&amp;quot;,&amp;quot;accessList&amp;quot;:[],&amp;quot;blockNumber&amp;quot;:&amp;quot;0x10b2027&amp;quot;,&amp;quot;hash&amp;quot;:&amp;quot;0x55702f5d14736fc9d0c58fdac2d2052a602db171c46b5e1fa9ff6af5c277f9a2&amp;quot;,&amp;quot;maxFeePerGas&amp;quot;:&amp;quot;0x48a413364&amp;quot;,&amp;quot;maxPriorityFeePerGas&amp;quot;:&amp;quot;0x5f5e100&amp;quot;,&amp;quot;r&amp;quot;:&amp;quot;0x5a703d389d23b51adf8ef0f55db8876e7392636797b68a4be6afe73e76d7e1f2&amp;quot;,&amp;quot;s&amp;quot;:&amp;quot;0x4b4bb11257c4434a0acc2672357f8793476e4bfdf98bc30d2389ce335e7de64e&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;0x1&amp;quot;}&lt;br /&gt;2023-06-18 19:23:05		Info	{&amp;quot;gas&amp;quot;:&amp;quot;0x186a0&amp;quot;,&amp;quot;nonce&amp;quot;:&amp;quot;0x46533&amp;quot;,&amp;quot;r&amp;quot;:&amp;quot;0xfeea052a4ac2283ca058a657a806ba0916d8e7d52d2a577f150c40eb1dfbec65&amp;quot;,&amp;quot;s&amp;quot;:&amp;quot;0x5bf0089a3c060ba787b67a205b44e1065a0d11d132b41737ab9adf0f55066811&amp;quot;,&amp;quot;transactionIndex&amp;quot;:&amp;quot;0x38&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;0x78f0975742c400&amp;quot;,&amp;quot;blockHash&amp;quot;:&amp;quot;0xf833ed36435c53d63bd7109bb1e85383075534410c14573881bf26d912f46a89&amp;quot;,&amp;quot;chainId&amp;quot;:&amp;quot;0x1&amp;quot;,&amp;quot;hash&amp;quot;:&amp;quot;0x56bdf1b38e23db66e8d1c4014d1e9f690a9217d8a0232489210325fc69e25cf9&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;0x25&amp;quot;,&amp;quot;input&amp;quot;:&amp;quot;0x&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;0x0&amp;quot;,&amp;quot;blockNumber&amp;quot;:&amp;quot;0x10b2027&amp;quot;,&amp;quot;gasPrice&amp;quot;:&amp;quot;0x4a817c800&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;0x97b9d2102a9a65a26e1ee82d59e42d1b73b68689&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;0xcb513e99c020e9d15a6eafef873fef5d9f078221&amp;quot;}&lt;br /&gt;...&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Extract one piece of the data:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;{&lt;br /&gt;	&amp;quot;blockNumber&amp;quot;: &amp;quot;0x10b2027&amp;quot;,&lt;br /&gt;	&amp;quot;type&amp;quot;: &amp;quot;0x2&amp;quot;,&lt;br /&gt;	&amp;quot;accessList&amp;quot;: [],&lt;br /&gt;	&amp;quot;blockHash&amp;quot;: &amp;quot;0xf833ed36435c53d63bd7109bb1e85383075534410c14573881bf26d912f46a89&amp;quot;,&lt;br /&gt;	&amp;quot;from&amp;quot;: &amp;quot;0xd50521974d62f1fa34b8e81cb742ccf6147d05ff&amp;quot;,&lt;br /&gt;	&amp;quot;gasPrice&amp;quot;: &amp;quot;0x32ea2db37&amp;quot;,&lt;br /&gt;	&amp;quot;hash&amp;quot;: &amp;quot;0xf8f10f8f473c340b021298feb48d0affe529e8737a309c4cc1902e8989ef0914&amp;quot;,&lt;br /&gt;	&amp;quot;input&amp;quot;: &amp;quot;0xa22cb4650000000000000000000000001e0049783f008a0085193e00003d00cd54003c710000000000000000000000000000000000000000000000000000000000000001&amp;quot;,&lt;br /&gt;	&amp;quot;v&amp;quot;: &amp;quot;0x0&amp;quot;,&lt;br /&gt;	&amp;quot;value&amp;quot;: &amp;quot;0x0&amp;quot;,&lt;br /&gt;	&amp;quot;maxFeePerGas&amp;quot;: &amp;quot;0x48a413364&amp;quot;,&lt;br /&gt;	&amp;quot;maxPriorityFeePerGas&amp;quot;: &amp;quot;0x5f5e100&amp;quot;,&lt;br /&gt;	&amp;quot;nonce&amp;quot;: &amp;quot;0x8&amp;quot;,&lt;br /&gt;	&amp;quot;r&amp;quot;: &amp;quot;0x8c1cc36f43b02c9e9e454153588cc9d38757f1da69ec49d3cfdda74ab69e06a8&amp;quot;,&lt;br /&gt;	&amp;quot;s&amp;quot;: &amp;quot;0x2f3dd3e5ddf9e5d42c128a8e900026aca7568fa83c68cf332e1328066ee8d03a&amp;quot;,&lt;br /&gt;	&amp;quot;transactionIndex&amp;quot;: &amp;quot;0x3a&amp;quot;,&lt;br /&gt;	&amp;quot;chainId&amp;quot;: &amp;quot;0x1&amp;quot;,&lt;br /&gt;	&amp;quot;gas&amp;quot;: &amp;quot;0x1142d&amp;quot;,&lt;br /&gt;	&amp;quot;to&amp;quot;: &amp;quot;0x8c3c0274c33f263f0a55d129cfc8eaa3667a9e8b&amp;quot;&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;### Listening with the WebSocket protocol&lt;br /&gt;&lt;br /&gt;In the FMZ Quant Trading Platform, we use the ```Dial``` function to create ```WebSocket``` connections, you can check the ```FMZ API``` documentation to learn the ```Dial``` function.&lt;br /&gt;&lt;br /&gt;The test code in this section runs in the Ethereum mainnet environment, and it is easier to use the FMZ Quant to test in live trading due to the use of WebSocket protocol communication. The Websocket protocol subscription messages are:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;{&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;id&amp;quot;: 1, &amp;quot;method&amp;quot;: &amp;quot;eth_subscribe&amp;quot;, &amp;quot;params&amp;quot;: [&amp;quot;newPendingTransactions&amp;quot;]}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In addition to ```newPendingTransactions```, you can also subscribe to ```newHeads```, ```logs```.&lt;br /&gt;&lt;br /&gt;Receiving data pushed by ```WebSocket``` connections:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;{&lt;br /&gt;	&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;,&lt;br /&gt;	&amp;quot;method&amp;quot;: &amp;quot;eth_subscription&amp;quot;,&lt;br /&gt;	&amp;quot;params&amp;quot;: {&lt;br /&gt;		&amp;quot;subscription&amp;quot;: &amp;quot;0x2c5c087b4aa188e008f4747828ef4e61&amp;quot;,&lt;br /&gt;		&amp;quot;result&amp;quot;: &amp;quot;0x69c4251cecb814e17cfe7a5ee41742a616f9a4d1bbf245c49b186b1006fd14d3&amp;quot;&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Then further query ```transaction``` according to which: ```&amp;quot;result&amp;quot;: &amp;quot;0x69c4251cecb814e17cfe7a5ee41742a616f9a4d1bbf245c49b186b1006fd14d3&amp;quot;```. For a specific ```transaction```, we use the Ethereum RPC method ```eth_getTransactionByHash``` to query.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;var ws = null &lt;br /&gt;&lt;br /&gt;function main () {    &lt;br /&gt;    // {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;id&amp;quot;: 1, &amp;quot;method&amp;quot;: &amp;quot;eth_subscribe&amp;quot;, &amp;quot;params&amp;quot;: [&amp;quot;xxxxx&amp;quot;]}  , &amp;quot;xxxxx&amp;quot; is the specific message to subscribe to&lt;br /&gt;    var payload = {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;id&amp;quot;: 1, &amp;quot;method&amp;quot;: &amp;quot;eth_subscribe&amp;quot;, &amp;quot;params&amp;quot;: [&amp;quot;newPendingTransactions&amp;quot;]}&lt;br /&gt;    &lt;br /&gt;    // wss://mainnet.infura.io/ws/v3/xxxxx , &amp;quot;xxxxx&amp;quot; is your infura key&lt;br /&gt;    var infuraKey = &amp;quot;your key&amp;quot;&lt;br /&gt;&lt;br /&gt;    ws = Dial(&amp;quot;wss://mainnet.infura.io/ws/v3/&amp;quot; + infuraKey + &amp;quot;|reconnect=true&amp;amp;payload=&amp;quot; + JSON.stringify(payload))&lt;br /&gt;    if (!ws) {&lt;br /&gt;        throw &amp;quot;websocket link infura failed!&amp;quot;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    // eth_getTransactionByHash call count&lt;br /&gt;    var getTransactionCounter = 0&lt;br /&gt;&lt;br /&gt;    var beginTS = new Date().getTime()&lt;br /&gt;&lt;br /&gt;    // Loop to get messages&lt;br /&gt;    while (true) {&lt;br /&gt;        // Receive push messages&lt;br /&gt;        var data = ws.read()&lt;br /&gt;        if (data) {&lt;br /&gt;            var ts = new Date().getTime()&lt;br /&gt;&lt;br /&gt;            if (ts - beginTS &amp;gt;= 1000) {&lt;br /&gt;                getTransactionCounter = 0&lt;br /&gt;                beginTS = ts &lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            // Check transaction details based on txHash&lt;br /&gt;            if (ts - beginTS &amp;lt; 1000 &amp;amp;&amp;amp; getTransactionCounter &amp;gt;= 100) {&lt;br /&gt;                Sleep(1000)&lt;br /&gt;                getTransactionCounter = 0&lt;br /&gt;                beginTS = ts &lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            var obj = JSON.parse(data)&lt;br /&gt;            if (obj[&amp;quot;params&amp;quot;] &amp;amp;&amp;amp; obj[&amp;quot;params&amp;quot;][&amp;quot;result&amp;quot;]) {&lt;br /&gt;                var transcationInfo = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getTransactionByHash&amp;quot;, obj[&amp;quot;params&amp;quot;][&amp;quot;result&amp;quot;])&lt;br /&gt;                Log(obj[&amp;quot;params&amp;quot;][&amp;quot;result&amp;quot;], &amp;quot;transcationInfo:&amp;quot;, transcationInfo)&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            getTransactionCounter++&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        LogStatus(_D())&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function onexit() {&lt;br /&gt;    Log(&amp;quot;Disconnect WS connection&amp;quot;)&lt;br /&gt;    ws.close()&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Create a live trading to run the above code, you can receive the data pushed by the WebSocket connection, the data is pushed constantly, we extract one of them - ```transaction```:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;{&lt;br /&gt;	&amp;quot;maxPriorityFeePerGas&amp;quot;: &amp;quot;0x5f5e100&amp;quot;,&lt;br /&gt;	&amp;quot;nonce&amp;quot;: &amp;quot;0x1a9&amp;quot;,&lt;br /&gt;	&amp;quot;accessList&amp;quot;: [],&lt;br /&gt;	&amp;quot;blockNumber&amp;quot;: &amp;quot;0x10b1c9f&amp;quot;,&lt;br /&gt;	&amp;quot;from&amp;quot;: &amp;quot;0x5888700be02f52c8adf85890886ef84a6b8a7829&amp;quot;,&lt;br /&gt;	&amp;quot;blockHash&amp;quot;: &amp;quot;0x92c3d77ea218cdc0967ab74b6005bb393b92355047f206c7e2d59d41828e7fa9&amp;quot;,&lt;br /&gt;	&amp;quot;chainId&amp;quot;: &amp;quot;0x1&amp;quot;,&lt;br /&gt;	&amp;quot;gasPrice&amp;quot;: &amp;quot;0x34fdbf43d&amp;quot;,&lt;br /&gt;	&amp;quot;s&amp;quot;: &amp;quot;0x7d86ae29a786a61b9e74a7a9e2cc4b39b7913aa3d4c3816ccb07528fed82048a&amp;quot;,&lt;br /&gt;	&amp;quot;to&amp;quot;: &amp;quot;0xfc2068c3d47b575a60f6a4a7bf60dea0ac368e01&amp;quot;,&lt;br /&gt;	&amp;quot;type&amp;quot;: &amp;quot;0x2&amp;quot;,&lt;br /&gt;	&amp;quot;v&amp;quot;: &amp;quot;0x1&amp;quot;,&lt;br /&gt;	&amp;quot;value&amp;quot;: &amp;quot;0x0&amp;quot;,&lt;br /&gt;	&amp;quot;gas&amp;quot;: &amp;quot;0x1aad3&amp;quot;,&lt;br /&gt;	&amp;quot;hash&amp;quot;: &amp;quot;0x2c77c0704aefbb26db460cbb71efdb488df968ad53d2c2b3f1e1172056b40b22&amp;quot;,&lt;br /&gt;	&amp;quot;input&amp;quot;: &amp;quot;0x42842e0e0000000000000000000000005888700be02f52c8adf85890886ef84a6b8a7829000000000000000000000000d2d07e4d1bb0f40ac3e4aa7cc3ad05d348bfd2c3000000000000000000000000000000000000000000000000000000000000180b&amp;quot;,&lt;br /&gt;	&amp;quot;maxFeePerGas&amp;quot;: &amp;quot;0x4712d1273&amp;quot;,&lt;br /&gt;	&amp;quot;r&amp;quot;: &amp;quot;0x8ec58f95f6d9729a6eee075e6976658b6c5346cbc90eb68ac361a40af073b10e&amp;quot;,&lt;br /&gt;	&amp;quot;transactionIndex&amp;quot;: &amp;quot;0xc1&amp;quot;&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Excerpted (partial omission) log data:&lt;br /&gt;&lt;br /&gt;```run&lt;br /&gt;2023-06-18 16:20:07		Info	Disconnect WS connection&lt;br /&gt;2023-06-18 16:20:07		Info	0xba07ca903f9eafbfa7d494bb26197713034b9ca2dd3c19bc0898af3f35b59343 transcationInfo: {&amp;quot;accessList&amp;quot;:[],&amp;quot;from&amp;quot;:&amp;quot;0xe2977d60182da068dfd78693f96362ee7a2e9644&amp;quot;,&amp;quot;nonce&amp;quot;:&amp;quot;0xf&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;0x0&amp;quot;,&amp;quot;blockHash&amp;quot;:&amp;quot;0x92c3d77ea218cdc0967ab74b6005bb393b92355047f206c7e2d59d41828e7fa9&amp;quot;,&amp;quot;blockNumber&amp;quot;:&amp;quot;0x10b1c9f&amp;quot;,&amp;quot;chainId&amp;quot;:&amp;quot;0x1&amp;quot;,&amp;quot;hash&amp;quot;:&amp;quot;0xba07ca903f9eafbfa7d494bb26197713034b9ca2dd3c19bc0898af3f35b59343&amp;quot;,&amp;quot;maxFeePerGas&amp;quot;:&amp;quot;0x530c30b70&amp;quot;,&amp;quot;r&amp;quot;:&amp;quot;0xf28bfdf372a5401a2e00675c6ebe8d5e73f2c955db44b1aa56240b9197d6cbc7&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;0x2&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;0x0&amp;quot;,&amp;quot;gas&amp;quot;:&amp;quot;0x21079&amp;quot;,&amp;quot;gasPrice&amp;quot;:&amp;quot;0x367b3783d&amp;quot;,&amp;quot;input&amp;quot;:&amp;quot;0x657bb1130000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000001e0300000000000000000000000033c6eec1723b12c46732f7ab41398de45641fa42000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000041976bd7d021a5b94cbba72b291093b50a0ecf21d1c6cd8193fbfcd685c4723ce068feb249bdcace58c28eb3b6cc647e8c839b0826c84f8dfe4c31d57d1ac1f0111b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000648ebef50000000000000000000000000000000000000000000000000000000000000000&amp;quot;,&amp;quot;maxPriorityFeePerGas&amp;quot;:&amp;quot;0x1dcd6500&amp;quot;,&amp;quot;s&amp;quot;:&amp;quot;0x71d51246bb60e792f963a3c75c46fd8f557921ce6face7224c944e1768a76ca&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;0x0b51eb9d0e54c562fedc07ceba453f05b70c4b79&amp;quot;,&amp;quot;transactionIndex&amp;quot;:&amp;quot;0x40&amp;quot;}&lt;br /&gt;2023-06-18 16:20:07		Info	0x2c77c0704aefbb26db460cbb71efdb488df968ad53d2c2b3f1e1172056b40b22 transcationInfo: {&amp;quot;maxPriorityFeePerGas&amp;quot;:&amp;quot;0x5f5e100&amp;quot;,&amp;quot;nonce&amp;quot;:&amp;quot;0x1a9&amp;quot;,&amp;quot;accessList&amp;quot;:[],&amp;quot;blockNumber&amp;quot;:&amp;quot;0x10b1c9f&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;0x5888700be02f52c8adf85890886ef84a6b8a7829&amp;quot;,&amp;quot;blockHash&amp;quot;:&amp;quot;0x92c3d77ea218cdc0967ab74b6005bb393b92355047f206c7e2d59d41828e7fa9&amp;quot;,&amp;quot;chainId&amp;quot;:&amp;quot;0x1&amp;quot;,&amp;quot;gasPrice&amp;quot;:&amp;quot;0x34fdbf43d&amp;quot;,&amp;quot;s&amp;quot;:&amp;quot;0x7d86ae29a786a61b9e74a7a9e2cc4b39b7913aa3d4c3816ccb07528fed82048a&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;0xfc2068c3d47b575a60f6a4a7bf60dea0ac368e01&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;0x2&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;0x1&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;0x0&amp;quot;,&amp;quot;gas&amp;quot;:&amp;quot;0x1aad3&amp;quot;,&amp;quot;hash&amp;quot;:&amp;quot;0x2c77c0704aefbb26db460cbb71efdb488df968ad53d2c2b3f1e1172056b40b22&amp;quot;,&amp;quot;input&amp;quot;:&amp;quot;0x42842e0e0000000000000000000000005888700be02f52c8adf85890886ef84a6b8a7829000000000000000000000000d2d07e4d1bb0f40ac3e4aa7cc3ad05d348bfd2c3000000000000000000000000000000000000000000000000000000000000180b&amp;quot;,&amp;quot;maxFeePerGas&amp;quot;:&amp;quot;0x4712d1273&amp;quot;,&amp;quot;r&amp;quot;:&amp;quot;0x8ec58f95f6d9729a6eee075e6976658b6c5346cbc90eb68ac361a40af073b10e&amp;quot;,&amp;quot;transactionIndex&amp;quot;:&amp;quot;0xc1&amp;quot;}&lt;br /&gt;2023-06-18 16:20:07		Info	0xbc42d5db10e5cb2e888c76005c522cb2474a0c0a7325feb867b618f69ff26f2a transcationInfo: {&amp;quot;accessList&amp;quot;:[],&amp;quot;blockNumber&amp;quot;:&amp;quot;0x10b1c9f&amp;quot;,&amp;quot;gas&amp;quot;:&amp;quot;0x1cc12b&amp;quot;,&amp;quot;hash&amp;quot;:&amp;quot;0xbc42d5db10e5cb2e888c76005c522cb2474a0c0a7325feb867b618f69ff26f2a&amp;quot;,&amp;quot;maxFeePerGas&amp;quot;:&amp;quot;0x6ab262e5c&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;0x0&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;0x1&amp;quot;,&amp;quot;chainId&amp;quot;:&amp;quot;0x1&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;0xc1b634853cb333d3ad8663715b08f41a3aec47cc&amp;quot;,&amp;quot;input&amp;quot;:&amp;quot;0x8f111f3c000000000000000000000000000000000000000000000000000000000003b83700000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000e0fa2000000000000000000000000e64a54e2533fd126c2e452c5fab544d80e2e4eb50000000000000000000000000000000000000000000000000000000004c6ff1c0000000000000000000000000000000000000000000000000000000004c70029000000000000000000000000000000000000000000000000000000000001822d005b1979341221e80ed20b20d832de88a8a4b535fe9990a90c165f3c95ad085ab9445c0a998c70edff76f1c2de3f4263d7e4fe3c3fb73fe7dcfbdede92371842fb883267f5408c8aaf08ba2f6c22463f19da98183d2302735615460d7380d6f9ff5e764e75bcaca9a93946cf644cd4d4448f314c4cf60cd0353f085aa0562d70e16a510b8bc4c2a09b5e7fafcd43f07dc1b5dd1782962af8f6fff7a6965bfc127e11501a72c64913d58e624333f9ec51687c7cb1bb4a9850541f1e03b2790ed4ee508052910dfe22542d900548d5243ca238811427491d49e98cf269ccab5b1724f0f9698120e406c00910c4090c0e84e0400e2706822d2a001a3964a0ca8101700a547342c2c1fff8934a988416f020a0c98f0909c7f529875f8443914e10b58145c79d38914d1fafbc9ee57ebcb377e4ac1cd252bdebe3c59e8e917fea7dbc7bf66dfc1846482a858645b95555b3ecc9ab4f9e2b0e3e78d68379b009e606a1cefe675670a5eabd5f5a2efa5d77a1084288480c98d01c70a3d8c6b854496e2a966dc9051b13b872b7c6c2c5d82676fd8e82c680514333db21db2006d23f42074021de7e61c54d88b01824d40f03d1505eb6ec6d0cb7ccd38deb821517a5e63d0e89f6bf0385f109c81ea36dd00e7a903a100290f5b47a940ed146ae9338ff8bc17a2b5bc457614d0831e743e485c0de84636b034400bf6bd192ff723045cc170e109aabf273dc9de19c9987038515b6613249f471f9ddeb31331cc1643902212d20241c417532ad7e4a9ac742b4b5f68e1019795cf9386dcf36037502c13ff51f50a2202b2c1cac1c0b38a21ec798deff778c9a6b679d16d0521d2df89c439f4f8f9425ed378f4194d03d00&lt;br /&gt;2023-06-18 16:20:06		Info	0xff0945c3d682a37e18ee433d56c8bedbb93d9ac368af968ed8d53b655575e8e5 transcationInfo: {&amp;quot;gas&amp;quot;:&amp;quot;0x5208&amp;quot;,&amp;quot;s&amp;quot;:&amp;quot;0x63572e1fa060841b939cea0849154e55781fe0efcbdfe5ce6979b44ce0980e4a&amp;quot;,&amp;quot;transactionIndex&amp;quot;:&amp;quot;0xa7&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;0x113e9d515e400&amp;quot;,&amp;quot;blockHash&amp;quot;:&amp;quot;0x92c3d77ea218cdc0967ab74b6005bb393b92355047f206c7e2d59d41828e7fa9&amp;quot;,&amp;quot;hash&amp;quot;:&amp;quot;0xff0945c3d682a37e18ee433d56c8bedbb93d9ac368af968ed8d53b655575e8e5&amp;quot;,&amp;quot;nonce&amp;quot;:&amp;quot;0x2&amp;quot;,&amp;quot;r&amp;quot;:&amp;quot;0x698fe26331ad39ba89c4d30985b707792ea4ab09b25205727f8fac2a6120b54a&amp;quot;,&amp;quot;gasPrice&amp;quot;:&amp;quot;0x35458af00&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;0x228d93af92d03184c07aa9e39b3d2d61b666686d&amp;quot;,&amp;quot;input&amp;quot;:&amp;quot;0x&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;0x0246177b98a5e42835cdcfaac1c274d3e6c39486&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;0x26&amp;quot;,&amp;quot;blockNumber&amp;quot;:&amp;quot;0x10b1c9f&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;0x0&amp;quot;,&amp;quot;chainId&amp;quot;:&amp;quot;0x1&amp;quot;}&lt;br /&gt;...&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;## Decoding Transaction Details&lt;br /&gt;&lt;br /&gt;In the previous course, we wrote a monitoring program to monitor pending transactions on Ethereum, get the pushed transaction hash via WebSocket protocol, and then query the specific transaction details based on the transaction hash.&lt;br /&gt;&lt;br /&gt;Next we want to do further parsing of the ```input``` field data in the transaction details data. The ```input``` field data looks like a jumble of hexadecimal data, but it actually encodes the content of the transaction: including the functions called, and the parameters entered, etc.&lt;br /&gt;&lt;br /&gt;After repeated and extensive testing, we found that the timeliness and quantity of data pushed over by the WebSocket connection has a lot to do with the RPC node currently in use, and the pushed data received by two different RPC node services (e.g., infura, ALCHEMY) when creating a WebSocket connection at the same time is not exactly the same, and since the current scenario generates a large number of requests, we still need to use a more stable and faster RPC service. The WebSocket connection also pushes a lot of transaction hashes that have been Pending for a long time, and when using ```eth_getTransactionByHash``` to query, you often get a null value (tested on FMZ, node.js).&lt;br /&gt;&lt;br /&gt;We use the ```alchemy``` RPC node this time: ```wss://eth-mainnet.g.alchemy.com/v2/oKmOQKbneVkxgHZfibs-iFhIlIAl6HDN```. The node supports both WebSocket and REST protocols.&lt;br /&gt;&lt;br /&gt;We monitor the ```multicall(uint256,bytes[])``` method of the router smart contract of the Uniswap decentralized exchange, so we need to calculate the function signature hash of the method first.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;// Take the first 8 characters of the complete hash&lt;br /&gt;// multicall: 0x5ae401dc&lt;br /&gt;var sigHash = &amp;quot;0x&amp;quot; + Encode(&amp;quot;keccak256&amp;quot;, &amp;quot;string&amp;quot;, &amp;quot;hex&amp;quot;, &amp;quot;multicall(uint256,bytes[])&amp;quot;).slice(0, 8)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Based on the example in the previous lesson, we have made some modifications. When receiving messages pushed by the WebSocket connection, the latest data is received using ```var data = ws.read(-2)``` method, and the ```read()``` function parameter is set to -2 to indicate that the latest data is returned immediately. We only care about the ```Transaction``` that contains the ```multicall``` call, using ```if (tx &amp;amp;&amp;amp; tx.input.indexOf(sigHash) ! == -1)``` to determine the filter.&lt;br /&gt;&lt;br /&gt;2 custom functions need to be designed:&lt;br /&gt;&lt;br /&gt;- ```calcAllFuncSigHash()```: Calculate signature hash for all methods based on ABI.&lt;br /&gt;- ```decodeCall()```: Decoding function.&lt;br /&gt;&lt;br /&gt;Next, when the ```multicall``` call is detected, the decoding operation can start, and the parameters of the ```multicall``` method are decoded for the first time: ```deadline``` and ```data```. ```deadline``` is a timestamp that is better understood, and ```data``` is another encoded ```calldata```, so you still need to continue to use the ```decodeCall()``` function to decode it.&lt;br /&gt;&lt;br /&gt;Example of a complete implementation:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;var ws = null &lt;br /&gt;var arrLog = []&lt;br /&gt;&lt;br /&gt;const ABI_Route = &amp;#39;[{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;_factoryV2&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;factoryV3&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;_positionManager&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;_WETH9&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;constructor&amp;quot;},{&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;WETH9&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;approveMax&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;approveMaxMinusOne&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;approveZeroThenMax&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;approveZeroThenMaxMinusOne&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;callPositionManager&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;result&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;paths&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint128[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amounts&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint128[]&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;maximumTickDivergence&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;secondsAgo&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;checkOracleSlippage&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;maximumTickDivergence&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;secondsAgo&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;checkOracleSlippage&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;components&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOutMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct IV3SwapRouter.ExactInputParams&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;params&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tuple&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;exactInput&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;components&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tokenIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tokenOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;fee&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOutMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint160&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;sqrtPriceLimitX96&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint160&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct IV3SwapRouter.ExactInputSingleParams&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;params&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tuple&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;exactInputSingle&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;components&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountInMaximum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct IV3SwapRouter.ExactOutputParams&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;params&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tuple&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;exactOutput&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;components&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tokenIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tokenOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;fee&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountInMaximum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint160&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;sqrtPriceLimitX96&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint160&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct IV3SwapRouter.ExactOutputSingleParams&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;params&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tuple&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;exactOutputSingle&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;factory&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;factoryV2&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;getApprovalType&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;enum IApproveAndCall.ApprovalType&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint8&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;components&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token1&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tokenId&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount0Min&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount1Min&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct IApproveAndCall.IncreaseLiquidityParams&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;params&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tuple&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;increaseLiquidity&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;result&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;components&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token1&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;fee&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;int24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tickLower&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;int24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;int24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tickUpper&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;int24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount0Min&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount1Min&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct IApproveAndCall.MintParams&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;params&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tuple&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;mint&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;result&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;previousBlockhash&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;multicall&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;deadline&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;multicall&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;multicall&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;results&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;positionManager&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;value&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;pull&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;refundETH&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;value&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;deadline&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint8&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;v&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint8&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;r&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;selfPermit&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;nonce&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;expiry&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint8&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;v&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint8&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;r&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;selfPermitAllowed&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;nonce&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;expiry&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint8&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;v&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint8&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;r&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;selfPermitAllowedIfNecessary&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;value&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;deadline&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint8&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;v&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint8&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;r&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;selfPermitIfNecessary&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOutMin&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address[]&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;to&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;swapExactTokensForTokens&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountInMax&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address[]&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;to&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;swapTokensForExactTokens&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;sweepToken&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;sweepToken&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeBips&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeRecipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;sweepTokenWithFee&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeBips&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeRecipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;sweepTokenWithFee&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;int256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount0Delta&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;int256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;int256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount1Delta&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;int256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;_data&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;uniswapV3SwapCallback&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;unwrapWETH9&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;unwrapWETH9&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeBips&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeRecipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;unwrapWETH9WithFee&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeBips&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeRecipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;unwrapWETH9WithFee&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;value&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;wrapETH&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;receive&amp;quot;}]&amp;#39;&lt;br /&gt;&lt;br /&gt;function calcAllFuncSigHash(jsonABI) {&lt;br /&gt;    var mapSigHash = {}&lt;br /&gt;    for (var i in jsonABI) {&lt;br /&gt;        var ele = jsonABI[i]&lt;br /&gt;        if (typeof(ele[&amp;quot;name&amp;quot;]) != &amp;quot;undefined&amp;quot;) {&lt;br /&gt;            if (ele[&amp;quot;inputs&amp;quot;]) {&lt;br /&gt;                var funcName = ele[&amp;quot;name&amp;quot;]&lt;br /&gt;                if (ele[&amp;quot;inputs&amp;quot;].length == 0) {&lt;br /&gt;                    var methodId = &amp;quot;0x&amp;quot; + Encode(&amp;quot;keccak256&amp;quot;, &amp;quot;string&amp;quot;, &amp;quot;hex&amp;quot;, funcName + &amp;quot;()&amp;quot;).slice(0, 8)&lt;br /&gt;                    mapSigHash[methodId] = {&amp;quot;argsTypeList&amp;quot;: [], &amp;quot;argsNameList&amp;quot;: [], &amp;quot;funcName&amp;quot;: funcName}&lt;br /&gt;                } else {&lt;br /&gt;                    var arr = []&lt;br /&gt;                    var arrName = []&lt;br /&gt;                    var argPrototype = []&lt;br /&gt;                    for (var j in ele[&amp;quot;inputs&amp;quot;]) {&lt;br /&gt;                        var inputType = ele[&amp;quot;inputs&amp;quot;][j][&amp;quot;type&amp;quot;]&lt;br /&gt;                        if (inputType == &amp;quot;tuple&amp;quot;) {                            &lt;br /&gt;                            var components = ele[&amp;quot;inputs&amp;quot;][j][&amp;quot;components&amp;quot;]&lt;br /&gt;                            var tupleType = []&lt;br /&gt;                            var protoType = []&lt;br /&gt;                            for (var componentsIdx = 0; componentsIdx &amp;lt; components.length; componentsIdx++) {&lt;br /&gt;                                tupleType.push(components[componentsIdx][&amp;quot;type&amp;quot;])&lt;br /&gt;                                protoType.push(components[componentsIdx][&amp;quot;name&amp;quot;] + &amp;quot; &amp;quot; + components[componentsIdx][&amp;quot;type&amp;quot;])&lt;br /&gt;                            }&lt;br /&gt;                            arr.push(&amp;quot;(&amp;quot; + tupleType.join() + &amp;quot;)&amp;quot;)&lt;br /&gt;                            arrName.push(ele[&amp;quot;inputs&amp;quot;][j][&amp;quot;name&amp;quot;])&lt;br /&gt;                            // Prototype&lt;br /&gt;                            argPrototype.push(&amp;quot;tuple&amp;quot; + &amp;quot;(&amp;quot; + protoType.join() + &amp;quot;)&amp;quot;)&lt;br /&gt;                        } else {&lt;br /&gt;                            arr.push(inputType)&lt;br /&gt;                            arrName.push(ele[&amp;quot;inputs&amp;quot;][j][&amp;quot;name&amp;quot;])&lt;br /&gt;                            // Prototype&lt;br /&gt;                            argPrototype.push(inputType)&lt;br /&gt;                        }                        &lt;br /&gt;                    }&lt;br /&gt;                    var functionSignature = funcName + &amp;quot;(&amp;quot; + arr.join() + &amp;quot;)&amp;quot;&lt;br /&gt;                    var methodId = &amp;quot;0x&amp;quot; + Encode(&amp;quot;keccak256&amp;quot;, &amp;quot;string&amp;quot;, &amp;quot;hex&amp;quot;, functionSignature).slice(0, 8)&lt;br /&gt;                    mapSigHash[methodId] = {&amp;quot;argsTypeList&amp;quot;: arr, &amp;quot;argsNameList&amp;quot;: arrName, &amp;quot;funcName&amp;quot;: funcName, &amp;quot;argPrototype&amp;quot;: argPrototype}&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return mapSigHash&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function decodeCall(input, abi) {&lt;br /&gt;    var mapSigHash = calcAllFuncSigHash(JSON.parse(abi))&lt;br /&gt;    var methodId = input.slice(0, 10)&lt;br /&gt;    var data = input.slice(10)&lt;br /&gt;    &lt;br /&gt;    var decodedArgs = {}&lt;br /&gt;    var infoMethod = mapSigHash[methodId]&lt;br /&gt;    if (typeof(infoMethod) == &amp;quot;undefined&amp;quot;) {&lt;br /&gt;        return [methodId, mapSigHash]&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    var arr = []&lt;br /&gt;    for (var i = 0; i &amp;lt; infoMethod[&amp;quot;argsTypeList&amp;quot;].length; i++) {&lt;br /&gt;        if (infoMethod[&amp;quot;argsTypeList&amp;quot;][i].startsWith(&amp;quot;(&amp;quot;)) {&lt;br /&gt;            arr.push(infoMethod[&amp;quot;argPrototype&amp;quot;][i])&lt;br /&gt;        } else {&lt;br /&gt;            arr.push(infoMethod[&amp;quot;argsTypeList&amp;quot;][i])&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    if (arr.length == 0) {&lt;br /&gt;        return {&amp;quot;funcName&amp;quot;: infoMethod[&amp;quot;funcName&amp;quot;], &amp;quot;args&amp;quot;: decodedArgs}&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    var args = exchange.IO(&amp;quot;decode&amp;quot;, arr.join(), data)&lt;br /&gt;&lt;br /&gt;    if (!Array.isArray(args)) {&lt;br /&gt;        args = [args]&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (args.length != infoMethod[&amp;quot;argsNameList&amp;quot;].length) {&lt;br /&gt;        Log(&amp;quot;args:&amp;quot;, args)&lt;br /&gt;        Log(&amp;quot;infoMethod:&amp;quot;, infoMethod)&lt;br /&gt;        throw &amp;quot;The decoded args are not equal to the argsNameList&amp;quot;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    for (var i = 0; i &amp;lt; infoMethod[&amp;quot;argsNameList&amp;quot;].length; i++) {&lt;br /&gt;        var key = infoMethod[&amp;quot;argsNameList&amp;quot;][i]&lt;br /&gt;        var value = args[i]&lt;br /&gt;        decodedArgs[key] = value&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return {&amp;quot;funcName&amp;quot;: infoMethod[&amp;quot;funcName&amp;quot;], &amp;quot;args&amp;quot;: decodedArgs}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function main () {&lt;br /&gt;    // {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;id&amp;quot;: 1, &amp;quot;method&amp;quot;: &amp;quot;eth_subscribe&amp;quot;, &amp;quot;params&amp;quot;: [&amp;quot;xxxxx&amp;quot;]}  , &amp;quot;xxxxx&amp;quot; is the specific message of the subscription&lt;br /&gt;    var payload = {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;id&amp;quot;: 1, &amp;quot;method&amp;quot;: &amp;quot;eth_subscribe&amp;quot;, &amp;quot;params&amp;quot;: [&amp;quot;newPendingTransactions&amp;quot;]}&lt;br /&gt;    &lt;br /&gt;    // Use the alchemy service&lt;br /&gt;    ws = Dial(&amp;quot;wss://eth-mainnet.g.alchemy.com/v2/oKmOQKbneVkxgHZfibs-iFhIlIAl6HDN&amp;quot; + &amp;quot;|reconnect=true&amp;amp;payload=&amp;quot; + JSON.stringify(payload))&lt;br /&gt;    if (!ws) {&lt;br /&gt;        throw &amp;quot;websocket link to alchemy failed!&amp;quot;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    // eth_getTransactionByHash call count&lt;br /&gt;    var getTransactionCounter = 0&lt;br /&gt;    &lt;br /&gt;    // Start Timestamp&lt;br /&gt;    var beginTS = new Date().getTime()&lt;br /&gt;    &lt;br /&gt;    // Calculate function signature hash&lt;br /&gt;    var sigHash = &amp;quot;0x&amp;quot; + Encode(&amp;quot;keccak256&amp;quot;, &amp;quot;string&amp;quot;, &amp;quot;hex&amp;quot;, &amp;quot;multicall(uint256,bytes[])&amp;quot;).slice(0, 8)&lt;br /&gt;    Log(&amp;quot;sigHash:&amp;quot;, sigHash)&lt;br /&gt;&lt;br /&gt;    // Loop for messages&lt;br /&gt;    while (true) {&lt;br /&gt;        var msg = &amp;quot;&amp;quot;&lt;br /&gt;        var recv = null&lt;br /&gt;        // Receive pushed messages, use the read parameter -2, and return the latest data immediately&lt;br /&gt;        var data = ws.read(-2)&lt;br /&gt;        if (data &amp;amp;&amp;amp; data != &amp;quot;&amp;quot;) {&lt;br /&gt;            var ts = new Date().getTime()&lt;br /&gt;&lt;br /&gt;            if (ts - beginTS &amp;gt;= 1000) {&lt;br /&gt;                getTransactionCounter = 0&lt;br /&gt;                beginTS = ts &lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            // Check transaction details based on txHash&lt;br /&gt;            if (ts - beginTS &amp;lt; 1000 &amp;amp;&amp;amp; getTransactionCounter &amp;gt;= 100) {&lt;br /&gt;                Sleep(1000)&lt;br /&gt;                getTransactionCounter = 0&lt;br /&gt;                beginTS = ts &lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            var obj = JSON.parse(data)&lt;br /&gt;            if (obj[&amp;quot;params&amp;quot;] &amp;amp;&amp;amp; obj[&amp;quot;params&amp;quot;][&amp;quot;result&amp;quot;]) {&lt;br /&gt;                var txHash = obj[&amp;quot;params&amp;quot;][&amp;quot;result&amp;quot;]&lt;br /&gt;                var tx = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getTransactionByHash&amp;quot;, txHash)&lt;br /&gt;                &lt;br /&gt;                if (tx &amp;amp;&amp;amp; tx.input.indexOf(sigHash) !== -1) {&lt;br /&gt;                    // Decode transaction details&lt;br /&gt;                    arrLog = []&lt;br /&gt;                    var decodedInput = decodeCall(tx.input, ABI_Route)&lt;br /&gt;&lt;br /&gt;                    // Log(&amp;quot;----------------&amp;quot;, txHash, &amp;quot;/&amp;quot;, decodedInput[&amp;quot;funcName&amp;quot;], &amp;quot;----------------&amp;quot;, &amp;quot;#FF0000&amp;quot;)&lt;br /&gt;                    arrLog.push(&amp;quot;----------------&amp;quot; + txHash + &amp;quot;/&amp;quot; + decodedInput[&amp;quot;funcName&amp;quot;] + &amp;quot;----------------&amp;quot; + &amp;quot;#FF0000&amp;quot;)&lt;br /&gt;                    arrLog.push(tx.from + &amp;quot; -&amp;gt; &amp;quot; + tx.to)&lt;br /&gt;&lt;br /&gt;                    for (var i = 0; i &amp;lt; decodedInput[&amp;quot;args&amp;quot;][&amp;quot;data&amp;quot;].length; i++) {&lt;br /&gt;                        var calldata = &amp;quot;0x&amp;quot; + decodedInput[&amp;quot;args&amp;quot;][&amp;quot;data&amp;quot;][i]&lt;br /&gt;                        var decodedCalldata = decodeCall(calldata, ABI_Route)&lt;br /&gt;&lt;br /&gt;                        // Log(&amp;quot;----------------&amp;quot;, decodedCalldata[&amp;quot;funcName&amp;quot;], &amp;quot;----------------&amp;quot;, &amp;quot;#FF0000&amp;quot;)&lt;br /&gt;                        arrLog.push(&amp;quot;----------------&amp;quot; + decodedCalldata[&amp;quot;funcName&amp;quot;] + &amp;quot;----------------&amp;quot; + &amp;quot;#FF0000&amp;quot;)&lt;br /&gt;&lt;br /&gt;                        for (var key in decodedCalldata[&amp;quot;args&amp;quot;]) {&lt;br /&gt;                            // Log(key, decodedCalldata[&amp;quot;args&amp;quot;][key])&lt;br /&gt;                            arrLog.push(key + &amp;quot;: &amp;quot; + JSON.stringify(decodedCalldata[&amp;quot;args&amp;quot;][key]))&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    // Output logs&lt;br /&gt;                    for (var logIdx = arrLog.length - 1; logIdx &amp;gt;= 0; logIdx--) {&lt;br /&gt;                        Log(arrLog[logIdx])&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                &lt;br /&gt;                getTransactionCounter++&lt;br /&gt;            }&lt;br /&gt;            recv = obj&lt;br /&gt;        } else if (data == null) {&lt;br /&gt;            msg = &amp;quot;The buffer queue is empty, time:&amp;quot; + _D()&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        LogStatus(_D(), &amp;quot;, msg:&amp;quot;, msg, &amp;quot;, recv:&amp;quot;, recv)&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function onexit() {&lt;br /&gt;    Log(&amp;quot;Disconnect WS connection&amp;quot;)&lt;br /&gt;    ws.close()&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function onerror() {&lt;br /&gt;    Log(&amp;quot;Disconnect WS connection&amp;quot;)&lt;br /&gt;    ws.close()&lt;br /&gt;&lt;br /&gt;    for (var logIdx = arrLog.length - 1; logIdx &amp;gt;= 0; logIdx--) {        &lt;br /&gt;        Log(arrLog[logIdx])&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Create a live trading to test:&lt;br /&gt;&lt;br /&gt;```run&lt;br /&gt;2023-06-20 17:01:00		Info	----------------0x5288a7bd6e0f57162ca763df722de73793e542734d7d2b7af5755664e2e67910/multicall----------------&lt;br /&gt;2023-06-20 17:01:00		Info	0x851b594033d57c98af753bcb3a7d0237a615de32 -&amp;gt; 0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45&lt;br /&gt;2023-06-20 17:01:00		Info	----------------exactInputSingle----------------&lt;br /&gt;2023-06-20 17:01:00		Info	params: {&amp;quot;tokenOut&amp;quot;:&amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;,&amp;quot;fee&amp;quot;:&amp;quot;10000&amp;quot;,&amp;quot;recipient&amp;quot;:&amp;quot;0x0000000000000000000000000000000000000002&amp;quot;,&amp;quot;amountIn&amp;quot;:&amp;quot;8952087000296027130940868&amp;quot;,&amp;quot;amountOutMinimum&amp;quot;:&amp;quot;41638694112306829&amp;quot;,&amp;quot;sqrtPriceLimitX96&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;tokenIn&amp;quot;:&amp;quot;0xe1283567345349942acdfad3692924a1b16cf3cc&amp;quot;}&lt;br /&gt;2023-06-20 17:01:00		Info	----------------unwrapWETH9----------------&lt;br /&gt;2023-06-20 17:01:00		Info	amountMinimum: &amp;quot;41638694112306829&amp;quot;&lt;br /&gt;2023-06-20 17:01:00		Info	recipient: &amp;quot;0x851b594033d57c98af753bcb3a7d0237a615de32&amp;quot;&lt;br /&gt;2023-06-20 16:59:03		Info	----------------0x55e0c4a38a17d3aa6e8f558a66c77e9defa9f8f6e347536363ac1b921de9aaf3/multicall----------------&lt;br /&gt;2023-06-20 16:59:03		Info	0x27457ada2dd725c7d0f28e1737bdd0bf583c0f0b -&amp;gt; 0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45&lt;br /&gt;2023-06-20 16:59:03		Info	----------------swapExactTokensForTokens----------------&lt;br /&gt;2023-06-20 16:59:03		Info	amountIn: &amp;quot;816769666850161&amp;quot;&lt;br /&gt;2023-06-20 16:59:03		Info	amountOutMin: &amp;quot;40404501509302321&amp;quot;&lt;br /&gt;2023-06-20 16:59:03		Info	path: [&amp;quot;0x7863e06bca47ded821fcb53ab788eeb371243eda&amp;quot;,&amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;]&lt;br /&gt;2023-06-20 16:59:03		Info	to: &amp;quot;0x27457ada2dd725c7d0f28e1737bdd0bf583c0f0b&amp;quot;&lt;br /&gt;2023-06-20 16:58:25		Info	sigHash: 0x5ae401dc&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Screenshot:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150279
" title="https://stocksharp.com/file/150279
"&gt;https://stocksharp.com/file/150279
&lt;/a&gt;&lt;br /&gt;You can see that the Transaction Hash is ```0x5288a7bd6e0f57162ca763df722de73793e542734d7d2b7af5755664e2e67910``` for this transaction, and the input data data contains the call to a ```multicall``` method call. This transaction is sent in the direction: 0x851b594033d57c98af753bcb3a7d0237a615de32 -&amp;gt; 0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45. ```0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45 ``` is Uniswap&amp;#39;s router contract address.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150280
" title="https://stocksharp.com/file/150280
"&gt;https://stocksharp.com/file/150280
&lt;/a&gt;&lt;br /&gt;The ```multicall``` package is parsed to call the contract&amp;#39;s ```exactInputSingle``` and ```unwrapWETH9``` methods and the specific parameters of these methods.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;----------------exactInputSingle----------------&lt;br /&gt;params: {&lt;br /&gt;    &amp;quot;tokenOut&amp;quot;:&amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;,&lt;br /&gt;    &amp;quot;fee&amp;quot;:&amp;quot;10000&amp;quot;,&lt;br /&gt;    &amp;quot;recipient&amp;quot;:&amp;quot;0x0000000000000000000000000000000000000002&amp;quot;,&lt;br /&gt;    &amp;quot;amountIn&amp;quot;:&amp;quot;8952087000296027130940868&amp;quot;,&lt;br /&gt;    &amp;quot;amountOutMinimum&amp;quot;:&amp;quot;41638694112306829&amp;quot;,&lt;br /&gt;    &amp;quot;sqrtPriceLimitX96&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;    &amp;quot;tokenIn&amp;quot;:&amp;quot;0xe1283567345349942acdfad3692924a1b16cf3cc&amp;quot;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;----------------unwrapWETH9----------------&lt;br /&gt;amountMinimum: &amp;quot;41638694112306829&amp;quot;&lt;br /&gt;recipient: &amp;quot;0x851b594033d57c98af753bcb3a7d0237a615de32&amp;quot;&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;If you are interested, you can modify and extend the example based on it to monitor more transactions and parse these on-chain operations.&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y6ymnjI3ih-EYivoXMTwdB_xImkZVym3MGRgo05CPqrdGrc6JyRY60RJjFc3C_175fTPmWugUrzwB2XAHchNYfKaLj0DETRnzx1bxmPI86Fjo" title="https://blog.mathquant.com/2023/06/30/get-started-with-web3-development-easily-based-on-ethereum-using-fmz.html"&gt;https://blog.mathquant.c...-ethereum-using-fmz.html&lt;/a&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>