Gmx v2 - Funding rates (#6)

* Setup GMX v2

* Add get markets

* Map token with service

* Add get market info data

* Add get markets

* Add get market token prices

* Get markets infos multicall

* Try call datastore

* Add some tests to figure out why datastore call dont work

* Update funding rates

* clean
This commit is contained in:
Oda
2024-08-17 06:50:18 +07:00
committed by GitHub
parent b4087753c7
commit 68aa7fff5d
75 changed files with 8979 additions and 608 deletions

View File

@@ -29,7 +29,7 @@ public class EvmManager : IEvmManager
private readonly Web3 _web3;
private readonly HttpClient _httpClient;
private readonly string _password = "!StrongPassword94";
private readonly IEnumerable<ISubgraphPrices> _subgraphs;
private readonly IEnumerable<ISubgraphPrices> _subgraphs;
private Dictionary<string, Dictionary<string, decimal>> _geckoPrices;
public EvmManager(IEnumerable<ISubgraphPrices> subgraphs)
@@ -38,7 +38,9 @@ public class EvmManager : IEvmManager
_web3 = new Web3(defaultChain.RpcUrl);
_httpClient = new HttpClient();
_subgraphs = subgraphs;
_geckoPrices = _geckoPrices != null && _geckoPrices.Any() ? _geckoPrices : new Dictionary<string, Dictionary<string, decimal>>();
_geckoPrices = _geckoPrices != null && _geckoPrices.Any()
? _geckoPrices
: new Dictionary<string, Dictionary<string, decimal>>();
SetupPrices();
}
@@ -131,7 +133,8 @@ public class EvmManager : IEvmManager
return holders;
}
public async Task<List<EventLog<Nethereum.Contracts.Standards.ERC721.ContractDefinition.TransferEventDTO>>> GetNftEvent(string contractAddress, string tokenOwner)
public async Task<List<EventLog<Nethereum.Contracts.Standards.ERC721.ContractDefinition.TransferEventDTO>>>
GetNftEvent(string contractAddress, string tokenOwner)
{
return await NftService.GetNftEvent(_web3, tokenOwner, contractAddress);
}
@@ -186,15 +189,16 @@ public class EvmManager : IEvmManager
{
var web3 = new Web3(chain.RpcUrl);
var etherBalance = Web3.Convert.FromWei(await web3.Eth.GetBalance.SendRequestAsync(account));
var etherPrice = (await GetPrices(new List<string> { "ethereum"}))["ethereum"]["usd"];
var etherPrice = (await GetPrices(new List<string> { "ethereum" }))["ethereum"]["usd"];
return new EvmBalance() { Balance = etherBalance, Price = etherPrice, TokenName = "ETH", Value = etherBalance * etherPrice };
return new EvmBalance()
{ Balance = etherBalance, Price = etherPrice, TokenName = "ETH", Value = etherBalance * etherPrice };
}
public async Task<List<EvmBalance>> GetAllBalances(Domain.Evm.Chain chain, string publicAddress)
{
var balances = new List<EvmBalance>();
var web3 = new Web3(chain.RpcUrl);
SetupPrices();
@@ -213,6 +217,7 @@ public class EvmManager : IEvmManager
// TODO : handle exception
}
}
var etherBalance = await GetEtherBalance(chain, publicAddress);
etherBalance.Chain = chain;
balances.Add(etherBalance);
@@ -267,7 +272,8 @@ public class EvmManager : IEvmManager
return evmBalance;
}
public async Task<List<EvmBalance>> GetBalances(Domain.Evm.Chain chain, int page, int pageSize, string publicAddress)
public async Task<List<EvmBalance>> GetBalances(Domain.Evm.Chain chain, int page, int pageSize,
string publicAddress)
{
var callList = new List<IMulticallInputOutput>();
var startItem = (page * pageSize);
@@ -281,6 +287,7 @@ public class EvmManager : IEvmManager
tokens[i].Address);
callList.Add(call);
}
var evmTokens = new List<(EvmBalance Balance, GeckoToken GeckoToken)>();
try
@@ -292,7 +299,8 @@ public class EvmManager : IEvmManager
for (int i = startItem; i < totaItemsToFetch; i++)
{
var balance = ((MulticallInputOutput<BalanceOfFunction, BalanceOfOutputDTO>)callList[i - startItem]).Output.Balance;
var balance = ((MulticallInputOutput<BalanceOfFunction, BalanceOfOutputDTO>)callList[i - startItem])
.Output.Balance;
if (balance > 0)
{
var tokenBalance = new EvmBalance()
@@ -303,7 +311,8 @@ public class EvmManager : IEvmManager
Chain = chain
};
var geckoToken = geckoTokens.FirstOrDefault(x => string.Equals(x.Symbol, tokens[i].Symbol, StringComparison.InvariantCultureIgnoreCase));
var geckoToken = geckoTokens.FirstOrDefault(x =>
string.Equals(x.Symbol, tokens[i].Symbol, StringComparison.InvariantCultureIgnoreCase));
evmTokens.Add((tokenBalance, geckoToken));
}
@@ -324,7 +333,6 @@ public class EvmManager : IEvmManager
}
}
}
}
catch (Exception ex)
{
@@ -338,7 +346,8 @@ public class EvmManager : IEvmManager
public async Task<Dictionary<string, Dictionary<string, decimal>>> GetPrices(List<string> geckoIds)
{
var idsCombined = string.Join(",", geckoIds);
return await _httpClient.GetFromJsonAsync<Dictionary<string, Dictionary<string, decimal>>>("https://api.coingecko.com/api/v3/simple/price?ids=" + idsCombined + "&vs_currencies=usd");
return await _httpClient.GetFromJsonAsync<Dictionary<string, Dictionary<string, decimal>>>(
"https://api.coingecko.com/api/v3/simple/price?ids=" + idsCombined + "&vs_currencies=usd");
}
public async Task<List<EvmBalance>> GetAllBalancesOnAllChain(string publicAddress)
@@ -354,11 +363,12 @@ public class EvmManager : IEvmManager
return chainBalances;
}
public async Task<List<Candle>> GetCandles(SubgraphProvider subgraphProvider, Ticker ticker, DateTime startDate, Timeframe timeframe)
public async Task<List<Candle>> GetCandles(SubgraphProvider subgraphProvider, Ticker ticker, DateTime startDate,
Timeframe timeframe)
{
string gmxTimeframe = GmxHelpers.GeTimeframe(timeframe);
var gmxPrices = await _httpClient.GetFromJsonAsync<GmxPrices>($"https://stats.gmx.io/api/candles/{ticker}?preferableChainId=42161&period={gmxTimeframe}&from={startDate.ToUnixTimestamp()}&preferableSource=fast");
var gmxPrices = await _httpClient.GetFromJsonAsync<GmxPrices>(
$"https://stats.gmx.io/api/candles/{ticker}?preferableChainId=42161&period={gmxTimeframe}&from={startDate.ToUnixTimestamp()}&preferableSource=fast");
//var subgraph = _subgraphs.First(s => s.GetProvider() == subgraphProvider);
//var prices = await subgraph.GetPrices(ticker, startDate, timeframe);
@@ -401,7 +411,8 @@ public class EvmManager : IEvmManager
public async Task<Candle> GetCandle(SubgraphProvider subgraphProvider, Ticker ticker)
{
var lastPrices = await GetCandles(subgraphProvider, ticker, DateTime.UtcNow.AddMinutes(-15), Timeframe.FiveMinutes);
var lastPrices = await GetCandles(subgraphProvider, ticker, DateTime.UtcNow.AddMinutes(-15),
Timeframe.FiveMinutes);
return lastPrices.Last();
}
@@ -482,7 +493,6 @@ public class EvmManager : IEvmManager
string receiverAddress,
Web3 web3)
{
var contractAddress = TokenService.GetContractAddress(ticker);
var transactionMessage = new TransferFunction
{
@@ -495,7 +505,8 @@ public class EvmManager : IEvmManager
var transferReceipt =
await transferHandler.SendRequestAndWaitForReceiptAsync(contractAddress, transactionMessage);
var transaction = await web3.Eth.Transactions.GetTransactionByHash.SendRequestAsync(transferReceipt.TransactionHash);
var transaction =
await web3.Eth.Transactions.GetTransactionByHash.SendRequestAsync(transferReceipt.TransactionHash);
return transaction != null;
}
@@ -523,7 +534,6 @@ public class EvmManager : IEvmManager
try
{
trade = await GmxService.IncreasePosition(web3, account.Key, ticker, direction, price, quantity, leverage);
}
catch (Exception ex)
{
@@ -558,9 +568,9 @@ public class EvmManager : IEvmManager
return trade;
}
public async Task<Trade> DecreaseOrder(Account account, TradeType tradeType, Ticker ticker, TradeDirection direction, decimal price, decimal quantity, decimal? leverage)
public async Task<Trade> DecreaseOrder(Account account, TradeType tradeType, Ticker ticker,
TradeDirection direction, decimal price, decimal quantity, decimal? leverage)
{
var wallet = new Wallet(account.Secret, _password).GetAccount(account.Key);
var chain = ChainService.GetChain(Constants.Chains.Arbitrum);
var web3 = new Web3(wallet, chain.RpcUrl);
@@ -568,7 +578,8 @@ public class EvmManager : IEvmManager
Trade trade = null;
try
{
trade = await GmxService.DecreaseOrder(web3, tradeType, account.Key, ticker, direction, price, quantity, leverage);
trade = await GmxService.DecreaseOrder(web3, tradeType, account.Key, ticker, direction, price, quantity,
leverage);
}
catch (Exception ex)
{
@@ -591,13 +602,14 @@ public class EvmManager : IEvmManager
return await GmxService.GetTrade(web3, reference, ticker);
}
public Task<List<FundingRate>> GetFundingRates()
public async Task<List<FundingRate>> GetFundingRates()
{
// Call GMX v2
// Call hyperliquid
// Map the results
return Task.FromResult(new List<FundingRate>());
var chain = ChainService.GetChain(Constants.Chains.Arbitrum);
var web3 = new Web3(chain.RpcUrl);
var service = new GmxV2Service();
var fundingRates = await service.GetFundingRates(web3);
return fundingRates;
}
public async Task<decimal> QuantityInPosition(string chainName, string publicAddress, Ticker ticker)
@@ -626,5 +638,4 @@ public class EvmManager : IEvmManager
return GmxHelpers.Map(orders, ticker);
}
}