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

type:function},{inputs:[{internalType:address:uint24,name:"",type:uint24}),name:feeAmountTickSpacing,outputs:[{internalType:int24,name:"",type:int24}],stateMutability:view,type:function},{inputs:[{internalType:address:uint24,name",",type:address:address},{internalType:address,addressname:"",type:address:address:,outputs:"type:"",type:"",type:"",type:"",type:"",type:"",type:"

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

// constante commune const ZERO = BigInt(0) Il est possible de modifier le const Deux = BigInt (2) Const Q96 = (deux ** BigInt ((96)) Const Q128 = (deux ** BigInt ((128)) const Q192 = (deux ** BigInt ((96)) ** deux Const Q256 = (deux ** BigInt ((256))

// Convertissez à une quantité lisible fonction toAmount ((s, décimales) { Retourner le nombre (s) (s) (s) (s) (s) (s) (s) (s) Je ne sais pas.

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

fonction subIn256 ((x, y) { différence de variation = x - y si (différence < zéro) { Retour Q256 + différence { \ pos (192,220) } autre différence de rendement Je ne sais pas. Je ne sais pas.

// Enregistrer des informations sur les jetons interrogés à traverscoingecko.comles étiquettes var = [...] fonction init (() { Var res = JSON.parse ((HttpQuery))https://tokens.coingecko.com/uniswap/all.json)) Log ((fetch, rés.tokens.length, tokens de,res.name) _.chacun des jetons de résolution, fonction (jeton) { Je ne sais pas. Nom:token.nameJe suis désolée. 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 principale // L'adresse du portefeuille à rechercher // const porte-monnaie Adresse =exchange.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(getFees(pos))
}

var tbl = {
    type : "table",
    title : "LP-Fees",
    cols : ["token0", "token1", "fee", "token0Fee", "token1Fee"],
    rows : positions
}
LogStatus("`" + JSON.stringify(tbl) + "`")

}

fonction getFees ((posData) { Le code de la banque est le code de la banque. Le code de la banque est le code de la banque. pour (variation en jetons) { si (tokens[i].address.toLowerCase() == posData.token0.toLowerCase()) { Le montant de la garantie est calculé à partir de la valeur de la garantie. } autre si (tokens[i].address.toLowerCase() == posData.token1.toLowerCase()) { Le numéro de série est le numéro de série de l'appareil. Je ne sais pas. Je ne sais pas.

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

// get Pool
var token0Address = token0Symbol.address
var token1Address = token1Symbol.address
if (BigInt(token0Address) > BigInt(token1Address)) {
    var tmp = token0Address
    token0Address = token1Address
    token1Address = tmp
}

// Registered factory contract ABI
exchange.IO("abi", ContractV3Factory, ABI_Factory)
// Call the getPool method of the factory contract to get the pool address
var poolAddress = exchange.IO("api", ContractV3Factory, "getPool", token0Address, token1Address, posData.fee)
if (!poolAddress) {
    throw "getPool failed"
}
Log("poolAddress:", poolAddress)

// ABI for registered pool contracts
exchange.IO("abi", poolAddress, ABI_Pool)

// Get the slot0 data in the exchange pool
var slot0 = exchange.IO("api", poolAddress, "slot0")
if (!slot0) {
	throw "get slot0 failed"
}    

// feeGrowthGlobal0X128 , feeGrowthGlobal1X128
var feeGrowthGlobal0 = exchange.IO("api", poolAddress, "feeGrowthGlobal0X128")
var feeGrowthGlobal1 = exchange.IO("api", poolAddress, "feeGrowthGlobal1X128")
if (!feeGrowthGlobal0 || !feeGrowthGlobal1) {
    throw "get feeGrowthGlobal failed"
}

// Call the ticks method of the pool contract by taking tickLower , tickUpper from posData as parameters
var tickLow = exchange.IO("api", poolAddress, "ticks", posData.tickLower)
var tickHigh = exchange.IO("api", poolAddress, "ticks", posData.tickUpper)
if (!tickLow || !tickHigh) {
    throw "get tick failed"
}

// Obtain feeGrowthOutside0X128 and feeGrowthOutside1X128 data for tickeLow and tickeHigh
var feeGrowth0Low = tickLow.feeGrowthOutside0X128
var feeGrowth0Hi = tickHigh.feeGrowthOutside0X128
var feeGrowth1Low = tickLow.feeGrowthOutside1X128
var feeGrowth1Hi = tickHigh.feeGrowthOutside1X128

// feeGrowthInside0 feeGrowthInside1
var feeGrowthInside0 = posData.feeGrowthInside0LastX128
var feeGrowthInside1 = posData.feeGrowthInside1LastX128

var liquidity = BigInt(posData.liquidity)
var tickLow = parseInt(posData.tickLower)
var tickHigh = parseInt(posData.tickUpper)
var tickCurrent = parseInt(slot0.tick)
var decimal0 = token0Symbol.decimals
var decimal1 = token1Symbol.decimals

// Converted to a BigInt type for calculating the
var feeGrowthGlobal_0 = BigInt(feeGrowthGlobal0)
var feeGrowthGlobal_1 = BigInt(feeGrowthGlobal1)

var tickLowerFeeGrowthOutside_0 = BigInt(feeGrowth0Low)
var tickLowerFeeGrowthOutside_1 = BigInt(feeGrowth1Low)

var tickUpperFeeGrowthOutside_0 = BigInt(feeGrowth0Hi)
var tickUpperFeeGrowthOutside_1 = BigInt(feeGrowth1Hi)

var tickLowerFeeGrowthBelow_0 = ZERO
var tickLowerFeeGrowthBelow_1 = ZERO
var tickUpperFeeGrowthAbove_0 = ZERO
var tickUpperFeeGrowthAbove_1 = ZERO

if (tickCurrent >= tickHigh) {
    tickUpperFeeGrowthAbove_0 = subIn256(feeGrowthGlobal_0, tickUpperFeeGrowthOutside_0)
    tickUpperFeeGrowthAbove_1 = subIn256(feeGrowthGlobal_1, tickUpperFeeGrowthOutside_1)
} else {
    tickUpperFeeGrowthAbove_0 = tickUpperFeeGrowthOutside_0
    tickUpperFeeGrowthAbove_1 = tickUpperFeeGrowthOutside_1
}

if (tickCurrent >= tickLow) {
    tickLowerFeeGrowthBelow_0 = tickLowerFeeGrowthOutside_0
    tickLowerFeeGrowthBelow_1 = tickLowerFeeGrowthOutside_1
} else {
    tickLowerFeeGrowthBelow_0 = subIn256(feeGrowthGlobal_0, tickLowerFeeGrowthOutside_0)
    tickLowerFeeGrowthBelow_1 = subIn256(feeGrowthGlobal_1, tickLowerFeeGrowthOutside_1)
}

var fr_t1_0 = subIn256(subIn256(feeGrowthGlobal_0, tickLowerFeeGrowthBelow_0), tickUpperFeeGrowthAbove_0)
var fr_t1_1 = subIn256(subIn256(feeGrowthGlobal_1, tickLowerFeeGrowthBelow_1), tickUpperFeeGrowthAbove_1)

var feeGrowthInsideLast_0 = BigInt(feeGrowthInside0)
var feeGrowthInsideLast_1 = BigInt(feeGrowthInside1)

var uncollectedFees_0 = (liquidity * subIn256(fr_t1_0, feeGrowthInsideLast_0)) / Q128
var uncollectedFees_1 = (liquidity * subIn256(fr_t1_1, feeGrowthInsideLast_1)) / Q128

// Calculate the Fee to get token0 and token1
var token0Fee = toAmount(uncollectedFees_0, decimal0)
var token1Fee = toAmount(uncollectedFees_1, decimal1)

return [token0Symbol.symbol, token1Symbol.symbol, posData.fee / 10000 + "%", token0Fee, token1Fee]

}


![img](/upload/asset/28d88187ae84ce5d5379c.png)

![img](/upload/asset/28dd7917ad3df05b6c272.png)

In the next post, we will conduct an exploration of increasing mobility and decreasing mobility on Uniswap V3 DEX.

Plus de