GMX v2 - Trading (#7)

* Move PrivateKeys.cs

* Update gitignore

* Update gitignore

* updt

* Extract GmxServiceTests.cs

* Refact

* update todo

* Update code

* Fix hashdata

* Replace static token hashed datas

* Set allowance

* Add get orders

* Add get orders tests

* Add ignore

* add close orders

* revert

* Add get gas limit

* Start increasePosition. Todo: Finish GetExecutionFee and estimateGas

* little refact

* Update gitignore

* Fix namespaces and clean repo

* Add tests samples

* Add execution fee

* Add increase position

* Handle backtest on the frontend

* Add tests

* Update increase

* Test increase

* fix increase

* Fix size

* Start get position

* Update get positions

* Fix get position

* Update rpc and trade mappers

* Finish close position

* Fix leverage
This commit is contained in:
Oda
2025-01-30 23:06:22 +07:00
committed by GitHub
parent ecaa89c67b
commit 65bdb8e34f
156 changed files with 11253 additions and 4073 deletions

View File

@@ -9,7 +9,8 @@ using Managing.Domain.Evm;
using Managing.Domain.Statistics;
using Managing.Domain.Trades;
using Managing.Infrastructure.Evm.Abstractions;
using Managing.Infrastructure.Evm.Models.Gmx;
using Managing.Infrastructure.Evm.Models;
using Managing.Infrastructure.Evm.Models.Gmx.v1;
using Managing.Infrastructure.Evm.Referentials;
using Managing.Infrastructure.Evm.Services;
using Managing.Infrastructure.Evm.Services.Gmx;
@@ -21,6 +22,10 @@ using Nethereum.Hex.HexTypes;
using Nethereum.Signer;
using Nethereum.Web3;
using static Managing.Common.Enums;
using BalanceOfFunction = Nethereum.Contracts.Standards.ERC20.ContractDefinition.BalanceOfFunction;
using BalanceOfOutputDTO = Nethereum.Contracts.Standards.ERC20.ContractDefinition.BalanceOfOutputDTO;
using Chain = Managing.Domain.Evm.Chain;
using TransferEventDTO = Nethereum.Contracts.Standards.ERC721.ContractDefinition.TransferEventDTO;
namespace Managing.Infrastructure.Evm;
@@ -31,6 +36,7 @@ public class EvmManager : IEvmManager
private readonly string _password = "!StrongPassword94";
private readonly IEnumerable<ISubgraphPrices> _subgraphs;
private Dictionary<string, Dictionary<string, decimal>> _geckoPrices;
private readonly GmxV2Service _gmxV2Service;
public EvmManager(IEnumerable<ISubgraphPrices> subgraphs)
{
@@ -41,6 +47,7 @@ public class EvmManager : IEvmManager
_geckoPrices = _geckoPrices != null && _geckoPrices.Any()
? _geckoPrices
: new Dictionary<string, Dictionary<string, decimal>>();
_gmxV2Service = new GmxV2Service();
SetupPrices();
}
@@ -133,7 +140,7 @@ public class EvmManager : IEvmManager
return holders;
}
public async Task<List<EventLog<Nethereum.Contracts.Standards.ERC721.ContractDefinition.TransferEventDTO>>>
public async Task<List<EventLog<TransferEventDTO>>>
GetNftEvent(string contractAddress, string tokenOwner)
{
return await NftService.GetNftEvent(_web3, tokenOwner, contractAddress);
@@ -185,7 +192,7 @@ public class EvmManager : IEvmManager
return wallet.GetAccount(0).Address;
}
public async Task<EvmBalance> GetEtherBalance(Domain.Evm.Chain chain, string account)
public async Task<EvmBalance> GetEtherBalance(Chain chain, string account)
{
var web3 = new Web3(chain.RpcUrl);
var etherBalance = Web3.Convert.FromWei(await web3.Eth.GetBalance.SendRequestAsync(account));
@@ -195,12 +202,9 @@ public class EvmManager : IEvmManager
{ Balance = etherBalance, Price = etherPrice, TokenName = "ETH", Value = etherBalance * etherPrice };
}
public async Task<List<EvmBalance>> GetAllBalances(Domain.Evm.Chain chain, string publicAddress)
public async Task<List<EvmBalance>> GetAllBalances(Chain chain, string publicAddress)
{
var balances = new List<EvmBalance>();
var web3 = new Web3(chain.RpcUrl);
SetupPrices();
foreach (var ticker in Enum.GetValues<Ticker>())
{
@@ -221,13 +225,6 @@ public class EvmManager : IEvmManager
var etherBalance = await GetEtherBalance(chain, publicAddress);
etherBalance.Chain = chain;
balances.Add(etherBalance);
//var pageSize = 50;
//var tokenCount = TokenService.GetTokens().Count;
//for (int i = 0; i < (tokenCount / pageSize); i++)
//{
// var pageBalances = await GetBalances(chain, i, pageSize, publicAddress).ConfigureAwait(false);
// balances.AddRange(pageBalances);
//}
return balances;
}
@@ -272,7 +269,7 @@ public class EvmManager : IEvmManager
return evmBalance;
}
public async Task<List<EvmBalance>> GetBalances(Domain.Evm.Chain chain, int page, int pageSize,
public async Task<List<EvmBalance>> GetBalances(Chain chain, int page, int pageSize,
string publicAddress)
{
var callList = new List<IMulticallInputOutput>();
@@ -338,6 +335,8 @@ public class EvmManager : IEvmManager
{
// TODO : Handle error
// No enable to reach rpc
var test = ex.Message;
}
return evmTokens.Select(e => e.Balance).ToList();
@@ -433,23 +432,15 @@ public class EvmManager : IEvmManager
}
}
public async Task<bool> ApproveTicker(string publicAddress, string privateKey, Ticker ticker)
public async Task<BigInteger> GetAllowance(string publicAddress, Ticker ticker)
{
try
{
var account = new Wallet(privateKey, _password).GetAccount(publicAddress);
var contractAddress = TokenService.GetContractAddress(ticker);
await GmxService.ApproveToken(_web3, publicAddress, contractAddress);
return true;
}
catch (Exception ex)
{
return false;
}
var contractAddress = TokenService.GetContractAddress(ticker);
var allowance = await EvmBase.GetAllowance(_web3, publicAddress, contractAddress);
return allowance;
}
public async Task<bool> Send(
Domain.Evm.Chain chain,
Chain chain,
Ticker ticker,
decimal amount,
string publicAddress,
@@ -465,10 +456,8 @@ public class EvmManager : IEvmManager
{
return await SendEth(amount, receiverAddress, web3);
}
else
{
return await SendToken(ticker, amount, publicAddress, receiverAddress, web3);
}
return await SendToken(ticker, amount, publicAddress, receiverAddress, web3);
}
catch (Exception ex)
{
@@ -515,7 +504,9 @@ public class EvmManager : IEvmManager
var wallet = new Wallet(account.Secret, _password).GetAccount(account.Key);
var chain = ChainService.GetChain(Constants.Chains.Arbitrum);
var web3 = new Web3(wallet, chain.RpcUrl);
return await GmxService.CancelOrders(web3, account.Key, ticker);
// return await GmxService.CancelOrders(web3, account.Key, ticker);
var service = new GmxV2Service();
return await service.CancelOrders(web3, account.Key, ticker);
}
public async Task<Trade> IncreasePosition(
@@ -533,7 +524,8 @@ public class EvmManager : IEvmManager
Trade trade = null;
try
{
trade = await GmxService.IncreasePosition(web3, account.Key, ticker, direction, price, quantity, leverage);
trade = await _gmxV2Service.IncreasePosition(web3, account.Key, ticker, direction, price, quantity,
leverage);
}
catch (Exception ex)
{
@@ -558,7 +550,8 @@ public class EvmManager : IEvmManager
Trade trade = null;
try
{
trade = await GmxService.DecreasePosition(web3, account.Key, ticker, direction, price, quantity, leverage);
trade = await _gmxV2Service.DecreasePosition(web3, account.Key, ticker, direction, price, quantity,
leverage ?? 1);
}
catch (Exception ex)
{
@@ -575,7 +568,7 @@ public class EvmManager : IEvmManager
var chain = ChainService.GetChain(Constants.Chains.Arbitrum);
var web3 = new Web3(wallet, chain.RpcUrl);
Trade trade = null;
Trade trade;
try
{
trade = await GmxService.DecreaseOrder(web3, tradeType, account.Key, ticker, direction, price, quantity,
@@ -599,7 +592,7 @@ public class EvmManager : IEvmManager
{
var chain = ChainService.GetChain(chainName);
var web3 = new Web3(chain.RpcUrl);
return await GmxService.GetTrade(web3, reference, ticker);
return await _gmxV2Service.GetTrade(web3, reference, ticker);
}
public async Task<List<FundingRate>> GetFundingRates()
@@ -634,8 +627,25 @@ public class EvmManager : IEvmManager
var wallet = new Wallet(account.Secret, _password).GetAccount(account.Key);
var chain = ChainService.GetChain(Constants.Chains.Arbitrum);
var web3 = new Web3(wallet, chain.RpcUrl);
var orders = await GmxService.GetOrders(web3, account.Key, ticker);
// var orders = await GmxService.GetOrders(web3, account.Key, ticker);
var orders = await _gmxV2Service.GetOrders(web3, account.Key, ticker);
return GmxHelpers.Map(orders, ticker);
return GmxV2Mappers.Map(orders);
}
public async Task<bool> SetAllowance(Account account, Ticker ticker, BigInteger amount)
{
var web3 = BuildWeb3ForAccount(account);
var contractAddress = TokenService.GetContractAddress(ticker);
var approval = await EvmBase.ApproveToken(web3, account.Key, contractAddress,
Arbitrum.AddressV2.SyntheticsRouter, amount);
return approval;
}
private Web3 BuildWeb3ForAccount(Account account)
{
var wallet = new Wallet(account.Secret, _password).GetAccount(account.Key);
var chain = ChainService.GetChain(Constants.Chains.Arbitrum);
return new Web3(wallet, chain.RpcUrl);
}
}