Die Ressourcen sind geladen. Beförderung...

FMZ Quant Uniswap V3 Leitfaden für Börsenpool-Liquiditätsbezogene Operationen (Teil 1)

Schriftsteller:FMZ~Lydia, Erstellt: 2023-07-21 09:22:33, aktualisiert: 2024-11-11 22:37:08

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

FMZ Quant Uniswap V3 Leitfaden für Börsenpool-Liquiditätsbezogene Operationen (Teil 1)

NonfungiblePositionManager-Vertrag in Uniswap V3

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 =[inputs:[{internalType:address,name:_factoryV2,type:address},{internalType:address,type:address},{internalType:address,name:factoryV3,type:address},{internalType:address,name:input:address,type:address},{internalType:address,input:address,name:positionManager,type:address},{internalType:address:address,type:address,type:address:address,type:address:address:address,type:address:address: 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:type:address},{indexed:true,internalType:address:type:address:address},{indexed:true,internalType:address:type:type:address:address},{indexed:true:true:true,internalType:address:type:address:type:address:address ABI_Pool = [\\inputs\:[],\stateMutability\:\nonpayable\,\type\:\constructor\,\name\:\anonymous\:\false,\inputs\:\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ true,\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ABI_Factory = [\\inputs\:[],\stateMutability \:\\nonpayable\,\\\type\:\\addaddrester\,\\name\:\anonymous\:\false,\inputs\:\\\\\\indexed\:true,\\\internalType\:\\uint24\,\\\stateMutability \:\nonpayable\,\\\\type\:\addrester\:\uint24\,\name\:\anonymous\:false,\\"indexed\,\"type\:\"type\,\"type\,\"type\,\"type\,\"type\,\"type\"type\\"type\"type\"\"type\"\"type\"\"type\"\"type\"\"type\"\"type\"\"type\

// Uniswap-Kontraktadresse const UniswapV3RouterAddress = 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45 const VertragV3Fabrik = 0x1F98431c8aD98523631AE4a59f267346ea31F984

// 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(address) Das ist die Art und Weise, in der die Daten auf die Datenbank übertragen werden.

// 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 ((fetch, res.tokens.length, tokens von, res.name) _.each ((res.tokens, Funktion ((token) { - Ich habe keine Ahnung. Name: Token.Name Symbol: Zeichen.Symbol Dezimalzeichen: Token.Dezimalzeichen, Anschrift: token.address - Ich weiß. - Ich weiß. Log (( Token:, Token) - Ich weiß.

Funktion analysiertPosData ((posData) { /* - Ich weiß. Ankündigung : 0, Betriebspartner: 0x0000000000000000000000000000000000000000 Token1: 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2, Gebühr: 3000, FeeGrowthInside0LastX128: 552824104363438506727784685971981736468 FeeGrowthInside1LastX128: 2419576808699564757520565912733367379 Token Schulden: 0, Token verschuldet: 0, Token0: 0x1f9840a85d5af5bf1d1762f925bdaddc4201f984, tickUnterer: -62160, Ticke oben: -41280, Liquidität: 19090316141441365693 - 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

Weitere Informationen