﻿<?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">Forum. StockSharp</title>
  <id>https://stocksharp.com/handlers/atom.ashx?category=forum&amp;page=2</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-05-21T09:11:07Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=forum&amp;page=2" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/topic/25690/</id>
    <title type="text">Get Started with web3 Development Easily Based on Ethereum Using FMZ (5)</title>
    <published>2024-04-16T02:27:03Z</published>
    <updated>2024-04-16T02:27:03Z</updated>
    <author>
      <name>FMZ</name>
      <uri>https://stocksharp.com/users/186354/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#cryptocurrency" />
    <category term="#code" />
    <category term="#data" />
    <category term="#exchange" />
    <category term="#Ethereum" />
    <category term="#FMZQuant" />
    <category term="#web3" />
    <category term="#USDT" />
    <category term="#debug" />
    <content type="html">## Retrieving Events&lt;br /&gt;&lt;br /&gt;In this section, we will learn to read events released by smart contracts using the FMZ Quant Trading Platform. The events released by smart contracts are stored in the logs of the Ethereum virtual machine.&lt;br /&gt;&lt;br /&gt;### eth_getLogs&lt;br /&gt;&lt;br /&gt;To query the event of smart contract release, you need to use Ethereum&amp;#39;s RPC method ```eth_getLogs``` to get the on-chain log data, for how to call Ethereum RPC nodes, we have explained in our previous course.&lt;br /&gt;For example, we get the event of ```WETH``` contract can write code and test it using FMZ&amp;#39;s **debugging tool**, the RPC node configured by the exchange object is an Ethereum mainnet node, and in calling the ```eth_getLogs``` method, we specify three parameters ```fromBlock```, ```toBlock```, ```address```, and we use the fromBlock and toBlock parameters to limit the query to data within a block:&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(n, decimals) {&lt;br /&gt;    return (BigDecimal(n) * BigDecimal(Math.pow(10, decimals))).toFixed(0)&lt;br /&gt;}&lt;br /&gt;function main() {&lt;br /&gt;    // getBlockNumber&lt;br /&gt;    var blockNumber = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_blockNumber&amp;quot;)&lt;br /&gt;    Log(&amp;quot;blockNumber:&amp;quot;, blockNumber)&lt;br /&gt;&lt;br /&gt;    // get logs&lt;br /&gt;    var fromBlock = &amp;quot;0x&amp;quot; + (toAmount(blockNumber, 0) - 1).toString(16)&lt;br /&gt;    var toBlock = &amp;quot;0x&amp;quot; + toAmount(blockNumber, 0).toString(16)&lt;br /&gt;    var params = {&lt;br /&gt;        &amp;quot;fromBlock&amp;quot; : fromBlock,&lt;br /&gt;        &amp;quot;toBlock&amp;quot; : toBlock,&lt;br /&gt;        &amp;quot;address&amp;quot; : &amp;quot;0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2&amp;quot;   // Address of WETH contract&lt;br /&gt;    }&lt;br /&gt;    var logs = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getLogs&amp;quot;, params)&lt;br /&gt;&lt;br /&gt;    // Due to the large amount of data, if you use the Log function to print, the data will be truncated. Use return to return the complete data in the &amp;quot;Function Result&amp;quot; edit box on the page&lt;br /&gt;    return logs   &lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;The logs data were obtained, and we omitted some of them due to their large content:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;[{&lt;br /&gt;	&amp;quot;data&amp;quot;: &amp;quot;0x00000000000000000000000000000000000000000000000001c1a55000000000&amp;quot;,&lt;br /&gt;	&amp;quot;topics&amp;quot;: [&amp;quot;0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef&amp;quot;, &amp;quot;0x0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80&amp;quot;, &amp;quot;0x000000000000000000000000bcb095c1f9c3dc02e834976706c87dee5d0f1fb6&amp;quot;],&lt;br /&gt;	&amp;quot;transactionHash&amp;quot;: &amp;quot;0x27f9bf5abe3148169b4b85a83e1de32bd50eb81ecc52e5af006157d93353e4c4&amp;quot;,&lt;br /&gt;	&amp;quot;transactionIndex&amp;quot;: &amp;quot;0x0&amp;quot;,&lt;br /&gt;	&amp;quot;removed&amp;quot;: false,&lt;br /&gt;	&amp;quot;address&amp;quot;: &amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;,&lt;br /&gt;	&amp;quot;blockHash&amp;quot;: &amp;quot;0x847be24a7b159c292bda030a011dfec89487b70e71eed486969b032d6ef04bad&amp;quot;,&lt;br /&gt;	&amp;quot;blockNumber&amp;quot;: &amp;quot;0x109b1cc&amp;quot;,&lt;br /&gt;	&amp;quot;logIndex&amp;quot;: &amp;quot;0x0&amp;quot;&lt;br /&gt;}, {&lt;br /&gt;	&amp;quot;data&amp;quot;: &amp;quot;0x00000000000000000000000000000000000000000000000008ea20cdea027c00&amp;quot;,&lt;br /&gt;	&amp;quot;logIndex&amp;quot;: &amp;quot;0x5&amp;quot;,&lt;br /&gt;	&amp;quot;topics&amp;quot;: [&amp;quot;0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c&amp;quot;, &amp;quot;0x0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d&amp;quot;],&lt;br /&gt;	&amp;quot;address&amp;quot;: &amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;,&lt;br /&gt;	&amp;quot;blockHash&amp;quot;: &amp;quot;0x847be24a7b159c292bda030a011dfec89487b70e71eed486969b032d6ef04bad&amp;quot;,&lt;br /&gt;	&amp;quot;blockNumber&amp;quot;: &amp;quot;0x109b1cc&amp;quot;,&lt;br /&gt;	&amp;quot;removed&amp;quot;: false,&lt;br /&gt;	&amp;quot;transactionHash&amp;quot;: &amp;quot;0xace3afa02e8af5d1ef6fc1635fbdf7bee37624547937ea5272c23968dd034c09&amp;quot;,&lt;br /&gt;	&amp;quot;transactionIndex&amp;quot;: &amp;quot;0x1&amp;quot;&lt;br /&gt;},&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;	&amp;quot;blockNumber&amp;quot;: &amp;quot;0x109b1cd&amp;quot;,&lt;br /&gt;	&amp;quot;address&amp;quot;: &amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;,&lt;br /&gt;	&amp;quot;data&amp;quot;: &amp;quot;0x00000000000000000000000000000000000000000000000002c053531ab8a000&amp;quot;,&lt;br /&gt;	&amp;quot;logIndex&amp;quot;: &amp;quot;0xd3&amp;quot;,&lt;br /&gt;	&amp;quot;removed&amp;quot;: false,&lt;br /&gt;	&amp;quot;topics&amp;quot;: [&amp;quot;0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef&amp;quot;, &amp;quot;0x0000000000000000000000001111111254eeb25477b68fb85ed929f73a960582&amp;quot;, &amp;quot;0x000000000000000000000000252ba9b5916171dbdadd2cec7f91875a006955d0&amp;quot;],&lt;br /&gt;	&amp;quot;transactionHash&amp;quot;: &amp;quot;0x3012b82891f85b077cfe1c12cb9722b93c696ef2c37d67981ccddcc9c3396aca&amp;quot;,&lt;br /&gt;	&amp;quot;transactionIndex&amp;quot;: &amp;quot;0x8d&amp;quot;,&lt;br /&gt;	&amp;quot;blockHash&amp;quot;: &amp;quot;0xcd3d567c9bd02a4549b1de0dc638ab5523e847c3c156b096424f56c633000fd9&amp;quot;&lt;br /&gt;}, {&lt;br /&gt;	&amp;quot;topics&amp;quot;: [&amp;quot;0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef&amp;quot;, &amp;quot;0x00000000000000000000000012b791bb27b3a4ee958b5a435fea7d49ec076e9c&amp;quot;, &amp;quot;0x000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b&amp;quot;],&lt;br /&gt;	&amp;quot;transactionIndex&amp;quot;: &amp;quot;0x91&amp;quot;,&lt;br /&gt;	&amp;quot;logIndex&amp;quot;: &amp;quot;0xdb&amp;quot;,&lt;br /&gt;	&amp;quot;removed&amp;quot;: false,&lt;br /&gt;	&amp;quot;blockNumber&amp;quot;: &amp;quot;0x109b1cd&amp;quot;,&lt;br /&gt;	&amp;quot;data&amp;quot;: &amp;quot;0x0000000000000000000000000000000000000000000000000164f2434262e1cc&amp;quot;,&lt;br /&gt;	&amp;quot;transactionHash&amp;quot;: &amp;quot;0x6aa8d80daf42f442591e7530e31323d05e1d6dd9f9f9b9c102e157d89810c048&amp;quot;,&lt;br /&gt;	&amp;quot;address&amp;quot;: &amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;,&lt;br /&gt;	&amp;quot;blockHash&amp;quot;: &amp;quot;0xcd3d567c9bd02a4549b1de0dc638ab5523e847c3c156b096424f56c633000fd9&amp;quot;&lt;br /&gt;}, {&lt;br /&gt;	&amp;quot;address&amp;quot;: &amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;,&lt;br /&gt;	&amp;quot;blockHash&amp;quot;: &amp;quot;0xcd3d567c9bd02a4549b1de0dc638ab5523e847c3c156b096424f56c633000fd9&amp;quot;,&lt;br /&gt;	&amp;quot;blockNumber&amp;quot;: &amp;quot;0x109b1cd&amp;quot;,&lt;br /&gt;	&amp;quot;logIndex&amp;quot;: &amp;quot;0xde&amp;quot;,&lt;br /&gt;	&amp;quot;removed&amp;quot;: false,&lt;br /&gt;	&amp;quot;topics&amp;quot;: [&amp;quot;0x7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65&amp;quot;, &amp;quot;0x000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b&amp;quot;],&lt;br /&gt;	&amp;quot;data&amp;quot;: &amp;quot;0x0000000000000000000000000000000000000000000000000164f2434262e1cc&amp;quot;,&lt;br /&gt;	&amp;quot;transactionHash&amp;quot;: &amp;quot;0x6aa8d80daf42f442591e7530e31323d05e1d6dd9f9f9b9c102e157d89810c048&amp;quot;,&lt;br /&gt;	&amp;quot;transactionIndex&amp;quot;: &amp;quot;0x91&amp;quot;&lt;br /&gt;}]&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;We can see that there are various events in the logs data, if we only care about ```Transfer``` events, we need to filter out the ```Transfer``` events in these data.&lt;br /&gt;&lt;br /&gt;### Retrieving Logs&lt;br /&gt;&lt;br /&gt;The Ethereum log is divided into two parts: 1. ```topics```; 2. ```data```.&lt;br /&gt;&lt;br /&gt;- ```topics```&lt;br /&gt;  Taking the results of the code run for the ```eth_getLogs``` section test as an example, the data in the ```topics``` field is:&lt;br /&gt;&lt;br /&gt;  ```desc&lt;br /&gt;  &amp;quot;topics&amp;quot;: [&amp;quot;0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef&amp;quot;, &amp;quot;0x00000000000000000000000012b791bb27b3a4ee958b5a435fea7d49ec076e9c&amp;quot;, &amp;quot;0x000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b&amp;quot;],  &lt;br /&gt;  ```&lt;br /&gt;&lt;br /&gt;  The value of the ```topics``` field is an array structure used to describe the event. It is specified that its (array) length cannot exceed 4 and the first element is the signature hash of the event.&lt;br /&gt;  In the FMZ Quant Trading Platform, we can calculate this signature hash using the ```Encode``` function, using the following code:&lt;br /&gt;&lt;br /&gt;  ```javascript&lt;br /&gt;  function main() {&lt;br /&gt;      var eventFunction = &amp;quot;Transfer(address,address,uint256)&amp;quot;&lt;br /&gt;      var eventHash = Encode(&amp;quot;keccak256&amp;quot;, &amp;quot;string&amp;quot;, &amp;quot;hex&amp;quot;, eventFunction)&lt;br /&gt;      Log(&amp;quot;eventHash:&amp;quot;, &amp;quot;0x&amp;quot; + eventHash)&lt;br /&gt;      // eventHash: 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef&lt;br /&gt;  }&lt;br /&gt;  ```&lt;br /&gt;&lt;br /&gt;  Calculate the ```keccak256``` hash value (hex encoding) of ```Transfer(address,address,uint256)``` is ```0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef```.&lt;br /&gt;&lt;br /&gt;  The value of the ```topics``` field is an array structure, with the second element, and the third element, respectively:&lt;br /&gt;&lt;br /&gt;  - Sending address ```from```&lt;br /&gt;  - Receiving address ```to```&lt;br /&gt;&lt;br /&gt;- ```data```&lt;br /&gt;&lt;br /&gt;  The data in the ```data``` field are:&lt;br /&gt;&lt;br /&gt;  ```desc&lt;br /&gt;  &amp;quot;data&amp;quot;: &amp;quot;0x0000000000000000000000000000000000000000000000000164f2434262e1cc&amp;quot;,&lt;br /&gt;  ```&lt;br /&gt;&lt;br /&gt;  Certain parameters in the event (parameters without indexed declarations in the Solidity code of the smart contract) are stored in the ```data``` section.&lt;br /&gt;&lt;br /&gt;  Parse the data ```0x0000000000000000000000000000000000000000000000000164f2434262e1cc```&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;&lt;br /&gt;  function main() {&lt;br /&gt;      var value = &amp;quot;0x0000000000000000000000000000000000000000000000000164f2434262e1cc&amp;quot;&lt;br /&gt;      Log(toAmount(value, 0) / 1e18)  // 0.10047146239950075&lt;br /&gt;  }&lt;br /&gt;  ```&lt;br /&gt;&lt;br /&gt;  This data is obtained as 0.10047146239950075 and the ```data``` is the corresponding transfer amount.&lt;br /&gt;&lt;br /&gt;--------------------------------------------------&lt;br /&gt;&lt;br /&gt;The above was explained, practiced and ready to go. We can start retrieving the logs 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(n, decimals) {&lt;br /&gt;    return (BigDecimal(n) * BigDecimal(Math.pow(10, decimals))).toFixed(0)&lt;br /&gt;}&lt;br /&gt;function main() {&lt;br /&gt;    // getBlockNumber&lt;br /&gt;    var blockNumber = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_blockNumber&amp;quot;)&lt;br /&gt;    Log(&amp;quot;blockNumber:&amp;quot;, blockNumber)&lt;br /&gt;&lt;br /&gt;    // get logs&lt;br /&gt;    var fromBlock = &amp;quot;0x&amp;quot; + (toAmount(blockNumber, 0) - 1).toString(16)&lt;br /&gt;    var toBlock = &amp;quot;0x&amp;quot; + toAmount(blockNumber, 0).toString(16)&lt;br /&gt;    var params = {&lt;br /&gt;        &amp;quot;fromBlock&amp;quot; : fromBlock,&lt;br /&gt;        &amp;quot;toBlock&amp;quot; : toBlock,&lt;br /&gt;        &amp;quot;address&amp;quot; : &amp;quot;0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2&amp;quot;&lt;br /&gt;    }&lt;br /&gt;    var logs = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getLogs&amp;quot;, params)&lt;br /&gt;&lt;br /&gt;    // Traverse logs&lt;br /&gt;    var eventFunction = &amp;quot;Transfer(address,address,uint256)&amp;quot;&lt;br /&gt;    var eventHash = &amp;quot;0x&amp;quot; + Encode(&amp;quot;keccak256&amp;quot;, &amp;quot;string&amp;quot;, &amp;quot;hex&amp;quot;, eventFunction)&lt;br /&gt;    Log(&amp;quot;eventHash:&amp;quot;, eventHash)&lt;br /&gt;&lt;br /&gt;    var counter = 0&lt;br /&gt;    for (var i = logs.length - 1; i &amp;gt;= 0 &amp;amp;&amp;amp; counter &amp;lt; 10; i--) {&lt;br /&gt;        if (logs[i].topics[0] == eventHash) {&lt;br /&gt;            Log(&amp;quot;Event Transfer, data:&amp;quot;, toAmount(logs[i].data, 0) / 1e18, &amp;quot;, blockNumber:&amp;quot;, toAmount(logs[i].blockNumber, 0), &amp;quot;, transactionHash:&amp;quot;, logs[i].transactionHash,&lt;br /&gt;              &amp;quot;, log:&amp;quot;, logs[i])&lt;br /&gt;            counter++&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Check on ```https://etherscan.io/```:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150274
" title="https://stocksharp.com/file/150274
"&gt;https://stocksharp.com/file/150274
&lt;/a&gt;&lt;br /&gt;Results of the test code run in FMZ debugging tool:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150275
" title="https://stocksharp.com/file/150275
"&gt;https://stocksharp.com/file/150275
&lt;/a&gt;&lt;br /&gt;Data in the ```from```, ```to``` fields can also be parsed depending on the needs at the time of retrieving, e.g:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function main() {&lt;br /&gt;    var from = &amp;quot;0x00000000000000000000000012b791bb27b3a4ee958b5a435fea7d49ec076e9c&amp;quot;&lt;br /&gt;    var address = &amp;quot;0x&amp;quot; + exchange.IO(&amp;quot;encodePacked&amp;quot;, &amp;quot;address&amp;quot;, from)&lt;br /&gt;    Log(&amp;quot;address:&amp;quot;, address)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Running results:&lt;br /&gt;&lt;br /&gt;&amp;gt; address: 0x12b791bb27b3a4ee958b5a435fea7d49ec076e9c&lt;br /&gt;&lt;br /&gt;### Listening to Contract Events&lt;br /&gt;&lt;br /&gt;Since the **debugging tool** can only test the code for a short time and output the content only after the code execution is completed, it cannot display and output the log in real time. In this section, we use the FMZ Quant Trading Platform to create live trading to test.&lt;br /&gt;&lt;br /&gt;Here we use the Ethereum mainnet, and we listen to the ```Transfer(address,address,uint256)``` event of the ```USDT``` cryptocurrency contract. Based on what we learned in the last lesson, we designed and wrote an example of continuously listening to the events of a certain smart contract:&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;&lt;br /&gt;function toInnerAmount(n, decimals) {&lt;br /&gt;    return (BigDecimal(n) * BigDecimal(Math.pow(10, decimals))).toFixed(0)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function addEventListener(contractAddress, event, callBack) {&lt;br /&gt;    var self = {}&lt;br /&gt;    self.eventHash = &amp;quot;0x&amp;quot; + Encode(&amp;quot;keccak256&amp;quot;, &amp;quot;string&amp;quot;, &amp;quot;hex&amp;quot;, event)&lt;br /&gt;    self.contractAddress = contractAddress&lt;br /&gt;    self.latestBlockNumber = 0&lt;br /&gt;    self.fromBlockNumber = 0&lt;br /&gt;    self.firstBlockNumber = 0&lt;br /&gt;    /* TODO: test&lt;br /&gt;    self.isFirst = true &lt;br /&gt;    */ &lt;br /&gt;&lt;br /&gt;    self.getBlockNumber = function() {&lt;br /&gt;        var maxTry = 10&lt;br /&gt;        for (var i = 0; i &amp;lt; maxTry; i++) {&lt;br /&gt;            var ret = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_blockNumber&amp;quot;)&lt;br /&gt;            if (ret) {&lt;br /&gt;                return toAmount(ret, 0)&lt;br /&gt;            }&lt;br /&gt;            Sleep(5000)&lt;br /&gt;        }&lt;br /&gt;        throw &amp;quot;getBlockNumber failed&amp;quot;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    self.run = function() {&lt;br /&gt;        var currBlockNumber = self.getBlockNumber()&lt;br /&gt;        var fromBlock = &amp;quot;0x&amp;quot; + self.fromBlockNumber.toString(16)&lt;br /&gt;        var toBlock = &amp;quot;0x&amp;quot; + currBlockNumber.toString(16)&lt;br /&gt;        var params = {&lt;br /&gt;            &amp;quot;fromBlock&amp;quot; : fromBlock, &lt;br /&gt;            &amp;quot;toBlock&amp;quot; : toBlock, &lt;br /&gt;            &amp;quot;address&amp;quot; : self.contractAddress, &lt;br /&gt;            &amp;quot;topics&amp;quot; : [self.eventHash]&lt;br /&gt;        }&lt;br /&gt;        // Log(&amp;quot;fromBlockNumber:&amp;quot;, self.fromBlockNumber, &amp;quot;, currBlockNumber:&amp;quot;, currBlockNumber, &amp;quot;#FF0000&amp;quot;)&lt;br /&gt;        &lt;br /&gt;        var logs = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getLogs&amp;quot;, params)&lt;br /&gt;        if (!logs) {&lt;br /&gt;            return &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        for (var i = 0; i &amp;lt; logs.length; i++) {&lt;br /&gt;            if (toAmount(logs[i].blockNumber, 0) &amp;gt; self.latestBlockNumber) {&lt;br /&gt;                /* TODO: test&lt;br /&gt;                if (self.isFirst) {&lt;br /&gt;                    self.firstBlockNumber = toAmount(logs[i].blockNumber, 0)&lt;br /&gt;                    Log(&amp;quot;firstBlockNumber:&amp;quot;, self.firstBlockNumber)&lt;br /&gt;                    self.isFirst = false &lt;br /&gt;                }&lt;br /&gt;                */&lt;br /&gt;&lt;br /&gt;                callBack(logs[i])&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        self.latestBlockNumber = currBlockNumber&lt;br /&gt;        self.fromBlockNumber = self.latestBlockNumber - 1&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    self.latestBlockNumber = self.getBlockNumber()&lt;br /&gt;    self.fromBlockNumber = self.latestBlockNumber - 1&lt;br /&gt;&lt;br /&gt;    return self&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var listener = null &lt;br /&gt;function main() {&lt;br /&gt;    var event = &amp;quot;Transfer(address,address,uint256)&amp;quot;&lt;br /&gt;    var contractAddress = &amp;quot;0xdac17f958d2ee523a2206206994597c13d831ec7&amp;quot;&lt;br /&gt;    var decimals = exchange.IO(&amp;quot;api&amp;quot;, contractAddress, &amp;quot;decimals&amp;quot;)&lt;br /&gt;    Log(exchange.IO(&amp;quot;api&amp;quot;, contractAddress, &amp;quot;name&amp;quot;), &amp;quot; decimals:&amp;quot;, decimals)&lt;br /&gt;&lt;br /&gt;    listener = addEventListener(contractAddress, event, function(log) {        &lt;br /&gt;        var fromAddress = &amp;quot;0x&amp;quot; + exchange.IO(&amp;quot;encodePacked&amp;quot;, &amp;quot;address&amp;quot;, log.topics[1])&lt;br /&gt;        var toAddress = &amp;quot;0x&amp;quot; + exchange.IO(&amp;quot;encodePacked&amp;quot;, &amp;quot;address&amp;quot;, log.topics[2])&lt;br /&gt;        Log(&amp;quot;Transfer:&amp;quot;, fromAddress, &amp;quot;-&amp;gt;&amp;quot;, toAddress, &amp;quot;, value:&amp;quot;, toAmount(log.data, decimals), &amp;quot;, blockNumber:&amp;quot;, toAmount(log.blockNumber, 0))&lt;br /&gt;        &lt;br /&gt;        /* TODO: test&lt;br /&gt;        arrLog.push(log)&lt;br /&gt;        */&lt;br /&gt;    })&lt;br /&gt;&lt;br /&gt;    while (true) {&lt;br /&gt;        listener.run()&lt;br /&gt;        Sleep(5000)&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* TODO: test&lt;br /&gt;var arrLog = []&lt;br /&gt;function onexit() {&lt;br /&gt;    Log(&amp;quot;End the run and verify the record&amp;quot;)&lt;br /&gt;    var firstBlockNumber = listener.firstBlockNumber&lt;br /&gt;    var endBlockNumber = listener.latestBlockNumber&lt;br /&gt;&lt;br /&gt;    Log(&amp;quot;getLogs, from:&amp;quot;, firstBlockNumber, &amp;quot; -&amp;gt; to:&amp;quot;, endBlockNumber)&lt;br /&gt;    var fromBlock = &amp;quot;0x&amp;quot; + (firstBlockNumber).toString(16)&lt;br /&gt;    var toBlock = &amp;quot;0x&amp;quot; + (endBlockNumber).toString(16)&lt;br /&gt;    var params = {&lt;br /&gt;        &amp;quot;fromBlock&amp;quot; : fromBlock,&lt;br /&gt;        &amp;quot;toBlock&amp;quot; : toBlock,&lt;br /&gt;        &amp;quot;topics&amp;quot; : [&amp;quot;0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef&amp;quot;],&lt;br /&gt;        &amp;quot;address&amp;quot; : &amp;quot;0xdac17f958d2ee523a2206206994597c13d831ec7&amp;quot;&lt;br /&gt;    }&lt;br /&gt;    var logs = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getLogs&amp;quot;, params)&lt;br /&gt;&lt;br /&gt;    Log(&amp;quot;arrLog:&amp;quot;, arrLog.length)&lt;br /&gt;    Log(&amp;quot;logs:&amp;quot;, logs.length)&lt;br /&gt;&lt;br /&gt;    if (arrLog.length != logs.length) {&lt;br /&gt;        Log(&amp;quot;Length varies!&amp;quot;)&lt;br /&gt;        return &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    for (var i = 0; i &amp;lt; arrLog.length; i++) {&lt;br /&gt;        Log(&amp;quot;Determine the blockNumber:&amp;quot;, logs[i].blockNumber == arrLog[i].blockNumber, &amp;quot;, Determine from:&amp;quot;, logs[i].topics[1] == arrLog[i].topics[1], &lt;br /&gt;            &amp;quot;Determine to:&amp;quot;, logs[i].topics[2] == arrLog[i].topics[2])&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;*/&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Running on live trading:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150276
" title="https://stocksharp.com/file/150276
"&gt;https://stocksharp.com/file/150276
&lt;/a&gt;&lt;br /&gt;For the execution results, a validation section (TODO: test) is also written in the code. After a simple validation it can be seen that the ```Transfer``` event of the USDT contract is continuously monitored and data is recorded, and a comparison between this data and the event data obtained at once can be observed that the data is consistent with:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150277
" title="https://stocksharp.com/file/150277
"&gt;https://stocksharp.com/file/150277
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;### Event Filtering&lt;br /&gt;&lt;br /&gt;Based on the previous lesson ```Listening to contract events```, we expand on it by adding filters to the listening process to listen for transfers to and from specified addresses. When a smart contract creates a log (i.e. releases an event), the log data ```topics``` contains up to 4 pieces of information. So we design a filter rule with ```[[A1, A2, ...An], null, [C1], D]``` as an example.&lt;br /&gt;&lt;br /&gt;1. ```[A1, A2, ...An]``` corresponds to the data at position ```topics[0]```.&lt;br /&gt;2. ```Null``` corresponds to the data at position ```topics[1]```.&lt;br /&gt;3. ```[C1]``` corresponds to data at position ```topics[2]```.&lt;br /&gt;4. ```D``` corresponds to the data at position ```topics[3]```.&lt;br /&gt;&lt;br /&gt;- If an element in the condition structure is set ```null``` means it is not filtered, e.g. ```null``` corresponds to ```topics[1]``` and any value matches.&lt;br /&gt;- If the element in the condition structure sets a single value indicating that the position must match, e.g. ```[C1]``` corresponds to ```topics[2]``` or ```D``` corresponds to ```topics[3]```, and unmatched logs are filtered.&lt;br /&gt;- If the element in the condition structure is an array, it means that at least one of the elements in the array should match, e.g. ```[A1, A2, ...An]``` corresponds to ```topics[0]```, ```[A1, A2, ...An]``` with any one of them matching ```topics[0]```, then the logs will not be filtered.&lt;br /&gt;&lt;br /&gt;**Listening to USDT transfers from exchanges**&lt;br /&gt;&lt;br /&gt;Monitoring of ```USDT``` transactions transferred from and to the Binance Exchange:&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;&lt;br /&gt;function toInnerAmount(n, decimals) {&lt;br /&gt;    return (BigDecimal(n) * BigDecimal(Math.pow(10, decimals))).toFixed(0)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function addEventListener(contractAddress, event, callBack) {&lt;br /&gt;    var self = {}&lt;br /&gt;    self.eventHash = &amp;quot;0x&amp;quot; + Encode(&amp;quot;keccak256&amp;quot;, &amp;quot;string&amp;quot;, &amp;quot;hex&amp;quot;, event)&lt;br /&gt;    self.contractAddress = contractAddress&lt;br /&gt;    self.latestBlockNumber = 0&lt;br /&gt;    self.fromBlockNumber = 0&lt;br /&gt;    self.firstBlockNumber = 0&lt;br /&gt;    self.filters = []&lt;br /&gt;    &lt;br /&gt;    self.setFilter = function(filterCondition) {&lt;br /&gt;        if (filterCondition.length &amp;gt; 4) {&lt;br /&gt;            throw &amp;quot;filterCondition error&amp;quot;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        self.filters.push(filterCondition)&lt;br /&gt;        Log(&amp;quot;Set filter conditions:&amp;quot;, filterCondition)&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    self.getTokenBalanceOfWallet = function(walletAddress, tokenAddress, tokenDecimals) {&lt;br /&gt;        var balance = exchange.IO(&amp;quot;api&amp;quot;, tokenAddress, &amp;quot;balanceOf&amp;quot;, walletAddress)&lt;br /&gt;        if (balance) {&lt;br /&gt;            return toAmount(balance, tokenDecimals)&lt;br /&gt;        }&lt;br /&gt;        return null&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    self.getBlockNumber = function() {&lt;br /&gt;        var maxTry = 10&lt;br /&gt;        for (var i = 0; i &amp;lt; maxTry; i++) {&lt;br /&gt;            var ret = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_blockNumber&amp;quot;)&lt;br /&gt;            if (ret) {&lt;br /&gt;                return toAmount(ret, 0)&lt;br /&gt;            }&lt;br /&gt;            Sleep(5000)&lt;br /&gt;        }&lt;br /&gt;        throw &amp;quot;getBlockNumber failed&amp;quot;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    self.run = function() {&lt;br /&gt;        var currBlockNumber = self.getBlockNumber()&lt;br /&gt;        var fromBlock = &amp;quot;0x&amp;quot; + self.fromBlockNumber.toString(16)&lt;br /&gt;        var toBlock = &amp;quot;0x&amp;quot; + currBlockNumber.toString(16)&lt;br /&gt;        var params = {&lt;br /&gt;            &amp;quot;fromBlock&amp;quot; : fromBlock, &lt;br /&gt;            &amp;quot;toBlock&amp;quot; : toBlock, &lt;br /&gt;            &amp;quot;address&amp;quot; : self.contractAddress, &lt;br /&gt;            &amp;quot;topics&amp;quot; : [self.eventHash]&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        var logs = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getLogs&amp;quot;, params)&lt;br /&gt;        if (!logs) {&lt;br /&gt;            return &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        for (var i = 0; i &amp;lt; logs.length; i++) {&lt;br /&gt;            if (toAmount(logs[i].blockNumber, 0) &amp;gt; self.latestBlockNumber) {&lt;br /&gt;                // Check the filter condition, and execute the judgment if the filter condition is set&lt;br /&gt;                if (self.filters.length != 0) {&lt;br /&gt;                    // Initial filter marker&lt;br /&gt;                    var isFilter = true &lt;br /&gt;                    // Traverse filter condition setting&lt;br /&gt;                    for (var j = 0; j &amp;lt; self.filters.length; j++) {&lt;br /&gt;                        // Take a filter setting, e.g: [[A1, A2, ...An], null, [C1], D]&lt;br /&gt;                        var cond = self.filters[j]&lt;br /&gt;&lt;br /&gt;                        // Traverse the filter setting&lt;br /&gt;                        var final = true&lt;br /&gt;                        for (var topicsIndex = 0; topicsIndex &amp;lt; cond.length; topicsIndex++) {&lt;br /&gt;                            // Take one of the conditions in the filter setting, if it is the first condition: i.e. the data to be compared with topics[0]&lt;br /&gt;                            var condValue = cond[topicsIndex]&lt;br /&gt;&lt;br /&gt;                            // Data in the logs&lt;br /&gt;                            if (topicsIndex &amp;gt; logs[i].topics.length - 1) {&lt;br /&gt;                                continue &lt;br /&gt;                            }&lt;br /&gt;                            var topicsEleValue = logs[i].topics[topicsIndex]&lt;br /&gt;                            // If it&amp;#39;s a Transfer event, you need to handle the from and to&lt;br /&gt;                            if (logs[i].topics[0] == &amp;quot;0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef&amp;quot;) {&lt;br /&gt;                                if (topicsIndex == 1 || topicsIndex == 2) {&lt;br /&gt;                                    topicsEleValue = &amp;quot;0x&amp;quot; + exchange.IO(&amp;quot;encodePacked&amp;quot;, &amp;quot;address&amp;quot;, topicsEleValue)&lt;br /&gt;                                }&lt;br /&gt;                            }&lt;br /&gt;&lt;br /&gt;                            // If the condValue type is an array, it means that there are multiple comparison conditions in this position, and the multiple condition comparison is a logical or relationship&lt;br /&gt;                            if (Array.isArray(condValue) &amp;amp;&amp;amp; condValue.length &amp;gt; 1) {&lt;br /&gt;                                // Determine condValue[0] == topicsEleValue || condValue[1] == topicsEleValue&lt;br /&gt;                                final = final &amp;amp;&amp;amp; condValue.some(element =&amp;gt; element === topicsEleValue)&lt;br /&gt;                            }else if (condValue === null) {&lt;br /&gt;                                final = final &amp;amp;&amp;amp; true&lt;br /&gt;                            } else {&lt;br /&gt;                                final = final &amp;amp;&amp;amp; (condValue === topicsEleValue)&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                        &lt;br /&gt;                        if (final) {&lt;br /&gt;                            isFilter = false &lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    &lt;br /&gt;                    if (isFilter) {&lt;br /&gt;                        continue&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                callBack(logs[i])&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        self.latestBlockNumber = currBlockNumber&lt;br /&gt;        self.fromBlockNumber = self.latestBlockNumber - 1&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    self.latestBlockNumber = self.getBlockNumber()&lt;br /&gt;    self.fromBlockNumber = self.latestBlockNumber - 1&lt;br /&gt;&lt;br /&gt;    return self&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var listener = null &lt;br /&gt;function main() {&lt;br /&gt;    // Initial clean-up log&lt;br /&gt;    LogReset(1)&lt;br /&gt;    LogProfitReset()&lt;br /&gt;&lt;br /&gt;    var event = &amp;quot;Transfer(address,address,uint256)&amp;quot;                          // Listening to events&lt;br /&gt;    var contractAddress = &amp;quot;0xdac17f958d2ee523a2206206994597c13d831ec7&amp;quot;       // USDT contract address&lt;br /&gt;    var decimals = exchange.IO(&amp;quot;api&amp;quot;, contractAddress, &amp;quot;decimals&amp;quot;)           // Get the precision information of USDT token&lt;br /&gt;    var accountBinanceAddress = &amp;quot;0x28C6c06298d514Db089934071355E5743bf21d60&amp;quot; // Binance hot wallet address&lt;br /&gt;    accountBinanceAddress = accountBinanceAddress.toLowerCase()              // Addresses are handled in lowercase&lt;br /&gt;    Log(exchange.IO(&amp;quot;api&amp;quot;, contractAddress, &amp;quot;name&amp;quot;), &amp;quot; decimals:&amp;quot;, decimals)&lt;br /&gt;&lt;br /&gt;    // Creating a listener object&lt;br /&gt;    listener = addEventListener(contractAddress, event, function(log) {&lt;br /&gt;        var fromAddress = &amp;quot;0x&amp;quot; + exchange.IO(&amp;quot;encodePacked&amp;quot;, &amp;quot;address&amp;quot;, log.topics[1])&lt;br /&gt;        var toAddress = &amp;quot;0x&amp;quot; + exchange.IO(&amp;quot;encodePacked&amp;quot;, &amp;quot;address&amp;quot;, log.topics[2])&lt;br /&gt;        if (fromAddress == accountBinanceAddress) {&lt;br /&gt;            Log(&amp;quot;Binance transfer out - &amp;quot;, &amp;quot; Transfer:&amp;quot;, fromAddress, &amp;quot;-&amp;gt;&amp;quot;, toAddress, &amp;quot;, value:&amp;quot;, toAmount(log.data, decimals), &amp;quot;, blockNumber:&amp;quot;, toAmount(log.blockNumber, 0), &amp;quot;#CD32CD&amp;quot;)&lt;br /&gt;        } else if (toAddress == accountBinanceAddress) {&lt;br /&gt;            Log(&amp;quot;Binance transfer in - &amp;quot;, &amp;quot; Transfer:&amp;quot;, fromAddress, &amp;quot;-&amp;gt;&amp;quot;, toAddress, &amp;quot;, value:&amp;quot;, toAmount(log.data, decimals), &amp;quot;, blockNumber:&amp;quot;, toAmount(log.blockNumber, 0), &amp;quot;#FF0000&amp;quot;)&lt;br /&gt;        }        &lt;br /&gt;    })&lt;br /&gt;&lt;br /&gt;    // Set up event filtering&lt;br /&gt;    listener.setFilter([null, accountBinanceAddress, null])   // Binance -&amp;gt; USDT&lt;br /&gt;    listener.setFilter([null, null, accountBinanceAddress])   // USDT -&amp;gt; Binance&lt;br /&gt;    &lt;br /&gt;    var preBalance = 0&lt;br /&gt;    while (true) {&lt;br /&gt;        listener.run()&lt;br /&gt;        var balance = listener.getTokenBalanceOfWallet(accountBinanceAddress, contractAddress, decimals)&lt;br /&gt;        if (balance) {&lt;br /&gt;            var direction = &amp;quot;&amp;quot;&lt;br /&gt;            if (preBalance != 0 &amp;amp;&amp;amp; preBalance &amp;gt; balance) {&lt;br /&gt;                direction = &amp;quot; ↓ &amp;quot; + (preBalance - balance) + &amp;quot;#CD32CD&amp;quot;&lt;br /&gt;            } else if (preBalance != 0 &amp;amp;&amp;amp; preBalance &amp;lt; balance) {&lt;br /&gt;                direction = &amp;quot; ↑ &amp;quot; + (balance - preBalance) + &amp;quot;#FF0000&amp;quot;&lt;br /&gt;            }&lt;br /&gt;            Log(&amp;quot;Binance wallet address:&amp;quot;, accountBinanceAddress, &amp;quot; balance:&amp;quot;, balance, direction)&lt;br /&gt;            LogProfit(balance, &amp;quot;&amp;amp;&amp;quot;)   // Drawing only, no log printing&lt;br /&gt;            preBalance = balance&lt;br /&gt;        }&lt;br /&gt;        LogStatus(_D(), &amp;quot;Binance wallet address:&amp;quot;, accountBinanceAddress, &amp;quot;, balance:&amp;quot;, balance)&lt;br /&gt;        Sleep(5000 * 3)&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;The above code running in live trading:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150278
" title="https://stocksharp.com/file/150278
"&gt;https://stocksharp.com/file/150278
&lt;/a&gt;&lt;br /&gt;In this lesson, we introduced how to design an event filter. And used it to listen for ```USDT``` transactions associated with the Binance Exchange hot wallet. You can modify and extend this sample program to listen to any event you are interested in, to see what new transactions ```smart money``` has made, what new items the ```NFT``` Tycoons have rushed, etc.&lt;br /&gt;To be continued...</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25688/</id>
    <title type="text">Get Started with web3 Development Easily Based on Ethereum Using FMZ (4)</title>
    <published>2024-04-16T01:33:24Z</published>
    <updated>2024-04-16T01:33:24Z</updated>
    <author>
      <name>FMZ</name>
      <uri>https://stocksharp.com/users/186354/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#strategy" />
    <category term="#code" />
    <category term="#contract" />
    <category term="#exchange" />
    <category term="#crypto" />
    <category term="#Ethereum" />
    <category term="#FMZQuant" />
    <category term="#token" />
    <category term="#web3" />
    <content type="html">&lt;b&gt;Token Exchange Using Uniswap&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;When there are enough tokens in the wallet to be paid (i.e.: tokenIn), and the ```Uniswap``` router contract is authorized for a sufficient number of operations, the next step is to perform the exchange.&lt;br /&gt;The ```Uniswap``` router contract has multiple exchange methods, here we demonstrate the use of the ```exactInput``` method, the actual exchange pool is ```1INCH/WETH```, and after the exchange, the ```unwrapWETH9``` method is used to unwrap WETH into ETH. This concept we have explained in the previous ERC20 chapter ```withdraw``` description.&lt;br /&gt;&lt;br /&gt;The exchange operation uses three main methods, namely ```exactInput```, ```unwrapWETH9```, and ```multicall```. First, encode the call to the ```exactInput``` method of the ```Uniswap``` router contract, the call to the ```unwrapWETH9``` method, and then batch execution using the ```multicall``` method of the router contract.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;    // Exchange&lt;br /&gt;    var recipientAddress = &amp;quot;0x0000000000000000000000000000000000000002&amp;quot;  // If the final exchange result is ETH or WETH, you need to specify the recipient parameter of the exactInput method as &amp;quot;0x0000000000000000000000000000000000000002&amp;quot;&lt;br /&gt;    var fee = exchange.IO(&amp;quot;encodePacked&amp;quot;, &amp;quot;uint24&amp;quot;, 10000)&lt;br /&gt;    var path = tokenIn.address.slice(2).toLowerCase() + fee + tokenOut.address.slice(2).toLowerCase()&lt;br /&gt;    var minOut = 1&lt;br /&gt;    var amountIn = toInnerAmount(swapAmount, tokenIn.decimals)&lt;br /&gt;&lt;br /&gt;    var swapToken = exchange.IO(&amp;quot;encode&amp;quot;, contractV3SwapRouterV2Address, &amp;quot;exactInput&amp;quot;, {&lt;br /&gt;        path: path,&lt;br /&gt;        recipient: recipientAddress,&lt;br /&gt;        amountIn: amountIn,&lt;br /&gt;        amountOutMinimum: minOut&lt;br /&gt;    })&lt;br /&gt;&lt;br /&gt;    var data = [swapToken]&lt;br /&gt;    data.push(exchange.IO(&amp;quot;encode&amp;quot;, contractV3SwapRouterV2Address, &amp;quot;unwrapWETH9(uint256,address)&amp;quot;, 1, walletAddress))&lt;br /&gt;    var tx = exchange.IO(&amp;quot;api&amp;quot;, contractV3SwapRouterV2Address, &amp;quot;multicall(uint256,bytes[])&amp;quot;, 0, (new Date().getTime() / 1000) + 3600, data)&lt;br /&gt;    Log(&amp;quot;tx:&amp;quot;, tx)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;- Use the ```exchange.IO(&amp;quot;encodePacked&amp;quot;, ...)``` function to encode and compress the rate parameters.&lt;br /&gt;- Construct the path parameter ```path``` according to the parameter requirements of the ```exactInput``` method.&lt;br /&gt;- Use ```exchange.IO(&amp;quot;encode&amp;quot;, ...)``` function to encode the call to the ```exactInput``` method.&lt;br /&gt;  Note: If the final exchange result is ETH or WETH, you need to specify the recipient parameter of the exactInput method as &amp;quot;0x0000000000000000000000000000000000000002&amp;quot;&lt;br /&gt;- Use ```exchange.IO(&amp;quot;encode&amp;quot;, ...)``` function encodes the ```unwrapWETH9(uint256,address)``` method call.&lt;br /&gt;- Use the ```multicall(uint256,bytes[])``` method to execute the function call encoded above.&lt;br /&gt;&lt;br /&gt;Retrieve exchange result:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150273
" title="https://stocksharp.com/file/150273
"&gt;https://stocksharp.com/file/150273
&lt;/a&gt;&lt;br /&gt;Complete code:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;var abiRoute = &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;var abiPool = &amp;#39;[{\&amp;quot;inputs\&amp;quot;:[],\&amp;quot;stateMutability\&amp;quot;:\&amp;quot;nonpayable\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;constructor\&amp;quot;},{\&amp;quot;anonymous\&amp;quot;:false,\&amp;quot;inputs\&amp;quot;:[{\&amp;quot;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Burn\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Collect\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;CollectProtocol\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;paid0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;paid1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Flash\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNextOld\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNextNew\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;IncreaseObservationCardinalityNext\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tick\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Initialize\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Mint\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol0Old\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol1Old\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol0New\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol1New\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;SetFeeProtocol\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidity\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tick\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Swap\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;event\&amp;quot;},{\&amp;quot;inputs\&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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;burn\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&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;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;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;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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;collect\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;collectProtocol\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;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;fee\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint24\&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;feeGrowthGlobal0X128\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;feeGrowthGlobal1X128\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;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;amount0\&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;amount1\&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;flash\&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;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNext\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;increaseObservationCardinalityNext\&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;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;initialize\&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;name\&amp;quot;:\&amp;quot;liquidity\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;maxLiquidityPerTick\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;recipient\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;mint\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&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;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;observations\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;blockTimestamp\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulative\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityCumulativeX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;initialized\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&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;uint32[]\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsAgos\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32[]\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;observe\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56[]\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulatives\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56[]\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160[]\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityCumulativeX128s\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160[]\&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;bytes32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bytes32\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;positions\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidity\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeGrowthInside0LastX128\&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;feeGrowthInside1LastX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tokensOwed0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tokensOwed1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;protocolFees\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;token0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;token1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;setFeeProtocol\&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;name\&amp;quot;:\&amp;quot;slot0\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tick\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationIndex\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinality\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNext\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;unlocked\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&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;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;name\&amp;quot;:\&amp;quot;snapshotCumulativesInside\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulativeInside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityInsideX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsInside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32\&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;recipient\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;zeroForOne\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amountSpecified\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&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;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;swap\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&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;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&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;int16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int16\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;tickBitmap\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;tickSpacing\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&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;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;ticks\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidityGross\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidityNet\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeGrowthOutside0X128\&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;feeGrowthOutside1X128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulativeOutside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityOutsideX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsOutside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;initialized\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&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;token0\&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;token1\&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;#39;&lt;br /&gt;var abiFactory = &amp;#39;[{\&amp;quot;inputs\&amp;quot;:[],\&amp;quot;stateMutability\&amp;quot;:\&amp;quot;nonpayable\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;constructor\&amp;quot;},{\&amp;quot;anonymous\&amp;quot;:false,\&amp;quot;inputs\&amp;quot;:[{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;FeeAmountEnabled\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;oldOwner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;newOwner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;OwnerChanged\&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;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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;pool\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;PoolCreated\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;event\&amp;quot;},{\&amp;quot;inputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tokenA\&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;tokenB\&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;name\&amp;quot;:\&amp;quot;createPool\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;pool\&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;function\&amp;quot;},{\&amp;quot;inputs\&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;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;enableFeeAmount\&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;uint24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;feeAmountTickSpacing\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&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;\&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;\&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;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;getPool\&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;owner\&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;parameters\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;factory\&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;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;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&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;_owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;setOwner\&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;#39;&lt;br /&gt;&lt;br /&gt;var contractV3FactoryAddress = &amp;quot;0x1F98431c8aD98523631AE4a59f267346ea31F984&amp;quot;&lt;br /&gt;var contractV3SwapRouterV2Address = &amp;quot;0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45&amp;quot;&lt;br /&gt;&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;&lt;br /&gt;function toInnerAmount(n, decimals) {&lt;br /&gt;    return (BigDecimal(n) * BigDecimal(Math.pow(10, decimals))).toFixed(0)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function main() {&lt;br /&gt;    // ABI for registration of Uniswap factory contracts&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, contractV3FactoryAddress, abiFactory)&lt;br /&gt;&lt;br /&gt;    // Register ABI for Uniswap router contracts&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, contractV3SwapRouterV2Address, abiRoute)&lt;br /&gt;&lt;br /&gt;    // Get the pool address of the trading pair&lt;br /&gt;    var tokenIn = {name : &amp;quot;1INCH&amp;quot;, address: &amp;quot;0x111111111117dC0aa78b770fA6A738034120C302&amp;quot;, decimals: exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;0x111111111117dC0aa78b770fA6A738034120C302&amp;quot;, &amp;quot;decimals&amp;quot;)}&lt;br /&gt;    var tokenOut = {name : &amp;quot;WETH&amp;quot;, address: &amp;quot;0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2&amp;quot;, decimals: exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2&amp;quot;, &amp;quot;decimals&amp;quot;)}&lt;br /&gt;    var poolAddress = exchange.IO(&amp;quot;api&amp;quot;, contractV3FactoryAddress, &amp;quot;getPool&amp;quot;, tokenIn.address, tokenOut.address, 10000)&lt;br /&gt;&lt;br /&gt;    // Registration pool contract ABI&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, poolAddress, abiPool)&lt;br /&gt;    &lt;br /&gt;    // Get the current configured wallet address&lt;br /&gt;    var walletAddress = exchange.IO(&amp;quot;address&amp;quot;)&lt;br /&gt;&lt;br /&gt;    // 1INCH -&amp;gt; WETH, tokenIn: 1INCH&lt;br /&gt;    var allowanceAmount = exchange.IO(&amp;quot;api&amp;quot;, tokenIn.address, &amp;quot;allowance&amp;quot;, walletAddress, contractV3SwapRouterV2Address)&lt;br /&gt;    Log(&amp;quot;allowanceAmount:&amp;quot;, allowanceAmount, &amp;quot;, use the toAmount() function to convert to readable values:&amp;quot;, toAmount(allowanceAmount, tokenIn.decimals))&lt;br /&gt;    &lt;br /&gt;    var balance = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;0x111111111117dC0aa78b770fA6A738034120C302&amp;quot;, &amp;quot;balanceOf&amp;quot;, walletAddress)&lt;br /&gt;    var balanceOf1INCH = toAmount(balance, tokenIn.decimals)&lt;br /&gt;    Log(&amp;quot;balanceOf1INCH:&amp;quot;, balanceOf1INCH)&lt;br /&gt;&lt;br /&gt;    var swapAmount = 38&lt;br /&gt;    if (balanceOf1INCH &amp;lt; swapAmount) {&lt;br /&gt;        Log(&amp;quot;In the wallet&amp;quot;, tokenIn.name, &amp;quot;insufficient, the number is only:&amp;quot;, balanceOf1INCH)&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (toAmount(allowanceAmount, tokenIn.decimals) &amp;lt; swapAmount) {&lt;br /&gt;        Log(&amp;quot;Insufficient authorization quantity, proceed with authorization&amp;quot;)&lt;br /&gt;        // You can also specify an unlimited number of authorizations, i.e. replace the code toInnerAmount(swapAmount, tokenIn.decimals) with &amp;#39;0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff&amp;#39;&lt;br /&gt;        var txApprove = exchange.IO(&amp;quot;api&amp;quot;, tokenIn.address, &amp;quot;approve&amp;quot;, contractV3SwapRouterV2Address, toInnerAmount(swapAmount, tokenIn.decimals))&lt;br /&gt;        if (!txApprove) {&lt;br /&gt;            Log(&amp;quot;Authorization failed&amp;quot;)&lt;br /&gt;        } else {&lt;br /&gt;            for (var i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;                Sleep(5000)&lt;br /&gt;                var info = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getTransactionReceipt&amp;quot;, txApprove)&lt;br /&gt;                if (info &amp;amp;&amp;amp; info.gasUsed) {&lt;br /&gt;                    Log(&amp;quot;info:&amp;quot;, info)&lt;br /&gt;                    break&lt;br /&gt;                }&lt;br /&gt;                Log(&amp;#39;Transaction not yet mined&amp;#39;, txApprove)&lt;br /&gt;            }&lt;br /&gt;            // Check the number of authorizations again&lt;br /&gt;            allowanceAmount = exchange.IO(&amp;quot;api&amp;quot;, tokenIn.address, &amp;quot;allowance&amp;quot;, walletAddress, contractV3SwapRouterV2Address)&lt;br /&gt;            Log(&amp;quot;Check the number of authorizations again,&amp;quot;, &amp;quot;allowanceAmount:&amp;quot;, allowanceAmount, &amp;quot;, use the toAmount() function to convert to readable values:&amp;quot;, toAmount(allowanceAmount, tokenIn.decimals))&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Exchange&lt;br /&gt;    var recipientAddress = &amp;quot;0x0000000000000000000000000000000000000002&amp;quot;&lt;br /&gt;    var fee = exchange.IO(&amp;quot;encodePacked&amp;quot;, &amp;quot;uint24&amp;quot;, 10000)&lt;br /&gt;    var path = tokenIn.address.slice(2).toLowerCase() + fee + tokenOut.address.slice(2).toLowerCase()&lt;br /&gt;    var minOut = 1&lt;br /&gt;    var amountIn = toInnerAmount(swapAmount, tokenIn.decimals)&lt;br /&gt;&lt;br /&gt;    var swapToken = exchange.IO(&amp;quot;encode&amp;quot;, contractV3SwapRouterV2Address, &amp;quot;exactInput&amp;quot;, {&lt;br /&gt;        path: path,&lt;br /&gt;        recipient: recipientAddress,&lt;br /&gt;        amountIn: amountIn,&lt;br /&gt;        amountOutMinimum: minOut&lt;br /&gt;    })&lt;br /&gt;&lt;br /&gt;    var data = [swapToken]&lt;br /&gt;    data.push(exchange.IO(&amp;quot;encode&amp;quot;, contractV3SwapRouterV2Address, &amp;quot;unwrapWETH9(uint256,address)&amp;quot;, 1, walletAddress))&lt;br /&gt;    var tx = exchange.IO(&amp;quot;api&amp;quot;, contractV3SwapRouterV2Address, &amp;quot;multicall(uint256,bytes[])&amp;quot;, 0, (new Date().getTime() / 1000) + 3600, data)&lt;br /&gt;    Log(&amp;quot;tx:&amp;quot;, tx)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;#### Get the Exchange Price in the Pool&lt;br /&gt;&lt;br /&gt;As we explained before, when we use the token address (there are two: tokenIn and tokenOut) and the rate setting, we can get the exchange pool (smart contract) address of this exchange portfolio from the ```getPool``` method of the ```Factory``` contract of ```Uniswap```.&lt;br /&gt;Once the pool address is obtained, the ABI of the pool contract is registered and the ```slot0``` method of the pool contract can be called to get the data related to the current exchange price and further resolve the exchange price.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;var abiRoute = &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;var abiPool = &amp;#39;[{\&amp;quot;inputs\&amp;quot;:[],\&amp;quot;stateMutability\&amp;quot;:\&amp;quot;nonpayable\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;constructor\&amp;quot;},{\&amp;quot;anonymous\&amp;quot;:false,\&amp;quot;inputs\&amp;quot;:[{\&amp;quot;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Burn\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Collect\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;CollectProtocol\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;paid0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;paid1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Flash\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNextOld\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNextNew\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;IncreaseObservationCardinalityNext\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tick\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Initialize\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Mint\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol0Old\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol1Old\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol0New\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol1New\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;SetFeeProtocol\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidity\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tick\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Swap\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;event\&amp;quot;},{\&amp;quot;inputs\&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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;burn\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&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;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;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;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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;collect\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;collectProtocol\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;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;fee\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint24\&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;feeGrowthGlobal0X128\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;feeGrowthGlobal1X128\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;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;amount0\&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;amount1\&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;flash\&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;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNext\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;increaseObservationCardinalityNext\&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;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;initialize\&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;name\&amp;quot;:\&amp;quot;liquidity\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;maxLiquidityPerTick\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;recipient\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;mint\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&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;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;observations\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;blockTimestamp\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulative\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityCumulativeX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;initialized\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&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;uint32[]\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsAgos\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32[]\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;observe\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56[]\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulatives\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56[]\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160[]\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityCumulativeX128s\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160[]\&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;bytes32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bytes32\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;positions\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidity\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeGrowthInside0LastX128\&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;feeGrowthInside1LastX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tokensOwed0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tokensOwed1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;protocolFees\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;token0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;token1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;setFeeProtocol\&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;name\&amp;quot;:\&amp;quot;slot0\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tick\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationIndex\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinality\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNext\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;unlocked\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&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;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;name\&amp;quot;:\&amp;quot;snapshotCumulativesInside\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulativeInside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityInsideX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsInside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32\&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;recipient\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;zeroForOne\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amountSpecified\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&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;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;swap\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&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;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&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;int16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int16\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;tickBitmap\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;tickSpacing\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&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;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;ticks\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidityGross\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidityNet\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeGrowthOutside0X128\&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;feeGrowthOutside1X128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulativeOutside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityOutsideX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsOutside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;initialized\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&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;token0\&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;token1\&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;#39;&lt;br /&gt;var abiFactory = &amp;#39;[{\&amp;quot;inputs\&amp;quot;:[],\&amp;quot;stateMutability\&amp;quot;:\&amp;quot;nonpayable\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;constructor\&amp;quot;},{\&amp;quot;anonymous\&amp;quot;:false,\&amp;quot;inputs\&amp;quot;:[{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;FeeAmountEnabled\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;oldOwner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;newOwner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;OwnerChanged\&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;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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;pool\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;PoolCreated\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;event\&amp;quot;},{\&amp;quot;inputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tokenA\&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;tokenB\&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;name\&amp;quot;:\&amp;quot;createPool\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;pool\&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;function\&amp;quot;},{\&amp;quot;inputs\&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;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;enableFeeAmount\&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;uint24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;feeAmountTickSpacing\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&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;\&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;\&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;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;getPool\&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;owner\&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;parameters\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;factory\&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;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;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&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;_owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;setOwner\&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;#39;&lt;br /&gt;&lt;br /&gt;var contractV3FactoryAddress = &amp;quot;0x1F98431c8aD98523631AE4a59f267346ea31F984&amp;quot;&lt;br /&gt;var contractV3SwapRouterV2Address = &amp;quot;0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45&amp;quot;&lt;br /&gt;&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;&lt;br /&gt;function toInnerAmount(n, decimals) {&lt;br /&gt;    return (BigDecimal(n) * BigDecimal(Math.pow(10, decimals))).toFixed(0)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function main() {&lt;br /&gt;    // ABI for registration of Uniswap factory contracts&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, contractV3FactoryAddress, abiFactory)&lt;br /&gt;&lt;br /&gt;    // Register ABI for Uniswap router contracts&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, contractV3SwapRouterV2Address, abiRoute)&lt;br /&gt;&lt;br /&gt;    // Get the pool address of the trading pair&lt;br /&gt;    var tokenIn = {name : &amp;quot;1INCH&amp;quot;, address: &amp;quot;0x111111111117dC0aa78b770fA6A738034120C302&amp;quot;, decimals: exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;0x111111111117dC0aa78b770fA6A738034120C302&amp;quot;, &amp;quot;decimals&amp;quot;)}&lt;br /&gt;    var tokenOut = {name : &amp;quot;WETH&amp;quot;, address: &amp;quot;0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2&amp;quot;, decimals: exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2&amp;quot;, &amp;quot;decimals&amp;quot;)}&lt;br /&gt;    var poolAddress = exchange.IO(&amp;quot;api&amp;quot;, contractV3FactoryAddress, &amp;quot;getPool&amp;quot;, tokenIn.address, tokenOut.address, 10000)&lt;br /&gt;&lt;br /&gt;    // Registration pool contract ABI&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, poolAddress, abiPool)&lt;br /&gt;    &lt;br /&gt;    var slot0 = exchange.IO(&amp;quot;api&amp;quot;, poolAddress, &amp;quot;slot0&amp;quot;)&lt;br /&gt;    Log(&amp;quot;slot0:&amp;quot;, slot0)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Get the price information of the exchange pool and print out the ```slot0``` variable in the code:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;{&lt;br /&gt;    &amp;quot;feeProtocol&amp;quot;:0,&lt;br /&gt;    &amp;quot;unlocked&amp;quot;:true,&lt;br /&gt;    &amp;quot;sqrtPriceX96&amp;quot;:&amp;quot;1128983883551457130720648561&amp;quot;,&lt;br /&gt;    &amp;quot;tick&amp;quot;:&amp;quot;-85025&amp;quot;,&lt;br /&gt;    &amp;quot;observationIndex&amp;quot;:5,&lt;br /&gt;    &amp;quot;observationCardinality&amp;quot;:6,&lt;br /&gt;    &amp;quot;observationCardinalityNext&amp;quot;:6&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Where the main price information data is recorded in the ```sqrtPriceX96``` field, it is necessary to calculate the current price of the exchange pool together according to the token accuracy data of the exchange portfolio, according to the description in the ```Uniswap``` document we implement a function to calculate:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function computePoolPrice(decimals0, decimals1, sqrtPriceX96) {&lt;br /&gt;    // sqrtPriceX96 = sqrt(price) * 2^96&lt;br /&gt;    [decimals0, decimals1, sqrtPriceX96] = [decimals0, decimals1, sqrtPriceX96].map(BigInt);&lt;br /&gt;    const TWO = BigInt(2);&lt;br /&gt;    const TEN = BigInt(10);&lt;br /&gt;    const SIX_TENTH = BigInt(1000000);&lt;br /&gt;    const Q192 = (TWO ** BigInt(96)) ** TWO;&lt;br /&gt;    return (&lt;br /&gt;        Number((sqrtPriceX96 ** TWO * TEN ** decimals0 * SIX_TENTH) / (Q192 * TEN ** decimals1)) /&lt;br /&gt;        Number(SIX_TENTH)&lt;br /&gt;    );&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Use this function to calculate the current price of the exchange pool with a token combination of ```1INCH/WETH``` and a rate of 10000.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function computePoolPrice(decimals0, decimals1, sqrtPriceX96) {&lt;br /&gt;    // sqrtPriceX96 = sqrt(price) * 2^96&lt;br /&gt;    [decimals0, decimals1, sqrtPriceX96] = [decimals0, decimals1, sqrtPriceX96].map(BigInt);&lt;br /&gt;    const TWO = BigInt(2);&lt;br /&gt;    const TEN = BigInt(10);&lt;br /&gt;    const SIX_TENTH = BigInt(1000000);&lt;br /&gt;    const Q192 = (TWO ** BigInt(96)) ** TWO;&lt;br /&gt;    return (&lt;br /&gt;        Number((sqrtPriceX96 ** TWO * TEN ** decimals0 * SIX_TENTH) / (Q192 * TEN ** decimals1)) /&lt;br /&gt;        Number(SIX_TENTH)&lt;br /&gt;    );&lt;br /&gt;}&lt;br /&gt;function main() {&lt;br /&gt;    var tokenIn = {name : &amp;quot;1INCH&amp;quot;, address: &amp;quot;0x111111111117dC0aa78b770fA6A738034120C302&amp;quot;, decimals: exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;0x111111111117dC0aa78b770fA6A738034120C302&amp;quot;, &amp;quot;decimals&amp;quot;)}&lt;br /&gt;    var tokenOut = {name : &amp;quot;WETH&amp;quot;, address: &amp;quot;0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2&amp;quot;, decimals: exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2&amp;quot;, &amp;quot;decimals&amp;quot;)}&lt;br /&gt;&lt;br /&gt;    // In the obtained slot0 variable &amp;quot;sqrtPriceX96&amp;quot;:&amp;quot;1128983883551457130720648561&amp;quot;,&lt;br /&gt;    var price = computePoolPrice(tokenIn.decimals, tokenOut.decimals, &amp;quot;1128983883551457130720648561&amp;quot;)&lt;br /&gt;    Log(&amp;quot;price:&amp;quot;, price)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Print the variable ```price``` to show: ```price: 0.000203``` (1 1INCH for 0.000203 WETH).&lt;br /&gt;&lt;br /&gt;#### Uniswap V3 Trading Class Library&lt;br /&gt;&lt;br /&gt;The FMZ Quant Trading Platform has disclosed a packaged ```Uniswap``` [template](https://www.fmz.com/strategy/397260), which has been implemented to exchange, get prices, query wallet balance and other functions, without having to write code repeatedly based on the above explanation, you can read the source code of this template for more in-depth learning, development of Web3 direction applications.&lt;br /&gt;The template class library has many details designed to learn:&lt;br /&gt;&lt;br /&gt;- Get the token information automatically&lt;br /&gt;An excerpt from one of the codes explains, when the parameter ```AutoFetchTokens``` of this template is set to true, the template program will automatically visit the ```https://tokens.coingecko.com/uniswap/all.json``` link to get and process all token information automatically. This eliminates the need to manually add a token in the strategy code (otherwise you would need to use ```addToken(name, address)``` to add the token).&lt;br /&gt;&lt;br /&gt;  ```javascript&lt;br /&gt;       if (AutoFetchTokens) {&lt;br /&gt;            let res = JSON.parse(HttpQuery(&amp;quot;https://tokens.coingecko.com/uniswap/all.json&amp;quot;))&lt;br /&gt;            Log(&amp;quot;fetch&amp;quot;, res.tokens.length, &amp;quot;tokens from&amp;quot;, res.name)&lt;br /&gt;            res.tokens.forEach(function(token) {&lt;br /&gt;                if (token.chainId == chainId &amp;amp;&amp;amp; token.symbol != &amp;quot;WETH&amp;quot;) {&lt;br /&gt;                    self.tokenInfo[token.symbol] = {&lt;br /&gt;                        name: token.symbol,&lt;br /&gt;                        decimals: token.decimals,&lt;br /&gt;                        address: token.address&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            })&lt;br /&gt;        }  &lt;br /&gt;  ```&lt;br /&gt;&lt;br /&gt;- Adaptation of different contract addresses according to chain settings&lt;br /&gt;  The template sets ```ChainType``` parameter to support switching multiple chains:&lt;br /&gt;&lt;br /&gt;  ```desc&lt;br /&gt;    &amp;#39;https://rpc.ankr.com/eth&amp;#39;,&lt;br /&gt;    &amp;#39;https://arb1.arbitrum.io/rpc&amp;#39;,&lt;br /&gt;    &amp;#39;https://mainnet.optimism.io/&amp;#39;,&lt;br /&gt;    &amp;#39;https://rpc.ankr.com/avalanche&amp;#39;,&lt;br /&gt;    &amp;#39;https://polygon-rpc.com&amp;#39;,&lt;br /&gt;    &amp;#39;https://rpc.ankr.com/celo&amp;#39;,&lt;br /&gt;  ```&lt;br /&gt;  &lt;br /&gt;Excerpt code:&lt;br /&gt;  ```javascript&lt;br /&gt;        if (typeof(ChainType) === &amp;#39;number&amp;#39;) {&lt;br /&gt;            let chainRpc = [&lt;br /&gt;                &amp;#39;&amp;#39;,&lt;br /&gt;                &amp;#39;https://rpc.ankr.com/eth&amp;#39;,&lt;br /&gt;                &amp;#39;https://arb1.arbitrum.io/rpc&amp;#39;,&lt;br /&gt;                &amp;#39;https://mainnet.optimism.io/&amp;#39;,&lt;br /&gt;                &amp;#39;https://rpc.ankr.com/avalanche&amp;#39;,&lt;br /&gt;                &amp;#39;https://polygon-rpc.com&amp;#39;,&lt;br /&gt;                &amp;#39;https://rpc.ankr.com/celo&amp;#39;,&lt;br /&gt;                //&amp;#39;https://mainnet.aurora.dev&amp;#39;,&lt;br /&gt;                //&amp;#39;https://bsc-dataseed.binance.org&amp;#39;,&lt;br /&gt;                //&amp;#39;https://exchainrpc.okex.org&amp;#39;&lt;br /&gt;            ][ChainType]&lt;br /&gt;            if (chainRpc &amp;amp;&amp;amp; chainRpc.length &amp;gt; 0) {&lt;br /&gt;                e.IO(&amp;quot;base&amp;quot;, chainRpc)&lt;br /&gt;                Log(&amp;quot;change base rpc to&amp;quot;, chainRpc)&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;  ```&lt;br /&gt;&lt;br /&gt;  Call Ethereum&amp;#39;s RPC method ```eth_chainId``` to query the current ```chainId```, and then adapt the WETH address, ```Uniswap``` a series of contract addresses, ```USDT``` contract addresses, etc. according to the ```chainId``` (a certain smart contract may have different contract addresses on different chains).&lt;br /&gt;&lt;br /&gt;  Excerpt code:&lt;br /&gt;  ```javascript&lt;br /&gt;        // &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAA1zGOPw7JV2NcBlvLFFsjBT1uopfJzzkEgxneR097Ao874SSOy8E247RxICY_t1ON4flS3ikpDbc2lS1e7w9Sg" title="https://docs.uniswap.org/contracts/v3/reference/deployments
"&gt;https://docs.uniswap.org...3/reference/deployments
&lt;/a&gt;&lt;br /&gt;        let WETHAddress = {&lt;br /&gt;            1: &amp;quot;0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2&amp;quot;, // Ethereum&lt;br /&gt;            3: &amp;quot;0xc778417E063141139Fce010982780140Aa0cD5Ab&amp;quot;, // Ropsten&lt;br /&gt;            4: &amp;quot;0xc778417E063141139Fce010982780140Aa0cD5Ab&amp;quot;, // Rinkeby&lt;br /&gt;            5: &amp;quot;0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6&amp;quot;, // Goerli&lt;br /&gt;            42: &amp;quot;0xd0A1E359811322d97991E03f863a0C30C2cF029C&amp;quot;, // Kovan&lt;br /&gt;            10: &amp;quot;0x4200000000000000000000000000000000000006&amp;quot;, // Optimism&lt;br /&gt;            69: &amp;quot;0x4200000000000000000000000000000000000006&amp;quot;, // Optimistic Kovan&lt;br /&gt;            42161: &amp;quot;0x82aF49447D8a07e3bd95BD0d56f35241523fBab1&amp;quot;, // Arbitrum One&lt;br /&gt;            421611: &amp;quot;0xB47e6A5f8b33b3F17603C83a0535A9dcD7E32681&amp;quot;, // Arbitrum Rinkeby&lt;br /&gt;            137: &amp;quot;0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270&amp;quot;, // Polygon&lt;br /&gt;            80001: &amp;quot;0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889&amp;quot;, // Polygon Mumbai&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        let chainId = e.IO(&amp;quot;api&amp;quot;, &amp;quot;ETH&amp;quot;, &amp;quot;eth_chainId&amp;quot;)&lt;br /&gt;        if (chainId) {&lt;br /&gt;            chainId = Number(chainId)&lt;br /&gt;            Log(&amp;quot;chainId: &amp;quot;, chainId)&lt;br /&gt;            let addr = WETHAddress[chainId]&lt;br /&gt;            if (addr) {&lt;br /&gt;                Log(&amp;quot;Register WETH address&amp;quot;, addr)&lt;br /&gt;                self.addToken(&amp;quot;ETH&amp;quot;, addr)&lt;br /&gt;            }&lt;br /&gt;            if (chainId == 42220) {&lt;br /&gt;                // Celo Address&lt;br /&gt;                ContractV3Factory = &amp;#39;0xAfE208a311B21f13EF87E33A90049fC17A7acDEc&amp;#39;&lt;br /&gt;                ContractV3SwapRouterV2 = &amp;#39;0x5615CDAb10dc425a742d643d949a7F474C01abc4&amp;#39;&lt;br /&gt;                self.addToken(&amp;#39;CELO&amp;#39;, &amp;#39;0x471ece3750da237f93b8e339c536989b8978a438&amp;#39;)&lt;br /&gt;            } else if (chainId == 42161) {&lt;br /&gt;                self.addToken(&amp;#39;USDT&amp;#39;, &amp;#39;0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9&amp;#39;)&lt;br /&gt;            }&lt;br /&gt;        } else {&lt;br /&gt;            panic(&amp;quot;get chain Id error&amp;quot;)&lt;br /&gt;        }&lt;br /&gt;  ```&lt;br /&gt;&lt;br /&gt;- Use the &amp;quot;Uniswap V3 Trading Library&amp;quot;&lt;br /&gt;&lt;br /&gt;  The ```$.testUniswap()``` function in this template is a function that tests the functionality of the template, and its code gives an example of how to use the template call:&lt;br /&gt;&lt;br /&gt;  ```javascript&lt;br /&gt;  $.testUniswap = function() {&lt;br /&gt;      let ex = $.NewUniswapV3()&lt;br /&gt;      Log(&amp;quot;walletAddress: &amp;quot;, ex.walletAddress)&lt;br /&gt;      let tokenAddressMap = {&lt;br /&gt;          &amp;quot;USDT&amp;quot;: &amp;quot;0xdac17f958d2ee523a2206206994597c13d831ec7&amp;quot;,&lt;br /&gt;          &amp;quot;1INCH&amp;quot;: &amp;quot;0x111111111117dC0aa78b770fA6A738034120C302&amp;quot;,&lt;br /&gt;          &amp;quot;USDC&amp;quot;: &amp;quot;0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48&amp;quot;,&lt;br /&gt;          &amp;quot;DAI&amp;quot;: &amp;quot;0x6b175474e89094c44da98b954eedeac495271d0f&amp;quot;,&lt;br /&gt;      }&lt;br /&gt;      for (let name in tokenAddressMap) {&lt;br /&gt;          ex.addToken(name, tokenAddressMap[name])&lt;br /&gt;      }&lt;br /&gt;  &lt;br /&gt;      Log(ex.getPrice(&amp;#39;ETH_USDT&amp;#39;))&lt;br /&gt;      Log(ex.getPrice(&amp;#39;1INCH_USDT&amp;#39;))&lt;br /&gt;  &lt;br /&gt;      // swap 0.01 ETH to USDT&lt;br /&gt;      Log(ex.swapToken(&amp;#39;ETH&amp;#39;, 0.01, &amp;#39;USDT&amp;#39;))&lt;br /&gt;      let usdtBalance = ex.balanceOf(&amp;#39;USDT&amp;#39;)&lt;br /&gt;      Log(&amp;quot;balance of USDT&amp;quot;, usdtBalance)&lt;br /&gt;  &lt;br /&gt;      // swap USDT to DAI then DAI to ETH&lt;br /&gt;      Log(ex.swapToken(&amp;#39;USDT&amp;#39;, usdtBalance, &amp;#39;DAI,ETH&amp;#39;))&lt;br /&gt;  &lt;br /&gt;      Log(&amp;quot;balance of ETH&amp;quot;, ex.getETHBalance())&lt;br /&gt;  &lt;br /&gt;      // Log(ex.sendETH(&amp;#39;0x11111&amp;#39;, 0.02))&lt;br /&gt;      &lt;br /&gt;      // ...&lt;br /&gt;  }&lt;br /&gt;  ```&lt;br /&gt;&lt;br /&gt;  When a strategy references the &amp;quot;Uniswap V3 Trading Class Library&amp;quot; (see the FMZ platform documentation for how to reference the template class library), you can call the functions encapsulated in this template class library.&lt;br /&gt;&lt;br /&gt;  Create a variable named ```ex``` and call the interface function ```$.NewUniswapV3()``` that is wrapped in the &amp;quot;Uniswap V3 Trading Library&amp;quot; template to create an object to assign to ```ex```.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;let ex = $.NewUniswapV3()&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;  Use the member function ```addToken()``` of the ```ex``` object to add (register) token information.&lt;br /&gt;&lt;br /&gt;  ```javascript&lt;br /&gt;    let tokenAddressMap = {&lt;br /&gt;        &amp;quot;USDT&amp;quot;: &amp;quot;0xdac17f958d2ee523a2206206994597c13d831ec7&amp;quot;,&lt;br /&gt;        &amp;quot;1INCH&amp;quot;: &amp;quot;0x111111111117dC0aa78b770fA6A738034120C302&amp;quot;,&lt;br /&gt;        &amp;quot;USDC&amp;quot;: &amp;quot;0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48&amp;quot;,&lt;br /&gt;        &amp;quot;DAI&amp;quot;: &amp;quot;0x6b175474e89094c44da98b954eedeac495271d0f&amp;quot;,&lt;br /&gt;    }&lt;br /&gt;    for (let name in tokenAddressMap) {&lt;br /&gt;        ex.addToken(name, tokenAddressMap[name])&lt;br /&gt;    }&lt;br /&gt;  ```&lt;br /&gt;&lt;br /&gt;  To get and print the exchange pool price for a particular trading pair, you can use the member function ```getPrice()``` of the ```ex``` object, which can be written as follows:&lt;br /&gt;&lt;br /&gt;  ```javascript&lt;br /&gt;    Log(ex.getPrice(&amp;#39;ETH_USDT&amp;#39;))&lt;br /&gt;    Log(ex.getPrice(&amp;#39;1INCH_USDT&amp;#39;))&lt;br /&gt;  ```&lt;br /&gt;&lt;br /&gt;  To perform the exchange operation, you can use the member function ```swapToken()``` of the ```ex``` object to perform the exchange:&lt;br /&gt;&lt;br /&gt;  ```javascript&lt;br /&gt;    // swap 0.01 ETH to USDT&lt;br /&gt;    Log(ex.swapToken(&amp;#39;ETH&amp;#39;, 0.01, &amp;#39;USDT&amp;#39;))&lt;br /&gt;    let usdtBalance = ex.balanceOf(&amp;#39;USDT&amp;#39;)&lt;br /&gt;    Log(&amp;quot;balance of USDT&amp;quot;, usdtBalance)&lt;br /&gt;&lt;br /&gt;    // swap USDT to DAI then DAI to ETH&lt;br /&gt;    Log(ex.swapToken(&amp;#39;USDT&amp;#39;, usdtBalance, &amp;#39;DAI,ETH&amp;#39;))&lt;br /&gt;  ```&lt;br /&gt;To be continued...</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25686/</id>
    <title type="text">Get Started with web3 Development Easily Based on Ethereum Using FMZ (3)</title>
    <published>2024-04-15T08:48:25Z</published>
    <updated>2024-04-15T08:48:25Z</updated>
    <author>
      <name>FMZ</name>
      <uri>https://stocksharp.com/users/186354/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#code" />
    <category term="#fmz" />
    <category term="#contract" />
    <category term="#exchange" />
    <category term="#crypto" />
    <category term="#Ethereum" />
    <category term="#web3" />
    <category term="#address" />
    <category term="#wallet" />
    <content type="html">&lt;b&gt;Query ```Uniswap V3``` Router Contract Authorization&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The ```allowance``` function is used in the ```ERC20``` contract to query the number of tokens authorized to other addresses. It queries the number of tokens that a specific address has authorized to another address (usually the contract address) that can be transferred from its own account.&lt;br /&gt;For ```Uniswap V3``` router contracts, if you have already executed the ```approve``` function to authorize an address to a router contract, then you can use the ```allowance``` function of the ```ERC20``` token to query the number of that authorization.&lt;br /&gt;&lt;br /&gt;Remember the call to the ```ERC20``` contract method we demonstrated in the previous tutorial? ```allowance``` and ```approve``` are both methods of the ```ERC20``` contract, and these methods are on par with the ```balanceOf``` and ```transfer``` methods we explained before.&lt;br /&gt;&lt;br /&gt;Before exchange, first we have to check if we have authorized enough tokens to the ```Uniswap``` router contract to perform the exchange, if the action we want to exchange is: ```1INCH-&amp;gt;ETH``` and the rate is set to 10000, which means the rate is 1%, the exchange pool of ```Uniswap``` may have multiple rates, generally several options are specified by ```Uniswap```. For example, if the rate is set to 3000, it means the rate is 0.3%, please check the ```Uniswap``` documentation and related materials for details.&lt;br /&gt;&lt;br /&gt;Note here that the actual exchange pool is ```1INCH/WETH```, and ETH and WETH are two different tokens in Ethereum.&lt;br /&gt;&lt;br /&gt;- ETH (Ethereum):&lt;br /&gt;  ETH is the native cryptocurrency of the Ethereum blockchain and the primary asset and unit of computation of the Ethereum network. ETH is a native token on Ethereum with universal liquidity and usage for paying transaction fees, participating in smart contract interactions, storing value, etc.&lt;br /&gt;- WETH (Wrapped Ether):&lt;br /&gt;  WETH is a form of ETH packaged as an ERC20 standard token. It is a smart contract on Ethereum designed to enable ETH to interact seamlessly with ERC20 tokens in a smart contract. WETH can be created and accessed by depositing ETH into the WETH contract address, and WETH can be transferred back to ETH at any time. The primary role of WETH in the Ethereum ecosystem is to provide ETH with the same standard interface and compatibility with other ERC20 tokens, enabling ETH to participate in decentralized transactions, liquidity pools and other DeFi protocols.&lt;br /&gt;&lt;br /&gt;As such, WETH is a wrapper form of ETH that enables ETH to interact as an ERC20 token in an Ethereum smart contract. Typically, when ETH needs to be used in a smart contract, ETH can be converted to WETH, traded or involved in DeFi operations, and then WETH can be reconverted back to ETH as needed.&lt;br /&gt;&lt;br /&gt;Use the ```allowance``` method of ```ERC20``` to obtain the number of authorizations:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;var abiRoute = &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;var abiPool = &amp;#39;[{\&amp;quot;inputs\&amp;quot;:[],\&amp;quot;stateMutability\&amp;quot;:\&amp;quot;nonpayable\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;constructor\&amp;quot;},{\&amp;quot;anonymous\&amp;quot;:false,\&amp;quot;inputs\&amp;quot;:[{\&amp;quot;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Burn\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Collect\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;CollectProtocol\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;paid0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;paid1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Flash\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNextOld\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNextNew\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;IncreaseObservationCardinalityNext\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tick\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Initialize\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Mint\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol0Old\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol1Old\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol0New\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol1New\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;SetFeeProtocol\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidity\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tick\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Swap\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;event\&amp;quot;},{\&amp;quot;inputs\&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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;burn\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&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;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;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;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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;collect\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;collectProtocol\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;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;fee\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint24\&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;feeGrowthGlobal0X128\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;feeGrowthGlobal1X128\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;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;amount0\&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;amount1\&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;flash\&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;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNext\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;increaseObservationCardinalityNext\&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;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;initialize\&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;name\&amp;quot;:\&amp;quot;liquidity\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;maxLiquidityPerTick\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;recipient\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;mint\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&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;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;observations\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;blockTimestamp\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulative\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityCumulativeX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;initialized\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&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;uint32[]\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsAgos\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32[]\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;observe\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56[]\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulatives\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56[]\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160[]\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityCumulativeX128s\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160[]\&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;bytes32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bytes32\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;positions\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidity\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeGrowthInside0LastX128\&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;feeGrowthInside1LastX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tokensOwed0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tokensOwed1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;protocolFees\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;token0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;token1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;setFeeProtocol\&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;name\&amp;quot;:\&amp;quot;slot0\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tick\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationIndex\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinality\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNext\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;unlocked\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&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;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;name\&amp;quot;:\&amp;quot;snapshotCumulativesInside\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulativeInside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityInsideX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsInside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32\&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;recipient\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;zeroForOne\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amountSpecified\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&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;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;swap\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&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;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&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;int16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int16\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;tickBitmap\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;tickSpacing\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&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;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;ticks\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidityGross\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidityNet\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeGrowthOutside0X128\&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;feeGrowthOutside1X128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulativeOutside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityOutsideX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsOutside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;initialized\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&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;token0\&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;token1\&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;#39;&lt;br /&gt;var abiFactory = &amp;#39;[{\&amp;quot;inputs\&amp;quot;:[],\&amp;quot;stateMutability\&amp;quot;:\&amp;quot;nonpayable\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;constructor\&amp;quot;},{\&amp;quot;anonymous\&amp;quot;:false,\&amp;quot;inputs\&amp;quot;:[{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;FeeAmountEnabled\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;oldOwner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;newOwner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;OwnerChanged\&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;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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;pool\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;PoolCreated\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;event\&amp;quot;},{\&amp;quot;inputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tokenA\&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;tokenB\&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;name\&amp;quot;:\&amp;quot;createPool\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;pool\&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;function\&amp;quot;},{\&amp;quot;inputs\&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;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;enableFeeAmount\&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;uint24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;feeAmountTickSpacing\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&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;\&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;\&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;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;getPool\&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;owner\&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;parameters\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;factory\&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;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;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&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;_owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;setOwner\&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;#39;&lt;br /&gt;&lt;br /&gt;var contractV3FactoryAddress = &amp;quot;0x1F98431c8aD98523631AE4a59f267346ea31F984&amp;quot;&lt;br /&gt;var contractV3SwapRouterV2Address = &amp;quot;0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45&amp;quot;&lt;br /&gt;&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;&lt;br /&gt;function main() {&lt;br /&gt;    // ABI for registration of Uniswap factory contracts&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, contractV3FactoryAddress, abiFactory)&lt;br /&gt;&lt;br /&gt;    // Register ABI for Uniswap router contracts&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, contractV3SwapRouterV2Address, abiRoute)&lt;br /&gt;&lt;br /&gt;    // Get the pool address of the trading pair&lt;br /&gt;    var tokenIn = {name : &amp;quot;1INCH&amp;quot;, address: &amp;quot;0x111111111117dC0aa78b770fA6A738034120C302&amp;quot;, decimals: exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;0x111111111117dC0aa78b770fA6A738034120C302&amp;quot;, &amp;quot;decimals&amp;quot;)}&lt;br /&gt;    var tokenOut = {name : &amp;quot;WETH&amp;quot;, address: &amp;quot;0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2&amp;quot;, decimals: exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2&amp;quot;, &amp;quot;decimals&amp;quot;)}&lt;br /&gt;    var poolAddress = exchange.IO(&amp;quot;api&amp;quot;, contractV3FactoryAddress, &amp;quot;getPool&amp;quot;, tokenIn.address, tokenOut.address, 10000)&lt;br /&gt;&lt;br /&gt;    // Registration pool contract ABI&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, poolAddress, abiPool)&lt;br /&gt;    &lt;br /&gt;    // Get the current configured wallet address&lt;br /&gt;    var walletAddress = exchange.IO(&amp;quot;address&amp;quot;)&lt;br /&gt;&lt;br /&gt;    // 1INCH -&amp;gt; ETH, tokenIn: 1INCH&lt;br /&gt;    var allowanceAmount = exchange.IO(&amp;quot;api&amp;quot;, tokenIn.address, &amp;quot;allowance&amp;quot;, walletAddress, contractV3SwapRouterV2Address)&lt;br /&gt;    Log(&amp;quot;allowanceAmount:&amp;quot;, allowanceAmount, &amp;quot;, use the toAmount() function to convert to readable values:&amp;quot;, toAmount(allowanceAmount, tokenIn.decimals))&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;We should be familiar with the function ```toAmount()``` in the code. We have used the custom function code several times in the previous chapters of the course for processing data into human-readable values.&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;```&lt;br /&gt;&lt;br /&gt;Running the code, we find that the current number of authorizations is 0. Then we must authorize a sufficient number of router contracts to make an exchange.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Authorize ```Uniswap V3``` Router Contract&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If the number of authorizations is found to be insufficient after querying with ```allowance```, it is necessary to authorize the ```Uniswap V3``` routER contract with ```approve``` to allow it to operate a certain number of ```ERC20``` tokens.&lt;br /&gt;&lt;br /&gt;We still use the ```1INCH -&amp;gt; ETH``` exchange as an example, use the ```approve``` method of ```ERC20``` to give the ```Uniswap``` router contract authorization to operate the ```1INCH``` tokens in the currently configured wallet.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;var abiRoute = &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;var abiPool = &amp;#39;[{\&amp;quot;inputs\&amp;quot;:[],\&amp;quot;stateMutability\&amp;quot;:\&amp;quot;nonpayable\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;constructor\&amp;quot;},{\&amp;quot;anonymous\&amp;quot;:false,\&amp;quot;inputs\&amp;quot;:[{\&amp;quot;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Burn\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Collect\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;CollectProtocol\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;paid0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;paid1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Flash\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNextOld\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNextNew\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;IncreaseObservationCardinalityNext\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tick\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Initialize\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Mint\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol0Old\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol1Old\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol0New\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol1New\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;SetFeeProtocol\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidity\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tick\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Swap\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;event\&amp;quot;},{\&amp;quot;inputs\&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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;burn\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&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;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;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;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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;collect\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;collectProtocol\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;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;fee\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint24\&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;feeGrowthGlobal0X128\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;feeGrowthGlobal1X128\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;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;amount0\&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;amount1\&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;flash\&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;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNext\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;increaseObservationCardinalityNext\&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;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;initialize\&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;name\&amp;quot;:\&amp;quot;liquidity\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;maxLiquidityPerTick\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;recipient\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;mint\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&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;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;observations\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;blockTimestamp\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulative\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityCumulativeX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;initialized\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&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;uint32[]\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsAgos\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32[]\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;observe\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56[]\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulatives\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56[]\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160[]\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityCumulativeX128s\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160[]\&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;bytes32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bytes32\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;positions\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidity\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeGrowthInside0LastX128\&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;feeGrowthInside1LastX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tokensOwed0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tokensOwed1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;protocolFees\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;token0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;token1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;setFeeProtocol\&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;name\&amp;quot;:\&amp;quot;slot0\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tick\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationIndex\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinality\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNext\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;unlocked\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&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;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;name\&amp;quot;:\&amp;quot;snapshotCumulativesInside\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulativeInside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityInsideX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsInside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32\&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;recipient\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;zeroForOne\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amountSpecified\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&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;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;swap\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&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;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&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;int16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int16\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;tickBitmap\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;tickSpacing\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&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;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;ticks\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidityGross\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidityNet\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeGrowthOutside0X128\&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;feeGrowthOutside1X128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulativeOutside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityOutsideX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsOutside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;initialized\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&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;token0\&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;token1\&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;#39;&lt;br /&gt;var abiFactory = &amp;#39;[{\&amp;quot;inputs\&amp;quot;:[],\&amp;quot;stateMutability\&amp;quot;:\&amp;quot;nonpayable\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;constructor\&amp;quot;},{\&amp;quot;anonymous\&amp;quot;:false,\&amp;quot;inputs\&amp;quot;:[{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;FeeAmountEnabled\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;oldOwner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;newOwner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;OwnerChanged\&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;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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;pool\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;PoolCreated\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;event\&amp;quot;},{\&amp;quot;inputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tokenA\&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;tokenB\&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;name\&amp;quot;:\&amp;quot;createPool\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;pool\&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;function\&amp;quot;},{\&amp;quot;inputs\&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;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;enableFeeAmount\&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;uint24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;feeAmountTickSpacing\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&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;\&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;\&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;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;getPool\&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;owner\&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;parameters\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;factory\&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;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;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&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;_owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;setOwner\&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;#39;&lt;br /&gt;&lt;br /&gt;var contractV3FactoryAddress = &amp;quot;0x1F98431c8aD98523631AE4a59f267346ea31F984&amp;quot;&lt;br /&gt;var contractV3SwapRouterV2Address = &amp;quot;0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45&amp;quot;&lt;br /&gt;&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;&lt;br /&gt;function toInnerAmount(n, decimals) {&lt;br /&gt;    return (BigDecimal(n) * BigDecimal(Math.pow(10, decimals))).toFixed(0)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function main() {&lt;br /&gt;    // ABI for registration of Uniswap factory contracts&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, contractV3FactoryAddress, abiFactory)&lt;br /&gt;&lt;br /&gt;    // Register ABI for Uniswap router contracts&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, contractV3SwapRouterV2Address, abiRoute)&lt;br /&gt;&lt;br /&gt;    // Get the pool address of the trading pair&lt;br /&gt;    var tokenIn = {name : &amp;quot;1INCH&amp;quot;, address: &amp;quot;0x111111111117dC0aa78b770fA6A738034120C302&amp;quot;, decimals: exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;0x111111111117dC0aa78b770fA6A738034120C302&amp;quot;, &amp;quot;decimals&amp;quot;)}&lt;br /&gt;    var tokenOut = {name : &amp;quot;WETH&amp;quot;, address: &amp;quot;0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2&amp;quot;, decimals: exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2&amp;quot;, &amp;quot;decimals&amp;quot;)}&lt;br /&gt;    var poolAddress = exchange.IO(&amp;quot;api&amp;quot;, contractV3FactoryAddress, &amp;quot;getPool&amp;quot;, tokenIn.address, tokenOut.address, 10000)&lt;br /&gt;&lt;br /&gt;    // Registration pool contract ABI&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, poolAddress, abiPool)&lt;br /&gt;    &lt;br /&gt;    // Get the current configured wallet address&lt;br /&gt;    var walletAddress = exchange.IO(&amp;quot;address&amp;quot;)&lt;br /&gt;&lt;br /&gt;    // 1INCH -&amp;gt; WETH, tokenIn: 1INCH&lt;br /&gt;    var allowanceAmount = exchange.IO(&amp;quot;api&amp;quot;, tokenIn.address, &amp;quot;allowance&amp;quot;, walletAddress, contractV3SwapRouterV2Address)&lt;br /&gt;    Log(&amp;quot;allowanceAmount:&amp;quot;, allowanceAmount, &amp;quot;, Use the toAmount() function to convert to readable values:&amp;quot;, toAmount(allowanceAmount, tokenIn.decimals))&lt;br /&gt;    &lt;br /&gt;    var balance = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;0x111111111117dC0aa78b770fA6A738034120C302&amp;quot;, &amp;quot;balanceOf&amp;quot;, walletAddress)&lt;br /&gt;    var balanceOf1INCH = toAmount(balance, tokenIn.decimals)&lt;br /&gt;    Log(&amp;quot;balanceOf1INCH:&amp;quot;, balanceOf1INCH)&lt;br /&gt;&lt;br /&gt;    var swapAmount = 38&lt;br /&gt;    if (balanceOf1INCH &amp;lt; swapAmount) {&lt;br /&gt;        Log(&amp;quot;In the wallet&amp;quot;, tokenIn.name, &amp;quot;Insufficient, the number is only:&amp;quot;, balanceOf1INCH)&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (toAmount(allowanceAmount, tokenIn.decimals) &amp;lt; swapAmount) {&lt;br /&gt;        Log(&amp;quot;Insufficient authorization quantity, proceed with authorization&amp;quot;)&lt;br /&gt;        // You can also specify an unlimited number of authorizations, i.e. replace the code toInnerAmount(swapAmount, tokenIn.decimals) with &amp;#39;0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff&amp;#39;&lt;br /&gt;        var txApprove = exchange.IO(&amp;quot;api&amp;quot;, tokenIn.address, &amp;quot;approve&amp;quot;, contractV3SwapRouterV2Address, toInnerAmount(swapAmount, tokenIn.decimals))&lt;br /&gt;        if (!txApprove) {&lt;br /&gt;            Log(&amp;quot;Authorization failed&amp;quot;)&lt;br /&gt;        } else {&lt;br /&gt;            for (var i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;                Sleep(5000)&lt;br /&gt;                var info = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getTransactionReceipt&amp;quot;, txApprove)&lt;br /&gt;                if (info &amp;amp;&amp;amp; info.gasUsed) {&lt;br /&gt;                    Log(&amp;quot;info:&amp;quot;, info)&lt;br /&gt;                    break&lt;br /&gt;                }&lt;br /&gt;                Log(&amp;#39;Transaction not yet mined&amp;#39;, txApprove)&lt;br /&gt;            }&lt;br /&gt;            // Check the number of authorizations again&lt;br /&gt;            allowanceAmount = exchange.IO(&amp;quot;api&amp;quot;, tokenIn.address, &amp;quot;allowance&amp;quot;, walletAddress, contractV3SwapRouterV2Address)&lt;br /&gt;            Log(&amp;quot;Check the number of authorizations again,&amp;quot;, &amp;quot;allowanceAmount:&amp;quot;, allowanceAmount, &amp;quot;, use the toAmount() function to convert to readable values:&amp;quot;, toAmount(allowanceAmount, tokenIn.decimals))&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150259
" title="https://stocksharp.com/file/150259
"&gt;https://stocksharp.com/file/150259
&lt;/a&gt;&lt;br /&gt;The code adds a ```toInnerAmount()``` custom function implementation, this function is often used in our previous courses, so we will not repeat it here.&lt;br /&gt;You can see the authorization record, call the code again to check the authorization status:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;allowanceAmount = exchange.IO(&amp;quot;api&amp;quot;, tokenIn.address, &amp;quot;allowance&amp;quot;, walletAddress, contractV3SwapRouterV2Address)&lt;br /&gt;Log(&amp;quot;Check the number of authorizations again,&amp;quot;, &amp;quot;allowanceAmount:&amp;quot;, allowanceAmount, &amp;quot;, use the toAmount() function to convert to readable values:&amp;quot;, toAmount(allowanceAmount, tokenIn.decimals))&lt;br /&gt;```&lt;br /&gt;To be continued...</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25640/</id>
    <title type="text">Get Started with web3 Development Easily Based on Ethereum Using FMZ (2)</title>
    <published>2024-03-29T07:12:48Z</published>
    <updated>2024-03-29T07:12:48Z</updated>
    <author>
      <name>FMZ Quant</name>
      <uri>https://stocksharp.com/users/185929/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#code" />
    <category term="#contract" />
    <category term="#exchange" />
    <category term="#crypto" />
    <category term="#Ethereum" />
    <category term="#token" />
    <category term="#web3" />
    <category term="#docker" />
    <category term="#ABI" />
    <content type="html">&lt;b&gt;&lt;span style="font-size:140%"&gt;Send ETH&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In the previous course chapters, we have learned how to configure private keys. How do we know the wallet address corresponding to this private key for the configured exchange object? On FMZ, you can use the ```exchange.IO(&amp;quot;address&amp;quot;)``` function to obtain the wallet address corresponding to the configured private key.&lt;br /&gt;&lt;br /&gt;The following content in this chapter uses Goerli testnet environment, so the node I am using is: ```https://goerli.infura.io/v3/*******```, and Infura assigns different node addresses for each registered user. Here the ```*******``` hides specific content.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function main() {&lt;br /&gt;    let walletAddress = exchange.IO(&amp;quot;address&amp;quot;)&lt;br /&gt;    Log(&amp;quot;Testnet goerli wallet address:&amp;quot;, walletAddress)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;After knowing your wallet address, you can use Ethereum&amp;#39;s RPC method ```eth_getTransactionCount``` to query the transaction count of the wallet address. In Ethereum, this count is very common, and it&amp;#39;s actually the ```nonce``` parameter that needs to be passed in during transfer operations. In Ethereum, nonce is a unique number used to ensure that each transaction is unique. It is an increasing number, and it will automatically increase every time a new transaction is sent. Therefore, when you send a transaction to a smart contract, you need to provide a nonce to ensure that the transaction is unique and in the correct order. We can find this information in some materials and documents:&lt;br /&gt;&lt;br /&gt;&amp;gt; &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAU8ivLAm8kDh6AhOTPtRnisN-vATyP1RRq2wgVwVIsKw" title="https://goethereumbook.org/en/
"&gt;https://goethereumbook.org/en/
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149802
" title="https://stocksharp.com/file/149802
"&gt;https://stocksharp.com/file/149802
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here, the ```PendingNonceAt``` function in the Ethereum library of Go language is actually calling the ```eth_getTransactionCount``` method. In previous courses, we have also learned how to call RPC methods. Here we use the ```exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, ...)``` function again.&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;&lt;br /&gt;function main() {&lt;br /&gt;    let walletAddress = exchange.IO(&amp;quot;address&amp;quot;)&lt;br /&gt;    Log(&amp;quot;Testnet goerli wallet address:&amp;quot;, walletAddress)&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;    * eth_getTransactionCount&lt;br /&gt;    * @param address - string - The address from which the transaction count to be checked.&lt;br /&gt;    * @param blockNumber - string - The block number as a string in hexadecimal format or tags.&lt;br /&gt;    * @returns The integer of the number of transactions sent from an address encoded as hexadecimal.&lt;br /&gt;    */&lt;br /&gt;    let nonce: string = 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;    Log(&amp;quot;wallet address:&amp;quot;, walletAddress, &amp;quot;current nonce：&amp;quot;, nonce, &amp;quot;, convert to decimal:&amp;quot;, toAmount(nonce, 0))&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Before explaining the transfer operation, let&amp;#39;s briefly understand some concepts. When transferring on Ethereum, a certain amount of ETH tokens will be consumed (as gas fees). The gas fee is determined by two parameters:&lt;br /&gt;&lt;br /&gt;- gasPrice&lt;br /&gt;&lt;br /&gt;    However, the gas fees on the Ethereum network always fluctuate according to market demand and the fees users are willing to pay, so writing a fixed gas fee in the code is sometimes not an ideal choice. We can use the ```eth_gasPrice``` method we learned before, which can obtain the average gas price.&lt;br /&gt;&lt;br /&gt;- gasLimit&lt;br /&gt;&lt;br /&gt;    A standard Ether transfer has a gas limit of 21,000 units.&lt;br /&gt;&lt;br /&gt;After understanding the concepts of ```nonce```, ```gasPrice```, and ```gasLimit```, you can test the transfer. FMZ provides a very simple and easy-to-use transfer function.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;send&amp;quot;, toAddress, toAmount)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;When it&amp;#39;s used for transfers, the third parameter of ```exchange.IO``` is fixed as &amp;quot;send&amp;quot;, the ```toAddress``` parameter is the address receiving ETH during the transfer, and ```toAmount``` is the amount of ETH transferred.&lt;br /&gt;&lt;br /&gt;The parameters ```nonce```, ```gasPrice```, and ```gasLimit``` can all use system default values automatically obtained on FMZ. They can also be specified: &lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;send&amp;quot;, toAddress, toAmount, {gasPrice: 5000000000, gasLimit: 21000, nonce: 100})&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Next, we will transfer a certain amount of ETH to a specific address on the goerli test network:&lt;br /&gt;&lt;br /&gt;```javascript&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;&lt;br /&gt;function main() {&lt;br /&gt;    let walletAddress = exchange.IO(&amp;quot;address&amp;quot;)&lt;br /&gt;    Log(&amp;quot;Testnet goerli wallet address:&amp;quot;, walletAddress)&lt;br /&gt;&lt;br /&gt;    let ret = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;send&amp;quot;, &amp;quot;0x4D75a08E870674E68cAE611f329A27f446A66813&amp;quot;, toInnerAmount(0.01, 18))&lt;br /&gt;    return ret // return Transaction Hash : 0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Because the unit of Ethereum transfer amount is ```wei```, a custom function ```toInnerAmount``` needs to be used to process the value in ```wei``` units.&lt;br /&gt;&lt;br /&gt;Query Transaction Hash: ```0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e``` on ```https://etherscan.io/```.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149803
" title="https://stocksharp.com/file/149803
"&gt;https://stocksharp.com/file/149803
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can also write code to query transfer hash ```0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e```, using the ```eth_getTransactionReceipt``` method for queries.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function main() {&lt;br /&gt;    let transHash = &amp;quot;0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e&amp;quot;&lt;br /&gt;    let info = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getTransactionReceipt&amp;quot;, transHash)&lt;br /&gt;    return info&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Query result:&lt;br /&gt;&lt;br /&gt;```run&lt;br /&gt;{&lt;br /&gt;	&amp;quot;cumulativeGasUsed&amp;quot;: &amp;quot;0x200850&amp;quot;,&lt;br /&gt;	&amp;quot;effectiveGasPrice&amp;quot;: &amp;quot;0x1748774421&amp;quot;,&lt;br /&gt;	&amp;quot;transactionHash&amp;quot;: &amp;quot;0xa6f9f51b00d8ae850b0f204380b59da98f4bbce34b813577d3d948f61de4734e&amp;quot;,&lt;br /&gt;	&amp;quot;type&amp;quot;: &amp;quot;0x0&amp;quot;,&lt;br /&gt;	&amp;quot;blockHash&amp;quot;: &amp;quot;0x6bdde8b0f0453ecd24eecf7c634d65306f05511e0e8f09f9ed3f59eee2d06ac7&amp;quot;,&lt;br /&gt;	&amp;quot;contractAddress&amp;quot;: null,&lt;br /&gt;	&amp;quot;blockNumber&amp;quot;: &amp;quot;0x868a50&amp;quot;,&lt;br /&gt;	&amp;quot;logsBloom&amp;quot;: &amp;quot;0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000&amp;quot;,&lt;br /&gt;	&amp;quot;gasUsed&amp;quot;: &amp;quot;0x5208&amp;quot;,&lt;br /&gt;	&amp;quot;to&amp;quot;: &amp;quot;0x4d75a08e870674e68cae611f329a27f446a66813&amp;quot;,&lt;br /&gt;	&amp;quot;status&amp;quot;: &amp;quot;0x1&amp;quot;,&lt;br /&gt;	&amp;quot;transactionIndex&amp;quot;: &amp;quot;0x23&amp;quot;,&lt;br /&gt;	&amp;quot;from&amp;quot;: &amp;quot;0x6b3f11d807809b0b1e5e3243df04a280d9f94bf4&amp;quot;,&lt;br /&gt;	&amp;quot;logs&amp;quot;: []&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Description corresponding to each field:&lt;br /&gt;&lt;br /&gt;```desc&lt;br /&gt;blockHash - The hash value of the block where the transaction is located.&lt;br /&gt;blockNumber - The block number of the block where the transaction is located, encoded in hexadecimal.&lt;br /&gt;contractAddress - If it&amp;#39;s a contract creation, the address of the contract; otherwise null.&lt;br /&gt;cumulativeGasUsed - The total gas used when executing this transaction in the block.&lt;br /&gt;effectiveGasPrice - Total base fee plus tip per unit of gas.&lt;br /&gt;from - Sender&amp;#39;s address.&lt;br /&gt;gasUsed - Gas used by this specific transaction.&lt;br /&gt;logs - Array of log objects generated by this transaction.&lt;br /&gt;  address - Address that generated this log.&lt;br /&gt;  topics - Data array with 0 to 4 indexed log parameters, each with 32 bytes. In Solidity, first topic is event signature hash (e.g., Deposit(address,bytes32,uint256)), unless you declare an event using anonymous specifier.&lt;br /&gt;  data - Non-indexed parameters for logs with length of 32 bytes.&lt;br /&gt;  blockNumber - The block number of the block where this log is located.&lt;br /&gt;  transactionHash - Transaction hash at time when log was created. Null if pending state.&lt;br /&gt;  transactionIndex - Index position during creation. Null if pending state.&lt;br /&gt;  blockHash - The hash value for containing block.&lt;br /&gt;  logIndex - Hexadecimal-encoded integer index position within containing block. Null if pending state.&lt;br /&gt;  removed - True if deleted due to chain reorganization; false for valid logs.&lt;br /&gt;logsBloom - Bloom filter for retrieving related logs.&lt;br /&gt;status - Hexadecimal-encoded value either being &amp;#39;1&amp;#39; (success) or &amp;#39;0&amp;#39; (failure).&lt;br /&gt;to - Receiving party&amp;#39;s address; null for contract creation transactions.&lt;br /&gt;transactionHash - The hash value associated with given transaction.&lt;br /&gt;transactionIndex - Hexadecimal-encoded index position within its respective containing-block.&lt;br /&gt;type - Type value.&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;-----------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Call Ethereum Smart Contract&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;In the chapter on &amp;quot;Reading Contract Information&amp;quot;, we used a complete example to call the method of ENS contract deployed on Ethereum to obtain Vitalik Buterin&amp;#39;s wallet address. These methods belong to ```Read``` methods, and calling these methods does not require ```gas``` (remember what we talked about gas before?). In this chapter, we will call some ```Write``` methods of smart contracts on Ethereum and pay for ```gas```. These operations will be verified by each node and miner in the entire network and change the blockchain state.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ERC20&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;For the ERC20 contract (ERC20 token contract), FMZ platform lists the ABI of the ERC20 contract ABI as a common ABI built directly into the system, eliminating the step of registering the ABI. We have also learned about ABI in previous tutorials when we registered ENS contract&amp;#39;s ABI before calling ENS contract methods.&lt;br /&gt;&lt;br /&gt;To better understand ABI, you can check it out before using it. Here is the ABI for ERC20 contracts:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;[{&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;&lt;br /&gt;This section uses the ```Goerli``` testnet environment.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;balanceOf&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Next, let&amp;#39;s practice again how to call the ```Read``` method of a contract to read contract information, call the ```balanceOf``` method of ERC20 contract to query token balance, the balanceOf method has only one parameter, which is not named, but can be identified by its type as an address (i.e., the address of the token being queried). Since the returned data is not in units of one token, we also need the precision data of tokens for conversion. The precision of tokens can be obtained by using ```decimals``` method in ERC20 contracts. We will use Ethereum testnet ```goerli``` for testing. Please note that token contract addresses may vary on different chains.&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;&lt;br /&gt;function main() {&lt;br /&gt;    let walletAddress = exchange.IO(&amp;quot;address&amp;quot;)&lt;br /&gt;    &lt;br /&gt;    // goerli WETH address &lt;br /&gt;    let wethAddress = &amp;quot;0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6&amp;quot;&lt;br /&gt;    // goerli LINK address &lt;br /&gt;    let linkAddress = &amp;quot;0x326C977E6efc84E512bB9C30f76E30c160eD06FB&amp;quot;&lt;br /&gt;&lt;br /&gt;    // Since it is an ERC20 contract, FMZ has built-in ABI registration, so there is no need to register ERC20 ABI here.&lt;br /&gt;    let wethDecimals = exchange.IO(&amp;quot;api&amp;quot;, wethAddress, &amp;quot;decimals&amp;quot;)&lt;br /&gt;    let linkDecimals = exchange.IO(&amp;quot;api&amp;quot;, linkAddress, &amp;quot;decimals&amp;quot;)&lt;br /&gt;&lt;br /&gt;    let wethBalance = exchange.IO(&amp;quot;api&amp;quot;, wethAddress, &amp;quot;balanceOf&amp;quot;, walletAddress)&lt;br /&gt;    let linkBalance = exchange.IO(&amp;quot;api&amp;quot;, linkAddress, &amp;quot;balanceOf&amp;quot;, walletAddress)&lt;br /&gt;    Log(&amp;quot;WETH precision:&amp;quot;, wethDecimals, &amp;quot;wethBalance:&amp;quot;, toAmount(wethBalance, wethDecimals))&lt;br /&gt;    Log(&amp;quot;LINK precision:&amp;quot;, linkDecimals, &amp;quot;linkBalance:&amp;quot;, toAmount(linkBalance, linkDecimals))&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;By running the above code, you can query the current wallet&amp;#39;s WETH and LINK token balance:&lt;br /&gt;&lt;br /&gt;&amp;gt; WETH precision: 18 wethBalance: 0&lt;br /&gt;&amp;gt; LINK precision: 18 linkBalance: 51.41374973681053&lt;br /&gt;&lt;br /&gt;&lt;em&gt;deposit&lt;/em&gt;&lt;br /&gt;We can see that the balance of WETH tokens in the wallet is 0. Next, we will continue to interact with the ERC20 smart contract of WETH tokens, and this time we will call the Write type method: ```deposit```.&lt;br /&gt;The function of the ```deposit``` method is simply to exchange a certain amount of ETH for WETH. It should be noted that there are no parameters for the ```deposit``` method (which can be observed by checking ABI). The ```payable``` attribute of this method is ```true```, so when calling it, you need to set the transferable ETH (payableAmount) quantity to specify the amount of ETH deposited.&lt;br /&gt;&lt;br /&gt;&amp;gt; Pay attention when calling smart contract methods:&lt;br /&gt;&amp;gt; If the called method has a payable attribute, you need to add a transfer ETH value (the fourth parameter of the exchange.IO function) after the method name, which can be a numeric type or a string form of numeric value.&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;&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;&lt;br /&gt;function main() {&lt;br /&gt;    let walletAddress = exchange.IO(&amp;quot;address&amp;quot;)&lt;br /&gt;    &lt;br /&gt;    // goerli WETH address &lt;br /&gt;    let wethAddress = &amp;quot;0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6&amp;quot;&lt;br /&gt;&lt;br /&gt;    // Since it is an ERC20 contract, FMZ has built-in ABI registration, so there is no need to register ERC20 ABI here.&lt;br /&gt;    let wethDecimals = exchange.IO(&amp;quot;api&amp;quot;, wethAddress, &amp;quot;decimals&amp;quot;)&lt;br /&gt;&lt;br /&gt;    let wethBalance = exchange.IO(&amp;quot;api&amp;quot;, wethAddress, &amp;quot;balanceOf&amp;quot;, walletAddress)&lt;br /&gt;    Log(&amp;quot;WETH precision:&amp;quot;, wethDecimals, &amp;quot;wethBalance:&amp;quot;, toAmount(wethBalance, wethDecimals))&lt;br /&gt;    let ethBalance = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getBalance&amp;quot;, walletAddress, &amp;quot;latest&amp;quot;)&lt;br /&gt;    Log(&amp;quot;ETH precision:&amp;quot;, 18, &amp;quot;ethBalance:&amp;quot;, toAmount(ethBalance, 18))&lt;br /&gt;&lt;br /&gt;    // Call the deposit method, since deposit is a method outside of the ERC20 standard, we need to register the ABI for this method here&lt;br /&gt;    let 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;    exchange.IO(&amp;quot;abi&amp;quot;, wethAddress, abiWETH)&lt;br /&gt;&lt;br /&gt;    let payableAmount = toInnerAmount(0.01, 18)&lt;br /&gt;    let ret = exchange.IO(&amp;quot;api&amp;quot;, wethAddress, &amp;quot;deposit&amp;quot;, payableAmount)&lt;br /&gt;    Log(&amp;quot;Transaction Hash:&amp;quot;, ret)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;&amp;gt; WETH precision: 18 wethBalance: 0&lt;br /&gt;&amp;gt; ETH precision: 18 ethBalance: 0.14333094664072302&lt;br /&gt;&amp;gt; Transaction Hash: 0xaf15b0b0e25a81eda583295e82b249e2d02e4eafebecc906470ccc2c89e23563&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149804
" title="https://stocksharp.com/file/149804
"&gt;https://stocksharp.com/file/149804
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Check the balance of WETH and ETH again:&lt;br /&gt;&lt;br /&gt;&amp;gt; WETH precision: 18 wethBalance: 0.01&lt;br /&gt;&amp;gt; ETH precision: 18 ethBalance: 0.1333309358060905&lt;br /&gt;&lt;br /&gt;Before calling ```deposit```, ```WETH``` is 0 and ```ETH``` is 0.14333094664072302. After calling ```deposit```, ```WETH``` is 0.01 and ```ETH``` is 0.1333309358060905. It can be seen that it has exchanged 0.01```ETH``` for ```WETH``` successfully.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;transfer&lt;/em&gt;&lt;br /&gt;ERC20 tokens can also be transferred, using the ```transfer``` method to transfer 0.01 WETH tokens to the address ```0x4D75a08E870674E68cAE611f329A27f446A66813```. The ```transfer``` method has two parameters, the first parameter ```dst``` is the wallet address of the transfer recipient, and the second parameter ```wad``` is the transfer amount.&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;&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;&lt;br /&gt;function waitMined (tx) {&lt;br /&gt;    for (var i = 0 ; i &amp;lt; 10 ; i++) {&lt;br /&gt;        Sleep(5000)&lt;br /&gt;        let info = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getTransactionReceipt&amp;quot;, tx)&lt;br /&gt;        if (info &amp;amp;&amp;amp; info.gasUsed) {&lt;br /&gt;            Log(info)&lt;br /&gt;            return true&lt;br /&gt;        }&lt;br /&gt;        Log(&amp;#39;Transaction not yet mined&amp;#39;, tx)&lt;br /&gt;    }&lt;br /&gt;    return false &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function main() {&lt;br /&gt;    let walletAddress = exchange.IO(&amp;quot;address&amp;quot;)&lt;br /&gt;    &lt;br /&gt;    // goerli WETH address &lt;br /&gt;    let wethAddress = &amp;quot;0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6&amp;quot;&lt;br /&gt;&lt;br /&gt;    // Since it is an ERC20 contract, FMZ has built-in ABI registration, there is no need to register ERC20 ABI here.&lt;br /&gt;    let wethDecimals = exchange.IO(&amp;quot;api&amp;quot;, wethAddress, &amp;quot;decimals&amp;quot;)&lt;br /&gt;    let wethBalance = exchange.IO(&amp;quot;api&amp;quot;, wethAddress, &amp;quot;balanceOf&amp;quot;, walletAddress)&lt;br /&gt;    Log(&amp;quot;WETH precision:&amp;quot;, wethDecimals, &amp;quot;wethBalance:&amp;quot;, toAmount(wethBalance, wethDecimals))&lt;br /&gt;&lt;br /&gt;    let dst = &amp;quot;0x4D75a08E870674E68cAE611f329A27f446A66813&amp;quot;&lt;br /&gt;    let wad = toInnerAmount(0.01, wethDecimals)&lt;br /&gt;    let tx = exchange.IO(&amp;quot;api&amp;quot;, wethAddress, &amp;quot;transfer&amp;quot;, dst, wad)   &lt;br /&gt;    Log(&amp;quot;Transaction Hash:&amp;quot;, tx)&lt;br /&gt;    waitMined(tx)&lt;br /&gt;    &lt;br /&gt;    wethBalance = exchange.IO(&amp;quot;api&amp;quot;, wethAddress, &amp;quot;balanceOf&amp;quot;, walletAddress)&lt;br /&gt;    Log(&amp;quot;WETH precision:&amp;quot;, wethDecimals, &amp;quot;wethBalance:&amp;quot;, toAmount(wethBalance, wethDecimals))&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In the above example, a custom function ```waitMined``` is used. In fact, we are not unfamiliar with the function of this function. Do you remember the ```eth_getTransactionReceipt``` method? The purpose of this waitMined custom function is to wait for the result of the passed Transaction Hash.&lt;br /&gt;&lt;br /&gt;For this WETH transfer, interested readers can also query the Transaction Hash ```0x2fafb62b548a1fffb0f3189429e3c5a4f57ddafb0acbc0678d8b3cf0a2f7c92c``` to view details (note that it is on testnet goerli).&lt;br /&gt;&lt;br /&gt;&lt;em&gt;withdraw&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;This time we will exchange ```WETH``` back to ```ETH```, using the ```withdraw``` method, which has only one parameter ```wad```, simply put, it is used to set how much ETH to exchange back.&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;&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;&lt;br /&gt;function main() {&lt;br /&gt;    let walletAddress = exchange.IO(&amp;quot;address&amp;quot;)&lt;br /&gt;    &lt;br /&gt;    // goerli WETH address &lt;br /&gt;    let wethAddress = &amp;quot;0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6&amp;quot;&lt;br /&gt;&lt;br /&gt;    // Since it is an ERC20 contract, FMZ has built-in ABI registration, there is no need to register ERC20 ABI here.&lt;br /&gt;    let wethDecimals = exchange.IO(&amp;quot;api&amp;quot;, wethAddress, &amp;quot;decimals&amp;quot;)&lt;br /&gt;&lt;br /&gt;    let wethBalance = exchange.IO(&amp;quot;api&amp;quot;, wethAddress, &amp;quot;balanceOf&amp;quot;, walletAddress)&lt;br /&gt;    Log(&amp;quot;WETH precision:&amp;quot;, wethDecimals, &amp;quot;wethBalance:&amp;quot;, toAmount(wethBalance, wethDecimals))&lt;br /&gt;    let ethBalance = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getBalance&amp;quot;, walletAddress, &amp;quot;latest&amp;quot;)&lt;br /&gt;    Log(&amp;quot;ETH precision:&amp;quot;, 18, &amp;quot;ethBalance:&amp;quot;, toAmount(ethBalance, 18))&lt;br /&gt;&lt;br /&gt;    let 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;    exchange.IO(&amp;quot;abi&amp;quot;, wethAddress, abiWETH)&lt;br /&gt;&lt;br /&gt;    let wad = toInnerAmount(0.01, 18)&lt;br /&gt;    let ret = exchange.IO(&amp;quot;api&amp;quot;, wethAddress, &amp;quot;withdraw&amp;quot;, wad)&lt;br /&gt;    Log(&amp;quot;Transaction Hash:&amp;quot;, ret)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;&amp;gt; Transaction Hash: 0x446423c841451a8d04428a075b556eb5564186b09926da915f5da1c9837d2af4&lt;br /&gt;&lt;br /&gt;From the above code, it can be seen that it is basically the same as the previous example, except that the method called in the last step is changed to ```withdraw```, before calling:&lt;br /&gt;&lt;br /&gt;&amp;gt; WETH precision: 18 wethBalance: 0.01&lt;br /&gt;&amp;gt; ETH precision: 18 ethBalance: 0.11322979983231546&lt;br /&gt;&lt;br /&gt;Query again:&lt;br /&gt;&lt;br /&gt;&amp;gt; WETH precision: 18 wethBalance: 0&lt;br /&gt;&amp;gt; ETH precision: 18 ethBalance: 0.1231207156449464&lt;br /&gt;&lt;br /&gt;We can see that 0.01 ```WETH``` has been exchanged back to ```ETH```.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Uniswap V3&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;```Uniswap V3``` is a decentralized transaction protocol built on the Ethereum blockchain, used to facilitate cryptocurrency trading and liquidity provision. It consists of a series of smart contracts, including core contracts, pool contracts, factory contracts, router contracts, etc. &lt;br /&gt;&lt;br /&gt;The following contracts are mainly used when querying the current exchange price and performing exchange operations using ```Uniswap```:&lt;br /&gt;&lt;br /&gt;- ```Router``` (Router contract)&lt;br /&gt;  This is the contract used to execute transactions, allowing the user to perform a trade operation by specifying a trade path and parameters.&lt;br /&gt;- ```Pool``` (Pool contract)&lt;br /&gt;  Pool contracts are the key component in ```Uniswap``` for storing and managing the liquidity of a given asset pair. Each asset pair has a corresponding pool contract, which contains information about the funds, price range, fee settings, etc. provided by the liquidity provider. The pool contract is responsible for processing transactions, calculating the status of the pool, and ensuring the smooth execution of transactions.&lt;br /&gt;- ```Factory``` (Factory contract)&lt;br /&gt;  Factory contracts are the contracts used to create and manage ```Uniswap``` pool contracts. When users wish to create new asset pairs, they deploy new pool contracts by interacting with the factory contract. Factory contracts are responsible for coordinating the creation and initialization of pool contracts, enabling users to create new asset pairs dynamically.&lt;br /&gt;&lt;br /&gt;As we have learned in previous lessons, let&amp;#39;s review how to register the ```ABI``` of smart contracts in strategy code on the FMZ Quant Trading Platform. The process of obtaining the ABI of smart contracts has been discussed in previous lessons and will not be repeated here. &lt;br /&gt;Three ```Uniswap``` smart contract ```ABI```s need to be registered, using the Ethereum mainnet as an example:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;var abiRoute = &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;var abiPool = &amp;#39;[{\&amp;quot;inputs\&amp;quot;:[],\&amp;quot;stateMutability\&amp;quot;:\&amp;quot;nonpayable\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;constructor\&amp;quot;},{\&amp;quot;anonymous\&amp;quot;:false,\&amp;quot;inputs\&amp;quot;:[{\&amp;quot;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Burn\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Collect\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;CollectProtocol\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;paid0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;paid1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Flash\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNextOld\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNextNew\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;IncreaseObservationCardinalityNext\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tick\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Initialize\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Mint\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol0Old\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol1Old\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol0New\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol1New\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;SetFeeProtocol\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidity\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tick\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Swap\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;event\&amp;quot;},{\&amp;quot;inputs\&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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;burn\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&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;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;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;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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;collect\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;collectProtocol\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;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;fee\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint24\&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;feeGrowthGlobal0X128\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;feeGrowthGlobal1X128\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;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;amount0\&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;amount1\&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;flash\&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;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNext\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;increaseObservationCardinalityNext\&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;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;initialize\&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;name\&amp;quot;:\&amp;quot;liquidity\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;maxLiquidityPerTick\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;recipient\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;mint\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&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;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;observations\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;blockTimestamp\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulative\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityCumulativeX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;initialized\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&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;uint32[]\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsAgos\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32[]\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;observe\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56[]\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulatives\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56[]\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160[]\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityCumulativeX128s\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160[]\&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;bytes32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bytes32\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;positions\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidity\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeGrowthInside0LastX128\&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;feeGrowthInside1LastX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tokensOwed0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tokensOwed1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;protocolFees\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;token0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;token1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;setFeeProtocol\&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;name\&amp;quot;:\&amp;quot;slot0\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tick\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationIndex\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinality\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNext\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;unlocked\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&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;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;name\&amp;quot;:\&amp;quot;snapshotCumulativesInside\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulativeInside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityInsideX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsInside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32\&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;recipient\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;zeroForOne\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amountSpecified\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&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;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;swap\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&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;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&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;int16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int16\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;tickBitmap\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;tickSpacing\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&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;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;ticks\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidityGross\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidityNet\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeGrowthOutside0X128\&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;feeGrowthOutside1X128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulativeOutside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityOutsideX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsOutside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;initialized\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&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;token0\&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;token1\&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;#39;&lt;br /&gt;var abiFactory = &amp;#39;[{\&amp;quot;inputs\&amp;quot;:[],\&amp;quot;stateMutability\&amp;quot;:\&amp;quot;nonpayable\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;constructor\&amp;quot;},{\&amp;quot;anonymous\&amp;quot;:false,\&amp;quot;inputs\&amp;quot;:[{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;FeeAmountEnabled\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;oldOwner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;newOwner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;OwnerChanged\&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;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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;pool\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;PoolCreated\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;event\&amp;quot;},{\&amp;quot;inputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tokenA\&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;tokenB\&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;name\&amp;quot;:\&amp;quot;createPool\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;pool\&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;function\&amp;quot;},{\&amp;quot;inputs\&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;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;enableFeeAmount\&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;uint24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;feeAmountTickSpacing\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&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;\&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;\&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;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;getPool\&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;owner\&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;parameters\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;factory\&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;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;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&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;_owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;setOwner\&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;#39;&lt;br /&gt;&lt;br /&gt;var contractV3FactoryAddress = &amp;quot;0x1F98431c8aD98523631AE4a59f267346ea31F984&amp;quot;&lt;br /&gt;var contractV3SwapRouterV2Address = &amp;quot;0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45&amp;quot;&lt;br /&gt;&lt;br /&gt;function main() {&lt;br /&gt;    // ABI for registration of Uniswap factory contracts&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, contractV3FactoryAddress, abiFactory)&lt;br /&gt;    &lt;br /&gt;    // Test the owner method of the Factory contract&lt;br /&gt;    var owner = exchange.IO(&amp;quot;api&amp;quot;, contractV3FactoryAddress, &amp;quot;owner&amp;quot;)&lt;br /&gt;    Log(&amp;quot;owner:&amp;quot;, owner)   // The return value should be: 0x1a9C8182C09F50C8318d769245beA52c32BE35BC&lt;br /&gt;&lt;br /&gt;    // Register ABI for Uniswap router contracts&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, contractV3SwapRouterV2Address, abiRoute)&lt;br /&gt;&lt;br /&gt;    // Factory method for testing Uniswap V3 Router V2 contracts&lt;br /&gt;    var factoryOfRouter = exchange.IO(&amp;quot;api&amp;quot;, contractV3SwapRouterV2Address, &amp;quot;factory&amp;quot;)&lt;br /&gt;    Log(&amp;quot;factoryOfRouter:&amp;quot;, factoryOfRouter)  // The return value should be: 0x1F98431c8aD98523631AE4a59f267346ea31F984&lt;br /&gt;&lt;br /&gt;    // Get the pool address of the trading pair&lt;br /&gt;    var tokenIn = {name : &amp;quot;DAI&amp;quot;, address: &amp;quot;0x6b175474e89094c44da98b954eedeac495271d0f&amp;quot;}&lt;br /&gt;    var tokenOut = {name : &amp;quot;USDT&amp;quot;, address: &amp;quot;0xdac17f958d2ee523a2206206994597c13d831ec7&amp;quot;}&lt;br /&gt;    var poolAddress = exchange.IO(&amp;quot;api&amp;quot;, contractV3FactoryAddress, &amp;quot;getPool&amp;quot;, tokenIn.address, tokenOut.address, 3000)&lt;br /&gt;    var pair = &amp;quot;tokenIn:&amp;quot; + tokenIn.name + &amp;quot;, tokenOut:&amp;quot; + tokenOut.name + &amp;quot;, fee:&amp;quot; + 3000&lt;br /&gt;    Log(&amp;quot;Use the getPool method of the factory contract to get&amp;quot;, pair, &amp;quot;pool address:&amp;quot;, poolAddress)&lt;br /&gt;&lt;br /&gt;    // Registration pool contract ABI&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, poolAddress, abiPool)&lt;br /&gt;&lt;br /&gt;    // Test pool contract&lt;br /&gt;    var factoryOfPool = exchange.IO(&amp;quot;api&amp;quot;, poolAddress, &amp;quot;factory&amp;quot;)&lt;br /&gt;    Log(&amp;quot;factoryOfPool:&amp;quot;, factoryOfPool)   // The return value should be: 0x1F98431c8aD98523631AE4a59f267346ea31F984&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;The above code registered the ABI of the factory contract, router contract and pool contract and did some tests. It can be observed that the ```factory``` method of both the router contract and the pool contract return the address ```0x1F98431c8aD98523631AE4a59f267346ea31F984```, which is the address of the Uniswap factory contract (variable ``` contractV3FactoryAddress``` in the code).&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;var contractV3FactoryAddress = &amp;quot;0x1F98431c8aD98523631AE4a59f267346ea31F984&amp;quot;&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;After registering the ABI of the smart contract, next we look at the exchange operation using ```Uniswap V3``` first, and in the following we use the exchange of ```ERC20``` tokens (on the Ethereum mainnet) as a specific scenario.&lt;br /&gt;&lt;br /&gt;To be continued...</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25639/</id>
    <title type="text">Get Started with web3 Development Easily Based on Ethereum Using FMZ (1)</title>
    <published>2024-03-29T05:14:50Z</published>
    <updated>2024-03-29T05:14:50Z</updated>
    <author>
      <name>FMZ Quant</name>
      <uri>https://stocksharp.com/users/185929/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#code" />
    <category term="#fmz" />
    <category term="#platform" />
    <category term="#exchange" />
    <category term="#API" />
    <category term="#crypto" />
    <category term="#Ethereum" />
    <category term="#web3" />
    <category term="#docker" />
    <content type="html">&lt;b&gt;&lt;span style="font-size:140%"&gt;EtherEaseWithFMZ Tutorial&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;gt; Get started with web3 development based on Ethereum using FMZ easily&lt;br /&gt;&lt;br /&gt;Ethereum is a smart contract platform based on blockchain technology, which provides a decentralized way to write and deploy smart contracts. Smart contracts are a special type of computer program that can automatically execute on the blockchain and implement various business logic without the need for trusting third parties.&lt;br /&gt;&lt;br /&gt;FMZ Quant Trading Platform (FMZ.COM) provides an easy-to-use API, allowing developers to interact more easily with the Ethereum blockchain and its ecosystem. It achieves access to decentralized exchanges (DEX), obtains on-chain data, sends transactions, and other functions.&lt;br /&gt;&lt;br /&gt;In this tutorial, the examples are written in ```JavaScript``` language, the testing environment uses both **Ethereum mainnet** and **Goerli testnet**. And you can also view the API interfaces and related descriptions, code examples used in the tutorial in FMZ platform&amp;#39;s API documentation.&lt;br /&gt;&lt;br /&gt;-----------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;b&gt;FMZ Getting Started&lt;/b&gt;&lt;br /&gt;Before learning to use the FMZ Quant Trading Platform, we need to familiarize ourselves with a few basic concepts:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;1. FMZ Quant Trading Platform Architecture&lt;/em&gt;&lt;br /&gt;After registering and logging in on the FMZ Quant Trading Platform official website (https://www.fmz.com), you can use various functions of the platform. The FMZ website is the management end of the whole system, and user-written programs run on the docker actually. The docker software program can be deployed on various devices, such as servers, computers, etc. When a user writes a program and creates a running instance on the FMZ website, the FMZ platform will communicate with the docker and start a program instance on it.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;2. Docker&lt;/em&gt;&lt;br /&gt;If you want to run a program instance, you must deploy a docker. The deployment of the docker is also very simple, and there are deployment tutorials on the platform. You can also use the &amp;#39;One-click Deployment&amp;#39; provided by FMZ to deploy automatically on servers rented on behalf of FMZ.&lt;br /&gt;&lt;br /&gt;- Deploy docker on personal devices&lt;br /&gt;&lt;br /&gt;You can deploy and run the docker program on servers, personal computers and other devices, as long as the network is normal (need to be able to access the corresponding target, such as a certain exchange interface, node address, etc.). The main steps of deployment are:&lt;br /&gt;&lt;br /&gt;  1. Log in or open the device where the docker program is to be deployed, such as **logging into a server** or **turning on a computer to enter the operating system**.&lt;br /&gt;  2. Download the corresponding version of the docker program (depending on the device operating system), download page: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAADHZKb-RfbDOdB_w3dJgQKtJmF1mN-qSlvrIMuHUnqFcA" title="https://www.fmz.com/m/add-node
"&gt;https://www.fmz.com/m/add-node
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149788
" title="https://stocksharp.com/file/149788
"&gt;https://stocksharp.com/file/149788
&lt;/a&gt;&lt;br /&gt;  3. What you downloaded is a compressed package, need to decompress.&lt;br /&gt;  4. Run the docker program, the docker program is an executable file called ```robot```. Configure the docker communication address, which is unique to each FMZ account, after logging in to FMZ, you can view your own address at ```https://www.fmz.com/m/add-node``` page (i.e., ```./robot -s node.fmz.com/xxxxx``` this string of addresses, where the content at ```xxxxx``` position is different for each FMZ account). Finally, you need to enter the password of your FMZ account. After configuring these settings, run the docker program.&lt;br /&gt;&lt;br /&gt;- Use FMZ platform&amp;#39;s &amp;quot;One-Click Deployment&amp;quot; function&lt;br /&gt;&lt;br /&gt;  Add a docker page on the FMZ platform, address: ```https://www.fmz.com/m/add-node```&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149789
" title="https://stocksharp.com/file/149789
"&gt;https://stocksharp.com/file/149789
&lt;/a&gt;&lt;br /&gt;&lt;em&gt;3. Debugging Tool&lt;/em&gt;&lt;br /&gt;FMZ Quant Trading Platform provides a free debugging tool that supports ```JavaScript```, ```TypeScript```, and the page is: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAADHZKb-RfbDOdB_w3dJgQKtljPQEcZ_t05nTZclK3sRzA" title="https://www.fmz.com/m/debug. "&gt;https://www.fmz.com/m/debug. &lt;/a&gt;Because creating instances to run is billed. During the initial learning period, you can use this debugging tool for testing and learning. Except for the maximum running time limit of 3 minutes, there is no difference between using the debugging tool and creating an instance to run.&lt;br /&gt;&lt;br /&gt;When using the ```TypeScript``` language, you need to write ```// @ts-check``` on the first line of code to switch to ```TypeScript``` mode; if not switched, the default is ```JavaScript``` language.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;4. Platforms&lt;/em&gt;&lt;br /&gt;On FMZ, &amp;quot;Platform&amp;quot; is a general concept. For CEX exchanges, it refers to a specific exchange account configuration. For web3, this exchange refers to a configuration information that includes node address and private key configuration.&lt;br /&gt;&lt;br /&gt;In the logged-in state of FMZ platform, at ```https://www.fmz.com/m/add-platform``` page, you can configure exchange information, where the exchange is a general concept.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149793
" title="https://stocksharp.com/file/149793
"&gt;https://stocksharp.com/file/149793
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Select ```Web3```, configure RPC node address, configure private key, you can click the lower right corner &amp;quot;Sensitive information will be stored encrypted&amp;quot; to view the security mechanism.&lt;br /&gt;&lt;br /&gt;Nodes can be self-built nodes or nodes provided by node service providers. There are many node service providers, such as: [Infura](https://app.infura.io/login). After registration, you can view the node address of your own account. Both mainnet and testnet are available, which is quite convenient. Configure this node address in the ```Rpc Address``` control shown in the above figure. The label can be named by yourself to distinguish between configured exchange objects.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149792
" title="https://stocksharp.com/file/149792
"&gt;https://stocksharp.com/file/149792
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In the picture, ```https://mainnet.infura.io/v3/xxxxxxxxxxxxx``` is the private Infura ETH mainnet RPC node address.&lt;br /&gt;&lt;br /&gt;-----------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Interact with Ethereum by using FMZ&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;After deploying the docker program and configuring the exchange object, you can use FMZ.COM&amp;#39;s &amp;quot;Debugging Tool&amp;quot; for testing. Call Ethereum RPC methods and interact with Ethereum, in addition to the several RPC methods listed and introduced in this chapter, other RPC methods can be found by consulting materials, such as &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAZ4raNq6xr84KUx1fvz_vBeb-t1iwMMyvn0IqJb5nCZm44MQa1gJJuJ8C2wUz9P0M" title="https://www.quicknode.com/docs.
"&gt;https://www.quicknode.com/docs.
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We list a few simple examples, starting from the basics. For various languages ​​and tools, there are ways to access web3, as shown in the picture:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149790
" title="https://stocksharp.com/file/149790
"&gt;https://stocksharp.com/file/149790
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On FMZ, RPC method calls are also encapsulated, and these functions are encapsulated in the FMZ API function ```exchange.IO```. The calling method is ```exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, ...)```. The first parameter is fixed to ```&amp;quot;api&amp;quot;```, the second parameter is fixed to ```&amp;quot;eth&amp;quot;```, and other parameters depend on the specific RPC method being called.&lt;br /&gt;&lt;br /&gt;For output information, we will use the ```Log``` function of the FMZ platform. The ```Log``` function can accept multiple parameters and then output them in the log area of ​​the &amp;quot;Debug Tool&amp;quot; or &amp;quot;Bot&amp;quot; page on the FMZ platform. The &amp;quot;Debug Tool&amp;quot; page will be our main testing tool.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;eth_getBalance&lt;/b&gt;&lt;br /&gt;The ```eth_getBalance``` method of Ethereum is used to query the ETH balance of an address on Ethereum, and this method requires two parameters.&lt;br /&gt;&lt;br /&gt;- Address to be queried.&lt;br /&gt;- Label, we usually use &amp;quot;latest&amp;quot;.&lt;br /&gt;Let&amp;#39;s check the Ethereum founder ```Vitalik Buterin```&amp;#39;s ETH wallet address, the known address is: ```0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045```.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function main() {&lt;br /&gt;    let ethBalance = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getBalance&amp;quot;, &amp;quot;0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&amp;quot;, &amp;quot;latest&amp;quot;)&lt;br /&gt;    Log(&amp;quot;ethBalance:&amp;quot;, ethBalance)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Already deployed the docker (in the picture: linux/amd64 ...) and configured the exchange object (in the picture: Web3 test), testing code in debugging tool:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149791
" title="https://stocksharp.com/file/149791
"&gt;https://stocksharp.com/file/149791
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Click the &amp;quot;Execute&amp;quot;&amp;#39; button to run the code and display the results:&lt;br /&gt;&lt;br /&gt;&amp;gt; ethBalance: 0x117296558f185bbc4c6&lt;br /&gt;&lt;br /&gt;The ```log``` function prints out the ```ethBalance``` variable value as: ```0x117296558f185bbc4c6```, which is a string type. It is **the hexadecimal value of the ETH balance** in ```wei``` units, with ```1e18 wei``` being equal to 1```ETH```. Therefore, it needs to be converted to become a readable decimal ETH balance.&lt;br /&gt;&lt;br /&gt;Converting ```ethBalance``` into readable data:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function main() {&lt;br /&gt;    let ethBalance = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getBalance&amp;quot;, &amp;quot;0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&amp;quot;, &amp;quot;latest&amp;quot;)&lt;br /&gt;    Log(&amp;quot;ethBalance:&amp;quot;, ethBalance)&lt;br /&gt;    &lt;br /&gt;    // Converting ethBalance into readable data&lt;br /&gt;    let vitalikEthBalance = parseInt(ethBalance.substring(2), 16) / 1e18&lt;br /&gt;    Log(&amp;quot;vitalikEthBalance:&amp;quot;, vitalikEthBalance)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Search on ```https://etherscan.io/```: &lt;br /&gt;&lt;a href="https://stocksharp.com/file/149796
" title="https://stocksharp.com/file/149796
"&gt;https://stocksharp.com/file/149796
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;However, due to the precision problem of the language itself, there will be deviations in this way of processing. Therefore, FMZ platform has built-in two functions for data processing:&lt;br /&gt;&lt;br /&gt;- BigInt : Convert hexadecimal string to BigInt object.&lt;br /&gt;- BigDecimal : Convert numeric type objects into computable BigDecimal objects.&lt;br /&gt;&lt;br /&gt;Adjust the code again:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function main() {&lt;br /&gt;    let ethBalance = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getBalance&amp;quot;, &amp;quot;0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&amp;quot;, &amp;quot;latest&amp;quot;)&lt;br /&gt;&lt;br /&gt;    // The precision unit of ETH is 1e18&lt;br /&gt;    let ethDecimal = 18&lt;br /&gt;    Log(&amp;quot;vitalikEthBalance:&amp;quot;, Number((BigDecimal(BigInt(ethBalance)) / BigDecimal(Math.pow(10, ethDecimal))).toString()))&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;&amp;gt; vitalikEthBalance: 5149.6244846875215&lt;br /&gt;&lt;br /&gt;&lt;b&gt;eth_chainId&lt;/b&gt;&lt;br /&gt;```eth_chainId``` and ```net_version``` have similar purposes, so they are tested together. Both of these functions return the Id of the blockchain that the current RPC node is connected to, with the difference being that ```net_version``` returns a decimal Id and ```eth_chainId``` returns a hexadecimal Id.&lt;br /&gt;&lt;br /&gt;Network name corresponding to chainId&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;1 - ethereum mainnet&lt;br /&gt;2 - morden testnet (deprecated)&lt;br /&gt;3 - ropsten testnet&lt;br /&gt;4 - rinkeby testnet&lt;br /&gt;5 - goerli testnet&lt;br /&gt;11155111 - sepolia testnet&lt;br /&gt;10 - optimism mainnet&lt;br /&gt;69 - optimism kovan testnet&lt;br /&gt;42 - kovan testnet&lt;br /&gt;137 - matic/polygon mainnet&lt;br /&gt;80001 - matic/polygon mumbai testnet&lt;br /&gt;250 - fantom mainnet&lt;br /&gt;100 - xdai mainnet&lt;br /&gt;56 - bsc mainnet&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Test with the configured Ethereum testnet ```goerli``` node:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function main() {&lt;br /&gt;    let netVersionId = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;net_version&amp;quot;)&lt;br /&gt;    let ethChainId = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_chainId&amp;quot;)&lt;br /&gt;&lt;br /&gt;    Log(&amp;quot;netVersionId:&amp;quot;, netVersionId)&lt;br /&gt;    Log(&amp;quot;ethChainId:&amp;quot;, ethChainId, &amp;quot; , conversion:&amp;quot;, parseInt(ethChainId.substring(2), 16))&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;&lt;b&gt;eth_gasPrice&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Call the ```eth_gasPrice``` method to query the current ```gas price``` on the chain.&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;&lt;br /&gt;function main() {&lt;br /&gt;    let gasPrice = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_gasPrice&amp;quot;)&lt;br /&gt;    Log(&amp;quot;gasPrice:&amp;quot;, gasPrice, &amp;quot; , conversion:&amp;quot;, toAmount(gasPrice, 0))&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;Here we write a function to convert the hexadecimal string into a readable numerical value: ```toAmount```. In addition, note that the unit of ```gasPrice``` is ```wei```, so pass the value 0 to the real parameter corresponding to the formal parameter ```decimals```.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;eth_blockNumber&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;```&amp;quot;eth_blockNumber``` is used to query the block height.&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;&lt;br /&gt;function main() {&lt;br /&gt;    let blockNumber = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_blockNumber&amp;quot;)&lt;br /&gt;    Log(toAmount(blockNumber, 0))&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Run in debugging tool:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149794
" title="https://stocksharp.com/file/149794
"&gt;https://stocksharp.com/file/149794
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Search on ```https://etherscan.io/```:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149795
" title="https://stocksharp.com/file/149795
"&gt;https://stocksharp.com/file/149795
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;eth_getBlockByNumber&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Query block information.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function main() {&lt;br /&gt;    let blockNumber = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_blockNumber&amp;quot;)    &lt;br /&gt;    Log(blockNumber)&lt;br /&gt;    let blockMsg = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getBlockByNumber&amp;quot;, blockNumber, true)&lt;br /&gt;    Log(typeof(blockMsg), blockMsg)&lt;br /&gt;    &lt;br /&gt;    // Due to the excessive content of Log output, it will be truncated automatically, so traverse each field of the returned block information and print them one by one&lt;br /&gt;    for (let key in blockMsg) {&lt;br /&gt;        Log(&amp;quot;key:&amp;quot;, key, &amp;quot;, val:&amp;quot;, blockMsg[key])&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Executing in the &amp;quot;Debugging Tool&amp;quot; can obtain the following information:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149797
" title="https://stocksharp.com/file/149797
"&gt;https://stocksharp.com/file/149797
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Read contract information&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Many smart contract applications run on Ethereum, and ```ENS``` is one of them. ```ENS```, or Ethereum Name Service, is a decentralized domain name resolution service based on the Ethereum blockchain.&lt;br /&gt;Do you remember the example in the tutorial where we checked the balance of Ethereum founder Vitalik Buterin&amp;#39;s wallet? One of Vitalik Buterin&amp;#39;s wallet addresses is: ```0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045```. So how do we know the address? In fact, it can be queried through the ```ENS``` smart contract using an intuitive name ```vitalik.eth```.&lt;br /&gt;&lt;br /&gt;The following content in this chapter uses Ethereum mainnet environment, according to the ```ENS``` documentation, ```Hashing Names``` are required for querying Ethereum domain names. Use the following code to process ```vitalik.eth```.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function nameHash(name) {&lt;br /&gt;    if (name == &amp;quot;&amp;quot;) {&lt;br /&gt;        return &amp;quot;0000000000000000000000000000000000000000000000000000000000000000&amp;quot;&lt;br /&gt;    } else {&lt;br /&gt;        let arr = name.split(&amp;quot;.&amp;quot;)&lt;br /&gt;        let label = arr[0]&lt;br /&gt;        &lt;br /&gt;        arr.shift()&lt;br /&gt;        let remainder = arr.join(&amp;quot;.&amp;quot;)&lt;br /&gt;        return Encode(&amp;quot;sha3.keccak256&amp;quot;, &amp;quot;hex&amp;quot;, &amp;quot;hex&amp;quot;, nameHash(remainder) + Encode(&amp;quot;sha3.keccak256&amp;quot;, &amp;quot;raw&amp;quot;, &amp;quot;hex&amp;quot;, label))&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;In the above code example, we saw another unfamiliar function ```Encode```. This function is an API function of the FMZ platform and is specifically used for encoding operations on the FMZ platform. The function supports multiple encoding methods and various hash algorithms.&lt;br /&gt;```&lt;br /&gt;Encode(algo, inputFormat, outputFormat, data, keyFormat, key string)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;According to the description in the ENS document, use the ```sha3.keccak256``` algorithm to process data.&lt;br /&gt;&lt;br /&gt;Call the ```nameHash``` function, for example: ```Log(nameHash(&amp;quot;vitalik.eth&amp;quot;))```, you can get: ```ee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835```, and you need to add the &amp;quot;0x&amp;quot; prefix. ```0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835``` is used as the parameter of the ```resolver``` method in ENS smart contract.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;let ensNode = &amp;quot;0x&amp;quot; + nameHash(&amp;quot;vitalik.eth&amp;quot;)    // Prepare the parameters ensNode for calling the resolver method&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;According to the ENS documentation, the contract address for ENS smart contract applications is: ```0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e```. Before calling the ```resolver``` method of the smart contract, we also need to prepare the ```ABI``` of the contract.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href='https://stocksharp.com/file/149799/28e52c418abac1d9e03ba.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.com/file/149799/28e52c418abac1d9e03ba.png?size=800x800" alt="28e52c418abac1d9e03ba.png" title="28e52c418abac1d9e03ba.png" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Upon learning this, you may ask: what is the ```ABI``` of a smart contract?&lt;br /&gt;&lt;br /&gt;```desc&lt;br /&gt;ABI, or Application Binary Interface, is the interface standard for smart contracts to communicate with the external world.&lt;br /&gt;The ABI of a smart contract defines the contract&amp;#39;s function interfaces, parameter types, return values, and other information, as well as specifications for calling the contract and passing parameters.&lt;br /&gt;&lt;br /&gt;The ABI of a smart contract is usually stored in JSON format and contains the following information:&lt;br /&gt;&lt;br /&gt;Contract function interfaces: function names, parameter lists, return values, etc.&lt;br /&gt;Function parameter types: such as uint256, bool, string etc.&lt;br /&gt;Encoding methods for input and output parameters of functions: Smart contracts use an encoding method called Solidity ABI to encode input and output parameters of functions so that they can interact with Ethereum network.&lt;br /&gt;In Ethereum network ,the ABI of a smart contract is used to call its functions. When you need to call a contract function, you need to provide the name of the function, its parameters, and bytecode encoded according to ABI encoding method.&lt;br /&gt;Ethereum nodes will package this information into transactions and send them out on Ethereum network for execution.&lt;br /&gt;&lt;br /&gt;In Solidity language,the keyword &amp;#39;interface&amp;#39; can be used define ABIs for smart contracts. Ethereum development tools like Remix IDE ,Truffle also provide editing &amp;amp; generation tools making it easier developers create &amp;amp; use ABIs.&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Extract the ```resolver``` method part from ENS&amp;#39;s ABI, or you can use the complete ABI. You can query the contract&amp;#39;s ABI on ```https://etherscan.io/``` or obtain the ABI through other channels (e.g., relevant project documentation).&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149799
" title="https://stocksharp.com/file/149799
"&gt;https://stocksharp.com/file/149799
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;let abiENS_resolver = `[{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;resolver&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;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;}]`&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Here we are going to learn a new invocation method on the FMZ platform, ```exchange.IO(&amp;quot;abi&amp;quot;, address, abiContent)```, which is used to register ABI. The ```address``` parameter is the smart contract address and the ```abiContent``` parameter is the corresponding smart contract ABI (string).&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;let abiENS_resolver = `[{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;resolver&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;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;}]`&lt;br /&gt;exchange.IO(&amp;quot;abi&amp;quot;, &amp;quot;0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e&amp;quot;, abiENS_resolver)  // 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e is the address of the ENS smart contract deployed on the Ethereum mainnet&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Methods for Calling Smart Contracts&lt;/b&gt;&lt;br /&gt;Next, you can call the ```resolver``` method of the ENS smart contract, which returns the address of the ```ENS: Public Resolver``` contract.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149800
" title="https://stocksharp.com/file/149800
"&gt;https://stocksharp.com/file/149800
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;let resolverAddress = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e&amp;quot;, &amp;quot;resolver&amp;quot;, ensNode)&lt;br /&gt;```&lt;br /&gt;Use the ```ENS: Public Resolver``` contract&amp;#39;s ```addr``` method to obtain Vitalik Buterin&amp;#39;s wallet address. To call the ```ENS: Public Resolver``` contract, you still need to register the ABI first. The ABI information for this smart contract can still be obtained from ```https://etherscan.io/```.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;let abiENSPublicResolver = `[{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;contract ENS&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;_ens&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&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;constructor&amp;quot;},{&amp;quot;anonymous&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;indexed&amp;quot;:true,&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;contentType&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;ABIChanged&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;a&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;AddrChanged&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;coinType&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;newAddress&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;AddressChanged&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;owner&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;target&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;bool&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;isAuthorised&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;AuthorisationChanged&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;hash&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;ContenthashChanged&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;uint16&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;resource&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint16&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;record&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;DNSRecordChanged&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;uint16&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;resource&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint16&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;DNSRecordDeleted&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;DNSZoneCleared&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;internalType&amp;quot;:&amp;quot;bytes4&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;interfaceID&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes4&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;implementer&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;InterfaceChanged&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;NameChanged&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;x&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;y&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;PubkeyChanged&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;internalType&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;indexedKey&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;key&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;TextChanged&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;event&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;contentTypes&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;ABI&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&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;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;addr&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address payable&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;coinType&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;addr&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;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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&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;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;name&amp;quot;:&amp;quot;authorisations&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bool&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;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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;clearDNSZone&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;contenthash&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;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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&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;name&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint16&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;resource&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint16&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;dnsRecord&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;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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&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;name&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;hasDNSRecords&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bool&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;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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes4&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;interfaceID&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes4&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;interfaceImplementer&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;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;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;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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;string&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;:true,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;pubkey&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;x&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;y&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;contentType&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;setABI&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;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;coinType&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;a&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;setAddr&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;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;a&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;setAddr&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;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;target&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bool&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;isAuthorised&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;setAuthorisation&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;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&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;hash&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;setContenthash&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;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&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;setDNSRecords&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;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes4&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;interfaceID&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes4&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;implementer&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;setInterface&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;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;setName&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;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&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;x&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;y&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;setPubkey&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;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;key&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;value&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;setText&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;internalType&amp;quot;:&amp;quot;bytes4&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;interfaceID&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes4&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;supportsInterface&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bool&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;pure&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;key&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;string&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;}]`&lt;br /&gt;exchange.IO(&amp;quot;abi&amp;quot;, resolverAddress, abiENSPublicResolver)&lt;br /&gt;```&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149801
" title="https://stocksharp.com/file/149801
"&gt;https://stocksharp.com/file/149801
&lt;/a&gt;&lt;br /&gt;Finally, call the ```ENS: Public Resolver``` contract&amp;#39;s ```addr``` method, with the parameter still being ```ensNode```.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;let vitalikAddress = exchange.IO(&amp;quot;api&amp;quot;, resolverAddress, &amp;quot;addr&amp;quot;, ensNode)&lt;br /&gt;Log(&amp;quot;vitalikAddress:&amp;quot;, vitalikAddress)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Log function output:&lt;br /&gt;&lt;br /&gt;```run&lt;br /&gt;vitalikAddress: 0xd8da6bf26964af9d7eed9e03e53415d37aa96045&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Call the Complete Code of ENS&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function nameHash(name) {&lt;br /&gt;    if (name == &amp;quot;&amp;quot;) {&lt;br /&gt;        return &amp;quot;0000000000000000000000000000000000000000000000000000000000000000&amp;quot;&lt;br /&gt;    } else {&lt;br /&gt;        let arr = name.split(&amp;quot;.&amp;quot;)&lt;br /&gt;        let label = arr[0]&lt;br /&gt;        &lt;br /&gt;        arr.shift()&lt;br /&gt;        let remainder = arr.join(&amp;quot;.&amp;quot;)&lt;br /&gt;        return Encode(&amp;quot;sha3.keccak256&amp;quot;, &amp;quot;hex&amp;quot;, &amp;quot;hex&amp;quot;, nameHash(remainder) + Encode(&amp;quot;sha3.keccak256&amp;quot;, &amp;quot;raw&amp;quot;, &amp;quot;hex&amp;quot;, label))&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function main() {&lt;br /&gt;    // Calculate the name&lt;br /&gt;    let ensNode = &amp;quot;0x&amp;quot; + nameHash(&amp;quot;vitalik.eth&amp;quot;)    &lt;br /&gt;&lt;br /&gt;    // Register ENS contract&lt;br /&gt;    let abiENS_resolver = `[{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;resolver&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;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;}]`&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, &amp;quot;0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e&amp;quot;, abiENS_resolver)&lt;br /&gt;    let resolverAddress = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e&amp;quot;, &amp;quot;resolver&amp;quot;, ensNode)&lt;br /&gt;    &lt;br /&gt;    // Register ENS Public Resolver contract&lt;br /&gt;    let abiENSPublicResolver = `[{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;contract ENS&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;_ens&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&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;constructor&amp;quot;},{&amp;quot;anonymous&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;indexed&amp;quot;:true,&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;contentType&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;ABIChanged&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;a&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;AddrChanged&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;coinType&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;newAddress&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;AddressChanged&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;owner&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;target&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;bool&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;isAuthorised&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;AuthorisationChanged&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;hash&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;ContenthashChanged&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;uint16&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;resource&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint16&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;record&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;DNSRecordChanged&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;uint16&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;resource&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint16&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;DNSRecordDeleted&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;DNSZoneCleared&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;internalType&amp;quot;:&amp;quot;bytes4&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;interfaceID&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes4&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;implementer&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;InterfaceChanged&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;NameChanged&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;x&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;y&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;PubkeyChanged&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;internalType&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;indexedKey&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;key&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;TextChanged&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;event&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;contentTypes&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;ABI&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&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;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;addr&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address payable&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;coinType&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;addr&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;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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&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;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;name&amp;quot;:&amp;quot;authorisations&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bool&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;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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;clearDNSZone&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;contenthash&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;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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&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;name&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint16&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;resource&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint16&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;dnsRecord&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;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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&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;name&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;hasDNSRecords&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bool&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;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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes4&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;interfaceID&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes4&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;interfaceImplementer&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;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;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;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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;string&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;:true,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;pubkey&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;x&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;y&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;contentType&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;setABI&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;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;coinType&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;a&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;setAddr&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;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;a&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;setAddr&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;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;target&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bool&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;isAuthorised&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;setAuthorisation&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;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&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;hash&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;setContenthash&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;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&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;setDNSRecords&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;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes4&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;interfaceID&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes4&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;implementer&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;setInterface&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;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;setName&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;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&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;x&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;y&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;setPubkey&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;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;key&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;value&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;setText&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;internalType&amp;quot;:&amp;quot;bytes4&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;interfaceID&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes4&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;supportsInterface&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bool&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;pure&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;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;node&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;key&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;text&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;string&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;}]`&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, resolverAddress, abiENSPublicResolver)&lt;br /&gt;    let vitalikAddress = exchange.IO(&amp;quot;api&amp;quot;, resolverAddress, &amp;quot;addr&amp;quot;, ensNode)&lt;br /&gt;    Log(&amp;quot;vitalikAddress:&amp;quot;, vitalikAddress)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;To be continued...</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25638/</id>
    <title type="text">Mastering Template Class Libraries: Crafting Custom K-Line Data Retrieval of Any Length</title>
    <published>2024-03-29T03:04:19Z</published>
    <updated>2024-03-29T03:04:19Z</updated>
    <author>
      <name>FMZ Quant</name>
      <uri>https://stocksharp.com/users/185929/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#strategy" />
    <category term="#data" />
    <category term="#binance" />
    <category term="#API" />
    <category term="#Kline" />
    <category term="#crypto" />
    <category term="#FMZQuant" />
    <category term="#library" />
    <category term="#interface" />
    <content type="html">When designing trend strategies, it is often necessary to have a sufficient number of K-line bars for calculating indicators. The calculation of indicators relies on the data provided by the ```exchange.GetRecords()``` function in the FMZ platform API, which is a wrapper for the exchange&amp;#39;s K-line interface. In the early design of cryptocurrency exchange APIs, there was no support for pagination in the K-line interface, and the exchange&amp;#39;s K-line interface only provided a limited amount of data. As a result, some developers were unable to meet the requirements for calculating indicators with larger parameter values.&lt;br /&gt;&lt;br /&gt;The K-line interface of Binance&amp;#39;s contract API supports pagination. In this article, we will use the Binance K-line API interface as an example to teach you how to implement pagination and specify the number of bars to retrieve using the FMZ platform template library.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;K-line interface of Binance&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;**K-line data**&lt;br /&gt;&lt;br /&gt;The opening time of each K-line in the ```GET /dapi/v1/klines``` endpoint can be considered as a unique ID.&lt;br /&gt;&lt;br /&gt;The weight of the request depends on the value of the &amp;quot;LIMIT&amp;quot; parameter.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149782
" title="https://stocksharp.com/file/149782
"&gt;https://stocksharp.com/file/149782
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Parameters:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149783
" title="https://stocksharp.com/file/149783
"&gt;https://stocksharp.com/file/149783
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;First, we need to refer to the exchange&amp;#39;s API documentation to understand the specific parameters of the K-line interface. We can see that when calling this K-line endpoint, we need to specify the type, the K-line period, the data range (start and end time), and the number of pages, etc.&lt;br /&gt;&lt;br /&gt;Since our design requirement is to query a specific number of K-line data, for example, to query the 1-hour K-line, 5000 bars of 1-hour K-line data from the current moment towards the past, it is evident that making a single API call to the exchange will not retrieve the desired data.&lt;br /&gt;&lt;br /&gt;To achieve this, we can implement pagination and divide the query into segments from the current moment towards a specific historical moment. Since we know the desired K-line data&amp;#39;s period, we can easily calculate the start and end time for each segment. We can then query each segment in sequence towards the historical moment until we retrieve enough bars. The approach sounds simple, so let&amp;#39;s go ahead and implement it!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Design &amp;quot;JavaScript version of paginated query K-line historical data template&amp;quot;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Interface function for design templates: ```$.GetRecordsByLength(e, period, length)```.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;/**&lt;br /&gt; * desc: $.GetRecordsByLength is the interface function of this template library, this function is used to get the K-line data of the specified K-line length&lt;br /&gt; * @param {Object} e - exchange object&lt;br /&gt; * @param {Int} period - K-line period, in seconds&lt;br /&gt; * @param {Int} length - Specify the length of the acquired K-line data, which is related to the exchange interface limits&lt;br /&gt; * @returns {Array&amp;lt;Object&amp;gt;} - K-line data&lt;br /&gt; */&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Design the function ```$.GetRecordsByLength```, which is typically used in the initial stage of strategy execution to calculate indicators based on a long period of K-line data. Once this function is executed and sufficient data is obtained, only new K-line data needs to be updated. There is no need to call this function again to retrieve excessively long K-line data, as it would result in unnecessary API calls.&lt;br /&gt;&lt;br /&gt;Therefore, it is also necessary to design an interface for subsequent data updates: ```$.UpdataRecords(e, records, period)```.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;/**&lt;br /&gt; * desc: $.UpdataRecords is the interface function of this template library, this function is used to update the K-line data.&lt;br /&gt; * @param {Object} e - exchange object&lt;br /&gt; * @param {Array&amp;lt;Object&amp;gt;} records - K-line data sources that need to be updated&lt;br /&gt; * @param {Int} period - K-line period, needs to be the same as the K-line data period passed in the records parameter&lt;br /&gt; * @returns {Bool}  - Whether the update was successful&lt;br /&gt; */&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;The next step is to implement these interface functions.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;/**&lt;br /&gt; * desc: $.GetRecordsByLength is the interface function of this template library, this function is used to get the K-line data of the specified K-line length&lt;br /&gt; * @param {Object} e - exchange object&lt;br /&gt; * @param {Int} period - K-line period, in seconds&lt;br /&gt; * @param {Int} length - Specify the length of the acquired K-line data, which is related to the exchange interface limits&lt;br /&gt; * @returns {Array&amp;lt;Object&amp;gt;} - K-line data&lt;br /&gt; */&lt;br /&gt;$.GetRecordsByLength = function(e, period, length) {&lt;br /&gt;    if (!Number.isInteger(period) || !Number.isInteger(length)) {&lt;br /&gt;        throw &amp;quot;params error!&amp;quot;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    var exchangeName = e.GetName()&lt;br /&gt;    if (exchangeName == &amp;quot;Futures_Binance&amp;quot;) {&lt;br /&gt;        return getRecordsForFuturesBinance(e, period, length)&lt;br /&gt;    } else {&lt;br /&gt;        throw &amp;quot;not support!&amp;quot;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * desc: getRecordsForFuturesBinance, the specific implementation of the function to get K-line data for Binance Futures Exchange&lt;br /&gt; * @param {Object} e - exchange object&lt;br /&gt; * @param {Int} period - K-line period, in seconds&lt;br /&gt; * @param {Int} length - Specify the length of the acquired K-line data, which is related to the exchange interface limits&lt;br /&gt; * @returns {Array&amp;lt;Object&amp;gt;} - K-line data&lt;br /&gt; */&lt;br /&gt;function getRecordsForFuturesBinance(e, period, length) {&lt;br /&gt;    var contractType = e.GetContractType()&lt;br /&gt;    var currency = e.GetCurrency()&lt;br /&gt;    var strPeriod = String(period)&lt;br /&gt;&lt;br /&gt;    var symbols = currency.split(&amp;quot;_&amp;quot;)&lt;br /&gt;    var baseCurrency = &amp;quot;&amp;quot;&lt;br /&gt;    var quoteCurrency = &amp;quot;&amp;quot;&lt;br /&gt;    if (symbols.length == 2) {&lt;br /&gt;        baseCurrency = symbols[0]&lt;br /&gt;        quoteCurrency = symbols[1]&lt;br /&gt;    } else {&lt;br /&gt;        throw &amp;quot;currency error!&amp;quot;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    var realCt = e.SetContractType(contractType)[&amp;quot;instrument&amp;quot;]&lt;br /&gt;    if (!realCt) {&lt;br /&gt;        throw &amp;quot;realCt error&amp;quot;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    // m -&amp;gt; minute; h -&amp;gt; hour; d -&amp;gt; day; w -&amp;gt; week; M -&amp;gt; month&lt;br /&gt;    var periodMap = {}&lt;br /&gt;    periodMap[(60).toString()] = &amp;quot;1m&amp;quot;&lt;br /&gt;    periodMap[(60 * 3).toString()] = &amp;quot;3m&amp;quot;&lt;br /&gt;    periodMap[(60 * 5).toString()] = &amp;quot;5m&amp;quot;&lt;br /&gt;    periodMap[(60 * 15).toString()] = &amp;quot;15m&amp;quot;&lt;br /&gt;    periodMap[(60 * 30).toString()] = &amp;quot;30m&amp;quot;&lt;br /&gt;    periodMap[(60 * 60).toString()] = &amp;quot;1h&amp;quot;&lt;br /&gt;    periodMap[(60 * 60 * 2).toString()] = &amp;quot;2h&amp;quot;&lt;br /&gt;    periodMap[(60 * 60 * 4).toString()] = &amp;quot;4h&amp;quot;&lt;br /&gt;    periodMap[(60 * 60 * 6).toString()] = &amp;quot;6h&amp;quot;&lt;br /&gt;    periodMap[(60 * 60 * 8).toString()] = &amp;quot;8h&amp;quot;&lt;br /&gt;    periodMap[(60 * 60 * 12).toString()] = &amp;quot;12h&amp;quot;&lt;br /&gt;    periodMap[(60 * 60 * 24).toString()] = &amp;quot;1d&amp;quot;&lt;br /&gt;    periodMap[(60 * 60 * 24 * 3).toString()] = &amp;quot;3d&amp;quot;&lt;br /&gt;    periodMap[(60 * 60 * 24 * 7).toString()] = &amp;quot;1w&amp;quot;&lt;br /&gt;    periodMap[(60 * 60 * 24 * 30).toString()] = &amp;quot;1M&amp;quot;&lt;br /&gt;    &lt;br /&gt;    var records = []&lt;br /&gt;    var url = &amp;quot;&amp;quot;&lt;br /&gt;    if (quoteCurrency == &amp;quot;USDT&amp;quot;) {&lt;br /&gt;        // GET &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAACnpKUNUrsvTUe50LbpAqE35ug3-ukZJm3Y63CzGHamkA" title="https://fapi.binance.com"&gt;https://fapi.binance.com&lt;/a&gt;  /fapi/v1/klines  symbol , interval , startTime , endTime , limit &lt;br /&gt;        // limit maximum value:1500&lt;br /&gt;&lt;br /&gt;        url = &amp;quot;https://fapi.binance.com/fapi/v1/klines&amp;quot;&lt;br /&gt;    } else if (quoteCurrency == &amp;quot;USD&amp;quot;) {&lt;br /&gt;        // GET &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAADNUvoAL0LDgmmOE5doywpWHwnZvqhTvgsW77wJdrXSag" title="https://dapi.binance.com"&gt;https://dapi.binance.com&lt;/a&gt;  /dapi/v1/klines  symbol , interval , startTime , endTime , limit&lt;br /&gt;        // The difference between startTime and endTime can be up to 200 days.&lt;br /&gt;        // limit maximum value:1500&lt;br /&gt;&lt;br /&gt;        url = &amp;quot;https://dapi.binance.com/dapi/v1/klines&amp;quot;&lt;br /&gt;    } else {&lt;br /&gt;        throw &amp;quot;not support!&amp;quot;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    var maxLimit = 1500&lt;br /&gt;    var interval = periodMap[strPeriod]&lt;br /&gt;    if (typeof(interval) !== &amp;quot;string&amp;quot;) {&lt;br /&gt;        throw &amp;quot;period error!&amp;quot;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    var symbol = realCt&lt;br /&gt;    var currentTS = new Date().getTime()&lt;br /&gt;&lt;br /&gt;    while (true) {&lt;br /&gt;        // Calculate limit&lt;br /&gt;        var limit = Math.min(maxLimit, length - records.length)&lt;br /&gt;        var barPeriodMillis = period * 1000&lt;br /&gt;        var rangeMillis = barPeriodMillis * limit&lt;br /&gt;        var twoHundredDaysMillis = 200 * 60 * 60 * 24 * 1000&lt;br /&gt;        &lt;br /&gt;        if (rangeMillis &amp;gt; twoHundredDaysMillis) {&lt;br /&gt;            limit = Math.floor(twoHundredDaysMillis / barPeriodMillis)&lt;br /&gt;            rangeMillis = barPeriodMillis * limit&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        var query = `symbol=${symbol}&amp;amp;interval=${interval}&amp;amp;endTime=${currentTS}&amp;amp;limit=${limit}`&lt;br /&gt;        var retHttpQuery = HttpQuery(url + &amp;quot;?&amp;quot; + query)&lt;br /&gt;        &lt;br /&gt;        var ret = null &lt;br /&gt;        try {&lt;br /&gt;            ret = JSON.parse(retHttpQuery)&lt;br /&gt;        } catch(e) {&lt;br /&gt;            Log(e)&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        if (!ret || !Array.isArray(ret)) {&lt;br /&gt;            return null&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        // When the data cannot be searched because it is beyond the searchable range of the exchange&lt;br /&gt;        if (ret.length == 0 || currentTS &amp;lt;= 0) {&lt;br /&gt;            break&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        for (var i = ret.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt;            var ele = ret[i]&lt;br /&gt;            var bar = {&lt;br /&gt;                Time : parseInt(ele[0]),&lt;br /&gt;                Open : parseFloat(ele[1]),&lt;br /&gt;                High : parseFloat(ele[2]),&lt;br /&gt;                Low : parseFloat(ele[3]), &lt;br /&gt;                Close : parseFloat(ele[4]),&lt;br /&gt;                Volume : parseFloat(ele[5])&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            records.unshift(bar)&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if (records.length &amp;gt;= length) {&lt;br /&gt;            break&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        currentTS -= rangeMillis&lt;br /&gt;        Sleep(1000)&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return records&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * desc: $.UpdataRecords is the interface function of this template library, this function is used to update the K-line data.&lt;br /&gt; * @param {Object} e - exchange object&lt;br /&gt; * @param {Array&amp;lt;Object&amp;gt;} records - K-line data sources that need to be updated&lt;br /&gt; * @param {Int} period - K-line period, needs to be the same as the K-line data period passed in the records parameter&lt;br /&gt; * @returns {Bool}  - Whether the update was successful&lt;br /&gt; */&lt;br /&gt;$.UpdataRecords = function(e, records, period) {&lt;br /&gt;    var r = e.GetRecords(period)&lt;br /&gt;    if (!r) {&lt;br /&gt;        return false &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    for (var i = 0; i &amp;lt; r.length; i++) {&lt;br /&gt;        if (r[i].Time &amp;gt; records[records.length - 1].Time) {&lt;br /&gt;            // Add a new Bar&lt;br /&gt;            records.push(r[i])&lt;br /&gt;            // Update the previous Bar&lt;br /&gt;            if (records.length - 2 &amp;gt;= 0 &amp;amp;&amp;amp; i - 1 &amp;gt;= 0 &amp;amp;&amp;amp; records[records.length - 2].Time == r[i - 1].Time) {&lt;br /&gt;                records[records.length - 2] = r[i - 1]&lt;br /&gt;            }            &lt;br /&gt;        } else if (r[i].Time == records[records.length - 1].Time) {&lt;br /&gt;            // Update Bar&lt;br /&gt;            records[records.length - 1] = r[i]&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return true&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In the template, we have only implemented support for the Binance futures contract K-line interface, i.e., the ```getRecordsForFuturesBinance``` function. It can also be extended to support K-line interfaces of other cryptocurrency exchanges.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Test Session&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As you can see, the code for implementing these functionalities in the template is not extensive, totaling less than 200 lines. After writing the template code, testing is crucial and should not be overlooked. Moreover, for data retrieval like this, it is important to conduct thorough testing.&lt;br /&gt;&lt;br /&gt;To test it, you need to copy both the &amp;quot;JavaScript Version of Pagination Query K-Line Historical Data Template&amp;quot; and the &amp;quot;Plot Library&amp;quot; templates to your strategy library (which can be found in the [Strategy Square](https://www.fmz.com/square) ). Then, create a new strategy and select these two templates.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149781
" title="https://stocksharp.com/file/149781
"&gt;https://stocksharp.com/file/149781
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149776
" title="https://stocksharp.com/file/149776
"&gt;https://stocksharp.com/file/149776
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The &amp;quot;Plot Library&amp;quot; is used, because we need to draw the obtained K-line data for observation.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;function main() {&lt;br /&gt;	LogReset(1)&lt;br /&gt;	var testPeriod = PERIOD_M5&lt;br /&gt;    Log(&amp;quot;Current exchanges tested:&amp;quot;, exchange.GetName())&lt;br /&gt;&lt;br /&gt;    // If futures, you need to set up a contract&lt;br /&gt;    exchange.SetContractType(&amp;quot;swap&amp;quot;)&lt;br /&gt;&lt;br /&gt;    // Get K-line data of specified length using $.GetRecordsByLength&lt;br /&gt;    var r = $.GetRecordsByLength(exchange, testPeriod, 8000)&lt;br /&gt;    Log(r)&lt;br /&gt;&lt;br /&gt;    // Use the Plot test for easy observation&lt;br /&gt;    $.PlotRecords(r, &amp;quot;k&amp;quot;)&lt;br /&gt;&lt;br /&gt;    // Test data&lt;br /&gt;    var diffTime = r[1].Time - r[0].Time &lt;br /&gt;    Log(&amp;quot;diffTime:&amp;quot;, diffTime, &amp;quot; ms&amp;quot;)&lt;br /&gt;    for (var i = 0; i &amp;lt; r.length; i++) {&lt;br /&gt;        for (var j = 0; j &amp;lt; r.length; j++) {&lt;br /&gt;            // Check the repeat bar&lt;br /&gt;            if (i != j &amp;amp;&amp;amp; r[i].Time == r[j].Time) {&lt;br /&gt;                Log(r[i].Time, i, r[j].Time, j)&lt;br /&gt;                throw &amp;quot;With duplicate Bar&amp;quot;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        // Check Bar continuity&lt;br /&gt;        if (i &amp;lt; r.length - 1) {            &lt;br /&gt;            if (r[i + 1].Time - r[i].Time != diffTime) {&lt;br /&gt;                Log(&amp;quot;i:&amp;quot;, i, &amp;quot;, diff:&amp;quot;, r[i + 1].Time - r[i].Time, &amp;quot;, r[i].Time:&amp;quot;, r[i].Time, &amp;quot;, r[i + 1].Time:&amp;quot;, r[i + 1].Time)&lt;br /&gt;                throw &amp;quot;Bar discontinuity&amp;quot;&lt;br /&gt;            }            &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    Log(&amp;quot;Test passed&amp;quot;)&lt;br /&gt;&lt;br /&gt;    Log(&amp;quot;The length of the data returned by the $.GetRecordsByLength function:&amp;quot;, r.length)&lt;br /&gt;&lt;br /&gt;    // Update data&lt;br /&gt;    while (true) {&lt;br /&gt;        $.UpdataRecords(exchange, r, testPeriod)&lt;br /&gt;        LogStatus(_D(), &amp;quot;r.length:&amp;quot;, r.length)&lt;br /&gt;        $.PlotRecords(r, &amp;quot;k&amp;quot;)&lt;br /&gt;        Sleep(5000)&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Here, we use the line ```var testPeriod = PERIOD_M5``` to set the 5-minute K-line period and specify to retrieve 8000 bars. Then, we can perform a plot test on the long K-line data returned by the ```var r = $.GetRecordsByLength(exchange, testPeriod, 8000)``` interface.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;    // Use the plot test for easy observation&lt;br /&gt;    $.PlotRecords(r, &amp;quot;k&amp;quot;)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;The next test for the long K-line data is:&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;    // Test data&lt;br /&gt;    var diffTime = r[1].Time - r[0].Time &lt;br /&gt;    Log(&amp;quot;diffTime:&amp;quot;, diffTime, &amp;quot; ms&amp;quot;)&lt;br /&gt;    for (var i = 0; i &amp;lt; r.length; i++) {&lt;br /&gt;        for (var j = 0; j &amp;lt; r.length; j++) {&lt;br /&gt;            // Check the repeat Bar&lt;br /&gt;            if (i != j &amp;amp;&amp;amp; r[i].Time == r[j].Time) {&lt;br /&gt;                Log(r[i].Time, i, r[j].Time, j)&lt;br /&gt;                throw &amp;quot;With duplicate Bar&amp;quot;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        // Check Bar continuity&lt;br /&gt;        if (i &amp;lt; r.length - 1) {            &lt;br /&gt;            if (r[i + 1].Time - r[i].Time != diffTime) {&lt;br /&gt;                Log(&amp;quot;i:&amp;quot;, i, &amp;quot;, diff:&amp;quot;, r[i + 1].Time - r[i].Time, &amp;quot;, r[i].Time:&amp;quot;, r[i].Time, &amp;quot;, r[i + 1].Time:&amp;quot;, r[i + 1].Time)&lt;br /&gt;                throw &amp;quot;Bar discontinuity&amp;quot;&lt;br /&gt;            }            &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    Log(&amp;quot;Test passed&amp;quot;)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;1. Check if there are any duplicate bars in the K-line data.&lt;br /&gt;2. Check the coherence of the K-line data (whether the timestamp difference between adjacent bars is equal).&lt;br /&gt;&lt;br /&gt;After passing these checks, verify if the interface used to update the K-line data, ```$.UpdateRecords(exchange, r, testPeriod)```, is functioning correctly.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;    // Update data&lt;br /&gt;    while (true) {&lt;br /&gt;        $.UpdataRecords(exchange, r, testPeriod)&lt;br /&gt;        LogStatus(_D(), &amp;quot;r.length:&amp;quot;, r.length)&lt;br /&gt;        $.PlotRecords(r, &amp;quot;k&amp;quot;)&lt;br /&gt;        Sleep(5000)&lt;br /&gt;    }&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;This code will continuously output K-line data on the strategy chart during live trading, allowing us to check if the K-line data updates and additions are functioning correctly.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149777
" title="https://stocksharp.com/file/149777
"&gt;https://stocksharp.com/file/149777
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149779
" title="https://stocksharp.com/file/149779
"&gt;https://stocksharp.com/file/149779
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Using the daily K-line data, we set it to retrieve 8000 bars (knowing that there is no market data available for 8000 days ago). This serves as a brute force test:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149780
" title="https://stocksharp.com/file/149780
"&gt;https://stocksharp.com/file/149780
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Seeing that there are only 1309 daily K-lines, compare the data on the exchange charts:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149784
" title="https://stocksharp.com/file/149784
"&gt;https://stocksharp.com/file/149784
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149778
" title="https://stocksharp.com/file/149778
"&gt;https://stocksharp.com/file/149778
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can see that the data also match.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;END&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Template address: [&amp;quot;JavaScript Version of Pagination Query K-Line Historical Data Template&amp;quot;](https://www.fmz.com/strategy/418803)&lt;br /&gt;Template address: [&amp;quot;Plot Library&amp;quot;](https://www.fmz.com/strategy/27293)&lt;br /&gt;&lt;br /&gt;The above template and strategy code are only for teaching and learning use, please optimize and modify according to the specific needs of the live trading.&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y6_A4aDhmyjxBhqKsCugSIlTWxiO7bgFlKZoLPtdmZYtkieu2Gu_qK0ZRASROOEKE4Q2KSZHRVifxSQW10_eOV-RznDsI3EbXrh1sOwa3fpqiABn93-IBrZiJ3HHyg4NFNw" title="https://blog.mathquant.com/2023/06/30/teach-you-to-design-template-class-library-to-get-k-line-data-of-specified-length.html"&gt;https://blog.mathquant.c...of-specified-length.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25637/</id>
    <title type="text">Harnessing the Power of &amp;quot;__Thread&amp;quot; Function in JavaScript: Revolutionizing Strategy Design</title>
    <published>2024-03-29T00:57:13Z</published>
    <updated>2024-03-29T00:57:13Z</updated>
    <author>
      <name>FMZ Quant</name>
      <uri>https://stocksharp.com/users/185929/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#strategy" />
    <category term="#code" />
    <category term="#data" />
    <category term="#market" />
    <category term="#javascript" />
    <category term="#crypto" />
    <category term="#FMZQuant" />
    <category term="#function" />
    <category term="#concurrent" />
    <content type="html">In the initial design of FMZ strategy, if asynchronous concurrent operations are required, the ```exchange.Go()``` function can only be used to achieve concurrent execution of FMZ encapsulated interface, and it is not possible to concurrently execute some custom operations (functions). Although this design greatly improves the efficiency of the strategy program, students who have experience in concurrent design in native programming languages often feel very uncomfortable.&lt;br /&gt;&lt;br /&gt;Even new students who use FMZ for introductory quantitative trading may not understand the use of the ```exchange.Go()``` function. Using ```exchange.Go()``` still appears to be executing statements one by one in sequentially executed code. In this article, we will explore the use of the newly added concurrent thread functionality in the FMZ platform: the ```__Thread()``` and other related functions, as well as the asynchronous design of strategy programs.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Simple concurrent design&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If we want the main thread of the strategy to run concurrently with a sub-thread executing a custom function we have written, we can use a design similar to the following code. In the strategy code, define a custom function ```GetTickerAsync()``` and write the specific functionality of this function. This function executes an infinite loop and continuously calls the FMZ API interface ```GetTicker()``` to retrieve market data.&lt;br /&gt;&lt;br /&gt;Then, use the statement ```__threadSetData(0, &amp;quot;ticker&amp;quot;, t)``` to write data to the main thread. The data name is ```ticker``` and the data value is ```t```, which is the return value of ```GetTicker()```.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;__threadSetData(0, &amp;quot;ticker&amp;quot;, t)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;After designing the custom function for concurrent thread execution, we can write the code in the ```main()``` function. At the beginning of the ```main()``` function, we use:&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;__Thread(GetTickerAsync, 0)   // GetTickerAsync is a custom function that needs to be executed concurrently, and 0 is the parameter that is passed to the GetTickerAsync function.&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Create a concurrent thread that starts executing the ```GetTickerAsync()``` function. Then, the ```main()``` function starts executing its own ```while``` loop, in which it receives the data updated by the ```GetTickerAsync()``` function and prints it:&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;var t = __threadGetData(0, &amp;quot;ticker&amp;quot;)&lt;br /&gt;Log(t)&lt;br /&gt;```&lt;br /&gt;Complete code example:&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;function GetTickerAsync(index) {&lt;br /&gt;    while (true) {&lt;br /&gt;        var t = exchanges[index].GetTicker()&lt;br /&gt;        __threadSetData(0, &amp;quot;ticker&amp;quot;, t)&lt;br /&gt;        Sleep(500)&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function main() {&lt;br /&gt;    __Thread(GetTickerAsync, 0)&lt;br /&gt;&lt;br /&gt;    while(true) {&lt;br /&gt;        var t = __threadGetData(0, &amp;quot;ticker&amp;quot;)&lt;br /&gt;        Log(t)&lt;br /&gt;        Sleep(1000)&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;Live trading test:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149772
" title="https://stocksharp.com/file/149772
"&gt;https://stocksharp.com/file/149772
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is one of the simplest application designs, so let&amp;#39;s look at some other requirement designs.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Concurrent order placement design&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We can design a function to create 10 threads simultaneously, each executing an order placement function. In the ```main()``` function, we can design a ```while``` loop to detect strategy interaction commands. When we receive the interaction command ```placeMultipleOrders```, we call the concurrent order placement function ```testPlaceMultipleOrders()```.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;if (cmd == &amp;quot;placeMultipleOrders&amp;quot;) {&lt;br /&gt;    // ...&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Add strategy interaction design on the strategy editing page by adding a button with the command: placeMultipleOrders.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149771
" title="https://stocksharp.com/file/149771
"&gt;https://stocksharp.com/file/149771
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Complete code example:&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;function placeOrder(exIndex, type, price, amount) {&lt;br /&gt;    var id = null &lt;br /&gt;    if (type == &amp;quot;Buy&amp;quot;) {&lt;br /&gt;        id = exchanges[exIndex].Buy(price, amount)&lt;br /&gt;    } else if (type == &amp;quot;Sell&amp;quot;) {&lt;br /&gt;        id = exchanges[exIndex].Sell(price, amount)&lt;br /&gt;    } else {&lt;br /&gt;        throw &amp;quot;type error! type:&amp;quot; + type&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function testPlaceMultipleOrders(index, beginPrice, endPrice, step, type, amount) {&lt;br /&gt;    Log(&amp;quot;beginPrice:&amp;quot;, beginPrice, &amp;quot;, endPrice:&amp;quot;, endPrice, &amp;quot;, step:&amp;quot;, step, &amp;quot;, type:&amp;quot;, type, &amp;quot;, amount:&amp;quot;, amount)&lt;br /&gt;    var tids = []&lt;br /&gt;    for (var p = beginPrice; p &amp;lt;= endPrice; p += step) {&lt;br /&gt;        var tid = __Thread(placeOrder, index, type, p, amount)&lt;br /&gt;        tids.push(tid)&lt;br /&gt;        Sleep(10)&lt;br /&gt;    }&lt;br /&gt;    Sleep(1000)&lt;br /&gt;    for (var i = 0; i &amp;lt; tids.length; i++) {&lt;br /&gt;        __threadTerminate(tids[i])&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function main() {&lt;br /&gt;    while(true) {&lt;br /&gt;        LogStatus(_D())&lt;br /&gt;        var cmd = GetCommand()&lt;br /&gt;        if (cmd) {&lt;br /&gt;            if (cmd == &amp;quot;placeMultipleOrders&amp;quot;) {&lt;br /&gt;                var t = _C(exchange.GetTicker)&lt;br /&gt;                var beginPrice = t.Last * 0.8&lt;br /&gt;                var endPrice = t.Last * 0.9&lt;br /&gt;                var step = t.Last * 0.01&lt;br /&gt;                testPlaceMultipleOrders(0, beginPrice, endPrice, step, &amp;quot;Buy&amp;quot;, 0.01)&lt;br /&gt;                var orders = exchange.GetOrders()&lt;br /&gt;                for (var i = 0; i &amp;lt; orders.length; i++) {&lt;br /&gt;                    Log(orders[i])&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        Sleep(1000)&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;- The test adopts pending orders, incrementing from 80% to 90% of the current price, in a simulated trading environment. Click the interaction button to trigger the test order placement.&lt;br /&gt;&lt;br /&gt;After clicking the &amp;quot;placeMultipleOrders&amp;quot; button, a message is prompted: The placeMultipleOrders command was sent successfully, please wait for a response from the live trading!&lt;br /&gt;&lt;br /&gt;- Strategy log displays concurrent order placement operations:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149770
" title="https://stocksharp.com/file/149770
"&gt;https://stocksharp.com/file/149770
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Create a WebSocket connection in a concurrent thread execution function&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This requirement was raised by an FMZ user who wants a simple example demonstrating how to use a **WebSocket** connection in concurrent threads and how to pass data to the ```main()``` function in the main thread.&lt;br /&gt;&lt;br /&gt;Actually, it&amp;#39;s quite simple and similar to creating concurrent threads in the previous examples. The only difference is that we use the ```__threadPeekMessage()``` and ```__threadPostMessage()``` functions for inter-thread communication. Taking the WebSocket API call for the Binance exchange as an example, we also need to handle the closing operation of the WebSocket connection. The following example demonstrates how to notify a concurrent thread to stop.&lt;br /&gt;&lt;br /&gt;Complete code example:&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;var tid = null &lt;br /&gt;&lt;br /&gt;function createWS() {&lt;br /&gt;    // wss://stream.binance.com:9443/ws/&amp;lt;streamName&amp;gt; , &amp;lt;symbol&amp;gt;@ticker&lt;br /&gt;    &lt;br /&gt;    var stream = &amp;quot;wss://stream.binance.com:9443/ws/btcusdt@ticker&amp;quot;    &lt;br /&gt;    var ws = Dial(stream)&lt;br /&gt;    Log(&amp;quot;Create a WS connection:&amp;quot;, stream)&lt;br /&gt;    &lt;br /&gt;    while (true) {&lt;br /&gt;        var data = ws.read()&lt;br /&gt;        if (data) {            &lt;br /&gt;            __threadPostMessage(0, data)&lt;br /&gt;        }&lt;br /&gt;        Log(&amp;quot;receiving data pushed by the WS link, data:&amp;quot;, data)&lt;br /&gt;        &lt;br /&gt;        // __threadPeekMessage timeout parameter set to -1, no blocking&lt;br /&gt;        var msg = __threadPeekMessage(-1)&lt;br /&gt;        if (msg) {&lt;br /&gt;            if (msg == &amp;quot;stop&amp;quot;) {&lt;br /&gt;                Log(&amp;quot;Concurrent Thread Id:&amp;quot;, __threadId(), &amp;quot;Received stop command&amp;quot;)&lt;br /&gt;                break&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    Log(&amp;quot;Concurrent threads finish execution, close ws connection&amp;quot;)&lt;br /&gt;    ws.close()&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function main() {&lt;br /&gt;    tid = __Thread(createWS)&lt;br /&gt;    Log(&amp;quot;Create concurrent threads, thread Id:&amp;quot;, tid)&lt;br /&gt;&lt;br /&gt;    while(true) {&lt;br /&gt;        // __threadPeekMessage&amp;#39;s timeout parameter is set to 0, blocking for data&lt;br /&gt;        var data = __threadPeekMessage(0)&lt;br /&gt;        Log(&amp;quot;Received from concurrent thread&amp;quot;, &amp;quot;, Id:&amp;quot;, tid, &amp;quot;, the data sent, data:&amp;quot;, data, &amp;quot;#FF0000&amp;quot;)&lt;br /&gt;        &lt;br /&gt;        var tbl = {&lt;br /&gt;            type : &amp;quot;table&amp;quot;, &lt;br /&gt;            title : &amp;quot;&amp;lt;symbol&amp;gt;@ticker channel push message&amp;quot;,&lt;br /&gt;            cols : [&amp;quot;Event Type&amp;quot;, &amp;quot;Event Time&amp;quot;, &amp;quot;Trading Pairs&amp;quot;, &amp;quot;24 Hour Price Change&amp;quot;, &amp;quot;24 Hour Price Change %&amp;quot;, &amp;quot;Average Price&amp;quot;, &amp;quot;Last Traded Price&amp;quot;, &amp;quot;Volume in 24 Hours&amp;quot;, &amp;quot;Turnover in 24 Hours&amp;quot;],&lt;br /&gt;            rows : []&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        try {&lt;br /&gt;            data = JSON.parse(data)&lt;br /&gt;            tbl.rows.push([data.e, _D(data.E), data.s, data.p, data.P, data.w, data.c, data.v, data.q])&lt;br /&gt;        } catch (e) {&lt;br /&gt;            Log(&amp;quot;e.name:&amp;quot;, e.name, &amp;quot;e.stack:&amp;quot;, e.stack, &amp;quot;e.message:&amp;quot;, e.message)&lt;br /&gt;        }&lt;br /&gt;        LogStatus(_D(), &amp;quot;\n`&amp;quot; + JSON.stringify(tbl) + &amp;quot;`&amp;quot;)&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function onexit() {&lt;br /&gt;    Log(&amp;quot;Finalize function, send a stop command to the concurrent thread with ID &amp;quot;, tid,&amp;quot;&amp;quot;)&lt;br /&gt;    __threadPostMessage(tid, &amp;quot;stop&amp;quot;)&lt;br /&gt;    Log(&amp;quot;Wait for the concurrent thread with ID &amp;quot;, tid, &amp;quot; to stop&amp;quot;)&lt;br /&gt;    __threadJoin(tid)&lt;br /&gt;    Log(&amp;quot;Finalize function execution completed&amp;quot;)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;During live trading testing, we can see that the ```main()``` function continuously receives market data from WebSocket connections created by concurrent threads.&lt;br /&gt;&lt;br /&gt;When stopping the live trading strategy, the finalize function will start working.&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y617vF53pddqvVtFdQtpH2PQSabBGD9uZFmW0dEaTL4C4X9exR4I1YfxV5FN6lnVg61qA0EEB5iGC7C63GaycW_kAa3bMZc_LTaxnZoPhWPNu" title="https://blog.mathquant.com/2023/07/07/application-of-the-__thread-function-in-javascript-strategy-design.html"&gt;https://blog.mathquant.c...ipt-strategy-design.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25630/</id>
    <title type="text">Mastering Uniswap V3: Advanced Strategies for Exchange Pool Liquidity (Part 1)</title>
    <published>2024-03-26T09:17:00Z</published>
    <updated>2024-03-26T09:17:00Z</updated>
    <author>
      <name>FMZQuant</name>
      <uri>https://stocksharp.com/users/185759/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#strategy" />
    <category term="#code" />
    <category term="#fmz" />
    <category term="#contract" />
    <category term="#crypto" />
    <category term="#position" />
    <category term="#exhange" />
    <category term="#uniswapV3" />
    <category term="#token" />
    <content type="html">&lt;b&gt;NonfungiblePositionManager Contract in Uniswap V3&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;When we add liquidity to the Uniswap V3 liquidity pool (trading pair pool), the NonfungiblePositionManager contract returns a minted NFT to us as proof of the liquidity addition.&lt;br /&gt;&lt;br /&gt;The first step is to use the router contract to get the address of the corresponding NonfungiblePositionManager contract, and then use the balanceOf method of the NonfungiblePositionManager contract to get the number of position NFTs for the specified wallet address.&lt;br /&gt;&lt;br /&gt;Then use the tokenOfOwnerByIndex method to get the tokenId of these position NFTs, with these tokenId, you can use the positions method to continue to query the specific details of these positions.&lt;br /&gt;&lt;br /&gt;The following test code:&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;// Uniswap ABI&lt;br /&gt;const ABI_UniswapV3Router = `[{&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;}]`&lt;br /&gt;const ABI_NonfungiblePositionManager = `[{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;_factory&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;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;_tokenDescriptor_&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;anonymous&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;indexed&amp;quot;:true,&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;owner&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;approved&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&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;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;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;owner&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;operator&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;bool&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;approved&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;ApprovalForAll&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;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;indexed&amp;quot;:false,&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;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount1&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;Collect&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;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;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;uint128&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;liquidity&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint128&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount1&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;DecreaseLiquidity&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;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;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;uint128&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;liquidity&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint128&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount1&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;IncreaseLiquidity&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;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;from&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&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;indexed&amp;quot;:true,&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;name&amp;quot;:&amp;quot;Transfer&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;event&amp;quot;},{&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;DOMAIN_SEPARATOR&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&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;PERMIT_TYPEHASH&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&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;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;to&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;name&amp;quot;:&amp;quot;approve&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;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;owner&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;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&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;baseURI&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;pure&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;tokenId&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;burn&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;components&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;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;uint128&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount0Max&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint128&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint128&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount1Max&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint128&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct INonfungiblePositionManager.CollectParams&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;collect&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount0&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;amount1&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;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;uint160&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;sqrtPriceX96&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint160&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;createAndInitializePoolIfNecessary&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;pool&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&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;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;uint128&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;liquidity&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint128&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;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;struct INonfungiblePositionManager.DecreaseLiquidityParams&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;decreaseLiquidity&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount0&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;amount1&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;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;name&amp;quot;:&amp;quot;getApproved&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;components&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;amount0Desired&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;amount1Desired&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;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;struct INonfungiblePositionManager.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;uint128&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;liquidity&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint128&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount0&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;amount1&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;owner&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;operator&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;isApprovedForAll&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bool&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&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;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;amount0Desired&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;amount1Desired&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;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;deadline&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct INonfungiblePositionManager.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;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;uint128&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;liquidity&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint128&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount0&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;amount1&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;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;name&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&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;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;name&amp;quot;:&amp;quot;ownerOf&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;spender&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;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;permit&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;tokenId&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;positions&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint96&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;nonce&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint96&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;operator&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;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;uint128&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;liquidity&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint128&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeGrowthInside0LastX128&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;feeGrowthInside1LastX128&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint128&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tokensOwed0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint128&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint128&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tokensOwed1&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint128&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;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;from&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;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;name&amp;quot;:&amp;quot;safeTransferFrom&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;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;from&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;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;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;safeTransferFrom&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;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;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;operator&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bool&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;approved&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;setApprovalForAll&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;bytes4&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;interfaceId&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes4&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;supportsInterface&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bool&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&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;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;name&amp;quot;:&amp;quot;symbol&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&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;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;index&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;tokenByIndex&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&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;owner&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;index&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;tokenOfOwnerByIndex&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&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;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;name&amp;quot;:&amp;quot;tokenURI&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&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;totalSupply&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&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;from&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;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;name&amp;quot;:&amp;quot;transferFrom&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;amount0Owed&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;amount1Owed&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;uniswapV3MintCallback&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;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;receive&amp;quot;}]`&lt;br /&gt;const ABI_Pool = &amp;#39;[{\&amp;quot;inputs\&amp;quot;:[],\&amp;quot;stateMutability\&amp;quot;:\&amp;quot;nonpayable\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;constructor\&amp;quot;},{\&amp;quot;anonymous\&amp;quot;:false,\&amp;quot;inputs\&amp;quot;:[{\&amp;quot;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Burn\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Collect\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;CollectProtocol\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;paid0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;paid1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Flash\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNextOld\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNextNew\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;IncreaseObservationCardinalityNext\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tick\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Initialize\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Mint\&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;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol0Old\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol1Old\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol0New\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol1New\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;SetFeeProtocol\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sender\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidity\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tick\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;Swap\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;event\&amp;quot;},{\&amp;quot;inputs\&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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;burn\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&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;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;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;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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;collect\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1Requested\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;collectProtocol\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;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;fee\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint24\&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;feeGrowthGlobal0X128\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;feeGrowthGlobal1X128\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;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;amount0\&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;amount1\&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;flash\&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;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNext\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;increaseObservationCardinalityNext\&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;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;initialize\&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;name\&amp;quot;:\&amp;quot;liquidity\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;maxLiquidityPerTick\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;recipient\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&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;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;mint\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&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;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;observations\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;blockTimestamp\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulative\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityCumulativeX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;initialized\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&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;uint32[]\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsAgos\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32[]\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;observe\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56[]\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulatives\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56[]\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160[]\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityCumulativeX128s\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160[]\&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;bytes32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bytes32\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;positions\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidity\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeGrowthInside0LastX128\&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;feeGrowthInside1LastX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tokensOwed0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tokensOwed1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;protocolFees\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;token0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;token1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&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;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol0\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;setFeeProtocol\&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;name\&amp;quot;:\&amp;quot;slot0\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;sqrtPriceX96\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tick\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationIndex\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinality\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;observationCardinalityNext\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint16\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint8\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeProtocol\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint8\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;unlocked\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&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;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;name\&amp;quot;:\&amp;quot;snapshotCumulativesInside\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulativeInside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityInsideX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsInside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32\&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;recipient\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;zeroForOne\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amountSpecified\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&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;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;swap\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;amount0\&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;amount1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int256\&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;int16\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int16\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;tickBitmap\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&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;tickSpacing\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&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;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;ticks\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidityGross\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int128\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;liquidityNet\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int128\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint256\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;feeGrowthOutside0X128\&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;feeGrowthOutside1X128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint256\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int56\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickCumulativeOutside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int56\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint160\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsPerLiquidityOutsideX128\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint160\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;uint32\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;secondsOutside\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint32\&amp;quot;},{\&amp;quot;internalType\&amp;quot;:\&amp;quot;bool\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;initialized\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;bool\&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;token0\&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;token1\&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;#39;&lt;br /&gt;const ABI_Factory = &amp;#39;[{\&amp;quot;inputs\&amp;quot;:[],\&amp;quot;stateMutability\&amp;quot;:\&amp;quot;nonpayable\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;constructor\&amp;quot;},{\&amp;quot;anonymous\&amp;quot;:false,\&amp;quot;inputs\&amp;quot;:[{\&amp;quot;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;FeeAmountEnabled\&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;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;oldOwner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:true,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;newOwner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;OwnerChanged\&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;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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:true,\&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;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;},{\&amp;quot;indexed\&amp;quot;:false,\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;pool\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;PoolCreated\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;event\&amp;quot;},{\&amp;quot;inputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;tokenA\&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;tokenB\&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;name\&amp;quot;:\&amp;quot;createPool\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;pool\&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;function\&amp;quot;},{\&amp;quot;inputs\&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;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;enableFeeAmount\&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;uint24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;feeAmountTickSpacing\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;int24\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&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;\&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;\&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;\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;uint24\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;getPool\&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;owner\&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;parameters\&amp;quot;,\&amp;quot;outputs\&amp;quot;:[{\&amp;quot;internalType\&amp;quot;:\&amp;quot;address\&amp;quot;,\&amp;quot;name\&amp;quot;:\&amp;quot;factory\&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;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;tickSpacing\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;int24\&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;_owner\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;address\&amp;quot;}],\&amp;quot;name\&amp;quot;:\&amp;quot;setOwner\&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;#39;&lt;br /&gt;&lt;br /&gt;// Uniswap contract address&lt;br /&gt;const UniswapV3RouterAddress = &amp;quot;0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45&amp;quot;&lt;br /&gt;const ContractV3Factory = &amp;quot;0x1F98431c8aD98523631AE4a59f267346ea31F984&amp;quot;&lt;br /&gt;&lt;br /&gt;// common constant&lt;br /&gt;const TWO = BigInt(2)&lt;br /&gt;const Q192 = (TWO ** BigInt(96)) ** TWO&lt;br /&gt;const Q96 = (TWO ** BigInt(96))&lt;br /&gt;&lt;br /&gt;// Convert to readable amount&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;&lt;br /&gt;// Reverse conversion from readable amount to amount used for passing parameters and calculations&lt;br /&gt;function toInnerAmount(n, decimals) {&lt;br /&gt;    return (BigDecimal(n) * BigDecimal(Math.pow(10, decimals))).toFixed(0)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function main(){&lt;br /&gt;    // The address of the wallet to be searched&lt;br /&gt;    // const walletAddress = exchange.IO(&amp;quot;address&amp;quot;)&lt;br /&gt;    const walletAddress = &amp;quot;0x28df8b987BE232bA33FdFB8Fc5058C1592A3db26&amp;quot;&lt;br /&gt;&lt;br /&gt;    // Get the address of Uniswap V3&amp;#39;s positionManager contract&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, UniswapV3RouterAddress, ABI_UniswapV3Router)&lt;br /&gt;    const NonfungiblePositionManagerAddress = exchange.IO(&amp;quot;api&amp;quot;, UniswapV3RouterAddress, &amp;quot;positionManager&amp;quot;)&lt;br /&gt;    Log(&amp;quot;NonfungiblePositionManagerAddress:&amp;quot;, NonfungiblePositionManagerAddress)&lt;br /&gt;&lt;br /&gt;    // Register ABI for positionManager contracts&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, NonfungiblePositionManagerAddress, ABI_NonfungiblePositionManager)&lt;br /&gt;&lt;br /&gt;    // Query the number of Uniswap V3 positions NFT owned by the current account&lt;br /&gt;    var nftBalance = exchange.IO(&amp;quot;api&amp;quot;, NonfungiblePositionManagerAddress, &amp;quot;balanceOf&amp;quot;, walletAddress)&lt;br /&gt;    Log(&amp;quot;nftBalance:&amp;quot;, nftBalance)&lt;br /&gt;    &lt;br /&gt;    // Query the TokenId of these NFTs&lt;br /&gt;    var nftTokenIds = []&lt;br /&gt;    for (var i = 0 ; i &amp;lt; nftBalance; i++) {&lt;br /&gt;        var nftTokenId = exchange.IO(&amp;quot;api&amp;quot;, NonfungiblePositionManagerAddress, &amp;quot;tokenOfOwnerByIndex&amp;quot;, walletAddress, i)&lt;br /&gt;        nftTokenIds.push(nftTokenId)&lt;br /&gt;        Log(&amp;quot;nftTokenId:&amp;quot;, nftTokenId)&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Query liquidity position details based on the tokenId of the positions NFT&lt;br /&gt;    var positions = []&lt;br /&gt;    for (var i = 0; i &amp;lt; nftTokenIds.length; i++) {&lt;br /&gt;        var pos = exchange.IO(&amp;quot;api&amp;quot;, NonfungiblePositionManagerAddress, &amp;quot;positions&amp;quot;, nftTokenIds[i])        &lt;br /&gt;        Log(&amp;quot;pos:&amp;quot;, pos)&lt;br /&gt;&lt;br /&gt;        // Parsing position data&lt;br /&gt;        positions.push(parsePosData(pos))&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    var tbl = {&lt;br /&gt;        type : &amp;quot;table&amp;quot;,&lt;br /&gt;        title : &amp;quot;LP&amp;quot;,&lt;br /&gt;        cols : [&amp;quot;range(token0 valuation)&amp;quot;, &amp;quot;token0&amp;quot;, &amp;quot;token1&amp;quot;, &amp;quot;fee&amp;quot;, &amp;quot;lowerPrice(tickLower)&amp;quot;, &amp;quot;upperPrice(tickUpper)&amp;quot;, &amp;quot;liquidity&amp;quot;, &amp;quot;amount0&amp;quot;, &amp;quot;amount1&amp;quot;],&lt;br /&gt;        rows : positions&lt;br /&gt;    }&lt;br /&gt;    LogStatus(&amp;quot;`&amp;quot; + JSON.stringify(tbl) + &amp;quot;`&amp;quot;)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Record information about tokens queried through coingecko.com&lt;br /&gt;var tokens = []&lt;br /&gt;function init() {&lt;br /&gt;    // When initializing, get information about all tokens to query the&lt;br /&gt;    var res = JSON.parse(HttpQuery(&amp;quot;https://tokens.coingecko.com/uniswap/all.json&amp;quot;))&lt;br /&gt;    Log(&amp;quot;fetch&amp;quot;, res.tokens.length, &amp;quot;tokens from&amp;quot;, res.name)&lt;br /&gt;    _.each(res.tokens, function(token) {&lt;br /&gt;        tokens.push({&lt;br /&gt;            name : token.name,&lt;br /&gt;            symbol : token.symbol,&lt;br /&gt;            decimals : token.decimals,&lt;br /&gt;            address : token.address&lt;br /&gt;        })&lt;br /&gt;    })&lt;br /&gt;    Log(&amp;quot;tokens:&amp;quot;, tokens)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function parsePosData(posData) {&lt;br /&gt;    /*&lt;br /&gt;    {&lt;br /&gt;        &amp;quot;nonce&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;        &amp;quot;operator&amp;quot;: &amp;quot;0x0000000000000000000000000000000000000000&amp;quot;,&lt;br /&gt;        &amp;quot;token1&amp;quot;: &amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;,&lt;br /&gt;        &amp;quot;fee&amp;quot;: &amp;quot;3000&amp;quot;,&lt;br /&gt;        &amp;quot;feeGrowthInside0LastX128&amp;quot;: &amp;quot;552824104363438506727784685971981736468&amp;quot;,&lt;br /&gt;        &amp;quot;feeGrowthInside1LastX128&amp;quot;: &amp;quot;2419576808699564757520565912733367379&amp;quot;,&lt;br /&gt;        &amp;quot;tokensOwed0&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;        &amp;quot;tokensOwed1&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;        &amp;quot;token0&amp;quot;: &amp;quot;0x1f9840a85d5af5bf1d1762f925bdaddc4201f984&amp;quot;,&lt;br /&gt;        &amp;quot;tickLower&amp;quot;: &amp;quot;-62160&amp;quot;,&lt;br /&gt;        &amp;quot;tickUpper&amp;quot;: &amp;quot;-41280&amp;quot;,&lt;br /&gt;        &amp;quot;liquidity&amp;quot;: &amp;quot;19090316141441365693&amp;quot;&lt;br /&gt;    }&lt;br /&gt;    */&lt;br /&gt;    &lt;br /&gt;    var token0Symbol = null&lt;br /&gt;    var token1Symbol = null&lt;br /&gt;    // Determine the token according to the address of the token, record the information about the token&lt;br /&gt;    for (var i in tokens) {&lt;br /&gt;        if (tokens[i].address.toLowerCase() == posData.token0.toLowerCase()) {&lt;br /&gt;            token0Symbol = tokens[i]&lt;br /&gt;        } else if (tokens[i].address.toLowerCase() == posData.token1.toLowerCase()) {&lt;br /&gt;            token1Symbol = tokens[i]&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (!token0Symbol || !token1Symbol) {&lt;br /&gt;    	Log(&amp;quot;token0Symbol:&amp;quot;, token0Symbol, &amp;quot;, token1Symbol:&amp;quot;, token1Symbol)&lt;br /&gt;        throw &amp;quot;token not found&amp;quot;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // get Pool , obtaining data about the exchange pool&lt;br /&gt;    var poolInfo = getPool(token0Symbol.address, token1Symbol.address, posData.fee)&lt;br /&gt;    Log(&amp;quot;poolInfo:&amp;quot;, poolInfo)&lt;br /&gt;    /* Data examples&lt;br /&gt;    {&lt;br /&gt;        &amp;quot;slot0&amp;quot;:{&lt;br /&gt;            &amp;quot;sqrtPriceX96&amp;quot;:&amp;quot;4403124416947951698847768103&amp;quot;,&amp;quot;tick&amp;quot;:&amp;quot;-57804&amp;quot;,&amp;quot;observationIndex&amp;quot;:136,&amp;quot;observationCardinality&amp;quot;:300,&lt;br /&gt;            &amp;quot;observationCardinalityNext&amp;quot;:300,&amp;quot;feeProtocol&amp;quot;:0,&amp;quot;unlocked&amp;quot;:true&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    */&lt;br /&gt;    &lt;br /&gt;    // Calculate token0Amount, token1Amount&lt;br /&gt;    var currentTick = parseInt(poolInfo.slot0.tick)&lt;br /&gt;    var lowerPrice = 1.0001 ** posData.tickLower&lt;br /&gt;    var upperPrice = 1.0001 ** posData.tickUpper&lt;br /&gt;    var sqrtRatioA = Math.sqrt(lowerPrice)&lt;br /&gt;    var sqrtRatioB = Math.sqrt(upperPrice)&lt;br /&gt;    var sqrtPrice = Number(BigFloat(poolInfo.slot0.sqrtPriceX96) / Q96)&lt;br /&gt;    &lt;br /&gt;    var amount0wei = 0&lt;br /&gt;    var amount1wei = 0&lt;br /&gt;    if (currentTick &amp;lt;= posData.tickLower) {&lt;br /&gt;        amount0wei = Math.floor(posData.liquidity * ((sqrtRatioB - sqrtRatioA) / (sqrtRatioA * sqrtRatioB)))&lt;br /&gt;    } else if (currentTick &amp;gt; posData.tickUpper) {&lt;br /&gt;        amount1wei = Math.floor(posData.liquidity * (sqrtRatioB - sqrtRatioA))&lt;br /&gt;    } else if (currentTick &amp;gt;= posData.tickLower &amp;amp;&amp;amp; currentTick &amp;lt; posData.tickUpper) {&lt;br /&gt;        amount0wei = Math.floor(posData.liquidity * ((sqrtRatioB - sqrtPrice) / (sqrtPrice * sqrtRatioB)))&lt;br /&gt;        amount1wei = Math.floor(posData.liquidity * (sqrtPrice - sqrtRatioA))&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    var rangeToken0 = (1.0001 ** -posData.tickUpper) + &amp;quot; ~ &amp;quot; + (1.0001 ** -posData.tickLower)&lt;br /&gt;    var amount0 = toAmount(amount0wei, token0Symbol.decimals)&lt;br /&gt;    var amount1 = toAmount(amount1wei, token1Symbol.decimals)&lt;br /&gt;&lt;br /&gt;    return [rangeToken0, token0Symbol.symbol, token1Symbol.symbol, posData.fee / 10000 + &amp;quot;%&amp;quot;, &lt;br /&gt;        `${lowerPrice}(tickLower:${posData.tickLower})`, `${upperPrice}(tickUpper:${posData.tickUpper})`, posData.liquidity, &lt;br /&gt;            amount0, amount1]&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function getPool(token0Address, token1Address, fee) {&lt;br /&gt;    if (BigInt(token0Address) &amp;gt; BigInt(token1Address)) {&lt;br /&gt;        var tmp = token0Address&lt;br /&gt;        token0Address = token1Address&lt;br /&gt;        token1Address = tmp&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    // Calculating the contract address of an exchange pool using Uniswap&amp;#39;s factory contract&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, ContractV3Factory, ABI_Factory)&lt;br /&gt;    var poolAddress = exchange.IO(&amp;quot;api&amp;quot;, ContractV3Factory, &amp;quot;getPool&amp;quot;, token0Address, token1Address, fee)&lt;br /&gt;    if (!poolAddress) {&lt;br /&gt;        throw &amp;quot;getPool failed&amp;quot;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    // ABI for registered pool contracts&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, poolAddress, ABI_Pool)&lt;br /&gt;    &lt;br /&gt;    // Call the pool contract&amp;#39;s slot0 method to query the current exchange pool&amp;#39;s data&lt;br /&gt;    var slot0 = exchange.IO(&amp;quot;api&amp;quot;, poolAddress, &amp;quot;slot0&amp;quot;)&lt;br /&gt;    if (!slot0) {&lt;br /&gt;    	throw &amp;quot;get slot0 failed&amp;quot;&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    return {&lt;br /&gt;    	&amp;quot;slot0&amp;quot;: slot0&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;The retrieved liquidity position information (which needs further parsing):&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;{&lt;br /&gt;	&amp;quot;nonce&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;	&amp;quot;operator&amp;quot;: &amp;quot;0x0000000000000000000000000000000000000000&amp;quot;,&lt;br /&gt;	&amp;quot;token1&amp;quot;: &amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;,&lt;br /&gt;	&amp;quot;fee&amp;quot;: &amp;quot;3000&amp;quot;,&lt;br /&gt;	&amp;quot;feeGrowthInside0LastX128&amp;quot;: &amp;quot;552824104363438506727784685971981736468&amp;quot;,&lt;br /&gt;	&amp;quot;feeGrowthInside1LastX128&amp;quot;: &amp;quot;2419576808699564757520565912733367379&amp;quot;,&lt;br /&gt;	&amp;quot;tokensOwed0&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;	&amp;quot;tokensOwed1&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;	&amp;quot;token0&amp;quot;: &amp;quot;0x1f9840a85d5af5bf1d1762f925bdaddc4201f984&amp;quot;,&lt;br /&gt;	&amp;quot;tickLower&amp;quot;: &amp;quot;-62160&amp;quot;,&lt;br /&gt;	&amp;quot;tickUpper&amp;quot;: &amp;quot;-41280&amp;quot;,&lt;br /&gt;	&amp;quot;liquidity&amp;quot;: &amp;quot;19090316141441365693&amp;quot;&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Parsing Liquidity Holdings for Market Making Ranges&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The positions method of Uniswap&amp;#39;s NonfungiblePositionManager contract returns tickLower and tickUpper in the liquidity position data. In Uniswap V3, liquidity can be specified within a range, whereas the initial design of Uniswap had uniform distribution of liquidity. The specification of a liquidity range in subsequent versions is aimed at improving the utilization of liquidity capital.&lt;br /&gt;&lt;br /&gt;&amp;gt; tickLower: The lower end of the tick range for the position&lt;br /&gt;&amp;gt; tickUpper: The higher end of the tick range for the position&lt;br /&gt;&lt;br /&gt;tickLower and tickUpper represent the upper and lower limits of the liquidity. Referring to the Uniswap documentation and its complex formulas, tickLower and tickUpper are essentially price boundaries recorded in exponential form. So, how can we calculate the price range for market-making from these &amp;quot;exponential boundaries&amp;quot;?&lt;br /&gt;&lt;br /&gt;It&amp;#39;s quite simple. Uniswap uses a base of ```1.0001```. Lower price: ```lowerPrice = 1.0001 ** tickLower```; Upper price: ```upperPrice = 1.0001 ** tickUpper```. The ```**``` operator represents exponentiation. For example, ```1.0001 ** 100``` calculates 1.0001 raised to the power of 100.&lt;br /&gt;&lt;br /&gt;This calculated price range is denominated in token1. But what if we want to see the price range denominated in token0?&lt;br /&gt;&lt;br /&gt;It can be calculated as follows:&lt;br /&gt;Lower price: 1.0001 ** -tickUpper&lt;br /&gt;Upper price: 1.0001 ** -tickLower&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149684
" title="https://stocksharp.com/file/149684
"&gt;https://stocksharp.com/file/149684
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Compare this to the NFT position we looked up on the chain:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149685
" title="https://stocksharp.com/file/149685
"&gt;https://stocksharp.com/file/149685
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149686
" title="https://stocksharp.com/file/149686
"&gt;https://stocksharp.com/file/149686
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149687
" title="https://stocksharp.com/file/149687
"&gt;https://stocksharp.com/file/149687
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Parsing the Asset Value in the Current Liquidity Position&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In addition to tickUpper and tickLower, the positions method of Uniswap&amp;#39;s NonfungiblePositionManager contract returns another important data: liquidity.&lt;br /&gt;&lt;br /&gt;By combining the liquidity, tickUpper, tickLower data from the position information with the current price data in the exchange pool, we can calculate the asset value in the current liquidity position.&lt;br /&gt;&lt;br /&gt;You may wonder why we need to know the current price in the exchange pool to make the calculation.&lt;br /&gt;&lt;br /&gt;This is because once you add liquidity, any price changes within the effective range of your liquidity position imply that your assets have been exchanged. If the current exchange price is not within the effective range of your liquidity provision, there won&amp;#39;t be any changes. Therefore, there are three scenarios to consider when calculating:&lt;br /&gt;&lt;br /&gt;- The tick of the current price is less than tickLower.&lt;br /&gt;- The tick of the current price is greater than tickUpper.&lt;br /&gt;- The tick of the current price is within the range of tickLower to tickUpper.&lt;br /&gt;&lt;br /&gt;This corresponds to the following calculation and processing in the code:&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;    if (currentTick &amp;lt;= posData.tickLower) {&lt;br /&gt;        amount0wei = Math.floor(posData.liquidity * ((sqrtRatioB - sqrtRatioA) / (sqrtRatioA * sqrtRatioB)))&lt;br /&gt;    } else if (currentTick &amp;gt; posData.tickUpper) {&lt;br /&gt;        amount1wei = Math.floor(posData.liquidity * (sqrtRatioB - sqrtRatioA))&lt;br /&gt;    } else if (currentTick &amp;gt;= posData.tickLower &amp;amp;&amp;amp; currentTick &amp;lt; posData.tickUpper) {&lt;br /&gt;        amount0wei = Math.floor(posData.liquidity * ((sqrtRatioB - sqrtPrice) / (sqrtPrice * sqrtRatioB)))&lt;br /&gt;        amount1wei = Math.floor(posData.liquidity * (sqrtPrice - sqrtRatioA))&lt;br /&gt;    }&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;To perform the above calculations, we need to obtain the tick of the current price, which can be obtained directly from the pool contract. To get the address of the pool contract, we can use the getPool method of Uniswap&amp;#39;s factory contract. By using the ```slot0``` method of the pool contract, we can retrieve the current price information, including the tick value we need.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149688
" title="https://stocksharp.com/file/149688
"&gt;https://stocksharp.com/file/149688
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y6x6iLLUqIMFJAk1dYxX-PKODE2xLmQn5pc1B_afih5X8YEwANTJSRfvIDDF9IQbcJWCPI-QGIvuoune2CBaw7e3WRpW5WimOlsXMnXhuqcv5LhUdCfs_gock8XjlwRdMqQ" title="https://blog.mathquant.com/2023/07/21/fmz-quant-uniswap-v3-exchange-pool-liquidity-related-operations-guide-part-1.html"&gt;https://blog.mathquant.c...ations-guide-part-1.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25629/</id>
    <title type="text">Thoughts on High-Frequency Trading Strategies (5)</title>
    <published>2024-03-26T07:20:05Z</published>
    <updated>2024-03-26T07:20:05Z</updated>
    <author>
      <name>FMZQuant</name>
      <uri>https://stocksharp.com/users/185759/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#strategy" />
    <category term="#data" />
    <category term="#market" />
    <category term="#fmz" />
    <category term="#exchange" />
    <category term="#highfrequency" />
    <category term="#parameter" />
    <category term="#crypto" />
    <category term="#order" />
    <content type="html">In the previous article, various methods for calculating mid-price were introduced, and a revised mid-price was proposed. In this article, we will delve deeper into this topic.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Data Required&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We need order flow data and depth data for the top ten levels of the order book, collected from live trading with an update frequency of 100ms. For the sake of simplicity, we will not include real-time updates for the bid and ask prices. To reduce the data size, we have kept only 100,000 rows of depth data and separated the tick-by-tick market data into individual columns.&lt;br /&gt;&lt;br /&gt;In [1]:&lt;br /&gt;```&lt;br /&gt;from datetime import date,datetime&lt;br /&gt;import time&lt;br /&gt;import pandas as pd&lt;br /&gt;import numpy as np&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;import ast&lt;br /&gt;%matplotlib inline&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [2]:&lt;br /&gt;```&lt;br /&gt;tick_size = 0.0001&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [3]:&lt;br /&gt;```&lt;br /&gt;trades = pd.read_csv(&amp;#39;YGGUSDT_aggTrade.csv&amp;#39;,names=[&amp;#39;type&amp;#39;,&amp;#39;event_time&amp;#39;, &amp;#39;agg_trade_id&amp;#39;,&amp;#39;symbol&amp;#39;, &amp;#39;price&amp;#39;, &amp;#39;quantity&amp;#39;, &amp;#39;first_trade_id&amp;#39;, &amp;#39;last_trade_id&amp;#39;,&lt;br /&gt;       &amp;#39;transact_time&amp;#39;, &amp;#39;is_buyer_maker&amp;#39;])&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [4]:&lt;br /&gt;```&lt;br /&gt;trades = trades.groupby([&amp;#39;transact_time&amp;#39;,&amp;#39;is_buyer_maker&amp;#39;]).agg({&lt;br /&gt;    &amp;#39;transact_time&amp;#39;:&amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;agg_trade_id&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;price&amp;#39;: &amp;#39;first&amp;#39;,&lt;br /&gt;    &amp;#39;quantity&amp;#39;: &amp;#39;sum&amp;#39;,&lt;br /&gt;    &amp;#39;first_trade_id&amp;#39;: &amp;#39;first&amp;#39;,&lt;br /&gt;    &amp;#39;last_trade_id&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;is_buyer_maker&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;})&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [5]:&lt;br /&gt;```&lt;br /&gt;trades.index = pd.to_datetime(trades[&amp;#39;transact_time&amp;#39;], unit=&amp;#39;ms&amp;#39;)&lt;br /&gt;trades.index.rename(&amp;#39;time&amp;#39;, inplace=True)&lt;br /&gt;trades[&amp;#39;interval&amp;#39;] = trades[&amp;#39;transact_time&amp;#39;] - trades[&amp;#39;transact_time&amp;#39;].shift()&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [6]:&lt;br /&gt;```&lt;br /&gt;depths = pd.read_csv(&amp;#39;YGGUSDT_depth.csv&amp;#39;,names=[&amp;#39;type&amp;#39;,&amp;#39;event_time&amp;#39;, &amp;#39;transact_time&amp;#39;,&amp;#39;symbol&amp;#39;, &amp;#39;u1&amp;#39;, &amp;#39;u2&amp;#39;, &amp;#39;u3&amp;#39;, &amp;#39;bids&amp;#39;,&amp;#39;asks&amp;#39;])&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [7]:&lt;br /&gt;```&lt;br /&gt;depths = depths.iloc[:100000]&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [8]:&lt;br /&gt;```&lt;br /&gt;depths[&amp;#39;bids&amp;#39;] = depths[&amp;#39;bids&amp;#39;].apply(ast.literal_eval).copy()&lt;br /&gt;depths[&amp;#39;asks&amp;#39;] = depths[&amp;#39;asks&amp;#39;].apply(ast.literal_eval).copy()&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [9]:&lt;br /&gt;```&lt;br /&gt;def expand_bid(bid_data):&lt;br /&gt;    expanded = {}&lt;br /&gt;    for j, (price, quantity) in enumerate(bid_data):&lt;br /&gt;        expanded[f&amp;#39;bid_{j}_price&amp;#39;] = float(price)&lt;br /&gt;        expanded[f&amp;#39;bid_{j}_quantity&amp;#39;] = float(quantity)&lt;br /&gt;    return pd.Series(expanded)&lt;br /&gt;def expand_ask(ask_data):&lt;br /&gt;    expanded = {}&lt;br /&gt;    for j, (price, quantity) in enumerate(ask_data):&lt;br /&gt;        expanded[f&amp;#39;ask_{j}_price&amp;#39;] = float(price)&lt;br /&gt;        expanded[f&amp;#39;ask_{j}_quantity&amp;#39;] = float(quantity)&lt;br /&gt;    return pd.Series(expanded)&lt;br /&gt;# Apply to each line to get a new df&lt;br /&gt;expanded_df_bid = depths[&amp;#39;bids&amp;#39;].apply(expand_bid)&lt;br /&gt;expanded_df_ask = depths[&amp;#39;asks&amp;#39;].apply(expand_ask)&lt;br /&gt;# Expansion on the original df&lt;br /&gt;depths = pd.concat([depths, expanded_df_bid, expanded_df_ask], axis=1)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [10]:&lt;br /&gt;```&lt;br /&gt;depths.index = pd.to_datetime(depths[&amp;#39;transact_time&amp;#39;], unit=&amp;#39;ms&amp;#39;)&lt;br /&gt;depths.index.rename(&amp;#39;time&amp;#39;, inplace=True);&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [11]:&lt;br /&gt;```&lt;br /&gt;trades = trades[trades[&amp;#39;transact_time&amp;#39;] &amp;lt; depths[&amp;#39;transact_time&amp;#39;].iloc[-1]]&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Take a look at the distribution of the market in these 20 levels. It is in line with expectations, with more orders placed the further away from the market price. Additionally, buy orders and sell orders are roughly symmetrical.&lt;br /&gt;&lt;br /&gt;In [14]:&lt;br /&gt;```&lt;br /&gt;bid_mean_list = []&lt;br /&gt;ask_mean_list = []&lt;br /&gt;for i in range(20):&lt;br /&gt;    bid_mean_list.append(round(depths[f&amp;#39;bid_{i}_quantity&amp;#39;].mean(),0))&lt;br /&gt;    ask_mean_list.append(round(depths[f&amp;#39;ask_{i}_quantity&amp;#39;].mean(),0))&lt;br /&gt;plt.figure(figsize=(10, 5))&lt;br /&gt;plt.plot(bid_mean_list);&lt;br /&gt;plt.plot(ask_mean_list);&lt;br /&gt;plt.grid(True)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[14]:&lt;br /&gt;&lt;br /&gt;/upload/asset/28d4e2581a36fd970d055.png&lt;br /&gt;&lt;br /&gt;Merge the depth data with the transaction data to facilitate the evaluation of prediction accuracy. Ensure that the transaction data is later than the depth data. Without considering latency, directly calculate the mean squared error between the predicted value and the actual transaction price. This is used to measure the accuracy of the prediction.&lt;br /&gt;&lt;br /&gt;From the results, the error is highest for the average value of the bid and ask prices (mid_price). However, when changed to the weighted mid_price, the error immediately decreases significantly. Further improvement is observed by using the adjusted weighted mid_price. After receiving feedback on using I^3/2 only, it was checked and found that the results were better. Upon reflection, this is likely due to the different frequencies of events. When I is close to -1 and 1, it represents low probability events. In order to correct for these low probability events, the accuracy of predicting high-frequency events is compromised. Therefore, to prioritize high-frequency events, some adjustments were made (these parameters were purely trial-and-error and have limited practical significance in live trading).&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149678
" title="https://stocksharp.com/file/149678
"&gt;https://stocksharp.com/file/149678
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The results have improved slightly. As mentioned in the previous article, strategies should rely on more data for prediction. With the availability of more depth and order transaction data, the improvement gained from focusing on the order book is already weak.&lt;br /&gt;&lt;br /&gt;In [15]:&lt;br /&gt;```&lt;br /&gt;df = pd.merge_asof(trades, depths, on=&amp;#39;transact_time&amp;#39;, direction=&amp;#39;backward&amp;#39;)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [17]:&lt;br /&gt;```&lt;br /&gt;df[&amp;#39;spread&amp;#39;] = round(df[&amp;#39;ask_0_price&amp;#39;] - df[&amp;#39;bid_0_price&amp;#39;],4)&lt;br /&gt;df[&amp;#39;mid_price&amp;#39;] = (df[&amp;#39;bid_0_price&amp;#39;]+ df[&amp;#39;ask_0_price&amp;#39;]) / 2&lt;br /&gt;df[&amp;#39;I&amp;#39;] = (df[&amp;#39;bid_0_quantity&amp;#39;] - df[&amp;#39;ask_0_quantity&amp;#39;]) / (df[&amp;#39;bid_0_quantity&amp;#39;] + df[&amp;#39;ask_0_quantity&amp;#39;])&lt;br /&gt;df[&amp;#39;weight_mid_price&amp;#39;] = df[&amp;#39;mid_price&amp;#39;] + df[&amp;#39;spread&amp;#39;]*df[&amp;#39;I&amp;#39;]/2&lt;br /&gt;df[&amp;#39;adjust_mid_price&amp;#39;] = df[&amp;#39;mid_price&amp;#39;] + df[&amp;#39;spread&amp;#39;]*(df[&amp;#39;I&amp;#39;])*(df[&amp;#39;I&amp;#39;]**8+1)/4&lt;br /&gt;df[&amp;#39;adjust_mid_price_2&amp;#39;] = df[&amp;#39;mid_price&amp;#39;] + df[&amp;#39;spread&amp;#39;]*df[&amp;#39;I&amp;#39;]*(df[&amp;#39;I&amp;#39;]**2+1)/4&lt;br /&gt;df[&amp;#39;adjust_mid_price_3&amp;#39;] = df[&amp;#39;mid_price&amp;#39;] + df[&amp;#39;spread&amp;#39;]*df[&amp;#39;I&amp;#39;]**3/2&lt;br /&gt;df[&amp;#39;adjust_mid_price_4&amp;#39;] = df[&amp;#39;mid_price&amp;#39;] + df[&amp;#39;spread&amp;#39;]*(df[&amp;#39;I&amp;#39;]+0.3)*(df[&amp;#39;I&amp;#39;]**4+0.7)/3.8&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [18]:&lt;br /&gt;```&lt;br /&gt;print(&amp;#39;Mean value     Error in mid_price:&amp;#39;, ((df[&amp;#39;price&amp;#39;]-df[&amp;#39;mid_price&amp;#39;])**2).sum())&lt;br /&gt;print(&amp;#39;Error of pending order volume weighted mid_price:&amp;#39;, ((df[&amp;#39;price&amp;#39;]-df[&amp;#39;weight_mid_price&amp;#39;])**2).sum())&lt;br /&gt;print(&amp;#39;The error of the adjusted mid_price:&amp;#39;, ((df[&amp;#39;price&amp;#39;]-df[&amp;#39;adjust_mid_price&amp;#39;])**2).sum())&lt;br /&gt;print(&amp;#39;The error of the adjusted mid_price_2:&amp;#39;, ((df[&amp;#39;price&amp;#39;]-df[&amp;#39;adjust_mid_price_2&amp;#39;])**2).sum())&lt;br /&gt;print(&amp;#39;The error of the adjusted mid_price_3:&amp;#39;, ((df[&amp;#39;price&amp;#39;]-df[&amp;#39;adjust_mid_price_3&amp;#39;])**2).sum())&lt;br /&gt;print(&amp;#39;The error of the adjusted mid_price_4:&amp;#39;, ((df[&amp;#39;price&amp;#39;]-df[&amp;#39;adjust_mid_price_4&amp;#39;])**2).sum())&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[18]:&lt;br /&gt;&lt;br /&gt;Mean value     Error in mid_price: 0.0048751924999999845&lt;br /&gt;Error of pending order volume weighted mid_price: 0.0048373440193987035&lt;br /&gt;The error of the adjusted mid_price: 0.004803654771638586&lt;br /&gt;The error of the adjusted mid_price_2: 0.004808216498329721&lt;br /&gt;The error of the adjusted mid_price_3: 0.004794984755260528&lt;br /&gt;The error of the adjusted mid_price_4: 0.0047909595497071375&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Consider the Second Level of Depth&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We can follow the approach from the previous article to examine different ranges of a parameter and measure its contribution to the mid_price based on the changes in transaction price. Similar to the first level of depth, as I increases, the transaction price is more likely to increase, indicating a positive contribution from I.&lt;br /&gt;&lt;br /&gt;Applying the same approach to the second level of depth, we find that although the effect is slightly smaller than the first level, it is still significant and should not be ignored. The third level of depth also shows a weak contribution, but with less monotonicity. Deeper depths have little reference value.&lt;br /&gt;&lt;br /&gt;Based on the different contributions, we assign different weights to these three levels of imbalance parameters. By examining different calculation methods, we observe further reduction in prediction errors.&lt;br /&gt;&lt;br /&gt;In [19]:&lt;br /&gt;```&lt;br /&gt;bins = np.linspace(-1, 1, 50)&lt;br /&gt;df[&amp;#39;change&amp;#39;] = (df[&amp;#39;price&amp;#39;].pct_change().shift(-1))/tick_size&lt;br /&gt;df[&amp;#39;I_bins&amp;#39;] = pd.cut(df[&amp;#39;I&amp;#39;], bins, labels=bins[1:])&lt;br /&gt;df[&amp;#39;I_2&amp;#39;] = (df[&amp;#39;bid_1_quantity&amp;#39;] - df[&amp;#39;ask_1_quantity&amp;#39;]) / (df[&amp;#39;bid_1_quantity&amp;#39;] + df[&amp;#39;ask_1_quantity&amp;#39;])&lt;br /&gt;df[&amp;#39;I_2_bins&amp;#39;] = pd.cut(df[&amp;#39;I_2&amp;#39;], bins, labels=bins[1:])&lt;br /&gt;df[&amp;#39;I_3&amp;#39;] = (df[&amp;#39;bid_2_quantity&amp;#39;] - df[&amp;#39;ask_2_quantity&amp;#39;]) / (df[&amp;#39;bid_2_quantity&amp;#39;] + df[&amp;#39;ask_2_quantity&amp;#39;])&lt;br /&gt;df[&amp;#39;I_3_bins&amp;#39;] = pd.cut(df[&amp;#39;I_3&amp;#39;], bins, labels=bins[1:])&lt;br /&gt;df[&amp;#39;I_4&amp;#39;] = (df[&amp;#39;bid_3_quantity&amp;#39;] - df[&amp;#39;ask_3_quantity&amp;#39;]) / (df[&amp;#39;bid_3_quantity&amp;#39;] + df[&amp;#39;ask_3_quantity&amp;#39;])&lt;br /&gt;df[&amp;#39;I_4_bins&amp;#39;] = pd.cut(df[&amp;#39;I_4&amp;#39;], bins, labels=bins[1:])&lt;br /&gt;fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(8, 5))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;axes[0][0].plot(df.groupby(&amp;#39;I_bins&amp;#39;)[&amp;#39;change&amp;#39;].mean())&lt;br /&gt;axes[0][0].set_title(&amp;#39;I&amp;#39;)&lt;br /&gt;axes[0][0].grid(True)&lt;br /&gt;&lt;br /&gt;axes[0][1].plot(df.groupby(&amp;#39;I_2_bins&amp;#39;)[&amp;#39;change&amp;#39;].mean())&lt;br /&gt;axes[0][1].set_title(&amp;#39;I 2&amp;#39;)&lt;br /&gt;axes[0][1].grid(True)&lt;br /&gt;&lt;br /&gt;axes[1][0].plot(df.groupby(&amp;#39;I_3_bins&amp;#39;)[&amp;#39;change&amp;#39;].mean())&lt;br /&gt;axes[1][0].set_title(&amp;#39;I 3&amp;#39;)&lt;br /&gt;axes[1][0].grid(True)&lt;br /&gt;&lt;br /&gt;axes[1][1].plot(df.groupby(&amp;#39;I_4_bins&amp;#39;)[&amp;#39;change&amp;#39;].mean())&lt;br /&gt;axes[1][1].set_title(&amp;#39;I 4&amp;#39;)&lt;br /&gt;axes[1][1].grid(True)&lt;br /&gt;plt.tight_layout();&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[19]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149683
" title="https://stocksharp.com/file/149683
"&gt;https://stocksharp.com/file/149683
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In [20]:&lt;br /&gt;```&lt;br /&gt;df[&amp;#39;adjust_mid_price_4&amp;#39;] = df[&amp;#39;mid_price&amp;#39;] + df[&amp;#39;spread&amp;#39;]*(df[&amp;#39;I&amp;#39;]+0.3)*(df[&amp;#39;I&amp;#39;]**4+0.7)/3.8&lt;br /&gt;df[&amp;#39;adjust_mid_price_5&amp;#39;] = df[&amp;#39;mid_price&amp;#39;] + df[&amp;#39;spread&amp;#39;]*(0.7*df[&amp;#39;I&amp;#39;]+0.3*df[&amp;#39;I_2&amp;#39;])/2&lt;br /&gt;df[&amp;#39;adjust_mid_price_6&amp;#39;] = df[&amp;#39;mid_price&amp;#39;] + df[&amp;#39;spread&amp;#39;]*(0.7*df[&amp;#39;I&amp;#39;]+0.3*df[&amp;#39;I_2&amp;#39;])**3/2&lt;br /&gt;df[&amp;#39;adjust_mid_price_7&amp;#39;] = df[&amp;#39;mid_price&amp;#39;] + df[&amp;#39;spread&amp;#39;]*(0.7*df[&amp;#39;I&amp;#39;]+0.3*df[&amp;#39;I_2&amp;#39;]+0.3)*((0.7*df[&amp;#39;I&amp;#39;]+0.3*df[&amp;#39;I_2&amp;#39;])**4+0.7)/3.8&lt;br /&gt;df[&amp;#39;adjust_mid_price_8&amp;#39;] = df[&amp;#39;mid_price&amp;#39;] + df[&amp;#39;spread&amp;#39;]*(0.7*df[&amp;#39;I&amp;#39;]+0.2*df[&amp;#39;I_2&amp;#39;]+0.1*df[&amp;#39;I_3&amp;#39;]+0.3)*((0.7*df[&amp;#39;I&amp;#39;]+0.3*df[&amp;#39;I_2&amp;#39;]+0.1*df[&amp;#39;I_3&amp;#39;])**4+0.7)/3.8&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [21]:&lt;br /&gt;```&lt;br /&gt;print(&amp;#39;The error of the adjusted mid_price_4:&amp;#39;, ((df[&amp;#39;price&amp;#39;]-df[&amp;#39;adjust_mid_price_4&amp;#39;])**2).sum())&lt;br /&gt;print(&amp;#39;The error of the adjusted mid_price_5:&amp;#39;, ((df[&amp;#39;price&amp;#39;]-df[&amp;#39;adjust_mid_price_5&amp;#39;])**2).sum())&lt;br /&gt;print(&amp;#39;The error of the adjusted mid_price_6:&amp;#39;, ((df[&amp;#39;price&amp;#39;]-df[&amp;#39;adjust_mid_price_6&amp;#39;])**2).sum())&lt;br /&gt;print(&amp;#39;The error of the adjusted mid_price_7:&amp;#39;, ((df[&amp;#39;price&amp;#39;]-df[&amp;#39;adjust_mid_price_7&amp;#39;])**2).sum())&lt;br /&gt;print(&amp;#39;The error of the adjusted mid_price_8:&amp;#39;, ((df[&amp;#39;price&amp;#39;]-df[&amp;#39;adjust_mid_price_8&amp;#39;])**2).sum())&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[21]:&lt;br /&gt;&lt;br /&gt;The error of the adjusted mid_price_4: 0.0047909595497071375&lt;br /&gt;The error of the adjusted mid_price_5: 0.0047884350488318714&lt;br /&gt;The error of the adjusted mid_price_6: 0.0047778319053133735&lt;br /&gt;The error of the adjusted mid_price_7: 0.004773578540592192&lt;br /&gt;The error of the adjusted mid_price_8: 0.004771415189297518&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Considering the Transaction Data&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Transaction data directly reflects the extent of long and short positions. After all, transactions involve real money, while placing orders has much lower costs and can even involve intentional deception. Therefore, when predicting the mid_price, strategies should focus on the transaction data.&lt;br /&gt;&lt;br /&gt;In terms of form, we can define the imbalance of the average order arrival quantity as VI, with Vb and Vs representing the average quantity of buy and sell orders within a unit time interval, respectively.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149679
" title="https://stocksharp.com/file/149679
"&gt;https://stocksharp.com/file/149679
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The results show that the arrival quantity in a short period of time has the most significant impact on price change prediction. When VI is between 0.1 and 0.9, it is negatively correlated with price, while outside this range, it is positively correlated with price. This suggests that when the market is not extreme and mainly oscillates, the price tends to revert to the mean. However, in extreme market conditions, such as when there are a large number of buy orders overwhelming sell orders, a trend emerges. Even without considering these low probability scenarios, assuming a negative linear relationship between the trend and VI significantly reduces the prediction error of the mid_price. The coefficient &amp;quot;a&amp;quot; represents the weight of this relationship in the equation.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149681
" title="https://stocksharp.com/file/149681
"&gt;https://stocksharp.com/file/149681
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In [22]:&lt;br /&gt;```&lt;br /&gt;alpha=0.1&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [23]:&lt;br /&gt;```&lt;br /&gt;df[&amp;#39;avg_buy_interval&amp;#39;] = None&lt;br /&gt;df[&amp;#39;avg_sell_interval&amp;#39;] = None&lt;br /&gt;df.loc[df[&amp;#39;is_buyer_maker&amp;#39;] == True, &amp;#39;avg_buy_interval&amp;#39;] = df[df[&amp;#39;is_buyer_maker&amp;#39;] == True][&amp;#39;transact_time&amp;#39;].diff().ewm(alpha=alpha).mean()&lt;br /&gt;df.loc[df[&amp;#39;is_buyer_maker&amp;#39;] == False, &amp;#39;avg_sell_interval&amp;#39;] = df[df[&amp;#39;is_buyer_maker&amp;#39;] == False][&amp;#39;transact_time&amp;#39;].diff().ewm(alpha=alpha).mean()&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [24]:&lt;br /&gt;```&lt;br /&gt;df[&amp;#39;avg_buy_quantity&amp;#39;] = None&lt;br /&gt;df[&amp;#39;avg_sell_quantity&amp;#39;] = None&lt;br /&gt;df.loc[df[&amp;#39;is_buyer_maker&amp;#39;] == True, &amp;#39;avg_buy_quantity&amp;#39;] = df[df[&amp;#39;is_buyer_maker&amp;#39;] == True][&amp;#39;quantity&amp;#39;].ewm(alpha=alpha).mean()&lt;br /&gt;df.loc[df[&amp;#39;is_buyer_maker&amp;#39;] == False, &amp;#39;avg_sell_quantity&amp;#39;] = df[df[&amp;#39;is_buyer_maker&amp;#39;] == False][&amp;#39;quantity&amp;#39;].ewm(alpha=alpha).mean()&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [25]:&lt;br /&gt;```&lt;br /&gt;df[&amp;#39;avg_buy_quantity&amp;#39;] = df[&amp;#39;avg_buy_quantity&amp;#39;].fillna(method=&amp;#39;ffill&amp;#39;)&lt;br /&gt;df[&amp;#39;avg_sell_quantity&amp;#39;] = df[&amp;#39;avg_sell_quantity&amp;#39;].fillna(method=&amp;#39;ffill&amp;#39;)&lt;br /&gt;df[&amp;#39;avg_buy_interval&amp;#39;] = df[&amp;#39;avg_buy_interval&amp;#39;].fillna(method=&amp;#39;ffill&amp;#39;)&lt;br /&gt;df[&amp;#39;avg_sell_interval&amp;#39;] = df[&amp;#39;avg_sell_interval&amp;#39;].fillna(method=&amp;#39;ffill&amp;#39;)&lt;br /&gt;&lt;br /&gt;df[&amp;#39;avg_buy_rate&amp;#39;] = 1000 / df[&amp;#39;avg_buy_interval&amp;#39;]&lt;br /&gt;df[&amp;#39;avg_sell_rate&amp;#39;] =1000 / df[&amp;#39;avg_sell_interval&amp;#39;]&lt;br /&gt;&lt;br /&gt;df[&amp;#39;avg_buy_volume&amp;#39;] = df[&amp;#39;avg_buy_rate&amp;#39;]*df[&amp;#39;avg_buy_quantity&amp;#39;]&lt;br /&gt;df[&amp;#39;avg_sell_volume&amp;#39;] = df[&amp;#39;avg_sell_rate&amp;#39;]*df[&amp;#39;avg_sell_quantity&amp;#39;]&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [26]:&lt;br /&gt;```&lt;br /&gt;df[&amp;#39;I&amp;#39;] = (df[&amp;#39;bid_0_quantity&amp;#39;]- df[&amp;#39;ask_0_quantity&amp;#39;]) / (df[&amp;#39;bid_0_quantity&amp;#39;] + df[&amp;#39;ask_0_quantity&amp;#39;])&lt;br /&gt;df[&amp;#39;OI&amp;#39;] = (df[&amp;#39;avg_buy_rate&amp;#39;]-df[&amp;#39;avg_sell_rate&amp;#39;]) / (df[&amp;#39;avg_buy_rate&amp;#39;] + df[&amp;#39;avg_sell_rate&amp;#39;])&lt;br /&gt;df[&amp;#39;QI&amp;#39;] = (df[&amp;#39;avg_buy_quantity&amp;#39;]-df[&amp;#39;avg_sell_quantity&amp;#39;]) / (df[&amp;#39;avg_buy_quantity&amp;#39;] + df[&amp;#39;avg_sell_quantity&amp;#39;])&lt;br /&gt;df[&amp;#39;VI&amp;#39;] = (df[&amp;#39;avg_buy_volume&amp;#39;]-df[&amp;#39;avg_sell_volume&amp;#39;]) / (df[&amp;#39;avg_buy_volume&amp;#39;] + df[&amp;#39;avg_sell_volume&amp;#39;])&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [27]:&lt;br /&gt;```&lt;br /&gt;bins = np.linspace(-1, 1, 50)&lt;br /&gt;df[&amp;#39;VI_bins&amp;#39;] = pd.cut(df[&amp;#39;VI&amp;#39;], bins, labels=bins[1:])&lt;br /&gt;plt.plot(df.groupby(&amp;#39;VI_bins&amp;#39;)[&amp;#39;change&amp;#39;].mean());&lt;br /&gt;plt.grid(True)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[27]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149680
" title="https://stocksharp.com/file/149680
"&gt;https://stocksharp.com/file/149680
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In [28]:&lt;br /&gt;```&lt;br /&gt;df[&amp;#39;adjust_mid_price&amp;#39;] = df[&amp;#39;mid_price&amp;#39;] + df[&amp;#39;spread&amp;#39;]*df[&amp;#39;I&amp;#39;]/2&lt;br /&gt;df[&amp;#39;adjust_mid_price_9&amp;#39;] = df[&amp;#39;mid_price&amp;#39;] + df[&amp;#39;spread&amp;#39;]*(-df[&amp;#39;OI&amp;#39;])*2&lt;br /&gt;df[&amp;#39;adjust_mid_price_10&amp;#39;] = df[&amp;#39;mid_price&amp;#39;] + df[&amp;#39;spread&amp;#39;]*(-df[&amp;#39;VI&amp;#39;])*1.4&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [29]:&lt;br /&gt;```&lt;br /&gt;print(&amp;#39;The error of the adjusted mid_price:&amp;#39;, ((df[&amp;#39;price&amp;#39;]-df[&amp;#39;adjust_mid_price&amp;#39;])**2).sum())&lt;br /&gt;print(&amp;#39;The error of the adjusted mid_price_9:&amp;#39;, ((df[&amp;#39;price&amp;#39;]-df[&amp;#39;adjust_mid_price_9&amp;#39;])**2).sum())&lt;br /&gt;print(&amp;#39;The error of the adjusted mid_price_10:&amp;#39;, ((df[&amp;#39;price&amp;#39;]-df[&amp;#39;adjust_mid_price_10&amp;#39;])**2).sum())&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[29]:&lt;br /&gt;&lt;br /&gt;The error of the adjusted mid_price: 0.0048373440193987035&lt;br /&gt;The error of the adjusted mid_price_9: 0.004629586542840461&lt;br /&gt;The error of the adjusted mid_price_10: 0.004401790287167206&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Comprehensive Mid-price&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Considering that both order book imbalance and transaction data are helpful for predicting the mid_price, we can combine these two parameters together. The assignment of weights in this case is arbitrary and does not take into account boundary conditions. In extreme cases, the predicted mid_price may not fall between the bid and ask prices. However, as long as the prediction error can be reduced, these details are not of great concern.&lt;br /&gt;&lt;br /&gt;In the end, the prediction error is reduced from 0.00487 to 0.0043. At this point, we will not delve further into the topic. There are still many aspects to explore when it comes to predicting the mid_price, as it is essentially predicting the price itself. Everyone is encouraged to try their own approaches and techniques.&lt;br /&gt;&lt;br /&gt;In [30]:&lt;br /&gt;```&lt;br /&gt;#Note that the VI needs to be delayed by one to use&lt;br /&gt;df[&amp;#39;CI&amp;#39;] = -1.5*df[&amp;#39;VI&amp;#39;].shift()+0.7*(0.7*df[&amp;#39;I&amp;#39;]+0.2*df[&amp;#39;I_2&amp;#39;]+0.1*df[&amp;#39;I_3&amp;#39;])**3 &lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [31]:&lt;br /&gt;```&lt;br /&gt;df[&amp;#39;adjust_mid_price_11&amp;#39;] = df[&amp;#39;mid_price&amp;#39;] + df[&amp;#39;spread&amp;#39;]*(df[&amp;#39;CI&amp;#39;])&lt;br /&gt;print(&amp;#39;The error of the adjusted mid_price_11:&amp;#39;, ((df[&amp;#39;price&amp;#39;]-df[&amp;#39;adjust_mid_price_11&amp;#39;])**2).sum())&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[31]:&lt;br /&gt;&lt;br /&gt;The error of the adjusted mid_price_11: 0.0043001941412563575&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The article combines depth data and transaction data to further improve the calculation method of the mid-price. It provides a method to measure accuracy and improves the accuracy of price change prediction. Overall, the parameters are not rigorous and are for reference only. With a more accurate mid-price, the next step is to conduct backtesting using the mid-price in practical applications. This part of the content is extensive, so updates will be paused for a period of time.&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y67qq0yhtjdH5OJdvZRK-DU65XMv9S5xjTGa2LUWYX_21frTV3Cpue8TTeNEtAxk5cUFyLveinbFYypTvDTfSrvI" title="https://blog.mathquant.com/2023/08/10/thoughts-on-high-frequency-trading-strategies-5.html"&gt;https://blog.mathquant.c...rading-strategies-5.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25628/</id>
    <title type="text">Thoughts on High-Frequency Trading Strategies (4)</title>
    <published>2024-03-26T05:11:42Z</published>
    <updated>2024-03-26T05:11:42Z</updated>
    <author>
      <name>FMZQuant</name>
      <uri>https://stocksharp.com/users/185759/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#strategy" />
    <category term="#code" />
    <category term="#data" />
    <category term="#market" />
    <category term="#binance" />
    <category term="#highfrequency" />
    <category term="#parameter" />
    <category term="#FMZQuant" />
    <category term="#quote" />
    <content type="html">The previous article demonstrated the need for dynamically adjusting parameters and how to evaluate the quality of estimates by studying the order arrival intervals. This article will focus on depth data and study the mid-price (also known as fair-price or micro-price).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Depth Data&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Binance provides historical data downloads for best_bid_price (the highest buying price), best_bid_quantity (the quantity at the best bid price), best_ask_price (the lowest selling price), best_ask_quantity (the quantity at the best ask price), and transaction_time. This data does not include the second or deeper order book levels. The analysis in this article is based on the YGG market on August 7th, which experienced significant volatility with over 9 million data points.&lt;br /&gt;&lt;br /&gt;First, let&amp;#39;s take a look at the market conditions on that day. There were large fluctuations, and the order book volume changed significantly along with the market volatility. The spread, particularly, indicated the extent of market fluctuations, which is the difference between the best ask and bid prices. In the statistics of the YGG market on that day, the spread was larger than one tick for 20% of the time. In this era of various trading bots competing in the order book, such situations are becoming increasingly rare.&lt;br /&gt;&lt;br /&gt;In [1]:&lt;br /&gt;```&lt;br /&gt;from datetime import date,datetime&lt;br /&gt;import time&lt;br /&gt;import pandas as pd&lt;br /&gt;import numpy as np&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;%matplotlib inline&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [2]:&lt;br /&gt;```&lt;br /&gt;books = pd.read_csv(&amp;#39;YGGUSDT-bookTicker-2023-08-07.csv&amp;#39;)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [3]:&lt;br /&gt;```&lt;br /&gt;tick_size = 0.0001&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [4]:&lt;br /&gt;```&lt;br /&gt;books[&amp;#39;date&amp;#39;] = pd.to_datetime(books[&amp;#39;transaction_time&amp;#39;], unit=&amp;#39;ms&amp;#39;)&lt;br /&gt;books.index = books[&amp;#39;date&amp;#39;]&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [5]:&lt;br /&gt;```&lt;br /&gt;books[&amp;#39;spread&amp;#39;] = round(books[&amp;#39;best_ask_price&amp;#39;] - books[&amp;#39;best_bid_price&amp;#39;],4)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [6]:&lt;br /&gt;```&lt;br /&gt;books[&amp;#39;best_bid_price&amp;#39;][::10].plot(figsize=(10,5),grid=True);&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[6]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149672
" title="https://stocksharp.com/file/149672
"&gt;https://stocksharp.com/file/149672
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In [7]:&lt;br /&gt;```&lt;br /&gt;books[&amp;#39;best_bid_qty&amp;#39;][::10].rolling(10000).mean().plot(figsize=(10,5),grid=True);&lt;br /&gt;books[&amp;#39;best_ask_qty&amp;#39;][::10].rolling(10000).mean().plot(figsize=(10,5),grid=True);&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[7]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149677
" title="https://stocksharp.com/file/149677
"&gt;https://stocksharp.com/file/149677
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In [8]:&lt;br /&gt;```&lt;br /&gt;(books[&amp;#39;spread&amp;#39;][::10]/tick_size).rolling(10000).mean().plot(figsize=(10,5),grid=True);&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[8]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149675
" title="https://stocksharp.com/file/149675
"&gt;https://stocksharp.com/file/149675
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In [9]:&lt;br /&gt;```&lt;br /&gt;books[&amp;#39;spread&amp;#39;].value_counts()[books[&amp;#39;spread&amp;#39;].value_counts()&amp;gt;500]/books[&amp;#39;spread&amp;#39;].value_counts().sum()&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[9]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149667
" title="https://stocksharp.com/file/149667
"&gt;https://stocksharp.com/file/149667
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Imbalanced Quotes&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Imbalanced quotes are observed from the significant difference in the order book volumes between the buy and sell orders most of the time. This difference has a strong predictive effect on short-term market trends, similar to the reason mentioned earlier that a decrease in buy order volume often leads to a decline. If one side of the order book is significantly smaller than the other, assuming the active buying and selling orders are similar in volume, there is a greater likelihood of the smaller side being consumed, thereby driving price changes. Imbalanced quotes are represented by the letter &amp;quot;I&amp;quot;.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149671
" title="https://stocksharp.com/file/149671
"&gt;https://stocksharp.com/file/149671
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Where Q_b represents the amount of pending buy orders (best_bid_qty) and Q_a represents the amount of pending sell orders (best_ask_qty).&lt;br /&gt;&lt;br /&gt;Define mid-price:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149674
" title="https://stocksharp.com/file/149674
"&gt;https://stocksharp.com/file/149674
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The graph below shows the relationship between the rate of change of mid-price over the next 1 interval and the imbalance I. As expected, the more likely the price is to increase as I increases and the closer it gets to 1, the more the price change accelerates. In high-frequency trading, the introduction of the intermediate price is to better predict future price changes, that is, and the future price difference is smaller, the better the intermediate price is defined. Obviously the imbalance of pending orders provides additional information for the prediction of the strategy, with this in mind, defining the weighted mid-price:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149668
" title="https://stocksharp.com/file/149668
"&gt;https://stocksharp.com/file/149668
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In [10]:&lt;br /&gt;```&lt;br /&gt;books[&amp;#39;I&amp;#39;] = books[&amp;#39;best_bid_qty&amp;#39;] / (books[&amp;#39;best_bid_qty&amp;#39;] + books[&amp;#39;best_ask_qty&amp;#39;])&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [11]:&lt;br /&gt;```&lt;br /&gt;books[&amp;#39;mid_price&amp;#39;] = (books[&amp;#39;best_ask_price&amp;#39;] + books[&amp;#39;best_bid_price&amp;#39;])/2&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [12]:&lt;br /&gt;```&lt;br /&gt;bins = np.linspace(0, 1, 51)&lt;br /&gt;books[&amp;#39;I_bins&amp;#39;] = pd.cut(books[&amp;#39;I&amp;#39;], bins, labels=bins[1:])&lt;br /&gt;books[&amp;#39;price_change&amp;#39;] = (books[&amp;#39;mid_price&amp;#39;].pct_change()/tick_size).shift(-1)&lt;br /&gt;avg_change = books.groupby(&amp;#39;I_bins&amp;#39;)[&amp;#39;price_change&amp;#39;].mean()&lt;br /&gt;plt.figure(figsize=(8,5))&lt;br /&gt;plt.plot(avg_change)&lt;br /&gt;plt.xlabel(&amp;#39;I Value Range&amp;#39;)&lt;br /&gt;plt.ylabel(&amp;#39;Average Mid Price Change Rate&amp;#39;);&lt;br /&gt;plt.grid(True)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[12]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149663
" title="https://stocksharp.com/file/149663
"&gt;https://stocksharp.com/file/149663
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In [13]:&lt;br /&gt;```&lt;br /&gt;books[&amp;#39;weighted_mid_price&amp;#39;] = books[&amp;#39;mid_price&amp;#39;] + books[&amp;#39;spread&amp;#39;]*books[&amp;#39;I&amp;#39;]/2&lt;br /&gt;bins = np.linspace(-1, 1, 51)&lt;br /&gt;books[&amp;#39;I_bins&amp;#39;] = pd.cut(books[&amp;#39;I&amp;#39;], bins, labels=bins[1:])&lt;br /&gt;books[&amp;#39;weighted_price_change&amp;#39;] = (books[&amp;#39;weighted_mid_price&amp;#39;].pct_change()/tick_size).shift(-1)&lt;br /&gt;avg_change = books.groupby(&amp;#39;I_bins&amp;#39;)[&amp;#39;weighted_price_change&amp;#39;].mean()&lt;br /&gt;plt.figure(figsize=(8,5))&lt;br /&gt;plt.plot(avg_change)&lt;br /&gt;plt.xlabel(&amp;#39;I Value Range&amp;#39;)&lt;br /&gt;plt.ylabel(&amp;#39;Weighted Average Mid Price Change Rate&amp;#39;);&lt;br /&gt;plt.grid(True)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[13]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149670
" title="https://stocksharp.com/file/149670
"&gt;https://stocksharp.com/file/149670
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Adjust Weighted Mid-Price:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;From the graph, it can be observed that the weighted mid-price shows smaller variations compared to different values of I, indicating that it is a better fit. However, there are still some deviations, particularly around 0.2 and 0.8. This suggests that I still provides additional information. The assumption of a completely linear relationship between the price correction term and I, as implied by the weighted mid-price, does not align with reality. It can be seen from the graph that the deviation speed increases when I approaches 0 and 1, indicating a non-linear relationship.&lt;br /&gt;&lt;br /&gt;To provide a more intuitive representation, here is a redefinition of I:&lt;br /&gt;&lt;br /&gt;Revised definition of I:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149666
" title="https://stocksharp.com/file/149666
"&gt;https://stocksharp.com/file/149666
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;At this point:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149673
" title="https://stocksharp.com/file/149673
"&gt;https://stocksharp.com/file/149673
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Upon observation, it can be noticed that the weighted mid-price is a correction to the average mid-price, where the correction term is multiplied by the spread. The correction term is a function of I, and the weighted mid-price assumes a simple relationship of I/2. In this case, the advantage of the adjusted I distribution (-1, 1) becomes apparent, as I is symmetric around the origin, making it convenient to find a fitting relationship for the function. By examining the graph, it appears that this function should satisfy odd powers of I, as it aligns with the rapid growth on both sides and symmetry around the origin. Additionally, it can be observed that values near the origin are close to linear. Furthermore, when I is 0, the function result is 0, and when I is 1, the function result is 0.5. Therefore, it is speculated that the function is of the form:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149665
" title="https://stocksharp.com/file/149665
"&gt;https://stocksharp.com/file/149665
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here N is a positive even number, after actual testing, it is better when N is 8. So far this paper presents the modified weighted mid-price:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149664
" title="https://stocksharp.com/file/149664
"&gt;https://stocksharp.com/file/149664
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;At this point, the prediction of mid-price changes is no longer significantly related to I. Although this result is slightly better than the simple weighted mid-price, it is still not applicable in real trading scenarios. This is just a proposed approach. In a 2017 article by S Stoikov, the concept of [Micro-Price](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2970694) is introduced using a Markov chain approach, and related code is provided. Researchers can explore this approach further.&lt;br /&gt;&lt;br /&gt;In [14]:&lt;br /&gt;```&lt;br /&gt;books[&amp;#39;I&amp;#39;] = (books[&amp;#39;best_bid_qty&amp;#39;] - books[&amp;#39;best_ask_qty&amp;#39;]) / (books[&amp;#39;best_bid_qty&amp;#39;] + books[&amp;#39;best_ask_qty&amp;#39;])&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [15]:&lt;br /&gt;```&lt;br /&gt;books[&amp;#39;weighted_mid_price&amp;#39;] = books[&amp;#39;mid_price&amp;#39;] + books[&amp;#39;spread&amp;#39;]*books[&amp;#39;I&amp;#39;]/2&lt;br /&gt;bins = np.linspace(-1, 1, 51)&lt;br /&gt;books[&amp;#39;I_bins&amp;#39;] = pd.cut(books[&amp;#39;I&amp;#39;], bins, labels=bins[1:])&lt;br /&gt;books[&amp;#39;weighted_price_change&amp;#39;] = (books[&amp;#39;weighted_mid_price&amp;#39;].pct_change()/tick_size).shift(-1)&lt;br /&gt;avg_change = books.groupby(&amp;#39;I_bins&amp;#39;)[&amp;#39;weighted_price_change&amp;#39;].mean()&lt;br /&gt;plt.figure(figsize=(8,5))&lt;br /&gt;plt.plot(avg_change)&lt;br /&gt;plt.xlabel(&amp;#39;I Value Range&amp;#39;)&lt;br /&gt;plt.ylabel(&amp;#39;Weighted Average Mid Price Change Rate&amp;#39;);&lt;br /&gt;plt.grid(True)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[15]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149669
" title="https://stocksharp.com/file/149669
"&gt;https://stocksharp.com/file/149669
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In [16]:&lt;br /&gt;```&lt;br /&gt;books[&amp;#39;adjust_mid_price&amp;#39;] = books[&amp;#39;mid_price&amp;#39;] + books[&amp;#39;spread&amp;#39;]*books[&amp;#39;I&amp;#39;]*(books[&amp;#39;I&amp;#39;]**8+1)/4&lt;br /&gt;bins = np.linspace(-1, 1, 51)&lt;br /&gt;books[&amp;#39;I_bins&amp;#39;] = pd.cut(books[&amp;#39;I&amp;#39;], bins, labels=bins[1:])&lt;br /&gt;books[&amp;#39;adjust_mid_price&amp;#39;] = (books[&amp;#39;adjust_mid_price&amp;#39;].pct_change()/tick_size).shift(-1)&lt;br /&gt;avg_change = books.groupby(&amp;#39;I_bins&amp;#39;)[&amp;#39;adjust_mid_price&amp;#39;].mean()&lt;br /&gt;plt.figure(figsize=(8,5))&lt;br /&gt;plt.plot(avg_change)&lt;br /&gt;plt.xlabel(&amp;#39;I Value Range&amp;#39;)&lt;br /&gt;plt.ylabel(&amp;#39;Weighted Average Mid Price Change Rate&amp;#39;);&lt;br /&gt;plt.grid(True)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[16]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149676
" title="https://stocksharp.com/file/149676
"&gt;https://stocksharp.com/file/149676
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The mid-price is crucial for high-frequency strategies as it serves as a prediction of short-term future prices. Therefore, it is important for the mid-price to be as accurate as possible. The mid-price approaches discussed earlier are based on order book data, as only the top level of the order book is utilized in the analysis. In live trading, strategies should aim to utilize all available data, including trade data, to validate mid-price predictions against actual transaction prices. I recall Stoikov mentioning in a Twitter that the real mid-price should be a weighted average of the probabilities of the bid and ask prices being executed. This issue has been explored in the previous articles. Due to length constraints, further details on these topics will be discussed in the next article.&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y67qq0yhtjdH5OJdvZRK-DU65XMv9S5xjTGa2LUWYX_21frTV3Cpue8TTeNEtAxk5cdHrubA_Wj4n1z7tWuaJLSw" title="https://blog.mathquant.com/2023/08/10/thoughts-on-high-frequency-trading-strategies-4.html"&gt;https://blog.mathquant.c...rading-strategies-4.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25627/</id>
    <title type="text">Thoughts on High-Frequency Trading Strategies (3)</title>
    <published>2024-03-26T03:09:54Z</published>
    <updated>2024-03-26T03:09:54Z</updated>
    <author>
      <name>FMZQuant</name>
      <uri>https://stocksharp.com/users/185759/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#strategy" />
    <category term="#code" />
    <category term="#data" />
    <category term="#market" />
    <category term="#fmz" />
    <category term="#highfrequency" />
    <category term="#crypto" />
    <category term="#order" />
    <category term="#BTC" />
    <content type="html">In the previous article, I introduced how to model cumulative trading volume and analyzed the phenomenon of price impact. In this article, I will continue to analyze the trades order data. YGG recently launched Binance U-based contracts, and the price fluctuations have been significant, with trading volume even surpassing BTC at one point. Today, I will analyze it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Order Time Intervals&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In general, it is assumed that the arrival time of orders follows a Poisson process. There is an article that introduces the [Poisson process](https://www.ruanyifeng.com/blog/2015/06/poisson-distribution.html) . Here, I will provide empirical evidence.&lt;br /&gt;&lt;br /&gt;I downloaded the aggTrades data for August 5th, which consists of 1,931,193 trades, which is quite significant. First, let&amp;#39;s take a look at the distribution of buy orders. We can see a non-smooth local peak around 100ms and 500ms, which is likely caused by iceberg orders placed by trading bots at regular intervals. This may also be one of the reasons for the unusual market conditions that day.&lt;br /&gt;&lt;br /&gt;The probability mass function (PMF) of the Poisson distribution is given by the following formula:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149661
" title="https://stocksharp.com/file/149661
"&gt;https://stocksharp.com/file/149661
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Where:&lt;br /&gt;&lt;br /&gt;- κ is the number of events we are interested in.&lt;br /&gt;- λ is the average rate of events occurring per unit time (or unit space).&lt;br /&gt;- &lt;a href="https://stocksharp.com/file/149657 " title="https://stocksharp.com/file/149657 "&gt;https://stocksharp.com/file/149657 &lt;/a&gt;represents the probability of exactly κ events occurring, given the average rate λ.&lt;br /&gt;&lt;br /&gt;In a Poisson process, the time intervals between events follow an exponential distribution. The probability density function (PDF) of the exponential distribution is given by the following formula:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149655
" title="https://stocksharp.com/file/149655
"&gt;https://stocksharp.com/file/149655
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The fitting results show that there is a significant difference between the observed data and the expected Poisson distribution. The Poisson process underestimates the frequency of long time intervals and overestimates the frequency of short time intervals. (The actual distribution of intervals is closer to a modified Pareto distribution)&lt;br /&gt;&lt;br /&gt;In [1]:&lt;br /&gt;```&lt;br /&gt;from datetime import date,datetime&lt;br /&gt;import time&lt;br /&gt;import pandas as pd&lt;br /&gt;import numpy as np&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;%matplotlib inline&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [2]:&lt;br /&gt;```&lt;br /&gt;trades = pd.read_csv(&amp;#39;YGGUSDT-aggTrades-2023-08-05.csv&amp;#39;)&lt;br /&gt;trades[&amp;#39;date&amp;#39;] = pd.to_datetime(trades[&amp;#39;transact_time&amp;#39;], unit=&amp;#39;ms&amp;#39;)&lt;br /&gt;trades.index = trades[&amp;#39;date&amp;#39;]&lt;br /&gt;buy_trades = trades[trades[&amp;#39;is_buyer_maker&amp;#39;]==False].copy()&lt;br /&gt;buy_trades = buy_trades.groupby(&amp;#39;transact_time&amp;#39;).agg({&lt;br /&gt;    &amp;#39;agg_trade_id&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;price&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;quantity&amp;#39;: &amp;#39;sum&amp;#39;,&lt;br /&gt;    &amp;#39;first_trade_id&amp;#39;: &amp;#39;first&amp;#39;,&lt;br /&gt;    &amp;#39;last_trade_id&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;is_buyer_maker&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;date&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;transact_time&amp;#39;:&amp;#39;last&amp;#39;&lt;br /&gt;})&lt;br /&gt;buy_trades[&amp;#39;interval&amp;#39;]=buy_trades[&amp;#39;transact_time&amp;#39;] - buy_trades[&amp;#39;transact_time&amp;#39;].shift()&lt;br /&gt;buy_trades.index = buy_trades[&amp;#39;date&amp;#39;]&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [10]:&lt;br /&gt;```&lt;br /&gt;buy_trades[&amp;#39;interval&amp;#39;][buy_trades[&amp;#39;interval&amp;#39;]&amp;lt;1000].plot.hist(bins=200,figsize=(10, 5));&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[10]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149656
" title="https://stocksharp.com/file/149656
"&gt;https://stocksharp.com/file/149656
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In [20]:&lt;br /&gt;```&lt;br /&gt;Intervals = np.array(range(0, 1000, 5))&lt;br /&gt;mean_intervals = buy_trades[&amp;#39;interval&amp;#39;].mean()&lt;br /&gt;buy_rates = 1000/mean_intervals&lt;br /&gt;probabilities = np.array([np.mean(buy_trades[&amp;#39;interval&amp;#39;] &amp;gt; interval)  for interval in Intervals])&lt;br /&gt;probabilities_s = np.array([np.e**(-buy_rates*interval/1000) for interval in Intervals])&lt;br /&gt;&lt;br /&gt;plt.figure(figsize=(10, 5))&lt;br /&gt;plt.plot(Intervals, probabilities)&lt;br /&gt;plt.plot(Intervals, probabilities_s)&lt;br /&gt;plt.xlabel(&amp;#39;Intervals&amp;#39;)&lt;br /&gt;plt.ylabel(&amp;#39;Probability&amp;#39;)&lt;br /&gt;plt.grid(True)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[20]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149659
" title="https://stocksharp.com/file/149659
"&gt;https://stocksharp.com/file/149659
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When comparing the distribution of the number of order occurrences within 1 second with the Poisson distribution, the difference is also significant. The Poisson distribution significantly underestimates the frequency of rare events. Possible reasons for this are:&lt;br /&gt;&lt;br /&gt;- Non-constant rate of occurrence: The Poisson process assumes that the average rate of events occurring within any given time interval is constant. If this assumption does not hold, then the distribution of the data will deviate from the Poisson distribution.&lt;br /&gt;- Interactions between processes: Another fundamental assumption of the Poisson process is that events are independent of each other. If events in the real world interact with each other, their distribution may deviate from the Poisson distribution.&lt;br /&gt;&lt;br /&gt;In other words, in a real-world environment, the frequency of order occurrences is non-constant, and it needs to be updated in real-time. There may also be an incentive effect, where more orders within a fixed time period stimulate more orders. This makes strategies unable to rely on a single fixed parameter.&lt;br /&gt;&lt;br /&gt;In [190]:&lt;br /&gt;```&lt;br /&gt;result_df = buy_trades.resample(&amp;#39;1S&amp;#39;).agg({ &lt;br /&gt;    &amp;#39;price&amp;#39;: &amp;#39;count&amp;#39;,&lt;br /&gt;    &amp;#39;quantity&amp;#39;: &amp;#39;sum&amp;#39;&lt;br /&gt;}).rename(columns={&amp;#39;price&amp;#39;: &amp;#39;order_count&amp;#39;, &amp;#39;quantity&amp;#39;: &amp;#39;quantity_sum&amp;#39;})&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [219]:&lt;br /&gt;```&lt;br /&gt;count_df = result_df[&amp;#39;order_count&amp;#39;].value_counts().sort_index()[result_df[&amp;#39;order_count&amp;#39;].value_counts()&amp;gt;20]&lt;br /&gt;(count_df/count_df.sum()).plot(figsize=(10,5),grid=True,label=&amp;#39;sample pmf&amp;#39;);&lt;br /&gt;&lt;br /&gt;from scipy.stats import poisson&lt;br /&gt;prob_values = poisson.pmf(count_df.index, 1000/mean_intervals) &lt;br /&gt;&lt;br /&gt;plt.plot(count_df.index, prob_values,label=&amp;#39;poisson pmf&amp;#39;);&lt;br /&gt;plt.legend() ;&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[219]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149662
" title="https://stocksharp.com/file/149662
"&gt;https://stocksharp.com/file/149662
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Real-time Parameter Updating&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;From the analysis of order intervals earlier, it can be concluded that fixed parameters are not suitable for the real market conditions, and the key parameters describing the market in the strategy need to be updated in real-time. The most straightforward solution is to use a sliding window moving average. The two graphs below show the frequency of buy orders within 1 second and the mean of trading volume with a window size of 1000. It can be observed that there is a clustering phenomenon in trading, where the frequency of orders is significantly higher than usual for a period of time, and the volume also increases synchronously. Here, the mean of the previous values is used to predict the latest value, and the mean absolute error of the residuals is used to measure the quality of the prediction.&lt;br /&gt;&lt;br /&gt;From the graphs, we can also understand why the order frequency deviates so much from the Poisson distribution. Although the mean number of orders per second is only 8.5, extreme cases deviate significantly from this value.&lt;br /&gt;&lt;br /&gt;It is found that using the mean of the previous two seconds to predict yields the smallest residual error, and it is much better than simply using the mean for prediction results.&lt;br /&gt;&lt;br /&gt;In [221]:&lt;br /&gt;```&lt;br /&gt;result_df[&amp;#39;order_count&amp;#39;].rolling(1000).mean().plot(figsize=(10,5),grid=True);&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[221]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149660
" title="https://stocksharp.com/file/149660
"&gt;https://stocksharp.com/file/149660
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In [193]:&lt;br /&gt;```&lt;br /&gt;result_df[&amp;#39;quantity_sum&amp;#39;].rolling(1000).mean().plot(figsize=(10,5),grid=True);&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[193]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149658
" title="https://stocksharp.com/file/149658
"&gt;https://stocksharp.com/file/149658
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In [195]:&lt;br /&gt;```&lt;br /&gt;(result_df[&amp;#39;order_count&amp;#39;] - result_df[&amp;#39;mean_count&amp;#39;].mean()).abs().mean()&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[195]:&lt;br /&gt;&lt;br /&gt;6.985628185332997&lt;br /&gt;&lt;br /&gt;In [205]:&lt;br /&gt;```&lt;br /&gt;result_df[&amp;#39;mean_count&amp;#39;] = result_df[&amp;#39;order_count&amp;#39;].rolling(2).mean()&lt;br /&gt;(result_df[&amp;#39;order_count&amp;#39;] - result_df[&amp;#39;mean_count&amp;#39;].shift()).abs().mean()&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[205]:&lt;br /&gt;&lt;br /&gt;3.091737586730269&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This article briefly explains the reasons for the deviation of order time intervals from the Poisson process, mainly due to the variation of parameters over time. In order to accurately predict the market, strategies need to make real-time forecasts of the fundamental parameters of the market. Residuals can be used to measure the quality of the predictions. The example provided above is a simple demonstration, and there is extensive research on specific time series analysis, volatility clustering, and other related topics, the above demonstration can be further improved.&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y62klVQmZvlTo3phT-rCTmYIUCcEqFi5p8AtLvJFlMhEKyo02EnHxnu9As9UjtJ-CA_YNXwP8GEd9W9Nox_6TYXY" title="https://blog.mathquant.com/2023/08/08/thoughts-on-high-frequency-trading-strategies-3.html"&gt;https://blog.mathquant.c...rading-strategies-3.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25626/</id>
    <title type="text">Thoughts on High-Frequency Trading Strategies (2)</title>
    <published>2024-03-26T01:19:48Z</published>
    <updated>2024-03-26T01:19:48Z</updated>
    <author>
      <name>FMZQuant</name>
      <uri>https://stocksharp.com/users/185759/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#strategy" />
    <category term="#code" />
    <category term="#data" />
    <category term="#fmz" />
    <category term="#exchange" />
    <category term="#highfrequency" />
    <category term="#crypto" />
    <category term="#position" />
    <category term="#chart" />
    <content type="html">&lt;b&gt;Accumulated Trading Amount Modeling&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In the previous article, we derived an expression for the probability of a single trade amount being greater than a certain value.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149650
" title="https://stocksharp.com/file/149650
"&gt;https://stocksharp.com/file/149650
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We are also interested in the distribution of trading amount over a period of time, which intuitively should be related to the individual trade amount and order frequency. Below, we process the data in fixed intervals and plot its distribution, similar to what was done in the previous section.&lt;br /&gt;&lt;br /&gt;In [1]:&lt;br /&gt;```&lt;br /&gt;from datetime import date,datetime&lt;br /&gt;import time&lt;br /&gt;import pandas as pd&lt;br /&gt;import numpy as np&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;%matplotlib inline&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [2]:&lt;br /&gt;```&lt;br /&gt;trades = pd.read_csv(&amp;#39;HOOKUSDT-aggTrades-2023-01-27.csv&amp;#39;)&lt;br /&gt;trades[&amp;#39;date&amp;#39;] = pd.to_datetime(trades[&amp;#39;transact_time&amp;#39;], unit=&amp;#39;ms&amp;#39;)&lt;br /&gt;trades.index = trades[&amp;#39;date&amp;#39;]&lt;br /&gt;buy_trades = trades[trades[&amp;#39;is_buyer_maker&amp;#39;]==False].copy()&lt;br /&gt;buy_trades = buy_trades.groupby(&amp;#39;transact_time&amp;#39;).agg({&lt;br /&gt;    &amp;#39;agg_trade_id&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;price&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;quantity&amp;#39;: &amp;#39;sum&amp;#39;,&lt;br /&gt;    &amp;#39;first_trade_id&amp;#39;: &amp;#39;first&amp;#39;,&lt;br /&gt;    &amp;#39;last_trade_id&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;is_buyer_maker&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;date&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;transact_time&amp;#39;:&amp;#39;last&amp;#39;&lt;br /&gt;})&lt;br /&gt;buy_trades[&amp;#39;interval&amp;#39;]=buy_trades[&amp;#39;transact_time&amp;#39;] - buy_trades[&amp;#39;transact_time&amp;#39;].shift()&lt;br /&gt;buy_trades.index = buy_trades[&amp;#39;date&amp;#39;]&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;We combine the individual trade amounts at intervals of 1 second to obtain the aggregated trading amount, excluding periods with no trading activity. We then fit this aggregated amount using the distribution derived from the single trade amount analysis mentioned earlier. The results show a good fit when considering each trade within the 1-second interval as a single trade, effectively solving the problem. However, when the time interval is extended relative to the trading frequency, we observe an increase in errors. Further research reveals that this error is caused by the correction term introduced by the Pareto distribution. This suggests that as the time interval lengthens and includes more individual trades, the aggregation of multiple trades approaches the Pareto distribution more closely, necessitating the removal of the correction term.&lt;br /&gt;&lt;br /&gt;In [3]:&lt;br /&gt;```&lt;br /&gt;df_resampled = buy_trades[&amp;#39;quantity&amp;#39;].resample(&amp;#39;1S&amp;#39;).sum()&lt;br /&gt;df_resampled = df_resampled.to_frame(name=&amp;#39;quantity&amp;#39;)&lt;br /&gt;df_resampled = df_resampled[df_resampled[&amp;#39;quantity&amp;#39;]&amp;gt;0]&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [4]:&lt;br /&gt;```&lt;br /&gt;# Cumulative distribution in 1s&lt;br /&gt;depths = np.array(range(0, 3000, 5))&lt;br /&gt;probabilities = np.array([np.mean(df_resampled[&amp;#39;quantity&amp;#39;] &amp;gt; depth) for depth in depths])&lt;br /&gt;mean = df_resampled[&amp;#39;quantity&amp;#39;].mean()&lt;br /&gt;alpha = np.log(np.mean(df_resampled[&amp;#39;quantity&amp;#39;] &amp;gt; mean))/np.log(2.05)&lt;br /&gt;probabilities_s = np.array([((1+20**(-depth/mean))*depth/mean+1)**(alpha) for depth in depths])&lt;br /&gt;&lt;br /&gt;plt.figure(figsize=(10, 5))&lt;br /&gt;plt.plot(depths, probabilities)&lt;br /&gt;plt.plot(depths, probabilities_s)&lt;br /&gt;plt.xlabel(&amp;#39;Depth&amp;#39;)&lt;br /&gt;plt.ylabel(&amp;#39;Probability of execution&amp;#39;)&lt;br /&gt;plt.title(&amp;#39;Execution probability at different depths&amp;#39;)&lt;br /&gt;plt.grid(True)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[4]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149653
" title="https://stocksharp.com/file/149653
"&gt;https://stocksharp.com/file/149653
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In [5]:&lt;br /&gt;```&lt;br /&gt;df_resampled = buy_trades[&amp;#39;quantity&amp;#39;].resample(&amp;#39;30S&amp;#39;).sum()&lt;br /&gt;df_resampled = df_resampled.to_frame(name=&amp;#39;quantity&amp;#39;)&lt;br /&gt;df_resampled = df_resampled[df_resampled[&amp;#39;quantity&amp;#39;]&amp;gt;0]&lt;br /&gt;depths = np.array(range(0, 12000, 20))&lt;br /&gt;probabilities = np.array([np.mean(df_resampled[&amp;#39;quantity&amp;#39;] &amp;gt; depth) for depth in depths])&lt;br /&gt;mean = df_resampled[&amp;#39;quantity&amp;#39;].mean()&lt;br /&gt;alpha = np.log(np.mean(df_resampled[&amp;#39;quantity&amp;#39;] &amp;gt; mean))/np.log(2.05)&lt;br /&gt;probabilities_s = np.array([((1+20**(-depth/mean))*depth/mean+1)**(alpha) for depth in depths])&lt;br /&gt;alpha = np.log(np.mean(df_resampled[&amp;#39;quantity&amp;#39;] &amp;gt; mean))/np.log(2)&lt;br /&gt;probabilities_s_2 = np.array([(depth/mean+1)**alpha for depth in depths]) # No amendment&lt;br /&gt;&lt;br /&gt;plt.figure(figsize=(10, 5))&lt;br /&gt;plt.plot(depths, probabilities,label=&amp;#39;Probabilities (True)&amp;#39;)&lt;br /&gt;plt.plot(depths, probabilities_s, label=&amp;#39;Probabilities (Simulation 1)&amp;#39;)&lt;br /&gt;plt.plot(depths, probabilities_s_2, label=&amp;#39;Probabilities (Simulation 2)&amp;#39;)&lt;br /&gt;plt.xlabel(&amp;#39;Depth&amp;#39;)&lt;br /&gt;plt.ylabel(&amp;#39;Probability of execution&amp;#39;)&lt;br /&gt;plt.title(&amp;#39;Execution probability at different depths&amp;#39;)&lt;br /&gt;plt.legend() &lt;br /&gt;plt.grid(True)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[5]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149654
" title="https://stocksharp.com/file/149654
"&gt;https://stocksharp.com/file/149654
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now summarize a general formula for the distribution of accumulated trading amount for different time periods, using the distribution of single transaction amount to fit, instead of separately calculating each time. Here is the formula:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149652
" title="https://stocksharp.com/file/149652
"&gt;https://stocksharp.com/file/149652
&lt;/a&gt;&lt;br /&gt;Here, avg_interval represents the average interval of single transactions, and avg_interval_T represents the average interval of the interval that needs to be estimated. It may sound a bit confusing. If we want to estimate the trading amount for 1 second, we need to calculate the average interval between events containing transactions within 1 second. If the arrival probability of orders follows a Poisson distribution, it should be directly estimable. However, in reality, there is a significant deviation, but I won&amp;#39;t elaborate on it here.&lt;br /&gt;&lt;br /&gt;Note that the probability of trading amount exceeding a specific value within a certain interval of time and the actual probability of trading at that position in the depth should be quite different. As the waiting time increases, the possibility of changes in the order book increases, and trading also leads to changes in the depth. Therefore, the probability of trading at the same depth position changes in real-time as the data updates.&lt;br /&gt;&lt;br /&gt;In [6]:&lt;br /&gt;```&lt;br /&gt;df_resampled = buy_trades[&amp;#39;quantity&amp;#39;].resample(&amp;#39;2S&amp;#39;).sum()&lt;br /&gt;df_resampled = df_resampled.to_frame(name=&amp;#39;quantity&amp;#39;)&lt;br /&gt;df_resampled = df_resampled[df_resampled[&amp;#39;quantity&amp;#39;]&amp;gt;0]&lt;br /&gt;depths = np.array(range(0, 6500, 10))&lt;br /&gt;probabilities = np.array([np.mean(df_resampled[&amp;#39;quantity&amp;#39;] &amp;gt; depth) for depth in depths])&lt;br /&gt;mean = buy_trades[&amp;#39;quantity&amp;#39;].mean()&lt;br /&gt;adjust = buy_trades[&amp;#39;interval&amp;#39;].mean() / 2620&lt;br /&gt;alpha = np.log(np.mean(buy_trades[&amp;#39;quantity&amp;#39;] &amp;gt; mean))/0.7178397931503168&lt;br /&gt;probabilities_s = np.array([((1+20**(-depth*adjust/mean))*depth*adjust/mean+1)**(alpha) for depth in depths])&lt;br /&gt;&lt;br /&gt;plt.figure(figsize=(10, 5))&lt;br /&gt;plt.plot(depths, probabilities)&lt;br /&gt;plt.plot(depths, probabilities_s)&lt;br /&gt;plt.xlabel(&amp;#39;Depth&amp;#39;)&lt;br /&gt;plt.ylabel(&amp;#39;Probability of execution&amp;#39;)&lt;br /&gt;plt.title(&amp;#39;Execution probability at different depths&amp;#39;)&lt;br /&gt;plt.grid(True)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[6]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149651
" title="https://stocksharp.com/file/149651
"&gt;https://stocksharp.com/file/149651
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Single Trade Price Impact&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Trade data is valuable, and there is still a lot of data that can be mined. We should pay close attention to the impact of orders on prices, as this affects the positioning of strategies. Similarly, aggregating data based on transact_time, we calculate the difference between the last price and the first price. If there is only one order, the price difference is 0. Interestingly, there are a few data results that are negative, which may be due to the ordering of the data, but we won&amp;#39;t delve into it here.&lt;br /&gt;&lt;br /&gt;The results show that the proportion of trades that did not cause any impact is as high as 77%, while the proportion of trades causing a price movement of 1 tick is 16.5%, 2 ticks is 3.7%, 3 ticks is 1.2%, and more than 4 ticks is less than 1%. This basically follows the characteristics of an exponential function, but the fitting is not precise.&lt;br /&gt;&lt;br /&gt;The trade amount causing the corresponding price difference was also analyzed, excluding distortions caused by excessive impact. It shows a linear relationship, with approximately 1 tick of price fluctuation caused by every 1000 units of amount. This can also be understood as an average of around 1000 units of orders placed near each price level in the order book.&lt;br /&gt;&lt;br /&gt;In [7]:&lt;br /&gt;```&lt;br /&gt;diff_df = trades[trades[&amp;#39;is_buyer_maker&amp;#39;]==False].groupby(&amp;#39;transact_time&amp;#39;)[&amp;#39;price&amp;#39;].agg(lambda x: abs(round(x.iloc[-1] - x.iloc[0],3)) if len(x) &amp;gt; 1 else 0)&lt;br /&gt;buy_trades[&amp;#39;diff&amp;#39;] = buy_trades[&amp;#39;transact_time&amp;#39;].map(diff_df)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [8]:&lt;br /&gt;```&lt;br /&gt;diff_counts = buy_trades[&amp;#39;diff&amp;#39;].value_counts()&lt;br /&gt;diff_counts[diff_counts&amp;gt;10]/diff_counts.sum()&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[8]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149649
" title="https://stocksharp.com/file/149649
"&gt;https://stocksharp.com/file/149649
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In [9]:&lt;br /&gt;```&lt;br /&gt;diff_group = buy_trades.groupby(&amp;#39;diff&amp;#39;).agg({&lt;br /&gt;    &amp;#39;quantity&amp;#39;: &amp;#39;mean&amp;#39;,&lt;br /&gt;    &amp;#39;diff&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;})&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [10]:&lt;br /&gt;```&lt;br /&gt;diff_group[&amp;#39;quantity&amp;#39;][diff_group[&amp;#39;diff&amp;#39;]&amp;gt;0][diff_group[&amp;#39;diff&amp;#39;]&amp;lt;0.01].plot(figsize=(10,5),grid=True);&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[10]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149648
" title="https://stocksharp.com/file/149648
"&gt;https://stocksharp.com/file/149648
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fixed Interval Price Impact&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Let&amp;#39;s analyze the price impact within a 2-second interval. The difference here is that there may be negative values. However, since we are only considering buy orders, the impact on the symmetrical position would be one tick higher. Continuing to observe the relationship between trade amount and impact, we only consider results greater than 0. The conclusion is similar to that of a single order, showing an approximate linear relationship, with approximately 2000 units of amount needed for each tick.&lt;br /&gt;&lt;br /&gt;In [11]:&lt;br /&gt;```&lt;br /&gt;df_resampled = buy_trades.resample(&amp;#39;2S&amp;#39;).agg({ &lt;br /&gt;    &amp;#39;price&amp;#39;: [&amp;#39;first&amp;#39;, &amp;#39;last&amp;#39;, &amp;#39;count&amp;#39;],&lt;br /&gt;    &amp;#39;quantity&amp;#39;: &amp;#39;sum&amp;#39;&lt;br /&gt;})&lt;br /&gt;df_resampled[&amp;#39;price_diff&amp;#39;] = round(df_resampled[(&amp;#39;price&amp;#39;, &amp;#39;last&amp;#39;)] - df_resampled[(&amp;#39;price&amp;#39;, &amp;#39;first&amp;#39;)],3)&lt;br /&gt;df_resampled[&amp;#39;price_diff&amp;#39;] = df_resampled[&amp;#39;price_diff&amp;#39;].fillna(0)&lt;br /&gt;result_df_raw = pd.DataFrame({&lt;br /&gt;    &amp;#39;price_diff&amp;#39;: df_resampled[&amp;#39;price_diff&amp;#39;],&lt;br /&gt;    &amp;#39;quantity_sum&amp;#39;: df_resampled[(&amp;#39;quantity&amp;#39;, &amp;#39;sum&amp;#39;)],&lt;br /&gt;    &amp;#39;data_count&amp;#39;: df_resampled[(&amp;#39;price&amp;#39;, &amp;#39;count&amp;#39;)]&lt;br /&gt;})&lt;br /&gt;result_df = result_df_raw[result_df_raw[&amp;#39;price_diff&amp;#39;] != 0]&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [12]:&lt;br /&gt;```&lt;br /&gt;result_df[&amp;#39;price_diff&amp;#39;][abs(result_df[&amp;#39;price_diff&amp;#39;])&amp;lt;0.016].value_counts().sort_index().plot.bar(figsize=(10,5));&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[12]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149646
" title="https://stocksharp.com/file/149646
"&gt;https://stocksharp.com/file/149646
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In [23]:&lt;br /&gt;```&lt;br /&gt;result_df[&amp;#39;price_diff&amp;#39;].value_counts()[result_df[&amp;#39;price_diff&amp;#39;].value_counts()&amp;gt;30]&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[23]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149645
" title="https://stocksharp.com/file/149645
"&gt;https://stocksharp.com/file/149645
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In [14]:&lt;br /&gt;```&lt;br /&gt;diff_group = result_df.groupby(&amp;#39;price_diff&amp;#39;).agg({ &amp;#39;quantity_sum&amp;#39;: &amp;#39;mean&amp;#39;})&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [15]:&lt;br /&gt;```&lt;br /&gt;diff_group[(diff_group.index&amp;gt;0) &amp;amp; (diff_group.index&amp;lt;0.015)].plot(figsize=(10,5),grid=True);&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[15]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149647
" title="https://stocksharp.com/file/149647
"&gt;https://stocksharp.com/file/149647
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Trade Amount&amp;#39;s Price Impact&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Previously, we determined the trade amount required for a tick change, but it was not precise as it was based on the assumption that the impact had already occurred. Now, let&amp;#39;s reverse the perspective and examine the price impact caused by trade amount.&lt;br /&gt;&lt;br /&gt;In this analysis, the data is sampled every 1 second, with each step representing 100 units of amount. We then calculated the price changes within this amount range. Here are some valuable conclusions:&lt;br /&gt;&lt;br /&gt;1. When the buy order amount is below 500, the expected price change is a decrease, which is as expected since there are also sell orders impacting the price.&lt;br /&gt;2. At lower trade amounts, there is a linear relationship, meaning that the larger the trade amount, the greater the price increase.&lt;br /&gt;3. As the buy order amount increases, the price change becomes more significant. This often indicates a price breakthrough, which may later regress. Additionally, the fixed interval sampling adds to the data instability.&lt;br /&gt;4. It is important to pay attention to the upper part of the scatter plot, which corresponds to the increase in price with trade amount.&lt;br /&gt;5. For this specific trading pair, we provide a rough version of the relationship between trade amount and price change.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149642
" title="https://stocksharp.com/file/149642
"&gt;https://stocksharp.com/file/149642
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Where &amp;quot;C&amp;quot; represents the change in price and &amp;quot;Q&amp;quot; represents the amount of buy orders.&lt;br /&gt;&lt;br /&gt;In [16]:&lt;br /&gt;```&lt;br /&gt;df_resampled = buy_trades.resample(&amp;#39;1S&amp;#39;).agg({ &lt;br /&gt;    &amp;#39;price&amp;#39;: [&amp;#39;first&amp;#39;, &amp;#39;last&amp;#39;, &amp;#39;count&amp;#39;],&lt;br /&gt;    &amp;#39;quantity&amp;#39;: &amp;#39;sum&amp;#39;&lt;br /&gt;})&lt;br /&gt;df_resampled[&amp;#39;price_diff&amp;#39;] = round(df_resampled[(&amp;#39;price&amp;#39;, &amp;#39;last&amp;#39;)] - df_resampled[(&amp;#39;price&amp;#39;, &amp;#39;first&amp;#39;)],3)&lt;br /&gt;df_resampled[&amp;#39;price_diff&amp;#39;] = df_resampled[&amp;#39;price_diff&amp;#39;].fillna(0)&lt;br /&gt;result_df_raw = pd.DataFrame({&lt;br /&gt;    &amp;#39;price_diff&amp;#39;: df_resampled[&amp;#39;price_diff&amp;#39;],&lt;br /&gt;    &amp;#39;quantity_sum&amp;#39;: df_resampled[(&amp;#39;quantity&amp;#39;, &amp;#39;sum&amp;#39;)],&lt;br /&gt;    &amp;#39;data_count&amp;#39;: df_resampled[(&amp;#39;price&amp;#39;, &amp;#39;count&amp;#39;)]&lt;br /&gt;})&lt;br /&gt;result_df = result_df_raw[result_df_raw[&amp;#39;price_diff&amp;#39;] != 0]&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [24]:&lt;br /&gt;```&lt;br /&gt;df = result_df.copy()&lt;br /&gt;bins = np.arange(0, 30000, 100)  # &lt;br /&gt;labels = [f&amp;#39;{i}-{i+100-1}&amp;#39; for i in bins[:-1]]  &lt;br /&gt;df.loc[:, &amp;#39;quantity_group&amp;#39;] = pd.cut(df[&amp;#39;quantity_sum&amp;#39;], bins=bins, labels=labels)&lt;br /&gt;grouped = df.groupby(&amp;#39;quantity_group&amp;#39;)[&amp;#39;price_diff&amp;#39;].mean()&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [25]:&lt;br /&gt;```&lt;br /&gt;grouped_df = pd.DataFrame(grouped).reset_index()&lt;br /&gt;grouped_df[&amp;#39;quantity_group_center&amp;#39;] = grouped_df[&amp;#39;quantity_group&amp;#39;].apply(lambda x: (float(x.split(&amp;#39;-&amp;#39;)[0]) + float(x.split(&amp;#39;-&amp;#39;)[1])) / 2)&lt;br /&gt;&lt;br /&gt;plt.figure(figsize=(10,5))&lt;br /&gt;plt.scatter(grouped_df[&amp;#39;quantity_group_center&amp;#39;], grouped_df[&amp;#39;price_diff&amp;#39;],s=10)&lt;br /&gt;plt.plot(grouped_df[&amp;#39;quantity_group_center&amp;#39;], np.array(grouped_df[&amp;#39;quantity_group_center&amp;#39;].values)/2e6-0.000352,color=&amp;#39;red&amp;#39;)&lt;br /&gt;plt.xlabel(&amp;#39;quantity_group_center&amp;#39;)&lt;br /&gt;plt.ylabel(&amp;#39;average price_diff&amp;#39;)&lt;br /&gt;plt.title(&amp;#39;Scatter plot of average price_diff by quantity_group&amp;#39;)&lt;br /&gt;plt.grid(True)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[25]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149644
" title="https://stocksharp.com/file/149644
"&gt;https://stocksharp.com/file/149644
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In [19]:&lt;br /&gt;```&lt;br /&gt;grouped_df.head(10)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[19]:&lt;br /&gt;, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149643
" title="https://stocksharp.com/file/149643
"&gt;https://stocksharp.com/file/149643
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Preliminary Optimal Order Placement&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;With the modeling of trade amount and the rough model of price impact corresponding to trade amount, it seems possible to calculate the optimal order placement. Let&amp;#39;s make some assumptions and provide an irresponsible optimal price position.&lt;br /&gt;&lt;br /&gt;1. Assume that the price regresses to its original value after the impact (which is highly unlikely and would require further analysis of the price change after the impact).&lt;br /&gt;2. Assume that the distribution of trade amount and order frequency during this period follows a preset pattern (which is also inaccurate, as we are estimating based on one day&amp;#39;s data and trading exhibits clear clustering phenomena).&lt;br /&gt;3. Assume that only one sell order occurs during the simulated time and then is closed.&lt;br /&gt;4. Assume that after the order is executed, there are other buy orders that continue to push up the price, especially when the amount is very low. This effect is ignored here, and it is simply assumed that the price will regress.&lt;br /&gt;&lt;br /&gt;Let&amp;#39;s start by writing a simple expected return, which is the probability of cumulative buy orders exceeding Q within 1 second, multiplied by the expected return rate (i.e., the price impact).&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149640
" title="https://stocksharp.com/file/149640
"&gt;https://stocksharp.com/file/149640
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Based on the graph, the maximum expected return is approximately 2500, which is about 2.5 times the average trade amount. This suggests that the sell order should be placed at a price position of 2500. It is important to emphasize that the horizontal axis represents trade amount within 1 second and should not be equated with depth position. Additionally, this analysis is based on trades data and lacks important depth data.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;We have discovered that trade amount distribution at different time intervals is a simple scaling of the distribution of individual trade amounts. We have also developed a simple expected return model based on price impact and trade probability. The results of this model align with our expectations, showing that if the sell order amount is low, it indicates a price decrease, and a certain amount is needed for profit potential. The probability decreases as the trade amount increases, with an optimal size in between, which represents the optimal order placement strategy. However, this model is still too simplistic. In the next article, I will delve deeper into this topic.&lt;br /&gt;&lt;br /&gt;In [20]:&lt;br /&gt;```&lt;br /&gt;# Cumulative distribution in 1s&lt;br /&gt;df_resampled = buy_trades[&amp;#39;quantity&amp;#39;].resample(&amp;#39;1S&amp;#39;).sum()&lt;br /&gt;df_resampled = df_resampled.to_frame(name=&amp;#39;quantity&amp;#39;)&lt;br /&gt;df_resampled = df_resampled[df_resampled[&amp;#39;quantity&amp;#39;]&amp;gt;0]&lt;br /&gt;&lt;br /&gt;depths = np.array(range(0, 15000, 10))&lt;br /&gt;mean = df_resampled[&amp;#39;quantity&amp;#39;].mean()&lt;br /&gt;alpha = np.log(np.mean(df_resampled[&amp;#39;quantity&amp;#39;] &amp;gt; mean))/np.log(2.05)&lt;br /&gt;probabilities_s = np.array([((1+20**(-depth/mean))*depth/mean+1)**(alpha) for depth in depths])&lt;br /&gt;profit_s = np.array([depth/2e6-0.000352 for depth in depths])&lt;br /&gt;plt.figure(figsize=(10, 5))&lt;br /&gt;plt.plot(depths, probabilities_s*profit_s)&lt;br /&gt;plt.xlabel(&amp;#39;Q&amp;#39;)&lt;br /&gt;plt.ylabel(&amp;#39;Excpet profit&amp;#39;)&lt;br /&gt;plt.grid(True)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[20]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149641
" title="https://stocksharp.com/file/149641
"&gt;https://stocksharp.com/file/149641
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y65E87vDtvnJJc474NzmMzPPJN9Y6ZnGodgAgIvD-7H_bi-YS7AzPMc0hOvgIv-dIZK3J240VMWnZN8XmoOVCgHY" title="https://blog.mathquant.com/2023/08/04/thoughts-on-high-frequency-trading-strategies-2.html"&gt;https://blog.mathquant.c...rading-strategies-2.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25622/</id>
    <title type="text">Thoughts on High-Frequency Trading Strategies (1)</title>
    <published>2024-03-25T09:08:04Z</published>
    <updated>2024-03-25T09:08:04Z</updated>
    <author>
      <name>FMZQuant</name>
      <uri>https://stocksharp.com/users/185759/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#strategy" />
    <category term="#code" />
    <category term="#market" />
    <category term="#fmz" />
    <category term="#exchange" />
    <category term="#highfrequency" />
    <category term="#formula" />
    <category term="#crypto" />
    <category term="#order" />
    <content type="html">I have written two articles on high-frequency trading of digital currencies, namely &amp;quot;[Digital Currency High-Frequency Strategy Detailed Introduction](https://www.fmz.com/bbs-topic/10009)&amp;quot; and &amp;quot;[Earn 80 Times in 5 Days, the Power of High-frequency Strategy](https://www.fmz.com/bbs-topic/9750)&amp;quot;. However, these articles can only be considered as sharing experiences and provide a general overview. This time, I plan to write a series of articles to introduce the thought process behind high-frequency trading from scratch. I hope to keep it concise and clear, but due to my limited expertise, my understanding of high-frequency trading may not be very in-depth. This article should be seen as a starting point for discussion, and I welcome corrections and guidance from experts.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Source of High-Frequency Profits&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In my previous articles, I mentioned that high-frequency strategies are particularly suitable for markets with extremely volatile fluctuations. The price changes of a trading instrument within a short period of time consist of overall trends and oscillations. While it is indeed profitable if we can accurately predict trend changes, this is also the most challenging aspect. In this article, I will primarily focus on high-frequency maker strategies and will not delve into trend prediction. In oscillating markets, by placing bid and ask orders strategically, if the frequency of executions is high enough and the profit margin is significant, it can cover potential losses caused by trends. In this way, profitability can be achieved without predicting market movements. Currently, exchanges provide rebates for maker trades, which are also a component of profits. The more competitive the market, the higher the proportion of rebates should be.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Problems to be Addressed&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1. The first problem in implementing a strategy that places both buy and sell orders is determining where to place these orders. The closer the orders are placed to the market depth, the higher the probability of execution. However, in highly volatile market conditions, the price at which an order is instantly executed may be far from the market depth, resulting in insufficient profit. On the other hand, placing orders too far away reduces the probability of execution. This is an optimization problem that needs to be addressed.&lt;br /&gt;&lt;br /&gt;2. Position control is crucial to manage risk. A strategy cannot accumulate excessive positions for extended periods. This can be addressed by controlling the distance and quantity of orders placed, as well as setting limits on overall positions.&lt;br /&gt;&lt;br /&gt;To achieve the above objectives, modeling and estimation are required for various aspects such as execution probabilities, profit from executions, and market estimation. There are numerous articles and papers available on this topic, using keywords such as &amp;quot;High-Frequency Trading&amp;quot; and &amp;quot;Orderbook.&amp;quot; Many recommendations can also be found online, although further elaboration is beyond the scope of this article. Additionally, it is advisable to establish a reliable and fast backtesting system. Although high-frequency strategies can easily be validated through live trading, backtesting provides additional insights and helps reduce the cost of trial and error.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Required Data&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Binance provides [downloadable data](https://www.binance.com/en/landing/data) for individual trades and best bid/ask orders. Depth data can be downloaded through their API by being whitelisted, or it can be collected manually. For backtesting purposes, aggregated trade data is sufficient. In this article, we will use the example of HOOKUSDT-aggTrades-2023-01-27 data.&lt;br /&gt;&lt;br /&gt;In [1]:&lt;br /&gt;```&lt;br /&gt;from datetime import date,datetime&lt;br /&gt;import time&lt;br /&gt;import pandas as pd&lt;br /&gt;import numpy as np&lt;br /&gt;import matplotlib.pyplot as plt&lt;br /&gt;%matplotlib inline&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;The individual trade data includes the followings:&lt;br /&gt;&lt;br /&gt;1. agg_trade_id: The ID of the aggregated trade.&lt;br /&gt;2. price: The price at which the trade was executed.&lt;br /&gt;3. quantity: The quantity of the trade.&lt;br /&gt;4. first_trade_id: In cases where multiple trades are aggregated, this represents the ID of the first trade.&lt;br /&gt;5. last_trade_id: The ID of the last trade in the aggregation.&lt;br /&gt;6. transact_time: The timestamp of the trade execution.&lt;br /&gt;7. is_buyer_maker: Indicates the direction of the trade. &amp;quot;True&amp;quot; represents a buy order executed as a maker, while a sell order is executed as a taker.&lt;br /&gt;&lt;br /&gt;It can be seen that there were 660,000 trades executed on that day, indicating a highly active market. The CSV file will be attached in the comments section.&lt;br /&gt;&lt;br /&gt;In [4]:&lt;br /&gt;```&lt;br /&gt;trades = pd.read_csv(&amp;#39;COMPUSDT-aggTrades-2023-07-02.csv&amp;#39;)&lt;br /&gt;trades&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[4]:&lt;br /&gt;, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149605
" title="https://stocksharp.com/file/149605
"&gt;https://stocksharp.com/file/149605
&lt;/a&gt;&lt;br /&gt;664475 rows &amp;#215; 7 columns&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Modeling Individual Trade Amount&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;First, the data is processed by dividing the original trades into two groups: buy orders executed as makers and sell orders executed as takers. Additionally, the original aggregated trade data combines trades executed at the same time, at the same price, and in the same direction into a single data point. For example, if there is a single buy order with a volume of 100, it may be split into two trades with volumes of 60 and 40, respectively, if the prices are different. This can affect the estimation of buy order volumes. Therefore, it is necessary to aggregate the data again based on the transact_time. After this second aggregation, the data volume is reduced by 140,000 records.&lt;br /&gt;&lt;br /&gt;In [6]:&lt;br /&gt;```&lt;br /&gt;trades[&amp;#39;date&amp;#39;] = pd.to_datetime(trades[&amp;#39;transact_time&amp;#39;], unit=&amp;#39;ms&amp;#39;)&lt;br /&gt;trades.index = trades[&amp;#39;date&amp;#39;]&lt;br /&gt;buy_trades = trades[trades[&amp;#39;is_buyer_maker&amp;#39;]==False].copy()&lt;br /&gt;sell_trades = trades[trades[&amp;#39;is_buyer_maker&amp;#39;]==True].copy()&lt;br /&gt;buy_trades = buy_trades.groupby(&amp;#39;transact_time&amp;#39;).agg({&lt;br /&gt;    &amp;#39;agg_trade_id&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;price&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;quantity&amp;#39;: &amp;#39;sum&amp;#39;,&lt;br /&gt;    &amp;#39;first_trade_id&amp;#39;: &amp;#39;first&amp;#39;,&lt;br /&gt;    &amp;#39;last_trade_id&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;is_buyer_maker&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;date&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;transact_time&amp;#39;:&amp;#39;last&amp;#39;&lt;br /&gt;})&lt;br /&gt;sell_trades = sell_trades.groupby(&amp;#39;transact_time&amp;#39;).agg({&lt;br /&gt;    &amp;#39;agg_trade_id&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;price&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;quantity&amp;#39;: &amp;#39;sum&amp;#39;,&lt;br /&gt;    &amp;#39;first_trade_id&amp;#39;: &amp;#39;first&amp;#39;,&lt;br /&gt;    &amp;#39;last_trade_id&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;is_buyer_maker&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;date&amp;#39;: &amp;#39;last&amp;#39;,&lt;br /&gt;    &amp;#39;transact_time&amp;#39;:&amp;#39;last&amp;#39;&lt;br /&gt;})&lt;br /&gt;buy_trades[&amp;#39;interval&amp;#39;]=buy_trades[&amp;#39;transact_time&amp;#39;] - buy_trades[&amp;#39;transact_time&amp;#39;].shift()&lt;br /&gt;sell_trades[&amp;#39;interval&amp;#39;]=sell_trades[&amp;#39;transact_time&amp;#39;] - sell_trades[&amp;#39;transact_time&amp;#39;].shift()&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In [10]:&lt;br /&gt;```&lt;br /&gt;print(trades.shape[0] - (buy_trades.shape[0]+sell_trades.shape[0]))&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out [10]:&lt;br /&gt;146181&lt;br /&gt;&lt;br /&gt;Take buy orders as an example, let&amp;#39;s first plot a histogram. It can be observed that there is a significant long-tail effect, with the majority of data concentrated towards the leftmost part of the histogram. However, there are also a few large trades distributed towards the tail end.&lt;br /&gt;&lt;br /&gt;In [36]:&lt;br /&gt;```&lt;br /&gt;buy_trades[&amp;#39;quantity&amp;#39;].plot.hist(bins=200,figsize=(10, 5));&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out [36]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149606
" title="https://stocksharp.com/file/149606
"&gt;https://stocksharp.com/file/149606
&lt;/a&gt;&lt;br /&gt;For easier observation, let&amp;#39;s trim the tail and analyze the data. It can be observed that as the trade amount increases, the frequency of occurrence decreases, and the rate of decrease becomes faster.&lt;br /&gt;&lt;br /&gt;In [37]:&lt;br /&gt;```&lt;br /&gt;buy_trades[&amp;#39;quantity&amp;#39;][buy_trades[&amp;#39;quantity&amp;#39;]&amp;lt;200].plot.hist(bins=200,figsize=(10, 5));&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out [37]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149607
" title="https://stocksharp.com/file/149607
"&gt;https://stocksharp.com/file/149607
&lt;/a&gt;&lt;br /&gt;There have been numerous studies on the distribution of trade amounts. It has been found that trade amounts follow a power-law distribution, also known as a Pareto distribution, which is a common probability distribution in statistical physics and social sciences. In a power-law distribution, the probability of an event&amp;#39;s size (or frequency) is proportional to a negative exponent of that event&amp;#39;s size. The main characteristic of this distribution is that the frequency of large events (i.e., those far from the average) is higher than expected in many other distributions. This is precisely the characteristic of trade amount distribution. The form of the Pareto distribution is given by P(x) = Cx^(-α). Let&amp;#39;s empirically verify this.&lt;br /&gt;&lt;br /&gt;The following graph represents the probability of trade amounts exceeding a certain value. The blue line represents the actual probability, while the orange line represents the simulated probability. Please note that we won&amp;#39;t go into the specific parameters at this point. It can be observed that the distribution indeed follows a Pareto distribution. Since the probability of trade amounts being greater than zero is 1, and in order to satisfy normalization, the distribution equation should be as follows:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149608
" title="https://stocksharp.com/file/149608
"&gt;https://stocksharp.com/file/149608
&lt;/a&gt;&lt;br /&gt;Here, N is the parameter for normalization. We will choose the average trade amount, M, and set alpha to -2.06. The specific estimation of alpha can be obtained by calculating the P-value when D=N. Specifically, alpha = log(P(d&amp;gt;M))/log(2). The choice of different points may result in slight differences in the value of alpha.&lt;br /&gt;&lt;br /&gt;In [55]:&lt;br /&gt;```&lt;br /&gt;depths = range(0, 250, 2)&lt;br /&gt;probabilities = np.array([np.mean(buy_trades[&amp;#39;quantity&amp;#39;] &amp;gt; depth) for depth in depths])&lt;br /&gt;alpha = np.log(np.mean(buy_trades[&amp;#39;quantity&amp;#39;] &amp;gt; mean_quantity))/np.log(2)&lt;br /&gt;mean_quantity = buy_trades[&amp;#39;quantity&amp;#39;].mean()&lt;br /&gt;probabilities_s = np.array([(1+depth/mean_quantity)**alpha for depth in depths])&lt;br /&gt;&lt;br /&gt;plt.figure(figsize=(10, 5))&lt;br /&gt;plt.plot(depths, probabilities)&lt;br /&gt;plt.plot(depths, probabilities_s)&lt;br /&gt;plt.xlabel(&amp;#39;Depth&amp;#39;)&lt;br /&gt;plt.ylabel(&amp;#39;Probability of execution&amp;#39;)&lt;br /&gt;plt.title(&amp;#39;Execution probability at different depths&amp;#39;)&lt;br /&gt;plt.grid(True)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[55]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149613
" title="https://stocksharp.com/file/149613
"&gt;https://stocksharp.com/file/149613
&lt;/a&gt;&lt;br /&gt;In [56]:&lt;br /&gt;```&lt;br /&gt;plt.figure(figsize=(10, 5))&lt;br /&gt;plt.grid(True)&lt;br /&gt;plt.title(&amp;#39;Diff&amp;#39;)&lt;br /&gt;plt.plot(depths, probabilities_s-probabilities);&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[56]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149610
" title="https://stocksharp.com/file/149610
"&gt;https://stocksharp.com/file/149610
&lt;/a&gt;&lt;br /&gt;However, this estimation is only approximate, as shown in the graph where we plot the difference between the simulated and actual values. When the trade amount is small, the deviation is significant, even approaching 10%. Although selecting different points during parameter estimation may improve the accuracy of that specific point&amp;#39;s probability, it does not solve the deviation issue as a whole. This discrepancy arises from the difference between the power-law distribution and the actual distribution. To obtain more accurate results, the equation of the power-law distribution needs to be modified. The specific process is not elaborated here, but in summary, after a moment of insight, it is found that the actual equation should be as follows:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149612
" title="https://stocksharp.com/file/149612
"&gt;https://stocksharp.com/file/149612
&lt;/a&gt;&lt;br /&gt;To simplify, let&amp;#39;s use r = q/M to represent the normalized trade amount. We can estimate the parameters using the same method as before. The following graph shows that after the modification, the maximum deviation is no more than 2%. In theory, further adjustments can be made, but this level of accuracy is already sufficient.&lt;br /&gt;&lt;br /&gt;In [52]:&lt;br /&gt;```&lt;br /&gt;depths = range(0, 250, 2)&lt;br /&gt;probabilities = np.array([np.mean(buy_trades[&amp;#39;quantity&amp;#39;] &amp;gt; depth) for depth in depths])&lt;br /&gt;mean = buy_trades[&amp;#39;quantity&amp;#39;].mean()&lt;br /&gt;alpha = np.log(np.mean(buy_trades[&amp;#39;quantity&amp;#39;] &amp;gt; mean))/np.log(2.05)&lt;br /&gt;probabilities_s = np.array([(((1+20**(-depth/mean))*depth+mean)/mean)**alpha for depth in depths])&lt;br /&gt;&lt;br /&gt;plt.figure(figsize=(10, 5))&lt;br /&gt;plt.plot(depths, probabilities)&lt;br /&gt;plt.plot(depths, probabilities_s)&lt;br /&gt;plt.xlabel(&amp;#39;Depth&amp;#39;)&lt;br /&gt;plt.ylabel(&amp;#39;Probability of execution&amp;#39;)&lt;br /&gt;plt.title(&amp;#39;Execution probability at different depths&amp;#39;)&lt;br /&gt;plt.grid(True)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[52]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149609
" title="https://stocksharp.com/file/149609
"&gt;https://stocksharp.com/file/149609
&lt;/a&gt;&lt;br /&gt;In [53]:&lt;br /&gt;```&lt;br /&gt;plt.figure(figsize=(10, 5))&lt;br /&gt;plt.grid(True)&lt;br /&gt;plt.title(&amp;#39;Diff&amp;#39;)&lt;br /&gt;plt.plot(depths, probabilities_s-probabilities);&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Out[53]:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149611
" title="https://stocksharp.com/file/149611
"&gt;https://stocksharp.com/file/149611
&lt;/a&gt;&lt;br /&gt;With the estimated equation for the trade amount distribution, it is important to note that the probabilities in the equation are not the actual probabilities, but conditional probabilities. At this point, we can answer the question: What is the probability that the next order will be greater than a certain value? We can also determine the probability of orders at different depths being executed (in an ideal scenario, without considering order additions, cancellations, and queueing at the same depth).&lt;br /&gt;&lt;br /&gt;At this point, the length of the text is already quite long, and there are still many questions that need to be answered. The following series of articles will attempt to provide answers.&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y65E87vDtvnJJc474NzmMzPPJN9Y6ZnGodgAgIvD-7H_bi-YS7AzPMc0hOvgIv-dIZMVywi_S3WoczZm2nla8u14" title="https://blog.mathquant.com/2023/08/04/thoughts-on-high-frequency-trading-strategies-1.html"&gt;https://blog.mathquant.c...rading-strategies-1.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25621/</id>
    <title type="text">Empower Your Quantitative Trading: Unleashing the Potential of FMZ Mobile App Trading Terminal</title>
    <published>2024-03-25T08:01:20Z</published>
    <updated>2024-03-25T08:03:06Z</updated>
    <author>
      <name>FMZQuant</name>
      <uri>https://stocksharp.com/users/185759/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#code" />
    <category term="#terminal" />
    <category term="#program" />
    <category term="#market" />
    <category term="#crypto" />
    <category term="#asset" />
    <category term="#FMZQuant" />
    <category term="#plugin" />
    <category term="#tool" />
    <content type="html">In the field of quantitative trading, simple and easy-to-use quantitative trading tools have always been one of the keys to achieving wealth growth and risk management. However, with increasing market competition, traditional trading tools are no longer sufficient to meet rapidly changing market demands. To maintain a competitive edge for quantitative traders in the constantly evolving digital asset world, FMZ Mobile App has added a significant new feature: Trading Terminal. This feature will not only improve your trading efficiency, but also empower you through custom plugin programs to assist in trading, injecting new vitality into your trading career.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Beginner&amp;amp;#39;s Guide to Trading Terminal:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;What is the FMZ Mobile APP Trading Terminal?&lt;/b&gt;&lt;br /&gt;On the FMZ Quant Trading Platform, you can download the FMZ Quant Mobile APP from the [Mobile App download page](https://www.fmz.com/mobile). After downloading and installing, open the FMZ mobile app and log in with your FMZ account.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149582
" title="https://stocksharp.com/file/149582
"&gt;https://stocksharp.com/file/149582
&lt;/a&gt;&lt;br /&gt;Please note that FMZ Quant is divided into FMZ.COM international site and FMZ.CN China domestic site (supporting different markets). When logging in, you need to choose the corresponding site. Accounts for different sites are independent and not interchangeable.&lt;br /&gt;&lt;br /&gt;The FMZ Quantitative Trading Platform mobile APP trading terminal is a quantitative trading tool that encapsulates APIs from major exchanges. It allows quick switching between various exchanges, and with the help of various features of the FMZ platform, it can perform data capture analysis, real-time data monitoring, program-assisted trading, semi-automatic/manual trading operations etc.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How to access and enable the trading terminal function?&lt;/b&gt;&lt;br /&gt;After logging into the FMZ Quant Mobile APP, you can see the &amp;amp;quot;Trading Terminal&amp;amp;quot; function on the main interface. Click to enter the trading terminal interface.&lt;br /&gt;&lt;br /&gt;Before FMZ launched its mobile APP trading terminal, FMZ&amp;amp;#39;s web version had already launched this feature quite early. Whether it is a web-based trading terminal or a mobile APP-based one, **at least one docker program must be deployed**.&lt;br /&gt;This is because all actual requests sent to exchanges are executed from the docker, not on the mobile app, which is safer. It also avoids disadvantages such as API KEY binding IP addresses and inability to use when mobile IP changes.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149581
" title="https://stocksharp.com/file/149581
"&gt;https://stocksharp.com/file/149581
&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Detailed Explanation of Trading Terminal Interface&lt;/b&gt;&lt;br /&gt;**1. Main Interface of the Trading Terminal:**&lt;br /&gt;&lt;br /&gt;After opening the trading terminal, you can see the main interface of the trading terminal. Clicking on the area in red frame will open up &amp;amp;quot;Docker&amp;amp;quot;, &amp;amp;quot;Exchange&amp;amp;quot;, and &amp;amp;quot;Markets&amp;amp;quot; configuration interfaces.&lt;br /&gt;&lt;br /&gt;- Docker: All docker programs deployed under your current FMZ account will be listed here for selection.&lt;br /&gt;- Exchange: The exchange objects (configured with API KEY information etc.) created in your current FMZ account will also appear in corresponding lists for specific operation selections.&lt;br /&gt;- Markets: Set up the trading pair or contract that this trading terminal is going to operate. The input box widget for trading pairs will display selectable trading pairs/contracts based on entered information.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149583
" title="https://stocksharp.com/file/149583
"&gt;https://stocksharp.com/file/149583
&lt;/a&gt;&lt;br /&gt;**2. Trading Zone:**&lt;br /&gt;&lt;br /&gt;The Trading Zone displays market depth data;&lt;br /&gt;Trading widgets can be set with order price, order quantity, order direction, leverage and other settings.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149577
" title="https://stocksharp.com/file/149577
"&gt;https://stocksharp.com/file/149577
&lt;/a&gt;&lt;br /&gt;The bottom tabs of the main interface display information such as &amp;amp;quot;Orders&amp;amp;quot;, &amp;amp;quot;Assets&amp;amp;quot;, making your funds, and orders clear at a glance.&lt;br /&gt;&lt;br /&gt;**3. K-line Chart:**&lt;br /&gt;&lt;br /&gt;If you wish to view the K-line chart while placing an order, a thoughtful design has been implemented here - a collapsible display widget that unfolds the mini K-line chart of the current product.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149578
" title="https://stocksharp.com/file/149578
"&gt;https://stocksharp.com/file/149578
&lt;/a&gt;&lt;br /&gt;If you wish to view the K-line chart in a larger area, display market transaction records, depth information and more, you can click on this K-line icon to jump to the professional K-line chart page.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149576
" title="https://stocksharp.com/file/149576
"&gt;https://stocksharp.com/file/149576
&lt;/a&gt;&lt;br /&gt;The professional K-line chart interface:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149580
" title="https://stocksharp.com/file/149580
"&gt;https://stocksharp.com/file/149580
&lt;/a&gt;&lt;br /&gt;The professional K-line chart interface can also be displayed in landscape mode:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149579
" title="https://stocksharp.com/file/149579
"&gt;https://stocksharp.com/file/149579
&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Trading Plugin&lt;/b&gt;&lt;br /&gt;What can a trading terminal plugin do?&lt;br /&gt;&lt;br /&gt;- Real-time market data calculation and display.&lt;br /&gt;- Order placement and order management.&lt;br /&gt;- Implement risk management.&lt;br /&gt;- Semi-automatic auxiliary trading strategies.&lt;br /&gt;&lt;br /&gt;Which programming languages and tools are used to develop plugins?&lt;br /&gt;&lt;br /&gt;- python&lt;br /&gt;- javascript&lt;br /&gt;- c++&lt;br /&gt;&lt;br /&gt;What can you get?&lt;br /&gt;&lt;br /&gt;- Share your plugin with the community for mutual learning with developers.&lt;br /&gt;- Learn from other developers and get inspired.&lt;br /&gt;- Interact with other quantitative trading enthusiasts.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Give an Example Based on a Real-life Application Scenario:&lt;/b&gt;&lt;br /&gt;In the FMZ community, a user has put forward such a request:&lt;br /&gt;&lt;br /&gt;&amp;amp;gt; Use js to traverse all U contract currencies of the Binance exchange, and open a position of 10u (long) for each currency. How is this code written?&lt;br /&gt;&lt;br /&gt;This requirement scenario can be implemented with trading terminal plugins actually, and running plugin strategies on the trading terminal is free of charge. Compared to long-term live trading strategies, using trading terminal plugins as an aid is undoubtedly a good choice.&lt;br /&gt;&lt;br /&gt;Let&amp;amp;#39;s see how to design and implement the user&amp;amp;#39;s request.&lt;br /&gt;&lt;br /&gt;Firstly, we need to create a trading terminal plugin and add three parameters to its strategy:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149592
" title="https://stocksharp.com/file/149592
"&gt;https://stocksharp.com/file/149592
&lt;/a&gt;&lt;br /&gt;Then start writing the plugin program:&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;function main() {&lt;br /&gt;    let exName = exchange.GetName()&lt;br /&gt;    if (exName != &amp;amp;quot;Futures_Binance&amp;amp;quot;) {&lt;br /&gt;        return &amp;amp;quot;not support!&amp;amp;quot;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    let apiBase = &amp;amp;quot;https://fapi.binance.com&amp;amp;quot;&lt;br /&gt;    if (isSimulate) {&lt;br /&gt;        apiBase = &amp;amp;quot;https://testnet.binancefuture.com&amp;amp;quot;        &lt;br /&gt;        Log(&amp;amp;quot;Switch base address:&amp;amp;quot;, apiBase)&lt;br /&gt;    }&lt;br /&gt;    exchange.SetBase(apiBase)&lt;br /&gt;    &lt;br /&gt;    try {&lt;br /&gt;        var obj = JSON.parse(HttpQuery(apiBase + &amp;amp;quot;/fapi/v1/exchangeInfo&amp;amp;quot;))&lt;br /&gt;    } catch (e) {&lt;br /&gt;        Log(e)&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    let pairs = []&lt;br /&gt;    for (var i in obj.symbols) {&lt;br /&gt;        if (obj.symbols[i][&amp;amp;quot;status&amp;amp;quot;] !== &amp;amp;quot;TRADING&amp;amp;quot; || obj.symbols[i][&amp;amp;quot;quoteAsset&amp;amp;quot;] !== &amp;amp;quot;USDT&amp;amp;quot;) {&lt;br /&gt;            continue&lt;br /&gt;        }&lt;br /&gt;        let = pair = obj.symbols[i][&amp;amp;quot;baseAsset&amp;amp;quot;] + &amp;amp;quot;_&amp;amp;quot; + obj.symbols[i][&amp;amp;quot;quoteAsset&amp;amp;quot;]&lt;br /&gt;        pairs.push(pair)&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    let markets = _C(exchange.GetMarkets)&lt;br /&gt;    for (var i in pairs) {&lt;br /&gt;        // /*&lt;br /&gt;        // For testing purposes, only 10 varieties are opened here. If all varieties are needed, this comment content can be deleted.&lt;br /&gt;        if (i &amp;amp;gt;= 9) {&lt;br /&gt;            break&lt;br /&gt;        }&lt;br /&gt;        // */&lt;br /&gt;&lt;br /&gt;        let pair = pairs[i]&lt;br /&gt;        exchange.SetCurrency(pair)&lt;br /&gt;        exchange.SetContractType(&amp;amp;quot;swap&amp;amp;quot;)&lt;br /&gt;        let ticker = exchange.GetTicker()&lt;br /&gt;        if (!ticker) {&lt;br /&gt;            continue &lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        let = amountPrecision = markets[pair + &amp;amp;quot;.swap&amp;amp;quot;][&amp;amp;quot;AmountPrecision&amp;amp;quot;]&lt;br /&gt;        exchange.SetDirection(&amp;amp;quot;buy&amp;amp;quot;)&lt;br /&gt;        let amount = _N(qty / ticker.Last, amountPrecision)&lt;br /&gt;        if (amount &amp;amp;gt; 0) {&lt;br /&gt;            exchange.Buy(-1, amount)&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        Sleep(100)&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Obtain all positions&lt;br /&gt;    let pos = exchange.IO(&amp;amp;quot;api&amp;amp;quot;, &amp;amp;quot;GET&amp;amp;quot;, &amp;amp;quot;/fapi/v2/positionRisk&amp;amp;quot;)&lt;br /&gt;    if (!pos) {&lt;br /&gt;        return &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    // View positions&lt;br /&gt;    return pos.filter(item =&amp;amp;gt; Number(item.positionAmt) != 0)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;After the trading terminal plugin is written, it can be tested:&lt;br /&gt;&lt;br /&gt;In the trading terminal of the mobile APP, click on the &amp;amp;#39;...&amp;amp;#39; button to open the list of trading terminal plugins. All plugins in the strategy library of your current FMZ account will be displayed in this list for selection and use.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149593
" title="https://stocksharp.com/file/149593
"&gt;https://stocksharp.com/file/149593
&lt;/a&gt;&lt;br /&gt;After completing the operation on the mobile APP, we use the following code to query the position of Binance&amp;amp;#39;s simulation bot:&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;function main() {&lt;br /&gt;    let apiBase = &amp;amp;quot;https://testnet.binancefuture.com&amp;amp;quot;&lt;br /&gt;    exchange.SetBase(apiBase)&lt;br /&gt;&lt;br /&gt;    let pos = exchange.IO(&amp;amp;quot;api&amp;amp;quot;, &amp;amp;quot;GET&amp;amp;quot;, &amp;amp;quot;/fapi/v2/positionRisk&amp;amp;quot;)&lt;br /&gt;    if (!pos) {&lt;br /&gt;        return &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // View positions&lt;br /&gt;    return pos.filter(item =&amp;amp;gt; Number(item.positionAmt) != 0)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;Data found:&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;[{&lt;br /&gt;	&amp;amp;quot;symbol&amp;amp;quot;: &amp;amp;quot;ETCUSDT&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;entryPrice&amp;amp;quot;: &amp;amp;quot;16.17&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;unRealizedProfit&amp;amp;quot;: &amp;amp;quot;0.08567881&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;positionSide&amp;amp;quot;: &amp;amp;quot;LONG&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;updateTime&amp;amp;quot;: 1698420908103,&lt;br /&gt;	&amp;amp;quot;isolated&amp;amp;quot;: false,&lt;br /&gt;	&amp;amp;quot;breakEvenPrice&amp;amp;quot;: &amp;amp;quot;16.176468&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;leverage&amp;amp;quot;: &amp;amp;quot;20&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;adlQuantile&amp;amp;quot;: 3,&lt;br /&gt;	&amp;amp;quot;positionAmt&amp;amp;quot;: &amp;amp;quot;0.65&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;markPrice&amp;amp;quot;: &amp;amp;quot;16.30181356&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;liquidationPrice&amp;amp;quot;: &amp;amp;quot;0&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;maxNotionalValue&amp;amp;quot;: &amp;amp;quot;400000&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;marginType&amp;amp;quot;: &amp;amp;quot;cross&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;notional&amp;amp;quot;: &amp;amp;quot;10.59617881&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isolatedMargin&amp;amp;quot;: &amp;amp;quot;0.00000000&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isAutoAddMargin&amp;amp;quot;: &amp;amp;quot;false&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isolatedWallet&amp;amp;quot;: &amp;amp;quot;0&amp;amp;quot;&lt;br /&gt;}, {&lt;br /&gt;	&amp;amp;quot;positionAmt&amp;amp;quot;: &amp;amp;quot;105&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;markPrice&amp;amp;quot;: &amp;amp;quot;0.09371526&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;liquidationPrice&amp;amp;quot;: &amp;amp;quot;0&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;leverage&amp;amp;quot;: &amp;amp;quot;20&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;maxNotionalValue&amp;amp;quot;: &amp;amp;quot;90000&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;positionSide&amp;amp;quot;: &amp;amp;quot;LONG&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isolatedWallet&amp;amp;quot;: &amp;amp;quot;0&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;symbol&amp;amp;quot;: &amp;amp;quot;TRXUSDT&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;updateTime&amp;amp;quot;: 1698420906668,&lt;br /&gt;	&amp;amp;quot;breakEvenPrice&amp;amp;quot;: &amp;amp;quot;0.094497784&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isolatedMargin&amp;amp;quot;: &amp;amp;quot;0.00000000&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isolated&amp;amp;quot;: false,&lt;br /&gt;	&amp;amp;quot;entryPrice&amp;amp;quot;: &amp;amp;quot;0.09446&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;adlQuantile&amp;amp;quot;: 1,&lt;br /&gt;	&amp;amp;quot;unRealizedProfit&amp;amp;quot;: &amp;amp;quot;-0.07819770&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isAutoAddMargin&amp;amp;quot;: &amp;amp;quot;false&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;notional&amp;amp;quot;: &amp;amp;quot;9.84010230&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;marginType&amp;amp;quot;: &amp;amp;quot;cross&amp;amp;quot;&lt;br /&gt;}, {&lt;br /&gt;	&amp;amp;quot;unRealizedProfit&amp;amp;quot;: &amp;amp;quot;-0.00974456&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isAutoAddMargin&amp;amp;quot;: &amp;amp;quot;false&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;notional&amp;amp;quot;: &amp;amp;quot;9.97449543&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isolatedWallet&amp;amp;quot;: &amp;amp;quot;0.50309216&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;updateTime&amp;amp;quot;: 1698420905377,&lt;br /&gt;	&amp;amp;quot;markPrice&amp;amp;quot;: &amp;amp;quot;67.85371047&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isolatedMargin&amp;amp;quot;: &amp;amp;quot;0.49334760&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;adlQuantile&amp;amp;quot;: 2,&lt;br /&gt;	&amp;amp;quot;symbol&amp;amp;quot;: &amp;amp;quot;LTCUSDT&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;entryPrice&amp;amp;quot;: &amp;amp;quot;67.92&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;liquidationPrice&amp;amp;quot;: &amp;amp;quot;64.91958163&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;maxNotionalValue&amp;amp;quot;: &amp;amp;quot;250000&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;positionSide&amp;amp;quot;: &amp;amp;quot;LONG&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isolated&amp;amp;quot;: true,&lt;br /&gt;	&amp;amp;quot;positionAmt&amp;amp;quot;: &amp;amp;quot;0.147&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;breakEvenPrice&amp;amp;quot;: &amp;amp;quot;67.947168&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;leverage&amp;amp;quot;: &amp;amp;quot;20&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;marginType&amp;amp;quot;: &amp;amp;quot;isolated&amp;amp;quot;&lt;br /&gt;}, {&lt;br /&gt;	&amp;amp;quot;liquidationPrice&amp;amp;quot;: &amp;amp;quot;1613.23261508&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;marginType&amp;amp;quot;: &amp;amp;quot;isolated&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isolated&amp;amp;quot;: true,&lt;br /&gt;	&amp;amp;quot;symbol&amp;amp;quot;: &amp;amp;quot;ETHUSDT&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;entryPrice&amp;amp;quot;: &amp;amp;quot;1784.27&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;markPrice&amp;amp;quot;: &amp;amp;quot;1783.35661952&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isAutoAddMargin&amp;amp;quot;: &amp;amp;quot;false&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;positionSide&amp;amp;quot;: &amp;amp;quot;LONG&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;notional&amp;amp;quot;: &amp;amp;quot;8.91678309&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;leverage&amp;amp;quot;: &amp;amp;quot;10&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;maxNotionalValue&amp;amp;quot;: &amp;amp;quot;30000000&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isolatedWallet&amp;amp;quot;: &amp;amp;quot;0.89551774&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;adlQuantile&amp;amp;quot;: 1,&lt;br /&gt;	&amp;amp;quot;positionAmt&amp;amp;quot;: &amp;amp;quot;0.005&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;breakEvenPrice&amp;amp;quot;: &amp;amp;quot;1784.983708&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;unRealizedProfit&amp;amp;quot;: &amp;amp;quot;-0.00456690&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isolatedMargin&amp;amp;quot;: &amp;amp;quot;0.89095084&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;updateTime&amp;amp;quot;: 1698420900362&lt;br /&gt;}, {&lt;br /&gt;	&amp;amp;quot;positionAmt&amp;amp;quot;: &amp;amp;quot;17.1&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;marginType&amp;amp;quot;: &amp;amp;quot;cross&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isolatedWallet&amp;amp;quot;: &amp;amp;quot;0&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;adlQuantile&amp;amp;quot;: 2,&lt;br /&gt;	&amp;amp;quot;liquidationPrice&amp;amp;quot;: &amp;amp;quot;0&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;maxNotionalValue&amp;amp;quot;: &amp;amp;quot;250000&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;positionSide&amp;amp;quot;: &amp;amp;quot;LONG&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isolated&amp;amp;quot;: false,&lt;br /&gt;	&amp;amp;quot;symbol&amp;amp;quot;: &amp;amp;quot;EOSUSDT&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;breakEvenPrice&amp;amp;quot;: &amp;amp;quot;0.6432572&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;updateTime&amp;amp;quot;: 1698420904257,&lt;br /&gt;	&amp;amp;quot;isolatedMargin&amp;amp;quot;: &amp;amp;quot;0.00000000&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isAutoAddMargin&amp;amp;quot;: &amp;amp;quot;false&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;notional&amp;amp;quot;: &amp;amp;quot;10.34550000&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;entryPrice&amp;amp;quot;: &amp;amp;quot;0.643&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;markPrice&amp;amp;quot;: &amp;amp;quot;0.60500000&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;unRealizedProfit&amp;amp;quot;: &amp;amp;quot;-0.64980000&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;leverage&amp;amp;quot;: &amp;amp;quot;20&amp;amp;quot;&lt;br /&gt;}, {&lt;br /&gt;	&amp;amp;quot;isolated&amp;amp;quot;: false,&lt;br /&gt;	&amp;amp;quot;adlQuantile&amp;amp;quot;: 1,&lt;br /&gt;	&amp;amp;quot;liquidationPrice&amp;amp;quot;: &amp;amp;quot;0&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;maxNotionalValue&amp;amp;quot;: &amp;amp;quot;10000000&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;notional&amp;amp;quot;: &amp;amp;quot;9.73993328&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;leverage&amp;amp;quot;: &amp;amp;quot;20&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;updateTime&amp;amp;quot;: 1698420901638,&lt;br /&gt;	&amp;amp;quot;symbol&amp;amp;quot;: &amp;amp;quot;BCHUSDT&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;entryPrice&amp;amp;quot;: &amp;amp;quot;250.0&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;markPrice&amp;amp;quot;: &amp;amp;quot;243.49833219&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isAutoAddMargin&amp;amp;quot;: &amp;amp;quot;false&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;positionSide&amp;amp;quot;: &amp;amp;quot;LONG&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;positionAmt&amp;amp;quot;: &amp;amp;quot;0.040&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;breakEvenPrice&amp;amp;quot;: &amp;amp;quot;250.1&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isolatedMargin&amp;amp;quot;: &amp;amp;quot;0.00000000&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;unRealizedProfit&amp;amp;quot;: &amp;amp;quot;-0.26006671&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;marginType&amp;amp;quot;: &amp;amp;quot;cross&amp;amp;quot;,&lt;br /&gt;	&amp;amp;quot;isolatedWallet&amp;amp;quot;: &amp;amp;quot;0&amp;amp;quot;&lt;br /&gt;}]&lt;br /&gt;```&lt;br /&gt;It can be seen that 6 positions have been opened, this is because when placing actual orders on the simulation bot, it&amp;amp;#39;s easy to trigger limit prices; in addition, due to the order amount of 10U, it&amp;amp;#39;s easy to trigger the minimum order amount limit of trading pairs; therefore a few trading pairs were not successfully ordered. &lt;br /&gt;If you need to use this in reality, more practical situations should be considered in order to optimize this plugin for better usage. The code here is only used for teaching and communication purposes.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Other Interesting Built-in Plugins on FMZ&lt;/b&gt;&lt;br /&gt;The FMZ Quant Trading Platform mobile app trading terminal has many interesting plugins. Come and explore together!&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAADHZKb-RfbDOdB_w3dJgQKt9xqN8kE5Kkn-fL4pSIl_5-9VqG_BAKkEzhNdGLTTMwnI5ljyUq5pbzTOWEMQ7bzY" title="https://www.fmz.com/upload/asset/16b436307a4ce5c246c2.mp4
"&gt;https://www.fmz.com/uplo...6b436307a4ce5c246c2.mp4
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The End&lt;/b&gt;&lt;br /&gt;The new trading terminal feature of the FMZ mobile app will become your powerful assistant in the digital asset market, allowing you to respond more flexibly to market fluctuations and opportunities. No longer limited to traditional trading strategies, through custom plugin programs, you can create smarter, more efficient trading strategies that are better adapted to the market. Let&amp;amp;#39;s start this exciting new chapter of quantitative trading together and enhance your trading skills and profits.&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y63a22F2g41PdIIqGtgrMebs9U-8zB3jppLQsJFjxtN8exAtDhnKLxg8X28K29FII8kW57BT0P9cr7xn_l-OMDUnmcxtt9YY008hfWQnZtbHAy33nzd_Dc_PB_c9yUT16PA" title="https://blog.mathquant.com/2023/10/30/fmz-mobile-app-trading-terminal-empowering-your-quantitative-trading-experience.html"&gt;https://blog.mathquant.c...-trading-experience.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25619/</id>
    <title type="text">Navigating Position Risk: Unveiling VaR Method for Effective Measurement</title>
    <published>2024-03-25T05:16:19Z</published>
    <updated>2024-03-25T05:16:19Z</updated>
    <author>
      <name>FMZQuant</name>
      <uri>https://stocksharp.com/users/185759/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#market" />
    <category term="#fmz" />
    <category term="#risk" />
    <category term="#crypto" />
    <category term="#asset" />
    <category term="#algorithm" />
    <category term="#loss" />
    <category term="#position" />
    <category term="#VaR" />
    <content type="html">Controlling risk is a skill that every investor needs to learn. With the rapidly changing and evolving cryptocurrency market, algorithmic traders need to focus on risk management especially. This is because algorithmic trading often executes trades automatically based on historical data and statistical models, which may quickly become inaccurate in fast-moving markets. Therefore, effective risk management strategies are crucial for protecting investors&amp;#39; capital.&lt;br /&gt;&lt;br /&gt;Among many risk management tools, Value at Risk (VaR) is a widely used measure of risk. It can help investors predict the maximum loss that might occur under normal market conditions in their portfolio. VaR quantifies risk into a single number, simplifying the expression of risk and allowing investors to understand potential losses intuitively.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Role of VaR&lt;/b&gt;&lt;br /&gt;VaR, or &amp;quot;Value at Risk&amp;quot;, is used to quantify the maximum possible loss that can be endured within a certain period of time, according to a certain confidence level. In other words, it tells investors or risk managers: &amp;quot;Under normal market conditions, how much money is within the &amp;#39;safe&amp;#39; range and will not be lost tomorrow.&amp;quot; For example, if the 1-day 99% VaR of a cryptocurrency portfolio is $10,000, it means that in 99% of cases we expect the loss in one day will not exceed $10,000.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Advantages&lt;/b&gt;&lt;br /&gt;1. **Easy to understand** : For example, the 1-day 95% VaR of a digital currency portfolio is $5000, which means there is a 95% confidence that the loss of the portfolio within one day will not exceed $5000. Quantifying complex risks into an intuitive number makes it easy for non-professionals to understand. Of course, it&amp;#39;s inevitably to have some misleading aspects.&lt;br /&gt;&lt;br /&gt;2. **Relatively standard** : Suppose there are two portfolios A and B, with A&amp;#39;s 1-day 95% VaR being $3000 and B&amp;#39;s being $6000. This implies that under normal market conditions, A&amp;#39;s risk is lower than B&amp;#39;s. Even if these two portfolios contain different assets, we can compare their risk levels directly. Correspondingly, we can also judge the level of investment; if both strategies A and B have earned $6000 in the past month but A&amp;#39;s average and maximum VaR values are significantly lower than B&amp;#39;s, then we could consider strategy A as better, since it achieves higher returns at a lower risk level.&lt;br /&gt;&lt;br /&gt;3. **Decision-making tool** : Traders might use VaR to decide whether or not to add a new asset to their portfolio. If adding an asset increases the VaR value significantly, then it may suggest that the added asset&amp;#39;s risk does not match with the portfolio&amp;#39;s acceptable risk level.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Disadvantages&lt;/b&gt;&lt;br /&gt;1. **Ignoring tail risk** : If a portfolio&amp;#39;s 1-day 99% VaR is $10,000, the loss in the extreme 1% scenario could far exceed this value. In the field of digital currency, black swan events are frequent and extreme situations can exceed most people&amp;#39;s expectations, because VaR does not consider tail events.&lt;br /&gt;&lt;br /&gt;2. **Assumption limitations** : The parameter VaR often assumes that asset returns are normally distributed, which is rarely the case in real markets, especially in digital currency markets. For example, suppose a portfolio only contains Bitcoin. We use the parameter VaR and assume that Bitcoin&amp;#39;s return is normally distributed. However, in reality, Bitcoin&amp;#39;s rate of return may experience large jumps during certain periods and exhibit significant volatility clustering phenomena. If there has been high volatility over the past week, the probability of noticeable volatility in the following period will increase significantly. This can lead to an underestimation of risk by normal distribution models. Some models take this issue into account such as GARCH etc., but we won&amp;#39;t discuss them here.&lt;br /&gt;&lt;br /&gt;3. **Historical dependence** : The VaR model relies on historical data to predict future risks. However, past performance does not always indicate future situations, especially in rapidly changing markets like the digital currency market. For example, if Bitcoin has been very stable over the past year, a historical simulation might predict a very low VaR. However, if there is a sudden regulatory change or market crash, past data will no longer be an effective predictor of future risk.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Methods of Calculating VaR&lt;/b&gt;&lt;br /&gt;There are mainly three methods to calculate VaR: Parametric method (Variance-Covariance Method): This assumes that the rate of return follows a certain distribution (usually normal distribution), and we use the mean and standard deviation of the rate of return to calculate VaR. Historical Simulation Method: It makes no assumptions about the distribution of returns, but uses historical data directly to determine potential loss distributions. Monte Carlo Simulation: It uses randomly generated price paths to simulate asset prices and calculates VaR from them.&lt;br /&gt;&lt;br /&gt;The Historical Simulation Method utilizes past price changes directly to estimate possible future losses. It does not need any assumptions about profit distribution, making it suitable for assets with unknown or abnormal profit distributions, such as digital currencies.&lt;br /&gt;&lt;br /&gt;For example, if we want to calculate 1-day 95% VaR for a Bitcoin spot position, we can do this:&lt;br /&gt;&lt;br /&gt;1. Collect the daily returns of Bitcoin over a certain period (for example, 100 days).&lt;br /&gt;2. Calculate the portfolio return rate each day, which is the return rate of each asset multiplied by its weight in the portfolio.&lt;br /&gt;3. Sort these 100 days of portfolio returns from low to high.&lt;br /&gt;4. Find the data point at the 5% mark (because we are calculating 95% VaR). The point represents the loss rate on the best day out of worst five days in past 100 days.&lt;br /&gt;5. Multiply the return by total value held, and that&amp;#39;s your one-day 95% VaR.&lt;br /&gt;&lt;br /&gt;The following is a specific code that has obtained data from the past 1000 days, calculating that the current VaR for holding one BTC spot is 1980 USDT.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;import numpy as np&lt;br /&gt;import requests&lt;br /&gt;&lt;br /&gt;url = &amp;#39;https://api.binance.com/api/v3/klines?symbol=%s&amp;amp;interval=%s&amp;amp;limit=1000&amp;#39;%(&amp;#39;BTCUSDT&amp;#39;,&amp;#39;1d&amp;#39;)&lt;br /&gt;res = requests.get(url)&lt;br /&gt;data = res.json()&lt;br /&gt;&lt;br /&gt;confidence_level = 0.95&lt;br /&gt;closing_prices = [float(day[4]) for day in data]&lt;br /&gt;log_returns = np.diff(np.log(closing_prices))&lt;br /&gt;VaR = np.percentile(log_returns, (1 - confidence_level) * 100)&lt;br /&gt;money_at_risk = VaR * closing_prices[-1] * 1&lt;br /&gt;&lt;br /&gt;print(f&amp;quot;VaR at {confidence_level*100}% confidence level is {money_at_risk}&amp;quot;)&lt;br /&gt;```&lt;br /&gt;&lt;b&gt;Calculating VaR Considering Correlation&lt;/b&gt;&lt;br /&gt;When calculating the VaR of a portfolio containing multiple assets, we must consider the correlation between these assets. If there is a positive correlation in price changes between assets, then the risk of the portfolio will increase; if it&amp;#39;s negatively correlated, then the risk of the portfolio will decrease.&lt;br /&gt;&lt;br /&gt;When using historical simulation method to calculate VaR considering correlation, we need to collect not only each individual asset&amp;#39;s historical returns, but also consider their joint distribution. In practice, you can use the historical returns of your portfolio for sorting and calculation directly, because these returns already implicitly include inter-asset correlations. In cryptocurrency markets, correlation is especially important with BTC essentially leading market trends. If BTC rises bullishly, other cryptocurrencies are likely to rise as well; if BTC rapidly surges or plummets due to quickly changing market, this could cause significant short-term increases in correlation - something that is particularly common during extreme market events. Therefore, historical simulation method is a useful tool when considering digital currency investment portfolios&amp;#39; VaR calculations. It doesn&amp;#39;t require complex statistical models - just effective historical data - and naturally includes inter-asset correlations.&lt;br /&gt;&lt;br /&gt;For example: holding 1 long position on BTC and 10 short positions on ETH – following our previous method – we can calculate that 10 ETH short positions have a VaR of 1219 USDT. When combining these two types of assets into one portfolio, here&amp;#39;s how you would calculate its combined VaR:&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;confidence_level = 0.95&lt;br /&gt;btc_closing_prices = np.array([float(day[4]) for day in btc_data])&lt;br /&gt;eth_closing_prices = np.array([float(day[4]) for day in eth_data])&lt;br /&gt;btc_log_returns = np.diff(np.log(btc_closing_prices))&lt;br /&gt;eth_log_returns = np.diff(np.log(eth_closing_prices))&lt;br /&gt;&lt;br /&gt;log_returns = (1*btc_log_returns*btc_closing_prices[1:] - 10*eth_log_returns*eth_closing_prices[1:])/(1*btc_closing_prices[1:] + 10*eth_closing_prices[1:])&lt;br /&gt;VaR = np.percentile(log_returns, (1 - confidence_level) * 100)&lt;br /&gt;money_at_risk = VaR * (btc_closing_prices[-1] * 1 + eth_closing_prices[-1]*10)&lt;br /&gt;&lt;br /&gt;print(f&amp;quot;VaR at {confidence_level*100}% confidence level is {money_at_risk}&amp;quot;)&lt;br /&gt;```&lt;br /&gt;The result is 970 USDT, which means the risk of this combination is lower than holding the respective assets separately. This is because BTC and ETH markets have a high correlation, and the hedging effect of long-short position combinations serves to reduce risk.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;This article will introduce a highly adaptive risk assessment method, namely the application of Historical Simulation in calculating VaR, as well as how to consider asset correlations to optimize risk prediction. Through specific examples from the digital currency market, it explains how to use historical simulation to assess portfolio risks and discusses methods for calculating VaR when asset correlations are significant. With this method, algorithmic traders can not only estimate their maximum loss in most situations, but also be prepared for extreme market conditions. This allows them to trade more calmly and execute strategies accurately.&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y6yFNy3NAma5skPNX7KdFj0RWQ__h8we_fnMRera2xT2iq6SFSaO1FaN1f00dhxbQf2dmlQD8eohKaz7Mp4XSXjTfkM4rtSJXvtnSP36nhko8" title="https://blog.mathquant.com/2023/11/03/how-to-measure-position-risk-an-introduction-to-the-var-method.html"&gt;https://blog.mathquant.c...n-to-the-var-method.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25618/</id>
    <title type="text">Exploring Unconventional Trading Techniques: The K-Line Area Trading Strategy</title>
    <published>2024-03-25T03:03:22Z</published>
    <updated>2024-03-25T03:03:22Z</updated>
    <author>
      <name>FMZQuant</name>
      <uri>https://stocksharp.com/users/185759/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#strategy" />
    <category term="#code" />
    <category term="#fmz" />
    <category term="#risk" />
    <category term="#Kline" />
    <category term="#indicator" />
    <category term="#crypto" />
    <category term="#price" />
    <category term="#trend" />
    <content type="html">Looking at a not-so-reliable trading idea -- the K-line area trading strategy, in this article, we will explore the concept and try to implement the script.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Main Idea of the K-Line Area Strategy&lt;/b&gt;&lt;br /&gt;The K-line area strategy is a trading strategy based on the area relationship between price K-lines and moving averages. Its main idea is to predict possible trends in stock prices by analyzing the magnitude and changes of price trends, as well as shifts in buying and selling sentiment, thereby determining when to open positions and exit. This strategy relies on the area between the K-line and moving averages, as well as values from the KDJ indicator, to generate long and short trading signals.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Principle of K-Line Area Strategy&lt;/b&gt;&lt;br /&gt;The area of the K-line refers to the spatial area between the price K-line and the moving average, calculated by subtracting the moving average value from each bar&amp;#39;s closing price and then summing it up. When there is a large increase in price over a long period of time, the K-line area will become larger, while during volatile markets or after volatility reversals, the K-line area is smaller. According to the principle of &amp;quot;what goes up must come down&amp;quot;, as an upward trend becomes larger and lasts longer, its corresponding K-line area also increases; thus increasing its probability for reversal - much like a spring that rebounds with greater force when stretched further. Therefore, setting a threshold for this K-line area can indicate when prices may have reached their peak and are likely to reverse.&lt;br /&gt;&lt;br /&gt;To further confirm an impending trend reversal, we introduce the use of KDJ indicators which help determine shifts in buying or selling sentiment. The thresholds for the strategy and values for these indicators can be adjusted according to specific circumstances and needs in order to enhance accuracy.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Advantages of K-Line Area Strategy&lt;/b&gt;&lt;br /&gt;The advantage of the K-line area strategy lies in its combination of the magnitude and changes of price trends, as well as the shift in buying and selling sentiment, providing a relatively complete quantitative trading strategy. Its advantages include:&lt;br /&gt;&lt;br /&gt;- It provides a simple and intuitive method to identify the possibility of trend reversal, helping traders better grasp market trends.&lt;br /&gt;- By combining the K-line area and KDJ indicator, it increases the reliability and accuracy of the strategy.&lt;br /&gt;- High flexibility allows for parameter adjustments according to market conditions to meet different trading needs.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Risk of K-line Area Strategy&lt;/b&gt;&lt;br /&gt;Although the K-line area strategy has certain advantages, it also carries some risks, including:&lt;br /&gt;&lt;br /&gt;- The setting of thresholds may require some experience and adjustment. If it set improperly, it could lead to misjudgment of market trends.&lt;br /&gt;- The accuracy of the KDJ indicator is affected by market fluctuations and noise, which may result in false signals.&lt;br /&gt;- The performance of the strategy may vary under different market conditions and needs constant optimization and adjustment.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Optimization Direction of K-line Area Strategy&lt;/b&gt;&lt;br /&gt;To optimize the K-line area strategy, consider the following directions:&lt;br /&gt;&lt;br /&gt;- Parameter optimization: Continuously adjust and optimize threshold values and KDJ indicator parameters to adapt to different market conditions and trading needs.&lt;br /&gt;- Risk management: Implement effective risk management strategies, including stop-loss and take-profit rules, to reduce loss risks.&lt;br /&gt;- Multi-strategy combination: Combine the K-line area strategy with other strategies to improve the performance of comprehensive trading strategies.&lt;br /&gt;- Real-time monitoring and adjustment: Regularly monitor the performance of strategies, adjusting and improving based on actual situations.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Implement the Strategy Using JavaScript&lt;/b&gt;&lt;br /&gt;- Calculate K-line Area&lt;br /&gt;&lt;br /&gt;- Long position opening signal:&lt;br /&gt;&lt;br /&gt;  (1) The &amp;quot;K-line area&amp;quot; of the downward trend reaches the threshold, it can be established beforehand.&lt;br /&gt;&lt;br /&gt;  (2) KDJ indicator value is greater than 80.&lt;br /&gt;&lt;br /&gt;- Short position opening signal:&lt;br /&gt;&lt;br /&gt;  (1) The &amp;quot;K-line area&amp;quot; of the upward trend reaches the threshold, it can be established beforehand.&lt;br /&gt;&lt;br /&gt;  (2) KDJ indicator value is less than 20.&lt;br /&gt;&lt;br /&gt;- Exit for Long/Short positions: ATR trailing stop loss and take profit.&lt;br /&gt;&lt;br /&gt;Code implementation&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;// Parameter&lt;br /&gt;var maPeriod = 30&lt;br /&gt;var threshold = 50000&lt;br /&gt;var amount = 0.1&lt;br /&gt;&lt;br /&gt;// Global variable&lt;br /&gt;let c = KLineChart({})&lt;br /&gt;let openPrice = 0&lt;br /&gt;let tradeState = &amp;quot;NULL&amp;quot;  // NULL BUY SELL&lt;br /&gt;&lt;br /&gt;function calculateKLineArea(r, ma) {&lt;br /&gt;    var lastCrossUpIndex = null&lt;br /&gt;    var lastCrossDownIndex = null&lt;br /&gt;    for (var i = r.length - 1 ; i &amp;gt;= 0 ; i--) {&lt;br /&gt;        if (ma[i] !== null &amp;amp;&amp;amp; r[i].Open &amp;lt; ma[i] &amp;amp;&amp;amp; r[i].Close &amp;gt; ma[i]) {&lt;br /&gt;            lastCrossUpIndex = i&lt;br /&gt;            break&lt;br /&gt;        } else if (ma[i] !== null &amp;amp;&amp;amp; r[i].Open &amp;gt; ma[i] &amp;amp;&amp;amp; r[i].Close &amp;lt; ma[i]) {&lt;br /&gt;            lastCrossDownIndex = i&lt;br /&gt;            break&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if (i &amp;gt;= 1 &amp;amp;&amp;amp; ma[i] !== null &amp;amp;&amp;amp; ma[i - 1] !== null &amp;amp;&amp;amp; r[i - 1].Close &amp;lt; ma[i - 1] &amp;amp;&amp;amp; r[i].Close &amp;gt; ma[i]) {&lt;br /&gt;            lastCrossUpIndex = i&lt;br /&gt;            break&lt;br /&gt;        } else if (i &amp;gt;= 1 &amp;amp;&amp;amp; ma[i] !== null &amp;amp;&amp;amp; ma[i - 1] !== null &amp;amp;&amp;amp; r[i - 1].Close &amp;gt; ma[i - 1] &amp;amp;&amp;amp; r[i].Close &amp;lt; ma[i]) {&lt;br /&gt;            lastCrossDownIndex = i&lt;br /&gt;            break&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    var area = 0&lt;br /&gt;    if (lastCrossDownIndex !== null) {&lt;br /&gt;        for (var i = r.length - 1 ; i &amp;gt;= lastCrossDownIndex ; i--) {&lt;br /&gt;            area -= Math.abs(r[i].Close - ma[i])&lt;br /&gt;        }&lt;br /&gt;    } else if (lastCrossUpIndex !== null) {&lt;br /&gt;        for (var i = r.length - 1 ; i &amp;gt;= lastCrossUpIndex ; i--) {&lt;br /&gt;            area += Math.abs(r[i].Close - ma[i])&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return [area, lastCrossUpIndex, lastCrossDownIndex]&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function onTick() {&lt;br /&gt;    var r = _C(exchange.GetRecords)&lt;br /&gt;    if (r.length &amp;lt; maPeriod) {&lt;br /&gt;        LogStatus(_D(), &amp;quot;Insufficient number of K-line&amp;quot;)&lt;br /&gt;        return &lt;br /&gt;    }&lt;br /&gt;    var ma = TA.MA(r, maPeriod)&lt;br /&gt;    var atr = TA.ATR(r)&lt;br /&gt;    var kdj = TA.KDJ(r)&lt;br /&gt;    var lineK = kdj[0]&lt;br /&gt;    var lineD = kdj[1]&lt;br /&gt;    var lineJ = kdj[2]&lt;br /&gt;    var areaInfo = calculateKLineArea(r, ma)&lt;br /&gt;    var area = _N(areaInfo[0], 0)&lt;br /&gt;    var lastCrossUpIndex = areaInfo[1]&lt;br /&gt;    var lastCrossDownIndex = areaInfo[2]&lt;br /&gt;    &lt;br /&gt;    r.forEach(function(bar, index) {&lt;br /&gt;        c.begin(bar)&lt;br /&gt;        c.plotcandle(bar.Open, bar.High, bar.Low, bar.Close, {overlay: true})&lt;br /&gt;        let maLine = c.plot(ma[index], &amp;quot;ma&amp;quot;, {overlay: true})&lt;br /&gt;        let close = c.plot(bar.Close, &amp;#39;close&amp;#39;, {overlay: true})&lt;br /&gt;        c.fill(maLine, close, {color: bar.Close &amp;gt; ma[index] ? &amp;#39;rgba(255, 0, 0, 0.1)&amp;#39; : &amp;#39;rgba(0, 255, 0, 0.1)&amp;#39;})&lt;br /&gt;        if (lastCrossUpIndex !== null) {&lt;br /&gt;            c.plotchar(bar.Time, {char: &amp;#39;$:&amp;#39; + area, overlay: true})&lt;br /&gt;        } else if (lastCrossDownIndex !== null) {&lt;br /&gt;            c.plotchar(bar.Time, {char: &amp;#39;$:&amp;#39; + area, overlay: true})&lt;br /&gt;        }&lt;br /&gt;        c.plot(lineK[index], &amp;quot;K&amp;quot;)&lt;br /&gt;        c.plot(lineD[index], &amp;quot;D&amp;quot;)&lt;br /&gt;        c.plot(lineJ[index], &amp;quot;J&amp;quot;)&lt;br /&gt;&lt;br /&gt;        c.close()&lt;br /&gt;    })&lt;br /&gt;    &lt;br /&gt;    if (tradeState == &amp;quot;NULL&amp;quot; &amp;amp;&amp;amp; area &amp;lt; -threshold &amp;amp;&amp;amp; lineK[lineK.length - 1] &amp;gt; 70) {&lt;br /&gt;        // long&lt;br /&gt;        let tradeInfo = $.Buy(amount)&lt;br /&gt;        if (tradeInfo) {&lt;br /&gt;            openPrice = tradeInfo.price&lt;br /&gt;            tradeState = &amp;quot;BUY&amp;quot;&lt;br /&gt;        }&lt;br /&gt;    } else if (tradeState == &amp;quot;NULL&amp;quot; &amp;amp;&amp;amp; area &amp;gt; threshold &amp;amp;&amp;amp; lineK[lineK.length - 1] &amp;lt; 30) {&lt;br /&gt;        // short&lt;br /&gt;        let tradeInfo = $.Sell(amount)&lt;br /&gt;        if (tradeInfo) {&lt;br /&gt;            openPrice = tradeInfo.price&lt;br /&gt;            tradeState = &amp;quot;SELL&amp;quot;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    let stopBase = tradeState == &amp;quot;BUY&amp;quot; ? Math.max(openPrice, r[r.length - 2].Close) : Math.min(openPrice, r[r.length - 2].Close)&lt;br /&gt;    if (tradeState == &amp;quot;BUY&amp;quot; &amp;amp;&amp;amp; r[r.length - 1].Close &amp;lt; stopBase - atr[atr.length - 2]) {&lt;br /&gt;        // cover long&lt;br /&gt;        let tradeInfo = $.Sell(amount)&lt;br /&gt;        if (tradeInfo) {&lt;br /&gt;            tradeState = &amp;quot;NULL&amp;quot;&lt;br /&gt;            openPrice = 0&lt;br /&gt;        }        &lt;br /&gt;    } else if (tradeState == &amp;quot;SELL&amp;quot; &amp;amp;&amp;amp; r[r.length - 1].Close &amp;gt; stopBase + atr[atr.length - 2]) {&lt;br /&gt;        // cover short &lt;br /&gt;        let tradeInfo = $.Buy(amount)&lt;br /&gt;        if (tradeInfo) {&lt;br /&gt;            tradeState = &amp;quot;NULL&amp;quot;&lt;br /&gt;            openPrice = 0&lt;br /&gt;        }        &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    LogStatus(_D(), &amp;quot;area:&amp;quot;, area, &amp;quot;, lineK[lineK.length - 2]:&amp;quot;, lineK[lineK.length - 2])&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function main() {    &lt;br /&gt;    if (exchange.GetName().includes(&amp;quot;_Futures&amp;quot;)) {&lt;br /&gt;        throw &amp;quot;not support Futures&amp;quot;&lt;br /&gt;    }&lt;br /&gt;    while (true) {&lt;br /&gt;        onTick()&lt;br /&gt;        Sleep(1000)&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;The strategy logic is very simple:&lt;br /&gt;&lt;br /&gt;1. First, some global variables and parameters are defined, including:&lt;br /&gt;&lt;br /&gt;Strategy parameters&lt;br /&gt;&lt;br /&gt;- maPeriod: The period of moving average.&lt;br /&gt;- threshold: A threshold used to determine the timing of buying or selling.&lt;br /&gt;- amount: The quantity for each transaction.&lt;br /&gt;&lt;br /&gt;Global variables&lt;br /&gt;&lt;br /&gt;- c: A K-line chart object, used for drawing charts.&lt;br /&gt;- openPrice: Records the opening price.&lt;br /&gt;- tradeState: Records the trading status, which can be &amp;quot;NULL&amp;quot; (empty position), &amp;quot;BUY&amp;quot; or &amp;quot;SELL&amp;quot;.&lt;br /&gt;&lt;br /&gt;Calculate function&lt;br /&gt;&lt;br /&gt;- calculateKLineArea function: It is used to calculate the area between the price and moving average line on a K-line chart over a certain period of time, and returns the area value, the index of the last upward crossing K-line, and the index of the last downward crossing K-line. These values are used in subsequent decisions to determine when to buy and sell.&lt;br /&gt;&lt;br /&gt;Main loop function&lt;br /&gt;&lt;br /&gt;- onTick function: It is the main strategy execution function, and here are the operations within the function:&lt;br /&gt;&lt;br /&gt;  a. Obtain the latest K-line data and ensure that the number of K-lines is not less than maPeriod, otherwise record status and return.&lt;br /&gt;&lt;br /&gt;  b. Calculate moving average line ma and ATR indicator atr, as well as KDJ indicator.&lt;br /&gt;&lt;br /&gt;  c. Get area information from areaInfo, last cross-over K-line index, and last cross-under K-line index.&lt;br /&gt;&lt;br /&gt;  d. Use K-line chart object c to draw K-lines and indicator lines while filling in different colors based on price&amp;#39;s relationship with moving average line.&lt;br /&gt;&lt;br /&gt;  e. Determine buying or selling timing according to conditions:&lt;br /&gt;&lt;br /&gt;  If tradeState is &amp;quot;NULL&amp;quot;, and the area is less than -threshold, and the K value of KDJ is greater than 70, execute a buy operation.&lt;br /&gt;  If tradeState is &amp;quot;NULL&amp;quot;, and the area is greater than threshold, and the K value of KDJ is less than 30, execute a sell operation.&lt;br /&gt;  f. Set stop loss and take profit conditions. If these conditions are met, close positions:&lt;br /&gt;&lt;br /&gt;  If it&amp;#39;s in buying state, when the price falls below the closing price of last trading day minus previous day&amp;#39;s ATR (Average True Range), close position.&lt;br /&gt;  If it&amp;#39;s in selling state, when the price rises above last trading day&amp;#39;s closing price plus previous day&amp;#39;s ATR (Average True Range), close position.&lt;br /&gt;&lt;br /&gt;  main function: This serves as main execution entry point. It checks if exchange name contains &amp;quot;_Futures&amp;quot;. If so, an exception will be thrown; otherwise it enters into an infinite loop where onTick function gets executed every second.&lt;br /&gt;&lt;br /&gt;In a word, this strategy mainly relies on K-line charts and technical indicators for making buying or selling decisions while also employing stop-loss &amp;amp; take-profit strategies to manage risk. Please note that this just serves as an example strategy which needs to be adjusted &amp;amp; optimized according to market situations &amp;amp; specific requirements during actual use.&lt;br /&gt;&lt;br /&gt;On FMZ.COM, using JavaScript language didn&amp;#39;t require many lines of code, instead, it implemented this model easily. And with help from KLineChart function graphical representation of K-line chart area was easily achieved, too. The strategy design caters towards cryptocurrency spot markets by utilizing &amp;#39;Digital Currency Spot Trading Library&amp;#39; template for placing orders through encapsulated functions within template, which makes it very simple &amp;amp; easy to understand and use.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Strategy Backtesting&lt;/b&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149572
" title="https://stocksharp.com/file/149572
"&gt;https://stocksharp.com/file/149572
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149571
" title="https://stocksharp.com/file/149571
"&gt;https://stocksharp.com/file/149571
&lt;/a&gt;&lt;br /&gt;I selected a backtesting period randomly. Although I didn&amp;#39;t lose money, I didn&amp;#39;t accumulate profits continuously, either, and the drawdown issue is quite significant. There should be other directions and room for optimization for the strategy. Those who are interested can try to upgrade the strategy.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149569
" title="https://stocksharp.com/file/149569
"&gt;https://stocksharp.com/file/149569
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149570
" title="https://stocksharp.com/file/149570
"&gt;https://stocksharp.com/file/149570
&lt;/a&gt;&lt;br /&gt;Through the strategy, we not only learned a rather unconventional trading idea, but also learned how to plot diagrams; representing the area enclosed by K-line and moving average line; ploting KDJ indicators etc.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;The K-line area strategy is a trading strategy based on price trend magnitude and the KDJ indicator. It helps traders predict market trends by analyzing the area between the K-line and moving averages, as well as shifts in buying and selling sentiment. Despite certain risks, this strategy can provide powerful trading tools through continuous optimization and adjustment, helping traders better cope with market fluctuations. Moreover, traders should adjust the parameters and rules of the strategy flexibly according to specific situations and market conditions to achieve better trading performance.&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y64w0KH_McPil-CCmMm0S4csgQSlJDfYfZNqJ5KuaEFdOqAOE0PYwB0j_-adaAfZDxk8AgDet7R3RaJqt4wzHHixJP8KC83tqTfFB6E1dsCmj" title="https://blog.mathquant.com/2023/11/06/alternative-trading-ideas-k-line-area-trading-strategy.html"&gt;https://blog.mathquant.c...ea-trading-strategy.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25616/</id>
    <title type="text">High-Frequency Trading Strategy Analysis - Penny Jump</title>
    <published>2024-03-25T01:14:50Z</published>
    <updated>2024-03-25T01:14:50Z</updated>
    <author>
      <name>FMZQuant</name>
      <uri>https://stocksharp.com/users/185759/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#strategy" />
    <category term="#code" />
    <category term="#market" />
    <category term="#analysis" />
    <category term="#fmz" />
    <category term="#highfrequency" />
    <category term="#crypto" />
    <category term="#order" />
    <category term="#pennyJump" />
    <content type="html">High-frequency trading is a challenging and competitive field that relies on rapid trade execution and sensitive insights into the microstructure of the market. One notable strategy is Penny Jump, which focuses on exploiting &amp;quot;elephants&amp;quot; in the market to gain small but frequent profits. In this article, we will explain in detail how the Penny Jump strategy works, delving into the details of its code, so that beginners can understand how it operates.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Understanding the Penny Jump Strategy&lt;/b&gt;&lt;br /&gt;In the stock market, &amp;quot;elephants&amp;quot; usually refer to those institutional investors who wish to buy or sell a large number of shares but are unwilling to trade at market price. Instead, they choose to hang a large number of limit orders in the market, i.e., pending orders, to indicate their intentions. This behavior has attracted widespread attention in the market, because large transactions may have a significant impact on the market.&lt;br /&gt;&lt;br /&gt;For example, suppose the original depth of a stock&amp;#39;s market was like this: 200 | $1.01 x $1.03 | 200. Then an &amp;quot;elephant&amp;quot; enters and places a buy order for 3000 shares at $1.01 each. At this point, the depth of the market will change to 3,200 | $1.01 x $1.03 | 200 . This action is like introducing an &amp;quot;elephant&amp;quot;, which becomes the focus of other participants in the marketplace.&lt;br /&gt;&lt;br /&gt;- Competitive market&lt;br /&gt;  For high-frequency traders, their profits mainly come from the analysis of market microstructure to speculate on the intentions of other traders. Once a big player appears, high-frequency traders will establish positions quickly to capture minor price fluctuations. Their goal is to trade frequently in a short period of time and accumulate small but cumulative profits.&lt;br /&gt;&lt;br /&gt;- The Dilemma of the Elephant&lt;br /&gt;  Even though elephants might wish to operate on a large scale in the market, their actions also reveal their trading intentions, making them targets for high-frequency traders. High-frequency traders attempt to establish positions ahead of time and then profit from price fluctuations. The presence of elephants in the market could trigger reactions in competitive markets, thereby affecting their trading strategies.&lt;br /&gt;&lt;br /&gt;- Deception in the Market&lt;br /&gt;  In reality, large institutional investors usually do not place a large number of buy or sell orders in the market blatantly, as such behavior could lead other participants in the market to take countermeasures or even manipulate the market. Therefore, they may adopt strategies to create illusions, attract high-frequency traders into the field, and then quickly sell or buy to profit from price fluctuations.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Core Idea of the Penny Jump Strategy&lt;/b&gt;&lt;br /&gt;The core idea of the Penny Jump strategy is that once a &amp;quot;big player&amp;quot; appears in the market and supports a specific price (such as $1.01), high-frequency traders will quickly raise their bid by one cent, for instance, to $1.02. This is because high-frequency traders understand that the appearance of a big player means there&amp;#39;s strong buying support at this price level, so they try to follow closely in hopes of a price increase. When the price indeed rises to $1.03 x $1.05, high-frequency traders can sell quickly and earn a profit of $0.01.&lt;br /&gt;&lt;br /&gt;Not only that, but high-frequency traders can also make profits after purchasing even if the price doesn&amp;#39;t rise, because they know that the big player has supported the base price; hence they can swiftly sell their stocks to this big player and gain tiny arbitrage profits.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Analyzing Penny Jump Strategy Code&lt;/b&gt;&lt;br /&gt;Strategy source code: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAADHZKb-RfbDOdB_w3dJgQKtdiNZNpLtyGanWuMu3v9LM_2Yv3dlp98Wb2KYr6QeDwk" title="https://www.fmz.com/strategy/358
"&gt;https://www.fmz.com/strategy/358
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The strategy code provided above is an example, used to implement the Penny Jump strategy. Below is a detailed explanation of the code, enabling beginners to understand how it works:&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;var Counter = {&lt;br /&gt;    i: 0,&lt;br /&gt;    w: 0,&lt;br /&gt;    f: 0&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Variables&lt;br /&gt;var InitAccount = null;&lt;br /&gt;&lt;br /&gt;function CancelAll() {&lt;br /&gt;    while (true) {&lt;br /&gt;        var orders = _C(exchange.GetOrders);&lt;br /&gt;        if (orders.length == 0) {&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;        for (var i = 0; i &amp;lt; orders.length; i++) {&lt;br /&gt;            exchange.CancelOrder(orders[i].Id);&lt;br /&gt;        }&lt;br /&gt;        Sleep(Interval);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function updateStatus(msg) {&lt;br /&gt;    LogStatus(&amp;quot;Number of debugging sessions:&amp;quot;, Counter.i, &amp;quot;succeeded:&amp;quot;, Counter.w, &amp;quot;failed:&amp;quot;, Counter.f, &amp;quot;\n&amp;quot;+msg+&amp;quot;#0000ff\n&amp;quot;+new Date());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function main() {&lt;br /&gt;    if (DisableLog) {&lt;br /&gt;        EnableLog(false);&lt;br /&gt;    }&lt;br /&gt;    CancelAll();&lt;br /&gt;    InitAccount = _C(exchange.GetAccount);&lt;br /&gt;    Log(InitAccount);&lt;br /&gt;    var i = 0;&lt;br /&gt;    var locks = 0;&lt;br /&gt;    while (true) {&lt;br /&gt;        Sleep(Interval);&lt;br /&gt;        var depth = _C(exchange.GetDepth);&lt;br /&gt;        if (depth.Asks.length === 0 || depth.Bids.length === 0) {&lt;br /&gt;            continue;&lt;br /&gt;        }&lt;br /&gt;        updateStatus(&amp;quot;Searching within the elephant... Buy one: &amp;quot; + depth.Bids[0].Price + &amp;quot;,  Sell one:&amp;quot; + depth.Asks[0].Price + &amp;quot;, Lock times: &amp;quot; + locks);&lt;br /&gt;        var askPrice = 0;&lt;br /&gt;        for (i = 0; i &amp;lt; depth.Asks.length; i++) {&lt;br /&gt;            if (depth.Asks[i].Amount &amp;gt;= Lot) {&lt;br /&gt;                askPrice = depth.Asks[i].Price;&lt;br /&gt;                break;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        if (askPrice === 0) {&lt;br /&gt;            continue;&lt;br /&gt;        }&lt;br /&gt;        var elephant = null;&lt;br /&gt;        // skip Bids[0]&lt;br /&gt;        for (i = 1; i &amp;lt; depth.Bids.length; i++) {&lt;br /&gt;            if ((askPrice - depth.Bids[i].Price) &amp;gt; ElephantSpace) {&lt;br /&gt;                break;&lt;br /&gt;            }&lt;br /&gt;            if (depth.Bids[i].Amount &amp;gt;= ElephantAmount) {&lt;br /&gt;                elephant = depth.Bids[i];&lt;br /&gt;                break;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if (!elephant) {&lt;br /&gt;            locks = 0;&lt;br /&gt;            continue;&lt;br /&gt;        }&lt;br /&gt;        locks++;&lt;br /&gt;        if (locks &amp;lt; LockCount) {&lt;br /&gt;            continue;&lt;br /&gt;        }&lt;br /&gt;        locks = 0;&lt;br /&gt;&lt;br /&gt;        updateStatus(&amp;quot;Debug the elephant... The elephant is in gear &amp;quot; + i + &amp;quot;, &amp;quot; + JSON.stringify(elephant));&lt;br /&gt;        exchange.Buy(elephant.Price + PennyTick, Lot, &amp;quot;Bids[&amp;quot; + i + &amp;quot;]&amp;quot;, elephant);&lt;br /&gt;        var ts = new Date().getTime();&lt;br /&gt;        while (true) {&lt;br /&gt;            Sleep(CheckInterval);&lt;br /&gt;            var orders = _C(exchange.GetOrders);&lt;br /&gt;            if (orders.length == 0) {&lt;br /&gt;                break;&lt;br /&gt;            }&lt;br /&gt;            if ((new Date().getTime() - ts) &amp;gt; WaitInterval) {&lt;br /&gt;                for (var i = 0; i &amp;lt; orders.length; i++) {&lt;br /&gt;                    exchange.CancelOrder(orders[i].Id);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        var account = _C(exchange.GetAccount);&lt;br /&gt;        var opAmount = _N(account.Stocks - InitAccount.Stocks);&lt;br /&gt;        if (opAmount &amp;lt; 0.001) {&lt;br /&gt;            Counter.f++;&lt;br /&gt;            Counter.i++;&lt;br /&gt;            continue;&lt;br /&gt;        }&lt;br /&gt;        updateStatus(&amp;quot;Successful payment: &amp;quot; + opAmount +&amp;quot;, Start taking action...&amp;quot;);&lt;br /&gt;        exchange.Sell(elephant.Price + (PennyTick * ProfitTick), opAmount);&lt;br /&gt;        var success = true;&lt;br /&gt;        while (true) {&lt;br /&gt;            var depth = _C(exchange.GetDepth);&lt;br /&gt;            if (depth.Bids.length &amp;gt; 0 &amp;amp;&amp;amp; depth.Bids[0].Price &amp;lt;= (elephant.Price-(STTick*PennyTick))) {&lt;br /&gt;                success = false;&lt;br /&gt;                updateStatus(&amp;quot;Didn&amp;#39;t get it, start to stop loss, currently buying one: &amp;quot; + depth.Bids[0].Price);&lt;br /&gt;                CancelAll();&lt;br /&gt;                account = _C(exchange.GetAccount);&lt;br /&gt;                var opAmount = _N(account.Stocks - InitAccount.Stocks);&lt;br /&gt;                if (opAmount &amp;lt; 0.001) {&lt;br /&gt;                    break;&lt;br /&gt;                }&lt;br /&gt;                exchange.Sell(depth.Bids[0].Price, opAmount);&lt;br /&gt;            }&lt;br /&gt;            var orders = _C(exchange.GetOrders);&lt;br /&gt;            if (orders.length === 0) {&lt;br /&gt;                break;&lt;br /&gt;            }&lt;br /&gt;            Sleep(CheckInterval);&lt;br /&gt;        }&lt;br /&gt;        if (success) {&lt;br /&gt;            Counter.w++;&lt;br /&gt;        } else {&lt;br /&gt;            Counter.f++;&lt;br /&gt;        }&lt;br /&gt;        Counter.i++;&lt;br /&gt;        var account = _C(exchange.GetAccount);&lt;br /&gt;        LogProfit(account.Balance - InitAccount.Balance, account);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;I will parse your provided strategy code line by line to help you understand its operation in detail.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;var Counter = {&lt;br /&gt;    i: 0,&lt;br /&gt;    w: 0,&lt;br /&gt;    f: 0&lt;br /&gt;};&lt;br /&gt;```&lt;br /&gt;This code initializes an object named Counter, which is used to track the trading statistical information of a strategy. Specifically, it includes three attributes:&lt;br /&gt;&lt;br /&gt;- i: Represents the total number of transactions.&lt;br /&gt;- w: Represents the number of successful transactions.&lt;br /&gt;- f: Represents the number of failed transactions.&lt;br /&gt;&lt;br /&gt;These attributes will be recorded and updated during the strategy execution process.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;var InitAccount = null;&lt;br /&gt;```&lt;br /&gt;This line of code initializes a variable named InitAccount, which will store account information when the strategy starts executing.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;function CancelAll() {&lt;br /&gt;    while (true) {&lt;br /&gt;        var orders = _C(exchange.GetOrders);&lt;br /&gt;        if (orders.length == 0) {&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;        for (var i = 0; i &amp;lt; orders.length; i++) {&lt;br /&gt;            exchange.CancelOrder(orders[i].Id);&lt;br /&gt;        }&lt;br /&gt;        Sleep(Interval);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;This is a function named ```CancelAll()```, its purpose is to cancel all unfulfilled orders in the market. Let&amp;#39;s explain its functions step by step:&lt;br /&gt;&lt;br /&gt;- ```while (true)```: This is an infinite loop, it will continue to run until there are no uncompleted orders.&lt;br /&gt;- ```var orders = _C(exchange.GetOrders)```: This line of code uses the exchange.GetOrders function to retrieve all pending orders in the current account and stores them in the orders variable.&lt;br /&gt;- ```if (orders.length == 0)```: This line of code checks for any unfinished orders. If the length of the orders array is 0, it means there are no unfinished orders and the loop will be interrupted (break).&lt;br /&gt;- ```for (var i = 0; i &amp;lt; orders.length; i++)```: This is a for loop that iterates through all uncompleted orders.&lt;br /&gt;- ```exchange.CancelOrder(orders[i].Id)```: This line of code uses the exchange.CancelOrder() function to cancel each order by its ID.&lt;br /&gt;- ```Sleep(Interval)```: This line of code introduces a waiting period, pausing for a certain amount of time (in milliseconds), to ensure that the operation of cancelling orders is not too frequent.&lt;br /&gt;&lt;br /&gt;This line of code introduces a waiting period, pausing for a certain amount of time (in milliseconds), to ensure that the operation of cancelling orders is not too frequent.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;function updateStatus(msg) {&lt;br /&gt;    LogStatus(&amp;quot;Number of debugging sessions:&amp;quot;, Counter.i, &amp;quot;succeeded:&amp;quot;, Counter.w, &amp;quot;failed:&amp;quot;, Counter.f, &amp;quot;\n&amp;quot; + msg + &amp;quot;#0000ff\n&amp;quot; + new Date());&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;This is a function named ```updateStatus(msg)```, which is used to update and record transaction status information. It accepts a msg parameter, which usually contains information about the current market status. The specific operations of the function include:&lt;br /&gt;&lt;br /&gt;Using the ```LogStatus()``` function to record the information displayed in the status bar during strategy execution. It displays text about trade counts, successful counts, and failure counts.&lt;br /&gt;The ```msg``` parameter is appended, which contains information about the current market status.&lt;br /&gt;The current timestamp (```new Date()```) is appended to display time information.&lt;br /&gt;The purpose of this function is to record and update transaction status information for monitoring and analysis during strategy execution.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;function main() {&lt;br /&gt;    if (DisableLog) {&lt;br /&gt;        EnableLog(false);&lt;br /&gt;    }&lt;br /&gt;    CancelAll();&lt;br /&gt;    InitAccount = _C(exchange.GetAccount);&lt;br /&gt;    Log(InitAccount);&lt;br /&gt;    var i = 0;&lt;br /&gt;    var locks = 0;&lt;br /&gt;    while (true) {&lt;br /&gt;        Sleep(Interval);&lt;br /&gt;        var depth = _C(exchange.GetDepth);&lt;br /&gt;        if (depth.Asks.length === 0 || depth.Bids.length === 0) {&lt;br /&gt;            continue;&lt;br /&gt;        }&lt;br /&gt;        updateStatus(&amp;quot;Searching within the elephant... Buy one: &amp;quot; + depth.Bids[0].Price + &amp;quot;,  Sell one:&amp;quot; + depth.Asks[0].Price + &amp;quot;, Lock times: &amp;quot; + locks);&lt;br /&gt;        var askPrice = 0;&lt;br /&gt;        for (i = 0; i &amp;lt; depth.Asks.length; i++) {&lt;br /&gt;            if (depth.Asks[i].Amount &amp;gt;= Lot) {&lt;br /&gt;                askPrice = depth.Asks[i].Price;&lt;br /&gt;                break;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        if (askPrice === 0) {&lt;br /&gt;            continue;&lt;br /&gt;        }&lt;br /&gt;        var elephant = null;&lt;br /&gt;        // skip Bids[0]&lt;br /&gt;        for (i = 1; i &amp;lt; depth.Bids.length; i++) {&lt;br /&gt;            if ((askPrice - depth.Bids[i].Price) &amp;gt; ElephantSpace) {&lt;br /&gt;                break;&lt;br /&gt;            }&lt;br /&gt;            if (depth.Bids[i].Amount &amp;gt;= ElephantAmount) {&lt;br /&gt;                elephant = depth.Bids[i];&lt;br /&gt;                break;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if (!elephant) {&lt;br /&gt;            locks = 0;&lt;br /&gt;            continue;&lt;br /&gt;        }&lt;br /&gt;        locks++;&lt;br /&gt;        if (locks &amp;lt; LockCount) {&lt;br /&gt;            continue;&lt;br /&gt;        }&lt;br /&gt;        locks = 0;&lt;br /&gt;&lt;br /&gt;        updateStatus(&amp;quot;Debug the elephant... The elephant is in gear &amp;quot; + i + &amp;quot;, &amp;quot; + JSON.stringify(elephant));&lt;br /&gt;        exchange.Buy(elephant.Price + PennyTick, Lot, &amp;quot;Bids[&amp;quot; + i + &amp;quot;]&amp;quot;, elephant);&lt;br /&gt;        var ts = new Date().getTime();&lt;br /&gt;        while (true) {&lt;br /&gt;            Sleep(CheckInterval);&lt;br /&gt;            var orders = _C(exchange.GetOrders);&lt;br /&gt;            if (orders.length == 0) {&lt;br /&gt;                break;&lt;br /&gt;            }&lt;br /&gt;            if ((new Date().getTime() - ts) &amp;gt; WaitInterval) {&lt;br /&gt;                for (var i = 0; i &amp;lt; orders.length; i++) {&lt;br /&gt;                    exchange.CancelOrder(orders[i].Id);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        var account = _C(exchange.GetAccount);&lt;br /&gt;        var opAmount = _N(account.Stocks - InitAccount.Stocks);&lt;br /&gt;        if (opAmount &amp;lt; 0.001) {&lt;br /&gt;            Counter.f++;&lt;br /&gt;            Counter.i++;&lt;br /&gt;            continue;&lt;br /&gt;        }&lt;br /&gt;        updateStatus(&amp;quot;Successful payment: &amp;quot; + opAmount +&amp;quot;, Start taking action...&amp;quot;);&lt;br /&gt;        exchange.Sell(elephant.Price + (PennyTick * ProfitTick), opAmount);&lt;br /&gt;        var success = true;&lt;br /&gt;        while (true) {&lt;br /&gt;            var depth = _C(exchange.GetDepth);&lt;br /&gt;            if (depth.Bids.length &amp;gt; 0 &amp;amp;&amp;amp; depth.Bids[0].Price &amp;lt;= (elephant.Price-(STTick*PennyTick))) {&lt;br /&gt;                success = false;&lt;br /&gt;                updateStatus(&amp;quot;Didn&amp;#39;t get it, start to stop loss, currently buying one: &amp;quot; + depth.Bids[0].Price);&lt;br /&gt;                CancelAll();&lt;br /&gt;                account = _C(exchange.GetAccount);&lt;br /&gt;                var opAmount = _N(account.Stocks - InitAccount.Stocks);&lt;br /&gt;                if (opAmount &amp;lt; 0.001) {&lt;br /&gt;                    break;&lt;br /&gt;                }&lt;br /&gt;                exchange.Sell(depth.Bids[0].Price, opAmount);&lt;br /&gt;            }&lt;br /&gt;            var orders = _C(exchange.GetOrders);&lt;br /&gt;            if (orders.length === 0) {&lt;br /&gt;                break;&lt;br /&gt;            }&lt;br /&gt;            Sleep(CheckInterval);&lt;br /&gt;        }&lt;br /&gt;        if (success) {&lt;br /&gt;            Counter.w++;&lt;br /&gt;        } else {&lt;br /&gt;            Counter.f++;&lt;br /&gt;        }&lt;br /&gt;        Counter.i++;&lt;br /&gt;        var account = _C(exchange.GetAccount);&lt;br /&gt;        LogProfit(account.Balance - InitAccount.Balance, account);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;This is the main execution function ```main()``` of the strategy, which contains the core logic of the strategy. Let&amp;#39;s explain its operations line by line:&lt;br /&gt;&lt;br /&gt;- ```if (DisableLog)```: This line of code checks if the DisableLog variable is true, and if so, it will disable log recording. This is to ensure that unnecessary logs are not recorded by the strategy.&lt;br /&gt;&lt;br /&gt;- ```CancelAll()```: Call the previously explained CancelAll() function to ensure that there are no unfinished orders.&lt;br /&gt;&lt;br /&gt;- ```InitAccount = _C(exchange.GetAccount)```: This line of code retrieves the current account information and stores it in the InitAccount variable. This will be used to record the account status when the strategy starts executing.&lt;br /&gt;&lt;br /&gt;- ```var i = 0; ``` and ``` var locks = 0;```: Initialize two variables, i and locks, which will be used in the subsequent strategy logic.&lt;br /&gt;&lt;br /&gt;- ```while (true)```: This is an infinite loop, mainly used for the continuous execution of strategies.&lt;br /&gt;&lt;br /&gt;Next, we will explain the main strategy logic within the ```while (true)``` loop line by line.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;while (true) {&lt;br /&gt;    Sleep(Interval);&lt;br /&gt;    var depth = _C(exchange.GetDepth);&lt;br /&gt;    if (depth.Asks.length === 0 || depth.Bids.length === 0) {&lt;br /&gt;        continue;&lt;br /&gt;    }&lt;br /&gt;    updateStatus(&amp;quot;Searching within the elephant... Buy one: &amp;quot; + depth.Bids[0].Price + &amp;quot;,  Sell one:&amp;quot; + depth.Asks[0].Price + &amp;quot;, Lock times: &amp;quot; + locks);&lt;br /&gt;```&lt;br /&gt;- ```Sleep(Interval)```: This line of code allows the strategy to sleep for a period of time, in order to control the execution frequency of the strategy. The Interval parameter defines the sleep interval (in milliseconds).&lt;br /&gt;&lt;br /&gt;- ```var depth = _C(exchange.GetDepth)```: Obtain the current market depth information, including the prices and quantities of sell orders and buy orders. This information will be stored in the depth variable.&lt;br /&gt;&lt;br /&gt;- ```if (depth.Asks.length === 0 || depth.Bids.length === 0)```: This line of code checks the market depth information, ensuring that both sell orders and buy orders exist. If one of them does not exist, it indicates that the market may not have enough trading information, so the strategy will continue to wait.&lt;br /&gt;&lt;br /&gt;- ```updateStatus(&amp;quot;Searching within the elephant... Buy one: &amp;quot; + depth.Bids[0].Price + &amp;quot;, Sell one:&amp;quot; + depth.Asks[0].Price + &amp;quot;, Lock times: &amp;quot; + locks)```: This line of code calls the updateStatus function to update the status information of the strategy. It records the current market status, including the highest bid price, lowest ask price and previously locked times (locks).&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;    var askPrice = 0;&lt;br /&gt;    for (i = 0; i &amp;lt; depth.Asks.length; i++) {&lt;br /&gt;        if (depth.Asks[i].Amount &amp;gt;= Lot) {&lt;br /&gt;            askPrice = depth.Asks[i].Price;&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    if (askPrice === 0) {&lt;br /&gt;        continue;&lt;br /&gt;    }&lt;br /&gt;    var elephant = null;&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;- ```var askPrice = 0;```: Initialize the askPrice variable, it will be used to store the price of sell orders that meet the conditions.&lt;br /&gt;&lt;br /&gt;- ```for (i = 0; i &amp;lt; depth.Asks.length; i++)```: This is a for loop used to traverse the price and quantity information of market sell orders.&lt;br /&gt;&lt;br /&gt;- ```if (depth.Asks[i].Amount &amp;gt;= Lot)```: In the loop, check if the quantity of each sell order is greater than or equal to the specified Lot (hand count). If so, store the price of that sell order in askPrice and terminate the loop.&lt;br /&gt;&lt;br /&gt;- ```if (askPrice === 0)```: If no sell orders that meet the conditions are found (askPrice is still 0), the strategy will continue to wait and skip subsequent operations.&lt;br /&gt;&lt;br /&gt;- ```var elephant = null;```: Initialize the elephant variable, it will be used to store the buy order information identified as &amp;quot;elephant&amp;quot;.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;    for (i = 1; i &amp;lt; depth.Bids.length; i++) {&lt;br /&gt;        if ((askPrice - depth.Bids[i].Price) &amp;gt; ElephantSpace) {&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;        if (depth.Bids[i].Amount &amp;gt;= ElephantAmount) {&lt;br /&gt;            elephant = depth.Bids[i];&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (!elephant) {&lt;br /&gt;        locks = 0;&lt;br /&gt;        continue;&lt;br /&gt;    }&lt;br /&gt;    locks++;&lt;br /&gt;    if (locks &amp;lt; LockCount) {&lt;br /&gt;        continue;&lt;br /&gt;    }&lt;br /&gt;    locks = 0;&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;Continue to traverse the price and quantity information of market buy orders, skipping the first buy order (Bids[0]).&lt;br /&gt;&lt;br /&gt;- ```if ((askPrice - depth.Bids[i].Price) &amp;gt; ElephantSpace)```: Check whether the gap between the current bid price and askPrice is greater than ElephantSpace. If so, it indicates that it is far enough from the &amp;quot;elephant&amp;quot;, and the strategy will no longer continue to search.&lt;br /&gt;&lt;br /&gt;- ```if (depth.Bids[i].Amount &amp;gt;= ElephantAmount)```: Check if the quantity of the current buy order is greater than or equal to ElephantAmount. If so, store the buy order information in the elephant variable.&lt;br /&gt;&lt;br /&gt;- ```if (!elephant)```: If the &amp;quot;elephant&amp;quot; is not found, reset the lock count to 0 and continue waiting.&lt;br /&gt;&lt;br /&gt;- ```locks++```: If the &amp;quot;elephant&amp;quot; is found, increment the lock count. This is to ensure that the strategy is executed only after confirming the existence of the &amp;quot;elephant&amp;quot; multiple times over a period of time.&lt;br /&gt;&lt;br /&gt;- ```if (locks &amp;lt; LockCount)```: Check whether the number of lock times has met the requirement (LockCount). If it hasn&amp;#39;t, continue to wait.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;    updateStatus(&amp;quot;Debug the elephant... The elephant is in gear &amp;quot; + i + &amp;quot;, &amp;quot; + JSON.stringify(elephant));&lt;br /&gt;    exchange.Buy(elephant.Price + PennyTick, Lot, &amp;quot;Bids[&amp;quot; + i + &amp;quot;]&amp;quot;, elephant);&lt;br /&gt;    var ts = new Date().getTime();&lt;br /&gt;    while (true) {&lt;br /&gt;        Sleep(CheckInterval);&lt;br /&gt;        var orders = _C(exchange.GetOrders);&lt;br /&gt;        if (orders.length == 0) {&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;        if ((new Date().getTime() - ts) &amp;gt; WaitInterval) {&lt;br /&gt;            for (var i = 0; i &amp;lt; orders.length; i++) {&lt;br /&gt;                exchange.CancelOrder(orders[i].Id);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;- ```updateStatus(&amp;quot;Debug the elephant... The elephant is in gear &amp;quot; + i + &amp;quot;, &amp;quot; + JSON.stringify(elephant))```: Call the updateStatus function to record the current status of the strategy, including the gear position of the &amp;quot;elephant&amp;quot; found and related information. This will be displayed in the status bar of the strategy.&lt;br /&gt;&lt;br /&gt;- ```exchange.Buy(elephant.Price + PennyTick, Lot, &amp;quot;Bids[&amp;quot; + i + &amp;quot;]&amp;quot;, elephant)```: Use the exchange.Buy function to purchase the found &amp;quot;elephant&amp;quot;. The purchase price is elephant.Price + PennyTick, the purchase quantity is Lot, and describe the purchase operation as &amp;quot;Bids[&amp;quot; + i + &amp;quot;]&amp;quot;.&lt;br /&gt;&lt;br /&gt;- ```var ts = new Date().getTime()```: Obtain the timestamp of the current time for subsequent calculation of time intervals.&lt;br /&gt;&lt;br /&gt;- ```while (true)```: Enter a new infinite loop, used to wait for the execution of &amp;quot;elephant&amp;quot; buy orders.&lt;br /&gt;&lt;br /&gt;- ```Sleep(CheckInterval)```: The strategy sleeps for a while to control the frequency of checking order status.&lt;br /&gt;&lt;br /&gt;- ```var orders = _C(exchange.GetOrders)```: Obtain all order information of the current account.&lt;br /&gt;&lt;br /&gt;- ```if (orders.length == 0)```: Check if there are any unfinished orders, if not, break the loop.&lt;br /&gt;&lt;br /&gt;- ```(new Date().getTime() - ts) &amp;gt; WaitInterval```: Calculate the time interval between the current time and when the &amp;quot;elephant&amp;quot; was purchased. If it exceeds WaitInterval, it means that the waiting has timed out.&lt;br /&gt;&lt;br /&gt;- ```for (var i = 0; i &amp;lt; orders.length; i++)```: Traverse through all uncompleted orders.&lt;br /&gt;&lt;br /&gt;- ```exchange.CancelOrder(orders[i].Id)```: Use the exchange.CancelOrder function to cancel each unfinished order.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;    var account = _C(exchange.GetAccount);&lt;br /&gt;    var opAmount = _N(account.Stocks - InitAccount.Stocks);&lt;br /&gt;    if (opAmount &amp;lt; 0.001) {&lt;br /&gt;        Counter.f++;&lt;br /&gt;        Counter.i++;&lt;br /&gt;        continue;&lt;br /&gt;    }&lt;br /&gt;    updateStatus(&amp;quot;Successful payment: &amp;quot; + opAmount + &amp;quot;, Start taking action...&amp;quot;);&lt;br /&gt;    exchange.Sell(elephant.Price + (PennyTick * ProfitTick), opAmount);&lt;br /&gt;    var success = true;&lt;br /&gt;    while (true) {&lt;br /&gt;        var depth = _C(exchange.GetDepth);&lt;br /&gt;        if (depth.Bids.length &amp;gt; 0 &amp;amp;&amp;amp; depth.Bids[0].Price &amp;lt;= (elephant.Price - (STTick * PennyTick))) {&lt;br /&gt;            success = false;&lt;br /&gt;            updateStatus(&amp;quot;Didn&amp;#39;t get it, start to stop loss, currently buying one: &amp;quot; + depth.Bids[0].Price);&lt;br /&gt;            CancelAll();&lt;br /&gt;            account = _C(exchange.GetAccount);&lt;br /&gt;            var opAmount = _N(account.Stocks - InitAccount.Stocks);&lt;br /&gt;            if (opAmount &amp;lt; 0.001) {&lt;br /&gt;                break;&lt;br /&gt;            }&lt;br /&gt;            exchange.Sell(depth.Bids[0].Price, opAmount);&lt;br /&gt;        }&lt;br /&gt;        var orders = _C(exchange.GetOrders);&lt;br /&gt;        if (orders.length === 0) {&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;        Sleep(CheckInterval);&lt;br /&gt;    }&lt;br /&gt;    if (success) {&lt;br /&gt;        Counter.w++;&lt;br /&gt;    } else {&lt;br /&gt;        Counter.f++;&lt;br /&gt;    }&lt;br /&gt;    Counter.i++;&lt;br /&gt;    var account = _C(exchange.GetAccount);&lt;br /&gt;    LogProfit(account.Balance - InitAccount.Balance, account);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;- ```var account = _C(exchange.GetAccount)```: Obtain current account information.&lt;br /&gt;&lt;br /&gt;- ```var opAmount = _N(account.Stocks - InitAccount.Stocks)```: Calculate the change in account assets after purchasing the &amp;quot;elephant&amp;quot;. If the change is less than 0.001, it indicates that the purchase has failed, increase the number of failures and continue to the next loop.&lt;br /&gt;&lt;br /&gt;- ```updateStatus(&amp;quot;Successful payment: &amp;quot; + opAmount + &amp;quot;, Start taking action...&amp;quot;)```: Record the successful purchase information of &amp;quot;elephant&amp;quot;, including the quantity purchased.&lt;br /&gt;&lt;br /&gt;- ```exchange.Sell(elephant.Price + (PennyTick * ProfitTick), opAmount)```: Use the exchange.Sell function to sell the successfully purchased &amp;quot;elephant&amp;quot; for profit. The selling price is elephant.Price + (PennyTick * ProfitTick).&lt;br /&gt;&lt;br /&gt;Enter a new infinite loop, used to wait for the execution of sell orders.&lt;br /&gt;&lt;br /&gt;- ```var depth = _C(exchange.GetDepth)```: Obtain market depth information.&lt;br /&gt;&lt;br /&gt;- ```if (depth.Bids.length &amp;gt; 0 &amp;amp;&amp;amp; depth.Bids[0].Price &amp;lt;= (elephant.Price - (STTick * PennyTick)))```: Check the market depth information, if the market price has already fallen to the stop-loss level, then execute the stop-loss operation.&lt;br /&gt;&lt;br /&gt;- ```CancelAll()```: Call the CancelAll() function to cancel all uncompleted orders, in order to avoid position risk.&lt;br /&gt;&lt;br /&gt;- ```if (opAmount &amp;lt; 0.001)```: Check the purchase quantity again, if it&amp;#39;s less than 0.001, it indicates that the purchase has failed, break out of the loop.&lt;br /&gt;&lt;br /&gt;- ```exchange.Sell(depth.Bids[0].Price, opAmount)```: Execute a stop-loss operation, sell the remaining assets at the current market&amp;#39;s lowest price.&lt;br /&gt;&lt;br /&gt;Finally, update the number of successful and failed transactions based on whether the transaction was successful or not, and record the trading profits.&lt;br /&gt;&lt;br /&gt;This is a line-by-line explanation of the entire strategy. The core idea of this strategy is to find &amp;quot;elephants&amp;quot; (large buy orders) in the market, buy and sell them to gain small profits. It includes several important parameters, such as Lot, error retry interval (Interval), ElephantAmount, ElephantSpace, etc., to adjust the strategy.&lt;br /&gt;&lt;br /&gt;In general, this strategy is a high-frequency trading strategy aimed at utilizing market depth information to identify large buy orders and carry out buying and selling transactions in a short period. It needs constant monitoring of the market and execution of buying and selling operations to quickly gain small profits. However, it&amp;#39;s also a high-risk strategy, because it requires quick responses to market fluctuations while considering risk management and stop-loss mechanisms to avoid significant losses.&lt;br /&gt;&lt;br /&gt;Please note that the strategy is based on specific markets and trading platforms. For different markets and exchanges, appropriate adjustments and optimizations may be needed. In practical application, investors need to carefully test and evaluate the performance of the strategy to ensure it aligns with their investment goals and risk tolerance.&lt;br /&gt;&lt;br /&gt;As you continue to execute the strategy, it will repeatedly perform the following operations:&lt;br /&gt;&lt;br /&gt;1. Firstly, the strategy will check the depth information of the market to understand the current situation of sell orders and buy orders.&lt;br /&gt;&lt;br /&gt;2. Next, the strategy will attempt to find sell orders that meet the criteria, specifically sell orders with a quantity greater than or equal to Lot. If a qualifying sell order is found, the price of the sell order will be recorded as askPrice.&lt;br /&gt;&lt;br /&gt;3. Then, the strategy will continue to search for &amp;quot;elephants&amp;quot; (large amount of buy orders). It will traverse through the market&amp;#39;s buy orders, skipping the first one (usually the highest-priced buy order). If it finds an &amp;quot;elephant&amp;quot; that meets the criteria, it will record information about the &amp;quot;elephant&amp;quot;, and increase locks.&lt;br /&gt;&lt;br /&gt;4. If a sufficient number of &amp;quot;elephants&amp;quot; are found consecutively (controlled by the LockCount parameter), the strategy will further perform the following operations:&lt;br /&gt;&lt;br /&gt;- Call the updateStatus function to record the gear and related information of the &amp;quot;elephant&amp;quot;.&lt;br /&gt;- Use the exchange.Buy function to purchase an &amp;quot;elephant&amp;quot;, with a purchase price of elephant.Price + PennyTick, and a quantity of Lot.&lt;br /&gt;- Start a new infinite loop for waiting for execution of the buy order.&lt;br /&gt;- Check order status. If it is completed, break out from loop.&lt;br /&gt;- If waiting time exceeds set interval (WaitInterval), cancel all uncompleted orders.&lt;br /&gt;- Calculate changes in account assets after successful purchase. If change is less than 0.001, it indicates that purchase failed; increase failure count and continue next loop.&lt;br /&gt;- Record information about successful purchases of &amp;quot;elephants&amp;quot;, including quantity purchased.&lt;br /&gt;&lt;br /&gt;5. Next, the strategy will continue to enter a new infinite loop, waiting for the execution of sell operations. In this loop, it will perform the following actions:&lt;br /&gt;- Obtain market depth information, check if the market price has already reached the stop-loss level.&lt;br /&gt;- If the market price has reached or fallen below the stop-loss level, a stop-loss operation will be executed, that is, the remaining assets will be sold.&lt;br /&gt;- Call the CancelAll function to cancel all uncompleted orders, reducing position risk.&lt;br /&gt;- Recheck the change in account assets after a successful purchase. If the change is less than 0.001, it indicates that the purchase has failed and exit the loop.&lt;br /&gt;- Finally, record whether the transaction is successful or not, and update the number of successes and failures based on the transaction results.&lt;br /&gt;&lt;br /&gt;The entire strategy continuously carries out the above operations to capture as many &amp;quot;elephants&amp;quot; as possible and obtain small profits. This is a high-frequency trading strategy that requires quick responses to market changes, while also considering risk management and stop-loss mechanisms to protect capital. Investors should carefully consider using this strategy, especially in highly volatile markets.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;The Penny Jump strategy is a typical example in high-frequency trading, demonstrating the subtle game and competition among market participants. This strategy is particularly prominent in the cryptocurrency market due to its large fluctuations, where institutional investors and high-frequency traders are all pursuing quick profits. However, this also makes the market full of challenges, requiring constant adaptation and adjustment of strategies to maintain competitive advantages. In this fiercely competitive world, only those traders who are good at discerning the microstructure of the market and responding quickly can achieve success.&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y64h90yMK02X503c2p65mDbJaN1YYx33tHD7Y1DUrF5Sztk0nqGShZohdsUYDimMo4p8sor5k8q55W_kIBMwXilM" title="https://blog.mathquant.com/2023/11/07/high-frequency-trading-strategy-analysis-penny-jump.html"&gt;https://blog.mathquant.c...analysis-penny-jump.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25598/</id>
    <title type="text">The Evolution of PSY Factor: Upgrading and Transforming for Enhanced Trading Strategies</title>
    <published>2024-03-21T09:11:50Z</published>
    <updated>2024-03-21T09:11:50Z</updated>
    <author>
      <name>FMZ Quant</name>
      <uri>https://stocksharp.com/users/185552/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#strategy" />
    <category term="#market" />
    <category term="#fmz" />
    <category term="#Kline" />
    <category term="#factor" />
    <category term="#PSY" />
    <category term="#quant" />
    <category term="#bullish" />
    <category term="#bearish" />
    <content type="html">Welcome all traders to my channel, I am a Quant Developer, specializing in full-stack development of CTA, HFT &amp;amp; Arbitrage trading strategies.&lt;br /&gt;Thanks to the FMZ Platform, I will share more content related to quantitative development and work together with all traders to maintain the prosperity of the quant community.&lt;br /&gt;&lt;br /&gt;Today, I will bring you an upgrade and transformation of the PSY (Psychological Line) factor. We will show how to add more market information from a simple factor perspective, step by step transform it, and ultimately turn it into a powerful factor with explanatory and logical strength!!! Of course, after reading this article, you can incorporate the transformed PSY factor into your own library of factors as a powerful weapon~&lt;br /&gt;&lt;br /&gt;&amp;gt; PART1 Initial PSY Factor&lt;br /&gt;&lt;br /&gt;The PSY Factor (Psychological Line) is a technical analysis indicator used to measure the impact of market participants&amp;#39; emotions on price trends. It is an emotional index for studying investors&amp;#39; psychological fluctuations in response to market ups and downs, and it&amp;#39;s a type of energy and rise-fall indicator. It has certain reference significance for judging short-term market trends.&lt;br /&gt;&lt;br /&gt;The PSY factor was first proposed by Dr. Wang Yawei in 1991. He believed that the psychological changes in the market are closely related to price trends, and quantified these psychological changes into the PSY factor. As an indicator for analyzing market fluctuations, the PSY factor calculates the total bullish and bearish forces within N K-lines over time to describe whether the current market is strong or weak, or if it&amp;#39;s in an overbought or oversold state. It mainly measures investors&amp;#39; psychological endurance by calculating how many rising K-lines there are within N K-lines, providing a reference for investors&amp;#39; buying and selling operations.&lt;br /&gt;&lt;br /&gt;The PSY factor is based on the number of days the closing price rises or falls over a period of time. Its calculation method is very simple, and the calculation formula is as follows: PSY=(Number of rising days within N K-lines/N)*100. Here, N period represents the selected calculation period, which can be several days, weeks or months etc. The number of rising days refers to the number of trading days with rising prices within the N period. The initial PSY factor function source code based on FMZ platform:&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;function calculatePSY(data, n) {&lt;br /&gt;  let count = 0;&lt;br /&gt;  for (let i = data.length - n; i &amp;lt; data.length; i++) {&lt;br /&gt;    if (data[i] &amp;gt; data[i - 1]) {&lt;br /&gt;      count++;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  return (count / n) * 100;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Usage example&lt;br /&gt;let closePrices = [10, 12, 13, 11, 14, 15, 16, 17, 18, 20];&lt;br /&gt;let nPeriod = 5;&lt;br /&gt;let psyFactor = calculatePSY(closePrices, nPeriod);&lt;br /&gt;Log(psyFactor);&lt;br /&gt;```&lt;br /&gt;&amp;gt; PART2 Enhance PSY Factor (PSY+PRICE)&lt;br /&gt;&lt;br /&gt;The essence of the PSY factor is a momentum factor, which measures the comparison of the root numbers of rising and falling forces over a period of time, with the aim to find out which side has greater strength in the past. However, upon careful observation, it can be found that the PSY factor only considers whether the BAR line is rising or falling, lacking a description of BAR itself and unable to judge the intensity of market conditions, resulting in situations -- Of the last 6 K-lines, 3 were down and 3 were up, and the value of 50, as constructed by the initial PSY factor, it does not discern the strength of the long and short forces in the last 6 K-lines.&lt;br /&gt;&lt;br /&gt;As mentioned above, the uniqueness of a large bullish K-line is not reflected in the PSY indicator, it&amp;#39;s merely treated as an upward line with no difference from the previous small bearish K-line. This is where the problem lies, as the number of rises and falls cannot fully describe the magnitude and direction of price changes. Therefore, our first improvement idea was to weight each BAR&amp;#39;s price change Abs(C-C[1]) to reflect the magnitude of rise and fall forces. The source code for initial PSY+PRICE factor function based on FMZ platform:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149482
" title="https://stocksharp.com/file/149482
"&gt;https://stocksharp.com/file/149482
&lt;/a&gt;&lt;br /&gt;&amp;gt; PART3 Final PSY Factor (PSY+PRICE+VOL)&lt;br /&gt;&lt;br /&gt;After the modification in the previous step, the transformed PSY factor can better reflect the strength and weakness over a period of time. However, it cannot distinguish well if the rise and fall range is basically consistent during that period. At this point, we continue to add trading volume factors. In momentum effect, increased volume represents a more active market, and increased volume situation can better confirm momentum direction. As shown in the figure below:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149483
" title="https://stocksharp.com/file/149483
"&gt;https://stocksharp.com/file/149483
&lt;/a&gt;&lt;br /&gt;Over the past period of time, the magnitude of the rise and the fall were basically the same, but the volume in the rise far exceeded the volume in the fall, reflecting the superior upward force. Therefore, in the final PSY factor, we continue to add the volume factor weighting, VOLUME*Abs(C-C[1]), based on the initial PSY+PRICE factor function source code of FMZ platform:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149487
" title="https://stocksharp.com/file/149487
"&gt;https://stocksharp.com/file/149487
&lt;/a&gt;&lt;br /&gt;&amp;gt; PART4 Construction of PSY Factor Trading Signals&lt;br /&gt;&lt;br /&gt;Based on the final PSY+PRICE+VOL factor constructed in the previous article, we attempt to propose several constructions of momentum signals as follows:&lt;br /&gt;&lt;br /&gt;- psy[0] &amp;gt; X (Over a period of time in the past, the ratio of multiple forces was greater than X value.)&lt;br /&gt;- psy[0] &amp;lt; Y (Over a period of time in the past, the ratio of multiple forces was less than Y value.)&lt;br /&gt;- psy[0] &amp;gt; psy[1] or psy[0] &amp;gt; psyma (Over the past period of time, the ratio of various forces has increased.)&lt;br /&gt;- psy[0] &amp;lt; psy[1] or psy[0] &amp;lt; psyma (Over a period of time, the ratio of multiple forces has decreased.)&lt;br /&gt;&lt;br /&gt;We design a simple momentum strategy with signals to detect factors.&lt;br /&gt;&lt;br /&gt;- Go long: PSY[0] &amp;gt; 70; Close long position: PSY[0] &amp;lt; 30;&lt;br /&gt;- Go short: PSY[0] &amp;lt; 30; Close short position: PSY[0] &amp;gt; 70;&lt;br /&gt;&lt;br /&gt;Using Binance U-denominated contracts, the PSY factor parameter is designed to be 12. Backtesting of BTC-USDT and ETH-USDT contracts was conducted from February 1, 2020 to December 31, 2021 with a slippage of 10, a transaction fee of 0.05%, a leverage of 10 times, and each position remaining principal at 5%:&lt;br /&gt;&lt;br /&gt;BTC-USDT：&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149484
" title="https://stocksharp.com/file/149484
"&gt;https://stocksharp.com/file/149484
&lt;/a&gt;&lt;br /&gt;ETH-USDT：&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149485
" title="https://stocksharp.com/file/149485
"&gt;https://stocksharp.com/file/149485
&lt;/a&gt;&lt;br /&gt;&amp;gt; PART5 Summary&lt;br /&gt;&lt;br /&gt;In this article, we upgraded and transformed the traditional psy factor, resulting in a psy+price+vol factor that can measure the strength of bulls and bears over a past period at the level of volume and price. Using fixed numerical comparisons or self-strength comparisons, corresponding momentum/reversal signals can be constructed. This article finally established a fixed numerical signal, conducted simple strategy backtesting, and found that the psy+price+vol factor can capture momentum movements in volatile markets to some extent, achieving positive expected returns. More forms of signals can be constructed later for more types of factor tests before ultimately being added to an existing strategy library.&lt;br /&gt;&lt;br /&gt;Thanks to the FMZ Platform, for not closing its doors and reinventing the wheel, but providing such a great place for traders to communicate. The road of trading is full of ups and downs, but with warmth from fellow traders and continuous learning from the shared experiences of seniors on the FMZ platform, we can keep growing. Wishing FMZ all the best and may all traders enjoy long-lasting profits.&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y6-6TQ0Cd1C_2iQoVjWl6Jxrj4uYlFX0nDGolteAg_cMgDXo8r-1VDRxGVg0z3C3SFlBuat0BX4wLNd4TnRvRmXc" title="https://blog.mathquant.com/2023/11/07/psy-factor-upgrade-and-transformation.html"&gt;https://blog.mathquant.c...-and-transformation.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25597/</id>
    <title type="text">Unveiling Market Noise: Building and Applying Strategies for a Clearer Trading Path</title>
    <published>2024-03-21T07:34:26Z</published>
    <updated>2024-03-21T07:34:26Z</updated>
    <author>
      <name>FMZ Quant</name>
      <uri>https://stocksharp.com/users/185552/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#strategy" />
    <category term="#market" />
    <category term="#fmz" />
    <category term="#platform" />
    <category term="#bitcoin" />
    <category term="#crypto" />
    <category term="#profit" />
    <category term="#loss" />
    <category term="#factor" />
    <content type="html">Welcome all traders to my channel, I am a Quant Developer, specializing in full-stack development of CTA, HFT &amp;amp; Arbitrage trading strategies.&lt;br /&gt;Thanks to the FMZ Platform, I will share more content related to quantitative development and work together with all traders to maintain the prosperity of the quant community.&lt;br /&gt;&lt;br /&gt;- Do you often struggle to distinguish between trends and fluctuations?&lt;br /&gt;- Have you been stopped out by the back-and-forth disorderly market?&lt;br /&gt;- Are you having difficulty understanding the current market situation?&lt;br /&gt;- Do you do trend trading and hope to filter out fluctuations?&lt;br /&gt;&lt;br /&gt;Haha, you&amp;#39;ve come to the right place. Today, I will bring you the construction and application of market noise! As we all know, financial markets are full of noise. How to quantitatively model and depict market noise is very important. The depiction of noise can better help us distinguish the current state of the market and predict future possibilities!&lt;br /&gt;&lt;br /&gt;&amp;gt; PART1 Noise discrimination is very important for financial market trading.&lt;br /&gt;&lt;br /&gt;The time series in the financial market is characterized by a high signal-to-noise ratio, most of the time, the market fluctuations are unclear, and even during trending markets, situations like taking four steps forward and three steps back often occur. Therefore, defining, identifying and classifying market noise in the financial market is very important and has practical significance. Kaufman&amp;#39;s book provides a comprehensive explanation and modeling of this characteristic of noise.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149465
" title="https://stocksharp.com/file/149465
"&gt;https://stocksharp.com/file/149465
&lt;/a&gt;&lt;br /&gt;&amp;gt; PART2 Construction of Noise - ER Efficiency Coefficient&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149463
" title="https://stocksharp.com/file/149463
"&gt;https://stocksharp.com/file/149463
&lt;/a&gt;&lt;br /&gt;The net value of the starting and ending points of price changes divided by the sum of all pairwise price changes during the period.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149456
" title="https://stocksharp.com/file/149456
"&gt;https://stocksharp.com/file/149456
&lt;/a&gt;&lt;br /&gt;The difference between point A and point B divided by the sum of the 7 intermediate movements.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149457
" title="https://stocksharp.com/file/149457
"&gt;https://stocksharp.com/file/149457
&lt;/a&gt;&lt;br /&gt;It demonstrates the different noise levels exhibited by various price operation modes under the same price movement range. A straight line indicates no noise, minor fluctuations around the straight line represent medium noise, and large swings symbolize high noise.&lt;br /&gt;&lt;br /&gt;&amp;gt; PART3 Construction of Noise - Price Density&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149464
" title="https://stocksharp.com/file/149464
"&gt;https://stocksharp.com/file/149464
&lt;/a&gt;&lt;br /&gt;The definition here is: Drawing the high and low points of price movements over a period of time, pulling the highest and lowest prices during this period into a box. The so-called price density refers to the number of price points that can be accommodated within the box.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149458
" title="https://stocksharp.com/file/149458
"&gt;https://stocksharp.com/file/149458
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149459
" title="https://stocksharp.com/file/149459
"&gt;https://stocksharp.com/file/149459
&lt;/a&gt;&lt;br /&gt;Compared to the ER efficiency coefficient, the measurement method of price density takes more into account the highest and lowest prices of each K-line.&lt;br /&gt;&lt;br /&gt;&amp;gt; PART4 Construction of Noise - Fractal Dimension&lt;br /&gt;&lt;br /&gt;The fractal dimension cannot be measured accurately, but it can be estimated using the following steps within the past n terms:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149460
" title="https://stocksharp.com/file/149460
"&gt;https://stocksharp.com/file/149460
&lt;/a&gt;&lt;br /&gt;&amp;gt; PART5 Construction of Noise - Other Methods&lt;br /&gt;&lt;br /&gt;CMI = (close[0] - open[n-1]) / (Max high(n) - Min low(n));&lt;br /&gt;When the noise is lower, during this period, the net value at the beginning and end infinitely approaches the difference between the highest and lowest prices, with CMI infinitely approaching 1.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149461
" title="https://stocksharp.com/file/149461
"&gt;https://stocksharp.com/file/149461
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149476
" title="https://stocksharp.com/file/149476
"&gt;https://stocksharp.com/file/149476
&lt;/a&gt;&lt;br /&gt;The results obtained from the construction methods of various noise measurements are highly similar. The core is to compare the net changes and change processes or extreme values of a period of movement, and choose the construction method that you prefer or think is more reasonable.&lt;br /&gt;&lt;br /&gt;&amp;gt; PART6 Dividing market styles from the perspectives of noise and volatility.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149462
" title="https://stocksharp.com/file/149462
"&gt;https://stocksharp.com/file/149462
&lt;/a&gt;&lt;br /&gt;Volatility and noise are different dimensions to characterize the market. The sum of price changes in the two types of price models mentioned above is the same, so their volatility is the same, but net value changes more significantly and noise is lower.&lt;br /&gt;&lt;br /&gt;Therefore, noise and volatility are two different perspectives that can be used to classify market styles. If we take persistence and volatility of trends as the x-axis and y-axis respectively to construct a Cartesian coordinate system, we can divide the fluctuation status of market prices into four categories:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149471
" title="https://stocksharp.com/file/149471
"&gt;https://stocksharp.com/file/149471
&lt;/a&gt;&lt;br /&gt;- Good sustainability, high volatility - smooth trend.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149467
" title="https://stocksharp.com/file/149467
"&gt;https://stocksharp.com/file/149467
&lt;/a&gt;&lt;br /&gt;- Good sustainability, low volatility - bumpy trend.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149472
" title="https://stocksharp.com/file/149472
"&gt;https://stocksharp.com/file/149472
&lt;/a&gt;&lt;br /&gt;- Persistent poor performance, low volatility - narrow range consolidation.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149466
" title="https://stocksharp.com/file/149466
"&gt;https://stocksharp.com/file/149466
&lt;/a&gt;&lt;br /&gt;- Persistent poor performance, high volatility - wide range fluctuations.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149473
" title="https://stocksharp.com/file/149473
"&gt;https://stocksharp.com/file/149473
&lt;/a&gt;&lt;br /&gt;It should be pointed out that there are no absolute standards for what is called wide range and narrow range, it has to be relative to the level and system of one&amp;#39;s own trading, just like the setting of the trading period, which is extremely personalized. Moreover, we can only determine the current state of the market by examining a period in the past. However, we cannot predict what state the market will enter next.&lt;br /&gt;&lt;br /&gt;Of course, the four types of fluctuations are not completely random during conversion. In the most ideal state, a smooth trend is often followed by wide-range oscillations, slowly unloading momentum; then it enters narrow-range consolidation, the market is very inactive, and bulls and bears are stuck in a stalemate; when the market is compressed to a critical point, it explodes again and the trend begins; this is an oversimplified ideal model - reality is much more complex. For example, after narrow-range consolidation there may not necessarily be a trend - it could also be wide-ranging oscillation. After a smooth trend there might not necessarily be wide-ranging oscillation - it could continue to reach new highs or lows. Moreover, it&amp;#39;s difficult to develop four strategies that excel at handling four different market conditions and can adapt as needed. So for now, I still think we can only develop strategies that make money in certain markets while minimizing losses in unfavorable ones.&lt;br /&gt;&lt;br /&gt;&amp;gt; PART7 Impact of Noise on Related Transactions&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149477
" title="https://stocksharp.com/file/149477
"&gt;https://stocksharp.com/file/149477
&lt;/a&gt;&lt;br /&gt;The profit factor of the 40-day moving average strategy (going long above the 40-day line and short below, total profit/total loss) is regressed with the 40-day noise (ER efficiency coefficient). It can be seen that the higher the noise, the lower the profit factor of trend strategies. And we can conclude: low noise is beneficial for trend trading, high noise is beneficial for mean reversion trading.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149478
" title="https://stocksharp.com/file/149478
"&gt;https://stocksharp.com/file/149478
&lt;/a&gt;&lt;br /&gt;The concept of market noise is very important in determining trading styles. Before developing corresponding trading strategies, we need to outline the contours of the market.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149469
" title="https://stocksharp.com/file/149469
"&gt;https://stocksharp.com/file/149469
&lt;/a&gt;&lt;br /&gt;&amp;gt; PART8 Market Maturity and Noise&lt;br /&gt;&lt;br /&gt;Over the past 20 years, the noise attribute of the North American stock index market has experienced a steady rise.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149468
" title="https://stocksharp.com/file/149468
"&gt;https://stocksharp.com/file/149468
&lt;/a&gt;&lt;br /&gt;Financial markets in various regions are gradually maturing, with noise levels increasing progressively, and the maturity is coming quickly.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149470
" title="https://stocksharp.com/file/149470
"&gt;https://stocksharp.com/file/149470
&lt;/a&gt;&lt;br /&gt;A study was conducted on the stock index markets of various countries. The market on the far right is the most mature and also has higher noise, while the one on the far left is immature with lower noise. It can be observed that Japan has the most mature market, followed by economies like Hong Kong, China, Singapore, and South Korea. On the far left are relatively immature markets, such as Vietnam and Sri Lanka.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149474
" title="https://stocksharp.com/file/149474
"&gt;https://stocksharp.com/file/149474
&lt;/a&gt;&lt;br /&gt;The noise in the Bitcoin market for each quarter is approximately 0.2-0.3, and it&amp;#39;s in a cyclical state.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149475
" title="https://stocksharp.com/file/149475
"&gt;https://stocksharp.com/file/149475
&lt;/a&gt;&lt;br /&gt;Thanks to the FMZ Platform, for not closing its doors and reinventing the wheel, but providing such a great place for traders to communicate. The road of trading is full of ups and downs, but with warmth from fellow traders and continuous learning from the shared experiences of seniors on the FMZ platform, we can keep growing. Wishing FMZ all the best and may all traders enjoy long-lasting profits.&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y60uH-yNR_TZXhu8m7YjsB9muKS9be3QjiHiyGRo8nuNWM3T_Rui0rBV6wRXDS-FOAKRvJffBpDu53KZF7YjuUvA" title="https://blog.mathquant.com/2023/11/07/construction-and-application-of-market-noise.html"&gt;https://blog.mathquant.c...ion-of-market-noise.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25596/</id>
    <title type="text">Mastering Programmatic Trading: The Game-Changing Incremental Update Algorithm for Mean and Variance Calculation</title>
    <published>2024-03-21T05:44:08Z</published>
    <updated>2024-03-21T05:44:08Z</updated>
    <author>
      <name>FMZ Quant</name>
      <uri>https://stocksharp.com/users/185552/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#strategy" />
    <category term="#data" />
    <category term="#fmz" />
    <category term="#python" />
    <category term="#formula" />
    <category term="#crypto" />
    <category term="#average" />
    <category term="#algorithm" />
    <content type="html">### Introduction&lt;br /&gt;In programmatic trading, it is often necessary to calculate averages and variances, such as calculating moving averages and volatility indicators. When we need high-frequency and long-term calculations, it&amp;#39;s necessary to retain historical data for a long time, which is both unnecessary and resource-consuming. This article introduces an online updating algorithm for calculating weighted averages and variances, which is particularly important for processing real-time data streams and dynamically adjusting trading strategies, especially high-frequency strategies. The article also provides corresponding Python code implementation to help traders quickly deploy and apply the algorithm in actual trading.&lt;br /&gt;&lt;br /&gt;### Simple Average and Variance&lt;br /&gt;If we use &lt;a href="https://stocksharp.com/file/149441 " title="https://stocksharp.com/file/149441 "&gt;https://stocksharp.com/file/149441 &lt;/a&gt;to represent the average value of the nth data point, assuming that we have already calculated the average of n-1 data points &lt;a href="https://stocksharp.com/file/149454, " title="https://stocksharp.com/file/149454, "&gt;https://stocksharp.com/file/149454, &lt;/a&gt;now we receive a new data point &lt;a href="https://stocksharp.com/file/149442. " title="https://stocksharp.com/file/149442. "&gt;https://stocksharp.com/file/149442. &lt;/a&gt;We want to calculate the new average number &lt;a href="https://stocksharp.com/file/149441 " title="https://stocksharp.com/file/149441 "&gt;https://stocksharp.com/file/149441 &lt;/a&gt;including the new data point. The following is a detailed derivation.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149450
" title="https://stocksharp.com/file/149450
"&gt;https://stocksharp.com/file/149450
&lt;/a&gt;&lt;br /&gt;The variance update process can be broken down into the following steps:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149455
" title="https://stocksharp.com/file/149455
"&gt;https://stocksharp.com/file/149455
&lt;/a&gt;&lt;br /&gt;As can be seen from the above two formulas, this process allows us to update new averages and variances upon receiving each new data point &lt;a href="https://stocksharp.com/file/149442 " title="https://stocksharp.com/file/149442 "&gt;https://stocksharp.com/file/149442 &lt;/a&gt;by only retaining the average and variance of the previous data, without saving historical data, making calculations more efficient. However, the problem is that what we calculate in this way are the mean and variance of all samples, while in actual strategies, we need to consider a certain fixed period. Observing the above average update shows that the amount of new average updates is a deviation between new data and past averages multiplied by a ratio. If this ratio is fixed, it will lead to an exponentially weighted average, which we will discuss next.&lt;br /&gt;&lt;br /&gt;### Exponentially-weighted mean&lt;br /&gt;The exponential weighted average can be defined by the following recursive relationship:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149445
" title="https://stocksharp.com/file/149445
"&gt;https://stocksharp.com/file/149445
&lt;/a&gt;&lt;br /&gt;Among them, &lt;a href="https://stocksharp.com/file/149451 " title="https://stocksharp.com/file/149451 "&gt;https://stocksharp.com/file/149451 &lt;/a&gt;is the exponential weighted average at time point t, &lt;a href="https://stocksharp.com/file/149444 " title="https://stocksharp.com/file/149444 "&gt;https://stocksharp.com/file/149444 &lt;/a&gt;is the observed value at time point t, α is the weight factor, and &lt;a href="https://stocksharp.com/file/149447 " title="https://stocksharp.com/file/149447 "&gt;https://stocksharp.com/file/149447 &lt;/a&gt;is the exponential weighted average of the previous time point.&lt;br /&gt;&lt;br /&gt;### Exponentially-weighted variance&lt;br /&gt;Regarding variance, we need to calculate the exponential weighted average of squared deviations at each time point. This can be achieved through the following recursive relationship:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149452
" title="https://stocksharp.com/file/149452
"&gt;https://stocksharp.com/file/149452
&lt;/a&gt;&lt;br /&gt;Among them, &lt;a href="https://stocksharp.com/file/149453 " title="https://stocksharp.com/file/149453 "&gt;https://stocksharp.com/file/149453 &lt;/a&gt;is the exponential weighted variance at time point t, and &lt;a href="https://stocksharp.com/file/149449 " title="https://stocksharp.com/file/149449 "&gt;https://stocksharp.com/file/149449 &lt;/a&gt;is the exponential weighted variance of the previous time point.&lt;br /&gt;&lt;br /&gt;Observe the exponentially weighted average and variance, their incremental updates are intuitive, retaining a portion of past values and adding new changes. The specific derivation process can be referred to in this paper: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAACVpro8NJ5Hf6n-q2zdOJRxB7Hj42VELvfONf7mK4kcA-Gp2b2yzpE3bNdUo41izgLaXAzt3ZUBwLu3JpbLvJAs" title="https://fanf2.user.srcf.net/hermes/doc/antiforgery/stats.pdf
"&gt;https://fanf2.user.srcf....c/antiforgery/stats.pdf
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;### SMA and EMA&lt;br /&gt;The SMA (also known as the arithmetic mean) and EMA are two common statistical measures, each with different characteristics and uses. The former one assigns equal weight to each observation, reflecting the central position of the data set. The latter one is a recursive calculation method that gives higher weight to more recent observations. The weights decrease exponentially as the distance from current time increases for each observation.&lt;br /&gt;&lt;br /&gt;- **Weight distribution**: The SMA assigns the same weight to each data point, while the EMA gives higher weight to the most recent data points.&lt;br /&gt;- **Sensitivity to new information**: The SMA is not sensitive enough to newly added data, as it involves recalculating all data points. The EMA, on the other hand, can reflect changes in the latest data more quickly.&lt;br /&gt;- **Computational complexity**: The calculation of the SMA is relatively straightforward, but as the number of data points increases, so does the computational cost. The computation of the EMA is more complex, but due to its recursive nature, it can handle continuous data streams more efficiently.&lt;br /&gt;&lt;br /&gt;### Approximate Conversion Method Between EMA and SMA&lt;br /&gt;Although SMA and EMA are conceptually different, we can make the EMA approximate to a SMA containing a specific number of observations by choosing an appropriate α value. This approximate relationship can be described by the effective sample size, which is a function of the weight factor α in the EMA.&lt;br /&gt;&lt;br /&gt;SMA is the arithmetic average of all prices within a given time window. For a time window N, the centroid of the SMA (i.e., the position where the average number is located) can be considered as:&lt;br /&gt;&lt;br /&gt;the centroid of SMA &lt;a href="https://stocksharp.com/file/149443
" title="https://stocksharp.com/file/149443
"&gt;https://stocksharp.com/file/149443
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;EMA is a type of weighted average where the most recent data points have greater weight. The weight of EMA decreases exponentially over time. The centroid of EMA can be obtained by summing up the following series:&lt;br /&gt;&lt;br /&gt;the centroid of EMA &lt;a href="https://stocksharp.com/file/149438
" title="https://stocksharp.com/file/149438
"&gt;https://stocksharp.com/file/149438
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When we assume that SMA and EMA have the same centroid, we can obtain:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149448
" title="https://stocksharp.com/file/149448
"&gt;https://stocksharp.com/file/149448
&lt;/a&gt;&lt;br /&gt;To solve this equation, we can obtain the relationship between α and N.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149446
" title="https://stocksharp.com/file/149446
"&gt;https://stocksharp.com/file/149446
&lt;/a&gt;&lt;br /&gt;This means that for a given SMA of N days, the corresponding α value can be used to calculate an &amp;quot;equivalent&amp;quot; EMA, so that they have the same centroid and the results are very similar.&lt;br /&gt;&lt;br /&gt;### Conversion of EMA with Different Update Frequencies&lt;br /&gt;Assume we have an EMA that updates every second, with a weight factor of &lt;a href="https://stocksharp.com/file/149437. " title="https://stocksharp.com/file/149437. "&gt;https://stocksharp.com/file/149437. &lt;/a&gt;This means that every second, the new data point will be added to the EMA with a weight of &lt;a href="https://stocksharp.com/file/149434, " title="https://stocksharp.com/file/149434, "&gt;https://stocksharp.com/file/149434, &lt;/a&gt;while the influence of old data points will be multiplied by &lt;a href="https://stocksharp.com/file/149437.
" title="https://stocksharp.com/file/149437.
"&gt;https://stocksharp.com/file/149437.
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If we change the update frequency, such as updating once every f seconds, we want to find a new weight factor &lt;a href="https://stocksharp.com/file/149440, " title="https://stocksharp.com/file/149440, "&gt;https://stocksharp.com/file/149440, &lt;/a&gt;so that the overall impact of data points within f seconds is the same as when updated every second.&lt;br /&gt;&lt;br /&gt;Within f seconds, if no updates are made, the impact of old data points will continuously decay f times, each time multiplied by /upload/asset/28e50eb9c37d5626d6691.png. Therefore, the total decay factor after f seconds is &lt;a href="https://stocksharp.com/file/149436.
" title="https://stocksharp.com/file/149436.
"&gt;https://stocksharp.com/file/149436.
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In order to make the EMA updated every f seconds have the same decay effect as the EMA updated every second within one update period, we set the total decay factor after f seconds equal to the decay factor within one update period:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149439
" title="https://stocksharp.com/file/149439
"&gt;https://stocksharp.com/file/149439
&lt;/a&gt;&lt;br /&gt;Solving this equation, we obtain new weight factors &lt;a href="https://stocksharp.com/file/149440
" title="https://stocksharp.com/file/149440
"&gt;https://stocksharp.com/file/149440
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/149435
" title="https://stocksharp.com/file/149435
"&gt;https://stocksharp.com/file/149435
&lt;/a&gt;&lt;br /&gt;This formula provides the approximate value of the new weight factor &lt;a href="https://stocksharp.com/file/149440, " title="https://stocksharp.com/file/149440, "&gt;https://stocksharp.com/file/149440, &lt;/a&gt;which maintains the EMA smoothing effect unchanged when the update frequency changes. For example: When we calculate the average price &lt;a href="https://stocksharp.com/file/149437 " title="https://stocksharp.com/file/149437 "&gt;https://stocksharp.com/file/149437 &lt;/a&gt;with a value of 0.001 and update it every 10 seconds, if it is changed to an update every second, the equivalent value &lt;a href="https://stocksharp.com/file/149440 " title="https://stocksharp.com/file/149440 "&gt;https://stocksharp.com/file/149440 &lt;/a&gt;would be approximately 0.01.&lt;br /&gt;&lt;br /&gt;### Implementation of Python Code&lt;br /&gt;```&lt;br /&gt;class ExponentialWeightedStats:&lt;br /&gt;    def __init__(self, alpha):&lt;br /&gt;        self.alpha = alpha&lt;br /&gt;        self.mu = 0&lt;br /&gt;        self.S = 0&lt;br /&gt;        self.initialized = False&lt;br /&gt;&lt;br /&gt;    def update(self, x):&lt;br /&gt;        if not self.initialized:&lt;br /&gt;            self.mu = x&lt;br /&gt;            self.S = 0&lt;br /&gt;            self.initialized = True&lt;br /&gt;        else:&lt;br /&gt;            temp = x - self.mu&lt;br /&gt;            new_mu = self.mu + self.alpha * temp&lt;br /&gt;            self.S = self.alpha * self.S + (1 - self.alpha) * temp * (x - self.mu)&lt;br /&gt;            self.mu = new_mu&lt;br /&gt;&lt;br /&gt;    @property&lt;br /&gt;    def mean(self):&lt;br /&gt;        return self.mu&lt;br /&gt;&lt;br /&gt;    @property&lt;br /&gt;    def variance(self):&lt;br /&gt;        return self.S&lt;br /&gt;&lt;br /&gt;# Usage example&lt;br /&gt;alpha = 0.05  # Weight factor&lt;br /&gt;stats = ExponentialWeightedStats(alpha)&lt;br /&gt;data_stream = [] # Data stream&lt;br /&gt;for data_point in data_stream:&lt;br /&gt;    stats.update(data_point)&lt;br /&gt;```&lt;br /&gt;### Summary&lt;br /&gt;In high-frequency programmatic trading, the rapid processing of real-time data is crucial. To improve computational efficiency and reduce resource consumption, this article introduces an online update algorithm for continuously calculating the weighted average and variance of a data stream. Real-time incremental updates can also be used for various statistical data and indicator calculations, such as the correlation between two asset prices, linear fitting, etc., with great potential. Incremental updating treats data as a signal system, which is an evolution in thinking compared to fixed-period calculations. If your strategy still includes parts that calculate using historical data, consider transforming it according to this approach: only record estimates of system status and update the system status when new data arrives; repeat this cycle going forward.&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y68HB1V7wjCfXJ8_qU0BIwh-eFjkKb5_TwXURaWxoT7LhijhtqKAOuQ2dWssGvRrwgXQK7Zic61at9K_ZmWtCsM0PKpXjiv97R79XfYrdNjvwr4jsYBKLEsUibT7uocxvLRdGnPsbTr1424GfBdABtA-0VLkDUqfYzM_pYPQvS-zk" title="https://blog.mathquant.com/2023/11/09/a-powerful-tool-for-programmatic-traders-incremental-update-algorithm-for-calculating-mean-and-variance.html"&gt;https://blog.mathquant.c...g-mean-and-variance.html&lt;/a&gt;</content>
  </entry>
</feed>