diff --git a/src/InvestProvider.Backend/Services/DynamoDb/Models/ProjectsInformation.cs b/src/InvestProvider.Backend/Services/DynamoDb/Models/ProjectsInformation.cs index 8ecdaab..0061489 100644 --- a/src/InvestProvider.Backend/Services/DynamoDb/Models/ProjectsInformation.cs +++ b/src/InvestProvider.Backend/Services/DynamoDb/Models/ProjectsInformation.cs @@ -13,4 +13,7 @@ public class ProjectsInformation [JsonRequired] [DynamoDBProperty("PoolzBackId")] public long PoolzBackId { get; set; } + + [DynamoDBProperty("TokenHashKey")] + public string TokenHashKey { get; set; } = null!; } \ No newline at end of file diff --git a/src/InvestProvider.Backend/Services/Handlers/AdminCreatePoolzBackId/AdminCreatePoolzBackIdHandler.cs b/src/InvestProvider.Backend/Services/Handlers/AdminCreatePoolzBackId/AdminCreatePoolzBackIdHandler.cs index 7f0fd55..4d5b5ae 100644 --- a/src/InvestProvider.Backend/Services/Handlers/AdminCreatePoolzBackId/AdminCreatePoolzBackIdHandler.cs +++ b/src/InvestProvider.Backend/Services/Handlers/AdminCreatePoolzBackId/AdminCreatePoolzBackIdHandler.cs @@ -1,14 +1,34 @@ using MediatR; +using Net.Cache.DynamoDb.ERC20; using Amazon.DynamoDBv2.DataModel; +using Net.Cache.DynamoDb.ERC20.Models; +using InvestProvider.Backend.Services.Strapi; +using poolz.finance.csharp.contracts.LockDealNFT; +using InvestProvider.Backend.Services.Web3.Contracts; using InvestProvider.Backend.Services.Handlers.AdminCreatePoolzBackId.Models; namespace InvestProvider.Backend.Services.Handlers.AdminCreatePoolzBackId; -public class AdminCreatePoolzBackIdHandler(IDynamoDBContext dynamoDb) +public class AdminCreatePoolzBackIdHandler( + IDynamoDBContext dynamoDb, + ILockDealNFTService lockDealNFT, + IStrapiClient strapi, + ERC20CacheProvider erc20Cache +) : IRequestHandler { public async Task Handle(AdminCreatePoolzBackIdRequest request, CancellationToken cancellationToken) { + var token = await lockDealNFT + .TokenOfQueryAsync(request.ChainId, ContractType.LockDealNFT, request.PoolzBackId) + .ConfigureAwait(false); + + var onChainInfo = await strapi.ReceiveOnChainInfoAsync(request.ChainId); + + var tokenInfo = erc20Cache.GetOrAdd(new GetCacheRequest(request.ChainId, token, onChainInfo.RpcUrl)); + + request.TokenHashKey = tokenInfo.HashKey; + await dynamoDb.SaveAsync(request, cancellationToken); return new AdminCreatePoolzBackIdResponse(request); diff --git a/tests/InvestProvider.Backend.Tests/Handlers/AdminCreatePoolzBackIdHandlerTests.cs b/tests/InvestProvider.Backend.Tests/Handlers/AdminCreatePoolzBackIdHandlerTests.cs index e2aadad..2b609cd 100644 --- a/tests/InvestProvider.Backend.Tests/Handlers/AdminCreatePoolzBackIdHandlerTests.cs +++ b/tests/InvestProvider.Backend.Tests/Handlers/AdminCreatePoolzBackIdHandlerTests.cs @@ -1,11 +1,20 @@ -using System.Threading; -using System.Threading.Tasks; using Moq; using Xunit; +using System; +using System.Numerics; +using System.Threading; +using System.Threading.Tasks; +using Nethereum.RPC.Eth.DTOs; +using Net.Web3.EthereumWallet; +using Net.Cache.DynamoDb.ERC20; using Amazon.DynamoDBv2.DataModel; +using Net.Cache.DynamoDb.ERC20.Models; +using InvestProvider.Backend.Services.Strapi; +using poolz.finance.csharp.contracts.LockDealNFT; +using InvestProvider.Backend.Services.Strapi.Models; +using InvestProvider.Backend.Services.Web3.Contracts; using InvestProvider.Backend.Services.Handlers.AdminCreatePoolzBackId; using InvestProvider.Backend.Services.Handlers.AdminCreatePoolzBackId.Models; -using InvestProvider.Backend.Tests; namespace InvestProvider.Backend.Tests.Handlers; @@ -14,10 +23,32 @@ public class AdminCreatePoolzBackIdHandlerTests [Fact] public async Task Handle_SavesItem_AndReturnsResponse() { - var phase = TestHelpers.CreatePhase("1", System.DateTime.UtcNow, System.DateTime.UtcNow.AddHours(1), 0m); + Environment.SetEnvironmentVariable("AWS_REGION", "us-east-1"); + + var phase = TestHelpers.CreatePhase("1", DateTime.UtcNow, DateTime.UtcNow.AddHours(1), 0m); var projectInfo = TestHelpers.CreateProjectInfo(1, phase); var dynamoDb = new Mock(); - var handler = new AdminCreatePoolzBackIdHandler(dynamoDb.Object); + var lockDealNFT = new Mock>(); + lockDealNFT.Setup(x => x.TokenOfQueryAsync(It.IsAny(), ContractType.LockDealNFT, It.IsAny(), It.IsAny())) + .ReturnsAsync(new EthereumAddress("0x00000000000000000000000000000000000000aa")); + + var strapi = new Mock(); + strapi.Setup(x => x.ReceiveOnChainInfoAsync(1)) + .ReturnsAsync(new OnChainInfo( + "http://rpc", + new EthereumAddress("0x00000000000000000000000000000000000000bb"), + new EthereumAddress("0x00000000000000000000000000000000000000cc") + )); + + var erc20 = new Mock(); + erc20.Setup(x => x.GetOrAdd(It.IsAny())) + .Returns(new ERC20DynamoDbTable()); + + var handler = new AdminCreatePoolzBackIdHandler( + dynamoDb.Object, + lockDealNFT.Object, + strapi.Object, + erc20.Object); var request = new AdminCreatePoolzBackIdRequest { ProjectId = "pid",