Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/MetaDataAPI/DefaultServiceProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using MetaDataAPI.Services.Strapi;
using GraphQL.Client.Abstractions;
using MetaDataAPI.Services.ChainsInfo;
using Poolz.Finance.CSharp.Polly.Extensions;
using Microsoft.Extensions.DependencyInjection;
using poolz.finance.csharp.contracts.LockDealNFT;
using MediatR.Extensions.FluentValidation.AspNetCore;
Expand All @@ -21,6 +22,7 @@ public static class DefaultServiceProvider
serviceCollection.AddFluentValidation([Assembly.GetExecutingAssembly()]);

serviceCollection.AddSingleton<IHttpClientFactory, HttpClientFactory>();
serviceCollection.AddSingleton<IRetryExecutor, RetryExecutor>();
serviceCollection.AddSingleton<IWeb3Factory, Web3Factory>();
serviceCollection.AddSingleton<IGraphQLClient, StrapiGraphQLClient>();
serviceCollection.AddSingleton<IStrapiClient, StrapiClient>();
Expand Down
1 change: 1 addition & 0 deletions src/MetaDataAPI/MetaDataAPI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
<PackageReference Include="Net.Cache.DynamoDb.ERC20" Version="2.0.2" />
<PackageReference Include="Net.Utils.GraphQL" Version="1.0.0" />
<PackageReference Include="Pinata.Client" Version="1.0.0" />
<PackageReference Include="Poolz.Finance.CSharp.Polly.Extensions" Version="1.0.0" />
<PackageReference Include="Poolz.Finance.CSharp.Strapi" Version="1.3.5" />
<PackageReference Include="PuppeteerSharp" Version="20.2.4" />
<PackageReference Include="Utils.EnvironmentManager" Version="4.2.0" />
Expand Down
10 changes: 7 additions & 3 deletions src/MetaDataAPI/Routing/Requests/GetMetadataRequestHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using MetaDataAPI.Models.Errors;
using MetaDataAPI.Services.Http;
using MetaDataAPI.Services.ChainsInfo;
using Poolz.Finance.CSharp.Polly.Extensions;
using poolz.finance.csharp.contracts.LockDealNFT;

namespace MetaDataAPI.Routing.Requests;
Expand All @@ -13,7 +14,8 @@ public class GetMetadataRequestHandler(
IServiceProvider serviceProvider,
IChainManager chainManager,
ILockDealNFTService lockDealNft,
IWeb3Factory web3Factory
IWeb3Factory web3Factory,
IRetryExecutor retry
) : IRequestHandler<GetMetadataRequest, LambdaResponse>
{
public Task<LambdaResponse> Handle(GetMetadataRequest request, CancellationToken cancellationToken)
Expand All @@ -28,12 +30,14 @@ public Task<LambdaResponse> Handle(GetMetadataRequest request, CancellationToken
}

lockDealNft.Initialize(web3Factory.Create(chainId.ToRpcUrl()), chainInfo.LockDealNFT);
if (!lockDealNft.IsPoolIdInSupplyRange(poolId))
var isPoolIdInSupplyRange = retry.Execute(_ => lockDealNft.IsPoolIdInSupplyRange(poolId), ct: cancellationToken);

if (!isPoolIdInSupplyRange)
{
return Task.FromResult<LambdaResponse>(new PoolIdNotInSupplyRangeResponse(poolId));
}

var poolsInfo = lockDealNft.FetchPoolInfo(poolId);
var poolsInfo = retry.Execute(_ => lockDealNft.FetchPoolInfo(poolId), ct: cancellationToken);
var provider = AbstractProvider.CreateFromPoolInfo(poolsInfo, chainInfo, serviceProvider);
var metadata = provider.GetErc721Metadata();

Expand Down
20 changes: 14 additions & 6 deletions src/MetaDataAPI/Services/Erc20/Erc20Provider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,16 @@
using MetaDataAPI.Services.Http;
using EnvironmentManager.Extensions;
using MetaDataAPI.Services.ChainsInfo;
using Poolz.Finance.CSharp.Polly.Extensions;
using Net.Cache.DynamoDb.ERC20.DynamoDb.Models;

namespace MetaDataAPI.Services.Erc20;

public class Erc20Provider(IErc20CacheService erc20Cache, IWeb3Factory web3Factory) : IErc20Provider
public class Erc20Provider(
IErc20CacheService erc20Cache,
IWeb3Factory web3Factory,
IRetryExecutor retry
) : IErc20Provider
{
public Erc20Token GetErc20Token(ChainInfo chainInfo, EthereumAddress address)
{
Expand All @@ -17,11 +22,14 @@ public Erc20Token GetErc20Token(ChainInfo chainInfo, EthereumAddress address)

public Erc20Token GetErc20Token(string rpcUrl, long chainId, EthereumAddress address)
{
var cache = erc20Cache.GetOrAddAsync(
new HashKey(chainId, address),
() => Task.FromResult(web3Factory.Create(rpcUrl)),
() => Task.FromResult(new EthereumAddress(Env.MULTI_CALL_V3_ADDRESS.GetRequired()))
).GetAwaiter().GetResult();
var cache = retry.Execute(_ =>
{
return erc20Cache.GetOrAddAsync(
new HashKey(chainId, address),
() => Task.FromResult(web3Factory.Create(rpcUrl)),
() => Task.FromResult(new EthereumAddress(Env.MULTI_CALL_V3_ADDRESS.GetRequired()))
).GetAwaiter().GetResult();
});
return new Erc20Token(cache);
}
}
2 changes: 1 addition & 1 deletion src/MetaDataAPI/Services/Http/FailureOnlyLoggingHandler.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace MetaDataAPI.Services.Http;

public class FailureOnlyLoggingHandler(HttpMessageHandler inner) : DelegatingHandler(inner)
public class FailureOnlyLoggingHandler(HttpMessageHandler innerHandler) : DelegatingHandler(innerHandler)
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage req, CancellationToken ct)
{
Expand Down
7 changes: 5 additions & 2 deletions src/MetaDataAPI/Services/Strapi/StrapiClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@
using Net.Utils.GraphQL.Extensions;
using MetaDataAPI.Services.ChainsInfo;
using MetaDataAPI.Services.Strapi.Models;
using Poolz.Finance.CSharp.Polly.Extensions;

namespace MetaDataAPI.Services.Strapi;

public class StrapiClient(IGraphQLClient graphQlClient) : IStrapiClient
public class StrapiClient(IGraphQLClient graphQlClient, IRetryExecutor retry) : IStrapiClient
{
private const string NameOfLockDealNFT = "LockDealNFT";

Expand Down Expand Up @@ -55,7 +56,9 @@ public class StrapiClient(IGraphQLClient graphQlClient) : IStrapiClient
.WithParameter(chainFilter)
.Build();

var response = await graphQlClient.SendQueryAsync<StrapiDataResponse>(new GraphQLQuery(query));
var response = await retry.ExecuteAsync(async token =>
await graphQlClient.SendQueryAsync<StrapiDataResponse>(new GraphQLQuery(query), cancellationToken: token)
);

var data = response.EnsureNoErrors();

Expand Down
12 changes: 11 additions & 1 deletion tests/MetaDataAPI.Tests/Services/Erc20/Erc20ProviderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using MetaDataAPI.Services.ChainsInfo;
using Net.Cache.DynamoDb.ERC20.Rpc.Models;
using Net.Cache.DynamoDb.ERC20.DynamoDb.Models;
using Poolz.Finance.CSharp.Polly.Extensions;

namespace MetaDataAPI.Tests.Services.Erc20;

Expand All @@ -26,6 +27,7 @@ internal void ShouldReceiveExpectedErc20FromDynamoDb()
Environment.SetEnvironmentVariable(nameof(Env.BASE_URL_OF_RPC), baseRpcUrl);
Environment.SetEnvironmentVariable(nameof(Env.MULTI_CALL_V3_ADDRESS), EthereumAddress.ZeroAddress);

var retryExecutor = new Mock<IRetryExecutor>();
var cacheProvider = new Mock<IErc20CacheService>();
var web3Factory = new Mock<IWeb3Factory>();
var web3 = new Mock<IWeb3>();
Expand All @@ -47,7 +49,15 @@ internal void ShouldReceiveExpectedErc20FromDynamoDb()
))
.ReturnsAsync(cacheItem);

var provider = new Erc20Provider(cacheProvider.Object, web3Factory.Object);
retryExecutor
.Setup(x => x.Execute(
It.IsAny<Func<CancellationToken, Erc20TokenDynamoDbEntry>>(),
It.IsAny<DefaultRetryStrategyOptions<Erc20TokenDynamoDbEntry>>(),
It.IsAny<CancellationToken>()
))
.Returns((Func<CancellationToken, Erc20TokenDynamoDbEntry> action, DefaultRetryStrategyOptions<Erc20TokenDynamoDbEntry> _, CancellationToken token) => action(token));

var provider = new Erc20Provider(cacheProvider.Object, web3Factory.Object, retryExecutor.Object);

var result = provider.GetErc20Token(
new ChainInfo(chainId, EthereumAddress.ZeroAddress),
Expand Down
Loading