Les ressources ont été chargées... Je charge...

FMZ Quant Uniswap V3 Guide des opérations liées à la liquidité des fonds communs de change (partie 1)

Auteur:FMZ~Lydia, Créé: 2023-07-21 09:22:33, Mis à jour: 2024-11-11 22:37:08

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

FMZ Quant Uniswap V3 Guide des opérations liées à la liquidité des fonds communs de change (partie 1)

NonfungiblePositionManager Contract dans Uniswap V3

Lorsque nous ajoutons de la liquidité au pool de liquidité Uniswap V3 (pool de paires de négociation), le contrat NonfungiblePositionManager nous renvoie un NFT frappé comme preuve de l'ajout de liquidité.

La première étape consiste à utiliser le contrat de routeur pour obtenir l'adresse du contrat NonfungiblePositionManager correspondant, puis à utiliser la méthode balanceOf du contrat NonfungiblePositionManager pour obtenir le nombre de NFT de position pour l'adresse de portefeuille spécifiée.

Ensuite, utilisez la méthode tokenOfOwnerByIndex pour obtenir le tokenId de ces NFT de position, avec ces tokenId, vous pouvez utiliser la méthode positions pour continuer à interroger les détails spécifiques de ces positions.

Le code d'essai suivant:

// Uniswap ABI const ABI_UniswapV3Router =[inputs:[{internalType:address,name:_factoryV2,type:address},{internalType:address,type:address},{internalType:factoryV3,name:type:address},{internalType:address,inputs:address,inputs:address,name:positionManager,type:address},{internalType:address,name:_WETH9,type:,type:address:address,type:address:address:address:address:address:address:address:address:address:address:type:, const ABI_NonfungiblePositionManager =[Inputs: [Type interne: adresse, nom: usine, type: adresse, nom: adresse]Le code de l'appareil,type:address}],stateMutability:nonpayable,type:constructor},{indexed:true:false,inputs:[indexed:true,internalType:address,name:owner,type:address},{indexed:true,internalType:address:type:address},{indexed:true,internalType:address:type:address:address},{indexed:true,internalType:address:type:type:address:address},{indexed:true,type:owner:type:type:address:address:address:address},{inde ABI_Pool = [\\\\inputs\:[],\stateMutability\:\\\nonpayable\,\\\type\:\\\constructor\,\name\:\anonyme\:\false,\inputs\:\\\\\\\\\indexed\:true,\\\\internalType\:\\internalType\:\\address\:\stateMutability\:\\\\\nonpayable\,\\\type\:\\\\\\internalType\:\\\constructor\,\\name\:\anonyme\:\:false\:\:false\,\inbox\:\\\\\\\\\\\\"type\\type\\\\\\\\\\\\\\\\\\\ ABI_Factory = [\\inputs\:[],\stateMutability\:\\nonpayable\,\\type\:\\\addconstructor\,\\anonyme\:\false,\inputs\:[\\\\indexed\:true,\\internalType\:\uint24\,\\\name\:\fee\,\\\\\\\\\type\:\\uint24\,\\\indexed\:type\:\internalType\:\addaddaddaddonType\:\uint24\,\name\:\tickaddaddaddaddaddspacing\,\type\:\,\type\:\,\type\:\type\:\\type\:\type\:\\type\:\\type\:\:\type\:

// Adresse du contrat Uniswap const UniswapV3RouterAddress = 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45 const ContratV3Factory = 0x1F98431c8aD98523631AE4a59f267346ea31F984

// constante commune const Deux = BigInt (2) const Q192 = (deux ** BigInt ((96)) ** deux Const Q96 = (deux ** BigInt ((96))

// Convertir en une quantité lisible fonction toAmount ((s, décimales) { Retourner le nombre (s) de bits (s) / (s) de bits (s) à String Je ne sais pas.

// Conversion inverse de la quantité lisible à la quantité utilisée pour les paramètres de transmission et les calculs fonction àInnerAmount ((n, décimales) { retour (BigDecimal(n) * BigDecimal(Math.pow(10, décimales))).à Fixé(0) Je ne sais pas.

fonction principale // L'adresse du portefeuille à rechercher // const portefeuilleAdresse = échange.IO(adresse) 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) + "`")

}

// Enregistrer des informations sur les jetons interrogés par coingecko.com les étiquettes var = [] fonction init (() { // Lors de l'initialisation, obtenir des informations sur tous les jetons à interroger le Var res = JSON.parse ((HttpQuery))https://tokens.coingecko.com/uniswap/all.json”)) Log ((fetch, res.tokens.length, tokens from, res.name) _.chacun des jetons de résolution, de la fonction de jeton Les jetons. nom: jeton.nom, le symbole : token.symbol, les nombres décimaux: token.decimals, adresse: token.address Je ne sais pas. Je ne sais pas. Log (( jetons:, jetons) Je ne sais pas.

fonction parsePosData ((posData) { /* Je ne sais pas. annonce: 0, opérateur : 0x000000000000000000000000000000000000 , token1: 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2, frais: 3000, taxe sur la croissance à l'intérieur0dernièreX128: 552824104363438506727784685971981736468, taxe de croissance à l'intérieur1 DernierX128: 2419576808699564757520565912733367379, Les jetons sont dus: Les jetons sont dus: token0: 0x1f9840a85d5af5bf1d1762f925bdaddc4201f984, tickLower: -62160, tickUpper: -41280, liquidité : 19090316141441365693 Je ne sais pas. */

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

En savoir plus