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