وسائل لوڈ ہو رہے ہیں... لوڈنگ...

FMZ Quant Uniswap V3 ایکسچینج پول لیکویڈیٹی سے متعلقہ آپریشنز گائیڈ (حصہ 1)

مصنف:FMZ~Lydia, تخلیق: 2023-07-21 09:22:33, تازہ کاری: 2024-11-11 22:37:08

FMZ Quant Uniswap V3 Exchange Pool Liquidity Related Operations Guide (Part 1)

FMZ Quant Uniswap V3 ایکسچینج پول لیکویڈیٹی سے متعلقہ آپریشنز گائیڈ (حصہ 1)

Uniswap V3 میں NonfungiblePositionManager معاہدہ

جب ہم Uniswap V3 لیکویڈیٹی پول (ٹریڈنگ پیئر پول) میں لیکویڈیٹی شامل کرتے ہیں تو ، NonfungiblePositionManager معاہدہ ہمیں لیکویڈیٹی کے اضافے کے ثبوت کے طور پر ایک منٹا ہوا NFT واپس کرتا ہے۔

پہلا قدم روٹر معاہدہ کا استعمال کرنا ہے تاکہ متعلقہ NonfungiblePositionManager معاہدے کا پتہ مل سکے ، اور پھر مخصوص پرس ایڈریس کے لئے پوزیشن NFTs کی تعداد حاصل کرنے کے لئے NonfungiblePositionManager معاہدے کے balanceOf طریقہ کار کا استعمال کریں۔

پھر ان پوزیشن این ایف ٹیز کی ٹوکن آئی ڈی حاصل کرنے کے لئے ٹوکن آف اوونر بائی انڈیکس طریقہ استعمال کریں ، ان ٹوکن آئی ڈی کے ساتھ ، آپ پوزیشنوں کا طریقہ استعمال کرکے ان پوزیشنوں کی مخصوص تفصیلات سے استفسار جاری رکھ سکتے ہیں۔

مندرجہ ذیل ٹیسٹ کوڈ:

// Uniswap ABI const ABI_UniswapV3Router =[inputs:[{internalType:address,name:_factoryV2,type:address},{internalType:address,name:internalType:inputs:inputs:inputs:inputs:inputs:address,name:[{internalType:address:address:_WETH9,type:bytespace:address}],[internalType:inputs:address,type:address:address:inputs:inputs:inputs:inputs:inputs:inputs:type:address:inputs:inputs:address:positionManager,type: const ABI_NonfungiblePositionManager =[{inputs:[{internalType:address,name:_factory,type:address},{internalType:address,name:_WETH9,type:address},{internalType:address,name:tokenDescriptor,type:address}],stateMutability:nonpayable,type:constructor},{indexed:true:false,inputs:[indexed:true,internalType:address,name:owner,type:address},{indexed:true,internalType:address,name:owner,type:address},{indexed:true,internalType:address,type:address},{indexed:true,internalType:address,type:address,type:approved,type:address},{indexed:true,type:addalType:additive:additive,additive:add ABI_Pool = [\\inputs\:[],\stateMutability\:\nonpayable\,\type\:\constructor\,\name\:\anonymous\:\false,\inputs\:[\\indexed\:true,\internalType\:\address\:\stateMutability\:\\nonpayable\,\type\:\\constructor\,\anonymous\:\false,\inputs\:\:\inputs\:\:\inputs\:\:\inputs\:\:\\\\\\\\\\scriptstyle\\\\\\\scriptstyle\scriptstyle\scriptstyle\scriptstyle\scriptstyle\scriptstyle\scriptstyle\scriptstyle\script\scriptstyle\script ABI_Factory = [\\inputs\:[],\stateMutability\:\\nonpayable\,\\\type\:\\constructor\},\\\anonymous\:\false,\inputs\:[\\\indexed\:true,\\internalType\:\uint24\,\nname\:\fee\,\\\\\type\:\uint24\},\nindexed\:true,\internaladdaddaddaddable\,\type\:\addaddaddaddadded\:\uint24\,\name\:\"anonymous\:false,\:false,\:false,\:false,\:false,\:false,\:false,\:false,\:false,\:false,\:false,\\

// Uniswap معاہدے کا پتہ const UniswapV3RouterAddress = 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45 const ContractV3Factory = 0x1F98431c8aD98523631AE4a59f267346ea31F984

// مشترکہ مستقل const TWO = BigInt ((2) const Q192 = (TWO ** BigInt ((96)) ** TWO const Q96 = (TWO ** BigInt ((96))

// پڑھنے کے قابل رقم میں تبدیل کریں فنکشن toAmount ((s، اعشاریہ) { واپسی نمبر (((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, اعشاریہ))).toString()) }

// پڑھنے کے قابل رقم سے پیرامیٹرز اور حساب کے لئے استعمال ہونے والی رقم میں ریورس تبادلوں فنکشن toInnerAmount ((n، اعشاریہ) { واپسی (بگ ڈیسیمل ((ن) * بگ ڈیسیمل ((ریاضی.پاو ((10, اعشاریہ))).toFixed(0) }

اہم فنکشن // تلاش کرنے کے لئے بٹوے کا پتہ // const walletAddress = exchange.IO(address) const walletAddress = 0x28df8b987BE232bA33FdFB8Fc5058C1592A3db26

// Get the address of Uniswap V3's positionManager contract
exchange.IO("abi", UniswapV3RouterAddress, ABI_UniswapV3Router)
const NonfungiblePositionManagerAddress = exchange.IO("api", UniswapV3RouterAddress, "positionManager")
Log("NonfungiblePositionManagerAddress:", NonfungiblePositionManagerAddress)

// Register ABI for positionManager contracts
exchange.IO("abi", NonfungiblePositionManagerAddress, ABI_NonfungiblePositionManager)

// Query the number of Uniswap V3 positions NFT owned by the current account
var nftBalance = exchange.IO("api", NonfungiblePositionManagerAddress, "balanceOf", walletAddress)
Log("nftBalance:", nftBalance)

// Query the TokenId of these NFTs
var nftTokenIds = []
for (var i = 0 ; i < nftBalance; i++) {
    var nftTokenId = exchange.IO("api", NonfungiblePositionManagerAddress, "tokenOfOwnerByIndex", walletAddress, i)
    nftTokenIds.push(nftTokenId)
    Log("nftTokenId:", nftTokenId)
}

// Query liquidity position details based on the tokenId of the positions NFT
var positions = []
for (var i = 0; i < nftTokenIds.length; i++) {
    var pos = exchange.IO("api", NonfungiblePositionManagerAddress, "positions", nftTokenIds[i])        
    Log("pos:", pos)

    // Parsing position data
    positions.push(parsePosData(pos))
}

var tbl = {
    type : "table",
    title : "LP",
    cols : ["range(token0 valuation)", "token0", "token1", "fee", "lowerPrice(tickLower)", "upperPrice(tickUpper)", "liquidity", "amount0", "amount1"],
    rows : positions
}
LogStatus("`" + JSON.stringify(tbl) + "`")

}

// coingecko.com کے ذریعے استفسار کیا ٹوکن کے بارے میں ریکارڈ کی معلومات var ٹوکن = [] تقریب init() { // ابتدائی طور پر، تمام ٹوکن کے بارے میں معلومات حاصل کریں var res = JSON.parse ((HttpQuery(https://tokens.coingecko.com/uniswap/all.json”)) لاگ (( fetch, res.tokens.length, tokens from, res.name) _.each ((res.tokens، فنکشن ((ٹوکن) { ٹوکنز.پش نام: ٹوکن.نام، علامت: ٹوکن۔ علامت، اعشاریہ نمبر: ٹوکن. اعشاریہ نمبر، ایڈریس: ٹوکن.ایڈریس }) }) لاگ (( ٹوکن:, ٹوکن) }

تقریب تجزیہPosData(posData) { /* { اعلان: 0، آپریٹر: 0x000000000000000000000000000000000000، ٹوکن1: 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2، فی: 3000، فیسگروتھانسائڈ0آخریX128: 552824104363438506727784685971981736468، فیگروتھ انڈسائیڈ1آخریX128: 2419576808699564757520565912733367379، ٹوکن قرض: 0، ٹوکن قرض: 0، ٹوکن0: 0x1f9840a85d5af5bf1d1762f925bdaddc4201f984، ٹِک لوئر: -62160، ٹِک اپ: -41280، لیکویڈیٹی: 19090316141441365693 } */

var token0Symbol = null
var token1Symbol = null
// Determine the token according to the address of the token, record the information about the token
for (var i in tokens) {
    if (tokens[i].address.toLowerCase() == posData.token0.toLowerCase()) {
        token0Symbol = tokens[i]
    } else if (tokens[i].address.toLowerCase() == posData.token1.toLowerCase()) {
        token1Symbol = tokens[i]
    }
}

if (!token0Symbol || !token1Symbol) {
	Log("token0Symbol:", token0Symbol, ", token1Symbol:", token1Symbol)
    throw "token not found"
}

// get Pool , obtaining data about the exchange pool
var poolInfo = getPool(token0Symbol.address, token1Symbol.address, posData.fee)
Log("poolInfo:", poolInfo)
/* Data examples
{
    "slot0":{
        "sqrtPriceX96":"4403124416947951698847768103","tick":"-57804","observationIndex":136,"observationCardinality":300,
        "observationCardinalityNext":300,"feeProtocol":0,"unlocked":true
    }
}
*/

// Calculate token0Amount, token1Amount
var currentTick = parseInt(poolInfo.slot0.tick)
var lowerPrice = 1.0001 ** posData.tickLower
var upperPrice = 1.0001 ** posData.tickUpper
var sqrtRatioA = Math.sqrt(lowerPrice)
var sqrtRatioB = Math.sqrt(upperPrice)
var sqrtPrice = Number(BigFloat(poolInfo.slot0.sqrtPriceX96) / Q96)

var amount0wei = 0
var amount1wei = 0
if (currentTick <= posData.tickLower) {
    amount0wei = Math.floor(posData.liquidity * ((sqrtRatioB - sqrtRatioA) / (sqrtRatioA * sqrtRatioB)))
} else if (currentTick > posData.tickUpper) {
    amount1wei = Math.floor(posData.liquidity * (sqrtRatioB - sqrtRatioA))
} else if (currentTick >= posData.tickLower && cu

مزید معلومات