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:
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user