﻿<?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">Community. StockSharp</title>
  <id>https://stocksharp.com/handlers/atom.ashx?category=community&amp;page=6</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-11T18:44:20Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=community&amp;page=6" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/topic/25702/</id>
    <title type="text">When FMZ encounters ChatGPT, an attempt to use AI to assist in learning quantitative trading</title>
    <published>2024-04-18T02:05:46Z</published>
    <updated>2024-04-18T02:05:46Z</updated>
    <author>
      <name>Quant</name>
      <uri>https://stocksharp.com/users/186455/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#cryptocurrency" />
    <category term="#strategy" />
    <category term="#code" />
    <category term="#risk" />
    <category term="#FMZQuant" />
    <category term="#ChatGPT" />
    <category term="#Pine" />
    <category term="#AI" />
    <category term="#backtest" />
    <content type="html">&lt;span style="font-size:140%"&gt;&lt;b&gt;ChatGPT&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;ChatGPT has been very popular recently. There are various videos applied to real-world scenarios on the Internet. Let me introduce what ChatGPT is briefly. ChatGPT is a language model developed by OpenAI. Unlike previous AI, ChatGPT has very strong language understanding ability. There are many videos about the introduction, registration and use of ChatGPT on the network. I will not repeat them here.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:140%"&gt;&lt;b&gt;When FMZ encounters ChatGPT&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;In the field of quantitative trading learning, beginners have always been very difficult at the entry stage. Because most beginners are based on 0, they lack both grammatical knowledge and thinking logic for code, so they will feel it is very difficult to learn.&lt;br /&gt;&lt;br /&gt;OK, the next article is not written by me. Let&amp;#39;s show some appetizers.&lt;br /&gt;&lt;br /&gt;**part1**&lt;br /&gt;When FMZ encounters ChatGPT, an attempt to use AI to assist in learning quantitative trading&lt;br /&gt;&lt;br /&gt;As a beginner, I have been looking for effective ways to learn quantitative trading. After searching online, I found FMZ and ChatGPT. So I decided to try to use them to deepen my understanding of quantitative trading.&lt;br /&gt;&lt;br /&gt;First, I learned how to use PINE script to write a trading strategy on FMZ. On this platform, I found templates for various strategies and tested their effects by adjusting parameters. In addition, I also learned how to use the backtesting function to evaluate the returns of the strategy.&lt;br /&gt;&lt;br /&gt;Next, I use ChatGPT to get more help. On this platform, I found an AI assistant named Assistant, who can answer my various questions. Through communicating with Assistant, I learned a lot of useful knowledge and got many valuable suggestions.&lt;br /&gt;&lt;br /&gt;In the process of using FMZ and ChatGPT, I gained a lot. Not only learned how to write trading strategies, but also gained more knowledge about quantitative trading. I believe that as I continue to learn and practice,&lt;br /&gt;&lt;br /&gt;**part2**&lt;br /&gt;I will be able to further improve my trading skills and achieve better returns in the future.&lt;br /&gt;&lt;br /&gt;Although using FMZ and ChatGPT can get a lot of help, I also realize that quantitative trading is a continuous learning process. I still have a lot to learn, and I will continue to work hard to improve myself.&lt;br /&gt;&lt;br /&gt;In the end, I hope my attempt can help other beginners. If you also want to learn quantitative trading, try FMZ and ChatGPT platforms, which may become powerful assistants for you to learn.&lt;br /&gt;&lt;br /&gt;**part3**&lt;br /&gt;Of course, quantitative trading is not an easy task. It requires continuous learning and practice to improve skills. Therefore, I also suggest that you participate in various training courses and community activities, exchange trading experience with professionals, and always staycurious and inquisitive.&lt;br /&gt;&lt;br /&gt;In addition, it is also very important to pay attention to risk management. There are many uncertain factors in quantitative trading, so we must set a reasonable stop-loss strategy and select the trading variety and trading period carefully.&lt;br /&gt;&lt;br /&gt;**part4**&lt;br /&gt;To sum up, I believe using FMZ and ChatGPT platforms to learn quantitative trading is a good choice. They provide us with rich learning resources and assistance, so that we can grasp knowledge and practice easily. However, we should also remember that learning quantitative trading is a continuous process, and we need to make continuous efforts to achieve greater success in this field.&lt;br /&gt;&lt;br /&gt;Ok, I&amp;#39;ll start writing again, you can believe it! The above part1 ~ part4 are written by ChatGPT. Let me show some evidence:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150367
" title="https://stocksharp.com/file/150367
"&gt;https://stocksharp.com/file/150367
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When FMZ encounters ChatGPT, an attempt to use AI to assist in learning quantitative trading&lt;br /&gt;&lt;br /&gt;As a beginner, I have been looking for effective ways to learn quantitative trading. After searching online, I found FMZ and ChatGPT. So I decided to try to use them to deepen my understanding of quantitative trading.&lt;br /&gt;&lt;br /&gt;First, I learned how to use PINE script to write a trading strategy on FMZ. On this platform, I found templates for various strategies and tested their effects by adjusting parameters. In addition, I also learned how to use the backtesting function to evaluate the returns of the strategy.&lt;br /&gt;&lt;br /&gt;Next, I use ChatGPT to get more help. On this platform, I found an AI assistant named Assistant, who can answer my various questions. Through communicating with Assistant, I learned a lot of useful knowledge and got many valuable suggestions.&lt;br /&gt;&lt;br /&gt;In the process of using FMZ and ChatGPT, I gained a lot. Not only learned how to write trading strategies, but also gained more knowledge about quantitative trading. I believe that as I continue to learn and practice,&lt;br /&gt;&lt;br /&gt;Go on:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150367
" title="https://stocksharp.com/file/150367
"&gt;https://stocksharp.com/file/150367
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I will be able to further improve my trading skills and achieve better returns in the future.&lt;br /&gt;&lt;br /&gt;Although using FMZ and ChatGPT can get a lot of help, I also realize that quantitative trading is a continuous learning process. I still have a lot to learn, and I will continue to work hard to improve myself.&lt;br /&gt;&lt;br /&gt;In the end, I hope my attempt can help other beginners. If you also want to learn quantitative trading, try FMZ and ChatGPT platforms, which may become powerful assistants for you to learn.&lt;br /&gt;&lt;br /&gt;Go on:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150367
" title="https://stocksharp.com/file/150367
"&gt;https://stocksharp.com/file/150367
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Of course, quantitative trading is not an easy task. It requires continuous learning and practice to improve skills. Therefore, I also suggest that you participate in various training courses and community activities, exchange trading experience with professionals, and always stay curious and inquisitive.&lt;br /&gt;&lt;br /&gt;In addition, it is also very important to pay attention to risk management. There are many uncertain factors in quantitative trading, so we must set a reasonable stop-loss strategy and select the trading variety and trading period carefully.&lt;br /&gt;&lt;br /&gt;To sum up, I believe using FMZ and ChatGPT platforms to learn quantitative trading is a good choice.&lt;br /&gt;&lt;br /&gt;Let&amp;#39;s start the topic again.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:140%"&gt;&lt;b&gt;Let AI write a strategy for me&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;If I am an introductory learner of the PINE language on the FMZ platform with 0 basics, I can put forward a simple requirement for ChatGPT to see if AI can help me write code:&lt;br /&gt;&lt;br /&gt;Propose requirements:&lt;br /&gt;&lt;br /&gt;Can you use the PINE script to write a double EMA strategy for me? The moving average index of different periods is that the up cross is to open long positions, the down cross is to open short positions, and the stop loss is 100 points. And give me the complete PINE script strategy. Use version control code://@ version=4&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150367
" title="https://stocksharp.com/file/150367
"&gt;https://stocksharp.com/file/150367
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Certainly. This is an example of using PINE script to write a double EMA strategy, starting with version control code://@ version=4&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150368
" title="https://stocksharp.com/file/150368
"&gt;https://stocksharp.com/file/150368
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In this code, we first set two parameters that can be adjusted: long-term average period and short-term average period. Then, we calculate the two moving averages and use the statement to determine whether there is an up cross or a down cross. If an up cross occurs, go long; if a down cross occurs, go short. Finally, we set a stop loss point. If the price falls below the stop loss point, the position will be closed.&lt;br /&gt;&lt;br /&gt;Note: This is only an example, and it does not guarantee that the strategy will yield good returns. Risk should be carefully considered when using any trading strategy.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;// @version=4&lt;br /&gt;strategy(&amp;quot;double EMA strategy&amp;quot;, overlay=true)&lt;br /&gt;&lt;br /&gt;longTerm = input(title=&amp;quot;long-term average period&amp;quot;, type=input.integer, defval=200)&lt;br /&gt;shortTerm = input(title=&amp;quot;short-term average period&amp;quot;, type=input.integer, defval=50)&lt;br /&gt;stopLoss = input(title=&amp;quot;stop loss point&amp;quot;, type=input.integer, defval=100)&lt;br /&gt;&lt;br /&gt;longMA = sma(close, longTerm)&lt;br /&gt;shortMA = sma(close, shortTerm)&lt;br /&gt;&lt;br /&gt;if (shortMA &amp;gt; longMA)&lt;br /&gt;    strategy.entry(&amp;quot;go long&amp;quot;, strategy.long)&lt;br /&gt;if (shortMA &amp;lt; longMA)&lt;br /&gt;    strategy.entry(&amp;quot;go short&amp;quot;, strategy.short)&lt;br /&gt;&lt;br /&gt;strategy.exit(&amp;quot;stop loss&amp;quot;, &amp;quot;go long&amp;quot;, stop=strategy.position_avg_price - stopLoss)&lt;br /&gt;strategy.exit(&amp;quot;stop loss&amp;quot;, &amp;quot;go short&amp;quot;, stop=strategy.position_avg_price + stopLoss)&lt;br /&gt;```&lt;br /&gt;It wrote the code out. Let me run it on the FMZ platform backtest system!&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150369
" title="https://stocksharp.com/file/150369
"&gt;https://stocksharp.com/file/150369
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150370
" title="https://stocksharp.com/file/150370
"&gt;https://stocksharp.com/file/150370
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;PINE script is running!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:140%"&gt;&lt;b&gt;Next, let ChatGPT help us explain the strategy, which can also help us learn about quantitative trading.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ask the question:&lt;br /&gt;```&lt;br /&gt;strategy(&amp;quot;test&amp;quot;, overlay = true)&lt;br /&gt;&lt;br /&gt;varip a = na&lt;br /&gt;varip highPrice = na&lt;br /&gt;varip isTrade = false &lt;br /&gt;varip offset = 30&lt;br /&gt;&lt;br /&gt;if not barstate.ishistory and not isTrade&lt;br /&gt;    strategy.entry(&amp;quot;test 1&amp;quot;, strategy.long, 1)&lt;br /&gt;    strategy.exit(&amp;quot;exit 1&amp;quot;, &amp;quot;test 1&amp;quot;, 1, trail_price=close+offset, trail_offset=offset)&lt;br /&gt;    a := close + offset&lt;br /&gt;    runtime.log(&amp;quot;The price per point is:&amp;quot;, syminfo.mintick, &amp;quot;, current close:&amp;quot;, close)&lt;br /&gt;    isTrade := true &lt;br /&gt;&lt;br /&gt;if close &amp;gt; a and not barstate.ishistory&lt;br /&gt;    highPrice := na(highPrice) ? close : highPrice&lt;br /&gt;    highPrice := close &amp;gt; highPrice ? close : highPrice&lt;br /&gt;&lt;br /&gt;plot(a, &amp;quot;trail_price trigger line&amp;quot;)    &lt;br /&gt;plot(strategy.position_size&amp;gt;0 ? highPrice : na, &amp;quot;current highest price&amp;quot;)&lt;br /&gt;plot(strategy.position_size&amp;gt;0 ? highPrice-syminfo.mintick*offset : na, &amp;quot;moving stop loss trigger line&amp;quot;)&lt;br /&gt;&lt;br /&gt;Can you explain the detailed logic of this script?&lt;br /&gt;```&lt;br /&gt;Screenshots:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150372
" title="https://stocksharp.com/file/150372
"&gt;https://stocksharp.com/file/150372
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150367
" title="https://stocksharp.com/file/150367
"&gt;https://stocksharp.com/file/150367
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150371
" title="https://stocksharp.com/file/150371
"&gt;https://stocksharp.com/file/150371
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It can get the meaning of this script and summarize it. I am wondering if there is a quantitative trading researcher answering my question behind this page...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:140%"&gt;&lt;b&gt;Imperfections&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Of course, ChatGPT is not perfect yet. For example, when communicating with it in Chinese, it often breaks off. It needs to continue with the dialogue of &amp;quot;continue to speak&amp;quot;. For some questions that it doesn&amp;#39;t know very well, it will talk nonsense with you. We need to combine search engines to determine the answers given, and we can&amp;#39;t blindly believe it. However, ChatGPT is still very helpful for quantitative trading learning on FMZ. It can help us understand the code that is difficult to understand. At least it can give us some hints and inspiration, so that we know what to learn. It can also help us write some simple code prototypes, give some basic solutions and code implementation. There should be more advanced methods. We can continue to explore in the future. We hope that ChatGPT will become more and more powerful and help more quantitative trading beginners get started easily.&lt;br /&gt;&lt;br /&gt;I hope that there will no longer be &amp;quot;from getting started to giving up&amp;quot; in the study of quantitative trading in the future!&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y6yuYBqnby0wCwm0sWpa8ys49HOGHbgnKjK66P9eetdPBWmz50gu4b4rxJ6rut0v7W0B1aFfEWzj8SlkCOs3No1PqkBk9tJA9d69QR_N_sKPAeF9uG89xNYvITu8hXdhdNgD3eYzhFk9-EEaLJOk0ZtY" title="https://blog.mathquant.com/2023/02/08/when-fmz-encounters-chatgpt-an-attempt-to-use-ai-to-assist-in-learning-quantitative-trading.html"&gt;https://blog.mathquant.c...uantitative-trading.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25701/</id>
    <title type="text">Elegant and simple! Accessed Uniswap V3 on FMZ with 200 lines of code</title>
    <published>2024-04-17T06:31:43Z</published>
    <updated>2024-04-17T06:31:43Z</updated>
    <author>
      <name>Trading</name>
      <uri>https://stocksharp.com/users/186421/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#cryptocurrency" />
    <category term="#code" />
    <category term="#market" />
    <category term="#contract" />
    <category term="#exchange" />
    <category term="#FMZQuant" />
    <category term="#uniswapV3" />
    <category term="#token" />
    <category term="#address" />
    <content type="html">With the popularity of Defi concept in recent years, Uniswap V3 is one of the most popular topics in the field of decentralized finance (DeFi). As a leading decentralized swap protocol, Uniswap V3 provides a more efficient, safer and better user experience. Now, with only 200 lines of code, traders and developers can access Uniswap V3 on the FMZ platform easily.&lt;br /&gt;&lt;br /&gt;FMZ is a quantitative trading platform that supports the development, backtesting and real market deployment of quantitative trading strategies. Its easy-to-use interface and powerful functions are not difficult to understand why FMZ is becoming the first choice of DeFi traders and developers.&lt;br /&gt;&lt;br /&gt;The process of integrating Uniswap V3 into FMZ is simple and easy to understand, requiring only 200 lines of code to complete. This means that even if you are new to code, you can easily connect to Uniswap V3 on FMZ and start trading immediately.&lt;br /&gt;&lt;br /&gt;FMZ has encapsulated a series of web3 basic functions. Besides Uniswap, it can also encapsulate other DEX exchanges with few codes. Next, let me take you to learn the concepts and technologies in defi application from scratch. Due to the space, the following description is as simple as possible. It may not be very precise, but it is easy to understand.&lt;br /&gt;&lt;br /&gt;[Uniswap V3 Trade Template](https://www.fmz.com/strategy/397260) disclosed by FMZ platform&lt;br /&gt;&lt;br /&gt;The code is as follows:&lt;br /&gt;```&lt;br /&gt;/* jshint esversion: 7 */&lt;br /&gt;&lt;br /&gt;const ABI_Route = &amp;#39;[{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;_factoryV2&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;factoryV3&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;_positionManager&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;_WETH9&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;constructor&amp;quot;},{&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;WETH9&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;approveMax&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;approveMaxMinusOne&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;approveZeroThenMax&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;approveZeroThenMaxMinusOne&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;callPositionManager&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;result&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;paths&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint128[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amounts&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint128[]&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;maximumTickDivergence&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;secondsAgo&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;checkOracleSlippage&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;maximumTickDivergence&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;secondsAgo&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;checkOracleSlippage&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;components&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOutMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct IV3SwapRouter.ExactInputParams&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;params&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tuple&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;exactInput&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;components&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tokenIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tokenOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;fee&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOutMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint160&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;sqrtPriceLimitX96&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint160&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct IV3SwapRouter.ExactInputSingleParams&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;params&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tuple&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;exactInputSingle&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;components&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountInMaximum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct IV3SwapRouter.ExactOutputParams&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;params&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tuple&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;exactOutput&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;components&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tokenIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tokenOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;fee&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountInMaximum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint160&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;sqrtPriceLimitX96&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint160&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct IV3SwapRouter.ExactOutputSingleParams&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;params&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tuple&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;exactOutputSingle&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;factory&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;factoryV2&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;getApprovalType&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;enum IApproveAndCall.ApprovalType&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint8&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;components&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token1&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tokenId&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount0Min&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount1Min&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct IApproveAndCall.IncreaseLiquidityParams&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;params&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tuple&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;increaseLiquidity&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;result&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;components&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token1&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;fee&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;int24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tickLower&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;int24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;int24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tickUpper&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;int24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount0Min&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount1Min&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct IApproveAndCall.MintParams&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;params&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tuple&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;mint&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;result&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;previousBlockhash&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;multicall&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;deadline&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;multicall&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;multicall&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;results&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;positionManager&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;value&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;pull&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;refundETH&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;value&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;deadline&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint8&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;v&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint8&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;r&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;selfPermit&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;nonce&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;expiry&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint8&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;v&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint8&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;r&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;selfPermitAllowed&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;nonce&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;expiry&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint8&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;v&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint8&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;r&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;selfPermitAllowedIfNecessary&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;value&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;deadline&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint8&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;v&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint8&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;r&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;selfPermitIfNecessary&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOutMin&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address[]&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;to&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;swapExactTokensForTokens&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountInMax&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address[]&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;to&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;swapTokensForExactTokens&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;sweepToken&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;sweepToken&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeBips&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeRecipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;sweepTokenWithFee&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeBips&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeRecipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;sweepTokenWithFee&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;int256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount0Delta&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;int256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;int256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount1Delta&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;int256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;_data&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;uniswapV3SwapCallback&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;unwrapWETH9&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;unwrapWETH9&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeBips&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeRecipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;unwrapWETH9WithFee&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeBips&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeRecipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;unwrapWETH9WithFee&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;value&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;wrapETH&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;receive&amp;quot;}]&amp;#39;;&lt;br /&gt;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;let ContractV3Factory = &amp;quot;0x1F98431c8aD98523631AE4a59f267346ea31F984&amp;quot;&lt;br /&gt;let ContractV3SwapRouterV2 = &amp;quot;0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45&amp;quot;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function computePoolPrice(decimals0, decimals1, sqrtPriceX96) {&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;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;$.NewUniswapV3 = function(e) {&lt;br /&gt;    e = e || exchange&lt;br /&gt;    if (e.GetName() !== &amp;#39;Web3&amp;#39;) {&lt;br /&gt;        panic(&amp;quot;only support Web3 exchange&amp;quot;)&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    let self = {&lt;br /&gt;        tokenInfo: {},&lt;br /&gt;        walletAddress: e.IO(&amp;quot;address&amp;quot;),&lt;br /&gt;        pool: {}&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // register&lt;br /&gt;    e.IO(&amp;quot;abi&amp;quot;, ContractV3Factory, ABI_Factory)&lt;br /&gt;    e.IO(&amp;quot;abi&amp;quot;, ContractV3SwapRouterV2, ABI_Route)&lt;br /&gt;&lt;br /&gt;    self.addToken = function(name, address) {&lt;br /&gt;        let ret = e.IO(&amp;quot;api&amp;quot;, address, &amp;quot;decimals&amp;quot;)&lt;br /&gt;        if (!ret) {&lt;br /&gt;            throw &amp;quot;get token decimals failed&amp;quot;&lt;br /&gt;        }&lt;br /&gt;        let decimals = Number(ret)&lt;br /&gt;        self.tokenInfo[name] = {&lt;br /&gt;            name: name,&lt;br /&gt;            decimals: decimals,&lt;br /&gt;            address: address&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    self.waitMined = function(tx) {&lt;br /&gt;        while (true) {&lt;br /&gt;            Sleep(1000)&lt;br /&gt;            let info = e.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;                return true&lt;br /&gt;            }&lt;br /&gt;            Log(&amp;#39;Transaction not yet mined&amp;#39;, tx)&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    self.swapToken = function(tokenIn, amountInDecimal, tokenOut, options) {&lt;br /&gt;        // options like {gasPrice: 11, gasLimit: 111, nonce: 111}&lt;br /&gt;        let tokenInInfo = self.tokenInfo[tokenIn]&lt;br /&gt;        let tokenOutInfo = self.tokenInfo[tokenOut]&lt;br /&gt;        if (!tokenInInfo) {&lt;br /&gt;            throw &amp;quot;not found token info &amp;quot; + tokenIn&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if (!tokenOutInfo) {&lt;br /&gt;            throw &amp;quot;not found token info &amp;quot; + tokenOut&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        let amountIn = toInnerAmount(amountInDecimal, tokenInInfo.decimals)&lt;br /&gt;        let recipientAddress = self.walletAddress&lt;br /&gt;        if (tokenInInfo.name != &amp;#39;ETH&amp;#39;) {&lt;br /&gt;            let allowanceAmount = e.IO(&amp;quot;api&amp;quot;, tokenInInfo.address, &amp;quot;allowance&amp;quot;, self.walletAddress, ContractV3SwapRouterV2);&lt;br /&gt;            let realAmount = toAmount(allowanceAmount, tokenInInfo.decimals)&lt;br /&gt;            if (realAmount &amp;lt; toAmount(amountIn, tokenInInfo.decimals)) {&lt;br /&gt;                Log(&amp;quot;realAmount is&amp;quot;, realAmount, &amp;quot;too small, try to approve large amount&amp;quot;)&lt;br /&gt;                if (tokenInInfo.name == &amp;#39;USDT&amp;#39;) {&lt;br /&gt;                    // As described in Tether code: To change the approve amount you first have to reduce the addresses allowance to 0 calling approve(spender, 0)&lt;br /&gt;                    let txApprove = e.IO(&amp;quot;api&amp;quot;, tokenInInfo.address, &amp;quot;approve&amp;quot;, ContractV3SwapRouterV2, 0)&lt;br /&gt;                    if (!txApprove) {&lt;br /&gt;                        throw &amp;quot;approve error&amp;quot;&lt;br /&gt;                    }&lt;br /&gt;                    Log(&amp;quot;wait reduce approve&amp;quot;, txApprove)&lt;br /&gt;                    self.waitMined(txApprove)&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                let txApprove = e.IO(&amp;quot;api&amp;quot;, tokenInInfo.address, &amp;quot;approve&amp;quot;, ContractV3SwapRouterV2, &amp;#39;0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff&amp;#39;);&lt;br /&gt;                if (!txApprove) {&lt;br /&gt;                    throw &amp;quot;approve error&amp;quot;&lt;br /&gt;                }&lt;br /&gt;                Log(&amp;quot;wait approve&amp;quot;, txApprove)&lt;br /&gt;                self.waitMined(txApprove)&lt;br /&gt;                Log(&amp;quot;approve success amountIn&amp;quot;, amountIn)&lt;br /&gt;            } else {&lt;br /&gt;                Log(&amp;quot;allowance&amp;quot;, realAmount, &amp;quot;no need to approve&amp;quot;)&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if (tokenOutInfo.name == &amp;#39;ETH&amp;#39; || tokenOutInfo.address.toLowerCase() == &amp;#39;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;#39;) {&lt;br /&gt;            /*&lt;br /&gt;            ADDRESS_THIS &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAm4EpBUxTqxwMj9C_l9TjM6s_pti4WpvrTvDCglVxnmXq5ExsjjxaEjObr9baaHlrDNSzMYGugIICRudDKdXA6" title="https://degencode.substack.com/p/uniswapv3-multicall
"&gt;https://degencode.substa...m/p/uniswapv3-multicall
&lt;/a&gt;&lt;br /&gt;            &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAXfraG2_tjpF5qZhVa2DOPe32u3h5BBfr0slmn_B5xZ6rzN-eIwCZ8eLek5HxFvfxweQUD6mVbpx1Xvcf0CKfCYz-0zwKmUHA5rCm4GTxaKw" title="https://etherscan.io/address/0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45#code
"&gt;https://etherscan.io/add...85e0e4c7bd8665fc45#code
&lt;/a&gt;&lt;br /&gt;            */&lt;br /&gt;            recipientAddress = &amp;#39;0x0000000000000000000000000000000000000002&amp;#39;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        let swapToken = e.IO(&amp;quot;encode&amp;quot;, ContractV3SwapRouterV2, &amp;quot;swapExactTokensForTokens&amp;quot;, amountIn, 1, [tokenInInfo.address, tokenOutInfo.address], recipientAddress)&lt;br /&gt;        let data = [swapToken]&lt;br /&gt;        if (tokenOutInfo.name == &amp;#39;ETH&amp;#39;) {&lt;br /&gt;            data.push(e.IO(&amp;quot;encode&amp;quot;, ContractV3SwapRouterV2, &amp;quot;unwrapWETH9(uint256,address)&amp;quot;, 1, self.walletAddress))&lt;br /&gt;        }&lt;br /&gt;        let tx = e.IO(&amp;quot;api&amp;quot;, ContractV3SwapRouterV2, &amp;quot;multicall(uint256,bytes[])&amp;quot;, (tokenInInfo.name == &amp;#39;ETH&amp;#39; ? amountIn : 0), (new Date().getTime() / 1000) + 3600, data, options || {})&lt;br /&gt;        if (tx) {&lt;br /&gt;            Log(&amp;quot;tx: &amp;quot;, tx)&lt;br /&gt;            self.waitMined(tx)&lt;br /&gt;            Log(&amp;quot;swap&amp;quot;, tokenInInfo.name, &amp;quot;to&amp;quot;, tokenOutInfo.name, &amp;quot;success&amp;quot;)&lt;br /&gt;            return true&lt;br /&gt;        } else {&lt;br /&gt;            Log(&amp;quot;trans error&amp;quot;)&lt;br /&gt;            return false&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    self.getETHBalance = function(address) {&lt;br /&gt;        return toAmount(e.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getBalance&amp;quot;, address || self.walletAddress, &amp;quot;latest&amp;quot;), 18)&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    self.balanceOf = function(token, address) {&lt;br /&gt;        let tokenInfo = self.tokenInfo[token]&lt;br /&gt;        if (!tokenInfo) {&lt;br /&gt;            throw &amp;quot;not found token info &amp;quot; + token&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return toAmount(e.IO(&amp;quot;api&amp;quot;, tokenInfo.address, &amp;quot;balanceOf&amp;quot;, address || self.walletAddress), tokenInfo.decimals)&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    self.sendETH = function(to, amount, options) {&lt;br /&gt;        return e.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;send&amp;quot;, to, toInnerAmount(amount, 18), options || {})&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    self.getPrice = function(pair) {&lt;br /&gt;        let arr = pair.split(&amp;#39;_&amp;#39;)&lt;br /&gt;        let token0 = self.tokenInfo[arr[0]]&lt;br /&gt;        if (!token0) {&lt;br /&gt;            throw &amp;quot;token &amp;quot; + arr[0] + &amp;quot;not found&amp;quot;&lt;br /&gt;        }&lt;br /&gt;        let token1 = self.tokenInfo[arr[1]]&lt;br /&gt;        if (!token1) {&lt;br /&gt;            throw &amp;quot;token &amp;quot; + arr[1] + &amp;quot;not found&amp;quot;&lt;br /&gt;        }&lt;br /&gt;        let reverse = false&lt;br /&gt;        if (BigInt(token0.address) &amp;gt; BigInt(token1.address)) {&lt;br /&gt;            let tmp = token0&lt;br /&gt;            token0 = token1&lt;br /&gt;            token1 = tmp&lt;br /&gt;            reverse = true&lt;br /&gt;        }&lt;br /&gt;        let key = token0.address + &amp;#39;/&amp;#39; + token1.address&lt;br /&gt;        if (typeof(self.pool[key]) == &amp;#39;undefined&amp;#39;) {&lt;br /&gt;            let pool = e.IO(&amp;quot;api&amp;quot;, ContractV3Factory, &amp;quot;getPool&amp;quot;, token0.address, token1.address, 3000)&lt;br /&gt;            if (pool) {&lt;br /&gt;                self.pool[key] = pool&lt;br /&gt;                // register pool address&lt;br /&gt;                e.IO(&amp;quot;abi&amp;quot;, pool, ABI_Pool)&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        if (typeof(self.pool[key]) == &amp;#39;undefined&amp;#39;) {&lt;br /&gt;            throw &amp;quot;pool &amp;quot; + pair + &amp;quot; not found&amp;quot;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        let slot0 = e.IO(&amp;quot;api&amp;quot;, self.pool[key], &amp;quot;slot0&amp;quot;)&lt;br /&gt;&lt;br /&gt;        if (!slot0) {&lt;br /&gt;            return null&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        let price = computePoolPrice(token0.decimals, token1.decimals, slot0.sqrtPriceX96)&lt;br /&gt;        if (reverse) {&lt;br /&gt;            price = 1 / price&lt;br /&gt;        }&lt;br /&gt;        return price&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return self&lt;br /&gt;}&lt;br /&gt;&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;ETH&amp;quot;: &amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;, // WETH&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;    }&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;    // 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;    // swap reverse&lt;br /&gt;    Log(ex.swapToken(&amp;#39;USDT&amp;#39;, usdtBalance, &amp;#39;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;b&gt;Ethereum network&lt;/b&gt;&lt;br /&gt;Ethereum network can be understood as a software infrastructure, on which various smart contracts can be deployed and run. Smart contracts have various functions and application scenarios. The devices running the Ethereum client constitute the nodes in the Ethereum network.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Some concepts in Uniswap V3&lt;/b&gt;&lt;br /&gt;Students who are not familiar with the ```Uniswap V3``` protocol need to understand a few concepts first. ```Uniswap V3``` is also a smart contract deployed and running on Ethereum.&lt;br /&gt;&lt;br /&gt;1. Route: Route is also a smart contract, which is used to manage the exchange of ```token```.&lt;br /&gt;2. Pool: The pool is also a smart contract for storing two kinds of Ethereum tokens and exchanging between these two tokens.&lt;br /&gt;3. Factory contract: A factory contract is a smart contract used to create a pool.&lt;br /&gt;4. ABI: (Application Binary Interface) is a specification that describes how smart contracts communicate with the outside world. It specifies the function name, parameter type and return value type of the smart contract, how to encode and decode data, and determines the external interface of the smart contract. It can be understood that to call an interface, it must be called according to the agreed standards of the interface, and the ABI records a series of agreed standards.&lt;br /&gt;&lt;br /&gt;Once the smart contract is deployed on Ethereum, there will be an address.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Analyze the code of Uniswap V3 Trade Template&lt;/b&gt;&lt;br /&gt;The Uniswap V3 trading class library code is mainly divided into four parts, which we will explain one by one.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Part 1: Constants used when interacting with Uniswap V3&lt;/em&gt;&lt;br /&gt;```&lt;br /&gt;const ABI_Route = &amp;#39;[{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address...&lt;br /&gt;const ABI_Pool = &amp;#39;[{\&amp;quot;inputs\&amp;quot;:[],\&amp;quot;stateMutability\&amp;quot;:\&amp;quot;nonpayable...&lt;br /&gt;const ABI_Factory = &amp;#39;[{\&amp;quot;inputs\&amp;quot;:[],\&amp;quot;stateMutability\&amp;quot;:\&amp;quot;...&lt;br /&gt;&lt;br /&gt;let ContractV3Factory = &amp;quot;0x1F98431c8aD98523631AE4a59f267346ea31F984&amp;quot;&lt;br /&gt;let ContractV3SwapRouterV2 = &amp;quot;0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45&amp;quot;&lt;br /&gt;```&lt;br /&gt;With the above basic concept preview, it&amp;#39;s easy to understand here.&lt;br /&gt;&lt;br /&gt;```ABI_Route``` The string stored by this constant is the ABI of the routing smart contract.&lt;br /&gt;```ABI_Pool``` stores the ABI of the pool contract.&lt;br /&gt;```ABI_Factory``` The ABI of the factory contract.&lt;br /&gt;&lt;br /&gt;Since these strings are long, they are just excerpts. These contents provide a standard for the program to call the smart contract method (for example, what are the parameters of the smart contract interface, how many parameters, what type are they, and what type of returned data are).&lt;br /&gt;&lt;br /&gt;As we mentioned just now, once the smart contract is deployed in Ethereum, there will be an address.&lt;br /&gt;&lt;br /&gt;```ContractV3Factory```: The address of the factory contract is recorded.&lt;br /&gt;```ContractV3SwapRouterV2```: The router V2 address of Uniswap V3. Note that Uniswap has V1 and V2. The router of Uniswap V3 also has V1 and V2. Different contract addresses are different.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Part2: Tool functions&lt;/em&gt;&lt;br /&gt;1. ```computePoolPrice``` function is used to calculate the price of the token in the pool.&lt;br /&gt;```&lt;br /&gt;function computePoolPrice(decimals0, decimals1, sqrtPriceX96) {&lt;br /&gt;    [decimals0, decimals1, sqrtPriceX96] = [decimals0, decimals1, sqrtPriceX96].map(BigInt);   // Use the BigInt function for processing. Because of the precision of JavaScript language values, it is necessary to use one of FMZ&amp;#39;s underlying processing functions, BigInt, to process.&lt;br /&gt;    const TWO = BigInt(2);     // Define constant 2 to calculate&lt;br /&gt;    const TEN = BigInt(10);    // Define constant 10 to calculate&lt;br /&gt;    const SIX_TENTH = BigInt(1000000);    // Define the 6th power of constant 10, i.e. 1e6&lt;br /&gt;    const Q192 = (TWO ** BigInt(96)) ** TWO;  // 2^192&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;If the trading pair is ```ETH_ USDT```, then ```token0``` is ```ETH```, and ```token1``` is ```USDT```. ```decimals0``` is the precision data of ```token0```, and ```decimals1``` is the precision data of ```token1```. ```SqrtPriceX96``` is the price-related data (not the direct price value), which can be obtained from the ```slot0``` method of the pool contract.&lt;br /&gt;&lt;br /&gt;sqrtPriceX96 : The current price of the pool as a sqrt(token1/token0) Q64.96 value&lt;br /&gt;Q64.96 is a data processing and storage standard.&lt;br /&gt;&lt;br /&gt;These three data ```decimals0```, ```decimals1```, ```sqrtPriceX96``` are passed into the ```computePoolPrice``` function as parameters to calculate the price of the trading pair ```ETH_USDT```. The algorithm in the last ```return``` statement of this function is the process of restoring ```sqrtPriceX96``` to ```token1/token0```. For example, the number of token0 (ETH) in the pool is 1, and the number of token1 (USDT) is 1100. So ```1100/1=1100```, the current price in the ```ETH_USDT``` pool is 1100.&lt;br /&gt;&lt;br /&gt;2. ```toAmount``` function is used to convert numeric data in the chain into readable data.&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;```&lt;/div&gt;&lt;/div&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;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;```&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;To put it simply, for example, an ETH token is 1e18 when the number is represented on the chain, i.e., the 18th power of 10, because the precision data of ETH is 18. Not all tokens have a precision of 18, and the precision of USDT is not the same as that of ETH. The ```toAmount``` function is to convert 1e18 to 1.&lt;br /&gt;&lt;br /&gt;3. The ```toInnerAmount``` function is the opposite of the ```toAmount``` function, which converts readable data into values used in the chain.&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;Next, let&amp;#39;s analyze the code of &amp;quot;Uniswap V3 Trade Template&amp;quot;.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Part3: Constructor of Uniswap V3 operation object&lt;/em&gt;&lt;br /&gt;The core of this template class library is the Uniswap V3 operation object, which implements the basic operations on Uniswap V3. More functions may be upgraded in the future. By analyzing this code example, even if you do not use the FMZ platform, you will increase your knowledge and understanding of the processes and details of each link of Uniswap DEX. Now let&amp;#39;s learn how these basic functions are designed and implemented on FMZ.&lt;br /&gt;&lt;br /&gt;Constructor code of Uniswap V3 operation object:&lt;br /&gt;```&lt;br /&gt;$.NewUniswapV3 = function(e) {&lt;br /&gt;    e = e || exchange                          // If the parameter e is not passed, the exchange object exchange is used, that is, the first exchange added in the strategy.&lt;br /&gt;    if (e.GetName() !== &amp;#39;Web3&amp;#39;) {              // Determine if the exchange object is Web3, because this template only supports Web3 exchange objects.&lt;br /&gt;        panic(&amp;quot;only support Web3 exchange&amp;quot;)&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    let self = {                               // The current function is a constructor, and the constructed object is the object self.&lt;br /&gt;        tokenInfo: {},                         // Member variable of the self object, used to record the registration information of the token.&lt;br /&gt;        walletAddress: e.IO(&amp;quot;address&amp;quot;),        // Record the address of the wallet to which the current exchange object is bound.&lt;br /&gt;        pool: {}                               // Used to record registered pool information.&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // register&lt;br /&gt;    e.IO(&amp;quot;abi&amp;quot;, ContractV3Factory, ABI_Factory)       // ABI for registered factory contracts&lt;br /&gt;    e.IO(&amp;quot;abi&amp;quot;, ContractV3SwapRouterV2, ABI_Route)    // ABI for registered routing contracts&lt;br /&gt;&lt;br /&gt;    self.addToken = function(name, address) {         // Used to register token&lt;br /&gt;        let ret = e.IO(&amp;quot;api&amp;quot;, address, &amp;quot;decimals&amp;quot;)    // Call the decimals method to get token precision information&lt;br /&gt;        if (!ret) {&lt;br /&gt;            throw &amp;quot;get token decimals failed&amp;quot;&lt;br /&gt;        }&lt;br /&gt;        let decimals = Number(ret)&lt;br /&gt;        self.tokenInfo[name] = {&lt;br /&gt;            name: name,&lt;br /&gt;            decimals: decimals,&lt;br /&gt;            address: address&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    self.waitMined = function(tx) {             // It is used to wait for the result of an operation on Ethereum. The hash is a tx parameter.&lt;br /&gt;        while (true) {&lt;br /&gt;            Sleep(1000)&lt;br /&gt;            let info = e.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getTransactionReceipt&amp;quot;, tx)  // Query results using eth_getTransactionReceipt method, if it&amp;#39;s not found, loop to continue query.&lt;br /&gt;            if (info &amp;amp;&amp;amp; info.gasUsed) {&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;    }&lt;br /&gt;&lt;br /&gt;    self.swapToken = function(tokenIn, amountInDecimal, tokenOut, options) {   // For token exchange&lt;br /&gt;        // options like {gasPrice: 11, gasLimit: 111, nonce: 111}&lt;br /&gt;        let tokenInInfo = self.tokenInfo[tokenIn]      // Get the information of the exchanged token&lt;br /&gt;        let tokenOutInfo = self.tokenInfo[tokenOut]    // Get the information of the converted token&lt;br /&gt;        if (!tokenInInfo) {&lt;br /&gt;            throw &amp;quot;not found token info &amp;quot; + tokenIn&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if (!tokenOutInfo) {&lt;br /&gt;            throw &amp;quot;not found token info &amp;quot; + tokenOut&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        let amountIn = toInnerAmount(amountInDecimal, tokenInInfo.decimals)  // Convert to data used on smart contracts&lt;br /&gt;        let recipientAddress = self.walletAddress&lt;br /&gt;        if (tokenInInfo.name != &amp;#39;ETH&amp;#39;) {&lt;br /&gt;            let allowanceAmount = e.IO(&amp;quot;api&amp;quot;, tokenInInfo.address, &amp;quot;allowance&amp;quot;, self.walletAddress, ContractV3SwapRouterV2);   // Query the number of authorizations&lt;br /&gt;            let realAmount = toAmount(allowanceAmount, tokenInInfo.decimals)&lt;br /&gt;            if (realAmount &amp;lt; toAmount(amountIn, tokenInInfo.decimals)) {    // If the number of licenses is insufficient&lt;br /&gt;                Log(&amp;quot;realAmount is&amp;quot;, realAmount, &amp;quot;too small, try to approve large amount&amp;quot;)&lt;br /&gt;                if (tokenInInfo.name == &amp;#39;USDT&amp;#39;) {&lt;br /&gt;                    // As described in Tether code: To change the approve amount you first have to reduce the addresses allowance to 0 calling approve(spender, 0)&lt;br /&gt;                    let txApprove = e.IO(&amp;quot;api&amp;quot;, tokenInInfo.address, &amp;quot;approve&amp;quot;, ContractV3SwapRouterV2, 0)  // If the authorized token is USDT, it needs to be authorized to 0 first.&lt;br /&gt;                    if (!txApprove) {&lt;br /&gt;                        throw &amp;quot;approve error&amp;quot;&lt;br /&gt;                    }&lt;br /&gt;                    Log(&amp;quot;wait reduce approve&amp;quot;, txApprove)&lt;br /&gt;                    self.waitMined(txApprove)&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                let txApprove = e.IO(&amp;quot;api&amp;quot;, tokenInInfo.address, &amp;quot;approve&amp;quot;, ContractV3SwapRouterV2, &amp;#39;0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff&amp;#39;);  // Authorize Router contracts to operate the wallet&amp;#39;s tokens&lt;br /&gt;                if (!txApprove) {&lt;br /&gt;                    throw &amp;quot;approve error&amp;quot;&lt;br /&gt;                }&lt;br /&gt;                Log(&amp;quot;wait approve&amp;quot;, txApprove)&lt;br /&gt;                self.waitMined(txApprove)&lt;br /&gt;                Log(&amp;quot;approve success amountIn&amp;quot;, amountIn)&lt;br /&gt;            } else {&lt;br /&gt;                Log(&amp;quot;allowance&amp;quot;, realAmount, &amp;quot;no need to approve&amp;quot;)&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if (tokenOutInfo.name == &amp;#39;ETH&amp;#39; || tokenOutInfo.address.toLowerCase() == &amp;#39;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;#39;) {&lt;br /&gt;            /*&lt;br /&gt;            ADDRESS_THIS &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAm4EpBUxTqxwMj9C_l9TjM6s_pti4WpvrTvDCglVxnmXq5ExsjjxaEjObr9baaHlrDNSzMYGugIICRudDKdXA6" title="https://degencode.substack.com/p/uniswapv3-multicall
"&gt;https://degencode.substa...m/p/uniswapv3-multicall
&lt;/a&gt;&lt;br /&gt;            &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAXfraG2_tjpF5qZhVa2DOPe32u3h5BBfr0slmn_B5xZ6rzN-eIwCZ8eLek5HxFvfxweQUD6mVbpx1Xvcf0CKfCYz-0zwKmUHA5rCm4GTxaKw" title="https://etherscan.io/address/0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45#code
"&gt;https://etherscan.io/add...85e0e4c7bd8665fc45#code
&lt;/a&gt;&lt;br /&gt;            */&lt;br /&gt;            recipientAddress = &amp;#39;0x0000000000000000000000000000000000000002&amp;#39;&lt;br /&gt;            // When exchanging other coins for WETH, you have to let the contract hold WETH before you can redeem it.&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        let swapToken = e.IO(&amp;quot;pack&amp;quot;, ContractV3SwapRouterV2, &amp;quot;swapExactTokensForTokens&amp;quot;, amountIn, 1, [tokenInInfo.address, tokenOutInfo.address], recipientAddress)   // Packaged swapExactTokensForTokens to call.&lt;br /&gt;        let data = [swapToken]&lt;br /&gt;        if (tokenOutInfo.name == &amp;#39;ETH&amp;#39;) {    // If the token exchanged back is ETH, which in this case is actually WETH, then it needs to unpack.&lt;br /&gt;            data.push(e.IO(&amp;quot;pack&amp;quot;, ContractV3SwapRouterV2, &amp;quot;unwrapWETH9(uint256,address)&amp;quot;, 1, self.walletAddress))   // So here is another unwrapWETH9 unpacking to call&lt;br /&gt;        }&lt;br /&gt;        let tx = e.IO(&amp;quot;api&amp;quot;, ContractV3SwapRouterV2, &amp;quot;multicall(uint256,bytes[])&amp;quot;, (tokenInInfo.name == &amp;#39;ETH&amp;#39; ? amountIn : 0), (new Date().getTime() / 1000) + 3600, data, options || {})   // Use multicall to perform these packaged operations (swapExactTokensForTokens, unwrapWETH9)&lt;br /&gt;        if (tx) {&lt;br /&gt;            Log(&amp;quot;tx: &amp;quot;, tx)&lt;br /&gt;            self.waitMined(tx)&lt;br /&gt;            Log(&amp;quot;swap&amp;quot;, tokenInInfo.name, &amp;quot;to&amp;quot;, tokenOutInfo.name, &amp;quot;success&amp;quot;)&lt;br /&gt;            return true&lt;br /&gt;        } else {&lt;br /&gt;            Log(&amp;quot;trans error&amp;quot;)&lt;br /&gt;            return false&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    self.getETHBalance = function(address) {   // Check your wallet&amp;#39;s ETH balance&lt;br /&gt;        return toAmount(e.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getBalance&amp;quot;, address || self.walletAddress, &amp;quot;latest&amp;quot;), 18)&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    self.balanceOf = function(token, address) {  // Query the balance of a token in a wallet (determined by parameters)&lt;br /&gt;        let tokenInfo = self.tokenInfo[token]&lt;br /&gt;        if (!tokenInfo) {&lt;br /&gt;            throw &amp;quot;not found token info &amp;quot; + token&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return toAmount(e.IO(&amp;quot;api&amp;quot;, tokenInfo.address, &amp;quot;balanceOf&amp;quot;, address || self.walletAddress), tokenInfo.decimals)&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    self.sendETH = function(to, amount, options) {   // Sending ETH tokens to an address, i.e. transfer&lt;br /&gt;        return e.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;send&amp;quot;, to, toInnerAmount(amount, 18), options || {})&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    self.getPrice = function(pair, fee) {     // Get price of trading pair&lt;br /&gt;        let arr = pair.split(&amp;#39;_&amp;#39;)&lt;br /&gt;        let token0 = self.tokenInfo[arr[0]]&lt;br /&gt;        if (!token0) {&lt;br /&gt;            throw &amp;quot;token &amp;quot; + arr[0] + &amp;quot;not found&amp;quot;&lt;br /&gt;        }&lt;br /&gt;        let token1 = self.tokenInfo[arr[1]]    // First, get the two token information that constitute the trading pair&lt;br /&gt;        if (!token1) {&lt;br /&gt;            throw &amp;quot;token &amp;quot; + arr[1] + &amp;quot;not found&amp;quot;&lt;br /&gt;        }&lt;br /&gt;        let reverse = false&lt;br /&gt;        if (BigInt(token0.address) &amp;gt; BigInt(token1.address)) {&lt;br /&gt;            let tmp = token0&lt;br /&gt;            token0 = token1&lt;br /&gt;            token1 = tmp&lt;br /&gt;            reverse = true&lt;br /&gt;        }&lt;br /&gt;        let key = token0.address + &amp;#39;/&amp;#39; + token1.address&lt;br /&gt;        if (typeof(self.pool[key]) == &amp;#39;undefined&amp;#39;) {&lt;br /&gt;            let pool = e.IO(&amp;quot;api&amp;quot;, ContractV3Factory, &amp;quot;getPool&amp;quot;, token0.address, token1.address, typeof(fee) === &amp;#39;number&amp;#39; ? fee : 3000)   // Call the getPool method of the factory contract to obtain the address of the exchange pool&lt;br /&gt;            if (pool) {&lt;br /&gt;                self.pool[key] = pool    // Register the pool address and register the ABI of the pool contract&lt;br /&gt;                // register pool address&lt;br /&gt;                e.IO(&amp;quot;abi&amp;quot;, pool, ABI_Pool)&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        if (typeof(self.pool[key]) == &amp;#39;undefined&amp;#39;) {&lt;br /&gt;            throw &amp;quot;pool &amp;quot; + pair + &amp;quot; not found&amp;quot;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        let slot0 = e.IO(&amp;quot;api&amp;quot;, self.pool[key], &amp;quot;slot0&amp;quot;)  // Call the slot0 method of the pool contract to get price related information&lt;br /&gt;&lt;br /&gt;        if (!slot0) {&lt;br /&gt;            return null&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        let price = computePoolPrice(token0.decimals, token1.decimals, slot0.sqrtPriceX96)  // Calculate the readable price&lt;br /&gt;        if (reverse) {&lt;br /&gt;            price = 1 / price&lt;br /&gt;        }&lt;br /&gt;        return price&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return self&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;Students who may be not familiar with FMZ see the function ```$.NewUniswapV3``` has a strange name. Functions with ```$``` at the beginning indicates that this function is the interface function of the template class library on FMZ (what is the template class library can be [viewed](https://www.fmz.com/api#template - library), simply put, the ```$. NewUniswapV3``` function can be called by other strategies that reference the **template class library** directly. The strategy has the function of ```Uniswap V3``` directly.&lt;br /&gt;&lt;br /&gt;The function ```$.NewUniswapV3``` directly constructs and creates an object, which can be used to perform some operations:&lt;br /&gt;&lt;br /&gt;- Token exchange: implemented by the ```swapToken``` method of the object.&lt;br /&gt;- ETH balance query: implemented by the ```getETHBalance``` method of the object.&lt;br /&gt;- Token balance query: implemented by the ```balanceOf``` method of the object.&lt;br /&gt;- Transaction pair price query: implemented by the ```getPrice``` method of the object.&lt;br /&gt;- Send ETH for transfer: implemented by the ```sendETH``` method of the object.&lt;br /&gt;&lt;br /&gt;This class library may not be limited to these functions in the future, and may even upgrade and add &amp;quot;add liquidity&amp;quot; and other functions. Let&amp;#39;s continue to analyze the code:&lt;br /&gt;```&lt;br /&gt;    e = e || exchange&lt;br /&gt;    if (e.GetName() !== &amp;#39;Web3&amp;#39;) {&lt;br /&gt;        panic(&amp;quot;only support Web3 exchange&amp;quot;)&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    let self = {&lt;br /&gt;        tokenInfo: {},&lt;br /&gt;        walletAddress: e.IO(&amp;quot;address&amp;quot;),&lt;br /&gt;        pool: {}&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // register&lt;br /&gt;    e.IO(&amp;quot;abi&amp;quot;, ContractV3Factory, ABI_Factory)&lt;br /&gt;    e.IO(&amp;quot;abi&amp;quot;, ContractV3SwapRouterV2, ABI_Route)&lt;br /&gt;```&lt;br /&gt;The constructor ```$.NewUniswapV3``` has only one parameter ```e```, which means the exchange object (the exchange configuration on FMZ). Because the strategy on FMZ can be designed to be multi-exchange, so if a specific exchange is passed here, it means that the ```Uniswap V3``` object created is the one that operates the exchange object. If the parameter ```e``` is not passed, the first added exchange object is operated by default.&lt;br /&gt;&lt;br /&gt;Configure the node service address, private key (you can deploy the private key locally, local deployment only uses the configuration path), and an exchange object is created. It can be added to the strategy at the time of the real market, this object is reflected in the strategy code is ```exchange``` also known as ```exchanges[0]```, if you add the second, it&amp;#39;s ```exchanges[1]```, add the third for ```exchanges[2]```, ...&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150335
" title="https://stocksharp.com/file/150335
"&gt;https://stocksharp.com/file/150335
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The node address I configured in the screenshot: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAACtc0SYxwKqMws34TsGxEYlOYrhaFko3WvcRg8_ysyJH6FI7yPeJh7tkaLWzHRx5XM" title="https://mainnet.infura.io/v3/xxx, "&gt;https://mainnet.infura.io/v3/xxx, &lt;/a&gt;which is an infura node, which can be applied by individuals. Each account has its own specific address. xxx here is the mask, and the xxx part of each account is different.&lt;br /&gt;&lt;br /&gt;Continue with the code. The constructor starts to determine whether the exchange object is Web3, if not, an error will be reported. Then a variable ```self``` is created. The self is the object finally returned by the constructor. Subsequent constructors add various functions to this object and implement specific functions. The variable self has three attributes:&lt;br /&gt;&lt;br /&gt;- tokenInfo: records the token information registered in the object, including token address, token precision, and token name.&lt;br /&gt;- walletAddress: the wallet address of the current exchange object.&lt;br /&gt;- pool: the exchange pool information registered in the object, mainly including the name and address of the exchange pool.&lt;br /&gt;&lt;br /&gt;Then we use the concept we learned in the previous chapter:&lt;br /&gt;```&lt;br /&gt;e.IO(&amp;quot;abi&amp;quot;, ContractV3Factory, ABI_Factory)     // Register ABI for Uniswap V3 factory contract&lt;br /&gt;e.IO(&amp;quot;abi&amp;quot;, ContractV3SwapRouterV2, ABI_Route)  // Register ABI for Uniswap Router V2 routing &lt;br /&gt;```&lt;br /&gt;Why register this interface information?&lt;br /&gt;&lt;br /&gt;Because some functions to be implemented in the future need to call the interfaces of these smart contracts. Next, the constructor adds various methods to the self object. In addition to the above mentioned self object methods: exchange token, query balance, etc., there are also some tool functions belonging to the self object. Let&amp;#39;s analyze these tool functions first.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Tool functions for self objects&lt;/b&gt;&lt;br /&gt;1. ```self.addToken = function(name, address)```&lt;br /&gt;&lt;br /&gt;By observing the specific code of this function, we can see that this function is used to add (in other words, register) a token information to the current object ```self``` in the member ```tokenInfo``` that records ```token``` information. Because the precision data of ```token``` is often used in subsequent calculations, when this function adds (registers) token information, it calls the ```let ret=e.IO (&amp;quot;api&amp;quot;, address, &amp;quot;decimals&amp;quot;)``` function, and calls the ```&amp;quot;decimals&amp;quot;``` method of token contract through the FMZ encapsulated exchange.IO function (we mentioned that e is the exchange object passed in) to obtain the precision of token.&lt;br /&gt;&lt;br /&gt;So ```self. tokenInfo``` is a dictionary structure. Each key name is the token name, and the key value is the token information, including address, name, and precision. It looks like this:&lt;br /&gt;```&lt;br /&gt;{&lt;br /&gt;    &amp;quot;ETH&amp;quot;: {name: &amp;quot;ETH&amp;quot;, decimals: 18, address: &amp;quot;0x...&amp;quot;},&lt;br /&gt;    &amp;quot;USDT&amp;quot;: {name: &amp;quot;USDT&amp;quot;, decimals: 6, address: &amp;quot;0x...&amp;quot;},&lt;br /&gt;    ...&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;2. ```self.waitMined = function(tx)```&lt;br /&gt;&lt;br /&gt;This function is used to wait for the execution result of the smart contract on Ethereum. From the implementation code of this function, we can see that this function has been calling ```let info=e.IO (&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getTransactionReceipt&amp;quot;, tx)``` in a loop. By calling the RPC method ```eth_ GetTransactionReceipt``` of Ethereum to query the transaction hash and return the transaction receipt. The parameter ```tx``` is the transaction hash.&lt;br /&gt;&lt;br /&gt;```eth_ GetTransactionReceipt``` and other relevant data can be viewed at: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAABlaJDx2jIW8Cm7K63Hv1s-0aK2glkK9qKTKcfQgoNb3B2o1yifuAZ-fjxWUo77b5Hb5TShdM5z5WHocST8QX2D14bclw6q_CemDFdbDDT47W8xP4PFkaNv76zEXAU849Q" title="https://ethereum.org/zh/developers/docs/apis/json-rpc/#eth_gettransactionreceipt
"&gt;https://ethereum.org/zh/...h_gettransactionreceipt
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Some students may ask: Why do we need this function?&lt;br /&gt;&lt;br /&gt;Answer: When performing some operations, such as token exchange, it is necessary to wait for the result.&lt;br /&gt;&lt;br /&gt;Next we will look at the other main functions of the object self created by the ```$.NewUniswapV3``` function, we start with the simplest one.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Main function functions&lt;/b&gt;&lt;br /&gt;1. ```self.getETHBalance = function(address)```&lt;br /&gt;&lt;br /&gt;The query of token balance can be divided into the query of ETH balance and the query of other ERC20 token balance. The getETHBalance function of the self object is used to query the ETH balance. When the specific wallet address parameter address is passed in, the ETH balance of this address is queried. If the address parameter is not passed, then the ETH balance of the ```self.walletAddress``` address (i.e. the wallet configured on the current exchange) is queried.&lt;br /&gt;&lt;br /&gt;If the address parameter is not passed, then the ETH balance of the ```self.walletAddress``` address (i.e. the wallet configured on the current exchange) is queried.&lt;br /&gt;&lt;br /&gt;These are achieved by calling the RPC method ```eth_getBalance``` of Ethereum.&lt;br /&gt;&lt;br /&gt;2. ```self.balanceOf = function(token, address)```&lt;br /&gt;&lt;br /&gt;To query the token balance other than ETH, you need to pass in the parameter token, that is, the token name, such as USDT. Pass in the address of the wallet to be queried, and if no address is passed in, query the balance of the address of ```self.walletAddress```. By observing the code implemented by this function, we can see that only the token registered through the ```self.addToken``` function can be queried, because the precision information and address of the token (token) are required when calling the ```balanceOf``` method of the token contract.&lt;br /&gt;&lt;br /&gt;3. ```self.sendETH = function(to, amount, options)```&lt;br /&gt;&lt;br /&gt;The function of this function is ETH transfer. To transfer a certain amount of ETH to a wallet address (using the parameter ```to``` to set), you can set another ```options``` parameter (data structure: ```{gasPrice: 111, gasLimit: 111, nonce: 111}```) to specify the ```gasLimit/gasPrice/once``` parameter. The system default setting is used without passing in the options parameter.&lt;br /&gt;&lt;br /&gt;```GasLimit/gasPrice``` affects the ETH consumed when performing operations on Ethereum (some operations on Ethereum consume gas, that is, certain ETH tokens).&lt;br /&gt;&lt;br /&gt;4. ```self.getPrice = function(pair, fee)```&lt;br /&gt;&lt;br /&gt;This function is used to obtain the price of a trading pair on Uniswap. You can see from the function implementation code that the trading pair will be parsed at the beginning of the function execution to obtain the baseCurrency and quoteCurrency. For example, the trading pair is ETH_USDT, it will be split into ETH and USDT. Then query whether there are two kinds of token information in ```self.tokenInfo```. If there is no information, an error will be reported.&lt;br /&gt;&lt;br /&gt;The exchange pool address on Uniswap is composed of two token addresses and Fee (rate standard) calculations. So when querying the pool address recorded in ```self. tool``` (we have mentioned self.tool before, you can check it), if not found, use the two token addresses and Fee to calculate the pool address. So a trading pair may have multiple pools, because the Fee may be different.&lt;br /&gt;&lt;br /&gt;The address of the query and calculation exchange pool is obtained by calling the ```getPool``` method of the factory contract in Uniswap V3 (so you need to register the ABI of the factory contract at the beginning).&lt;br /&gt;&lt;br /&gt;Get the pool address of the trading pair, and you can register the ABI of the pool contract. In this way, the ```slot0``` method of this pool (smart contract) can be called to get the price data. Of course, the data returned by this method is not a human-readable price, but a price-related data structure. Further processing is needed to obtain a readable price. At this time, we use the ```computePoolPrice``` function mentioned in the previous section.&lt;br /&gt;&lt;br /&gt;5. ```self.swapToken = function(tokenIn, amountInDecimal, tokenOut, options)```&lt;br /&gt;&lt;br /&gt;The function of this function is token exchange. The parameter tokenIn is the name of the token paid during exchange, the parameter tokenOut is the name of the token obtained during exchange, and the parameter amountInDecimal is the exchange quantity (human-readable quantity). The parameter options, as we mentioned earlier, can be set for gas consumption, nonce, etc. during exchange.&lt;br /&gt;&lt;br /&gt;When the function is executed, the information of token (token) is first obtained from the ```self. tokenInfo``` variable. There are many details of the exchange. First, if the token involved in the exchange is not ETH, then the **routing** (smart contract responsible for exchange) needs to be authorized first. Before authorization, check whether there is enough authorization.&lt;br /&gt;```&lt;br /&gt;let allowanceAmount = e.IO(&amp;quot;api&amp;quot;, tokenInInfo.address, &amp;quot;allowance&amp;quot;, self.walletAddress, ContractV3SwapRouterV2);&lt;br /&gt;```&lt;br /&gt;Use the token contract allowance method to query the authorized amount. By comparing the authorized amount with the current amount of exchange, if the authorized amount is enough to exchange, no authorization is needed. If the amount is insufficient, the authorization processing will be executed.&lt;br /&gt;&lt;br /&gt;There is also a detail of authorization here. If the authorized token is a USDT, you need to reset the number of authorization to 0 before authorization. The approve method of the token contract is authorized. Note that the approval authorization method is a gas consumption method, which will consume a certain amount of ETH. So you need to use the self.waitMined function to wait for the processing result.&lt;br /&gt;&lt;br /&gt;In order to avoid frequent authorization and pay unnecessary ETH, this authorization operation is the maximum one-time authorization.&lt;br /&gt;```&lt;br /&gt;let txApprove = e.IO(&amp;quot;api&amp;quot;, tokenInInfo.address, &amp;quot;approve&amp;quot;, ContractV3SwapRouterV2, &amp;#39;0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff&amp;#39;);&lt;br /&gt;```&lt;br /&gt;With enough exchange limits, you can exchange. However, there are also details here. If the token involved in the exchange, the token obtained after the exchange is ETH, then you need to change the receiving address:&lt;br /&gt;```&lt;br /&gt;recipientAddress = &amp;#39;0x0000000000000000000000000000000000000002&amp;#39;&lt;br /&gt;```&lt;br /&gt;The specific reasons are more complex and are not described here, please refer to:&lt;br /&gt;&lt;br /&gt;ADDRESS_THIS &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAm4EpBUxTqxwMj9C_l9TjM6s_pti4WpvrTvDCglVxnmXq5ExsjjxaEjObr9baaHlrDNSzMYGugIICRudDKdXA6" title="https://degencode.substack.com/p/uniswapv3-multicall
"&gt;https://degencode.substa...m/p/uniswapv3-multicall
&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAXfraG2_tjpF5qZhVa2DOPe32u3h5BBfr0slmn_B5xZ6rzN-eIwCZ8eLek5HxFvfxweQUD6mVbpx1Xvcf0CKfCYz-0zwKmUHA5rCm4GTxaKw" title="https://etherscan.io/address/0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45#code
"&gt;https://etherscan.io/add...85e0e4c7bd8665fc45#code
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Then use the packaging function ```e.IO(&amp;quot;pack&amp;quot;, ...```) encapsulated by the FMZ platform to package the swapExactTokensForTokens method call for routing (smart contract). If the token obtained after exchange is ETH, you need to add a step of WETH9 unpacking operation:&lt;br /&gt;```&lt;br /&gt;data.push(e.IO(&amp;quot;pack&amp;quot;, ContractV3SwapRouterV2, &amp;quot;unwrapWETH9(uint256,address)&amp;quot;, 1, self.walletAddress))&lt;br /&gt;```&lt;br /&gt;Because WETH is involved in the exchange. This is a packaged token of ETH. For real ETH, unpacking operation is required. After the unpacking operation is also packaged, the multicast method of routing (smart contract) can be called to perform this series of operations. Here is another detail to pay extra attention to: if the trading pair participating in the exchange, the payment token is ETH, the number of ETH transferred needs to be set in the following steps. If it is not ETH, set 0.&lt;br /&gt;```&lt;br /&gt;let tx = e.IO(&amp;quot;api&amp;quot;, ContractV3SwapRouterV2, &amp;quot;multicall(uint256,bytes[])&amp;quot;, (tokenInInfo.name == &amp;#39;ETH&amp;#39; ? amountIn : 0), (new Date().getTime() / 1000) + 3600, data, options || {})&lt;br /&gt;```&lt;br /&gt;The setting is reflected here: ```(tokenInInfo. name==&amp;#39;ETH &amp;#39;? AmountIn: 0)```. I did not make it clear before that I did not set 0 when tokenIn was not equal to ETH token, resulting in the wrong transfer of ETH. So be careful when writing the transfer code.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Part4: How to use Uniswap V3 operation objects&lt;/em&gt;&lt;br /&gt;The code in this template is actually less than 200 lines in terms of function implementation. The following paragraph is a demonstration of its use.&lt;br /&gt;```&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;ETH&amp;quot;: &amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;, // WETH&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;    }&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;    // 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;    // swap reverse&lt;br /&gt;    Log(ex.swapToken(&amp;#39;USDT&amp;#39;, usdtBalance, &amp;#39;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;The function ```$. testUniswap=function()``` is only a demonstration. Do not call it without practical use. Let&amp;#39;s use this function to see how to use this template class library to operate the function of Uniswap V3.&lt;br /&gt;&lt;br /&gt;In the code, execute ```let ex=$. NewUniswapV3()``` to construct a Uniswap V3 operation object first. If you want to get the wallet address bound by the current exchange, you can use ```ex. walletAddress``` to get it. Then, the code uses the ```ex.addToken``` to register three kinds of tokens, namely ETH, USDT and 1INCH.&lt;br /&gt;&lt;br /&gt;Print the price of a trading pair (token needs to be registered first):&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;The getPrice function uses the default rate of 3,000 if no Fee is set, which is converted to a readable value of 0.3%.&lt;br /&gt;&lt;br /&gt;If you want to convert 0.01 ETH to USDT, then check the balance and then convert back, use the code:&lt;br /&gt;```&lt;br /&gt;Log(ex.swapToken(&amp;#39;ETH&amp;#39;, 0.01, &amp;#39;USDT&amp;#39;))&lt;br /&gt;&lt;br /&gt;let usdtBalance = ex.balanceOf(&amp;#39;USDT&amp;#39;)   // Check the balance of USDT after exchange&lt;br /&gt;Log(&amp;quot;balance of USDT&amp;quot;, usdtBalance)&lt;br /&gt;&lt;br /&gt;Log(ex.swapToken(&amp;#39;USDT&amp;#39;, usdtBalance, &amp;#39;ETH&amp;#39;))  // Exchange USDT to ETH&lt;br /&gt;Log(&amp;quot;balance of ETH&amp;quot;, ex.getETHBalance())      // Check ETH Balance&lt;br /&gt;&lt;br /&gt;// Log(ex.sendETH(&amp;#39;0x11111&amp;#39;, 0.02))            // ETH transfer operations&lt;br /&gt;```&lt;br /&gt;&lt;b&gt;Testing with the test network Goerli&lt;/b&gt;&lt;br /&gt;1. Configure the test network exchange object&lt;br /&gt;&lt;br /&gt;Note that setting up the node requires setting up the node as a test network Goerli.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150336
" title="https://stocksharp.com/file/150336
"&gt;https://stocksharp.com/file/150336
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. Write a strategy and test it on the test network Goerli.&lt;br /&gt;```&lt;br /&gt;function main() {&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;ETH&amp;quot;  : &amp;quot;0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6&amp;quot;,  // WETH&lt;br /&gt;        &amp;quot;LINK&amp;quot; : &amp;quot;0x326C977E6efc84E512bB9C30f76E30c160eD06FB&amp;quot;,&lt;br /&gt;        &amp;quot;UNI&amp;quot;  : &amp;quot;0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984&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;    // ETH_UNI 、 UNI_ETH&lt;br /&gt;    Log(&amp;quot;ETH_UNI:&amp;quot;, ex.getPrice(&amp;#39;ETH_UNI&amp;#39;))&lt;br /&gt;    Log(&amp;quot;UNI_ETH:&amp;quot;, ex.getPrice(&amp;#39;UNI_ETH&amp;#39;))&lt;br /&gt;    &lt;br /&gt;    // ETH &lt;br /&gt;    Log(&amp;quot;balance of ETH&amp;quot;, ex.getETHBalance())&lt;br /&gt;    &lt;br /&gt;    // UNI&lt;br /&gt;    let uniBalance = ex.balanceOf(&amp;#39;UNI&amp;#39;)&lt;br /&gt;    Log(&amp;quot;balance of UNI&amp;quot;, uniBalance)&lt;br /&gt;    &lt;br /&gt;    // LINK&lt;br /&gt;    let linkBalance = ex.balanceOf(&amp;#39;LINK&amp;#39;)&lt;br /&gt;    Log(&amp;quot;balance of LINK&amp;quot;, linkBalance)&lt;br /&gt;    &lt;br /&gt;    // swap 0.001 ETH to UNI&lt;br /&gt;    Log(ex.swapToken(&amp;#39;ETH&amp;#39;, 0.001, &amp;#39;UNI&amp;#39;))&lt;br /&gt;    &lt;br /&gt;    // swap UNI to LINK&lt;br /&gt;    Log(ex.swapToken(&amp;#39;UNI&amp;#39;, ex.balanceOf(&amp;#39;UNI&amp;#39;) - uniBalance, &amp;#39;LINK&amp;#39;))&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;In the test code, we tested the printing of wallet address, registration of token information, printing of asset balance, and a continuous exchange of ```ETH -&amp;gt;UNI -&amp;gt;LINK```. It should be noted that the token address registered here is on the Goorli test network of Ethereum, so the token address with the same name is different. As for the test token, you can use the faucet of this test network to apply for the test token, and the details can be queried by Google.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150337
" title="https://stocksharp.com/file/150337
"&gt;https://stocksharp.com/file/150337
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note that you must check the &amp;quot;Uniswap V3 Trade Template&amp;quot; to use the ```$. NewUniswapV3()``` function. If your FMZ account does not have this template, you can click [Get here](https://www.fmz.com/strategy/397260).&lt;br /&gt;&lt;br /&gt;Asset values displayed on the Uniswap page&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAC3KH9_yAE7OGJtvrYePtizAwOvVqVLEqo5jOz3PCLRyQ" title="https://app.uniswap.org/
"&gt;https://app.uniswap.org/
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150339
" title="https://stocksharp.com/file/150339
"&gt;https://stocksharp.com/file/150339
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;These operations can also be queried in the chain:&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAACU7trfMmLxfYlhkikMz-uYmlUZPLdKu2f6O3bKJ77_Wg" title="https://goerli.etherscan.io/
"&gt;https://goerli.etherscan.io/
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150341
" title="https://stocksharp.com/file/150341
"&gt;https://stocksharp.com/file/150341
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ETH was converted to UNI once, UNI authorization was executed once, and UNI was exchanged to LINK once.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;END&lt;/b&gt;&lt;br /&gt;There are many functions of this class library that can be extended, and can even be extended to package multiple exchanges to realize ```tokenA -&amp;gt;tokenB -&amp;gt;tokenC``` path exchange. It can be optimized and expanded according to the needs. This kind of library code is mainly for teaching.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update&lt;/b&gt;&lt;br /&gt;The ```swapToken``` function has been upgraded to support ```tokenA -&amp;gt;tokenB -&amp;gt;tokenC... -&amp;gt; TokenD``` continuous exchange function. You can check the latest code of the template published by Strategy Square on FMZ platform.&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y6w5Y_yPk5fqeeMfM017zvUOazxN7_1MVvw1KyxjM_xDdIfXh_9yScBcsFMjapSVVpx4oRqeJS32zseXVe0oIsJASIZyx1SCx5lhE7PcC2vg4" title="https://blog.mathquant.com/2023/02/09/elegant-and-simple-accessed-uniswap-v3-on-fmz-with-200-lines-of-code.html"&gt;https://blog.mathquant.c...h-200-lines-of-code.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25700/</id>
    <title type="text">Build probability thinking to improve your trading pattern</title>
    <published>2024-04-17T05:09:12Z</published>
    <updated>2024-04-17T05:09:12Z</updated>
    <author>
      <name>Trading</name>
      <uri>https://stocksharp.com/users/186421/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#cryptocurrency" />
    <category term="#strategy" />
    <category term="#analysis" />
    <category term="#exchange" />
    <category term="#profit" />
    <category term="#FMZQuant" />
    <category term="#marekt" />
    <category term="#risks" />
    <category term="#returns" />
    <content type="html">&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;Trading is both a science and an art. There are many methods in trading, whether it is value investment, technical analysis, event hot spots, arbitrage hedging, etc., which seem logically rigorous on the surface, and it can also be plausible theoretically. But in fact, they often contradict each other. Sometimes, the rigor of science cannot explain the unconstrained nature of art.&lt;br /&gt;&lt;br /&gt;Although various trading methods have different starting points, all roads lead to Rome. The advantage of value investment is that it can divide a margin of safety for price fluctuations according to value; The advantage of technical analysis is that the three major assumptions make the transaction scientific.&lt;br /&gt;&lt;br /&gt;However, they all have a common feature, that is, the price analysis of the future can only be predicted roughly not accurately. Even if fundamental analysis and technical analysis are combined, the problem of improving &amp;quot;accuracy&amp;quot; cannot be solved, so trading is a probability game from beginning to end.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Probability game&lt;/b&gt;&lt;br /&gt;In fact, not only trading is a game of probability. When you cross the road (green light, is it safe to cross the road now?); What kind of friends do you make (is this friend reliable?); What kind of business you are engaged in (is career trading really a good business?), who you marry (will we be happy together?), and so on, are all probability games to evaluate risks and returns. Because we do not have the ability to predict, even if we are more confident about everything, risks always exist, and we cannot achieve 100% certainty.&lt;br /&gt;&lt;br /&gt;The important reason why many people make mistakes in trading is that they lack probability thinking and are too emotional rather than rational in trading. Sensibility is actually our primitive instincts. In the market, these primitive instincts can stimulate many weaknesses of people and magnify them exponentially. This is also the reason why most people come to the market and end up with failure.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Reasons for trading failure&lt;/b&gt;&lt;br /&gt;&lt;em&gt;Reason 1: Because of human nature&lt;/em&gt;&lt;br /&gt;Most people have one weakness: they like to take small advantages but they are afraid of small losses. Once there is a small profit in the market, they will immediately cash out, take profits out; Once there is a loss, they hold on to the loss position and try to get lucky to get back their capital. As a result, small losses accumulate into large losses gradually.&lt;br /&gt;&lt;br /&gt;The price will either go up or down, or it will not move. In the long run, the probability of making profits and losing money is about 50% without considering the handling fee and sliding point, so the trading method of most people will become a negative expectation strategy with limited profits and unlimited risks. Their transaction statements should be as follows: small profit &amp;gt;&amp;gt; ... &amp;gt;&amp;gt;small profit &amp;gt;&amp;gt;great loss.&lt;br /&gt;&lt;br /&gt;In real life, this is very similar to the thinking of the poor and the rich. The poor are risk-averse and afraid of loss, they like the work of ensuring harvest in drought and flood, and pursue stability. Even if they are not absolutely sure about doing something, they will never do it. On the surface, there seems to be nothing wrong with this, but there are huge opportunity risks behind it.&lt;br /&gt;&lt;br /&gt;The rich are more willing to take risks. They know that risks are always proportional to returns. Only risks breed opportunities. They can reasonably evaluate risks and make bold bets when risks are controllable.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Reason 2: Like to make quick money&lt;/em&gt;&lt;br /&gt;A foreign organization once made statistics. In the long run, the annualized return on net assets of most industries is difficult to exceed 15%. On the contrary, many retail investors think that they can earn 15% in the market and are embarrassed to say hello to others. People like to make fast money. In action, they are large position trading and short-term trading.&lt;br /&gt;&lt;br /&gt;Large position&lt;br /&gt;Large positions, high leverage and capital allocation are very attractive and dangerous. Success leads to success, and failure leads to disaster. If you have a trading strategy with a winning rate of 50%, and a full position plus matching operation, you may win more than ten times in a row if you are lucky. It is also possible for wealth to change from quantitative to qualitative.&lt;br /&gt;&lt;br /&gt;However, you only need to make a mistake once, and then you will return to zero. Even if you just take a large position without matching, there is a risk that your account will return to zero, because you cannot guarantee that you will lose more than ten times in the next market. Even large position trading can turn a trading strategy that was expected to be positive into a strategy that is not equal to winning or losing.&lt;br /&gt;&lt;br /&gt;Short-term&lt;br /&gt;In the trading world, manual order speculation, intra-day short-term trading and quantitative high-frequency trading have always been very mysterious. I am not suspicious of those who watch the stopwatch to trade, but try to persuade you to give up short-term trading from another perspective.&lt;br /&gt;&lt;br /&gt;We can judge whether a method is feasible, not only by those who succeed in these methods, but also by those who fail in these methods. In other words, you can&amp;#39;t think that buying lottery tickets is a positive strategy just because some people win the lottery.&lt;br /&gt;&lt;br /&gt;In addition, look at the list of private placement products. How many of the top 100 in the list for more than three years are engaged in speculation or short-term trading? There is no doubt that the rate of short-term production is very low. Even if it is successful, this method of making money quickly is difficult to maintain for a long time. If you are not gifted, be careful to use this kind of unique skill. After all, Simmons has only one.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Reason 3: Prejudice&lt;/em&gt;&lt;br /&gt;If you can, it is recommended that you spend 100 minutes watching a movie - &amp;quot;Twelve Angry Men&amp;quot;. A film remade by four countries, the first edition in the United States in 1957, the Japanese version in 1991, the Russian version in 1997, and the Chinese version in 2014. Although this film does not teach you how to do trading, it does teach you how to look at things and learn to know yourself, which is very important.&lt;br /&gt;&lt;br /&gt;Because human experience is limited, so is human cognition. Everyone is more or less biased according to their own experience. In many cases, prejudice has become the habit of most people, and it is natural to judge many things with their own emotions.&lt;br /&gt;&lt;br /&gt;Back to the market, whether your judgment of the market is based on fundamental analysis or technical analysis, these are not really important. If your point of view is different from that of the majority of the market, the price is more biased towards the majority of the market, and the market will not operate according to your point of view.&lt;br /&gt;&lt;br /&gt;Therefore, in the transaction, we must keep in mind &amp;quot;judgment, but not rely on judgment&amp;quot;. Ultimately, we should be based on facts and prices. The only strength of price rise and fall is the expectation of most people for the future. Your judgment has no weight in the market. Don&amp;#39;t let your judgment form your own prejudice.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Reason 4: Pursuit of perfection.&lt;/em&gt;&lt;br /&gt;Market participants include elites from all walks of life, including physics, statistics, mathematics, astronomy, etc. Many people try to explain the market with their professional knowledge.&lt;br /&gt;&lt;br /&gt;But the main body of market participation is people, and people themselves have cognitive limitations, which means that the market itself is wrong and imperfect. So how can we use these &amp;quot;perfect&amp;quot; methods to explain the market? Isn&amp;#39;t that against the nature of the market?&lt;br /&gt;&lt;br /&gt;The above lists the reasons why the vast majority of people who came to the market ended in failure. In addition to the main reasons mentioned above, there are many factors that will not be listed here. In short, in addition to your confidence in winning, everything else is a stumbling block to your success.&lt;br /&gt;&lt;br /&gt;Those who make profits in the market because of good luck will eventually give it back to the market as time goes by. Therefore, the futures market is a negative sum game market. Only by changing your own way of thinking and establishing your own trading strategy, can you succeed.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What is the thinking mode of probability?&lt;/b&gt;&lt;br /&gt;Probabilistic thinking is a literary name. To put it more popular, it is gambling thinking. You heard me right. Trading is gambling. When you hear about gambling, you may think of &amp;quot;who gambles and loses his money or runs away in debt or splits his wife and children&amp;quot; and avoid it.&lt;br /&gt;&lt;br /&gt;There are also some red-eyed gamblers in society. But gambling ≠ gamblers. &amp;quot;Gambling&amp;quot; is probably one of the most misunderstood words. If your strategy is negative, you are a gambler; If your strategy is positive expectation, it is gambling.&lt;br /&gt;&lt;br /&gt;If we remove the derogatory meaning of &amp;quot;gambling&amp;quot; and understand it as an activity that takes certain risks and obtains certain rewards, then life is really &amp;quot;gambling&amp;quot; everywhere. Which major to choose in school, whether to buy a house, whether to start a project, whether to work or start a business, etc.&lt;br /&gt;&lt;br /&gt;Even saving money in a bank is also a gamble, because you are not sure whether inflation will occur in the future and whether the bank will go bankrupt (refer to the Greek debt crisis). In short, from cradle to grave, every process of life is gambling.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How to win gambling for a long time&lt;/b&gt;&lt;br /&gt;With the concept of gambling, we need to further solve it. How can we win at gambling for a long time? Before we study the strategy of &amp;quot;win at gambling for a long time&amp;quot;, let&amp;#39;s first study the principle of those strategies of &amp;quot;win at gambling for a long time&amp;quot;. In addition to the money printing machine, what else can we win at gambling for a long time?&lt;br /&gt;&lt;br /&gt;That&amp;#39;s what&amp;#39;s in the casino: baccarat, roulette, slot machine, blackjack, etc. No matter how you change the playing method, the casino will win in the end. In fact, there is a secret that casinos never say: the law of large numbers.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The principle of dice games&lt;/b&gt;&lt;br /&gt;Three dice, bet size, 4-10 is small, 11-17 is big, bet right and win money. And the dice has a kind of round dice, that is, the three dice have the same number of points, and the probability of the round dice is 2.8%. Then the probability of large and small occurrence is 48.6%, respectively. The casino is based on this 2.8% probability. If each gambler bet 100 yuan per game, the casino will win 280 yuan after playing 100 games.&lt;br /&gt;&lt;br /&gt;(0.486+0.028)100100-0.486100100=280&lt;br /&gt;&lt;br /&gt;However, this casino strategy is flawed. If a big player decides to bet tens of billions of dollars on a whim and wins again, the casino will go bankrupt. Therefore, the casino will set a betting limit. If the limit is exceeded, no more bets can be made. In this way, even if the gambler is lucky to win money for a while, in the long run, he will still lose to the probability. In the infinite number of dice games, the gambler will lose 2.8% of the money.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Law of large numbers&lt;/b&gt;&lt;br /&gt;The advantage of the casino owner is only 2% more than that of the gambler. In a single gambling game, the boss may lose money or even suffer continuous losses. However, the casino owner will not be frightened by the loss, because he knows that the &amp;quot;law of large numbers&amp;quot; plays a role in his ability to make money. As long as someone continues to gamble, only a 2% weak advantage is needed to make a long-term stable profit.&lt;br /&gt;&lt;br /&gt;So the casino is not afraid of you winning, but afraid of you not coming. Over the years, you have even heard of bank failures, but when did you hear of casino failures? In the long run, casinos will always be winners. That is to say, gambling for a long time will win.&lt;br /&gt;&lt;br /&gt;Similar examples of winning a long bet are: various lotteries. The lottery pool funds have accumulated more and more since the lottery was listed. Of course, the money comes from the vast number of lottery users. Do you know the probability of 5 million in a double-color ball? The answer is 1 in 17.7 million.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Change of probability&lt;/b&gt;&lt;br /&gt;Suppose there is a coin with the same weight as the front and back, and the probability of throwing the word (back) and the flower (front) is 50%, and each coin toss is independent of the previous result. If you flip the coin 10,000 times in succession, the probability of a flower side is about 50%.&lt;br /&gt;&lt;br /&gt;However, if you only throw 10 times, the probability of a flower side changes, which is not necessarily 50%. Therefore, the casino dealer must ensure that the positive expectation strategy is triggered enough times to be effective. This is also the reason why private equity institutions cannot stop the quantitative trading strategy unless they have special conditions.&lt;br /&gt;&lt;br /&gt;How to use the &amp;quot;law of large numbers&amp;quot; to create a winning strategy in the financial market will be the content of our next series of courses, so look forward to it!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;To sum up&lt;/b&gt;&lt;br /&gt;Above, we have explained to you how to use a scientific approach to deal with trading from the aspects of probability, the reason for trading failure, the correct way of thinking about trading, and the principle of winning at gambling for a long time. I believe that if you have learned something, the change of thinking will be the change of your behavior, and the change of behavior will be the change of your success.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;After-school exercises&lt;/b&gt;&lt;br /&gt;1. Why is trading a game of probability?&lt;br /&gt;2. What are the reasons for trading failure?&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y6_660CIwwU2zfe5yxRVaGDSReR6mrpzY2VTEbtsxgEcQl9VcnBpLmgurRowb5LTWeXtR0LUvdcDVM2r7sZ5Nt6vqEdqCy3CYjnweXMB7U73A" title="https://blog.mathquant.com/2023/02/10/5-6-build-probability-thinking-to-improve-your-trading-pattern.html"&gt;https://blog.mathquant.c...our-trading-pattern.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25699/</id>
    <title type="text">&amp;quot;Get the best deal&amp;quot; analysis of the vulnerability in the exchange</title>
    <published>2024-04-17T03:24:29Z</published>
    <updated>2024-04-17T03:24:29Z</updated>
    <author>
      <name>Trading</name>
      <uri>https://stocksharp.com/users/186421/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#cryptocurrency" />
    <category term="#strategy" />
    <category term="#market" />
    <category term="#analysis" />
    <category term="#exchange" />
    <category term="#profit" />
    <category term="#FMZQuant" />
    <category term="#blockchain" />
    <category term="#bug" />
    <content type="html">&lt;b&gt;NO.1 Preface&lt;/b&gt;&lt;br /&gt;In recent years, the digital currency industry based on blockchain technology and cryptography has witnessed explosive growth. As one of the most important links in the digital currency industry chain, the blockchain asset exchange undoubtedly has the priority position. It connects the secondary market of blockchain investment, as well as the project side and ordinary investors.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Background of blockchain asset trading market&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- Operating time of the exchange: the average operating time of the top big exchanges is less than 3 years&lt;br /&gt;- Exchange team: led by small entrepreneurial team&lt;br /&gt;- Number of global trading users: about 10 million to 20 million global trading users&lt;br /&gt;- Global daily transaction fee income: about $25 million&lt;br /&gt;- Growth of the number of global exchanges: from dozens to hundreds&lt;br /&gt;&lt;br /&gt;According to statistics, at present, more than 300 exchanges have been included by non-small platforms, and even thousands of those have not been included. Even so, entrants still enjoy it. Under the background that everyone is involved in the trading, almost every exchange has dozens or even hundreds of trading objects, so in the market with limited stock, small and medium-sized blockchain assets and exchanges will face the situation of lack of flow and a situation of no price and no market.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NO.2&lt;/b&gt;&lt;br /&gt;&lt;em&gt;Why market maker strategies are just what&amp;#39;s needed&lt;/em&gt;&lt;br /&gt;The emergence of market maker robots has changed this situation. By participating in market making, we can curb excessive speculation in the market due to the asymmetry of information and resources, and maintain the good operation of the trading platform. It also reduces the phenomenon that the so-called dealer secretly manipulates the price in the traditional trading mode to enhance the market attractiveness, improve liquidity and trading volume, meet the buying and selling needs of ordinary investors, and stabilize market confidence.&lt;br /&gt;&lt;br /&gt;Market maker&lt;br /&gt;Buying and selling at asking price&lt;br /&gt;■ Arbitrators&lt;br /&gt;■ Short-term bias&lt;br /&gt;■ Earning spreads&lt;br /&gt;&lt;br /&gt;Market taker &lt;br /&gt;Buyer or seller&lt;br /&gt;■ Traders&lt;br /&gt;■ Investors&lt;br /&gt;■ Producer/consumer&lt;br /&gt;■ Earning or hedging from price fluctuations&lt;br /&gt;&lt;br /&gt;Today, in order to make the new exchange and new currency better connect with ordinary investors and solve many problems faced by them at the initial stage of listing, both small and medium-sized exchanges and blockchain project parties have to rely on market robots.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NO.3&lt;/b&gt;&lt;br /&gt;&lt;em&gt;Principle of market maker strategy&lt;/em&gt;&lt;br /&gt;Market-making strategy tracks price changes through market making system, and provides two-way quotations for buying and selling constantly. Through a large number of high-frequency buying and selling transactions, accumulate the price difference between each transaction price and the theoretical price gradually, and adjust the price difference dynamically according to the characteristics of the position.&lt;br /&gt;&lt;br /&gt;There are two common market maker strategies in general exchanges:&lt;br /&gt;&lt;br /&gt;Passive market making: Market makers follow the in-depth data and transaction data of the mainstream exchanges through the strategy of tracking, instead of making a big active choice, but passively follow the market. They pursue the maximum degree of close tracking and complete replication, and try to achieve the same K-line data as the mainstream exchanges.&lt;br /&gt;&lt;br /&gt;Free market making: This market making mode does not refer to other trading targets, but makes the market according to its own cost and setting of order. This model is suitable for the environment where the pricing power of relevant currencies is relatively concentrated, such as small blockchain assets or currencies issued by the exchange itself.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NO.4&lt;/b&gt;&lt;br /&gt;&lt;em&gt;Market maker strategy vulnerability&lt;/em&gt;&lt;br /&gt;Whether it is a passive market making or a free market making, it is necessary to solve not only the price problem of the transaction object, but also the liquidity problem. Therefore, in order to activate the market, it is necessary for the marketers to buy and sell themselves, otherwise it is difficult to form a decent K-line.&lt;br /&gt;&lt;br /&gt;The common method is to sell at a random price near the market and immediately buy at the same price. Or buy before selling according to the random price. Generally, due to the short time interval between trading and buying, the corresponding listing can not be found in the depth data, but the transaction record can be left in the historical data. The K-line is drawn by this market making method.&lt;br /&gt;&lt;br /&gt;**Please pay attention! This is how the vulnerability appears.**&lt;br /&gt;&lt;br /&gt;In order to generate a continuous K-line, the market maker strategy has hidden the vulnerability in the self-buying and self-selling list near the opening of the market. Although the buying order and selling order of the strategy are issued at the same time, the network problem and the matching speed are not ideal, nor can they be ideal, which leads to a certain probability that the order of the marketing strategy will be closed by others.&lt;br /&gt;&lt;br /&gt;Imagine that if there is another high-frequency order strategy in the market, it always deals with the selling orders of the market strategy at a lower price, and deals with the purchase orders of the market strategy at a higher price. As long as the price difference obtained by this high-frequency order strategy can cover the handling charges, it will generate profits. This leads to the strategy of selling low and buying high in the market, think carefully!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NO.5&lt;/b&gt;&lt;br /&gt;&lt;em&gt;Practical demonstration&lt;/em&gt;&lt;br /&gt;After observation, there is a market making phenomenon in **the ETHUSDT trading pair of a certain exchange**, and the reference object may be the ETHUSDT data of Binance. By observing the data of its market order book, it is found that there is a self-closing order, and the trading direction is random. The chart below shows the K-line generated by the market making strategy on that day.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150331
" title="https://stocksharp.com/file/150331
"&gt;https://stocksharp.com/file/150331
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Usually, the high-frequency order strategy is not randomly priced at the opening of the market, but randomly changes with reference to the last transaction price of the market strategy. In fact, it is difficult for the transaction price to reach the low and high market prices, and the success rate of obtaining market making strategy orders is limited, so there is almost no profit.&lt;br /&gt;&lt;br /&gt;They even have to bear the risk of unilateral positions. This seems to be impeccable, but if we take advantage of the bug that market making orders must be placed in the market, we can easily crack the market strategy of the exchange and make great profits.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NO.6&lt;/b&gt;&lt;br /&gt;&lt;b&gt;The specific steps are as follows:&lt;/b&gt;&lt;br /&gt;When expecting a low price deal, add a certain price to the buy one price to pend a selling order. When the buy price is 200, pend a selling order of 200.1, then keep pending a buying order of 200.09, and withdraw immediately. When the transaction is completed, reverse the operation immediately and sell the traded currency at a high price, thus completing a loop.&lt;br /&gt;&lt;br /&gt;Although such a success rate is not very high, through a large number of frequent pending order and cancellation transactions, this opportunity will be greatly increased and the profit will still be considerable.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150330
" title="https://stocksharp.com/file/150330
"&gt;https://stocksharp.com/file/150330
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As shown in the chart above, **a high-frequency order strategy was written through the FMZ Quant Trading Platform (FMZ) and run in the real market with almost no withdraw**. In only one night, the profit of 1,000USDT was transferred to 4,000USDT.&lt;br /&gt;&lt;br /&gt;This is a gentle order. If you use multiple accounts, multiple contracts, and multiple threads, you will increase profits. After the high-frequency order strategy takes advantage of this vulnerability, it steals a huge amount of money and leaves behind a dreadful of the K-line, as shown in the following chart:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150332
" title="https://stocksharp.com/file/150332
"&gt;https://stocksharp.com/file/150332
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NO.7&lt;/b&gt;&lt;br /&gt;The source code of the order strategy based on the vulnerability of the exchange market&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150333
" title="https://stocksharp.com/file/150333
"&gt;https://stocksharp.com/file/150333
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The above strategy source code is based on the FMZ Quant Trading Platform (www.fmz.cn)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NO.8&lt;/b&gt;&lt;br /&gt;&lt;em&gt;Prevention methods&lt;/em&gt;&lt;br /&gt;For this market making strategy, it is easy to solve the problem after knowing the principle. For example, when the transaction price of the market making strategy is at a low level, only the buy order is placed first and then the sell order, and vice versa, so that others will not buy it at a low price and sell it at a high price. Or put all transactions and pending orders in the scope that can be hedged in other exchanges.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Words to follow&lt;/b&gt;&lt;br /&gt;**Although the exchange is at the top of the entire blockchain industry**, it is like a giant outside, revealing more attack areas and exploitable vulnerabilities.&lt;br /&gt;&lt;br /&gt;Objectively speaking, the irrationality that can be deduced from the order book may have more hidden bugs. For example, by taking advantage of the obvious vulnerabilities in the strategies of exchange market makers, attackers can skillfully design various covert attack strategies, and they can also do it unknowingly.&lt;br /&gt;&lt;br /&gt;**Today, digital currency has become a new target for investment, and exchanges have become an arena for many hackers**. The hackers hiding in the dark are like hungry wolves, waiting for the opportunity to move, staring at the flaws of the exchange, and preparing for a fatal attack. The blockchain centralized exchange can only strengthen its own defense deployment, so that customers can have worry-free transactions.&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y65ZXs8chpdiMjV875_7hv8jqDmL5u993bwm5PXXFDvfWpvZ2kEgDkkmuSM5u9POOmheVbsBFFf0gtVOD3LzwoCZPag9xRnJkxk7vtfH6Nr9q" title="https://blog.mathquant.com/2023/02/10/get-the-best-deal-analysis-of-the-vulnerability-in-the-exchange.html"&gt;https://blog.mathquant.c...ity-in-the-exchange.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25698/</id>
    <title type="text">Can we make quantitative trading without code? Let&amp;apos;s find out...</title>
    <published>2024-04-17T02:14:57Z</published>
    <updated>2024-04-17T02:14:57Z</updated>
    <author>
      <name>Trading</name>
      <uri>https://stocksharp.com/users/186421/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#cryptocurrency" />
    <category term="#strategy" />
    <category term="#code" />
    <category term="#market" />
    <category term="#platform" />
    <category term="#FMZQuant" />
    <category term="#programming" />
    <category term="#blockly" />
    <category term="#visualization" />
    <content type="html">&lt;b&gt;NO.1&lt;/b&gt;&lt;br /&gt;On Wall Street, quantitative trading has become the leading role of market trading. Many of the world&amp;#39;s top investment banks have banned manual directional speculative trading. The development of quantitative trading in China is also very rapid. Institutions are using it, and future tycoons are also using it. There are more and more people participating in quantitative trading.&lt;br /&gt;&lt;br /&gt;But there are also many manual traders who are interested in quantitative trading. At the beginning, they were full of confidence. After reading the long and complex code, they often hesitated or stopped. In order to popularize the public, reduce the threshold of quantitative trading programming, and improve the efficiency of writing greatly, FMZ has developed a visual quantitative trading platform.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NO.2&lt;/b&gt;&lt;br /&gt;In traditional programming, you should be familiar with the basic grammar, data operation, data structure, logic control... of programming language. Let&amp;#39;s write a program that outputs &amp;quot;hello, world&amp;quot; in Java to experience traditional programming, as follows:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150316
" title="https://stocksharp.com/file/150316
"&gt;https://stocksharp.com/file/150316
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It took 5 lines of code just to output a string program. I believe that most beginners only know the &amp;quot;hello, world&amp;quot; in parentheses, and nothing else. Therefore, it is a better choice to start with visual programming.&lt;br /&gt;&lt;br /&gt;Visual programming has a long history and is not new. The &amp;quot;what you see is what you get&amp;quot; programming idea, carrying various control modules, can build code logic and complete trading strategy design just by dragging, and the process is very like building blocks.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150317
" title="https://stocksharp.com/file/150317
"&gt;https://stocksharp.com/file/150317
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As shown in the chart above, the same program needs only one line of code in blockly visual programming, which reduces the programming threshold greatly, especially for those traders who do not understand programming at all. This is a very good operating experience. The FMZ Quant visual programming is also realized through the blocky visualization tool released by Google. In design, it is the same as the Scratch launched by Massachusetts Institute of Technology, so there is really - no barrier.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150319
" title="https://stocksharp.com/file/150319
"&gt;https://stocksharp.com/file/150319
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The FMZ Quant visual programming, with hundreds of commonly used trading modules built in, will have more trading modules added in the future to support traders&amp;#39; new ideas and new applications, which will be jointly developed and maintained by developers. Although the grammar is simple, it does have performance. It can almost meet most quantitative trading strategies. In terms of function and speed, it is not inferior to conventional programming languages such as Python and JavaScript. In the future, financial applications with complex logic will be supported.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NO.3&lt;/b&gt;&lt;br /&gt;**How to use**&lt;br /&gt;&lt;br /&gt;**Step 1**: Register and sign in the FMZ Quant (**FMZ**) website at: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAC8JkNV3nsAiF_sZq5srY9__oQAbvK03HYua0an4O9H4w" title="http://www.fmz.com"&gt;www.fmz.com&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150315
" title="https://stocksharp.com/file/150315
"&gt;https://stocksharp.com/file/150315
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;**Step 2**: Go to Dashboard&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150318
" title="https://stocksharp.com/file/150318
"&gt;https://stocksharp.com/file/150318
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;**Step 3**: Click add strategy&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150320
" title="https://stocksharp.com/file/150320
"&gt;https://stocksharp.com/file/150320
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;**Step 4**: Select Blockly and Template Include&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150321
" title="https://stocksharp.com/file/150321
"&gt;https://stocksharp.com/file/150321
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;**Finally**, we are in the visual programming interface, as follows:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150319
" title="https://stocksharp.com/file/150319
"&gt;https://stocksharp.com/file/150319
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NO.4&lt;/b&gt;&lt;br /&gt;Try to write a program that outputs &amp;quot;hello, world&amp;quot; using the FMZ Quant blockly editor&lt;br /&gt;&lt;br /&gt;**Step 1: Select Log module**&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150323
" title="https://stocksharp.com/file/150323
"&gt;https://stocksharp.com/file/150323
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;**Step 2: Select Text module**&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150326
" title="https://stocksharp.com/file/150326
"&gt;https://stocksharp.com/file/150326
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;**Step 3: Backtest settings**&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150324
" title="https://stocksharp.com/file/150324
"&gt;https://stocksharp.com/file/150324
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;**Step 4: Backtest result**&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150325
" title="https://stocksharp.com/file/150325
"&gt;https://stocksharp.com/file/150325
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NO.5&lt;/b&gt;&lt;br /&gt;**A complete dynamic balancing strategy for digital currencies**&lt;br /&gt;&lt;br /&gt;**Strategy logic**&lt;br /&gt;&lt;br /&gt;- Condition for buying: If the market value of the current position minus the current available balance is less than 5% of the negative current available balance, open a position to buy.&lt;br /&gt;&lt;br /&gt;- Condition for selling: If the market value of the current position minus the current available balance is more than 5% of the negative current available balance, close a position to sell.&lt;br /&gt;&lt;br /&gt;**Prerequisites and requirements**&lt;br /&gt;&lt;br /&gt;- Current market&lt;br /&gt;&lt;br /&gt;- Current assets&lt;br /&gt;&lt;br /&gt;- Total market value of currency&lt;br /&gt;&lt;br /&gt;- Asset difference&lt;br /&gt;&lt;br /&gt;**Blockly strategy-writing Step 1**&lt;br /&gt;&lt;br /&gt;We calculate the four prerequisites and prerequisites of the trading strategy and assign values to each variable. With visual programming, the code block is like this, as shown below:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150322
" title="https://stocksharp.com/file/150322
"&gt;https://stocksharp.com/file/150322
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It should be noted that the total market value of the currency is the total market value of the current currency holdings. The calculation method is to multiply the current total currency holdings by the current latest price. The asset difference is the total market value of the currency minus the current available balance.&lt;br /&gt;&lt;br /&gt;**Blockly strategy-writing Step 2**&lt;br /&gt;&lt;br /&gt;After the assignment of prerequisites and prerequisites is completed, the trading logic needs to be written. This is not as complicated as expected. It is nothing more than to express the above strategy logic in the form of code blocks. That is, if the asset difference is less than 5% of the negative available balance, buy it, and if the asset difference is greater than 5% of the available balance, sell it. As shown below:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150328
" title="https://stocksharp.com/file/150328
"&gt;https://stocksharp.com/file/150328
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The whole strategy seems to have finished, but you should know that the program is executed from top to bottom, and then it stops. However, our trading strategy is not to execute the trading conditions once, but to execute them in a loop repeatedly. In other words, the program needs to check whether the strategic conditions have been reached constantly. If so, it will execute the trading, otherwise it will continue to check. At this time, another loop statement is needed, as shown in the following figure:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150327
" title="https://stocksharp.com/file/150327
"&gt;https://stocksharp.com/file/150327
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There is no essential difference between the visualization strategy and the strategy written in other programming languages. It also supports the historical data test with multiple periods and accuracies. Of course, it also supports the real market trading of domestic and foreign commodity futures and digital currency. The following is the backtest information of the strategy:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150329
" title="https://stocksharp.com/file/150329
"&gt;https://stocksharp.com/file/150329
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So far, a complete trading strategy has finished. In order to take care of the lazy guys, this strategy has been shared in the strategy square and it can be copied for study directly.&lt;br /&gt;&lt;br /&gt;Strategy link address:&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAADHZKb-RfbDOdB_w3dJgQKtn2auqCf9hSdLnVG5SPqdEmJs4KZ5n5eXcXZ3hXdDpoo" title="https://www.fmz.com/strategy/121404
"&gt;https://www.fmz.com/strategy/121404
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NO.6&lt;/b&gt;&lt;br /&gt;The law of ten thousand hours always exists, but for traders with zero basis, it is impossible to spend ten thousand hours practicing again. So you must have a ladder, and for traders with zero programming foundation, the FMZ Quant visual programming is a ladder to get started quickly.&lt;br /&gt;&lt;br /&gt;With visual programming, you don&amp;#39;t need to remember the grammar and method name, just simply browse the function module to find what you want. The original intention of the FMZ Quant is also to help more quantitative beginners reduce the entry threshold and increase their interest in quantification. Everyone can become a quantitative trader!&lt;br /&gt;&lt;br /&gt;However, in other words, visual programming is no problem as a step to quantitative entry, but it also has its own limitations, such as the inability to develop overly complex and sophisticated trading strategies. But this does not affect you to take the first step of quantitative trading!&lt;br /&gt;&lt;br /&gt;Finally, I wish all friends who want to do quantitative trading, regardless of whether they are based on zero, can achieve their learning goals through action. Thank you for reading!&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y6-UQKeUqBZ6P43vdcFhaevU5uV-oEl2B1y5V0JfTQq_hVFc8rOCbAj2HCJD6ScZOhW6-_rWIrVvyj3U08hU_b7PU-8kYR-iuBaO3XwWZdD2V" title="https://blog.mathquant.com/2023/02/13/can-we-make-quantitative-trading-without-code-lets-find-out.html"&gt;https://blog.mathquant.c...-code-lets-find-out.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25697/</id>
    <title type="text">Concurrent Strategy Execution with JavaScript Multithreading Support</title>
    <published>2024-04-17T01:07:43Z</published>
    <updated>2024-04-17T01:07:43Z</updated>
    <author>
      <name>Trading</name>
      <uri>https://stocksharp.com/users/186421/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#strategy" />
    <category term="#code" />
    <category term="#exchange" />
    <category term="#javascript" />
    <category term="#FMZQuant" />
    <category term="#function" />
    <category term="#thread" />
    <category term="#system" />
    <category term="#loop" />
    <content type="html">When developing strategies on FMZ using the JavaScript language, since the strategy architecture is polled. If there is a concurrent design scenario, the ```exchange.Go``` function is used to make concurrent calls to some interfaces, so as to meet the requirements of some concurrent scenarios. But if you want to create a single thread to perform a series of operations, it is impossible. For example, like the Python language, use the ```threading``` library to do some concurrent design.&lt;br /&gt;&lt;br /&gt;Based on this requirement, the FMZ platform has upgraded the bottom layer of the system. True multithreading support has also been added to the JavaScript language. Detailed features include:&lt;br /&gt;&lt;br /&gt;- Create threads to execute custom functions concurrently.&lt;br /&gt;- Inter-thread communication.&lt;br /&gt;- Variables stored between shared threads.&lt;br /&gt;- Wait for the thread to finish executing to reclaim resources and return the execution result.&lt;br /&gt;- Forcibly end the thread and reclaim resources.&lt;br /&gt;- Get the current thread ID in the concurrent thread execution function.&lt;br /&gt;&lt;br /&gt;Next, I will take you to understand each function one by one.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Create threads to execute custom functions concurrently&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;The ```__Thread``` function can create a thread and execute a function concurrently. For example, you need to create a concurrent function ```func1```, what does the ```func1``` function do? We can let it accumulate from 0 to 9. In order to see the gradual accumulation process, we use the for loop in the func1 function to pause each time (the Sleep function is used to sleep for a certain number of milliseconds) for a certain period of time.&lt;br /&gt;```&lt;br /&gt;function func1(sleepMilliseconds) {&lt;br /&gt;    var sum = 0 &lt;br /&gt;    for (var i = 0 ; i &amp;lt; 10 ; i++) {&lt;br /&gt;        sum += i &lt;br /&gt;        Sleep(sleepMilliseconds)&lt;br /&gt;        Log(&amp;quot;sum:&amp;quot;, sum)&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    return sum&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function main() {&lt;br /&gt;    // Use the __Thread function to create a thread concurrently, and the parameter 200 is the parameter of the func1 function,&lt;br /&gt;    // If the func1 function has multiple parameters, here we pass the corresponding parameters.&lt;br /&gt;    var thread1Id = __Thread(func1, 200)&lt;br /&gt;    &lt;br /&gt;    // Here we need to wait for the execution result of the thread whose thread Id is thread1Id, otherwise all threads will be released directly after the main function is executed.&lt;br /&gt;    var ret = __threadJoin(thread1Id)&lt;br /&gt;    Log(&amp;quot;ret:&amp;quot;, ret)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;In practical applications, we can make http requests concurrently like this:&lt;br /&gt;```&lt;br /&gt;function main() {&lt;br /&gt;    let threads = [&lt;br /&gt;        &amp;quot;https://www.baidu.com&amp;quot;,&lt;br /&gt;        &amp;quot;https://www.163.com&amp;quot;&lt;br /&gt;    ].map(function(url) {&lt;br /&gt;        return __Thread(function(url) {&lt;br /&gt;            Log(&amp;quot;GET&amp;quot;, url)&lt;br /&gt;            return HttpQuery(url)&lt;br /&gt;        }, url)&lt;br /&gt;    })&lt;br /&gt;    threads.forEach(function(tid) {&lt;br /&gt;        Log(__threadJoin(tid))&lt;br /&gt;    })&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Wait for the end of thread execution to reclaim resources and return the execution result&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;In the above example, we used the ```__threadJoin``` function in the main function finally to wait for the concurrent threads to finish executing. The variable ```ret``` receives the return value of the ```__threadJoin``` function, and we print the return value, we can observe the specific results of the concurrent thread execution.&lt;br /&gt;```&lt;br /&gt;// id: thread ID, terminated: whether it was forced to stop, elapsed: time-consuming (nanoseconds), ret: the return value of the thread execution function&lt;br /&gt;ret: {&amp;quot;id&amp;quot;:1,&amp;quot;terminated&amp;quot;:false,&amp;quot;elapsed&amp;quot;:2004884301,&amp;quot;ret&amp;quot;:45}&lt;br /&gt;```&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;End the thread forcibly and reclaim resources&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;```&lt;br /&gt;function func1(sleepMilliseconds) {&lt;br /&gt;    var sum = 0 &lt;br /&gt;    for (var i = 0 ; i &amp;lt; 10 ; i++) {&lt;br /&gt;        sum += i &lt;br /&gt;        Sleep(sleepMilliseconds)&lt;br /&gt;        Log(&amp;quot;sum:&amp;quot;, sum)&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    return sum&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function main() {&lt;br /&gt;    var thread1Id = __Thread(func1, 200)&lt;br /&gt;    Sleep(1000)&lt;br /&gt;    retThreadTerminate = __threadTerminate(thread1Id)&lt;br /&gt;    Log(retThreadTerminate)   // true&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;We still use the example just now, after creating a thread, you can forcibly terminate the execution of the thread after waiting for 1 second.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Inter-thread communication&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Inter-thread communication mainly uses the ```__threadPostMessage``` function and the ```__threadPeekMessage``` function. Let&amp;#39;s look at the following simple example:&lt;br /&gt;```&lt;br /&gt;function func1() {&lt;br /&gt;    var id = __threadId()&lt;br /&gt;    while (true) {&lt;br /&gt;        var postMsg = &amp;quot;Message from thread function func1&amp;quot; with &amp;quot;from id:&amp;quot; + id + &lt;br /&gt;        __threadPostMessage(0, postMsg)              // Send a message to the main thread&lt;br /&gt;        var peekMsg = __threadPeekMessage()         // Receive messages from other threads&lt;br /&gt;        Log(peekMsg)&lt;br /&gt;        Sleep(5000)&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function main() {&lt;br /&gt;    var threadId = __Thread(func1)&lt;br /&gt;    &lt;br /&gt;    while (true) {&lt;br /&gt;        var postMsg = &amp;quot;Messages from the main function of the main thread&amp;quot;&lt;br /&gt;        __threadPostMessage(threadId, postMsg)&lt;br /&gt;        var peekMsg = __threadPeekMessage(threadId)&lt;br /&gt;        Log(peekMsg, &amp;quot;#FF0000&amp;quot;)                     // #FF0000 , Set the log to red for distinction&lt;br /&gt;        Sleep(5000)&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;The ```__threadPostMessage``` function is used to send a message to a thread. The first parameter is the ID of the specific thread to send to, and the second parameter is the message to be sent, which can be a string, a value, an array, or a JSON object and so on. Messages can be sent to the main thread in concurrent thread functions, and the ID of the main thread is defined as 0.&lt;br /&gt;&lt;br /&gt;The ```__threadPeekMessage``` function is used to monitor the message sent by a certain thread. It can set the timeout time (in milliseconds), or it can be set to 0, which means blocking, and it will not return until there is a message.&lt;br /&gt;&lt;br /&gt;Of course, except for concurrent threads communicating with the main thread. Concurrent threads can also communicate with each other directly.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Get the current thread ID in the concurrent thread execution function&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;In the above example, the function ```var id = __threadId()，__threadId()``` is used to get the ID of the current thread.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:140%"&gt;&lt;b&gt;Variables stored between shared threads&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;In addition to communication between threads, shared variables can also be used for interaction.&lt;br /&gt;```&lt;br /&gt;function testFunc() {&lt;br /&gt;    __threadSetData(0, &amp;quot;testFunc&amp;quot;, 100)   // Stored in the current thread environment, key-value pair testFunc : 100&lt;br /&gt;    Log(&amp;quot;testFunc execution completed&amp;quot;)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function main() {&lt;br /&gt;    // threadId is 1, the created thread with threadId 1 will be executed first, as long as the thread resources are not reclaimed, the variables stored locally in the thread will be valid&lt;br /&gt;    var testThread = __Thread(testFunc)&lt;br /&gt;    &lt;br /&gt;    Sleep(1000)&lt;br /&gt;&lt;br /&gt;    // export in main, get testFunc: 100&lt;br /&gt;    Log(&amp;quot;in main, get testFunc:&amp;quot;, __threadGetData(testThread, &amp;quot;testFunc&amp;quot;))   // Take out the value whose key name is testFunc&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;The above is a simple demonstration of all functions.&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y68da49bEAcF-zo9hFF6lkEJWdhFjJ4ccYcKl7IRkuOTs7C11E9GF8lT0470P8OtPdUL50g58AtwBpbuqpdtScjTEjOoX48E9Ar9S42SzA_feWM53nCw3Y7DAaH1z7JIDPUs_9FITfSaKbJPjK4jQxlE9yZdrpaK-hoLRg4N0I2xng9_9hdNqJg78qN60xQKmTRujvqLSzdfnG6IEENwJVQ0" title="https://blog.mathquant.com/2023/03/07/let-the-strategy-program-be-executed-concurrently-and-add-multi-thread-support-at-the-bottom-of-the-system-to-the-javascript-strategy.html"&gt;https://blog.mathquant.c...javascript-strategy.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25695/</id>
    <title type="text">How to Solve the World Pi Day OKX Private Key Puzzle Award (with complete code)</title>
    <published>2024-04-16T09:22:15Z</published>
    <updated>2024-04-16T09:22:15Z</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="#OKX" />
    <category term="#python" />
    <category term="#FMZQuant" />
    <category term="#address" />
    <category term="#wallet" />
    <category term="#debug" />
    <category term="#programmer" />
    <content type="html">I saw some Tycoons in the group saying that OKX was holding a World Pi Day Mystery Event, with the theme of &amp;quot;Exploration, Never Ending&amp;quot;.&lt;br /&gt;&lt;br /&gt;As a veteran programmer, when I saw the news, I smiled and opened my MacBook Pro, and without further ado, let&amp;#39;s get started!&lt;br /&gt;&lt;br /&gt;&amp;gt; Analysis&lt;br /&gt;&lt;br /&gt;Officially, there are 61 bits of key in the picture and the part of the circumference overlap, as we all know, the length of private key is 32 byte, converted to hex is 64 bits plus 0x prefix, a total of 66 bits, there are already 61 bits, for the first look, the &amp;quot;0X&amp;quot; at the first line in the chart is obviously not Pi, it is the start of the private key prefix, then there are about 5 bits (0123456789ABCDEF). The characters are arranged randomly, so there&amp;#39;s nothing wrong with running them directly, so let&amp;#39;s get started~&lt;br /&gt;&lt;br /&gt;Let&amp;#39;s use a Mac tool to sharpen the color simply:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150303
" title="https://stocksharp.com/file/150303
"&gt;https://stocksharp.com/file/150303
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In this way, the Mac can recognize the characters on the picture automatically. Let&amp;#39;s copy them directly:&lt;br /&gt;```&lt;br /&gt;3.141592653589793230X1D64338&lt;br /&gt;А694502884197169399375105820&lt;br /&gt;974925E123078164062862089986&lt;br /&gt;28033DB034211706409914808651&lt;br /&gt;32823066470ED424609550582231&lt;br /&gt;8B3&lt;br /&gt;81284&lt;br /&gt;• Exploration, &lt;br /&gt;038&lt;br /&gt;Never Ending&lt;br /&gt;027&lt;br /&gt;493&lt;br /&gt;05%&lt;br /&gt;0128&lt;br /&gt;4756482337867831731712019091&lt;br /&gt;47D9E56692346034861045432664&lt;br /&gt;8213393607743749141273724587&lt;br /&gt;006606315588174881BEEA209628&lt;br /&gt;2925409192744436789259036001&lt;br /&gt;```&lt;br /&gt;It cannot be used directly. Let&amp;#39;s correct it manually. The unconfirmed ones covered by the picture are marked with *. Not sure. Let&amp;#39;s talk about it later.&lt;br /&gt;The others blocked by the figure can be judged by observing the stroke shape of other fonts. At this time, we use Python to calculate the difference between the two, and use &amp;#39;_&amp;#39; for the same ones and only showing the different ones.&lt;br /&gt;```&lt;br /&gt;img = &amp;#39;&amp;#39;&amp;#39;&lt;br /&gt;3.141592653589793230X1D64338&lt;br /&gt;A694502884197169399375105820&lt;br /&gt;974925E123078164062862089986&lt;br /&gt;28033DB034211706409914808651&lt;br /&gt;32823066470ED424609550582231&lt;br /&gt;8B32594081284811174502841027&lt;br /&gt;0193**2*D2299964462294895493&lt;br /&gt;0381960EFC8103F9365933446128&lt;br /&gt;4756482337867831731712019091&lt;br /&gt;47D9E56692346034861045432664&lt;br /&gt;82133936077A3749141273724587&lt;br /&gt;006606315588174881BEEA209628&lt;br /&gt;2925409192744436789259036001&lt;br /&gt;&amp;#39;&amp;#39;&amp;#39;&lt;br /&gt;# True Pi&lt;br /&gt;real=&amp;#39;&amp;#39;&amp;#39;&lt;br /&gt;3.14159265358979323846264338&lt;br /&gt;3279502884197169399375105820&lt;br /&gt;9749445923078164062862089986&lt;br /&gt;2803482534211706798214808651&lt;br /&gt;3282306647093844609550582231&lt;br /&gt;7253594081284811174502841027&lt;br /&gt;0193852110555964462294895493&lt;br /&gt;0381964428810975665933446128&lt;br /&gt;4756482337867831652712019091&lt;br /&gt;4564856692346034861045432664&lt;br /&gt;8213393607260249141273724587&lt;br /&gt;0066063155881748815209209628&lt;br /&gt;2925409171536436789259036001&lt;br /&gt;&amp;#39;&amp;#39;&amp;#39;&lt;br /&gt;&lt;br /&gt;items = img.strip().split(&amp;#39;\n&amp;#39;)&lt;br /&gt;diffStr = &amp;#39;&amp;#39;&lt;br /&gt;for pos, line in enumerate(real.strip().split(&amp;#39;\n&amp;#39;)):&lt;br /&gt;    for i, c in enumerate(line):&lt;br /&gt;        imgLine = list(items[pos])&lt;br /&gt;        if line[i] == imgLine[i]:&lt;br /&gt;            imgLine[i] = &amp;#39;_&amp;#39;&lt;br /&gt;        else:&lt;br /&gt;            diffStr += imgLine[i]&lt;br /&gt;        items[pos] = &amp;#39;&amp;#39;.join(imgLine)&lt;br /&gt;print(&amp;#39;\n&amp;#39;.join(items))&lt;br /&gt;print(diffStr, &amp;#39;Len:&amp;#39;, len(diffStr))&lt;br /&gt;```&lt;br /&gt;The implementation results are as follows:&lt;br /&gt;```&lt;br /&gt;___________________0X1D_____&lt;br /&gt;A694________________________&lt;br /&gt;____25E1____________________&lt;br /&gt;____3DB0________4099________&lt;br /&gt;___________ED42_____________&lt;br /&gt;8B32________________________&lt;br /&gt;____**_*D2299_______________&lt;br /&gt;______0EFC___3F93___________&lt;br /&gt;________________731_________&lt;br /&gt;_7D9E_______________________&lt;br /&gt;__________7A37______________&lt;br /&gt;__________________BEEA______&lt;br /&gt;________92744_______________&lt;br /&gt;0X1DA69425E13DB04099ED428B32***D22990EFC3F937317D9E7A37BEEA92744 Len: 64&lt;br /&gt;```&lt;br /&gt;There are three more, and there are just three uncertain ones. Try to remove them, because the other 61 bits are all right after exclusion, leaving only the most definite difference. Finally, the prefix is as follows:&lt;br /&gt;```&lt;br /&gt;0X1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744&lt;br /&gt;```&lt;br /&gt;Next, we shall use Python and use force to crawl the balance on the OK chain. We can compare which private key has the balance. In fact, we can also select the public key with 314 USDT transfer first, which is faster. Seeing information on the official website said that we can check the balance directly if there is gas, the code is a little messy.&lt;br /&gt;```&lt;br /&gt;import sys&lt;br /&gt;import web3,time,logging&lt;br /&gt;from eth_account import Account&lt;br /&gt;from web3 import Web3&lt;br /&gt;logging.basicConfig(level=logging.INFO, format=&amp;#39;%(asctime)s %(message)s&amp;#39;)&lt;br /&gt;w3 = Web3(Web3.HTTPProvider(&amp;quot;https://exchainrpc.okex.org&amp;quot;))&lt;br /&gt;logging.info(w3.clientVersion)&lt;br /&gt;found = None&lt;br /&gt;&lt;br /&gt;def get_balance_gas(key):&lt;br /&gt;    global found&lt;br /&gt;    _counter += 1&lt;br /&gt;    address = Account.from_key(key).address&lt;br /&gt;    logging.info(&amp;#39;fetch address %s %s&amp;#39; % (found, address))&lt;br /&gt;    while True:&lt;br /&gt;        try:&lt;br /&gt;            balance = w3.eth.get_balance(address)&lt;br /&gt;            break&lt;br /&gt;        except:&lt;br /&gt;            logging.warning(traceback.format_exc())&lt;br /&gt;            time.sleep(1)&lt;br /&gt;            continue&lt;br /&gt;    if balance != 0:&lt;br /&gt;        found = key&lt;br /&gt;        raise BaseException(&amp;#39;Found balance: %s %s&amp;#39; % (address, balance))&lt;br /&gt;    return balance&lt;br /&gt;&lt;br /&gt;from concurrent.futures import ThreadPoolExecutor&lt;br /&gt;executor = ThreadPoolExecutor(max_workers=50)&lt;br /&gt;keys = []&lt;br /&gt;prefix = &amp;#39;1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744&amp;#39;&lt;br /&gt;# It doesn&amp;#39;t matter how to optimize the algorithm. Run the secret key against the clock.&lt;br /&gt;ch = &amp;#39;0123456789ABCDEF&amp;#39;&lt;br /&gt;for a in range(0, 16):&lt;br /&gt;    for b in range(0, 16):&lt;br /&gt;        for c in range(0, 16):&lt;br /&gt;            for d in range(0, 16):&lt;br /&gt;                for e in range(0, 16):&lt;br /&gt;                    keys.append(&amp;quot;0x&amp;quot;+prefix+ch[a]+ch[b]+ch[c]+ch[d]+ch[e])&lt;br /&gt;print(&amp;#39;all keys:&amp;#39;, len(keys))&lt;br /&gt;tasks = [None for t in keys]&lt;br /&gt;for idx, key in enumerate(keys):&lt;br /&gt;    tasks[idx] = executor.submit(get_balance_gas, key)&lt;br /&gt;for t in tasks:&lt;br /&gt;    t.result()&lt;br /&gt;    &lt;br /&gt;```&lt;br /&gt;We can see that it takes 1048576 iterations, but it&amp;#39;s much faster with multi-threading, running it on one of my servers.&lt;br /&gt;```&lt;br /&gt;2023-03-15 00:20:19,491 exchain-v1.6.8.5&lt;br /&gt;all keys: 1048576&lt;br /&gt;2023-03-15 00:20:20,372 fetch address None 0xc20C41f06F2428a0FD84ef03Ec6960992F5f8016&lt;br /&gt;2023-03-15 00:20:20,473 fetch address None 0xcFa87ee54bc1c14c09a3AB3f41640bBab5C5480a&lt;br /&gt;2023-03-15 00:20:20,483 fetch address None 0x126E922652f8B276F231D0eCA94d98685a26a45D&lt;br /&gt;The following is omitted...&lt;br /&gt;```&lt;br /&gt;Anxious waiting~~~, bad news came, and there was no result before the strategy exited. All of them were displayed as None.&lt;br /&gt;&lt;br /&gt;&amp;gt; The path winds along mountain ridges&lt;br /&gt;&lt;br /&gt;I don&amp;#39;t think so, I can&amp;#39;t figure it out, I started to look at the discussion on twitter, and I found that everyone and I arrived at the same steps, but the strange thing is that no one has said that the decryption is successful, and the official has not announced the correct first 61 bits, then a strange reply caught my attention, because there is a difference ```D2299``` in the middle, I am very sure, but he looks terribly confident.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150300
" title="https://stocksharp.com/file/150300
"&gt;https://stocksharp.com/file/150300
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;However, he posted a 61-bit D2290. He also said that he had been checked carefully. It doesn&amp;#39;t matter. Take a chance. Anyway, it&amp;#39;s a waste of electricity.&lt;br /&gt;With the attitude of trying, I found a few other people who said that they had found 61-bit. They were all very confident.&lt;br /&gt;The prefixes found in the comments section are collected, with the code just traversed, the basic code has not changed, and it will not be pasted repeatedly.&lt;br /&gt;```&lt;br /&gt;prefixs =[&lt;br /&gt;&amp;#39;1DA69425E13DB04099ED428B3202290EFC3F9317317D9E7A37BEEA92744&amp;#39;,&lt;br /&gt;&amp;#39;1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744&amp;#39;,&lt;br /&gt;&amp;#39;1DA69425E13DB04099ED428B320D2290EFC3F937317D9E7A37BEEA92744&amp;#39;,&lt;br /&gt;&amp;#39;1DA694255E3DB040990ED428B3208890EFC3F937317D9E7A37BEEA92744&amp;#39;,&lt;br /&gt;&amp;#39;1DA69425E13DB04099ED428B3202299EFC3F9317317D9E7A37BEEA92744&amp;#39;,&lt;br /&gt;&amp;#39;1DA69425E13DB01099ED428B3202290EFC3F9317317D9E7A37BEEA92744&amp;#39;,&lt;br /&gt;&amp;#39;1DA69425E13DB04099ED428B32D2290EFC3F9317317D9E7A37BEEA92744&amp;#39;,&lt;br /&gt;&amp;#39;1DA69425E13DB04099ED428B32D22990EFC3F937317D9E7A37BEEA92744&amp;#39;,&lt;br /&gt;]&lt;br /&gt;```&lt;br /&gt;In fact, there are more new messages later, one brother&amp;#39;s PI value is different from mine, it&amp;#39;s amazing!&lt;br /&gt;Let&amp;#39;s run with these first, I can&amp;#39;t believe my eyes, but it came out, it means that one of the prefixes above is correct, which is very unscientific, the private key is:&lt;br /&gt;```&lt;br /&gt;1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155&lt;br /&gt;```&lt;br /&gt;Here is D229, but the picture is clearly D2299, and 731 is followed by 7, here is two, but actually, this is the correct 61 bits, how he calculated it himself is unknown, incredibly curious, but I do not doubt my own operation, I saw one of the comments said that the official customer service said Pi has another version, it was me who were ignorant, with what I have learned and the current human understanding of the universe understanding, the circumference of this irrational number can represent the infinity of the universe, its fractional part never repeats or terminates, you can interpret it as the UUID of the universe you are in, if there are other versions, probably from parallel worlds.&lt;br /&gt;&lt;br /&gt;&amp;gt; Web3 currency conversion code&lt;br /&gt;&lt;br /&gt;Finally, it&amp;#39;s the code to transfer the bonus away, for this time, I use the FMZ platform Web3 directly, set the chain address to OKC, the private key added to the exchange at random, and then two lines will be done, execute it in the debug tool mode directly.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150302
" title="https://stocksharp.com/file/150302
"&gt;https://stocksharp.com/file/150302
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;gt; Proof&lt;br /&gt;&lt;br /&gt;Address of the decrypted public key&lt;br /&gt;```&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; from eth_account import Account&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; Account.from_key(&amp;#39;0x1DA69425E13DB04099ED428B32D2290EFC3F9373177D9E7A37BEEA92744C8155&amp;#39;).address&lt;br /&gt;&amp;#39;0x0bd08825e05e540C9508961a32E58D14da47275A&amp;#39;&lt;br /&gt;```&lt;br /&gt;Check out the link: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAX6jgKcm1O1gelyLxYvVdIbt9cn3p71T5OwEE4vsaq2PnkVSpqpu-oQhh8CumLz_gqis0OY5p8TC18yoMVoV04IYV7292ckz8vvWeoOH5AxVdgH8L1PV3WluBEmbWiD9o" title="https://www.okx.com/cn/explorer/okc/address/0x0bd08825e05e540c9508961a32e58d14da47275a
"&gt;https://www.okx.com/cn/e...508961a32e58d14da47275a
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;TX after being led by me: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAX6jgKcm1O1gelyLxYvVdIbt9cn3p71T5OwEE4vsaq2Kqar9GSI2Gwkni8-ofmoZZU_9RiTQLik4m-zCTbv7uPhaPJODeyf6PrqNPAS4PWWU4J8kGOKRqcaoAj9xkyOP9kVuIKijntLHM6yGTa5MP1" title="https://www.okx.com/cn/explorer/okc/tx/0x4211418b09571011417257201aaf10fc3c5d638809a9456eb5aba5fe8c5d4e2c
"&gt;https://www.okx.com/cn/e...9a9456eb5aba5fe8c5d4e2c
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We can see that the recipient address is:&lt;br /&gt;```&lt;br /&gt;0x25f0a126be95f437ee71d7c4de725567c5f6c731&lt;br /&gt;```&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150301
" title="https://stocksharp.com/file/150301
"&gt;https://stocksharp.com/file/150301
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To prove that this address is mine, I used this recipient&amp;#39;s address to make a transfer to a black hole address.&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAX6jgKcm1O1gelyLxYvVdIbt9cn3p71T5OwEE4vsaq2JfecK_mM0ziqS3rtK4yva_XtlXA14ijburUf0nWLhR3qJFddj44qUGbM1_ScygDnGvHK4k4qLXI9TIXCHMts_rZyrv_YgKu5ngk_xERoaqZ" title="https://www.okx.com/cn/explorer/okc/tx/0xc32b5e299064456af3eb67c34a3b153f74a1bd18a31429052e3e3c5614bcdb6e
"&gt;https://www.okx.com/cn/e...31429052e3e3c5614bcdb6e
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The black hole address is:&lt;br /&gt;```&lt;br /&gt;0x0000000000000000005757572e464d5a2e434f4d&lt;br /&gt;```&lt;br /&gt;This black hole address contains a URL decoded as:&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;~ % python -c &amp;#39;print(bytes.fromhex(&amp;quot;0000000000000000005757572e464d5a2e434f4d&amp;quot;))&amp;#39;&lt;br /&gt;b&amp;#39;\x00\x00\x00\x00\x00\x00\x00\x00\x00WWW.FMZ.COM&amp;#39;&lt;br /&gt;```&lt;br /&gt;&amp;gt; Postscript&lt;br /&gt;&lt;br /&gt;This is the end of the story, and in retrospect, I&amp;#39;m grateful for the knowledge I&amp;#39;ve accumulated over the years, otherwise I wouldn&amp;#39;t have been able to crack it so fast and I would have been beaten by others.&lt;br /&gt;I&amp;#39;m sure there was a mistake in the official diagram, but in any case, I was lucky enough to crack the answer before it was made public, and I hope OKX will be more rigorous next time they hold a similar activity.&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y66WhudhNiHGehLOUFMNcNd9N4Ud58G8AKhXly4dNcHYiX4uldZ3O2z_A6F-sMcnv_v1c_TmNSCoWn7z089Wavv2ECLpnqCVhbXE7tvbLFUAAqKT_9ccX06apS37JBhbiJw" title="https://blog.mathquant.com/2023/03/16/how-to-solve-the-world-pi-day-okx-private-key-puzzle-award-with-complete-code.html"&gt;https://blog.mathquant.c...-with-complete-code.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25694/</id>
    <title type="text">Digital Currency High-Frequency Strategy Detailed Introduction</title>
    <published>2024-04-16T08:28:19Z</published>
    <updated>2024-04-16T08:28:19Z</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="#strategy" />
    <category term="#market" />
    <category term="#fmz" />
    <category term="#exchange" />
    <category term="#binance" />
    <category term="#order" />
    <content type="html">I wrote an article in 2020 introducing high-frequency strategies, &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAADHZKb-RfbDOdB_w3dJgQKt-pM0kzoMVMAHLobFcTnU0OSzpfGtRpgBKGhQb2WK-Lc" title="https://www.fmz.com/bbs-topic/9750. "&gt;https://www.fmz.com/bbs-topic/9750. &lt;/a&gt;Although it received quite a bit of attention, it was not very in-depth. More than two years have passed since then, and the market has changed. After that article was published, my high-frequency strategy could make profits stably for a long time, but gradually, the profits declined and even stopped at one point. In recent months I have spent some effort to revamp it, and now it can still make some profits. In this article, I will provide a more detailed introduction to my high-frequency strategy ideas and some simplified code as a starting point for discussion; communications and feedbacks are welcome.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;High-frequency trading conditions&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;- Rebate accounts, taking Binance as an example, it has a maker rebate of 0.0005% currently. If the daily transaction amount is 100 million U, the rebate will be 5000 U. Of course, taker fees are still based on VIP rates, so if the strategy does not require takers, VIP level has little impact on high-frequency strategies. Different levels of exchanges generally have different rebate rates and require maintaining a high transaction amount. In the early times when some currency markets fluctuated greatly, there were profits even without rebates. As competition intensified, rebates accounted for a larger proportion of profits or even relied solely on them; high-frequency traders pursued top-level fees.&lt;br /&gt;&lt;br /&gt;- Speed. The reason why high-frequency strategies are called high-frequency is because they are very fast. Joining the exchange&amp;#39;s colo server, obtaining the lowest latency and most stable connection has also become one of the conditions for internal competition. The internal consumption time of the strategy should be as little as possible, and this article will introduce the websocket framework I use, which adopts concurrent execution.&lt;br /&gt;&lt;br /&gt;- Suitable market. High-frequency trading is known as the pearl of quantitative trading, and many programmatic traders have tried it, but most people stopped because they can&amp;#39;t make profit and can&amp;#39;t find a direction for improvement. The main reason should be that they chose the wrong trading market. In the initial stage of strategy development, relatively easy markets should be chosen to make profits in trading so that there are profits and feedback for improvement, which is conducive to the progress of strategy. If you start competing in the most competitive market with many potential opponents, no matter how hard you try, you will lose money and soon give up. I recommend newly listed perpetual contract trading pairs when there are not so many competitors, especially those with relatively large transaction amount; this is when making profits is easiest. BTC and ETH have the largest transaction amount and are most active in transactions but also hardest to survive.&lt;br /&gt;&lt;br /&gt;- Facing competition. The market for any transaction is changing constantly, and no trading strategy can last forever, especially in high-frequency trading. Entering this market means competing with the smartest and most diligent traders directly. In a zero-sum game market, the more you earn, the less others will earn. The later you enter, the higher the difficulty; those already in the market must also improve continuously. 3-4 years ago was probably the best opportunity; recently, overall activity in digital currency markets has declined, making it very difficult for newcomers to start high-frequency trading now.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;High-frequency principle&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;There are various high-frequency strategies:&lt;br /&gt;&lt;br /&gt;- High-frequency hedging, finding hedging opportunities through this exchange or other exchanges, relying on speed advantage to grab orders and make profits;&lt;br /&gt;- High-frequency trend, making profits by judging short-term trends;&lt;br /&gt;- Market maker, placing orders on both the buying and selling sides, controlling positions well and making profits through the rebates;&lt;br /&gt;- There are many others that I won&amp;#39;t state one by one.&lt;br /&gt;My strategy is a combination of trend and market maker. First, we judge the trend, then place an order. After the transaction is completed, place an order immediately to sell without holding inventory positions. Next, I will introduce it in conjunction with the strategy code.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Strategy framework&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;The following code is based on the basic framework of Binance perpetual contracts, mainly subscribing to websocket depth, depth order flow trades market data, and position information. Since the market data and account information are subscribed separately, it is necessary to use read(-1) continuously to determine whether the latest information has been obtained. Here EventLoop(1000) is used to avoid direct endless loops and reduce system load. EventLoop(1000) will block until there are wss or concurrent task returns with a timeout of 1000ms.&lt;br /&gt;```&lt;br /&gt;var datastream = null&lt;br /&gt;var tickerstream = null&lt;br /&gt;var update_listenKey_time = 0&lt;br /&gt;&lt;br /&gt;function ConncetWss(){&lt;br /&gt;    if (Date.now() - update_listenKey_time &amp;lt; 50*60*1000) {&lt;br /&gt;        return&lt;br /&gt;    }&lt;br /&gt;    if(datastream || tickerstream){&lt;br /&gt;        datastream.close()&lt;br /&gt;        tickerstream.close()&lt;br /&gt;    }&lt;br /&gt;    //Need APIKEY&lt;br /&gt;    let req = HttpQuery(Base+&amp;#39;/fapi/v1/listenKey&amp;#39;, {method: &amp;#39;POST&amp;#39;,data: &amp;#39;&amp;#39;}, null, &amp;#39;X-MBX-APIKEY:&amp;#39; + APIKEY) &lt;br /&gt;    let listenKey = JSON.parse(req).listenKey&lt;br /&gt;    datastream = Dial(&amp;quot;wss://fstream.binance.com/ws/&amp;quot; + listenKey + &amp;#39;|reconnect=true&amp;#39;, 60)&lt;br /&gt;    //Symbols are the set trading pairs&lt;br /&gt;    let trade_symbols_string = Symbols.toLowerCase().split(&amp;#39;,&amp;#39;)&lt;br /&gt;    let wss_url = &amp;quot;wss://fstream.binance.com/stream?streams=&amp;quot;+trade_symbols_string.join(Quote.toLowerCase()+&amp;quot;@aggTrade/&amp;quot;)+Quote.toLowerCase()+&amp;quot;@aggTrade/&amp;quot;+trade_symbols_string.join(Quote.toLowerCase()+&amp;quot;@depth20@100ms/&amp;quot;)+Quote.toLowerCase()+&amp;quot;@depth20@100ms&amp;quot;&lt;br /&gt;    tickerstream = Dial(wss_url+&amp;quot;|reconnect=true&amp;quot;, 60)&lt;br /&gt;    update_listenKey_time = Date.now()&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function ReadWss(){&lt;br /&gt;    let data = datastream.read(-1)&lt;br /&gt;    let ticker = tickerstream.read(-1)&lt;br /&gt;    while(data){&lt;br /&gt;        data = JSON.parse(data)&lt;br /&gt;        if (data.e == &amp;#39;ACCOUNT_UPDATE&amp;#39;) {&lt;br /&gt;            updateWsPosition(data)&lt;br /&gt;        }&lt;br /&gt;        if (data.e == &amp;#39;ORDER_TRADE_UPDATE&amp;#39;){&lt;br /&gt;            updateWsOrder(data)&lt;br /&gt;        }        &lt;br /&gt;        data = datastream.read(-1)&lt;br /&gt;    }&lt;br /&gt;    while(ticker){&lt;br /&gt;        ticker = JSON.parse(ticker).data&lt;br /&gt;        if(ticker.e == &amp;#39;aggTrade&amp;#39;){&lt;br /&gt;            updateWsTrades(ticker)&lt;br /&gt;        }&lt;br /&gt;        if(ticker.e == &amp;#39;depthUpdate&amp;#39;){&lt;br /&gt;            updateWsDepth(ticker)&lt;br /&gt;        }&lt;br /&gt;        ticker = tickerstream.read(-1)&lt;br /&gt;    }&lt;br /&gt;    makerOrder()&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function main() {&lt;br /&gt;    while(true){&lt;br /&gt;        ConncetWss()&lt;br /&gt;        ReadWss()&lt;br /&gt;        worker()&lt;br /&gt;        updateStatus()&lt;br /&gt;        EventLoop(1000)&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Strategy indicators&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;As mentioned earlier, my high-frequency strategy requires determining the trend before executing buying and selling. The short-term trend is mainly judged based on tick-by-tick transaction data, that is, the aggTrade in the subscription, which includes transaction direction, price, quantity, transaction time, etc. Buying and selling mainly refer to depth and trading amount. The following are detailed introductions of the indicators to be concerned about; most of them are divided into buying and selling groups and are counted dynamically within a certain time window. The time window of my strategy is within 10 seconds.&lt;br /&gt;&lt;br /&gt;- Average transaction amount per trade, per trade transactions are the collection of different orders with the same direction and price within 100ms, reflecting the size of buy and sell orders. This data has a high weight, it can be assumed that if the volume of buy orders is greater than sell orders, this is a buyer-dominated market.&lt;br /&gt;- Order frequency or order interval, it is also based on transaction-by-transaction data, the average transaction amount mentioned earlier does not take into account the concept of time and is not entirely accurate. If an order in one direction has a small average transaction amount but a high frequency, it still contributes to the strength of that direction. The average transaction amount * order frequency represents the total transaction amount at fixed intervals and can be used for direct comparison. The arrival of orders follows a Poisson distribution, which can be used to simply estimate how much the total amount of orders arriving within a specific time interval is and provide reference for placing order positions.&lt;br /&gt;- Average spread, this is relatively easy to understand, that is, sell one minus buy one. The current market mostly has a 1-tick spread. If the spread becomes larger, it often means that there is a market trend.&lt;br /&gt;- Average buying and selling price, calculate the average price of each transaction separately, and compare it with the latest price. If the recent purchase order price is higher than the average purchase order price, it can be judged preliminarily that a breakthrough has occurred.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Strategy logic&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Determine short-term trend&lt;/b&gt;&lt;br /&gt;```&lt;br /&gt;//bull represents short-term bullish, bear represents short-term bearish&lt;br /&gt;let bull =  last_sell_price &amp;gt; avg_sell_price &amp;amp;&amp;amp; last_buy_price &amp;gt; avg_buy_price &amp;amp;&amp;amp;&lt;br /&gt;            avg_buy_amount / avg_buy_time &amp;gt; avg_sell_amount / avg_sell_time;&lt;br /&gt;let bear =  last_sell_price &amp;lt; avg_sell_price &amp;amp;&amp;amp; last_buy_price &amp;lt; avg_buy_price &amp;amp;&amp;amp; &lt;br /&gt;            avg_buy_amount / avg_buy_time &amp;lt; avg_sell_amount / avg_sell_time;&lt;br /&gt;```&lt;br /&gt;If the latest selling price is higher than the average selling price, the latest buying price is higher than the average buying price, and the fixed interval buying order value is greater than the selling order value, then it is judged to be short-term bullish. Conversely, it&amp;#39;s bearish.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Price for placing orders&lt;/b&gt;&lt;br /&gt;```&lt;br /&gt;function updatePrice(depth, bid_amount, ask_amount) {&lt;br /&gt;&lt;br /&gt;    let buy_price = 0&lt;br /&gt;    let sell_price = 0&lt;br /&gt;    let acc_bid_amount = 0&lt;br /&gt;    let acc_ask_amount = 0&lt;br /&gt;&lt;br /&gt;    for (let i = 0; i &amp;lt; Math.min(depth.asks.length, depth.bids.length); i++) {&lt;br /&gt;        acc_bid_amount += parseFloat(depth.bids[i][1])&lt;br /&gt;        acc_ask_amount += parseFloat(depth.asks[i][1])&lt;br /&gt;        if (acc_bid_amount &amp;gt; bid_amount  &amp;amp;&amp;amp; buy_price == 0) {&lt;br /&gt;            buy_price = parseFloat(depth.bids[i][0]) + tick_size&lt;br /&gt;        }&lt;br /&gt;        if (acc_ask_amount &amp;gt; ask_amount  &amp;amp;&amp;amp; sell_price == 0) {&lt;br /&gt;            sell_price = parseFloat(depth.asks[i][0]) - tick_size&lt;br /&gt;        }&lt;br /&gt;        if (buy_price &amp;gt; 0 &amp;amp;&amp;amp; sell_price &amp;gt; 0) {&lt;br /&gt;            break&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return [buy_price, sell_price]&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;Here, we still adopt the old approach, iterating to the required depth. Assuming that 10 coins can be traded in 1 second, without considering new pending orders, the selling price is set at the position where 10 coins are bought. The specific size of the time window needs to be set by yourself.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Order amount&lt;/b&gt;&lt;br /&gt;```&lt;br /&gt;let buy_amount = Ratio * avg_sell_amount / avg_sell_time&lt;br /&gt;let sell_amount = Ratio * avg_buy_amount / avg_buy_time&lt;br /&gt;```&lt;br /&gt;Ratio represents a fixed proportion, which means that the buy order quantity is a fixed proportion of the recent sell order quantity. In this way, the strategy can adjust the order size adaptively according to the current buying and selling activity.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Place order conditions&lt;/b&gt;&lt;br /&gt;```&lt;br /&gt;if(bull &amp;amp;&amp;amp; (sell_price-buy_price) &amp;gt; N * avg_diff) {&lt;br /&gt;    trade(&amp;#39;buy&amp;#39;, buy_price, buy_amount)&lt;br /&gt;}else if(position.amount &amp;lt; 0){&lt;br /&gt;    trade(&amp;#39;buy&amp;#39;, buy_price, -position.amount)&lt;br /&gt;}&lt;br /&gt;if(bear &amp;amp;&amp;amp; (sell_price-buy_price) &amp;gt;  N * avg_diff) {&lt;br /&gt;    trade(&amp;#39;sell&amp;#39;, sell_price, sell_amount)&lt;br /&gt;}else if(position.amount &amp;gt; 0){&lt;br /&gt;    trade(&amp;#39;sell&amp;#39;, sell_price, position.amount)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;Where avg_diff is the average market price difference, and a buy order will only be placed when the bid-ask spread is greater than a certain multiple of this value and it&amp;#39;s bullish. If holding a short position, it will also close the position to avoid holding for an extended period. Orders can be placed as only-maker orders to ensure they are executed. Additionally, Binance&amp;#39;s custom order ID can be used so that there is no need to wait for the order response.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Concurrent structure&lt;/b&gt;&lt;br /&gt;```&lt;br /&gt;var tasks = []&lt;br /&gt;var jobs = []&lt;br /&gt;&lt;br /&gt;function worker(){&lt;br /&gt;    let new_jobs = []&lt;br /&gt;    for(let i=0; i&amp;lt;tasks.length; i++){&lt;br /&gt;        let task = tasks[i]&lt;br /&gt;        jobs.push(exchange.Go.apply(this, task.param))&lt;br /&gt;    }&lt;br /&gt;    _.each(jobs, function(t){&lt;br /&gt;        let ret = t.wait(-1)&lt;br /&gt;        if(ret === undefined){&lt;br /&gt;            new_jobs.push(t)//Unreturned tasks will continue to wait next time&lt;br /&gt;        }&lt;br /&gt;    })&lt;br /&gt;    jobs = new_jobs&lt;br /&gt;    tasks = []&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Write the required task parameters in param&lt;br /&gt;tasks.push({&amp;#39;type&amp;#39;:&amp;#39;order&amp;#39;,&amp;#39;param&amp;#39;: [&amp;quot;IO&amp;quot;, &amp;quot;api&amp;quot;, &amp;quot;POST&amp;quot;,&amp;quot;/fapi/v1/order&amp;quot;,&lt;br /&gt;        &amp;quot;symbol=&amp;quot;+symbol+Quote+&amp;quot;&amp;amp;side=&amp;quot;+side+&amp;quot;&amp;amp;type=LIMIT&amp;amp;timeInForce=GTX&amp;amp;quantity=&amp;quot;+&lt;br /&gt;        amount+&amp;quot;&amp;amp;price=&amp;quot;+price+&amp;quot;&amp;amp;newClientOrderId=&amp;quot; + UUID() +&amp;quot;&amp;amp;timestamp=&amp;quot;+Date.now()]})&lt;br /&gt;*/&lt;br /&gt;```&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Monitored data&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;- Delay, the importance of high-frequency strategy speed has been emphasized. In the strategy, various delays need to be monitored and recorded, such as placing orders, canceling orders, position returns, depth, order flow, positions, overall loops and so on. Any abnormal delays should be investigated in time and try to shorten the overall strategy delay.&lt;br /&gt;- Transaction amount ratio, calculate the transaction amount as a percentage of the total transaction amount. If the ratio is low, there is still room for growth. At peak times, it is possible for the strategy to account for more than 10% of the total trading amount.&lt;br /&gt;- Profit rate of closing positions, calculating the average closing position profit rate is the most important reference for judging whether a strategy is effective.&lt;br /&gt;- Rebate ratio, the proportion of rebates in total revenue, reflects the degree of reliance on rebates by the strategy. Exchange platforms have different rebate levels, and unprofitable strategies may be profitable with a higher level of rebate.&lt;br /&gt;- Placing order failure rate, orders are only traded by placing an order. Due to the delay in placing an order, it may not be placed. If this ratio is high, it means that the strategy&amp;#39;s speed is not advantageous.&lt;br /&gt;- The proportion of completed orders, platforms often have requirements for the transaction rate. If it is too low, it means that the strategy cancels orders too frequently and needs to be resolved.&lt;br /&gt;- Average buying and selling order distance, which reflects the strategy of placing orders and the gap between the market, we can see that most of them still occupy the position of buying one and selling one.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Other suggestions&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;- Trade multiple currencies, the high-frequency strategy in this article only refers to a single exchange, single currency and single market. It has great limitations, and most situations and currencies cannot make profits. However, it is impossible to predict which currency will be profitable in the future, so you can trade multiple or even all currencies without missing opportunities. Even under the frequency limit of exchanges, a robot can trade multiple trading pairs. Of course, for optimal speed, one sub-account can trade one trading pair with one server corresponding to one robot; however, this would result in much higher costs.&lt;br /&gt;- Determine the order quantity and order conditions based on the yield. Trading with multiple currencies will result in high cost of attempts, if monitoring is not profitable, use the minimum transaction amount and reduce the trading frequency until the strategy dynamically monitors a positive return rate, then increase the transaction amount to improve returns gradually.&lt;br /&gt;- Obtain more information, another feature of high-frequency trading is that it processes a larger amount of data and uses more information. All market information for a single trading pair within a single exchange should be referenced, and perpetual contracts can also refer to spot market data, as well as data from other exchanges for the same trading pair, or even data from other currencies. The more data there is, the greater the corresponding advantage. For example, Binance can subscribe to the best pending order information by Symbol, because the shortest push time for depth and order flow is 100ms; only this is real-time and very valuable for high-frequency strategies.&lt;br /&gt;- Binance&amp;#39;s server is in aws Tokyo, other exchanges&amp;#39; servers vary, you can consult the technical staff of the exchange for details.&lt;br /&gt;- The strategy code in this article is just a simplified example code, with many cumbersome but necessary details removed. The indicators used are for reference only and should not be used directly. There are many details to pay attention to when running a high-frequency strategy, and it requires patience to modify and improve.&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y6333FTg-10w2rr57aj1qBbPj8pfKgzNw117UIdW8HnHV88d2PpETdtQID6SJ6M7SIIHoctE-O_htKMYPmMQZyWlE5omJ-qP_HuJfhQllT7nq" title="https://blog.mathquant.com/2023/03/27/digital-currency-high-frequency-strategy-detailed-introduction.html"&gt;https://blog.mathquant.c...tailed-introduction.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25693/</id>
    <title type="text">How ChatGPT improves your quantitative productivity significantly</title>
    <published>2024-04-16T06:42:59Z</published>
    <updated>2024-04-16T06:42:59Z</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="#robot" />
    <category term="#algorithm" />
    <category term="#FMZQuant" />
    <category term="#programming" />
    <category term="#fintec" />
    <category term="#automation" />
    <category term="#ChatGPT" />
    <content type="html">For quantitative trading and programmatic trading beginners, what are the biggest difficulties in learning? Generally speaking, there are several reasons:&lt;br /&gt;&lt;br /&gt;- Basic knowledge deficiency: including basic concepts, market rules, trading knowledge, strategic thinking, etc.&lt;br /&gt;- Poor programming foundation: including logical expression, program design and writing, program debugging and error correction.&lt;br /&gt;- Weak logical thinking: the process of thinking can cause confusion easily, and the more you think, the more confused you become.&lt;br /&gt;- Self-study difficulties: When encountering problems, it is difficult to know where to start solving them, and the direction of problem searching may not even be clear.&lt;br /&gt;&lt;br /&gt;With the development of AI technology, solutions to these problems can be found to some extent. The recently popular **ChatGPT** can be used as a tool for quantitative trading learning, research, and creation. With FMZ platform&amp;#39;s new upgrade for strategy editor and integration with ChatGPT, it improves the productivity of quantification greatly. Let&amp;#39;s explore **the new functions of FMZ strategy editor** together!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Use ChatGPT to assist in code design&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Although the current capabilities of ChatGPT are already very powerful, and it can understand human questions very well, the answers it provides are still highly sensitive to factors such as **the completeness and accuracy of the question description**. If the described scenario or question content is not accurate, ChatGPT may be unable to provide a perfect answer. Therefore, when using it to solve some problems, it is necessary to try to express them correctly and completely.&lt;br /&gt;&lt;br /&gt;Next, we will use the ChatGPT function of the FMZ platform strategy editor to solve a code design problem. Log in to the FMZ platform and go to the strategy editing page.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;1. Summon ChatGPT&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150281
" title="https://stocksharp.com/file/150281
"&gt;https://stocksharp.com/file/150281
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Right-click on the blank space, select ChatGPT option and click to call out ```ChatGPT```, or **use Ctrl+K to call out ChatGPT**.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;2. The technique of asking questions&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;If I am a quantitative trading beginner now, I have a requirement:&lt;br /&gt;&lt;br /&gt; &amp;gt; Use one-minute K-line to synthesize any period K-line data.&lt;br /&gt;&lt;br /&gt;As a beginner, my programming ability is poor, and I really don&amp;#39;t know how to write such an algorithm. In the past, I could only search for information and ask experts for help. Now, with ChatGPT, I can ask it for answers directly. Of course, as mentioned above, describing the requirement directly: &amp;quot;**Use one-minute K-line data to synthesize any period K-line data**&amp;quot;. GPT is unlikely to give you a 100% usable answer, so you still need to try your best to describe the problem thoroughly. Taking the requirement as an example, I kept adjusting my questions and asked many times before getting a usable answer that met my needs.&lt;br /&gt;&lt;br /&gt;So let&amp;#39;s make this requirement description a little more complete:&lt;br /&gt;```&lt;br /&gt; &amp;gt; On the FMZ platform, calling the exchange.GetRecords(60) function can obtain one-minute K-line data, and the data structure is: [{&lt;br /&gt; &amp;gt; Time : Millisecond timestamp, // Start time of the period&lt;br /&gt; &amp;gt; Open : 1000,&lt;br /&gt; &amp;gt; High : 1500,&lt;br /&gt; &amp;gt; Low : 900,&lt;br /&gt; &amp;gt; Close : 1200,&lt;br /&gt; &amp;gt; Volume : 1000000&lt;br /&gt; &amp;gt; }, ...]&lt;br /&gt; &amp;gt; Please design an algorithm that uses one-minute K-line data to synthesize any minute&amp;#39;s K-line data. For periods that can be divided by 60 minutes, start counting from the whole point of 0 minutes. Implement it in Javascript language, write this algorithm as a separate function, test it in the function main() and use $.PlotRecords(KLineData, &amp;quot;name&amp;quot;) for drawing.&lt;br /&gt;```&lt;br /&gt;After calling out ChatGPT, you can fill in the optimized question content mentioned above.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150282
" title="https://stocksharp.com/file/150282
"&gt;https://stocksharp.com/file/150282
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ChatGPT starts working.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150284
" title="https://stocksharp.com/file/150284
"&gt;https://stocksharp.com/file/150284
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wait for it to finish writing.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150283
" title="https://stocksharp.com/file/150283
"&gt;https://stocksharp.com/file/150283
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sometimes ```ChatGPT``` adds ``` symbols to wrap the code, which in markdown indicates that the wrapped content is code. So we just need to remove the first and last lines. Since I asked it to use ```$.PlotRecords(KLineData, &amp;quot;name&amp;quot;)``` for drawing, the strategy needs to reference a drawing library in order to draw. The purpose of drawing is to verify whether the K-line data synthesized by Chat GPT&amp;#39;s code is correct.&lt;br /&gt;Regarding what a template library is, I will not elaborate here; you can refer to FMZ&amp;#39;s API documentation for more information, [The address of the Plot Library](https://www.fmz.com/strategy/27293).&lt;br /&gt;&lt;br /&gt;The code provided by ```ChatGPT``` can be backtested directly. I set the default K-line period of the backtesting system as 5 minutes, which is used for comparing with K-line charts drawn from K-line data calculated by Chat GPT&amp;#39;s algorithm.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150285
" title="https://stocksharp.com/file/150285
"&gt;https://stocksharp.com/file/150285
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;3. Backtest test code given by ChatGPT&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150287
" title="https://stocksharp.com/file/150287
"&gt;https://stocksharp.com/file/150287
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150286
" title="https://stocksharp.com/file/150286
"&gt;https://stocksharp.com/file/150286
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Preliminarily, it seems that the algorithm given by ChatGPT to synthesize 5-minute K-line from 1-minute K-line is correct.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;4. Complete code written by ChatGPT:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;```&lt;br /&gt;/*&lt;br /&gt;Synthesize arbitrary minute K-line data&lt;br /&gt;@param {Array} records - One-minute K-line data&lt;br /&gt;@param {Number} period - Synthetic period, unit in minutes&lt;br /&gt;@return {Array} - Synthesized K-line data&lt;br /&gt;*/&lt;br /&gt;function composeKLineData(records, period) {&lt;br /&gt;  var result = [];&lt;br /&gt;  var index = 0;&lt;br /&gt;  var open = records[0].Open;&lt;br /&gt;  var high = records[0].High;&lt;br /&gt;  var low = records[0].Low;&lt;br /&gt;  var close = records[0].Close;&lt;br /&gt;  var volume = records[0].Volume;&lt;br /&gt;  var time = records[0].Time - records[0].Time % (period * 60 * 1000);&lt;br /&gt;  for (var i = 1; i &amp;lt; records.length; i++) {&lt;br /&gt;    var record = records[i];&lt;br /&gt;    if (record.Time &amp;lt; time + period * 60 * 1000) {&lt;br /&gt;      high = Math.max(high, record.High);&lt;br /&gt;      low = Math.min(low, record.Low);&lt;br /&gt;      close = record.Close;&lt;br /&gt;      volume += record.Volume;&lt;br /&gt;    } else {&lt;br /&gt;      result[index] = {&lt;br /&gt;        Time: time,&lt;br /&gt;        Open: open,&lt;br /&gt;        High: high,&lt;br /&gt;        Low: low,&lt;br /&gt;        Close: close,&lt;br /&gt;        Volume: volume&lt;br /&gt;      };&lt;br /&gt;      index++;&lt;br /&gt;      open = record.Open;&lt;br /&gt;      high = record.High;&lt;br /&gt;      low = record.Low;&lt;br /&gt;      close = record.Close;&lt;br /&gt;      volume = record.Volume;&lt;br /&gt;      time = record.Time - record.Time % (period * 60 * 1000);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  result[index] = {&lt;br /&gt;    Time: time,&lt;br /&gt;    Open: open,&lt;br /&gt;    High: high,&lt;br /&gt;    Low: low,&lt;br /&gt;    Close: close,&lt;br /&gt;    Volume: volume&lt;br /&gt;  };&lt;br /&gt;  return result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function main() {&lt;br /&gt;  var records = exchange.GetRecords(60);&lt;br /&gt;  var kLineData = composeKLineData(records, 5); // Synthesize 5-minute K-line data&lt;br /&gt;  $.PlotRecords(kLineData, &amp;quot;KLineData&amp;quot;);&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Use ChatGPT to explain code&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;FMZ&amp;#39;s integrated ChatGPT not only helps you write code, but also helps you explain the code. Select the ```composeKLineData``` function in the code just written by ChatGPT, right-click to show the menu:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150289
" title="https://stocksharp.com/file/150289
"&gt;https://stocksharp.com/file/150289
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Use ChatGPT to give suggestions and optimize code&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Even ChatGPT can provide optimization suggestions and optimized code.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150288
" title="https://stocksharp.com/file/150288
"&gt;https://stocksharp.com/file/150288
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Other functions added to the editor&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;The FMZ editor update, in addition to adding the ChatGPT function. It also optimizes and enhances the online programming experience, adding many convenient functions.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;View shortcut combinations&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Right-click in the blank space or when selecting code to show the menu.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150290
" title="https://stocksharp.com/file/150290
"&gt;https://stocksharp.com/file/150290
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It displays various shortcut key combinations.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150292
" title="https://stocksharp.com/file/150292
"&gt;https://stocksharp.com/file/150292
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Modify variable name&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Rename Symbol to modify the local variable name.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150291
" title="https://stocksharp.com/file/150291
"&gt;https://stocksharp.com/file/150291
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150294
" title="https://stocksharp.com/file/150294
"&gt;https://stocksharp.com/file/150294
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It only changed the variable name ```records``` in the ```main``` function of the above picture.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Modify all the same content&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Change All Occurrences, select a variable name, word, and edit all the same content in the text simultaneously.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150293
" title="https://stocksharp.com/file/150293
"&gt;https://stocksharp.com/file/150293
&lt;/a&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150297
" title="https://stocksharp.com/file/150297
"&gt;https://stocksharp.com/file/150297
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Formatting (code optimization, automatic alignment format)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Format Selection, format the selected code.&lt;br /&gt;&lt;br /&gt;Format Document, format all code.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150296
" title="https://stocksharp.com/file/150296
"&gt;https://stocksharp.com/file/150296
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:140%"&gt;&lt;b&gt;Go to Definition, Reference&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Go to Definition: Go to Definition.&lt;br /&gt;Go to References: Go to References.&lt;br /&gt;Go to Symbol...: Go to variable names, function names, etc.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150295
" title="https://stocksharp.com/file/150295
"&gt;https://stocksharp.com/file/150295
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Peek Definition, Peek References&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Peek Definition: Definition preview, view the definition of the selected code without leaving the current line of code.&lt;br /&gt;Peek References: Quote preview, view the references to the current code line in other code lines without leaving the current code line, it can go quickly, in order to understand the code logic and structure better.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150298
" title="https://stocksharp.com/file/150298
"&gt;https://stocksharp.com/file/150298
&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y607EV_25KicVAAZ7UuJY6k8hfJvkdG6_rKXLz69gjS0ajpYPIocWa-_NgA01I46Son75fgK4aY1VPc_q4joU_7pHEEgNyVypRixcmBHaIsjXzWe4h7sPPYIw9pAIskthBOCNFFVzQIaDiiXgLgRyUwkgytafUddh7kIUeY5yJuJa" title="https://blog.mathquant.com/2023/04/03/explore-the-new-functions-of-fmz-strategy-editor-how-chatgpt-improves-your-quantitative-productivity-significantly.html"&gt;https://blog.mathquant.c...ivity-significantly.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25692/</id>
    <title type="text">Get Started with web3 Development Easily Based on Ethereum Using FMZ (7)</title>
    <published>2024-04-16T05:12:05Z</published>
    <updated>2024-04-16T05:12:05Z</updated>
    <author>
      <name>FMZ</name>
      <uri>https://stocksharp.com/users/186354/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <category term="#trading" />
    <category term="#code" />
    <category term="#data" />
    <category term="#market" />
    <category term="#fmz" />
    <category term="#Ethereum" />
    <category term="#token" />
    <category term="#web3" />
    <category term="#address" />
    <category term="#wallet" />
    <content type="html">### Execute Read method calldata&lt;br /&gt;&lt;br /&gt;For the execution of the ```calldata``` of the Read method, we use the previously learned RPC method: ```eth_call``` to execute it. We explained the ```eth_call``` RPC method of the Ethereum only did a demonstration of the ```Write``` method of the smart contract, in this section, we use the ```calldata``` method to demonstrate the execution of the smart contract Read method call. Let&amp;#39;s use the ```balanceOf``` method of the WETH contract to read the current balance of WETH tokens in the wallet.&lt;br /&gt;&lt;br /&gt;We use the debugging tool to test on the Ethereum mainnet at:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function toAmount(s, decimals) {&lt;br /&gt;    return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())&lt;br /&gt;}&lt;br /&gt;function main() {&lt;br /&gt;    // ABI for WETH contracts&lt;br /&gt;    var abiWETH = `[{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;guy&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;approve&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;totalSupply&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;src&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;dst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;transferFrom&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;withdraw&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;decimals&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint8&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;balanceOf&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;symbol&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;dst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;transfer&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;deposit&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;payable&amp;quot;:true,&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;allowance&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;payable&amp;quot;:true,&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;fallback&amp;quot;},{&amp;quot;anonymous&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;src&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;guy&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;Approval&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;event&amp;quot;},{&amp;quot;anonymous&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;src&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;dst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;Transfer&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;event&amp;quot;},{&amp;quot;anonymous&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;dst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;Deposit&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;event&amp;quot;},{&amp;quot;anonymous&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;src&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;Withdrawal&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;event&amp;quot;}]`&lt;br /&gt;&lt;br /&gt;    // WETH contract address&lt;br /&gt;    var wethAddress = &amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;&lt;br /&gt;&lt;br /&gt;    // Register ABI for WETH contracts&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, wethAddress, abiWETH)&lt;br /&gt;&lt;br /&gt;    // The wallet address of the currently configured exchange object&lt;br /&gt;    var walletAddress = exchange.IO(&amp;quot;address&amp;quot;)&lt;br /&gt;&lt;br /&gt;    // Coded WETH contract&amp;#39;s deposit method call&lt;br /&gt;    var calldataForDeposit = exchange.IO(&amp;quot;encode&amp;quot;, wethAddress, &amp;quot;balanceOf(address)&amp;quot;, walletAddress)&lt;br /&gt;    Log(&amp;quot;calldataForDeposit:&amp;quot;, &amp;quot;0x&amp;quot; + calldataForDeposit)&lt;br /&gt;&lt;br /&gt;    // Construct the transaction as the first parameter of eth_call&lt;br /&gt;    var transaction = {&lt;br /&gt;        &amp;quot;from&amp;quot; : walletAddress,&lt;br /&gt;        &amp;quot;to&amp;quot; : wethAddress,&lt;br /&gt;        &amp;quot;data&amp;quot; : &amp;quot;0x&amp;quot; + calldataForDeposit,&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // The second parameter of eth_call&lt;br /&gt;    var blockNumber = &amp;quot;latest&amp;quot;&lt;br /&gt;&lt;br /&gt;    // Call with eth_call&lt;br /&gt;    var ret = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_call&amp;quot;, transaction, blockNumber)&lt;br /&gt;    var wethBalance = exchange.IO(&amp;quot;decode&amp;quot;, &amp;quot;uint256&amp;quot;, ret)   // You can use exchange.IO(&amp;quot;decode&amp;quot;, ...) function to decode&lt;br /&gt;    Log(&amp;quot;wethBalance:&amp;quot;, toAmount(wethBalance, 18))            // Converted from wei to WETH units&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Run in the debugging tool:&lt;br /&gt;&lt;br /&gt;```run&lt;br /&gt;2023-06-15 11:51:31		Info	wethBalance: 0.015&lt;br /&gt;2023-06-15 11:51:31		Info	calldataForDeposit: 0x70a082310000000000000000000000006b3f11d807809b0b1e5e3243df04a280d9f94bf4&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;If the method of a smart contract has a return value, you can use the ```exchange.IO(&amp;quot;decode&amp;quot;, ...)``` function to decode it. You can see that the passing ```calldata``` method is the same as calling the smart contract&amp;#39;s ```balanceOf``` method directly, getting the WETH balance of 0.015 WETH for my test wallet.&lt;br /&gt;&lt;br /&gt;### Execute Write method calldata&lt;br /&gt;&lt;br /&gt;For the execution of the Write method calldata, it is necessary to use the RPC method: ```eth_sendRawTransaction```.&lt;br /&gt;&lt;br /&gt;Let&amp;#39;s use the debugging tool and test it on the Ethereum mainnet at:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function toAmount(s, decimals) {&lt;br /&gt;    return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())&lt;br /&gt;}&lt;br /&gt;function toInnerAmount(s, decimals) {&lt;br /&gt;    return (BigDecimal(s)*BigDecimal(Math.pow(10, decimals))).toFixed(0)&lt;br /&gt;}&lt;br /&gt;function main() {&lt;br /&gt;    // ABI for WETH contracts&lt;br /&gt;    var abiWETH = `[{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;guy&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;approve&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;totalSupply&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;src&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;dst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;transferFrom&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;withdraw&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;decimals&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint8&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;balanceOf&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;symbol&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;dst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;transfer&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bool&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:false,&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;deposit&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;payable&amp;quot;:true,&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;constant&amp;quot;:true,&amp;quot;inputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;allowance&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;payable&amp;quot;:false,&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;payable&amp;quot;:true,&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;fallback&amp;quot;},{&amp;quot;anonymous&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;src&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;guy&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;Approval&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;event&amp;quot;},{&amp;quot;anonymous&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;src&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;dst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;Transfer&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;event&amp;quot;},{&amp;quot;anonymous&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;dst&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;Deposit&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;event&amp;quot;},{&amp;quot;anonymous&amp;quot;:false,&amp;quot;inputs&amp;quot;:[{&amp;quot;indexed&amp;quot;:true,&amp;quot;name&amp;quot;:&amp;quot;src&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;indexed&amp;quot;:false,&amp;quot;name&amp;quot;:&amp;quot;wad&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;Withdrawal&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;event&amp;quot;}]`&lt;br /&gt;&lt;br /&gt;    // WETH contract address&lt;br /&gt;    var wethAddress = &amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;&lt;br /&gt;&lt;br /&gt;    // Register ABI for WETH contract&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, wethAddress, abiWETH)&lt;br /&gt;&lt;br /&gt;    // The wallet address of the currently configured exchange object&lt;br /&gt;    var walletAddress = exchange.IO(&amp;quot;address&amp;quot;)&lt;br /&gt;&lt;br /&gt;    // Coded WETH contract&amp;#39;s deposit method call&lt;br /&gt;    var calldataForDeposit = exchange.IO(&amp;quot;encode&amp;quot;, wethAddress, &amp;quot;deposit&amp;quot;)&lt;br /&gt;    Log(&amp;quot;calldataForDeposit:&amp;quot;, &amp;quot;0x&amp;quot; + calldataForDeposit)&lt;br /&gt;&lt;br /&gt;    // Get nonce&lt;br /&gt;    var nonce = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getTransactionCount&amp;quot;, walletAddress, &amp;quot;pending&amp;quot;)&lt;br /&gt;&lt;br /&gt;    // Get gasPrice&lt;br /&gt;    var gasPrice = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_gasPrice&amp;quot;)&lt;br /&gt;&lt;br /&gt;    // Call the deposit method to change ETH to WETH, you need to transfer ETH, here we convert 0.01ETH to a hexadecimal value in wei&lt;br /&gt;    var innerAmount = BigInt(Number(toInnerAmount(0.005, 18))).toString(16)&lt;br /&gt;&lt;br /&gt;    // The transaction call object:&lt;br /&gt;    var obj = {&lt;br /&gt;        &amp;quot;from&amp;quot; : walletAddress,&lt;br /&gt;        &amp;quot;to&amp;quot;  : wethAddress,&lt;br /&gt;        &amp;quot;gasPrice&amp;quot; : gasPrice,&lt;br /&gt;        &amp;quot;value&amp;quot; : &amp;quot;0x&amp;quot; + innerAmount,&lt;br /&gt;        &amp;quot;data&amp;quot; : &amp;quot;0x&amp;quot; + calldataForDeposit,&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Calculate gasLimit&lt;br /&gt;    var gasLimit = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_estimateGas&amp;quot;, obj)&lt;br /&gt;&lt;br /&gt;    // Construct a transaction&lt;br /&gt;    var transaction = {&lt;br /&gt;        &amp;quot;to&amp;quot;: wethAddress,&lt;br /&gt;        &amp;quot;value&amp;quot;: toAmount(&amp;quot;0x&amp;quot; + innerAmount, 0),   // Convert to decimal&lt;br /&gt;        &amp;quot;data&amp;quot;: &amp;quot;0x&amp;quot; + calldataForDeposit,&lt;br /&gt;        &amp;quot;gasLimit&amp;quot;: toAmount(gasLimit, 0),   // Convert to decimal&lt;br /&gt;        &amp;quot;gasPrice&amp;quot;: toAmount(gasPrice, 0),   // Convert to decimal&lt;br /&gt;        &amp;quot;nonce&amp;quot;: toAmount(nonce, 0),         // Convert to decimal&lt;br /&gt;        &amp;quot;chainId&amp;quot;: 1,                        // Ethereum mainnet Id&lt;br /&gt;    }&lt;br /&gt;    Log(&amp;quot;transaction:&amp;quot;, transaction)&lt;br /&gt;&lt;br /&gt;    // Signature, your key is replaced with your private key&lt;br /&gt;    var signedTx = Encode(&amp;quot;signTx&amp;quot;, &amp;quot;string&amp;quot;, &amp;quot;hex&amp;quot;, JSON.stringify(transaction), &amp;quot;hex&amp;quot;, &amp;quot;0x&amp;quot; + &amp;quot;your key&amp;quot;)&lt;br /&gt;    Log(&amp;quot;signedTx:&amp;quot;, &amp;quot;0x&amp;quot; + signedTx)&lt;br /&gt;&lt;br /&gt;    // Call eth_sendRawTransaction to send a transaction&lt;br /&gt;    var ret = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_sendRawTransaction&amp;quot;, &amp;quot;0x&amp;quot; + signedTx)&lt;br /&gt;    return ret &lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Run in the debugging tool:&lt;br /&gt;&lt;br /&gt;```run&lt;br /&gt;2023-06-15 09:58:50		Info	signedTx: 0xf86f4f8504202067888...&lt;br /&gt;2023-06-15 09:58:50		Info	transaction: {&amp;quot;to&amp;quot;:&amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;,&amp;quot;value&amp;quot;:5000000000000000,&amp;quot;data&amp;quot;:&amp;quot;0xd0e30db0&amp;quot;,&amp;quot;gasLimit&amp;quot;:27938,&amp;quot;gasPrice&amp;quot;:17718863752,&amp;quot;nonce&amp;quot;:79,&amp;quot;chainId&amp;quot;:1}&lt;br /&gt;2023-06-15 09:58:50		Info	calldataForDeposit: 0xd0e30db0&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Execute ```var ret = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_sendRawTransaction&amp;quot;, &amp;quot;0x&amp;quot; + signedTx)``` function and the returned Transaction Hash is: ``` 0x2ff585504b0fe59b0122f696e8808abfe2f3ce263448066533f3bb8a4f55e8e6```. The ```eth_sendRawTransaction``` call executes the calldata in it, calling the ```deposit``` method of the WETH contract to swap the 0.005 ETH sent for WETH.&lt;br /&gt;&lt;br /&gt;## Listening to mempool&lt;br /&gt;&lt;br /&gt;Before a user&amp;#39;s transaction is packaged into the Ethereum blockchain by miners, all transactions will be pooled in ```Mempool``` (transaction memory pool), where &amp;quot;miners&amp;quot; also look for transactions with high fees to be packaged first, in order to maximize mining benefits. Therefore, usually the higher the transaction&amp;#39;s gasPrice setting, the more likely it is to be packaged.&lt;br /&gt;&lt;br /&gt;Some transaction scripts will also sniff ```Mempool``` in the hope of finding some profitable transactions. For example, if a transaction is set with a high exchange slippage, the transaction could be subject to a &amp;quot;sandwich attack&amp;#39;&amp;#39; by these transactionscripts. So how do these scripts listen for ```pending``` (pending, to-be-packaged) transactions in ```Mempool```?&lt;br /&gt;&lt;br /&gt;### Listening with the REST protocol&lt;br /&gt;&lt;br /&gt;Use the RPC method we learned before: ```eth_getBlockByNumber```, but we do not pass the specific ```blockNumber``` this time, we use the ```&amp;quot;pending&amp;quot;``` tag.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function main() {&lt;br /&gt;    var data = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getBlockByNumber&amp;quot;, &amp;quot;pending&amp;quot;, true)&lt;br /&gt;    if (Array.isArray(data.transactions)) {&lt;br /&gt;        for (var i = 0; i &amp;lt; data.transactions.length; i++) {&lt;br /&gt;            Log(data.transactions[i])&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Run in the debugging tool:&lt;br /&gt;&lt;br /&gt;```run&lt;br /&gt;2023-06-18 19:23:05		Info	{&amp;quot;blockNumber&amp;quot;:&amp;quot;0x10b2027&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;0x2&amp;quot;,&amp;quot;accessList&amp;quot;:[],&amp;quot;blockHash&amp;quot;:&amp;quot;0xf833ed36435c53d63bd7109bb1e85383075534410c14573881bf26d912f46a89&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;0xd50521974d62f1fa34b8e81cb742ccf6147d05ff&amp;quot;,&amp;quot;gasPrice&amp;quot;:&amp;quot;0x32ea2db37&amp;quot;,&amp;quot;hash&amp;quot;:&amp;quot;0xf8f10f8f473c340b021298feb48d0affe529e8737a309c4cc1902e8989ef0914&amp;quot;,&amp;quot;input&amp;quot;:&amp;quot;0xa22cb4650000000000000000000000001e0049783f008a0085193e00003d00cd54003c710000000000000000000000000000000000000000000000000000000000000001&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;0x0&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;0x0&amp;quot;,&amp;quot;maxFeePerGas&amp;quot;:&amp;quot;0x48a413364&amp;quot;,&amp;quot;maxPriorityFeePerGas&amp;quot;:&amp;quot;0x5f5e100&amp;quot;,&amp;quot;nonce&amp;quot;:&amp;quot;0x8&amp;quot;,&amp;quot;r&amp;quot;:&amp;quot;0x8c1cc36f43b02c9e9e454153588cc9d38757f1da69ec49d3cfdda74ab69e06a8&amp;quot;,&amp;quot;s&amp;quot;:&amp;quot;0x2f3dd3e5ddf9e5d42c128a8e900026aca7568fa83c68cf332e1328066ee8d03a&amp;quot;,&amp;quot;transactionIndex&amp;quot;:&amp;quot;0x3a&amp;quot;,&amp;quot;chainId&amp;quot;:&amp;quot;0x1&amp;quot;,&amp;quot;gas&amp;quot;:&amp;quot;0x1142d&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;0x8c3c0274c33f263f0a55d129cfc8eaa3667a9e8b&amp;quot;}&lt;br /&gt;2023-06-18 19:23:05		Info	{&amp;quot;input&amp;quot;:&amp;quot;0x646174613a2c7b2270223a226572632d3230222c226f70223a226d696e74222c227469636b223a2265746873222c226964223a223139323732222c22616d74223a2231303030227d&amp;quot;,&amp;quot;nonce&amp;quot;:&amp;quot;0x1d&amp;quot;,&amp;quot;blockHash&amp;quot;:&amp;quot;0xf833ed36435c53d63bd7109bb1e85383075534410c14573881bf26d912f46a89&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;0xe7fa86855af674837cea1b58f88b5352543ca27b&amp;quot;,&amp;quot;gas&amp;quot;:&amp;quot;0x81cc&amp;quot;,&amp;quot;gasPrice&amp;quot;:&amp;quot;0x32ea2db37&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;0xe7fa86855af674837cea1b58f88b5352543ca27b&amp;quot;,&amp;quot;chainId&amp;quot;:&amp;quot;0x1&amp;quot;,&amp;quot;transactionIndex&amp;quot;:&amp;quot;0x39&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;0x2&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;0x0&amp;quot;,&amp;quot;accessList&amp;quot;:[],&amp;quot;blockNumber&amp;quot;:&amp;quot;0x10b2027&amp;quot;,&amp;quot;hash&amp;quot;:&amp;quot;0x55702f5d14736fc9d0c58fdac2d2052a602db171c46b5e1fa9ff6af5c277f9a2&amp;quot;,&amp;quot;maxFeePerGas&amp;quot;:&amp;quot;0x48a413364&amp;quot;,&amp;quot;maxPriorityFeePerGas&amp;quot;:&amp;quot;0x5f5e100&amp;quot;,&amp;quot;r&amp;quot;:&amp;quot;0x5a703d389d23b51adf8ef0f55db8876e7392636797b68a4be6afe73e76d7e1f2&amp;quot;,&amp;quot;s&amp;quot;:&amp;quot;0x4b4bb11257c4434a0acc2672357f8793476e4bfdf98bc30d2389ce335e7de64e&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;0x1&amp;quot;}&lt;br /&gt;2023-06-18 19:23:05		Info	{&amp;quot;gas&amp;quot;:&amp;quot;0x186a0&amp;quot;,&amp;quot;nonce&amp;quot;:&amp;quot;0x46533&amp;quot;,&amp;quot;r&amp;quot;:&amp;quot;0xfeea052a4ac2283ca058a657a806ba0916d8e7d52d2a577f150c40eb1dfbec65&amp;quot;,&amp;quot;s&amp;quot;:&amp;quot;0x5bf0089a3c060ba787b67a205b44e1065a0d11d132b41737ab9adf0f55066811&amp;quot;,&amp;quot;transactionIndex&amp;quot;:&amp;quot;0x38&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;0x78f0975742c400&amp;quot;,&amp;quot;blockHash&amp;quot;:&amp;quot;0xf833ed36435c53d63bd7109bb1e85383075534410c14573881bf26d912f46a89&amp;quot;,&amp;quot;chainId&amp;quot;:&amp;quot;0x1&amp;quot;,&amp;quot;hash&amp;quot;:&amp;quot;0x56bdf1b38e23db66e8d1c4014d1e9f690a9217d8a0232489210325fc69e25cf9&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;0x25&amp;quot;,&amp;quot;input&amp;quot;:&amp;quot;0x&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;0x0&amp;quot;,&amp;quot;blockNumber&amp;quot;:&amp;quot;0x10b2027&amp;quot;,&amp;quot;gasPrice&amp;quot;:&amp;quot;0x4a817c800&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;0x97b9d2102a9a65a26e1ee82d59e42d1b73b68689&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;0xcb513e99c020e9d15a6eafef873fef5d9f078221&amp;quot;}&lt;br /&gt;...&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Extract one piece of the data:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;{&lt;br /&gt;	&amp;quot;blockNumber&amp;quot;: &amp;quot;0x10b2027&amp;quot;,&lt;br /&gt;	&amp;quot;type&amp;quot;: &amp;quot;0x2&amp;quot;,&lt;br /&gt;	&amp;quot;accessList&amp;quot;: [],&lt;br /&gt;	&amp;quot;blockHash&amp;quot;: &amp;quot;0xf833ed36435c53d63bd7109bb1e85383075534410c14573881bf26d912f46a89&amp;quot;,&lt;br /&gt;	&amp;quot;from&amp;quot;: &amp;quot;0xd50521974d62f1fa34b8e81cb742ccf6147d05ff&amp;quot;,&lt;br /&gt;	&amp;quot;gasPrice&amp;quot;: &amp;quot;0x32ea2db37&amp;quot;,&lt;br /&gt;	&amp;quot;hash&amp;quot;: &amp;quot;0xf8f10f8f473c340b021298feb48d0affe529e8737a309c4cc1902e8989ef0914&amp;quot;,&lt;br /&gt;	&amp;quot;input&amp;quot;: &amp;quot;0xa22cb4650000000000000000000000001e0049783f008a0085193e00003d00cd54003c710000000000000000000000000000000000000000000000000000000000000001&amp;quot;,&lt;br /&gt;	&amp;quot;v&amp;quot;: &amp;quot;0x0&amp;quot;,&lt;br /&gt;	&amp;quot;value&amp;quot;: &amp;quot;0x0&amp;quot;,&lt;br /&gt;	&amp;quot;maxFeePerGas&amp;quot;: &amp;quot;0x48a413364&amp;quot;,&lt;br /&gt;	&amp;quot;maxPriorityFeePerGas&amp;quot;: &amp;quot;0x5f5e100&amp;quot;,&lt;br /&gt;	&amp;quot;nonce&amp;quot;: &amp;quot;0x8&amp;quot;,&lt;br /&gt;	&amp;quot;r&amp;quot;: &amp;quot;0x8c1cc36f43b02c9e9e454153588cc9d38757f1da69ec49d3cfdda74ab69e06a8&amp;quot;,&lt;br /&gt;	&amp;quot;s&amp;quot;: &amp;quot;0x2f3dd3e5ddf9e5d42c128a8e900026aca7568fa83c68cf332e1328066ee8d03a&amp;quot;,&lt;br /&gt;	&amp;quot;transactionIndex&amp;quot;: &amp;quot;0x3a&amp;quot;,&lt;br /&gt;	&amp;quot;chainId&amp;quot;: &amp;quot;0x1&amp;quot;,&lt;br /&gt;	&amp;quot;gas&amp;quot;: &amp;quot;0x1142d&amp;quot;,&lt;br /&gt;	&amp;quot;to&amp;quot;: &amp;quot;0x8c3c0274c33f263f0a55d129cfc8eaa3667a9e8b&amp;quot;&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;### Listening with the WebSocket protocol&lt;br /&gt;&lt;br /&gt;In the FMZ Quant Trading Platform, we use the ```Dial``` function to create ```WebSocket``` connections, you can check the ```FMZ API``` documentation to learn the ```Dial``` function.&lt;br /&gt;&lt;br /&gt;The test code in this section runs in the Ethereum mainnet environment, and it is easier to use the FMZ Quant to test in live trading due to the use of WebSocket protocol communication. The Websocket protocol subscription messages are:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;{&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;id&amp;quot;: 1, &amp;quot;method&amp;quot;: &amp;quot;eth_subscribe&amp;quot;, &amp;quot;params&amp;quot;: [&amp;quot;newPendingTransactions&amp;quot;]}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In addition to ```newPendingTransactions```, you can also subscribe to ```newHeads```, ```logs```.&lt;br /&gt;&lt;br /&gt;Receiving data pushed by ```WebSocket``` connections:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;{&lt;br /&gt;	&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;,&lt;br /&gt;	&amp;quot;method&amp;quot;: &amp;quot;eth_subscription&amp;quot;,&lt;br /&gt;	&amp;quot;params&amp;quot;: {&lt;br /&gt;		&amp;quot;subscription&amp;quot;: &amp;quot;0x2c5c087b4aa188e008f4747828ef4e61&amp;quot;,&lt;br /&gt;		&amp;quot;result&amp;quot;: &amp;quot;0x69c4251cecb814e17cfe7a5ee41742a616f9a4d1bbf245c49b186b1006fd14d3&amp;quot;&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Then further query ```transaction``` according to which: ```&amp;quot;result&amp;quot;: &amp;quot;0x69c4251cecb814e17cfe7a5ee41742a616f9a4d1bbf245c49b186b1006fd14d3&amp;quot;```. For a specific ```transaction```, we use the Ethereum RPC method ```eth_getTransactionByHash``` to query.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;var ws = null &lt;br /&gt;&lt;br /&gt;function main () {    &lt;br /&gt;    // {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;id&amp;quot;: 1, &amp;quot;method&amp;quot;: &amp;quot;eth_subscribe&amp;quot;, &amp;quot;params&amp;quot;: [&amp;quot;xxxxx&amp;quot;]}  , &amp;quot;xxxxx&amp;quot; is the specific message to subscribe to&lt;br /&gt;    var payload = {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;id&amp;quot;: 1, &amp;quot;method&amp;quot;: &amp;quot;eth_subscribe&amp;quot;, &amp;quot;params&amp;quot;: [&amp;quot;newPendingTransactions&amp;quot;]}&lt;br /&gt;    &lt;br /&gt;    // wss://mainnet.infura.io/ws/v3/xxxxx , &amp;quot;xxxxx&amp;quot; is your infura key&lt;br /&gt;    var infuraKey = &amp;quot;your key&amp;quot;&lt;br /&gt;&lt;br /&gt;    ws = Dial(&amp;quot;wss://mainnet.infura.io/ws/v3/&amp;quot; + infuraKey + &amp;quot;|reconnect=true&amp;amp;payload=&amp;quot; + JSON.stringify(payload))&lt;br /&gt;    if (!ws) {&lt;br /&gt;        throw &amp;quot;websocket link infura failed!&amp;quot;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    // eth_getTransactionByHash call count&lt;br /&gt;    var getTransactionCounter = 0&lt;br /&gt;&lt;br /&gt;    var beginTS = new Date().getTime()&lt;br /&gt;&lt;br /&gt;    // Loop to get messages&lt;br /&gt;    while (true) {&lt;br /&gt;        // Receive push messages&lt;br /&gt;        var data = ws.read()&lt;br /&gt;        if (data) {&lt;br /&gt;            var ts = new Date().getTime()&lt;br /&gt;&lt;br /&gt;            if (ts - beginTS &amp;gt;= 1000) {&lt;br /&gt;                getTransactionCounter = 0&lt;br /&gt;                beginTS = ts &lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            // Check transaction details based on txHash&lt;br /&gt;            if (ts - beginTS &amp;lt; 1000 &amp;amp;&amp;amp; getTransactionCounter &amp;gt;= 100) {&lt;br /&gt;                Sleep(1000)&lt;br /&gt;                getTransactionCounter = 0&lt;br /&gt;                beginTS = ts &lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            var obj = JSON.parse(data)&lt;br /&gt;            if (obj[&amp;quot;params&amp;quot;] &amp;amp;&amp;amp; obj[&amp;quot;params&amp;quot;][&amp;quot;result&amp;quot;]) {&lt;br /&gt;                var transcationInfo = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getTransactionByHash&amp;quot;, obj[&amp;quot;params&amp;quot;][&amp;quot;result&amp;quot;])&lt;br /&gt;                Log(obj[&amp;quot;params&amp;quot;][&amp;quot;result&amp;quot;], &amp;quot;transcationInfo:&amp;quot;, transcationInfo)&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            getTransactionCounter++&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        LogStatus(_D())&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function onexit() {&lt;br /&gt;    Log(&amp;quot;Disconnect WS connection&amp;quot;)&lt;br /&gt;    ws.close()&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Create a live trading to run the above code, you can receive the data pushed by the WebSocket connection, the data is pushed constantly, we extract one of them - ```transaction```:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;{&lt;br /&gt;	&amp;quot;maxPriorityFeePerGas&amp;quot;: &amp;quot;0x5f5e100&amp;quot;,&lt;br /&gt;	&amp;quot;nonce&amp;quot;: &amp;quot;0x1a9&amp;quot;,&lt;br /&gt;	&amp;quot;accessList&amp;quot;: [],&lt;br /&gt;	&amp;quot;blockNumber&amp;quot;: &amp;quot;0x10b1c9f&amp;quot;,&lt;br /&gt;	&amp;quot;from&amp;quot;: &amp;quot;0x5888700be02f52c8adf85890886ef84a6b8a7829&amp;quot;,&lt;br /&gt;	&amp;quot;blockHash&amp;quot;: &amp;quot;0x92c3d77ea218cdc0967ab74b6005bb393b92355047f206c7e2d59d41828e7fa9&amp;quot;,&lt;br /&gt;	&amp;quot;chainId&amp;quot;: &amp;quot;0x1&amp;quot;,&lt;br /&gt;	&amp;quot;gasPrice&amp;quot;: &amp;quot;0x34fdbf43d&amp;quot;,&lt;br /&gt;	&amp;quot;s&amp;quot;: &amp;quot;0x7d86ae29a786a61b9e74a7a9e2cc4b39b7913aa3d4c3816ccb07528fed82048a&amp;quot;,&lt;br /&gt;	&amp;quot;to&amp;quot;: &amp;quot;0xfc2068c3d47b575a60f6a4a7bf60dea0ac368e01&amp;quot;,&lt;br /&gt;	&amp;quot;type&amp;quot;: &amp;quot;0x2&amp;quot;,&lt;br /&gt;	&amp;quot;v&amp;quot;: &amp;quot;0x1&amp;quot;,&lt;br /&gt;	&amp;quot;value&amp;quot;: &amp;quot;0x0&amp;quot;,&lt;br /&gt;	&amp;quot;gas&amp;quot;: &amp;quot;0x1aad3&amp;quot;,&lt;br /&gt;	&amp;quot;hash&amp;quot;: &amp;quot;0x2c77c0704aefbb26db460cbb71efdb488df968ad53d2c2b3f1e1172056b40b22&amp;quot;,&lt;br /&gt;	&amp;quot;input&amp;quot;: &amp;quot;0x42842e0e0000000000000000000000005888700be02f52c8adf85890886ef84a6b8a7829000000000000000000000000d2d07e4d1bb0f40ac3e4aa7cc3ad05d348bfd2c3000000000000000000000000000000000000000000000000000000000000180b&amp;quot;,&lt;br /&gt;	&amp;quot;maxFeePerGas&amp;quot;: &amp;quot;0x4712d1273&amp;quot;,&lt;br /&gt;	&amp;quot;r&amp;quot;: &amp;quot;0x8ec58f95f6d9729a6eee075e6976658b6c5346cbc90eb68ac361a40af073b10e&amp;quot;,&lt;br /&gt;	&amp;quot;transactionIndex&amp;quot;: &amp;quot;0xc1&amp;quot;&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Excerpted (partial omission) log data:&lt;br /&gt;&lt;br /&gt;```run&lt;br /&gt;2023-06-18 16:20:07		Info	Disconnect WS connection&lt;br /&gt;2023-06-18 16:20:07		Info	0xba07ca903f9eafbfa7d494bb26197713034b9ca2dd3c19bc0898af3f35b59343 transcationInfo: {&amp;quot;accessList&amp;quot;:[],&amp;quot;from&amp;quot;:&amp;quot;0xe2977d60182da068dfd78693f96362ee7a2e9644&amp;quot;,&amp;quot;nonce&amp;quot;:&amp;quot;0xf&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;0x0&amp;quot;,&amp;quot;blockHash&amp;quot;:&amp;quot;0x92c3d77ea218cdc0967ab74b6005bb393b92355047f206c7e2d59d41828e7fa9&amp;quot;,&amp;quot;blockNumber&amp;quot;:&amp;quot;0x10b1c9f&amp;quot;,&amp;quot;chainId&amp;quot;:&amp;quot;0x1&amp;quot;,&amp;quot;hash&amp;quot;:&amp;quot;0xba07ca903f9eafbfa7d494bb26197713034b9ca2dd3c19bc0898af3f35b59343&amp;quot;,&amp;quot;maxFeePerGas&amp;quot;:&amp;quot;0x530c30b70&amp;quot;,&amp;quot;r&amp;quot;:&amp;quot;0xf28bfdf372a5401a2e00675c6ebe8d5e73f2c955db44b1aa56240b9197d6cbc7&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;0x2&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;0x0&amp;quot;,&amp;quot;gas&amp;quot;:&amp;quot;0x21079&amp;quot;,&amp;quot;gasPrice&amp;quot;:&amp;quot;0x367b3783d&amp;quot;,&amp;quot;input&amp;quot;:&amp;quot;0x657bb1130000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000001e0300000000000000000000000033c6eec1723b12c46732f7ab41398de45641fa42000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000041976bd7d021a5b94cbba72b291093b50a0ecf21d1c6cd8193fbfcd685c4723ce068feb249bdcace58c28eb3b6cc647e8c839b0826c84f8dfe4c31d57d1ac1f0111b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000648ebef50000000000000000000000000000000000000000000000000000000000000000&amp;quot;,&amp;quot;maxPriorityFeePerGas&amp;quot;:&amp;quot;0x1dcd6500&amp;quot;,&amp;quot;s&amp;quot;:&amp;quot;0x71d51246bb60e792f963a3c75c46fd8f557921ce6face7224c944e1768a76ca&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;0x0b51eb9d0e54c562fedc07ceba453f05b70c4b79&amp;quot;,&amp;quot;transactionIndex&amp;quot;:&amp;quot;0x40&amp;quot;}&lt;br /&gt;2023-06-18 16:20:07		Info	0x2c77c0704aefbb26db460cbb71efdb488df968ad53d2c2b3f1e1172056b40b22 transcationInfo: {&amp;quot;maxPriorityFeePerGas&amp;quot;:&amp;quot;0x5f5e100&amp;quot;,&amp;quot;nonce&amp;quot;:&amp;quot;0x1a9&amp;quot;,&amp;quot;accessList&amp;quot;:[],&amp;quot;blockNumber&amp;quot;:&amp;quot;0x10b1c9f&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;0x5888700be02f52c8adf85890886ef84a6b8a7829&amp;quot;,&amp;quot;blockHash&amp;quot;:&amp;quot;0x92c3d77ea218cdc0967ab74b6005bb393b92355047f206c7e2d59d41828e7fa9&amp;quot;,&amp;quot;chainId&amp;quot;:&amp;quot;0x1&amp;quot;,&amp;quot;gasPrice&amp;quot;:&amp;quot;0x34fdbf43d&amp;quot;,&amp;quot;s&amp;quot;:&amp;quot;0x7d86ae29a786a61b9e74a7a9e2cc4b39b7913aa3d4c3816ccb07528fed82048a&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;0xfc2068c3d47b575a60f6a4a7bf60dea0ac368e01&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;0x2&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;0x1&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;0x0&amp;quot;,&amp;quot;gas&amp;quot;:&amp;quot;0x1aad3&amp;quot;,&amp;quot;hash&amp;quot;:&amp;quot;0x2c77c0704aefbb26db460cbb71efdb488df968ad53d2c2b3f1e1172056b40b22&amp;quot;,&amp;quot;input&amp;quot;:&amp;quot;0x42842e0e0000000000000000000000005888700be02f52c8adf85890886ef84a6b8a7829000000000000000000000000d2d07e4d1bb0f40ac3e4aa7cc3ad05d348bfd2c3000000000000000000000000000000000000000000000000000000000000180b&amp;quot;,&amp;quot;maxFeePerGas&amp;quot;:&amp;quot;0x4712d1273&amp;quot;,&amp;quot;r&amp;quot;:&amp;quot;0x8ec58f95f6d9729a6eee075e6976658b6c5346cbc90eb68ac361a40af073b10e&amp;quot;,&amp;quot;transactionIndex&amp;quot;:&amp;quot;0xc1&amp;quot;}&lt;br /&gt;2023-06-18 16:20:07		Info	0xbc42d5db10e5cb2e888c76005c522cb2474a0c0a7325feb867b618f69ff26f2a transcationInfo: {&amp;quot;accessList&amp;quot;:[],&amp;quot;blockNumber&amp;quot;:&amp;quot;0x10b1c9f&amp;quot;,&amp;quot;gas&amp;quot;:&amp;quot;0x1cc12b&amp;quot;,&amp;quot;hash&amp;quot;:&amp;quot;0xbc42d5db10e5cb2e888c76005c522cb2474a0c0a7325feb867b618f69ff26f2a&amp;quot;,&amp;quot;maxFeePerGas&amp;quot;:&amp;quot;0x6ab262e5c&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;0x0&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;0x1&amp;quot;,&amp;quot;chainId&amp;quot;:&amp;quot;0x1&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;0xc1b634853cb333d3ad8663715b08f41a3aec47cc&amp;quot;,&amp;quot;input&amp;quot;:&amp;quot;0x8f111f3c000000000000000000000000000000000000000000000000000000000003b83700000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000e0fa2000000000000000000000000e64a54e2533fd126c2e452c5fab544d80e2e4eb50000000000000000000000000000000000000000000000000000000004c6ff1c0000000000000000000000000000000000000000000000000000000004c70029000000000000000000000000000000000000000000000000000000000001822d005b1979341221e80ed20b20d832de88a8a4b535fe9990a90c165f3c95ad085ab9445c0a998c70edff76f1c2de3f4263d7e4fe3c3fb73fe7dcfbdede92371842fb883267f5408c8aaf08ba2f6c22463f19da98183d2302735615460d7380d6f9ff5e764e75bcaca9a93946cf644cd4d4448f314c4cf60cd0353f085aa0562d70e16a510b8bc4c2a09b5e7fafcd43f07dc1b5dd1782962af8f6fff7a6965bfc127e11501a72c64913d58e624333f9ec51687c7cb1bb4a9850541f1e03b2790ed4ee508052910dfe22542d900548d5243ca238811427491d49e98cf269ccab5b1724f0f9698120e406c00910c4090c0e84e0400e2706822d2a001a3964a0ca8101700a547342c2c1fff8934a988416f020a0c98f0909c7f529875f8443914e10b58145c79d38914d1fafbc9ee57ebcb377e4ac1cd252bdebe3c59e8e917fea7dbc7bf66dfc1846482a858645b95555b3ecc9ab4f9e2b0e3e78d68379b009e606a1cefe675670a5eabd5f5a2efa5d77a1084288480c98d01c70a3d8c6b854496e2a966dc9051b13b872b7c6c2c5d82676fd8e82c680514333db21db2006d23f42074021de7e61c54d88b01824d40f03d1505eb6ec6d0cb7ccd38deb821517a5e63d0e89f6bf0385f109c81ea36dd00e7a903a100290f5b47a940ed146ae9338ff8bc17a2b5bc457614d0831e743e485c0de84636b034400bf6bd192ff723045cc170e109aabf273dc9de19c9987038515b6613249f471f9ddeb31331cc1643902212d20241c417532ad7e4a9ac742b4b5f68e1019795cf9386dcf36037502c13ff51f50a2202b2c1cac1c0b38a21ec798deff778c9a6b679d16d0521d2df89c439f4f8f9425ed378f4194d03d00&lt;br /&gt;2023-06-18 16:20:06		Info	0xff0945c3d682a37e18ee433d56c8bedbb93d9ac368af968ed8d53b655575e8e5 transcationInfo: {&amp;quot;gas&amp;quot;:&amp;quot;0x5208&amp;quot;,&amp;quot;s&amp;quot;:&amp;quot;0x63572e1fa060841b939cea0849154e55781fe0efcbdfe5ce6979b44ce0980e4a&amp;quot;,&amp;quot;transactionIndex&amp;quot;:&amp;quot;0xa7&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;0x113e9d515e400&amp;quot;,&amp;quot;blockHash&amp;quot;:&amp;quot;0x92c3d77ea218cdc0967ab74b6005bb393b92355047f206c7e2d59d41828e7fa9&amp;quot;,&amp;quot;hash&amp;quot;:&amp;quot;0xff0945c3d682a37e18ee433d56c8bedbb93d9ac368af968ed8d53b655575e8e5&amp;quot;,&amp;quot;nonce&amp;quot;:&amp;quot;0x2&amp;quot;,&amp;quot;r&amp;quot;:&amp;quot;0x698fe26331ad39ba89c4d30985b707792ea4ab09b25205727f8fac2a6120b54a&amp;quot;,&amp;quot;gasPrice&amp;quot;:&amp;quot;0x35458af00&amp;quot;,&amp;quot;from&amp;quot;:&amp;quot;0x228d93af92d03184c07aa9e39b3d2d61b666686d&amp;quot;,&amp;quot;input&amp;quot;:&amp;quot;0x&amp;quot;,&amp;quot;to&amp;quot;:&amp;quot;0x0246177b98a5e42835cdcfaac1c274d3e6c39486&amp;quot;,&amp;quot;v&amp;quot;:&amp;quot;0x26&amp;quot;,&amp;quot;blockNumber&amp;quot;:&amp;quot;0x10b1c9f&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;0x0&amp;quot;,&amp;quot;chainId&amp;quot;:&amp;quot;0x1&amp;quot;}&lt;br /&gt;...&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;## Decoding Transaction Details&lt;br /&gt;&lt;br /&gt;In the previous course, we wrote a monitoring program to monitor pending transactions on Ethereum, get the pushed transaction hash via WebSocket protocol, and then query the specific transaction details based on the transaction hash.&lt;br /&gt;&lt;br /&gt;Next we want to do further parsing of the ```input``` field data in the transaction details data. The ```input``` field data looks like a jumble of hexadecimal data, but it actually encodes the content of the transaction: including the functions called, and the parameters entered, etc.&lt;br /&gt;&lt;br /&gt;After repeated and extensive testing, we found that the timeliness and quantity of data pushed over by the WebSocket connection has a lot to do with the RPC node currently in use, and the pushed data received by two different RPC node services (e.g., infura, ALCHEMY) when creating a WebSocket connection at the same time is not exactly the same, and since the current scenario generates a large number of requests, we still need to use a more stable and faster RPC service. The WebSocket connection also pushes a lot of transaction hashes that have been Pending for a long time, and when using ```eth_getTransactionByHash``` to query, you often get a null value (tested on FMZ, node.js).&lt;br /&gt;&lt;br /&gt;We use the ```alchemy``` RPC node this time: ```wss://eth-mainnet.g.alchemy.com/v2/oKmOQKbneVkxgHZfibs-iFhIlIAl6HDN```. The node supports both WebSocket and REST protocols.&lt;br /&gt;&lt;br /&gt;We monitor the ```multicall(uint256,bytes[])``` method of the router smart contract of the Uniswap decentralized exchange, so we need to calculate the function signature hash of the method first.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;// Take the first 8 characters of the complete hash&lt;br /&gt;// multicall: 0x5ae401dc&lt;br /&gt;var sigHash = &amp;quot;0x&amp;quot; + Encode(&amp;quot;keccak256&amp;quot;, &amp;quot;string&amp;quot;, &amp;quot;hex&amp;quot;, &amp;quot;multicall(uint256,bytes[])&amp;quot;).slice(0, 8)&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Based on the example in the previous lesson, we have made some modifications. When receiving messages pushed by the WebSocket connection, the latest data is received using ```var data = ws.read(-2)``` method, and the ```read()``` function parameter is set to -2 to indicate that the latest data is returned immediately. We only care about the ```Transaction``` that contains the ```multicall``` call, using ```if (tx &amp;amp;&amp;amp; tx.input.indexOf(sigHash) ! == -1)``` to determine the filter.&lt;br /&gt;&lt;br /&gt;2 custom functions need to be designed:&lt;br /&gt;&lt;br /&gt;- ```calcAllFuncSigHash()```: Calculate signature hash for all methods based on ABI.&lt;br /&gt;- ```decodeCall()```: Decoding function.&lt;br /&gt;&lt;br /&gt;Next, when the ```multicall``` call is detected, the decoding operation can start, and the parameters of the ```multicall``` method are decoded for the first time: ```deadline``` and ```data```. ```deadline``` is a timestamp that is better understood, and ```data``` is another encoded ```calldata```, so you still need to continue to use the ```decodeCall()``` function to decode it.&lt;br /&gt;&lt;br /&gt;Example of a complete implementation:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;var ws = null &lt;br /&gt;var arrLog = []&lt;br /&gt;&lt;br /&gt;const ABI_Route = &amp;#39;[{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;_factoryV2&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;factoryV3&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;_positionManager&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;_WETH9&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;constructor&amp;quot;},{&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;WETH9&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;approveMax&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;approveMaxMinusOne&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;approveZeroThenMax&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;approveZeroThenMaxMinusOne&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;callPositionManager&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;result&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;paths&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint128[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amounts&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint128[]&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;maximumTickDivergence&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;secondsAgo&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;checkOracleSlippage&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;maximumTickDivergence&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;secondsAgo&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;checkOracleSlippage&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;components&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOutMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct IV3SwapRouter.ExactInputParams&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;params&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tuple&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;exactInput&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;components&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tokenIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tokenOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;fee&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOutMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint160&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;sqrtPriceLimitX96&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint160&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct IV3SwapRouter.ExactInputSingleParams&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;params&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tuple&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;exactInputSingle&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;components&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountInMaximum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct IV3SwapRouter.ExactOutputParams&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;params&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tuple&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;exactOutput&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;components&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tokenIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tokenOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;fee&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountInMaximum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint160&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;sqrtPriceLimitX96&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint160&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct IV3SwapRouter.ExactOutputSingleParams&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;params&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tuple&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;exactOutputSingle&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;factory&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;factoryV2&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;getApprovalType&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;enum IApproveAndCall.ApprovalType&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint8&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;components&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token1&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tokenId&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount0Min&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount1Min&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct IApproveAndCall.IncreaseLiquidityParams&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;params&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tuple&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;increaseLiquidity&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;result&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;components&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token1&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;fee&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;int24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tickLower&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;int24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;int24&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;tickUpper&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;int24&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount0Min&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount1Min&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;internalType&amp;quot;:&amp;quot;struct IApproveAndCall.MintParams&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;params&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tuple&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;mint&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;result&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;previousBlockhash&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;multicall&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;deadline&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;multicall&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;data&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;multicall&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;bytes[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;results&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes[]&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;positionManager&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;view&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;value&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;pull&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;refundETH&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;value&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;deadline&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint8&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;v&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint8&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;r&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;selfPermit&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;nonce&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;expiry&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint8&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;v&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint8&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;r&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;selfPermitAllowed&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;nonce&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;expiry&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint8&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;v&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint8&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;r&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;selfPermitAllowedIfNecessary&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;value&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;deadline&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint8&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;v&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint8&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;r&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes32&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;s&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes32&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;selfPermitIfNecessary&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOutMin&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address[]&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;to&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;swapExactTokensForTokens&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountOut&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountInMax&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address[]&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;path&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address[]&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;to&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;swapTokensForExactTokens&amp;quot;,&amp;quot;outputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountIn&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;sweepToken&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;sweepToken&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeBips&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeRecipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;sweepTokenWithFee&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;token&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeBips&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeRecipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;sweepTokenWithFee&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;int256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount0Delta&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;int256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;int256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amount1Delta&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;int256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;bytes&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;_data&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bytes&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;uniswapV3SwapCallback&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;nonpayable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;unwrapWETH9&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;unwrapWETH9&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;recipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeBips&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeRecipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;unwrapWETH9WithFee&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;amountMinimum&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeBips&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;},{&amp;quot;internalType&amp;quot;:&amp;quot;address&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;feeRecipient&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;address&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;unwrapWETH9WithFee&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;inputs&amp;quot;:[{&amp;quot;internalType&amp;quot;:&amp;quot;uint256&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;value&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;uint256&amp;quot;}],&amp;quot;name&amp;quot;:&amp;quot;wrapETH&amp;quot;,&amp;quot;outputs&amp;quot;:[],&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;function&amp;quot;},{&amp;quot;stateMutability&amp;quot;:&amp;quot;payable&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;receive&amp;quot;}]&amp;#39;&lt;br /&gt;&lt;br /&gt;function calcAllFuncSigHash(jsonABI) {&lt;br /&gt;    var mapSigHash = {}&lt;br /&gt;    for (var i in jsonABI) {&lt;br /&gt;        var ele = jsonABI[i]&lt;br /&gt;        if (typeof(ele[&amp;quot;name&amp;quot;]) != &amp;quot;undefined&amp;quot;) {&lt;br /&gt;            if (ele[&amp;quot;inputs&amp;quot;]) {&lt;br /&gt;                var funcName = ele[&amp;quot;name&amp;quot;]&lt;br /&gt;                if (ele[&amp;quot;inputs&amp;quot;].length == 0) {&lt;br /&gt;                    var methodId = &amp;quot;0x&amp;quot; + Encode(&amp;quot;keccak256&amp;quot;, &amp;quot;string&amp;quot;, &amp;quot;hex&amp;quot;, funcName + &amp;quot;()&amp;quot;).slice(0, 8)&lt;br /&gt;                    mapSigHash[methodId] = {&amp;quot;argsTypeList&amp;quot;: [], &amp;quot;argsNameList&amp;quot;: [], &amp;quot;funcName&amp;quot;: funcName}&lt;br /&gt;                } else {&lt;br /&gt;                    var arr = []&lt;br /&gt;                    var arrName = []&lt;br /&gt;                    var argPrototype = []&lt;br /&gt;                    for (var j in ele[&amp;quot;inputs&amp;quot;]) {&lt;br /&gt;                        var inputType = ele[&amp;quot;inputs&amp;quot;][j][&amp;quot;type&amp;quot;]&lt;br /&gt;                        if (inputType == &amp;quot;tuple&amp;quot;) {                            &lt;br /&gt;                            var components = ele[&amp;quot;inputs&amp;quot;][j][&amp;quot;components&amp;quot;]&lt;br /&gt;                            var tupleType = []&lt;br /&gt;                            var protoType = []&lt;br /&gt;                            for (var componentsIdx = 0; componentsIdx &amp;lt; components.length; componentsIdx++) {&lt;br /&gt;                                tupleType.push(components[componentsIdx][&amp;quot;type&amp;quot;])&lt;br /&gt;                                protoType.push(components[componentsIdx][&amp;quot;name&amp;quot;] + &amp;quot; &amp;quot; + components[componentsIdx][&amp;quot;type&amp;quot;])&lt;br /&gt;                            }&lt;br /&gt;                            arr.push(&amp;quot;(&amp;quot; + tupleType.join() + &amp;quot;)&amp;quot;)&lt;br /&gt;                            arrName.push(ele[&amp;quot;inputs&amp;quot;][j][&amp;quot;name&amp;quot;])&lt;br /&gt;                            // Prototype&lt;br /&gt;                            argPrototype.push(&amp;quot;tuple&amp;quot; + &amp;quot;(&amp;quot; + protoType.join() + &amp;quot;)&amp;quot;)&lt;br /&gt;                        } else {&lt;br /&gt;                            arr.push(inputType)&lt;br /&gt;                            arrName.push(ele[&amp;quot;inputs&amp;quot;][j][&amp;quot;name&amp;quot;])&lt;br /&gt;                            // Prototype&lt;br /&gt;                            argPrototype.push(inputType)&lt;br /&gt;                        }                        &lt;br /&gt;                    }&lt;br /&gt;                    var functionSignature = funcName + &amp;quot;(&amp;quot; + arr.join() + &amp;quot;)&amp;quot;&lt;br /&gt;                    var methodId = &amp;quot;0x&amp;quot; + Encode(&amp;quot;keccak256&amp;quot;, &amp;quot;string&amp;quot;, &amp;quot;hex&amp;quot;, functionSignature).slice(0, 8)&lt;br /&gt;                    mapSigHash[methodId] = {&amp;quot;argsTypeList&amp;quot;: arr, &amp;quot;argsNameList&amp;quot;: arrName, &amp;quot;funcName&amp;quot;: funcName, &amp;quot;argPrototype&amp;quot;: argPrototype}&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return mapSigHash&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function decodeCall(input, abi) {&lt;br /&gt;    var mapSigHash = calcAllFuncSigHash(JSON.parse(abi))&lt;br /&gt;    var methodId = input.slice(0, 10)&lt;br /&gt;    var data = input.slice(10)&lt;br /&gt;    &lt;br /&gt;    var decodedArgs = {}&lt;br /&gt;    var infoMethod = mapSigHash[methodId]&lt;br /&gt;    if (typeof(infoMethod) == &amp;quot;undefined&amp;quot;) {&lt;br /&gt;        return [methodId, mapSigHash]&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    var arr = []&lt;br /&gt;    for (var i = 0; i &amp;lt; infoMethod[&amp;quot;argsTypeList&amp;quot;].length; i++) {&lt;br /&gt;        if (infoMethod[&amp;quot;argsTypeList&amp;quot;][i].startsWith(&amp;quot;(&amp;quot;)) {&lt;br /&gt;            arr.push(infoMethod[&amp;quot;argPrototype&amp;quot;][i])&lt;br /&gt;        } else {&lt;br /&gt;            arr.push(infoMethod[&amp;quot;argsTypeList&amp;quot;][i])&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    if (arr.length == 0) {&lt;br /&gt;        return {&amp;quot;funcName&amp;quot;: infoMethod[&amp;quot;funcName&amp;quot;], &amp;quot;args&amp;quot;: decodedArgs}&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    var args = exchange.IO(&amp;quot;decode&amp;quot;, arr.join(), data)&lt;br /&gt;&lt;br /&gt;    if (!Array.isArray(args)) {&lt;br /&gt;        args = [args]&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (args.length != infoMethod[&amp;quot;argsNameList&amp;quot;].length) {&lt;br /&gt;        Log(&amp;quot;args:&amp;quot;, args)&lt;br /&gt;        Log(&amp;quot;infoMethod:&amp;quot;, infoMethod)&lt;br /&gt;        throw &amp;quot;The decoded args are not equal to the argsNameList&amp;quot;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    for (var i = 0; i &amp;lt; infoMethod[&amp;quot;argsNameList&amp;quot;].length; i++) {&lt;br /&gt;        var key = infoMethod[&amp;quot;argsNameList&amp;quot;][i]&lt;br /&gt;        var value = args[i]&lt;br /&gt;        decodedArgs[key] = value&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return {&amp;quot;funcName&amp;quot;: infoMethod[&amp;quot;funcName&amp;quot;], &amp;quot;args&amp;quot;: decodedArgs}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function main () {&lt;br /&gt;    // {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;id&amp;quot;: 1, &amp;quot;method&amp;quot;: &amp;quot;eth_subscribe&amp;quot;, &amp;quot;params&amp;quot;: [&amp;quot;xxxxx&amp;quot;]}  , &amp;quot;xxxxx&amp;quot; is the specific message of the subscription&lt;br /&gt;    var payload = {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;id&amp;quot;: 1, &amp;quot;method&amp;quot;: &amp;quot;eth_subscribe&amp;quot;, &amp;quot;params&amp;quot;: [&amp;quot;newPendingTransactions&amp;quot;]}&lt;br /&gt;    &lt;br /&gt;    // Use the alchemy service&lt;br /&gt;    ws = Dial(&amp;quot;wss://eth-mainnet.g.alchemy.com/v2/oKmOQKbneVkxgHZfibs-iFhIlIAl6HDN&amp;quot; + &amp;quot;|reconnect=true&amp;amp;payload=&amp;quot; + JSON.stringify(payload))&lt;br /&gt;    if (!ws) {&lt;br /&gt;        throw &amp;quot;websocket link to alchemy failed!&amp;quot;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    // eth_getTransactionByHash call count&lt;br /&gt;    var getTransactionCounter = 0&lt;br /&gt;    &lt;br /&gt;    // Start Timestamp&lt;br /&gt;    var beginTS = new Date().getTime()&lt;br /&gt;    &lt;br /&gt;    // Calculate function signature hash&lt;br /&gt;    var sigHash = &amp;quot;0x&amp;quot; + Encode(&amp;quot;keccak256&amp;quot;, &amp;quot;string&amp;quot;, &amp;quot;hex&amp;quot;, &amp;quot;multicall(uint256,bytes[])&amp;quot;).slice(0, 8)&lt;br /&gt;    Log(&amp;quot;sigHash:&amp;quot;, sigHash)&lt;br /&gt;&lt;br /&gt;    // Loop for messages&lt;br /&gt;    while (true) {&lt;br /&gt;        var msg = &amp;quot;&amp;quot;&lt;br /&gt;        var recv = null&lt;br /&gt;        // Receive pushed messages, use the read parameter -2, and return the latest data immediately&lt;br /&gt;        var data = ws.read(-2)&lt;br /&gt;        if (data &amp;amp;&amp;amp; data != &amp;quot;&amp;quot;) {&lt;br /&gt;            var ts = new Date().getTime()&lt;br /&gt;&lt;br /&gt;            if (ts - beginTS &amp;gt;= 1000) {&lt;br /&gt;                getTransactionCounter = 0&lt;br /&gt;                beginTS = ts &lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            // Check transaction details based on txHash&lt;br /&gt;            if (ts - beginTS &amp;lt; 1000 &amp;amp;&amp;amp; getTransactionCounter &amp;gt;= 100) {&lt;br /&gt;                Sleep(1000)&lt;br /&gt;                getTransactionCounter = 0&lt;br /&gt;                beginTS = ts &lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            var obj = JSON.parse(data)&lt;br /&gt;            if (obj[&amp;quot;params&amp;quot;] &amp;amp;&amp;amp; obj[&amp;quot;params&amp;quot;][&amp;quot;result&amp;quot;]) {&lt;br /&gt;                var txHash = obj[&amp;quot;params&amp;quot;][&amp;quot;result&amp;quot;]&lt;br /&gt;                var tx = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_getTransactionByHash&amp;quot;, txHash)&lt;br /&gt;                &lt;br /&gt;                if (tx &amp;amp;&amp;amp; tx.input.indexOf(sigHash) !== -1) {&lt;br /&gt;                    // Decode transaction details&lt;br /&gt;                    arrLog = []&lt;br /&gt;                    var decodedInput = decodeCall(tx.input, ABI_Route)&lt;br /&gt;&lt;br /&gt;                    // Log(&amp;quot;----------------&amp;quot;, txHash, &amp;quot;/&amp;quot;, decodedInput[&amp;quot;funcName&amp;quot;], &amp;quot;----------------&amp;quot;, &amp;quot;#FF0000&amp;quot;)&lt;br /&gt;                    arrLog.push(&amp;quot;----------------&amp;quot; + txHash + &amp;quot;/&amp;quot; + decodedInput[&amp;quot;funcName&amp;quot;] + &amp;quot;----------------&amp;quot; + &amp;quot;#FF0000&amp;quot;)&lt;br /&gt;                    arrLog.push(tx.from + &amp;quot; -&amp;gt; &amp;quot; + tx.to)&lt;br /&gt;&lt;br /&gt;                    for (var i = 0; i &amp;lt; decodedInput[&amp;quot;args&amp;quot;][&amp;quot;data&amp;quot;].length; i++) {&lt;br /&gt;                        var calldata = &amp;quot;0x&amp;quot; + decodedInput[&amp;quot;args&amp;quot;][&amp;quot;data&amp;quot;][i]&lt;br /&gt;                        var decodedCalldata = decodeCall(calldata, ABI_Route)&lt;br /&gt;&lt;br /&gt;                        // Log(&amp;quot;----------------&amp;quot;, decodedCalldata[&amp;quot;funcName&amp;quot;], &amp;quot;----------------&amp;quot;, &amp;quot;#FF0000&amp;quot;)&lt;br /&gt;                        arrLog.push(&amp;quot;----------------&amp;quot; + decodedCalldata[&amp;quot;funcName&amp;quot;] + &amp;quot;----------------&amp;quot; + &amp;quot;#FF0000&amp;quot;)&lt;br /&gt;&lt;br /&gt;                        for (var key in decodedCalldata[&amp;quot;args&amp;quot;]) {&lt;br /&gt;                            // Log(key, decodedCalldata[&amp;quot;args&amp;quot;][key])&lt;br /&gt;                            arrLog.push(key + &amp;quot;: &amp;quot; + JSON.stringify(decodedCalldata[&amp;quot;args&amp;quot;][key]))&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    // Output logs&lt;br /&gt;                    for (var logIdx = arrLog.length - 1; logIdx &amp;gt;= 0; logIdx--) {&lt;br /&gt;                        Log(arrLog[logIdx])&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                &lt;br /&gt;                getTransactionCounter++&lt;br /&gt;            }&lt;br /&gt;            recv = obj&lt;br /&gt;        } else if (data == null) {&lt;br /&gt;            msg = &amp;quot;The buffer queue is empty, time:&amp;quot; + _D()&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        LogStatus(_D(), &amp;quot;, msg:&amp;quot;, msg, &amp;quot;, recv:&amp;quot;, recv)&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function onexit() {&lt;br /&gt;    Log(&amp;quot;Disconnect WS connection&amp;quot;)&lt;br /&gt;    ws.close()&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function onerror() {&lt;br /&gt;    Log(&amp;quot;Disconnect WS connection&amp;quot;)&lt;br /&gt;    ws.close()&lt;br /&gt;&lt;br /&gt;    for (var logIdx = arrLog.length - 1; logIdx &amp;gt;= 0; logIdx--) {        &lt;br /&gt;        Log(arrLog[logIdx])&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Create a live trading to test:&lt;br /&gt;&lt;br /&gt;```run&lt;br /&gt;2023-06-20 17:01:00		Info	----------------0x5288a7bd6e0f57162ca763df722de73793e542734d7d2b7af5755664e2e67910/multicall----------------&lt;br /&gt;2023-06-20 17:01:00		Info	0x851b594033d57c98af753bcb3a7d0237a615de32 -&amp;gt; 0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45&lt;br /&gt;2023-06-20 17:01:00		Info	----------------exactInputSingle----------------&lt;br /&gt;2023-06-20 17:01:00		Info	params: {&amp;quot;tokenOut&amp;quot;:&amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;,&amp;quot;fee&amp;quot;:&amp;quot;10000&amp;quot;,&amp;quot;recipient&amp;quot;:&amp;quot;0x0000000000000000000000000000000000000002&amp;quot;,&amp;quot;amountIn&amp;quot;:&amp;quot;8952087000296027130940868&amp;quot;,&amp;quot;amountOutMinimum&amp;quot;:&amp;quot;41638694112306829&amp;quot;,&amp;quot;sqrtPriceLimitX96&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;tokenIn&amp;quot;:&amp;quot;0xe1283567345349942acdfad3692924a1b16cf3cc&amp;quot;}&lt;br /&gt;2023-06-20 17:01:00		Info	----------------unwrapWETH9----------------&lt;br /&gt;2023-06-20 17:01:00		Info	amountMinimum: &amp;quot;41638694112306829&amp;quot;&lt;br /&gt;2023-06-20 17:01:00		Info	recipient: &amp;quot;0x851b594033d57c98af753bcb3a7d0237a615de32&amp;quot;&lt;br /&gt;2023-06-20 16:59:03		Info	----------------0x55e0c4a38a17d3aa6e8f558a66c77e9defa9f8f6e347536363ac1b921de9aaf3/multicall----------------&lt;br /&gt;2023-06-20 16:59:03		Info	0x27457ada2dd725c7d0f28e1737bdd0bf583c0f0b -&amp;gt; 0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45&lt;br /&gt;2023-06-20 16:59:03		Info	----------------swapExactTokensForTokens----------------&lt;br /&gt;2023-06-20 16:59:03		Info	amountIn: &amp;quot;816769666850161&amp;quot;&lt;br /&gt;2023-06-20 16:59:03		Info	amountOutMin: &amp;quot;40404501509302321&amp;quot;&lt;br /&gt;2023-06-20 16:59:03		Info	path: [&amp;quot;0x7863e06bca47ded821fcb53ab788eeb371243eda&amp;quot;,&amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;]&lt;br /&gt;2023-06-20 16:59:03		Info	to: &amp;quot;0x27457ada2dd725c7d0f28e1737bdd0bf583c0f0b&amp;quot;&lt;br /&gt;2023-06-20 16:58:25		Info	sigHash: 0x5ae401dc&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Screenshot:&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150279
" title="https://stocksharp.com/file/150279
"&gt;https://stocksharp.com/file/150279
&lt;/a&gt;&lt;br /&gt;You can see that the Transaction Hash is ```0x5288a7bd6e0f57162ca763df722de73793e542734d7d2b7af5755664e2e67910``` for this transaction, and the input data data contains the call to a ```multicall``` method call. This transaction is sent in the direction: 0x851b594033d57c98af753bcb3a7d0237a615de32 -&amp;gt; 0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45. ```0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45 ``` is Uniswap&amp;#39;s router contract address.&lt;br /&gt;&lt;a href="https://stocksharp.com/file/150280
" title="https://stocksharp.com/file/150280
"&gt;https://stocksharp.com/file/150280
&lt;/a&gt;&lt;br /&gt;The ```multicall``` package is parsed to call the contract&amp;#39;s ```exactInputSingle``` and ```unwrapWETH9``` methods and the specific parameters of these methods.&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;----------------exactInputSingle----------------&lt;br /&gt;params: {&lt;br /&gt;    &amp;quot;tokenOut&amp;quot;:&amp;quot;0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&amp;quot;,&lt;br /&gt;    &amp;quot;fee&amp;quot;:&amp;quot;10000&amp;quot;,&lt;br /&gt;    &amp;quot;recipient&amp;quot;:&amp;quot;0x0000000000000000000000000000000000000002&amp;quot;,&lt;br /&gt;    &amp;quot;amountIn&amp;quot;:&amp;quot;8952087000296027130940868&amp;quot;,&lt;br /&gt;    &amp;quot;amountOutMinimum&amp;quot;:&amp;quot;41638694112306829&amp;quot;,&lt;br /&gt;    &amp;quot;sqrtPriceLimitX96&amp;quot;:&amp;quot;0&amp;quot;,&lt;br /&gt;    &amp;quot;tokenIn&amp;quot;:&amp;quot;0xe1283567345349942acdfad3692924a1b16cf3cc&amp;quot;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;----------------unwrapWETH9----------------&lt;br /&gt;amountMinimum: &amp;quot;41638694112306829&amp;quot;&lt;br /&gt;recipient: &amp;quot;0x851b594033d57c98af753bcb3a7d0237a615de32&amp;quot;&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;If you are interested, you can modify and extend the example based on it to monitor more transactions and parse these on-chain operations.&lt;br /&gt;From: &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAAezbpL9G-wNBo0jpp0vfUOQlbPNxIPafGj0KHUDS3Y6ymnjI3ih-EYivoXMTwdB_xImkZVym3MGRgo05CPqrdGrc6JyRY60RJjFc3C_175fTPmWugUrzwB2XAHchNYfKaLj0DETRnzx1bxmPI86Fjo" title="https://blog.mathquant.com/2023/06/30/get-started-with-web3-development-easily-based-on-ethereum-using-fmz.html"&gt;https://blog.mathquant.c...-ethereum-using-fmz.html&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25691/</id>
    <title type="text">Get Started with web3 Development Easily Based on Ethereum Using FMZ (6)</title>
    <published>2024-04-16T03:28:35Z</published>
    <updated>2024-04-16T03:28:35Z</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="#strategy" />
    <category term="#code" />
    <category term="#data" />
    <category term="#fmz" />
    <category term="#exchange" />
    <category term="#javascript" />
    <category term="#Ethereum" />
    <category term="#web3" />
    <content type="html">## Unit conversions&lt;br /&gt;&lt;br /&gt;Many of the calculations related to Ethereum have values that exceed the maximum safe integer of the ```JavaScript``` language. Therefore, some methods are needed on the FMZ Quant Trading Platform to handle large values, which we have used specifically in previous courses and have not covered in detail. This section will discuss this aspect in detail.&lt;br /&gt;&lt;br /&gt;Print the maximum safe integer defined in the ```JavaScript``` language:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function main() {&lt;br /&gt;    Log(&amp;quot;Number.MAX_SAFE_INTEGER:&amp;quot;, Number.MAX_SAFE_INTEGER)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Running results:&lt;br /&gt;&lt;br /&gt;&amp;gt; Number.MAX_SAFE_INTEGER: 9007199254740991&lt;br /&gt;&lt;br /&gt;### BigInt&lt;br /&gt;The smallest unit defined in Ethereum is ```1wei```, and the definition ```1Gwei``` is equal to ```1000000000 wei```. ```1Gwei``` is not really a very large number in Ethereum-related calculations, and some data is much larger than it. So these data with very large values can easily exceed ```Number.MAX_SAFE_INTEGER: 9007199254740991```.&lt;br /&gt;&lt;br /&gt;At FMZ Quant Trading Platform, we use the platform&amp;#39;s ```BigInt``` object to represent these very large integer data. Use the constructor ```BigInt()``` to construct the ```BigInt``` object. You can construct ```BigInt``` objects using numeric, hexadecimal numeric strings as parameters. Use the ```toString()``` method of ```BigInt``` object to output the data represented by the object as a string.&lt;br /&gt;&lt;br /&gt;The operations supported by the ```BigInt``` object are:&lt;br /&gt;&lt;br /&gt;- Addition: ```+```&lt;br /&gt;- Subtraction: ```-```&lt;br /&gt;- Multiplication: ```*```&lt;br /&gt;- Division: ```/```&lt;br /&gt;- Modulo operations: ```%```&lt;br /&gt;- Power operations: ```*```&lt;br /&gt;&lt;br /&gt;Refer to the following code examples:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function main() {&lt;br /&gt;    // Decimal representation of 1Gwei&lt;br /&gt;    var oneGwei = 1000000000&lt;br /&gt;&lt;br /&gt;    // Decimal to hexadecimal conversion of 1Gwei&lt;br /&gt;    var oneGweiForHex = &amp;quot;0x&amp;quot; + oneGwei.toString(16)&lt;br /&gt;&lt;br /&gt;    Log(&amp;quot;oneGwei : &amp;quot;, oneGwei)&lt;br /&gt;    Log(&amp;quot;oneGweiForHex : &amp;quot;, oneGweiForHex)&lt;br /&gt;&lt;br /&gt;    // Constructing BigInt objects&lt;br /&gt;    Log(&amp;quot;1Gwei / 1Gwei : &amp;quot;, (BigInt(oneGwei) / BigInt(oneGweiForHex)).toString(10))&lt;br /&gt;    Log(&amp;quot;1Gwei * 1Gwei : &amp;quot;, (BigInt(oneGwei) * BigInt(oneGweiForHex)).toString(10))&lt;br /&gt;    Log(&amp;quot;1Gwei - 1Gwei : &amp;quot;, (BigInt(oneGwei) - BigInt(oneGweiForHex)).toString(10))&lt;br /&gt;    Log(&amp;quot;1Gwei + 1Gwei : &amp;quot;, (BigInt(oneGwei) + BigInt(oneGweiForHex)).toString(10))&lt;br /&gt;    Log(&amp;quot;(1Gwei + 1) % 1Gwei : &amp;quot;, (BigInt(oneGwei + 1) % BigInt(oneGweiForHex)).toString(10))&lt;br /&gt;    Log(&amp;quot;1Gwei ** 2 : &amp;quot;, (BigInt(oneGwei) ** BigInt(2)).toString(10))&lt;br /&gt;    Log(&amp;quot;The square root of 100 : &amp;quot;, (BigInt(100) ** BigFloat(0.5)).toString(10))&lt;br /&gt;&lt;br /&gt;    Log(&amp;quot;Number.MAX_SAFE_INTEGER : &amp;quot;, BigInt(Number.MAX_SAFE_INTEGER).toString(10))&lt;br /&gt;    Log(&amp;quot;Number.MAX_SAFE_INTEGER * 2 : &amp;quot;, (BigInt(Number.MAX_SAFE_INTEGER) * BigInt(&amp;quot;2&amp;quot;)).toString(10))&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Debugging tool testing:&lt;br /&gt;&lt;br /&gt;```run&lt;br /&gt;2023-06-08 11:39:50		Info	Number.MAX_SAFE_INTEGER * 2 : 18014398509481982&lt;br /&gt;2023-06-08 11:39:50		Info	Number.MAX_SAFE_INTEGER : 9007199254740991&lt;br /&gt;2023-06-08 11:39:50		Info	The square root of 100 : 10&lt;br /&gt;2023-06-08 11:39:50		Info	1Gwei ** 2 : 1000000000000000000&lt;br /&gt;2023-06-08 11:39:50		Info	(1Gwei + 1) % 1Gwei : 1&lt;br /&gt;2023-06-08 11:39:50		Info	1Gwei + 1Gwei : 2000000000&lt;br /&gt;2023-06-08 11:39:50		Info	1Gwei - 1Gwei : 0&lt;br /&gt;2023-06-08 11:39:50		Info	1Gwei * 1Gwei : 1000000000000000000&lt;br /&gt;2023-06-08 11:39:50		Info	1Gwei / 1Gwei : 1&lt;br /&gt;2023-06-08 11:39:50		Info	oneGweiForHex : 0x3b9aca00&lt;br /&gt;2023-06-08 11:39:50		Info	oneGwei : 1000000000&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;### BigFloat&lt;br /&gt;&lt;br /&gt;The ```BigFloat``` object is used similarly to the ```BigInt``` object to represent floating point numbers with larger values, and it also supports addition, subtraction, multiplication and division.&lt;br /&gt;The ```BigFloat``` object supports the ```toFixed()``` method.&lt;br /&gt;&lt;br /&gt;Refer to the following code example:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function main() {&lt;br /&gt;    var pi = 3.14&lt;br /&gt;    var oneGwei = &amp;quot;1000000000&amp;quot;&lt;br /&gt;    var oneGweiForHex = &amp;quot;0x3b9aca00&amp;quot;&lt;br /&gt;&lt;br /&gt;    Log(&amp;quot;pi + oneGwei : &amp;quot;, (BigFloat(pi) + BigFloat(oneGwei)).toFixed(2))&lt;br /&gt;    Log(&amp;quot;pi - oneGweiForHex : &amp;quot;, (BigFloat(pi) - BigFloat(oneGweiForHex)).toFixed(2))&lt;br /&gt;    Log(&amp;quot;pi * 2.0 : &amp;quot;, (BigFloat(pi) * BigFloat(2.0)).toFixed(2))&lt;br /&gt;    Log(&amp;quot;pi / 2.0 : &amp;quot;, (BigFloat(pi) / BigFloat(2.0)).toFixed(2))&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Debugging tool testing:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;2023-06-08 13:56:44		Info	pi / 2.0 : 1.57&lt;br /&gt;2023-06-08 13:56:44		Info	pi * 2.0 : 6.28&lt;br /&gt;2023-06-08 13:56:44		Info	pi - oneGweiForHex : -999999996.86&lt;br /&gt;2023-06-08 13:56:44		Info	pi + oneGwei : 1000000003.14&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;### BigDecimal&lt;br /&gt;&lt;br /&gt;The ```BigDecimal``` object is compatible with integer values and floating point values, and supports initialization with the ```BigInt``` object and the ```BigFloat``` object, and it also supports addition, subtraction, multiplication and division.&lt;br /&gt;&lt;br /&gt;Refer to the following code example:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function main() {&lt;br /&gt;    var pi = 3.1415&lt;br /&gt;    var oneGwei = 1000000000&lt;br /&gt;    var oneGweiForHex = &amp;quot;0x3b9aca00&amp;quot;&lt;br /&gt;&lt;br /&gt;    Log(&amp;quot;pi : &amp;quot;, BigDecimal(pi).toFixed(2))&lt;br /&gt;    Log(&amp;quot;oneGwei : &amp;quot;, BigDecimal(oneGwei).toString())&lt;br /&gt;    Log(&amp;quot;oneGweiForHex : &amp;quot;, BigDecimal(BigInt(oneGweiForHex)).toString())&lt;br /&gt;&lt;br /&gt;    Log(&amp;quot;BigInt(oneGwei) : &amp;quot;, BigDecimal(BigInt(oneGwei)).toString())    &lt;br /&gt;    Log(&amp;quot;BigFloat(pi) : &amp;quot;, BigDecimal(BigFloat(pi)).toFixed(4))&lt;br /&gt;&lt;br /&gt;    Log(&amp;quot;oneGwei + pi : &amp;quot;, (BigDecimal(oneGwei) + BigDecimal(pi)).toString())&lt;br /&gt;    Log(&amp;quot;oneGwei - pi : &amp;quot;, (BigDecimal(oneGwei) - BigDecimal(pi)).toString())&lt;br /&gt;    Log(&amp;quot;2.0 * pi : &amp;quot;, (BigDecimal(2.0) * BigDecimal(pi)).toString())&lt;br /&gt;    Log(&amp;quot;pi / pi : &amp;quot;, (BigDecimal(pi) / BigDecimal(pi)).toString())&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Running in the debugging tool:&lt;br /&gt;&lt;br /&gt;```run&lt;br /&gt;2023-06-08 14:52:53		Info	pi / pi : 1&lt;br /&gt;2023-06-08 14:52:53		Info	2.0 * pi : 6.283&lt;br /&gt;2023-06-08 14:52:53		Info	oneGwei - pi : 999999996.8585&lt;br /&gt;2023-06-08 14:52:53		Info	oneGwei + pi : 1000000003.1415&lt;br /&gt;2023-06-08 14:52:53		Info	BigFloat(pi) : 3.1415&lt;br /&gt;2023-06-08 14:52:53		Info	BigInt(oneGwei) : 1e+9&lt;br /&gt;2023-06-08 14:52:53		Info	oneGweiForHex : 1e+9&lt;br /&gt;2023-06-08 14:52:53		Info	oneGwei : 1e+9&lt;br /&gt;2023-06-08 14:52:53		Info	pi : 3.14&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;### Unit conversions&lt;br /&gt;&lt;br /&gt;The following two functions: ```toAmount()```, ```toInnerAmount()``` we have used many times in previous courses, these two functions are mainly used for data precision conversion.&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;&lt;br /&gt;The ```toAmount()``` function converts (reduces) a variable ```s``` according to the precision parameter ```decimals```. In web3 practical development, it is often necessary to deal with some chained hexadecimal data.&lt;br /&gt;We have often encountered this in our previous courses, for example, the ```data``` field data in the ```Transfer(address,address,uint256)``` event of a smart contract:&lt;br /&gt;&lt;br /&gt;```desc&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;```&lt;br /&gt;&lt;br /&gt;When processing data ```&amp;quot;data&amp;quot;: &amp;quot;0x00000000000000000000000000000000000000000000000001c1a55000000000&amp;quot;```, we use the ```toAmount()``` function. This processing is designed to do a good job of converting data field data to 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;function main() {&lt;br /&gt;    var data = &amp;quot;0x00000000000000000000000000000000000000000000000001c1a55000000000&amp;quot;&lt;br /&gt;    Log(toAmount(data, 18))  // Print out 0.12656402755905127&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;1 ETH token, as we know, is ```1e18 wei```, if we get a data ```126564027559051260``` in ```wei```, how to convert it to ETH tokens?&lt;br /&gt;Using the ```toAmount(, 18)``` function is a very simple conversion method. The ```toInnerAmount()``` function is the reverse operation of the ```toAmount()``` function (depending on the precision, zoom in), and it is easy to convert the data using these two functions.&lt;br /&gt;&lt;br /&gt;It is important to note the integer value safety range in the JavaScript language, ```Number.MAX_SAFE_INTEGER```, and the following example illustrates a hidden problem when converting data:&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;    var amount = 0.01&lt;br /&gt;    var innerAmount = Number(toInnerAmount(amount, 18))       &lt;br /&gt;&lt;br /&gt;    Log(&amp;quot;Number.MAX_SAFE_INTEGER:&amp;quot;, Number.MAX_SAFE_INTEGER)  // 9007199254740991&lt;br /&gt;    Log(&amp;quot;innerAmount:&amp;quot;, innerAmount)                          // 10000000000000000&lt;br /&gt;&lt;br /&gt;    Log(&amp;quot;typeof(innerAmount):&amp;quot;, typeof(innerAmount), &amp;quot;, innerAmount:&amp;quot;, innerAmount)&lt;br /&gt;    &lt;br /&gt;    // Decimal value 10000000000000000 -&amp;gt; Hexadecimal value 0x2386f26fc10000&lt;br /&gt;    Log(&amp;quot;Convert&amp;quot;, innerAmount, &amp;quot;to hexadecimal:&amp;quot;, innerAmount.toString(16))&lt;br /&gt;    Log(&amp;quot;Convert&amp;quot;, BigInt(10000000000000000).toString(10), &amp;quot;to hexadecimal:&amp;quot;, BigInt(10000000000000000).toString(16))&lt;br /&gt;    &lt;br /&gt;    Log(&amp;quot;0x&amp;quot; + BigInt(10000000000000000).toString(16), &amp;quot;Convert to decimal:&amp;quot;, toAmount(&amp;quot;0x&amp;quot; + BigInt(10000000000000000).toString(16), 0))&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;It is possible to run in the debugging tool:&lt;br /&gt;&lt;br /&gt;```run&lt;br /&gt;2023-06-15 16:21:40		Info	Convert 0x2386f26fc10000 to decimal: 10000000000000000&lt;br /&gt;2023-06-15 16:21:40		Info	Convert 10000000000000000 to hexadecimal: 2386f26fc10000&lt;br /&gt;2023-06-15 16:21:40		Info	Convert 10000000000000000 to hexadecimal: 10000000000000000&lt;br /&gt;2023-06-15 16:21:40		Info	typeof(innerAmount): number , innerAmount: 10000000000000000&lt;br /&gt;2023-06-15 16:21:40		Info	innerAmount: 10000000000000000&lt;br /&gt;2023-06-15 16:21:40		Info	Number.MAX_SAFE_INTEGER: 9007199254740991&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Through observation we found that:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;Log(&amp;quot;Convert&amp;quot;, innerAmount, &amp;quot;to hexadecimal:&amp;quot;, innerAmount.toString(16))&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;This line of code corresponds to the log output: ```Converting 10000000000000000 to hex: 10000000000000000```, which is not converted correctly. The reason is naturally that 10000000000000000 is beyond ```Number.MAX_SAFE_INTEGER```.&lt;br /&gt;&lt;br /&gt;But when the decimal value is within the safe range, i.e., less than ```Number.MAX_SAFE_INTEGER```, the ```toString(16)``` function converts it properly again, for example:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function main() {&lt;br /&gt;    var value = 1000&lt;br /&gt;    Log(&amp;quot;Convert value to hexadecimal:&amp;quot;, &amp;quot;0x&amp;quot; + value.toString(16))   // 0x3e8&lt;br /&gt;    Log(&amp;quot;Convert 0x3e8 to decimal:&amp;quot;, Number(&amp;quot;0x3e8&amp;quot;))               // 1000&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;In blockchain, even ```0.01``` ETH converted to a value of ```10000000000000000``` in ```wei``` will exceed ```Number.MAX_SAFE_INTEGER``, so a safer conversion for such cases is: ```BigInt(10000000000000000).toString(16)```.&lt;br /&gt;&lt;br /&gt;## Simulation Calls&lt;br /&gt;&lt;br /&gt;Executing transactions and calling the ```Write``` method of smart contracts on Ethereum costs a certain amount of gas and sometimes it fails. It is important to know which transactions are likely to fail before sending them and calling them. There are simulated calls on Ethereum for testing.&lt;br /&gt;&lt;br /&gt;### eth_call&lt;br /&gt;&lt;br /&gt;Ethereum&amp;#39;s RPC method ```eth_call```: it can simulate a transaction and return the result of a possible transaction, but it does not actually execute the transaction on the blockchain.&lt;br /&gt;&lt;br /&gt;The ```eth_call``` method has 2 parameters, the first one is a dictionary structure, ```transactionObject```:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;// transactionObject&lt;br /&gt;{&lt;br /&gt;    &amp;quot;from&amp;quot; : ...,     // The address from which the transaction is sent&lt;br /&gt;    &amp;quot;to&amp;quot; : ...,       // The address to which the transaction is addressed&lt;br /&gt;    &amp;quot;gas&amp;quot; : ...,      // The integer of gas provided for the transaction execution&lt;br /&gt;    &amp;quot;gasPrice&amp;quot; : ..., // The integer of gasPrice used for each paid gas encoded as hexadecimal&lt;br /&gt;    &amp;quot;value&amp;quot; : ...,    // The integer of value sent with this transaction encoded as hexadecimal&lt;br /&gt;    &amp;quot;data&amp;quot; : ...,     // The hash of the method signature and encoded parameters. For more information, see the Contract ABI description in the Solidity documentation&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;The second parameter is ```blockNumber```: you can pass the label ```latest/pending/earliest```, etc:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;/* blockNumber&lt;br /&gt;The block number in hexadecimal format or the string latest, earliest, pending, safe or &lt;br /&gt;finalized (safe and finalized tags are only supported on Ethereum, Gnosis, Arbitrum, &lt;br /&gt;Arbitrum Nova and Avalanche C-chain), see the default block parameter description in &lt;br /&gt;the official Ethereum documentation&lt;br /&gt;*/&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Next, we take the smart contract method ```approve``` and ```transfer``` calls of the token ```DAI``` as an example for simulation calls, and the following test environment is the main Ethereum network.&lt;br /&gt;&lt;br /&gt;### Simulation call approve&lt;br /&gt;&lt;br /&gt;We are all familiar with the ```approve``` method for ERC20 contracts, and we have practiced it in previous courses. Since the ERC20 contract is already built into the FMZ platform ABI, there is no need to register the ABI of the smart contract to be called by the simulation.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function main() {&lt;br /&gt;    var contractAddressUniswapV3SwapRouterV2 = &amp;quot;0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45&amp;quot;&lt;br /&gt;    var contractAddress_DAI = &amp;quot;0x6b175474e89094c44da98b954eedeac495271d0f&amp;quot;&lt;br /&gt;    var wallet = exchange.IO(&amp;quot;address&amp;quot;)&lt;br /&gt;&lt;br /&gt;    // encode approve&lt;br /&gt;    var data = exchange.IO(&amp;quot;encode&amp;quot;, contractAddress_DAI, &amp;quot;approve(address,uint256)&amp;quot;, &lt;br /&gt;        contractAddressUniswapV3SwapRouterV2, &amp;quot;0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff&amp;quot;)&lt;br /&gt;    Log(&amp;quot;ERC20 token DAI approve encode, data:&amp;quot;, data)&lt;br /&gt;    &lt;br /&gt;    var transactionObject = {&lt;br /&gt;        &amp;quot;from&amp;quot; : wallet,&lt;br /&gt;        &amp;quot;to&amp;quot; : contractAddress_DAI,&lt;br /&gt;        // &amp;quot;gasPrice&amp;quot; : &amp;quot;0x&amp;quot; + parseInt(&amp;quot;21270894680&amp;quot;).toString(16),&lt;br /&gt;        // &amp;quot;gas&amp;quot; : &amp;quot;0x&amp;quot; + parseInt(&amp;quot;21000&amp;quot;).toString(16),&lt;br /&gt;        &amp;quot;data&amp;quot; : &amp;quot;0x&amp;quot; + data,&lt;br /&gt;    }&lt;br /&gt;    var blockNumber = &amp;quot;latest&amp;quot;&lt;br /&gt;    &lt;br /&gt;    var ret = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_call&amp;quot;, transactionObject, blockNumber)&lt;br /&gt;    Log(&amp;quot;ret:&amp;quot;, ret)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;The code in the example first encodes the ```approve(address,uint256)``` method and parameters, and the parameter value ```0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff``` of the ```approve``` method indicates the maximum number of authorizations. Authorization is given to the smart contract at address ```0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45``` i.e. the router contract for ```Uniswap V3```. Finally the Ethereum RPC method ```eth_call``` is called for simulation. You can see that the ```gasPrice``` and ```gas``` fields in the ```transactionObject``` parameters can be omitted.&lt;br /&gt;&lt;br /&gt;The debugging tool is run and the simulation calls the approve method to authorize successfully (it does not authorize actually):&lt;br /&gt;&lt;br /&gt;```run&lt;br /&gt;2023-06-09 11:58:39		Info	ret: 0x0000000000000000000000000000000000000000000000000000000000000001&lt;br /&gt;2023-06-09 11:58:39		Info	ERC20 token DAI approve encode, data: 095ea7b300000000000000000000000068b3465833fb72a70ecdf485e0e4c7bd8665fc45ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;It is also possible to simulate some failure scenarios, when we adjust the ```gasPrice``` and ```gas``` parameters, if the ETH in the wallet is not enough to pay the gas fee, an error will be reported::&lt;br /&gt;&lt;br /&gt;&amp;gt; insufficient funds&lt;br /&gt;&lt;br /&gt;When the gas cost is set too low, an error will be reported:&lt;br /&gt;&lt;br /&gt;&amp;gt; intrinsic gas too low: have 21000, want 21944 (supplied gas 21000)&lt;br /&gt;&lt;br /&gt;### Simulation call transfer&lt;br /&gt;&lt;br /&gt;We are familiar with ERC20&amp;#39;s ```transfer``` method, which allows you to transfer ERC20 tokens to a certain wallet address, so let&amp;#39;s try to simulate a transfer of 1000 DAI to Vitalik Buterin.&lt;br /&gt;&lt;br /&gt;```javascript&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;    var walletVitalik = &amp;quot;0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&amp;quot;&lt;br /&gt;    var contractAddress_DAI = &amp;quot;0x6b175474e89094c44da98b954eedeac495271d0f&amp;quot;&lt;br /&gt;    var wallet = exchange.IO(&amp;quot;address&amp;quot;)&lt;br /&gt;&lt;br /&gt;    // transfer to Vitalik Buterin&lt;br /&gt;    var decimals_DAI = exchange.IO(&amp;quot;api&amp;quot;, contractAddress_DAI, &amp;quot;decimals&amp;quot;)&lt;br /&gt;    var transferAmount = toInnerAmount(1000, decimals_DAI)&lt;br /&gt;    Log(&amp;quot;Transfer amount:&amp;quot;, 1000, &amp;quot;DAI, use toInnerAmount convert to:&amp;quot;, transferAmount)&lt;br /&gt;&lt;br /&gt;    // encode transfer&lt;br /&gt;    var data = exchange.IO(&amp;quot;encode&amp;quot;, contractAddress_DAI, &amp;quot;transfer(address,uint256)&amp;quot;,&lt;br /&gt;        walletVitalik, transferAmount)&lt;br /&gt;&lt;br /&gt;    var transactionObject = {&lt;br /&gt;        &amp;quot;from&amp;quot; : wallet,&lt;br /&gt;        &amp;quot;to&amp;quot; : contractAddress_DAI,&lt;br /&gt;        &amp;quot;data&amp;quot; : &amp;quot;0x&amp;quot; + data,&lt;br /&gt;    }&lt;br /&gt;    var blockNumber = &amp;quot;latest&amp;quot;&lt;br /&gt;    &lt;br /&gt;    var ret = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_call&amp;quot;, transactionObject, blockNumber)&lt;br /&gt;    return ret &lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Since I don&amp;#39;t have DAI tokens in this test wallet, running it in the debug tool reported the following error unexpectedly:&lt;br /&gt;&lt;br /&gt;&amp;gt; execution reverted: Dai/insufficient-balance&lt;br /&gt;&lt;br /&gt;Check the wallet address of Vitalik Buterin: ```0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045```, it is clear that this wallet has DAI tokens. So let&amp;#39;s adjust the transfer direction of the simulation call and simulate the transfer of 1000 DAI from Vitalik Buterin to us.&lt;br /&gt;&lt;br /&gt;Modify the code, where the changes I made comments:&lt;br /&gt;&lt;br /&gt;```javascript&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;    var walletVitalik = &amp;quot;0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&amp;quot;&lt;br /&gt;    var contractAddress_DAI = &amp;quot;0x6b175474e89094c44da98b954eedeac495271d0f&amp;quot;&lt;br /&gt;    var wallet = exchange.IO(&amp;quot;address&amp;quot;)&lt;br /&gt;&lt;br /&gt;    var decimals_DAI = exchange.IO(&amp;quot;api&amp;quot;, contractAddress_DAI, &amp;quot;decimals&amp;quot;)&lt;br /&gt;    var transferAmount = toInnerAmount(1000, decimals_DAI)&lt;br /&gt;    Log(&amp;quot;Transfer amount:&amp;quot;, 1000, &amp;quot;DAI, use toInnerAmount convert to:&amp;quot;, transferAmount)&lt;br /&gt;&lt;br /&gt;    // encode transfer&lt;br /&gt;    var data = exchange.IO(&amp;quot;encode&amp;quot;, contractAddress_DAI, &amp;quot;transfer(address,uint256)&amp;quot;,&lt;br /&gt;        wallet, transferAmount)     // Use the wallet variable as a parameter and change the transfer recipient&amp;#39;s address to my own&lt;br /&gt;&lt;br /&gt;    var transactionObject = {&lt;br /&gt;        &amp;quot;from&amp;quot; : walletVitalik,     // Use the walletVitalik variable as the value of the from field to simulate that the call was made from the Vitalik Buterin&amp;#39;s wallet address&lt;br /&gt;        &amp;quot;to&amp;quot; : contractAddress_DAI,&lt;br /&gt;        &amp;quot;data&amp;quot; : &amp;quot;0x&amp;quot; + data,&lt;br /&gt;    }&lt;br /&gt;    var blockNumber = &amp;quot;latest&amp;quot;&lt;br /&gt;    &lt;br /&gt;    var ret = exchange.IO(&amp;quot;api&amp;quot;, &amp;quot;eth&amp;quot;, &amp;quot;eth_call&amp;quot;, transactionObject, blockNumber)&lt;br /&gt;    Log(ret)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Debugging tool test:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;2023-06-09 13:34:31		Info	0x0000000000000000000000000000000000000000000000000000000000000001&lt;br /&gt;2023-06-09 13:34:31		Info	Transfer amount: 1000 DAI, use toInnerAmount convert to: 1000000000000000000000&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Using the FMZ Quant Trading Platform, it is easy to simulate the results of transactions and avoid unnecessary loss of gas fees from sending potentially failed transactions. We used the example code from this chapter of the course to simulate the call to transfer money to Vitalik Buterin&amp;#39;s wallet and Vitalik Buterin&amp;#39;s wallet to transfer money to us. Of course, there are many more uses for this ```eth_call``` method. Use your imagination, what would you use the ```eth_call``` method for?&lt;br /&gt;&lt;br /&gt;## Identify ERC721 Contracts&lt;br /&gt;&lt;br /&gt;We know that tokens like ETH and BTC are homogenized tokens, and the token in your wallet is not different from the token in my wallet. But there are many things in the world that are not homogeneous, such as real estate, antiques, virtual artwork, etc. These cannot be represented by homogeneous tokens in abstraction. Therefore, there is the ERC721 standard to abstract non-homogeneous objects, and there is NFT and related concepts.&lt;br /&gt;So among the many smart contracts deployed on Ethereum, how do we identify which smart contracts are ERC721 standard smart contracts?&lt;br /&gt;&lt;br /&gt;To identify ERC721, it is important to know the ERC165 standard first.&lt;br /&gt;&lt;br /&gt;### ERC165&lt;br /&gt;With the ERC165 standard, a smart contract can declare the interfaces it supports for other contracts to check. An ERC165 interface contract has only one function: ```supportsInterface(bytes4 interfaceId)```, the parameter ```interfaceId``` is the interface Id to be queried. If the contract implements the interfaceId returns a boolean true value, otherwise it returns a false value.&lt;br /&gt;&lt;br /&gt;Here we are going to talk about how this ```interfaceId``` is calculated and encoded specifically.&lt;br /&gt;&lt;br /&gt;[ERC165 Standard](https://eips.ethereum.org/EIPS/eip-165) shows an example:&lt;br /&gt;&lt;br /&gt;```solidity&lt;br /&gt;pragma solidity ^0.4.20;&lt;br /&gt;&lt;br /&gt;interface Solidity101 {&lt;br /&gt;    function hello() external pure;&lt;br /&gt;    function world(int) external pure;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;contract Selector {&lt;br /&gt;    function calculateSelector() public pure returns (bytes4) {&lt;br /&gt;        Solidity101 i;&lt;br /&gt;        return i.hello.selector ^ i.world.selector;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;For the function signature of the interface (consisting of a function name and a list of parameter types) to perform a dissimilarity operation, for an ERC165 interface contract where the contract has only one function:&lt;br /&gt;&lt;br /&gt;```solidity&lt;br /&gt;pragma solidity ^0.4.20;&lt;br /&gt;&lt;br /&gt;interface ERC165 {&lt;br /&gt;    /// @notice Query if a contract implements an interface&lt;br /&gt;    /// @param interfaceID The interface identifier, as specified in ERC-165&lt;br /&gt;    /// @dev Interface identification is specified in ERC-165. This function&lt;br /&gt;    ///  uses less than 30,000 gas.&lt;br /&gt;    /// @return `true` if the contract implements `interfaceID` and&lt;br /&gt;    ///  `interfaceID` is not 0xffffffff, `false` otherwise&lt;br /&gt;    function supportsInterface(bytes4 interfaceID) external view returns (bool);&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;&amp;gt; The interface identifier for this interface is 0x01ffc9a7. You can calculate this by running bytes4(keccak256(&amp;#39;supportsInterface(bytes4)&amp;#39;)); or using the Selector contract above.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Calculate the function signature directly and take its first 4 bytes to arrive at ```interfaceId```.&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function main() {&lt;br /&gt;    var ret = Encode(&amp;quot;keccak256&amp;quot;, &amp;quot;string&amp;quot;, &amp;quot;hex&amp;quot;, &amp;quot;supportsInterface(bytes4)&amp;quot;)&lt;br /&gt;    Log(&amp;quot;supportsInterface(bytes4) interfaceId:&amp;quot;, &amp;quot;0x&amp;quot; + ret.slice(0, 8))&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Tests can be run in the debug tool at:&lt;br /&gt;&lt;br /&gt;```run&lt;br /&gt;2023-06-13 14:53:35		Info	supportsInterface(bytes4) interfaceId: 0x01ffc9a7&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;It can be seen that the calculated results are consistent with the description in the [ERC165 Standard](https://eips.ethereum.org/EIPS/eip-165) document.&lt;br /&gt;&lt;br /&gt;### ERC721&lt;br /&gt;&lt;br /&gt;Next let&amp;#39;s look at the interface definition of the ERC721 contract standard:&lt;br /&gt;&lt;br /&gt;```solidity&lt;br /&gt;interface ERC721 /* is ERC165 */ {&lt;br /&gt;    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);&lt;br /&gt;&lt;br /&gt;    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);&lt;br /&gt;&lt;br /&gt;    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);&lt;br /&gt;&lt;br /&gt;    function balanceOf(address _owner) external view returns (uint256);&lt;br /&gt;&lt;br /&gt;    function ownerOf(uint256 _tokenId) external view returns (address);&lt;br /&gt;&lt;br /&gt;    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;&lt;br /&gt;&lt;br /&gt;    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;&lt;br /&gt;&lt;br /&gt;    function transferFrom(address _from, address _to, uint256 _tokenId) external payable;&lt;br /&gt;&lt;br /&gt;    function approve(address _approved, uint256 _tokenId) external payable;&lt;br /&gt;&lt;br /&gt;    function setApprovalForAll(address _operator, bool _approved) external;&lt;br /&gt;&lt;br /&gt;    function getApproved(uint256 _tokenId) external view returns (address);&lt;br /&gt;&lt;br /&gt;    function isApprovedForAll(address _owner, address _operator) external view returns (bool);&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;If we want to determine whether a smart contract is an ERC721 contract, first we need to know the ```interfaceId``` of the ERC721 contract before we can try to use the ```supportsInterface(bytes4 interfaceId)``` method to determine it. In previous courses, we have familiarized us with some concepts of the ERC165 standard and the algorithm for calculating the ```interfaceId```, and we write code to calculate directly:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function calcSelector(arrSelector) {&lt;br /&gt;    var ret = null&lt;br /&gt;    if (Array.isArray(arrSelector)) {&lt;br /&gt;        if (arrSelector.length == 1) {&lt;br /&gt;            ret = Encode(&amp;quot;keccak256&amp;quot;, &amp;quot;string&amp;quot;, &amp;quot;hex&amp;quot;, arrSelector[0])&lt;br /&gt;        } else if (arrSelector.length == 0) {&lt;br /&gt;            throw &amp;quot;Error: the number of elements in the array is 0&amp;quot;&lt;br /&gt;        } else {&lt;br /&gt;            var viewEncodeData = null&lt;br /&gt;            for (var i = 0; i &amp;lt; arrSelector.length; i++) {&lt;br /&gt;                if (i == 0) {&lt;br /&gt;                    ret = new Uint8Array(Encode(&amp;quot;keccak256&amp;quot;, &amp;quot;string&amp;quot;, &amp;quot;raw&amp;quot;, arrSelector[i]))&lt;br /&gt;                } else {&lt;br /&gt;                    viewData = new Uint8Array(Encode(&amp;quot;keccak256&amp;quot;, &amp;quot;string&amp;quot;, &amp;quot;raw&amp;quot;, arrSelector[i]))&lt;br /&gt;                    &lt;br /&gt;                    if (viewData.length != ret.length) {&lt;br /&gt;                        throw &amp;quot;Error: TypeArray view length is different&amp;quot;&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    for (var index = 0; index &amp;lt; ret.length; index++) {&lt;br /&gt;                        ret[index] ^= viewData[index]&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            ret = Encode(&amp;quot;raw&amp;quot;, &amp;quot;raw&amp;quot;, &amp;quot;hex&amp;quot;, ret.buffer)&lt;br /&gt;        }&lt;br /&gt;    } else {&lt;br /&gt;        throw &amp;quot;Error: The parameter requires an array type.&amp;quot;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return &amp;quot;0x&amp;quot; + ret.slice(0, 8)&lt;br /&gt;}&lt;br /&gt;function main() {&lt;br /&gt;    // supportsInterface(bytes4): 0x01ffc9a7&lt;br /&gt;    // var ret = calcSelector([&amp;quot;supportsInterface(bytes4)&amp;quot;])&lt;br /&gt;&lt;br /&gt;    // ERC721Metadata: 0x5b5e139f&lt;br /&gt;    /* &lt;br /&gt;    var arrSelector = [&lt;br /&gt;        &amp;quot;name()&amp;quot;,&lt;br /&gt;        &amp;quot;symbol()&amp;quot;,&lt;br /&gt;        &amp;quot;tokenURI(uint256)&amp;quot;&lt;br /&gt;    ]&lt;br /&gt;    var ret = calcSelector(arrSelector)&lt;br /&gt;    */&lt;br /&gt;&lt;br /&gt;    // ERC721: 0x80ac58cd&lt;br /&gt;    // /*&lt;br /&gt;    var arrSelector = [&lt;br /&gt;        &amp;quot;balanceOf(address)&amp;quot;,&lt;br /&gt;        &amp;quot;ownerOf(uint256)&amp;quot;,&lt;br /&gt;        &amp;quot;safeTransferFrom(address,address,uint256,bytes)&amp;quot;,&lt;br /&gt;        &amp;quot;safeTransferFrom(address,address,uint256)&amp;quot;,&lt;br /&gt;        &amp;quot;transferFrom(address,address,uint256)&amp;quot;,&lt;br /&gt;        &amp;quot;approve(address,uint256)&amp;quot;,&lt;br /&gt;        &amp;quot;setApprovalForAll(address,bool)&amp;quot;,&lt;br /&gt;        &amp;quot;getApproved(uint256)&amp;quot;,&lt;br /&gt;        &amp;quot;isApprovedForAll(address,address)&amp;quot;,&lt;br /&gt;    ]&lt;br /&gt;    var ret = calcSelector(arrSelector)&lt;br /&gt;    // */&lt;br /&gt;&lt;br /&gt;    Log(ret)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;The code uses the ```Encode()``` function for function signature calculation (the ```keccak256``` algorithm), and for the calculation in the code example above, specifying the output parameter of the ```Encode()``` function as ```&amp;quot;raw&amp;quot;```, the function returns the ```ArrayBuffer``` type of ```JavaScript``` language.&lt;br /&gt;To perform a ```^``` (iso-or) operation on two ```ArrayBuffer``` objects, you need to create a ```TypedArray``` view based on the ```ArrayBuffer``` object, then iterate through the data in it and perform the iso-or operation one by one.&lt;br /&gt;&lt;br /&gt;Run in the debugging tool:&lt;br /&gt;&lt;br /&gt;```run&lt;br /&gt;2023-06-13 15:04:09		Info	0x80ac58cd&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;It can be seen that the calculated results are consistent with those described in [eip-721](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md).&lt;br /&gt;&lt;br /&gt;```solidity&lt;br /&gt;pragma solidity ^0.4.20;&lt;br /&gt;&lt;br /&gt;/// @title ERC-721 Non-Fungible Token Standard/// @dev See &lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAAB2KlHRoXVxIU2AJR3lo1zQ8J7vOTcUmTEyErNTCYa3eZjL8pYqOzBfIhhm6tihYVE" title="https://eips.ethereum.org/EIPS/eip-721/// "&gt;https://eips.ethereum.org/EIPS/eip-721/// &lt;/a&gt; Note: the ERC-165 identifier for this interface is 0x80ac58cd.interface ERC721 /* is ERC165 */ {&lt;br /&gt;    /// @dev This emits when ownership of any NFT changes by any mechanism.&lt;br /&gt;    ///  This event emits when NFTs are created (`from` == 0) and destroyed&lt;br /&gt;    ///  (`to` == 0). Exception: during contract creation, any number of NFTs&lt;br /&gt;    ///  may be created and assigned without emitting Transfer. At the time of&lt;br /&gt;    ///  any transfer, the approved address for that NFT (if any) is reset to none.&lt;br /&gt;    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;With the ERC721 interface Id, we can determine if a contract is an ERC721 standard contract or not. We use ```BAYC``` to do the test, which is a contract that follows ERC721. First we need to register the ABI, and since we only call the following three methods, we can register these three methods:&lt;br /&gt;&lt;br /&gt;- supportsInterface(interfaceId)&lt;br /&gt;- symbol()&lt;br /&gt;- name()&lt;br /&gt;&lt;br /&gt;The specific codes are as follows:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;function main() {&lt;br /&gt;    // Contract address for ERC721, BAYC is used here&lt;br /&gt;    var testContractAddress = &amp;quot;0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d&amp;quot;&lt;br /&gt;&lt;br /&gt;    var testABI = `[{&lt;br /&gt;        &amp;quot;inputs&amp;quot;: [{&lt;br /&gt;            &amp;quot;internalType&amp;quot;: &amp;quot;bytes4&amp;quot;,&lt;br /&gt;            &amp;quot;name&amp;quot;: &amp;quot;interfaceId&amp;quot;,&lt;br /&gt;            &amp;quot;type&amp;quot;: &amp;quot;bytes4&amp;quot;&lt;br /&gt;        }],&lt;br /&gt;        &amp;quot;name&amp;quot;: &amp;quot;supportsInterface&amp;quot;,&lt;br /&gt;        &amp;quot;outputs&amp;quot;: [{&lt;br /&gt;            &amp;quot;internalType&amp;quot;: &amp;quot;bool&amp;quot;,&lt;br /&gt;            &amp;quot;name&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;            &amp;quot;type&amp;quot;: &amp;quot;bool&amp;quot;&lt;br /&gt;        }],&lt;br /&gt;        &amp;quot;stateMutability&amp;quot;: &amp;quot;view&amp;quot;,&lt;br /&gt;        &amp;quot;type&amp;quot;: &amp;quot;function&amp;quot;&lt;br /&gt;    }, {&lt;br /&gt;        &amp;quot;inputs&amp;quot;: [],&lt;br /&gt;        &amp;quot;name&amp;quot;: &amp;quot;symbol&amp;quot;,&lt;br /&gt;        &amp;quot;outputs&amp;quot;: [{&lt;br /&gt;            &amp;quot;internalType&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;            &amp;quot;name&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;            &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;        }],&lt;br /&gt;        &amp;quot;stateMutability&amp;quot;: &amp;quot;view&amp;quot;,&lt;br /&gt;        &amp;quot;type&amp;quot;: &amp;quot;function&amp;quot;&lt;br /&gt;    }, {&lt;br /&gt;        &amp;quot;inputs&amp;quot;: [],&lt;br /&gt;        &amp;quot;name&amp;quot;: &amp;quot;name&amp;quot;,&lt;br /&gt;        &amp;quot;outputs&amp;quot;: [{&lt;br /&gt;            &amp;quot;internalType&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;            &amp;quot;name&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;            &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;        }],&lt;br /&gt;        &amp;quot;stateMutability&amp;quot;: &amp;quot;view&amp;quot;,&lt;br /&gt;        &amp;quot;type&amp;quot;: &amp;quot;function&amp;quot;&lt;br /&gt;    }]`&lt;br /&gt;&lt;br /&gt;    // ERC721 Interface Id, calculated in the previous course&lt;br /&gt;    var interfaceId = &amp;quot;0x80ac58cd&amp;quot;&lt;br /&gt;&lt;br /&gt;    // Register ABI&lt;br /&gt;    exchange.IO(&amp;quot;abi&amp;quot;, testContractAddress, testABI)&lt;br /&gt;&lt;br /&gt;    // Call the supportsInterface method&lt;br /&gt;    var isErc721 = exchange.IO(&amp;quot;api&amp;quot;, testContractAddress, &amp;quot;supportsInterface&amp;quot;, interfaceId)&lt;br /&gt;&lt;br /&gt;    // Output Information&lt;br /&gt;    Log(&amp;quot;Contract address:&amp;quot;, testContractAddress)&lt;br /&gt;    Log(&amp;quot;Contract name:&amp;quot;, exchange.IO(&amp;quot;api&amp;quot;, testContractAddress, &amp;quot;name&amp;quot;))&lt;br /&gt;    Log(&amp;quot;Contract code:&amp;quot;, exchange.IO(&amp;quot;api&amp;quot;, testContractAddress, &amp;quot;symbol&amp;quot;))&lt;br /&gt;    Log(&amp;quot;Whether the contract is ERC721 standard:&amp;quot;, isErc721)&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;Tests can be run in the debugging tool:&lt;br /&gt;&lt;br /&gt;```run&lt;br /&gt;2023-06-13 16:32:57		Info	Whether the contract is ERC721 standard: true&lt;br /&gt;2023-06-13 16:32:57		Info	Contract code: BAYC&lt;br /&gt;2023-06-13 16:32:57		Info	Contract name: BoredApeYachtClub&lt;br /&gt;2023-06-13 16:32:57		Info	Contract address: 0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;The contract with the address ```0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d``` is determined to be ERC721 standard.&lt;br /&gt;&lt;br /&gt;In this part, we introduced how to determine ERC721 contracts, so contracts like ERC20, which do not support the ERC165 standard, will have to be identified in another way. Do you know how to check if a contract is ERC20 standard?&lt;br /&gt;&lt;br /&gt;## Encoding calldata&lt;br /&gt;&lt;br /&gt;What is ```calldata```? By the author&amp;#39;s understanding, a simple layman&amp;#39;s description here is:&lt;br /&gt;&lt;br /&gt;&amp;gt; The &amp;quot;calldata&amp;quot; is the encoding of a function call or parameter in Ethereum, and the &amp;quot;calldata&amp;quot; is encoded according to the ABI (Application Binary Interface) specification of the contract.&lt;br /&gt;&lt;br /&gt;For example, we can encode the ```balanceOf``` and ```transfer``` method calls of the ERC20 contract we studied in the previous course, together with the parameters of the calls, into a ```calldata```. In some application scenarios, such as **interaction between contracts**, this scenario will use ```calldata```, and of course there are many other application scenarios that are not listed here.&lt;br /&gt;&lt;br /&gt;How to code a smart contract function call to get ```calldata```?&lt;br /&gt;&lt;br /&gt;In the FMZ Quant Trading Platform, you can use ```exchange.IO(&amp;quot;encode&amp;quot;, ...)``` to encode smart contract function calls, the use of exchange.IO(&amp;quot;encode&amp;quot;, ...) is very simple. The first parameter of the function is the fixed string ```&amp;quot;encode&amp;quot;```; the second parameter is the address of the smart contract; the third parameter is the name of the smart contract method to be encoded; the rest of the parameters are passed to the specific parameter value of the smart contract method to be encoded.&lt;br /&gt;&lt;br /&gt;### eth_sendRawTransaction&lt;br /&gt;&lt;br /&gt;When we encode a smart contract method call and generate the corresponding ```calldata``` data, if this smart contract method is a Write method (i.e.: write operation), we need to use the generated ```calldata``` data as the data field of the transaction and then use the Ethereum RPC method ```eth_ sendRawTransaction``` to send a request containing the raw data of that transaction to the Ethereum network.&lt;br /&gt;&lt;br /&gt;The ```eth_sendRawTransaction``` method has only one parameter, ```data```:&lt;br /&gt;&lt;br /&gt;&amp;gt; data: The signed transaction (typically signed with a library, using your private key)&lt;br /&gt;&lt;br /&gt;The ```data``` parameter is a transaction data after the signature calculation, and the transaction data structure of Ethereum has the following main fields:&lt;br /&gt;&lt;br /&gt;```javascript&lt;br /&gt;{&lt;br /&gt;    &amp;quot;nonce&amp;quot;: &amp;quot;0x1&amp;quot;,                         // Number of transactions on the account of the sender of the transaction&lt;br /&gt;    &amp;quot;gasPrice&amp;quot;: &amp;quot;0x12a05f200&amp;quot;,              // Traded Gas price&lt;br /&gt;    &amp;quot;gasLimit&amp;quot;: &amp;quot;0x5208&amp;quot;,                   // Gas limit for trading&lt;br /&gt;    &amp;quot;to&amp;quot;: &amp;quot;0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2&amp;quot;,    // Target contract address or recipient address&lt;br /&gt;    &amp;quot;value&amp;quot;: &amp;quot;0x4563918244F40000&amp;quot;,          // Number of Ethereum transferred&lt;br /&gt;    &amp;quot;data&amp;quot;: &amp;quot;0x0123456789ABCDEF&amp;quot;,           // Data to send to the contract&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;How to sign an Ethereum transaction?&lt;br /&gt;&lt;br /&gt;In the FMZ Quant Trading Platform, we use the ```Encode()``` function to perform the signature calculation, the specific example we write in the subsequent course &amp;quot;Execute Write method calldata&amp;quot;.&lt;br /&gt;&lt;br /&gt;To be continued...</content>
  </entry>
  <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/25678/</id>
    <title type="text">Release notes 4/12/2024</title>
    <published>2024-04-12T19:08:45Z</published>
    <updated>2024-04-12T19:08:45Z</updated>
    <author>
      <name>StockSharp</name>
      <uri>https://stocksharp.com/users/1/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;a href="https://stocksharp.com/store/matlab/" title="MatLab - integration StockSharp with MatLab application"&gt;MatLab&lt;/a&gt; (v5.0.157):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes. &lt;br /&gt;BaseOptimizer. Fix finish &lt;br /&gt;GeneticOptimizer. Check step on zero &lt;br /&gt;GeneticOptimizer supports negative range &lt;br /&gt;DESIGNER-187 Fix max drawdown in optimizer. Related with issue &lt;a target="_blank" href="https://github.com/StockSharp/StockSharp/issues/48 " title="https://github.com/StockSharp/StockSharp/issues/48 "&gt;https://github.com/Stock...rp/StockSharp/issues/48 &lt;/a&gt;&lt;br /&gt;Optimizer supported bool parameters. &lt;br /&gt;IStrategyParam. CanOptimize has setter&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/interactivebrokers/" title="Interactive Brokers connector"&gt;InteractiveBrokers connector&lt;/a&gt; (v5.0.162):&lt;br /&gt;Doc link fixes. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/micex/" title="ASTSBridge"&gt;ASTSBridge&lt;/a&gt; (v5.0.164):&lt;br /&gt;Doc link fixes. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/cgate-plaza/" title="Plaza connector"&gt;Plaza&lt;/a&gt; (v5.0.168):&lt;br /&gt;Doc link fixes. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/transaq/" title="Transaq"&gt;Transaq&lt;/a&gt; (v5.0.162):&lt;br /&gt;Doc link fixes. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/lmax/" title="LMAX"&gt;LMAX&lt;/a&gt; (v5.0.161):&lt;br /&gt;Doc link fixes. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/fix_fast/" title="FIX/FAST"&gt;FIX&lt;/a&gt; (v5.0.177):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/fast/" title="FAST"&gt;FAST connector&lt;/a&gt; (v5.0.11):&lt;br /&gt;Doc link fixes. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/iqfeed/" title="IQFeed"&gt;IQFeed&lt;/a&gt; (v5.0.159):&lt;br /&gt;Doc link fixes. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/rss-connector/" title="RSS"&gt;RSS&lt;/a&gt; (v5.0.162):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/barchart/" title="BarChart"&gt;BarChart&lt;/a&gt; (v5.0.162):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/rithmic/" title="Rithmic"&gt;Rithmic&lt;/a&gt; (v5.0.164):&lt;br /&gt;Doc link fixes. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/twime/" title="TWIME"&gt;TWIME&lt;/a&gt; (v5.0.163):&lt;br /&gt;Doc link fixes. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/spbex/" title=" SpbEX"&gt;SpbEX&lt;/a&gt; (v5.0.156):&lt;br /&gt;Doc link fixes. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/quanthouse/" title="QuantFEED"&gt;QuantFEED&lt;/a&gt; (v5.0.164):&lt;br /&gt;Doc link fixes. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/alphavantage/" title="AlphaVantage"&gt;AlphaVantage&lt;/a&gt; (v5.0.162):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/alor-history/" title="AlorHistory"&gt;AlorHistory&lt;/a&gt; (v5.0.162):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/dukascopy/" title="DukasCopy"&gt;DukasCopy&lt;/a&gt; (v5.0.162):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/yahoo-finance/" title="Yahoo Finance"&gt;Yahoo Finance&lt;/a&gt; (v5.0.162):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/finamconnector/" title="Finam"&gt;Finam connector&lt;/a&gt; (v5.0.164):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/mfd/" title="MFD"&gt;MFD&lt;/a&gt; (v5.0.162):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/bibox/" title="Bibox"&gt;Bibox&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/binance/" title="Binance"&gt;Binance&lt;/a&gt; (v5.0.164):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/bitalong/" title=" S#.Bitalong"&gt;Bitalong&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/bitbank/" title="Bitbank"&gt;Bitbank&lt;/a&gt; (v5.0.160):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/bitexbook/" title="Bitexbook"&gt;Bitexbook&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/bitfinex/" title="Bitfinex"&gt;Bitfinex&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/bithumb/" title="Bithumb"&gt;Bithumb&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/bitmax/" title="Bitmax"&gt;BitMax&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/bitmex/" title="Bitmex"&gt;Bitmex&lt;/a&gt; (v5.0.161):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/bitstamp/" title="Bitstamp"&gt;BitStamp&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/bittrex/" title="Bittrex"&gt;Bittrex&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/bitz/" title="BitZ"&gt;BitZ&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/btce/" title="Btce"&gt;Btce&lt;/a&gt; (v5.0.158):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/bw/" title="BW "&gt;BW&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/cex/" title="CEX"&gt;Cex&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/coinbase/" title=" S#.Coinbase"&gt;Coinbase&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/coinbene/" title="CoinBene"&gt;CoinBene&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/coincap/" title="CoinCap"&gt;CoinCap&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/coincheck/" title="Coincheck"&gt;Coincheck&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/coinex/" title="CoinEx"&gt;CoinEx&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/coinexchange/" title="CoinExchange"&gt;CoinExchange&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/coinhub/" title="CoinHub"&gt;CoinHub&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/coinigy/" title="Coinigy"&gt;Coinigy&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/cryptopia/" title="Cryptopia"&gt;Cryptopia&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/deribit/" title="Deribit"&gt;Deribit&lt;/a&gt; (v5.0.163):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/digifinex/" title=" S#.DigiFinex"&gt;Digifinex&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/digitexfutures/" title="DigitexFutures"&gt;DigitexFutures&lt;/a&gt; (v5.0.160):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/exmo/" title="Exmo"&gt;Exmo&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/fatbtc/" title="FatBTC"&gt;FatBtc&lt;/a&gt; (v5.0.158):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/gdax/" title="GDAX"&gt;Gdax&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/gopax/" title="GoPax"&gt;Gopax&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/hitbtc/" title="HitBTC"&gt;HitBtc&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/hotbit/" title="Hotbit"&gt;Hotbit&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/huobi/" title="HTX connector"&gt;HTX connector&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/idax/" title="IDAX"&gt;Idax&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/kraken/" title="Kraken"&gt;Kraken&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/kucoin/" title="KuCoin"&gt;Kucoin&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/latoken/" title="Latoken"&gt;Latoken&lt;/a&gt; (v5.0.158):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/lbank/" title="LBank"&gt;LBank&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/liqui/" title="Liqui"&gt;Liqui&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/livecoin/" title="LiveCoin"&gt;LiveCoin&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/okcoin/" title="OKCoin"&gt;Okcoin&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/okex/" title="OKX connector"&gt;OKX&lt;/a&gt; (v5.0.164):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/poloniex/" title="Poloniex"&gt;Poloniex&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/prizmbit/" title="PrizmBit"&gt;PrizmBit&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/quoinex/" title="Quoinex"&gt;Quoinex&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/tradeogre/" title="TradeOgre"&gt;TradeOgre&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/upbit/" title="Upbit "&gt;Upbit&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/yobit/" title="Yobit"&gt;Yobit&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/zaif/" title="Zaif"&gt;Zaif&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/zb/" title="ZB "&gt;ZB&lt;/a&gt; (v5.0.159):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/trading-terminal/" title="Terminal - free trading terminal and charting application for manual trading"&gt;Terminal&lt;/a&gt; (v5.0.165):&lt;br /&gt;Doc link fixes. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;BaseOptimizer. Fix finish &lt;br /&gt;GeneticOptimizer. Check step on zero &lt;br /&gt;GeneticOptimizer supports negative range &lt;br /&gt;DESIGNER-187 Fix max drawdown in optimizer. Related with issue &lt;a target="_blank" href="https://github.com/StockSharp/StockSharp/issues/48 " title="https://github.com/StockSharp/StockSharp/issues/48 "&gt;https://github.com/Stock...rp/StockSharp/issues/48 &lt;/a&gt;&lt;br /&gt;Optimizer supported bool parameters. &lt;br /&gt;IStrategyParam. CanOptimize has setter &lt;br /&gt;DESIGNER-187 Fix max drawdown in optimizer. &lt;br /&gt;Non generic version of BaseEnumerableEdit &lt;br /&gt;PropertyGridEx. Made ReadOnly one way binding. &lt;br /&gt;Hydra. Analytics templates icons. &lt;br /&gt;Ecng.HtmlRenderer&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/strategy-designer/" title="Designer: A Free App for Creating Algorithmic Trading Strategies Without Coding"&gt;Designer&lt;/a&gt; (v5.0.167):&lt;br /&gt;Doc link fixes. &lt;br /&gt;Save selected instrument while cloud backtesting started. &lt;br /&gt;Optimizer. Fix fill params &lt;br /&gt;Optimized. Add params validation. &lt;br /&gt;Optimization. Supported exact values configuration. &lt;br /&gt;Optimizer supported bool parameters. &lt;br /&gt;Fix try start cloud backtest for unknown security. &lt;br /&gt;DESIGNER-216. Fix select newly downloaded security &lt;br /&gt;IStrategyParam. CanOptimize has setter &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;BaseOptimizer. Fix finish &lt;br /&gt;GeneticOptimizer. Check step on zero &lt;br /&gt;GeneticOptimizer supports negative range &lt;br /&gt;DESIGNER-187 Fix max drawdown in optimizer. Related with issue &lt;a target="_blank" href="https://github.com/StockSharp/StockSharp/issues/48 " title="https://github.com/StockSharp/StockSharp/issues/48 "&gt;https://github.com/Stock...rp/StockSharp/issues/48 &lt;/a&gt;&lt;br /&gt;DESIGNER-187 Fix max drawdown in optimizer. &lt;br /&gt;Non generic version of BaseEnumerableEdit &lt;br /&gt;PropertyGridEx. Made ReadOnly one way binding. &lt;br /&gt;Hydra. Analytics templates icons. &lt;br /&gt;Ecng.HtmlRenderer&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/market-data-downloader/" title="Hydra free market data downloader and database"&gt;Hydra&lt;/a&gt; (v5.0.169):&lt;br /&gt;Doc link fixes. &lt;br /&gt;Doc link fixes &lt;br /&gt; Analytics templates icons. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;BaseOptimizer. Fix finish &lt;br /&gt;GeneticOptimizer. Check step on zero &lt;br /&gt;GeneticOptimizer supports negative range &lt;br /&gt;DESIGNER-187 Fix max drawdown in optimizer. Related with issue &lt;a target="_blank" href="https://github.com/StockSharp/StockSharp/issues/48 " title="https://github.com/StockSharp/StockSharp/issues/48 "&gt;https://github.com/Stock...rp/StockSharp/issues/48 &lt;/a&gt;&lt;br /&gt;Optimizer supported bool parameters. &lt;br /&gt;IStrategyParam. CanOptimize has setter &lt;br /&gt;DESIGNER-187 Fix max drawdown in optimizer. &lt;br /&gt;Non generic version of BaseEnumerableEdit &lt;br /&gt;PropertyGridEx. Made ReadOnly one way binding. &lt;br /&gt;Hydra. Analytics templates icons. &lt;br /&gt;Ecng.HtmlRenderer&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/udpdumper/" title="UDP Dumper"&gt;UDP Dumper&lt;/a&gt; (v5.0.136):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes. &lt;br /&gt;BaseOptimizer. Fix finish &lt;br /&gt;GeneticOptimizer. Check step on zero &lt;br /&gt;GeneticOptimizer supports negative range &lt;br /&gt;DESIGNER-187 Fix max drawdown in optimizer. Related with issue &lt;a target="_blank" href="https://github.com/StockSharp/StockSharp/issues/48 " title="https://github.com/StockSharp/StockSharp/issues/48 "&gt;https://github.com/Stock...rp/StockSharp/issues/48 &lt;/a&gt;&lt;br /&gt;Optimizer supported bool parameters. &lt;br /&gt;IStrategyParam. CanOptimize has setter &lt;br /&gt;DESIGNER-187 Fix max drawdown in optimizer. &lt;br /&gt;Non generic version of BaseEnumerableEdit &lt;br /&gt;PropertyGridEx. Made ReadOnly one way binding. &lt;br /&gt;Hydra. Analytics templates icons. &lt;br /&gt;Ecng.HtmlRenderer&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/oanda/" title="Oanda"&gt;Oanda&lt;/a&gt; (v5.0.161):&lt;br /&gt;Doc link fixes. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/udpdumper_console/" title="UDP Dumper. Console version"&gt;UDPDumper.Console&lt;/a&gt; (v5.0.123):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/moex-iss/" title="MOEX ISS"&gt;MOEX ISS&lt;/a&gt; (v5.0.35):&lt;br /&gt;Doc link fixes. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/runner/" title="Runner - cross platform application to run any types of strategies"&gt;Runner&lt;/a&gt; (v5.0.24):&lt;br /&gt;Fix handling negative steps. &lt;br /&gt;Auto-stop strategies without market data subscriptions. &lt;br /&gt;MaxMessageCount usage. &lt;br /&gt;Handle pipe commands in async. &lt;br /&gt;Sends logs by pipe. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes. &lt;br /&gt;BaseOptimizer. Fix finish &lt;br /&gt;GeneticOptimizer. Check step on zero &lt;br /&gt;GeneticOptimizer supports negative range &lt;br /&gt;DESIGNER-187 Fix max drawdown in optimizer. Related with issue &lt;a target="_blank" href="https://github.com/StockSharp/StockSharp/issues/48 " title="https://github.com/StockSharp/StockSharp/issues/48 "&gt;https://github.com/Stock...rp/StockSharp/issues/48 &lt;/a&gt;&lt;br /&gt;Optimizer supported bool parameters. &lt;br /&gt;IStrategyParam. CanOptimize has setter &lt;br /&gt;DESIGNER-187 Fix max drawdown in optimizer.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/alor/" title="Alor connector"&gt;Alor&lt;/a&gt; (v5.0.33):&lt;br /&gt;Doc link fixes. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/tinkoff/" title="Tinkoff connector"&gt;Tinkoff&lt;/a&gt; (v5.0.33):&lt;br /&gt;Doc link fixes. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/hydra-server/" title="Hydra server"&gt;Hydra server&lt;/a&gt; (v5.0.29):&lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property &lt;br /&gt;Doc link fixes. &lt;br /&gt;BaseOptimizer. Fix finish &lt;br /&gt;GeneticOptimizer. Check step on zero &lt;br /&gt;GeneticOptimizer supports negative range &lt;br /&gt;DESIGNER-187 Fix max drawdown in optimizer. Related with issue &lt;a target="_blank" href="https://github.com/StockSharp/StockSharp/issues/48 " title="https://github.com/StockSharp/StockSharp/issues/48 "&gt;https://github.com/Stock...rp/StockSharp/issues/48 &lt;/a&gt;&lt;br /&gt;Optimizer supported bool parameters. &lt;br /&gt;IStrategyParam. CanOptimize has setter&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/polygonio/" title="PolygonIO connector"&gt;PolygonIO&lt;/a&gt; (v5.0.24):&lt;br /&gt;Doc link fixes. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property&lt;br /&gt;&lt;br /&gt;&lt;a href="https://stocksharp.com/store/alpaca/" title="Alpaca Markets connector"&gt;Alpaca Markets&lt;/a&gt; (v5.0.4):&lt;br /&gt;Doc link fixes. &lt;br /&gt;HistoryEmulationConnector. MaxMessageCount property&lt;br /&gt;&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.com/topic/25653/</id>
    <title type="text">Release notes 4/4/2024</title>
    <published>2024-04-04T10:38:54Z</published>
    <updated>2024-04-04T10:38:54Z</updated>
    <author>
      <name>StockSharp</name>
      <uri>https://stocksharp.com/users/1/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;a href="https://stocksharp.com/store/trading-shell/" title="Shell for your algo strategy with C# source codes"&gt;Shell&lt;/a&gt; (v5.0.36):&lt;br /&gt;global usings.cs &lt;br /&gt;IStudioControl. Icon property. Uri -&amp;gt; ImageSource. &lt;br /&gt;StrategiesDashboard refactoring.&lt;br /&gt;&lt;br /&gt;</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>
</feed>