{"id":338242,"date":"2022-09-12T09:00:18","date_gmt":"2022-09-12T09:00:18","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=338242"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=338242","title":{"rendered":"<span>Uniswap v3 Providing Liquidity (\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0433\u0430\u0439\u0434\u0430)<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u042d\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0433\u0430\u0439\u0434\u043e\u0432 Uniswap v3. <a href=\"https:\/\/habr.com\/ru\/post\/684872\/\" rel=\"noopener noreferrer nofollow\">\u0422\u0443\u0442 \u043f\u0435\u0440\u0432\u0430\u044f<\/a><\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0433\u0430\u0439\u0434\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 Periphery Uniswap V3 \u043f\u0443\u0442\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438 \u0441\u0431\u043e\u0440\u0430 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0439.<\/p>\n<p>\u041f\u043e\u0434 <strong>Periphery Uniswap V3<\/strong> \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u044f\u0434 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 core Uniswap V3.\u041e\u043d\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u043d\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b,\u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 core Uniswap V3 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u0444\u0435\u0440\u0438\u0438<\/p>\n<p><strong>\u0421ore Uniswap V3<\/strong> &#8212; \u044d\u0442\u043e \u0440\u044f\u0434 \u0441\u043c\u0430\u0440\u0442-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u0432, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f Uniswap. \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u044f\u0434\u0440\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u043b\u043e\u0433\u0438\u043a\u0438 \u043b\u0438\u043a\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/docs.uniswap.org\/protocol\/V2\/concepts\/protocol-overview\/glossary\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>\u041e\u0431\u044a\u044f\u0432\u0438\u043c \u0432\u0435\u0440\u0441\u0438\u044e Solidity, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0443\u044e \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430, \u0438 abicoder v2, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0432 calldata ( \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043f\u0443\u043b\u043e\u043c).<\/p>\n<pre><code class=\"cpp\">\/\/ SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.8.0; pragma abicoder v2;<\/code><\/pre>\n<p>\u041f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u0438\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c***(\u043d\u0430 \u044d\u0442\u043e\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435)<\/p>\n<pre><code class=\"cpp\">import \"@openzeppelin\/contracts\/token\/ERC721\/IERC721Receiver.sol\";  import \"@uniswap\/v3-periphery\/contracts\/interfaces\/INonfungiblePositionManager.sol\"; import \"@uniswap\/v3-periphery\/contracts\/libraries\/TransferHelper.sol\";<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c LiquidityExamples \u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043e\u0442 IERC721Receiver. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0443 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438  IERC721<\/p>\n<p> \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430,\u0430\u0434\u0440\u0435\u0441\u0430 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u0432 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 (\u0442\u0443\u0442 DAI \u0438 <code>WETH9<\/code>) \u0438 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u044b \u043f\u043b\u0430\u0442\u044b \u0437\u0430 \u043f\u0443\u043b  \u043c\u044b \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0438\u043b\u0438. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e,\u0447\u0442\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0438 \u043f\u0443\u043b\u044b, \u0438 \u0442\u043e\u043a\u0435\u043d\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438.  <\/p>\n<pre><code class=\"cpp\">contract LiquidityExamples is IERC721Receiver {      address public constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;     address public constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;      uint24 public constant poolFee = 3000; <\/code><\/pre>\n<p> \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>nonfungiblePositionManager <\/code>\u0442\u0438\u043f\u0430 <code>InonfungiblePositionManager<\/code>(\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a Periphery Uniswap V3 ) \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u0438 immutable public.<\/p>\n<p>(nonfungiblePositionManager \u043f\u043e \u0441\u0443\u0442\u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 Position,\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u043e Position \u0434\u0435\u043b\u0430\u0435\u0442 nft-\u0448\u043a\u0443)<\/p>\n<pre><code class=\"cpp\"> INonfungiblePositionManager public immutable nonfungiblePositionManager;<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043d\u0435\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0447\u0442\u043e \u043a \u0447\u0435\u043c\u0443,\u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438,\u043a\u0430\u043a\u0438\u0435 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u044b ????.\u041d\u0438\u0447\u0435\u0433\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e \u0432 \u044d\u0442\u043e\u043c \u043d\u0435\u0442.\u041b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0442\u044b\u043a\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043a \u0447\u0435\u043c\u0443,\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443.<\/p>\n<p> &#171;\u041f\u043e\u0437\u0438\u0446\u0438\u044f&#187; \u043e\u043b\u0438\u0446\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043a\u043b\u0430\u0434\u0435\u043c \u0441\u0432\u043e\u0438 \u0434\u0435\u043d\u044e\u0436\u043a\u0438.\u0427\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435: &#171;\u0412\u043e\u0442 \u0442\u0435\u0431\u0435 \u044e\u043d\u0438\u0441\u0432\u0430\u043f \u0440\u043e\u0434\u043d\u0435\u043d\u044c\u043a\u0438\u0439, \u043c\u043e\u0438 100$ \u0438 \u043c\u043e\u0438 100BYN,\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0441\u044f \u043d\u0430 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435,\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043f\u0440\u043e\u0434\u0430\u0436\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u043e\u043b\u043b\u0430\u0440\u0430  \u0437\u0430 2-5 BYN,\u0435\u0441\u043b\u0438 \u0436\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0443,\u043f\u043e\u043b\u043e\u0436\u0438 \u043c\u043e\u0438 \u0433\u0440\u043e\u0448\u0438 \u0438 \u043d\u0435 \u0447\u0430\u043f\u0430\u0439 &#171;. \u0410 <code>nonfungiblePositionManager <\/code>\u0434\u0435\u043b\u0430\u0435\u0442 \u0438\u0437 \u044d\u0442\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043d\u0444\u0442\u0438\u0448\u043a\u0443 ,\u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0441 \u043d\u0435\u0439(\u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439) \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u044b \u0441 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0432\u043e \u0432\u0441\u0435 \u044d\u0442\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0435 \u0434\u0435\u043b\u043e \u0441\u0440\u0435\u0434\u0441\u0442\u0432. <\/p>\n<p>\u042d\u0442\u043e \u0431\u044b\u043b\u043e \u043c\u043e\u0435 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0435 \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u043e\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435,\u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u0434\u0435\u043b\u0443!<\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 NFT \u0438\u043c\u0435\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u0439 \u0410\u0419\u0434\u0438\u0448\u043d\u0438\u043a uint256 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043c\u0430\u0440\u0442-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430 ERC-721, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u043a\u0430\u043a tokenId.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0434\u0435\u043f\u043e\u0437\u0438\u0442 \u0432 \u043d\u0430\u0448\u0438 \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b ERC721,\u043e\u043b\u0438\u0446\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0435 \u043b\u0438\u043a\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c,\u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 Deposit.\u0410 \u0442\u0430\u043a \u0436\u0435, \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u043c\u0430\u043f\u0443\/\u0441\u043b\u043e\u0432\u0430\u0440\u044c\/\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 uint256 \u0441 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043a\u043e\u0439.\u041d\u0430\u0437\u043e\u0432\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e Deposits \u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u0430\u0434\u0438\u043c \u0432\u0441\u0435\u043c \u0432\u0441\u0435\u043c \u0432\u0441\u0435\u043c.<\/p>\n<pre><code class=\"cpp\">struct Deposit {         address owner;         uint128 liquidity;         address token0;         address token1;  }  mapping(uint256 => Deposit) public deposits;<\/code><\/pre>\n<h3> \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440<\/h3>\n<p>\u0417\u0434\u0435\u0441\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u0430\u0436\u0434\u044b,\u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u0441\u044f.\u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441  <code>nonfungiblePositionManager.<\/code> \u0410\u0434\u0440\u0435\u0441 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/docs.uniswap.org\/protocol\/reference\/deployments\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a><\/p>\n<pre><code class=\"cpp\">    constructor(INonfungiblePositionManager _nonfungiblePositionManager) {         nonfungiblePositionManager = _nonfungiblePositionManager;     }<\/code><\/pre>\n<h3> \u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 ERC721 \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0435<\/h3>\n<p>\u0427\u0442\u043e \u0431\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0443 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u043e\u043a\u0435\u043d\u044b ERC721, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0439\u0442\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>onERC721Received<\/code> \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 <code>IERC721Receiver.sol<\/code> .<\/p>\n<p>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 from \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0443\u0449\u0435\u043d, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p> \u041d\u0435\u043c\u043e\u0433\u043e \u043e <code>onERC721Received:<\/code><\/p>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0444\u0442\u0438\u0448\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f,\u0442\u0430\u043a \u0438 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430,\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u0442\u043e\u043a\u0435\u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442,\u0442\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430 \u043d\u0430 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 ERC721Received,\u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u0442\u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e,\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>onERC721Received<\/code> \u0438 \u0442\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u043a\u0430\u0442\u044c \u0442\u043e\u043a\u0435\u043d<\/p>\n<pre><code class=\"cpp\">    function onERC721Received(         address operator,         address,         uint256 tokenId,         bytes calldata     ) external override returns (bytes4) {         \/\/ get position information         _createDeposit(operator, tokenId);         return this.onERC721Received.selector;     }<\/code><\/pre>\n<h3> \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442  <code>Deposit <\/code>\u0432 \u043c\u0430\u043f\u0443 <code> deposits<\/code>,\u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e  <code>_createDeposit<\/code>,\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>positions<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439  <code>positions()<\/code>\u0438\u0437 <code>nonfungiblePositionManager.sol. <\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043d\u0430\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 <code>token0<\/code> <code>token1<\/code> and <code>liquidity<\/code> \u0432 \u043c\u0430\u043f\u0443 <code>deposits<\/code> .<\/p>\n<pre><code class=\"cpp\">    function _createDeposit(address owner, uint256 tokenId) internal {         (, , address token0, address token1, , , , uint128 liquidity, , , , )             = nonfungiblePositionManager.positions(tokenId);          \/\/ set the owner and data for position         \/\/ operator is msg.sender         deposits[tokenId] = Deposit({owner: owner, liquidity: liquidity, token0: token0, token1: token1});     } <\/code><\/pre>\n<h2> Mint a New Position<\/h2>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c nonFungiblePositionManager \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c mint.<\/p>\n<p>\u0420\u0430\u0434\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0431\u044b\u043b\u043e \u0436\u0435\u0441\u0442\u043a\u043e \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0447\u0435\u043a\u0430\u043d\u0438\u0442\u044c. \u0412 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0441\u0440\u0435\u0434\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<pre><code class=\"cpp\">\/\/\/ @notice Calls the mint function defined in periphery, mints the same amount of each token. For this example we are providing 1000 DAI and 1000 USDC in liquidity     \/\/\/ @return tokenId The id of the newly minted ERC721     \/\/\/ @return liquidity The amount of liquidity for the position     \/\/\/ @return amount0 The amount of token0     \/\/\/ @return amount1 The amount of token1     function mintNewPosition()         external         returns (             uint256 tokenId,             uint128 liquidity,             uint256 amount0,             uint256 amount1         )     {         \/\/ For this example, we will provide equal amounts of liquidity in both assets.         \/\/ Providing liquidity in both assets means liquidity will be earning fees and is considered in-range.         uint256 amount0ToMint = 1000;         uint256 amount1ToMint = 1000; <\/code><\/pre>\n<h3> Calling Mint<\/h3>\n<p>\u0422\u0443\u0442 \u043c\u044b \u0434\u0430\u0435\u043c \u043e\u0442\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0443  <code>nonfungiblePositionManager<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043a\u0435\u043d\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430, \u0437\u0430\u0442\u0435\u043c \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>MintParams<\/code>  \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0435\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>params,<\/code>\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u0430 \u0432 <code>nonfungiblePositionManager<\/code> \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c <code>mint<\/code>.<\/p>\n<ul>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>TickMath.MIN_TICK<\/code> and <code>TickMath.MAX_TICK<\/code>, \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043b\u0438\u043a\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u0432\u0434\u043e\u043b\u044c \u0432\u0441\u0435\u0433\u043e \u0446\u0435\u043d\u043e\u0432\u043e\u0433\u043e \u0440\u0430\u043d\u0436\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0443\u043b\u0430.\u0412 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0432\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u043d\u0442\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>amount0Min<\/code> \u0438 <code>amount1Min<\/code> \u0440\u0430\u0432\u043d\u044b \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0443\u043b\u044e &#8212; \u043d\u043e \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0432\u0430\u043c \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0430\u0447\u0435 \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u0431\u0435\u0434\u044b \u0441 \u043f\u0440\u043e\u0441\u043a\u0430\u043b\u044c\u0437\u044b\u0432\u0430\u043d\u0438\u0435\u043c. <\/p>\n<\/li>\n<li>\n<p> \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u043b, \u0435\u0441\u043b\u0438  \u043e\u043d \u0435\u0449\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"cpp\"> \/\/ Approve the position manager         TransferHelper.safeApprove(DAI, address(nonfungiblePositionManager), amount0ToMint);         TransferHelper.safeApprove(USDC, address(nonfungiblePositionManager), amount1ToMint);          INonfungiblePositionManager.MintParams memory params =             INonfungiblePositionManager.MintParams({                 token0: DAI,                 token1: USDC,                 fee: poolFee,                 tickLower: TickMath.MIN_TICK,                 tickUpper: TickMath.MAX_TICK,                 amount0Desired: amount0ToMint,                 amount1Desired: amount1ToMint,                 amount0Min: 0,                 amount1Min: 0,                 recipient: address(this),                 deadline: block.timestamp             });          \/\/ Note that the pool defined by DAI\/USDC and fee tier 0.3% must already be created and initialized in order to mint         (tokenId, liquidity, amount0, amount1) = nonfungiblePositionManager.mint(params); <\/code><\/pre>\n<\/p>\n<h3> \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 Deposit Mapping \u0438 \u0440\u0435\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0441\u0430<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e,\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0432 <a href=\"https:\/\/docs.uniswap.org\/protocol\/guides\/providing-liquidity\/setting-up\" rel=\"noopener noreferrer nofollow\">Setting Up Your Contract<\/a>. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0437\u044f\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u043b\u0438\u043a\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0443\u044e\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u0443\u0441\u043a\u0430 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0435  <code>msg.sender<\/code>.<\/p>\n<pre><code class=\"cpp\"> \/\/ Create a deposit         _createDeposit(msg.sender, tokenId);          \/\/ Remove allowance and refund in both assets.         if (amount0 &lt; amount0ToMint) {             TransferHelper.safeApprove(DAI, address(nonfungiblePositionManager), 0);             uint256 refund0 = amount0ToMint - amount0;             TransferHelper.safeTransfer(DAI, msg.sender, refund0);         }          if (amount1 &lt; amount1ToMint) {             TransferHelper.safeApprove(USDC, address(nonfungiblePositionManager), 0);             uint256 refund1 = amount1ToMint - amount1;             TransferHelper.safeTransfer(USDC, msg.sender, refund1);         }     }<\/code><\/pre>\n<h2> \u0421\u0431\u043e\u0440 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0438<\/h2>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043d\u0430\u0448 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043b\u0430\u0434\u0435\u0442\u044c NFT\u0448\u043a\u0430\u043c\u0438(\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0430\u044e\u0442 \u043b\u0438\u043a\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c). \u0422\u0430\u043a \u0447\u0442\u043e NFT\u0448\u043a\u0438 \u043b\u0438\u0431\u043e \u043a\u043e\u043d\u0434\u0438\u0440\u0443\u0435\u043c \u0432 \u043a\u043e\u0434, \u043b\u0438\u0431\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c \u0438\u0445 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0435<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u043f\u0435\u0440\u0435\u0434\u0430\u0439\u0442\u0435 NFT \u0441 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430, \u043d\u0430\u0437\u043d\u0430\u0447\u044c\u0442\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 NFT \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0432 \u043d\u0430\u0448\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0439\u0442\u0435 \u044d\u0442\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 thenonfungiblePositionManager \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u0441\u0431\u043e\u0440\u0430.<\/p>\n<p>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0431\u043e\u0440\u044b, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u0438\u0445 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0443 NFT, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e NFT.<\/p>\n<pre><code class=\"cpp\">    \/\/\/ @notice Collects the fees associated with provided liquidity     \/\/\/ @dev The contract must hold the erc721 token before it can collect fees     \/\/\/ @param tokenId The id of the erc721 token     \/\/\/ @return amount0 The amount of fees collected in token0     \/\/\/ @return amount1 The amount of fees collected in token1     function collectAllFees(uint256 tokenId) external returns (uint256 amount0, uint256 amount1) {         \/\/ Caller must own the ERC721 position         \/\/ Call to safeTransfer will trigger `onERC721Received` which must return the selector else transfer will fail         nonfungiblePositionManager.safeTransferFrom(msg.sender, address(this), tokenId);          \/\/ set amount0Max and amount1Max to uint256.max to collect all fees         \/\/ alternatively can set recipient to msg.sender and avoid another transaction in `sendToOwner`         INonfungiblePositionManager.CollectParams memory params =             INonfungiblePositionManager.CollectParams({                 tokenId: tokenId,                 recipient: address(this),                 amount0Max: type(uint128).max,                 amount1Max: type(uint128).max             });          (amount0, amount1) = nonfungiblePositionManager.collect(params);          \/\/ send collected feed back to owner         _sendToOwner(tokenId, amount0, amount1);     }  <\/code><\/pre>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0441\u0431\u043e\u0440\u043e\u0432 \u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0430\u0434\u0440\u0435\u0441<\/p>\n<p>\u042d\u0442\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043b\u044e\u0431\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b \u0432 \u0432\u0438\u0434\u0435 \u0441\u0431\u043e\u0440\u043e\u0432 \u0438\u043b\u0438 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0443 NFT.<\/p>\n<p>\u0412 _sendToOwner \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0441\u0443\u043c\u043c\u0443 \u0441\u0431\u043e\u0440\u043e\u0432, \u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u0443\u044e \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f safeTransfer, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0441\u0431\u043e\u0440\u044b \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0443.<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u042f \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u043e\u044e \u043f\u0440\u043e\u0448\u043b\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0430 \u0442\u0435\u043c\u0443 \u044e\u043d\u0438\u0441\u0432\u0430\u043f\u0430 <a href=\"https:\/\/habr.com\/ru\/post\/684872\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/post\/684872\/<\/a>,\u043b\u0438\u0431\u043e \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435,\u0442\u0430\u043a \u043a\u0430\u043a \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e \u0434\u0435\u043f\u043b\u043e\u044e \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e \u0434\u043e\u0431\u0440\u0430. \u0422\u0430\u043a \u0436\u0435 \u043d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u043e\u0431\u0440\u043e\u0434\u0438\u0442\u044c,\u043f\u043e\u0442\u044b\u043a\u0430\u0442\u044c\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/687694\/\"> https:\/\/habr.com\/ru\/post\/687694\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u042d\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0433\u0430\u0439\u0434\u043e\u0432 Uniswap v3. <a href=\"https:\/\/habr.com\/ru\/post\/684872\/\" rel=\"noopener noreferrer nofollow\">\u0422\u0443\u0442 \u043f\u0435\u0440\u0432\u0430\u044f<\/a><\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0433\u0430\u0439\u0434\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 Periphery Uniswap V3 \u043f\u0443\u0442\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438 \u0441\u0431\u043e\u0440\u0430 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0439.<\/p>\n<p>\u041f\u043e\u0434 <strong>Periphery Uniswap V3<\/strong> \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u044f\u0434 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 core Uniswap V3.\u041e\u043d\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u043d\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b,\u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 core Uniswap V3 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u0444\u0435\u0440\u0438\u0438<\/p>\n<p><strong>\u0421ore Uniswap V3<\/strong> &#8212; \u044d\u0442\u043e \u0440\u044f\u0434 \u0441\u043c\u0430\u0440\u0442-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u0432, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f Uniswap. \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u044f\u0434\u0440\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u043b\u043e\u0433\u0438\u043a\u0438 \u043b\u0438\u043a\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/docs.uniswap.org\/protocol\/V2\/concepts\/protocol-overview\/glossary\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>\u041e\u0431\u044a\u044f\u0432\u0438\u043c \u0432\u0435\u0440\u0441\u0438\u044e Solidity, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0443\u044e \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430, \u0438 abicoder v2, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0432 calldata ( \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043f\u0443\u043b\u043e\u043c).<\/p>\n<pre><code class=\"cpp\">\/\/ SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.8.0; pragma abicoder v2;<\/code><\/pre>\n<p>\u041f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u0438\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c***(\u043d\u0430 \u044d\u0442\u043e\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435)<\/p>\n<pre><code class=\"cpp\">import \"@openzeppelin\/contracts\/token\/ERC721\/IERC721Receiver.sol\";  import \"@uniswap\/v3-periphery\/contracts\/interfaces\/INonfungiblePositionManager.sol\"; import \"@uniswap\/v3-periphery\/contracts\/libraries\/TransferHelper.sol\";<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c LiquidityExamples \u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043e\u0442 IERC721Receiver. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0443 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438  IERC721<\/p>\n<p> \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430,\u0430\u0434\u0440\u0435\u0441\u0430 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u0432 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 (\u0442\u0443\u0442 DAI \u0438 <code>WETH9<\/code>) \u0438 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u044b \u043f\u043b\u0430\u0442\u044b \u0437\u0430 \u043f\u0443\u043b  \u043c\u044b \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0438\u043b\u0438. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e,\u0447\u0442\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0438 \u043f\u0443\u043b\u044b, \u0438 \u0442\u043e\u043a\u0435\u043d\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438.  <\/p>\n<pre><code class=\"cpp\">contract LiquidityExamples is IERC721Receiver {      address public constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;     address public constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;      uint24 public constant poolFee = 3000; <\/code><\/pre>\n<p> \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>nonfungiblePositionManager <\/code>\u0442\u0438\u043f\u0430 <code>InonfungiblePositionManager<\/code>(\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a Periphery Uniswap V3 ) \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u0438 immutable public.<\/p>\n<p>(nonfungiblePositionManager \u043f\u043e \u0441\u0443\u0442\u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 Position,\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u043e Position \u0434\u0435\u043b\u0430\u0435\u0442 nft-\u0448\u043a\u0443)<\/p>\n<pre><code class=\"cpp\"> INonfungiblePositionManager public immutable nonfungiblePositionManager;<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043d\u0435\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0447\u0442\u043e \u043a \u0447\u0435\u043c\u0443,\u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438,\u043a\u0430\u043a\u0438\u0435 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u044b ????.\u041d\u0438\u0447\u0435\u0433\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e \u0432 \u044d\u0442\u043e\u043c \u043d\u0435\u0442.\u041b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0442\u044b\u043a\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043a \u0447\u0435\u043c\u0443,\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443.<\/p>\n<p> &#171;\u041f\u043e\u0437\u0438\u0446\u0438\u044f&#187; \u043e\u043b\u0438\u0446\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043a\u043b\u0430\u0434\u0435\u043c \u0441\u0432\u043e\u0438 \u0434\u0435\u043d\u044e\u0436\u043a\u0438.\u0427\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435: &#171;\u0412\u043e\u0442 \u0442\u0435\u0431\u0435 \u044e\u043d\u0438\u0441\u0432\u0430\u043f \u0440\u043e\u0434\u043d\u0435\u043d\u044c\u043a\u0438\u0439, \u043c\u043e\u0438 100$ \u0438 \u043c\u043e\u0438 100BYN,\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0441\u044f \u043d\u0430 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435,\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043f\u0440\u043e\u0434\u0430\u0436\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u043e\u043b\u043b\u0430\u0440\u0430  \u0437\u0430 2-5 BYN,\u0435\u0441\u043b\u0438 \u0436\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0443,\u043f\u043e\u043b\u043e\u0436\u0438 \u043c\u043e\u0438 \u0433\u0440\u043e\u0448\u0438 \u0438 \u043d\u0435 \u0447\u0430\u043f\u0430\u0439 &#171;. \u0410 <code>nonfungiblePositionManager <\/code>\u0434\u0435\u043b\u0430\u0435\u0442 \u0438\u0437 \u044d\u0442\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043d\u0444\u0442\u0438\u0448\u043a\u0443 ,\u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0441 \u043d\u0435\u0439(\u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439) \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u044b \u0441 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0432\u043e \u0432\u0441\u0435 \u044d\u0442\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0435 \u0434\u0435\u043b\u043e \u0441\u0440\u0435\u0434\u0441\u0442\u0432. <\/p>\n<p>\u042d\u0442\u043e \u0431\u044b\u043b\u043e \u043c\u043e\u0435 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0435 \u0430\u0432\u0442\u043e\u0440\u0441\u043a\u043e\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435,\u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u0434\u0435\u043b\u0443!<\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 NFT \u0438\u043c\u0435\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u0439 \u0410\u0419\u0434\u0438\u0448\u043d\u0438\u043a uint256 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043c\u0430\u0440\u0442-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430 ERC-721, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u043a\u0430\u043a tokenId.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0434\u0435\u043f\u043e\u0437\u0438\u0442 \u0432 \u043d\u0430\u0448\u0438 \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b ERC721,\u043e\u043b\u0438\u0446\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0435 \u043b\u0438\u043a\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c,\u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 Deposit.\u0410 \u0442\u0430\u043a \u0436\u0435, \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u043c\u0430\u043f\u0443\/\u0441\u043b\u043e\u0432\u0430\u0440\u044c\/\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 uint256 \u0441 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043a\u043e\u0439.\u041d\u0430\u0437\u043e\u0432\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e Deposits \u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u0430\u0434\u0438\u043c \u0432\u0441\u0435\u043c \u0432\u0441\u0435\u043c \u0432\u0441\u0435\u043c.<\/p>\n<pre><code class=\"cpp\">struct Deposit {         address owner;         uint128 liquidity;         address token0;         address token1;  }  mapping(uint256 => Deposit) public deposits;<\/code><\/pre>\n<h3> \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440<\/h3>\n<p>\u0417\u0434\u0435\u0441\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u0430\u0436\u0434\u044b,\u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u0441\u044f.\u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441  <code>nonfungiblePositionManager.<\/code> \u0410\u0434\u0440\u0435\u0441 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/docs.uniswap.org\/protocol\/reference\/deployments\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a><\/p>\n<pre><code class=\"cpp\">    constructor(INonfungiblePositionManager _nonfungiblePositionManager) {         nonfungiblePositionManager = _nonfungiblePositionManager;     }<\/code><\/pre>\n<h3> \u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 ERC721 \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0435<\/h3>\n<p>\u0427\u0442\u043e \u0431\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0443 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u043e\u043a\u0435\u043d\u044b ERC721, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0439\u0442\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>onERC721Received<\/code> \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 <code>IERC721Receiver.sol<\/code> .<\/p>\n<p>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 from \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0443\u0449\u0435\u043d, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p> \u041d\u0435\u043c\u043e\u0433\u043e \u043e <code>onERC721Received:<\/code><\/p>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0444\u0442\u0438\u0448\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f,\u0442\u0430\u043a \u0438 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430,\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u0442\u043e\u043a\u0435\u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442,\u0442\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430 \u043d\u0430 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 ERC721Received,\u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u0442\u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e,\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>onERC721Received<\/code> \u0438 \u0442\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u043a\u0430\u0442\u044c \u0442\u043e\u043a\u0435\u043d<\/p>\n<pre><code class=\"cpp\">    function onERC721Received(         address operator,         address,         uint256 tokenId,         bytes calldata     ) external override returns (bytes4) {         \/\/ get position information         _createDeposit(operator, tokenId);         return this.onERC721Received.selector;     }<\/code><\/pre>\n<h3> \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442  <code>Deposit <\/code>\u0432 \u043c\u0430\u043f\u0443 <code> deposits<\/code>,\u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e  <code>_createDeposit<\/code>,\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>positions<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439  <code>positions()<\/code>\u0438\u0437 <code>nonfungiblePositionManager.sol. <\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043d\u0430\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 <code>token0<\/code> <code>token1<\/code> and <code>liquidity<\/code> \u0432 \u043c\u0430\u043f\u0443 <code>deposits<\/code> .<\/p>\n<pre><code class=\"cpp\">    function _createDeposit(address owner, uint256 tokenId) internal {         (, , address token0, address token1, , , , uint128 liquidity, , , , )             = nonfungiblePositionManager.positions(tokenId);          \/\/ set the owner and data for position         \/\/ operator is msg.sender         deposits[tokenId] = Deposit({owner: owner, liquidity: liquidity, token0: token0, token1: token1});     } <\/code><\/pre>\n<h2> Mint a New Position<\/h2>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c nonFungiblePositionManager \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c mint.<\/p>\n<p>\u0420\u0430\u0434\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0431\u044b\u043b\u043e \u0436\u0435\u0441\u0442\u043a\u043e \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0447\u0435\u043a\u0430\u043d\u0438\u0442\u044c. \u0412 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0441\u0440\u0435\u0434\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<pre><code class=\"cpp\">\/\/\/ @notice Calls the mint function defined in periphery, mints the same amount of each token. For this example we are providing 1000 DAI and 1000 USDC in liquidity     \/\/\/ @return tokenId The id of the newly minted ERC721     \/\/\/ @return liquidity The amount of liquidity for the position     \/\/\/ @return amount0 The amount of token0     \/\/\/ @return amount1 The amount of token1     function mintNewPosition()         external         returns (             uint256 tokenId,             uint128 liquidity,             uint256 amount0,             uint256 amount1         )     {         \/\/ For this example, we will provide equal amounts of liquidity in both assets.         \/\/ Providing liquidity in both assets means liquidity will be earning fees and is considered in-range.         uint256 amount0ToMint = 1000;         uint256 amount1ToMint = 1000; <\/code><\/pre>\n<h3> Calling Mint<\/h3>\n<p>\u0422\u0443\u0442 \u043c\u044b \u0434\u0430\u0435\u043c \u043e\u0442\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0443  <code>nonfungiblePositionManager<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043a\u0435\u043d\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430, \u0437\u0430\u0442\u0435\u043c \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>MintParams<\/code>  \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0435\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>params,<\/code>\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u0430 \u0432 <code>nonfungiblePositionManager<\/code> \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c <code>mint<\/code>.<\/p>\n<ul>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>TickMath.MIN_TICK<\/code> and <code>TickMath.MAX_TICK<\/code>, \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043b\u0438\u043a\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u0432\u0434\u043e\u043b\u044c \u0432\u0441\u0435\u0433\u043e \u0446\u0435\u043d\u043e\u0432\u043e\u0433\u043e \u0440\u0430\u043d\u0436\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0443\u043b\u0430.\u0412 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0432\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u043d\u0442\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>amount0Min<\/code> \u0438 <code>amount1Min<\/code> \u0440\u0430\u0432\u043d\u044b \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0443\u043b\u044e &#8212; \u043d\u043e \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0432\u0430\u043c \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0430\u0447\u0435 \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u0431\u0435\u0434\u044b \u0441 \u043f\u0440\u043e\u0441\u043a\u0430\u043b\u044c\u0437\u044b\u0432\u0430\u043d\u0438\u0435\u043c. <\/p>\n<\/li>\n<li>\n<p> \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u043b, \u0435\u0441\u043b\u0438  \u043e\u043d \u0435\u0449\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"cpp\"> \/\/ Approve the position manager         TransferHelper.safeApprove(DAI, address(nonfungiblePositionManager), amount0ToMint);         TransferHelper.safeApprove(USDC, address(nonfungiblePositionManager), amount1ToMint);          INonfungiblePositionManager.MintParams memory params =             INonfungiblePositionManager.MintParams({                 token0: DAI,                 token1: USDC,                 fee: poolFee,                 tickLower: TickMath.MIN_TICK,                 tickUpper: TickMath.MAX_TICK,                 amount0Desired: amount0ToMint,                 amount1Desired: amount1ToMint,                 amount0Min: 0,                 amount1Min: 0,                 recipient: address(this),                 deadline: block.timestamp             });          \/\/ Note that the pool defined by DAI\/USDC and fee tier 0.3% must already be created and initialized in order to mint         (tokenId, liquidity, amount0, amount1) = nonfungiblePositionManager.mint(params); <\/code><\/pre>\n<\/p>\n<h3> \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 Deposit Mapping \u0438 \u0440\u0435\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0441\u0430<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e,\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0432 <a href=\"https:\/\/docs.uniswap.org\/protocol\/guides\/providing-liquidity\/setting-up\" rel=\"noopener noreferrer nofollow\">Setting Up Your Contract<\/a>. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0437\u044f\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u043b\u0438\u043a\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0443\u044e\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u0443\u0441\u043a\u0430 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0435  <code>msg.sender<\/code>.<\/p>\n<pre><code class=\"cpp\"> \/\/ Create a deposit         _createDeposit(msg.sender, tokenId);          \/\/ Remove allowance and refund in both assets.         if (amount0 &lt; amount0ToMint) {             TransferHelper.safeApprove(DAI, address(nonfungiblePositionManager), 0);             uint256 refund0 = amount0ToMint - amount0;             TransferHelper.safeTransfer(DAI, msg.sender, refund0);         }          if (amount1 &lt; amount1ToMint) {             TransferHelper.safeApprove(USDC, address(nonfungiblePositionManager), 0);             uint256 refund1 = amount1ToMint - amount1;             TransferHelper.safeTransfer(USDC, msg.sender, refund1);         }     }<\/code><\/pre>\n<h2> \u0421\u0431\u043e\u0440 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0438<\/h2>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043d\u0430\u0448 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043b\u0430\u0434\u0435\u0442\u044c NFT\u0448\u043a\u0430\u043c\u0438(\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0430\u044e\u0442 \u043b\u0438\u043a\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c). \u0422\u0430\u043a \u0447\u0442\u043e NFT\u0448\u043a\u0438 \u043b\u0438\u0431\u043e \u043a\u043e\u043d\u0434\u0438\u0440\u0443\u0435\u043c \u0432 \u043a\u043e\u0434, \u043b\u0438\u0431\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c \u0438\u0445 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0435<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u043f\u0435\u0440\u0435\u0434\u0430\u0439\u0442\u0435 NFT \u0441 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430, \u043d\u0430\u0437\u043d\u0430\u0447\u044c\u0442\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 NFT \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0432 \u043d\u0430\u0448\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0439\u0442\u0435 \u044d\u0442\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 thenonfungiblePositionManager \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u0441\u0431\u043e\u0440\u0430.<\/p>\n<p>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0431\u043e\u0440\u044b, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u0438\u0445 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0443 NFT, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e NFT.<\/p>\n<pre><code class=\"cpp\">    \/\/\/ @notice Collects the fees associated with provided liquidity     \/\/\/ @dev The contract must hold the erc721 token before it can collect fees     \/\/\/ @param tokenId The id of the erc721 token     \/\/\/ @return amount0 The amount of fees collected in token0     \/\/\/ @return amount1 <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-338242","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/338242","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=338242"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/338242\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=338242"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=338242"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=338242"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}