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 =
[
const ABI_NonfungiblePositionManager =
[Inputs: [Type interne: adresse, nom: usine, type: adresse, nom: adresse]Le code de l'appareil
// Adresse du contrat Uniswap
const UniswapV3RouterAddress =
// 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(
// 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 ((
fonction parsePosData ((posData) {
/*
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