Wenn wir dem Uniswap V3-Liquiditätspool (Trading Pair Pool) Liquidität hinzufügen, gibt uns der NonfungiblePositionManager-Kontrakt als Nachweis für die Liquiditätszuführung ein geprägtes NFT zurück.
Der erste Schritt besteht darin, den Routervertrag zu verwenden, um die Adresse des entsprechenden NonfungiblePositionManager-Kontrakts zu erhalten, und dann die BalanceOf-Methode des NonfungiblePositionManager-Kontrakts zu verwenden, um die Anzahl der Positions-NFTs für die angegebene Brieftaschenadresse zu erhalten.
Verwenden Sie dann die Methode tokenOfOwnerByIndex, um die TokenId dieser Position NFTs zu erhalten, mit diesen TokenId können Sie die Positionsmethode verwenden, um die spezifischen Details dieser Positionen weiter abzufragen.
Der folgende Prüfcode:
“
// Uniswap ABI
const ABI_UniswapV3Router =
[
const ABI_NonfungiblePositionManager =
[{
// Uniswap-Kontraktadresse
const UniswapV3RouterAddress =
// gemeinsame Konstante const ZWEI = BigInt(2) Konst Q192 = (ZWEI ** BigInt(96)) ** ZWEI Konst Q96 = (ZWEI ** BigInt ((96))
// Umwandeln in lesbare Menge Funktion toAmount ((s, Dezimalstellen) { Rückgabe von Nummern (BigDecimal) (BigInt) (s) / (BigDecimal) (Math.pow), (decimal)) (toString)) - Ich weiß.
// Umkehrung von lesbarem Betrag in den für die Übermittlung von Parametern und Berechnungen verwendeten Betrag Funktion toInnerAmount ((n, Dezimalstellen) { Rückgabe (BigDecimal(n) * BigDecimal(Math.pow(10, Dezimalstellen))).zu Festgesetzt(0) - Ich weiß.
Hauptfunktion
// Die Adresse der zu durchsuchenden Geldbörse
// const walletAddress = exchange.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) + "`")
}
// Aufzeichnen Sie Informationen über Token, die über coingecko.com abgerufen wurden
VAR-Token = []
Funktion init (() {
// Bei der Initialisierung, erhalten Informationen über alle Token zu abfragen die
VAR res = JSON.parse ((HttpQuery))https://tokens.coingecko.com/uniswap/all.json”))
Log ((
Funktion analysiertPosData ((posData) {
/*
- Ich weiß.
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