Add validation for Kudai strategy staking requirements in StartCopyTradingCommandHandler. Implemented methods in IEvmManager to retrieve staked KUDAI balance and GBC NFT count. Enhanced error handling for staking checks.

This commit is contained in:
2025-11-17 12:57:47 +07:00
parent 4b24a934ad
commit 8697f1598d
4 changed files with 147 additions and 13 deletions

View File

@@ -0,0 +1,29 @@
using System.Numerics;
using Nethereum.ABI.FunctionEncoding.Attributes;
using Nethereum.Contracts;
namespace Managing.Infrastructure.Evm.Contracts;
public class TokenStakesFunction : FunctionMessage
{
[Parameter("address", "_user", 1)]
public string User { get; set; }
}
public class TokenStakesOutputDTO : FunctionOutputDTO
{
[Parameter("uint256", "", 1)]
public BigInteger ReturnValue1 { get; set; }
}
public class GetUserStakedNftsFunction : FunctionMessage
{
[Parameter("address", "_user", 1)]
public string User { get; set; }
}
public class GetUserStakedNftsOutputDTO : FunctionOutputDTO
{
[Parameter("uint256[]", "", 1)]
public List<BigInteger> ReturnValue1 { get; set; }
}

View File

@@ -11,6 +11,7 @@ using Managing.Domain.Evm;
using Managing.Domain.Statistics;
using Managing.Domain.Trades;
using Managing.Infrastructure.Evm.Abstractions;
using Managing.Infrastructure.Evm.Contracts;
using Managing.Infrastructure.Evm.Models;
using Managing.Infrastructure.Evm.Models.Gmx.v2;
using Managing.Infrastructure.Evm.Models.Privy;
@@ -43,6 +44,10 @@ public class EvmManager : IEvmManager
private readonly IWeb3ProxyService _web3ProxyService;
private readonly ICacheService _cacheService;
// Kudai staking contract constants
private const string KudaiTokenAddress = "0xc9bD1C1e65eBFb36cF4b3d9FC8E2b844248deEE8";
private const string StackingContractAddress = "0x5b02047D471cFf479EBD37575e41Eaa37a4d9321";
public EvmManager(IEnumerable<ISubgraphPrices> subgraphs,
IWeb3ProxyService web3ProxyService, ICacheService cacheService)
{
@@ -996,4 +1001,47 @@ public class EvmManager : IEvmManager
// Map the result to the Position domain object
return result;
}
public async Task<decimal> GetKudaiStakedBalance(string address)
{
try
{
var tokenStakesMessage = new TokenStakesFunction() { User = address };
var queryHandler = _web3.Eth.GetContractQueryHandler<TokenStakesFunction>();
var stakedAmount = await queryHandler
.QueryAsync<TokenStakesOutputDTO>(StackingContractAddress, tokenStakesMessage)
.ConfigureAwait(false);
// KUDAI has 18 decimals like most ERC20 tokens
return Web3.Convert.FromWei(stakedAmount.ReturnValue1, 18);
}
catch (Exception ex)
{
SentrySdk.CaptureException(ex);
Console.Error.WriteLine($"Error getting KUDAI staked balance for address {address}: {ex.Message}");
return 0;
}
}
public async Task<int> GetGbcStakedCount(string address)
{
try
{
var getUserStakedNftsMessage = new GetUserStakedNftsFunction() { User = address };
var queryHandler = _web3.Eth.GetContractQueryHandler<GetUserStakedNftsFunction>();
var stakedNfts = await queryHandler
.QueryAsync<GetUserStakedNftsOutputDTO>(StackingContractAddress, getUserStakedNftsMessage)
.ConfigureAwait(false);
return stakedNfts.ReturnValue1?.Count ?? 0;
}
catch (Exception ex)
{
SentrySdk.CaptureException(ex);
Console.Error.WriteLine($"Error getting GBC staked count for address {address}: {ex.Message}");
return 0;
}
}
}