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

Merge branch 'feat-correct-pool-price' into 'master'

feat(pool): correct pool price

See merge request !9
parents 9870a943 d711a330
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
}
public async Task<decimal> GetPairRatio()
{
return (decimal)SqrtPriceX96ToPrice(await GetSqrtPriceX96());
}
public async Task<BigInteger> GetSqrtPriceX96()
{
var handler = _web3.Eth.GetContractQueryHandler<Slot0Funtion>();
var func = new Slot0Funtion();
var slot0Result = await handler.QueryDeserializingToObjectAsync<Slot0OutputDTO>(func, _pool.Address);
var sqrtPriceX96 = slot0Result.SqrtPriceX96;
return (decimal)SqrtPriceX96ToPrice(sqrtPriceX96);
return slot0Result.SqrtPriceX96;
}
public double SqrtPriceX96ToPrice(BigInteger sqrtPriceX96)
......@@ -138,7 +142,7 @@ public class PoolV3Client
return _token1Address;
}
public async Task<uint> getPoolFeeTier()
public async Task<uint> QueryPoolFee()
{
if (null == _poolFeeTier)
{
......@@ -150,6 +154,13 @@ public class PoolV3Client
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
......@@ -181,7 +192,7 @@ public class PoolV3Client
{
TokenIn = fromTokenAddress,
TokenOut = toTokenAddress,
Fee = await getPoolFeeTier(),
Fee = await QueryPoolFee(),
Recipient = _account.Address,
AmountIn = Web3.Convert.ToWei(amount),
AmountOutMinimum = Web3.Convert.ToWei(amountOutMinimum), // Set your minimum amount out
......@@ -201,26 +212,43 @@ public class PoolV3Client
/// This function should swap the tokens in the pool to create a desired quote
/// </summary>
/// <param name="desiredQuote">the ration between token1/token0</param>
/// <returns></returns>
public async Task<decimal> PerformSwapToCreatDesiredQuote(decimal desiredQuote)
/// <returns>Quote after the swap</returns>
public async Task<decimal> PerformSwapTowardsDesiredQuote(decimal desiredQuote)
{
var currentQuote = await GetPairRatio();
throw new NotImplementedException();
var amount = 0.0M;
if (currentQuote < desiredQuote)
{
// we sell some of token1 to buy token0
amount = (desiredQuote - currentQuote) / desiredQuote;
throw new NotImplementedException();
await SwapAsync(Token1Address, Token0Address, amount);
var sqrtPriceX96 = await GetSqrtPriceX96();
var desiredSqrtPriceX96 = PriceToSqrtPriceX96((double)desiredQuote);
string[] tokenAddresses = [Token0Address, Token1Address];
var fromTokenIndex = 0;
var amount = 0.0;
var liquidity = await QueryLiquidity();
var balance = new BigInteger(0);
if (desiredSqrtPriceX96 > sqrtPriceX96)
{ // we have to by token0 to increase demand and drive the price up
fromTokenIndex = 1; // we want to swap from token1 to token0
// Taken from getNextSqrtPriceFromAmount1RoundingDown see https://github.com/Uniswap/v3-core/blob/main/contracts/libraries/SqrtPriceMath.sol
amount = (double)(liquidity * (desiredSqrtPriceX96 - sqrtPriceX96)) / (double)BigInteger.Pow(2, 96);
balance = await Token1Client.BalanceOf(_account.Address);
}
else
{ // whe have to sell token0 to lower the price
// Taken from getNextSqrtPriceFromAmount0ReoundingUp see https://github.com/Uniswap/v3-core/blob/main/contracts/libraries/SqrtPriceMath.sol
amount = (double)(liquidity * BigInteger.Pow(2, 96) * (sqrtPriceX96 - desiredSqrtPriceX96)) / (double)(desiredSqrtPriceX96 * sqrtPriceX96);
balance = await Token0Client.BalanceOf(_account.Address);
}
amount *= 1.0 + (double)await QueryPoolFee() / 1000.0; // add the pool fees
var bigIntAmount = new BigInteger(amount);
if (balance < bigIntAmount)
{
amount = 1;
throw new NotImplementedException();
await SwapAsync(Token1Address, Token0Address, amount);
bigIntAmount = balance;
}
throw new NotImplementedException();
var receipt = await SwapAsync(tokenAddresses[fromTokenIndex], tokenAddresses[(fromTokenIndex + 1) % 2], Web3.Convert.FromWei(bigIntAmount));
return await GetPairRatio();
}
}
\ No newline at end of file
......@@ -109,4 +109,15 @@ public class TokenClient
return transactionReceipt.TransactionHash;
}
public async Task<BigInteger> BalanceOf(string address){
var func = new BalanceOfFunction
{
Owner = address,
};
var handler = _web3.Eth.GetContractQueryHandler<BalanceOfFunction>();
return await handler.QueryAsync<BigInteger>(_tokenAddress, func);
}
}
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