Skip to content
Snippets Groups Projects
Commit 2db0b7f4 authored by David Hintermann's avatar David Hintermann
Browse files

feat(pool): implement rebalance swap

parent 9870a943
No related branches found
No related tags found
1 merge request!9feat(pool): correct pool price
using Nethereum.ABI.FunctionEncoding.Attributes;
using Nethereum.Contracts;
namespace Frontend.Functions;
[Function("liquiditry", "uint128")]
public class LiquidityFunction : FunctionMessage{
}
\ No newline at end of file
...@@ -93,12 +93,16 @@ public class PoolV3Client ...@@ -93,12 +93,16 @@ public class PoolV3Client
} }
public async Task<decimal> GetPairRatio() public async Task<decimal> GetPairRatio()
{
return (decimal)SqrtPriceX96ToPrice(await GetSqrtPriceX96());
}
public async Task<BigInteger> GetSqrtPriceX96()
{ {
var handler = _web3.Eth.GetContractQueryHandler<Slot0Funtion>(); var handler = _web3.Eth.GetContractQueryHandler<Slot0Funtion>();
var func = new Slot0Funtion(); var func = new Slot0Funtion();
var slot0Result = await handler.QueryDeserializingToObjectAsync<Slot0OutputDTO>(func, _pool.Address); var slot0Result = await handler.QueryDeserializingToObjectAsync<Slot0OutputDTO>(func, _pool.Address);
var sqrtPriceX96 = slot0Result.SqrtPriceX96; return slot0Result.SqrtPriceX96;
return (decimal)SqrtPriceX96ToPrice(sqrtPriceX96);
} }
public double SqrtPriceX96ToPrice(BigInteger sqrtPriceX96) public double SqrtPriceX96ToPrice(BigInteger sqrtPriceX96)
...@@ -138,7 +142,7 @@ public class PoolV3Client ...@@ -138,7 +142,7 @@ public class PoolV3Client
return _token1Address; return _token1Address;
} }
public async Task<uint> getPoolFeeTier() public async Task<uint> QueryPoolFee()
{ {
if (null == _poolFeeTier) if (null == _poolFeeTier)
{ {
...@@ -150,6 +154,12 @@ public class PoolV3Client ...@@ -150,6 +154,12 @@ public class PoolV3Client
return (uint)_poolFeeTier; return (uint)_poolFeeTier;
} }
public async Task<BigInteger> QueryLiquidity(){
var handler = _web3.Eth.GetContractQueryHandler<LiquidityFunction>();
var func = new LiquidityFunction();
return await handler.QueryAsync<BigInteger>(_pool.Address, func);
}
/* /*
this function should swap the tokens in the pool this function should swap the tokens in the pool
...@@ -181,7 +191,7 @@ public class PoolV3Client ...@@ -181,7 +191,7 @@ public class PoolV3Client
{ {
TokenIn = fromTokenAddress, TokenIn = fromTokenAddress,
TokenOut = toTokenAddress, TokenOut = toTokenAddress,
Fee = await getPoolFeeTier(), Fee = await QueryPoolFee(),
Recipient = _account.Address, Recipient = _account.Address,
AmountIn = Web3.Convert.ToWei(amount), AmountIn = Web3.Convert.ToWei(amount),
AmountOutMinimum = Web3.Convert.ToWei(amountOutMinimum), // Set your minimum amount out AmountOutMinimum = Web3.Convert.ToWei(amountOutMinimum), // Set your minimum amount out
...@@ -201,26 +211,30 @@ public class PoolV3Client ...@@ -201,26 +211,30 @@ public class PoolV3Client
/// This function should swap the tokens in the pool to create a desired quote /// This function should swap the tokens in the pool to create a desired quote
/// </summary> /// </summary>
/// <param name="desiredQuote">the ration between token1/token0</param> /// <param name="desiredQuote">the ration between token1/token0</param>
/// <returns></returns> /// <returns>Quote after the swap</returns>
public async Task<decimal> PerformSwapToCreatDesiredQuote(decimal desiredQuote) public async Task<decimal> PerformSwapToCreatDesiredQuote(decimal desiredQuote)
{ {
var currentQuote = await GetPairRatio(); var sqrtPriceX96= await GetSqrtPriceX96();
throw new NotImplementedException(); var desiredSqrtPriceX96=PriceToSqrtPriceX96((double)desiredQuote);
var amount = 0.0M; string[] tokenAddresses=[Token0Address,Token1Address];
if (currentQuote < desiredQuote) var fromTokenIndex=0;
{ var amount = 0.0;
// we sell some of token1 to buy token0 var liquidity=await QueryLiquidity();
amount = (desiredQuote - currentQuote) / desiredQuote; if(desiredSqrtPriceX96>sqrtPriceX96){ // we have to by token0 to increase demand and drive the price up
throw new NotImplementedException(); fromTokenIndex=1; // we want to swap from token1 to token0
await SwapAsync(Token1Address, Token0Address, amount);
} // Taken from getNextSqrtPriceFromAmount1RoundingDown see https://github.com/Uniswap/v3-core/blob/main/contracts/libraries/SqrtPriceMath.sol
else amount=(double)(liquidity*(desiredSqrtPriceX96-sqrtPriceX96));
{ }else{ // whe have to sell token0 to lower the price
amount = 1;
throw new NotImplementedException(); // Taken from getNextSqrtPriceFromAmount0ReoundingUp see https://github.com/Uniswap/v3-core/blob/main/contracts/libraries/SqrtPriceMath.sol
await SwapAsync(Token1Address, Token0Address, amount); amount=(double)(liquidity*(sqrtPriceX96-desiredSqrtPriceX96))/(double)(desiredSqrtPriceX96*sqrtPriceX96);
} }
throw new NotImplementedException(); amount *= 1+ (int)await QueryPoolFee()/1000.0; // add the fees
var receipt=await SwapAsync(tokenAddresses[fromTokenIndex],tokenAddresses[(fromTokenIndex+1)%2],Web3.Convert.FromWei(new BigInteger(amount)));
return await GetPairRatio();
} }
} }
\ No newline at end of file
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment