mirror of
https://github.com/status-im/nft-faucet.git
synced 2025-02-22 11:38:26 +00:00
Reorganize project structure
This commit is contained in:
parent
72ff876891
commit
a0c05f3bbf
@ -1,4 +1,4 @@
|
||||
namespace NftFaucet.Attributes;
|
||||
namespace NftFaucet.Domain.Attributes;
|
||||
|
||||
[AttributeUsage(AttributeTargets.Class)]
|
||||
public class FunctionHashAttribute : Attribute
|
@ -1,6 +1,6 @@
|
||||
using System.Reflection;
|
||||
|
||||
namespace NftFaucet.Extensions;
|
||||
namespace NftFaucet.Domain.Extensions;
|
||||
|
||||
public static class TypeExtensions
|
||||
{
|
@ -1,8 +1,8 @@
|
||||
using System.Numerics;
|
||||
using Nethereum.ABI.FunctionEncoding.Attributes;
|
||||
using NftFaucet.Attributes;
|
||||
using NftFaucet.Domain.Attributes;
|
||||
|
||||
namespace NftFaucet.Models.Function;
|
||||
namespace NftFaucet.Domain.Function;
|
||||
|
||||
[Function("mint"), FunctionHash("0xd3fc9864")]
|
||||
public class Erc1155MintFunction : Function
|
@ -1,7 +1,7 @@
|
||||
using Nethereum.ABI.FunctionEncoding.Attributes;
|
||||
using NftFaucet.Attributes;
|
||||
using NftFaucet.Domain.Attributes;
|
||||
|
||||
namespace NftFaucet.Models.Function;
|
||||
namespace NftFaucet.Domain.Function;
|
||||
|
||||
[Function("safeMint"), FunctionHash("0xd204c45e")]
|
||||
public class Erc721MintFunction : Function
|
@ -1,9 +1,9 @@
|
||||
using Nethereum.ABI.FunctionEncoding;
|
||||
using Nethereum.Hex.HexConvertors.Extensions;
|
||||
using NftFaucet.Attributes;
|
||||
using NftFaucet.Extensions;
|
||||
using NftFaucet.Domain.Attributes;
|
||||
using NftFaucet.Domain.Extensions;
|
||||
|
||||
namespace NftFaucet.Models.Function;
|
||||
namespace NftFaucet.Domain.Function;
|
||||
|
||||
public abstract class Function
|
||||
{
|
@ -1,4 +1,6 @@
|
||||
namespace NftFaucet.Plugins.NetworkPlugins;
|
||||
using NftFaucet.Domain.Models.Enums;
|
||||
|
||||
namespace NftFaucet.Domain.Models.Abstraction;
|
||||
|
||||
public interface IContract
|
||||
{
|
@ -1,4 +1,6 @@
|
||||
namespace NftFaucet.Plugins.NetworkPlugins;
|
||||
using NftFaucet.Domain.Models.Enums;
|
||||
|
||||
namespace NftFaucet.Domain.Models.Abstraction;
|
||||
|
||||
public interface INetwork
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
namespace NftFaucet.Plugins;
|
||||
namespace NftFaucet.Domain.Models.Abstraction;
|
||||
|
||||
public interface IToken
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
namespace NftFaucet.Plugins;
|
||||
namespace NftFaucet.Domain.Models.Abstraction;
|
||||
|
||||
public interface ITokenMedia
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
namespace NftFaucet.Plugins;
|
||||
namespace NftFaucet.Domain.Models.Abstraction;
|
||||
|
||||
public interface ITokenUploadLocation
|
||||
{
|
15
NftFaucet.Domain/Models/Balance.cs
Normal file
15
NftFaucet.Domain/Models/Balance.cs
Normal file
@ -0,0 +1,15 @@
|
||||
using System.Numerics;
|
||||
|
||||
namespace NftFaucet.Domain.Models;
|
||||
|
||||
public class Balance
|
||||
{
|
||||
public BigInteger Amount { get; }
|
||||
public string Currency { get; }
|
||||
|
||||
public Balance(BigInteger amount, string currency)
|
||||
{
|
||||
Amount = amount;
|
||||
Currency = currency ?? throw new ArgumentNullException(nameof(currency));
|
||||
}
|
||||
}
|
16
NftFaucet.Domain/Models/Contract.cs
Normal file
16
NftFaucet.Domain/Models/Contract.cs
Normal file
@ -0,0 +1,16 @@
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
using NftFaucet.Domain.Models.Enums;
|
||||
|
||||
namespace NftFaucet.Domain.Models;
|
||||
|
||||
public class Contract : IContract
|
||||
{
|
||||
public Guid Id { get; init; }
|
||||
public string Name { get; init; }
|
||||
public string Symbol { get; init; }
|
||||
public string Address { get; init; }
|
||||
public ContractType Type { get; init; }
|
||||
public string DeploymentTxHash { get; init; }
|
||||
public DateTime? DeployedAt { get; init; }
|
||||
public bool IsVerified { get; init; }
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
namespace NftFaucet.Plugins.NetworkPlugins;
|
||||
namespace NftFaucet.Domain.Models.Enums;
|
||||
|
||||
public enum ContractType
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
namespace NftFaucet.Plugins.NetworkPlugins;
|
||||
namespace NftFaucet.Domain.Models.Enums;
|
||||
|
||||
public enum NetworkSubtype
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
namespace NftFaucet.Plugins.NetworkPlugins;
|
||||
namespace NftFaucet.Domain.Models.Enums;
|
||||
|
||||
public enum NetworkType
|
||||
{
|
@ -1,4 +1,6 @@
|
||||
namespace NftFaucet.Plugins;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
|
||||
namespace NftFaucet.Domain.Models;
|
||||
|
||||
public class Token : IToken
|
||||
{
|
@ -1,4 +1,6 @@
|
||||
namespace NftFaucet.Plugins;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
|
||||
namespace NftFaucet.Domain.Models;
|
||||
|
||||
public class TokenMedia : ITokenMedia
|
||||
{
|
@ -1,6 +1,6 @@
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace NftFaucet.Models;
|
||||
namespace NftFaucet.Domain.Models;
|
||||
|
||||
public class TokenMetadata
|
||||
{
|
@ -1,4 +1,6 @@
|
||||
namespace NftFaucet.Plugins;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
|
||||
namespace NftFaucet.Domain.Models;
|
||||
|
||||
public class TokenUploadLocation : ITokenUploadLocation
|
||||
{
|
14
NftFaucet.Domain/NftFaucet.Domain.csproj
Normal file
14
NftFaucet.Domain/NftFaucet.Domain.csproj
Normal file
@ -0,0 +1,14 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>disable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="CSharpFunctionalExtensions" Version="2.34.3" />
|
||||
<PackageReference Include="Nethereum.Web3" Version="4.9.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
8
NftFaucet.Domain/Services/ITokenMetadataGenerator.cs
Normal file
8
NftFaucet.Domain/Services/ITokenMetadataGenerator.cs
Normal file
@ -0,0 +1,8 @@
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
|
||||
namespace NftFaucet.Domain.Services;
|
||||
|
||||
public interface ITokenMetadataGenerator
|
||||
{
|
||||
public string GenerateTokenMetadata(IToken token, Uri mainFileLocation, Uri coverFileLocation);
|
||||
}
|
22
NftFaucet.Domain/Services/TokenMetadataGenerator.cs
Normal file
22
NftFaucet.Domain/Services/TokenMetadataGenerator.cs
Normal file
@ -0,0 +1,22 @@
|
||||
using Newtonsoft.Json;
|
||||
using NftFaucet.Domain.Models;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
|
||||
namespace NftFaucet.Domain.Services;
|
||||
|
||||
public class TokenMetadataGenerator : ITokenMetadataGenerator
|
||||
{
|
||||
public string GenerateTokenMetadata(IToken token, Uri mainFileLocation, Uri coverFileLocation)
|
||||
{
|
||||
var tokenMetadata = new TokenMetadata
|
||||
{
|
||||
Name = token.Name,
|
||||
Description = token.Description,
|
||||
Image = coverFileLocation != null ? coverFileLocation.OriginalString : mainFileLocation.OriginalString,
|
||||
AnimationUrl = coverFileLocation != null ? mainFileLocation.OriginalString : null,
|
||||
ExternalUrl = "https://darkcodi.github.io/nft-faucet/",
|
||||
};
|
||||
var metadataJson = JsonConvert.SerializeObject(tokenMetadata, Formatting.Indented);
|
||||
return metadataJson;
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
using CSharpFunctionalExtensions;
|
||||
|
||||
namespace NftFaucet.Utils;
|
||||
namespace NftFaucet.Domain.Utils;
|
||||
|
||||
public static class ResultWrapper
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
namespace NftFaucet.Extensions;
|
||||
namespace NftFaucet.Infrastructure.Extensions;
|
||||
|
||||
public static class EnumerableExtensions
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
namespace NftFaucet.Models.Dto;
|
||||
namespace NftFaucet.Infrastructure.Models.Dto;
|
||||
|
||||
public class AppStateDto
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
namespace NftFaucet.Models.Dto;
|
||||
namespace NftFaucet.Infrastructure.Models.Dto;
|
||||
|
||||
public class ProviderStateDto
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
namespace NftFaucet.Models.Dto;
|
||||
namespace NftFaucet.Infrastructure.Models.Dto;
|
||||
|
||||
public class TokenDto
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
namespace NftFaucet.Models.Dto;
|
||||
namespace NftFaucet.Infrastructure.Models.Dto;
|
||||
|
||||
public class UploadLocationDto
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
namespace NftFaucet.Models.Dto;
|
||||
namespace NftFaucet.Infrastructure.Models.Dto;
|
||||
|
||||
public class UploaderStateDto
|
||||
{
|
@ -1,8 +1,7 @@
|
||||
using NftFaucet.Plugins.NetworkPlugins;
|
||||
using NftFaucet.Plugins.ProviderPlugins;
|
||||
using NftFaucet.Plugins.UploadPlugins;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
using NftFaucet.Plugins.Models.Abstraction;
|
||||
|
||||
namespace NftFaucet.Models.State;
|
||||
namespace NftFaucet.Infrastructure.Models.State;
|
||||
|
||||
public class PluginStateStorage
|
||||
{
|
@ -1,8 +1,7 @@
|
||||
using NftFaucet.Plugins;
|
||||
using NftFaucet.Plugins.NetworkPlugins;
|
||||
using NftFaucet.Plugins.ProviderPlugins;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
using NftFaucet.Plugins.Models.Abstraction;
|
||||
|
||||
namespace NftFaucet.Models.State;
|
||||
namespace NftFaucet.Infrastructure.Models.State;
|
||||
|
||||
public class ScopedAppState
|
||||
{
|
@ -1,6 +1,6 @@
|
||||
using NftFaucet.Plugins;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
|
||||
namespace NftFaucet.Models.State;
|
||||
namespace NftFaucet.Infrastructure.Models.State;
|
||||
|
||||
public class UserStateStorage
|
||||
{
|
17
NftFaucet.Infrastructure/NftFaucet.Infrastructure.csproj
Normal file
17
NftFaucet.Infrastructure/NftFaucet.Infrastructure.csproj
Normal file
@ -0,0 +1,17 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>disable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\NftFaucet.Plugins\NftFaucet.Plugins.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="TG.Blazor.IndexedDB" Version="1.5.0-preview" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
21
NftFaucet.Infrastructure/Repositories/IStateRepository.cs
Normal file
21
NftFaucet.Infrastructure/Repositories/IStateRepository.cs
Normal file
@ -0,0 +1,21 @@
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
using NftFaucet.Infrastructure.Models.Dto;
|
||||
using NftFaucet.Infrastructure.Models.State;
|
||||
using NftFaucet.Plugins.Models.Abstraction;
|
||||
|
||||
namespace NftFaucet.Infrastructure.Repositories;
|
||||
|
||||
public interface IStateRepository
|
||||
{
|
||||
public Task SaveAppState(ScopedAppState appState);
|
||||
public Task SaveToken(IToken token);
|
||||
public Task SaveUploadLocation(ITokenUploadLocation uploadLocation);
|
||||
public Task SaveProviderState(IProvider provider);
|
||||
public Task SaveUploaderState(IUploader uploader);
|
||||
|
||||
public Task LoadAppState(ScopedAppState appState);
|
||||
public Task<IToken[]> LoadTokens();
|
||||
public Task<ITokenUploadLocation[]> LoadUploadLocations();
|
||||
public Task<UploaderStateDto[]> LoadUploaderStates();
|
||||
public Task<ProviderStateDto[]> LoadProviderStates();
|
||||
}
|
@ -1,13 +1,13 @@
|
||||
using NftFaucet.Models.Dto;
|
||||
using NftFaucet.Models.State;
|
||||
using NftFaucet.Plugins;
|
||||
using NftFaucet.Plugins.ProviderPlugins;
|
||||
using NftFaucet.Plugins.UploadPlugins;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
using NftFaucet.Infrastructure.Models.Dto;
|
||||
using NftFaucet.Infrastructure.Models.State;
|
||||
using NftFaucet.Infrastructure.Services;
|
||||
using NftFaucet.Plugins.Models.Abstraction;
|
||||
using TG.Blazor.IndexedDB;
|
||||
|
||||
namespace NftFaucet.Services;
|
||||
namespace NftFaucet.Infrastructure.Repositories;
|
||||
|
||||
public class StateRepository
|
||||
public class StateRepository : IStateRepository
|
||||
{
|
||||
private readonly IndexedDBManager _dbManager;
|
||||
private readonly Mapper _mapper;
|
@ -1,8 +1,9 @@
|
||||
using NftFaucet.Models.Dto;
|
||||
using NftFaucet.Models.State;
|
||||
using NftFaucet.Plugins;
|
||||
using NftFaucet.Domain.Models;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
using NftFaucet.Infrastructure.Models.Dto;
|
||||
using NftFaucet.Infrastructure.Models.State;
|
||||
|
||||
namespace NftFaucet.Services;
|
||||
namespace NftFaucet.Infrastructure.Services;
|
||||
|
||||
public class Mapper
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
namespace NftFaucet.Services;
|
||||
namespace NftFaucet.Infrastructure.Services;
|
||||
|
||||
public class RefreshMediator
|
||||
{
|
@ -1,4 +1,6 @@
|
||||
namespace NftFaucet.Plugins.NetworkPlugins;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
|
||||
namespace NftFaucet.Plugins.Models.Abstraction;
|
||||
|
||||
public interface INetworkPlugin
|
||||
{
|
@ -1,8 +1,8 @@
|
||||
using NftFaucet.Components.CardList;
|
||||
using NftFaucet.Models;
|
||||
using NftFaucet.Plugins.NetworkPlugins;
|
||||
using CSharpFunctionalExtensions;
|
||||
using NftFaucet.Domain.Models;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
|
||||
namespace NftFaucet.Plugins.ProviderPlugins;
|
||||
namespace NftFaucet.Plugins.Models.Abstraction;
|
||||
|
||||
public interface IProvider
|
||||
{
|
||||
@ -15,8 +15,9 @@ public interface IProvider
|
||||
public bool IsConfigured { get; }
|
||||
|
||||
public Task InitializeAsync(IServiceProvider serviceProvider);
|
||||
public CardListItemProperty[] GetProperties();
|
||||
public CardListItemConfiguration GetConfiguration();
|
||||
public Property[] GetProperties();
|
||||
public ConfigurationItem[] GetConfigurationItems();
|
||||
public Task<Result> Configure(ConfigurationItem[] configurationItems);
|
||||
public bool IsNetworkSupported(INetwork network);
|
||||
public Task<string> GetAddress();
|
||||
public Task<Balance> GetBalance(INetwork network);
|
@ -1,7 +1,6 @@
|
||||
using CSharpFunctionalExtensions;
|
||||
using NftFaucet.Components.CardList;
|
||||
|
||||
namespace NftFaucet.Plugins.UploadPlugins;
|
||||
namespace NftFaucet.Plugins.Models.Abstraction;
|
||||
|
||||
public interface IUploader
|
||||
{
|
||||
@ -12,9 +11,10 @@ public interface IUploader
|
||||
public bool IsSupported { get; }
|
||||
public bool IsConfigured { get; }
|
||||
|
||||
public CardListItemProperty[] GetProperties();
|
||||
public CardListItemConfiguration GetConfiguration();
|
||||
public Task<Result<Uri>> Upload(string fileName, string fileType, byte[] fileData);
|
||||
public Property[] GetProperties();
|
||||
public ConfigurationItem[] GetConfigurationItems();
|
||||
public Task<Result> Configure(ConfigurationItem[] configurationItems);
|
||||
public Task<Uri> Upload(string fileName, string fileType, byte[] fileData);
|
||||
public Task<string> GetState();
|
||||
public Task SetState(string state);
|
||||
}
|
15
NftFaucet.Plugins/Models/ConfigurationItem.cs
Normal file
15
NftFaucet.Plugins/Models/ConfigurationItem.cs
Normal file
@ -0,0 +1,15 @@
|
||||
using NftFaucet.Plugins.Models.Enums;
|
||||
|
||||
namespace NftFaucet.Plugins.Models;
|
||||
|
||||
public class ConfigurationItem
|
||||
{
|
||||
public UiDisplayType DisplayType { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Value { get; set; }
|
||||
public string Placeholder { get; set; }
|
||||
public bool IsDisabled { get; set; }
|
||||
|
||||
// for buttons only
|
||||
public Action ClickAction { get; set; }
|
||||
}
|
7
NftFaucet.Plugins/Models/Enums/UiDisplayType.cs
Normal file
7
NftFaucet.Plugins/Models/Enums/UiDisplayType.cs
Normal file
@ -0,0 +1,7 @@
|
||||
namespace NftFaucet.Plugins.Models.Enums;
|
||||
|
||||
public enum UiDisplayType
|
||||
{
|
||||
Input,
|
||||
Button,
|
||||
}
|
@ -1,8 +1,7 @@
|
||||
using NftFaucet.Plugins;
|
||||
using NftFaucet.Plugins.NetworkPlugins;
|
||||
using NftFaucet.Plugins.ProviderPlugins;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
using NftFaucet.Plugins.Models.Abstraction;
|
||||
|
||||
namespace NftFaucet.Models;
|
||||
namespace NftFaucet.Plugins.Models;
|
||||
|
||||
public record MintRequest(
|
||||
INetwork Network,
|
9
NftFaucet.Plugins/Models/Property.cs
Normal file
9
NftFaucet.Plugins/Models/Property.cs
Normal file
@ -0,0 +1,9 @@
|
||||
namespace NftFaucet.Plugins.Models;
|
||||
|
||||
public class Property
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Value { get; set; }
|
||||
public string ValueColor { get; set; }
|
||||
public string Link { get; set; }
|
||||
}
|
13
NftFaucet.Plugins/NftFaucet.Plugins.csproj
Normal file
13
NftFaucet.Plugins/NftFaucet.Plugins.csproj
Normal file
@ -0,0 +1,13 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>disable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\NftFaucet.Domain\NftFaucet.Domain.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
136
NftFaucet.sln
136
NftFaucet.sln
@ -2,6 +2,50 @@
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet", "NftFaucet\NftFaucet.csproj", "{E113DAEE-A1E4-4BE2-8CDA-6E06245A471A}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.Plugins", "NftFaucet.Plugins\NftFaucet.Plugins.csproj", "{CF83F0DB-41CD-46AA-8696-8351E098986D}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{926C18AE-808E-4E77-985F-4EF54792D523}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetworkPlugins", "NetworkPlugins", "{E29C020E-A3FD-4756-ACB3-3828F915EB40}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ProviderPlugins", "ProviderPlugins", "{9DE3CDEC-37AE-4FB0-B115-984EB47F57C5}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UploadPlugins", "UploadPlugins", "{5FA46262-EDA0-43BB-A1E5-57F50AD7EE00}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.ProviderPlugins.EthereumKeygen", "plugins\provider-plugins\NftFaucet.ProviderPlugins.EthereumKeygen\NftFaucet.ProviderPlugins.EthereumKeygen.csproj", "{B1D73FDE-0ECD-4917-8B9A-AEFD8C8C39C5}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.Domain", "NftFaucet.Domain\NftFaucet.Domain.csproj", "{384ECEAB-40B1-4F22-AFBD-F710B935E23A}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.ProviderPlugins.Metamask", "plugins\provider-plugins\NftFaucet.ProviderPlugins.Metamask\NftFaucet.ProviderPlugins.Metamask.csproj", "{3028C0A8-073A-4160-92C7-34D148F1D19C}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.ProviderPlugins.SolanaKeygen", "plugins\provider-plugins\NftFaucet.ProviderPlugins.SolanaKeygen\NftFaucet.ProviderPlugins.SolanaKeygen.csproj", "{A48C079B-5466-4AE5-AA15-0D9D7C3A01A9}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.ProviderPlugins.Phantom", "plugins\provider-plugins\NftFaucet.ProviderPlugins.Phantom\NftFaucet.ProviderPlugins.Phantom.csproj", "{D6522592-0719-479F-AD8E-D58D4D7B207C}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.UploadPlugins.Crust", "plugins\upload-plugins\NftFaucet.UploadPlugins.Crust\NftFaucet.UploadPlugins.Crust.csproj", "{BA56B8D0-B2BD-4170-9D95-D2A1ED29E334}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.UploadPlugins.Infura", "plugins\upload-plugins\NftFaucet.UploadPlugins.Infura\NftFaucet.UploadPlugins.Infura.csproj", "{3F51D52C-3A40-4206-9715-02425786B485}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.UploadPlugins.NftStorage", "plugins\upload-plugins\NftFaucet.UploadPlugins.NftStorage\NftFaucet.UploadPlugins.NftStorage.csproj", "{F0F74D75-68EC-4B56-897E-7292A05B963B}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.NetworkPlugins.Arbitrum", "plugins\network-plugins\NftFaucet.NetworkPlugins.Arbitrum\NftFaucet.NetworkPlugins.Arbitrum.csproj", "{66ABDC2E-3BA0-42C8-B726-AD3B6B7EBE8C}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.NetworkPlugins.Avalanche", "plugins\network-plugins\NftFaucet.NetworkPlugins.Avalanche\NftFaucet.NetworkPlugins.Avalanche.csproj", "{6E6362FA-C9A4-4C92-886F-E9510E58B5D5}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.NetworkPlugins.BinanceSmartChain", "plugins\network-plugins\NftFaucet.NetworkPlugins.BinanceSmartChain\NftFaucet.NetworkPlugins.BinanceSmartChain.csproj", "{D2DDEA7F-38E7-4DE8-9E65-BC2C6393230B}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.NetworkPlugins.Ethereum", "plugins\network-plugins\NftFaucet.NetworkPlugins.Ethereum\NftFaucet.NetworkPlugins.Ethereum.csproj", "{16E3361F-E94A-40AA-9DBD-04FBC17EF883}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.NetworkPlugins.Moonbeam", "plugins\network-plugins\NftFaucet.NetworkPlugins.Moonbeam\NftFaucet.NetworkPlugins.Moonbeam.csproj", "{445C33D6-CB12-4C7C-B77F-3A8E785A14BB}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.NetworkPlugins.Optimism", "plugins\network-plugins\NftFaucet.NetworkPlugins.Optimism\NftFaucet.NetworkPlugins.Optimism.csproj", "{5EAB42A1-4C5B-407A-AE4E-34F608365760}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.NetworkPlugins.Polygon", "plugins\network-plugins\NftFaucet.NetworkPlugins.Polygon\NftFaucet.NetworkPlugins.Polygon.csproj", "{DD751505-81EC-4B8D-B2A5-FB246DCB68E4}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.NetworkPlugins.Solana", "plugins\network-plugins\NftFaucet.NetworkPlugins.Solana\NftFaucet.NetworkPlugins.Solana.csproj", "{A2EE3F83-C57C-48B1-A5FE-E573284B6661}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NftFaucet.Infrastructure", "NftFaucet.Infrastructure\NftFaucet.Infrastructure.csproj", "{06949AF1-D775-4E6B-A309-C358B05F4D50}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@ -12,5 +56,97 @@ Global
|
||||
{E113DAEE-A1E4-4BE2-8CDA-6E06245A471A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E113DAEE-A1E4-4BE2-8CDA-6E06245A471A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E113DAEE-A1E4-4BE2-8CDA-6E06245A471A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{CF83F0DB-41CD-46AA-8696-8351E098986D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{CF83F0DB-41CD-46AA-8696-8351E098986D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{CF83F0DB-41CD-46AA-8696-8351E098986D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{CF83F0DB-41CD-46AA-8696-8351E098986D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B1D73FDE-0ECD-4917-8B9A-AEFD8C8C39C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B1D73FDE-0ECD-4917-8B9A-AEFD8C8C39C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B1D73FDE-0ECD-4917-8B9A-AEFD8C8C39C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B1D73FDE-0ECD-4917-8B9A-AEFD8C8C39C5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{384ECEAB-40B1-4F22-AFBD-F710B935E23A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{384ECEAB-40B1-4F22-AFBD-F710B935E23A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{384ECEAB-40B1-4F22-AFBD-F710B935E23A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{384ECEAB-40B1-4F22-AFBD-F710B935E23A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{3028C0A8-073A-4160-92C7-34D148F1D19C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3028C0A8-073A-4160-92C7-34D148F1D19C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3028C0A8-073A-4160-92C7-34D148F1D19C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3028C0A8-073A-4160-92C7-34D148F1D19C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{A48C079B-5466-4AE5-AA15-0D9D7C3A01A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A48C079B-5466-4AE5-AA15-0D9D7C3A01A9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A48C079B-5466-4AE5-AA15-0D9D7C3A01A9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{A48C079B-5466-4AE5-AA15-0D9D7C3A01A9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{D6522592-0719-479F-AD8E-D58D4D7B207C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D6522592-0719-479F-AD8E-D58D4D7B207C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D6522592-0719-479F-AD8E-D58D4D7B207C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D6522592-0719-479F-AD8E-D58D4D7B207C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{BA56B8D0-B2BD-4170-9D95-D2A1ED29E334}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{BA56B8D0-B2BD-4170-9D95-D2A1ED29E334}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{BA56B8D0-B2BD-4170-9D95-D2A1ED29E334}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{BA56B8D0-B2BD-4170-9D95-D2A1ED29E334}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{3F51D52C-3A40-4206-9715-02425786B485}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3F51D52C-3A40-4206-9715-02425786B485}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3F51D52C-3A40-4206-9715-02425786B485}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3F51D52C-3A40-4206-9715-02425786B485}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{F0F74D75-68EC-4B56-897E-7292A05B963B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{F0F74D75-68EC-4B56-897E-7292A05B963B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{F0F74D75-68EC-4B56-897E-7292A05B963B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{F0F74D75-68EC-4B56-897E-7292A05B963B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{66ABDC2E-3BA0-42C8-B726-AD3B6B7EBE8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{66ABDC2E-3BA0-42C8-B726-AD3B6B7EBE8C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{66ABDC2E-3BA0-42C8-B726-AD3B6B7EBE8C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{66ABDC2E-3BA0-42C8-B726-AD3B6B7EBE8C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{6E6362FA-C9A4-4C92-886F-E9510E58B5D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{6E6362FA-C9A4-4C92-886F-E9510E58B5D5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{6E6362FA-C9A4-4C92-886F-E9510E58B5D5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{6E6362FA-C9A4-4C92-886F-E9510E58B5D5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{D2DDEA7F-38E7-4DE8-9E65-BC2C6393230B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D2DDEA7F-38E7-4DE8-9E65-BC2C6393230B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D2DDEA7F-38E7-4DE8-9E65-BC2C6393230B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D2DDEA7F-38E7-4DE8-9E65-BC2C6393230B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{16E3361F-E94A-40AA-9DBD-04FBC17EF883}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{16E3361F-E94A-40AA-9DBD-04FBC17EF883}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{16E3361F-E94A-40AA-9DBD-04FBC17EF883}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{16E3361F-E94A-40AA-9DBD-04FBC17EF883}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{445C33D6-CB12-4C7C-B77F-3A8E785A14BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{445C33D6-CB12-4C7C-B77F-3A8E785A14BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{445C33D6-CB12-4C7C-B77F-3A8E785A14BB}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{445C33D6-CB12-4C7C-B77F-3A8E785A14BB}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{5EAB42A1-4C5B-407A-AE4E-34F608365760}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{5EAB42A1-4C5B-407A-AE4E-34F608365760}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{5EAB42A1-4C5B-407A-AE4E-34F608365760}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{5EAB42A1-4C5B-407A-AE4E-34F608365760}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{DD751505-81EC-4B8D-B2A5-FB246DCB68E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{DD751505-81EC-4B8D-B2A5-FB246DCB68E4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{DD751505-81EC-4B8D-B2A5-FB246DCB68E4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{DD751505-81EC-4B8D-B2A5-FB246DCB68E4}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{A2EE3F83-C57C-48B1-A5FE-E573284B6661}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A2EE3F83-C57C-48B1-A5FE-E573284B6661}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A2EE3F83-C57C-48B1-A5FE-E573284B6661}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{A2EE3F83-C57C-48B1-A5FE-E573284B6661}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{06949AF1-D775-4E6B-A309-C358B05F4D50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{06949AF1-D775-4E6B-A309-C358B05F4D50}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{06949AF1-D775-4E6B-A309-C358B05F4D50}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{06949AF1-D775-4E6B-A309-C358B05F4D50}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(NestedProjects) = preSolution
|
||||
{E29C020E-A3FD-4756-ACB3-3828F915EB40} = {926C18AE-808E-4E77-985F-4EF54792D523}
|
||||
{9DE3CDEC-37AE-4FB0-B115-984EB47F57C5} = {926C18AE-808E-4E77-985F-4EF54792D523}
|
||||
{5FA46262-EDA0-43BB-A1E5-57F50AD7EE00} = {926C18AE-808E-4E77-985F-4EF54792D523}
|
||||
{B1D73FDE-0ECD-4917-8B9A-AEFD8C8C39C5} = {9DE3CDEC-37AE-4FB0-B115-984EB47F57C5}
|
||||
{3028C0A8-073A-4160-92C7-34D148F1D19C} = {9DE3CDEC-37AE-4FB0-B115-984EB47F57C5}
|
||||
{D6522592-0719-479F-AD8E-D58D4D7B207C} = {9DE3CDEC-37AE-4FB0-B115-984EB47F57C5}
|
||||
{A48C079B-5466-4AE5-AA15-0D9D7C3A01A9} = {9DE3CDEC-37AE-4FB0-B115-984EB47F57C5}
|
||||
{BA56B8D0-B2BD-4170-9D95-D2A1ED29E334} = {5FA46262-EDA0-43BB-A1E5-57F50AD7EE00}
|
||||
{3F51D52C-3A40-4206-9715-02425786B485} = {5FA46262-EDA0-43BB-A1E5-57F50AD7EE00}
|
||||
{F0F74D75-68EC-4B56-897E-7292A05B963B} = {5FA46262-EDA0-43BB-A1E5-57F50AD7EE00}
|
||||
{66ABDC2E-3BA0-42C8-B726-AD3B6B7EBE8C} = {E29C020E-A3FD-4756-ACB3-3828F915EB40}
|
||||
{6E6362FA-C9A4-4C92-886F-E9510E58B5D5} = {E29C020E-A3FD-4756-ACB3-3828F915EB40}
|
||||
{D2DDEA7F-38E7-4DE8-9E65-BC2C6393230B} = {E29C020E-A3FD-4756-ACB3-3828F915EB40}
|
||||
{16E3361F-E94A-40AA-9DBD-04FBC17EF883} = {E29C020E-A3FD-4756-ACB3-3828F915EB40}
|
||||
{445C33D6-CB12-4C7C-B77F-3A8E785A14BB} = {E29C020E-A3FD-4756-ACB3-3828F915EB40}
|
||||
{5EAB42A1-4C5B-407A-AE4E-34F608365760} = {E29C020E-A3FD-4756-ACB3-3828F915EB40}
|
||||
{DD751505-81EC-4B8D-B2A5-FB246DCB68E4} = {E29C020E-A3FD-4756-ACB3-3828F915EB40}
|
||||
{A2EE3F83-C57C-48B1-A5FE-E573284B6661} = {E29C020E-A3FD-4756-ACB3-3828F915EB40}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
@ -1,7 +1,8 @@
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using NftFaucet.Models.State;
|
||||
using NftFaucet.Infrastructure.Models.State;
|
||||
using NftFaucet.Infrastructure.Repositories;
|
||||
using NftFaucet.Infrastructure.Services;
|
||||
using NftFaucet.Options;
|
||||
using NftFaucet.Services;
|
||||
using Radzen;
|
||||
|
||||
namespace NftFaucet.Components;
|
||||
@ -33,7 +34,7 @@ public abstract class BasicComponent : ComponentBase
|
||||
protected Settings Settings { get; set; }
|
||||
|
||||
[Inject]
|
||||
protected StateRepository StateRepository { get; set; }
|
||||
protected IStateRepository StateRepository { get; set; }
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
|
@ -61,12 +61,16 @@
|
||||
}
|
||||
}
|
||||
</div>
|
||||
@if (cardListItem.Configuration != null)
|
||||
{
|
||||
<RadzenButton Icon="build" Click="@(async () => await OpenItemConfigurationDialog(cardListItem))" ButtonStyle="@ButtonStyle.Secondary"
|
||||
Disabled="SelectedItems == null || !SelectedItems.Contains(cardListItem.Id)"
|
||||
Style="position: absolute; bottom: 1em; right: 1em;" />
|
||||
}
|
||||
<div class="d-flex flex-row align-items-center justify-content-end">
|
||||
@foreach (var button in cardListItem.Buttons ?? Array.Empty<CardListItemButton>())
|
||||
{
|
||||
if (!string.IsNullOrEmpty(button?.Name) || !string.IsNullOrEmpty(button?.Icon))
|
||||
{
|
||||
<RadzenButton Text="@button.Name" Icon="@button.Icon" Click="@button.Action" ButtonStyle="@button.Style"
|
||||
Disabled="SelectedItems == null || !SelectedItems.Contains(cardListItem.Id)"/>
|
||||
}
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</RadzenCard>
|
||||
|
@ -1,4 +1,5 @@
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using NftFaucet.Pages;
|
||||
using Radzen;
|
||||
|
||||
namespace NftFaucet.Components.CardList;
|
||||
@ -38,20 +39,4 @@ public partial class CardList : BasicComponent
|
||||
await OnSelectedChange.InvokeAsync(SelectedItems);
|
||||
RefreshMediator.NotifyStateHasChangedSafe();
|
||||
}
|
||||
|
||||
protected async Task OpenItemConfigurationDialog(CardListItem item)
|
||||
{
|
||||
var result = (bool?) await DialogService.OpenAsync<CardListItemConfigurationDialog>("Configuration",
|
||||
new Dictionary<string, object>
|
||||
{
|
||||
{ "CardListItemId", item.Id },
|
||||
{ "CardListItem", item },
|
||||
},
|
||||
new DialogOptions() {Width = "700px", Height = "570px", Resizable = true, Draggable = true});
|
||||
|
||||
if (result != null && result.Value)
|
||||
{
|
||||
RefreshMediator.NotifyStateHasChangedSafe();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -9,5 +9,5 @@ public class CardListItem
|
||||
public CardListItemSelectionIcon SelectionIcon { get; set; }
|
||||
public CardListItemProperty[] Properties { get; set; } = Array.Empty<CardListItemProperty>();
|
||||
public CardListItemBadge[] Badges { get; set; } = Array.Empty<CardListItemBadge>();
|
||||
public CardListItemConfiguration Configuration { get; set; }
|
||||
public CardListItemButton[] Buttons { get; set; } = Array.Empty<CardListItemButton>();
|
||||
}
|
||||
|
11
NftFaucet/Components/CardList/CardListItemButton.cs
Normal file
11
NftFaucet/Components/CardList/CardListItemButton.cs
Normal file
@ -0,0 +1,11 @@
|
||||
using Radzen;
|
||||
|
||||
namespace NftFaucet.Components.CardList;
|
||||
|
||||
public class CardListItemButton
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Icon { get; set; }
|
||||
public Action Action { get; set; }
|
||||
public ButtonStyle Style { get; set; }
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
using CSharpFunctionalExtensions;
|
||||
|
||||
namespace NftFaucet.Components.CardList;
|
||||
|
||||
public class CardListItemConfiguration
|
||||
{
|
||||
public CardListItemConfigurationObject[] Objects { get; set; }
|
||||
public Func<CardListItemConfigurationObject[], Task<Result>> ConfigureAction { get; set; }
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
@page "/configuration/{CardListItemId}"
|
||||
@inherits BasicComponent
|
||||
|
||||
<PageTitle>Configuration</PageTitle>
|
||||
|
||||
<form onsubmit="@OnSavePressed">
|
||||
@foreach (var configurationObject in CardListItem.Configuration.Objects)
|
||||
{
|
||||
switch (configurationObject.Type)
|
||||
{
|
||||
case CardListItemConfigurationObjectType.Input:
|
||||
{
|
||||
<div class="mb-4">
|
||||
<h4>@configurationObject.Name</h4>
|
||||
<RadzenTextBox Placeholder=@configurationObject.Placeholder @bind-Value="@configurationObject.Value" Disabled="@configurationObject.IsDisabled" Class="w-100"/>
|
||||
</div>
|
||||
break;
|
||||
}
|
||||
case CardListItemConfigurationObjectType.Button:
|
||||
{
|
||||
<div class="mb-4">
|
||||
<RadzenButton Text="@configurationObject.Name" Click="@(() => configurationObject.ClickAction())" Disabled="@configurationObject.IsDisabled" Class="w-100"/>
|
||||
</div>
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
|
||||
<div style="display: flex; justify-content: end;">
|
||||
<RadzenButton Click="@((args) => OnSavePressed())" Text="Save" Style="width: 120px"/>
|
||||
</div>
|
||||
</form>
|
@ -1,25 +0,0 @@
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Radzen;
|
||||
|
||||
namespace NftFaucet.Components.CardList;
|
||||
|
||||
public partial class CardListItemConfigurationDialog : BasicComponent
|
||||
{
|
||||
[Parameter] public Guid CardListItemId { get; set; }
|
||||
[Parameter] public CardListItem CardListItem { get; set; }
|
||||
|
||||
private async Task OnSavePressed()
|
||||
{
|
||||
var result = await CardListItem.Configuration.ConfigureAction(CardListItem.Configuration.Objects);
|
||||
if (result.IsFailure)
|
||||
{
|
||||
NotificationService.Notify(NotificationSeverity.Error, "Invalid configuration", result.Error);
|
||||
return;
|
||||
}
|
||||
|
||||
await CardListItem.Configuration.ConfigureAction(CardListItem.Configuration.Objects);
|
||||
RefreshMediator.NotifyStateHasChangedSafe();
|
||||
|
||||
DialogService.Close((bool?)true);
|
||||
}
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
namespace NftFaucet.Components.CardList;
|
||||
|
||||
public class CardListItemConfigurationObject
|
||||
{
|
||||
public CardListItemConfigurationObjectType Type { get; set; }
|
||||
|
||||
public string Name { get; set; }
|
||||
public string Value { get; set; }
|
||||
public string Icon { get; set; }
|
||||
public string Placeholder { get; set; }
|
||||
public bool IsDisabled { get; set; }
|
||||
|
||||
// for type=Button only
|
||||
public Action ClickAction { get; set; }
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
namespace NftFaucet.Components.CardList;
|
||||
|
||||
public enum CardListItemConfigurationObjectType
|
||||
{
|
||||
Input,
|
||||
Button,
|
||||
}
|
@ -1,6 +1,4 @@
|
||||
using NftFaucet.Components;
|
||||
|
||||
namespace NftFaucet.Shared;
|
||||
namespace NftFaucet.Components.NavMenu;
|
||||
|
||||
public partial class NavMenu : BasicComponent
|
||||
{
|
@ -1,8 +1,8 @@
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using NftFaucet.Models.State;
|
||||
using NftFaucet.Services;
|
||||
using NftFaucet.Infrastructure.Models.State;
|
||||
using NftFaucet.Infrastructure.Services;
|
||||
|
||||
namespace NftFaucet.Components;
|
||||
namespace NftFaucet.Layouts;
|
||||
|
||||
public abstract class BasicLayout : LayoutComponentBase
|
||||
{
|
@ -1,9 +0,0 @@
|
||||
using System.Numerics;
|
||||
|
||||
namespace NftFaucet.Models;
|
||||
|
||||
public class Balance
|
||||
{
|
||||
public BigInteger Amount { get; set; }
|
||||
public string Currency { get; set; }
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
namespace NftFaucet.Models;
|
||||
|
||||
public enum MintingState
|
||||
{
|
||||
CheckingNetwork,
|
||||
CheckingAddress,
|
||||
CheckingBalance,
|
||||
SendingTransaction,
|
||||
Done,
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
namespace NftFaucet.Models;
|
||||
|
||||
public class NewFileModel
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Description { get; set; }
|
||||
public string MainFileData { get; set; }
|
||||
public string MainFileName { get; set; }
|
||||
public long? MainFileSize { get; set; }
|
||||
public string CoverFileData { get; set; }
|
||||
public string CoverFileName { get; set; }
|
||||
public long? CoverFileSize { get; set; }
|
||||
}
|
@ -9,19 +9,10 @@
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="ByteSize" Version="2.1.1" />
|
||||
<PackageReference Include="Cryptography.ECDSA.Secp256K1" Version="1.1.3" />
|
||||
<PackageReference Include="CSharpFunctionalExtensions" Version="2.33.2" />
|
||||
<PackageReference Include="Ethereum.MetaMask.Blazor" Version="1.0.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="6.0.2" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="6.0.2" PrivateAssets="all" />
|
||||
<PackageReference Include="MimeTypeMapOfficial" Version="1.0.17" />
|
||||
<PackageReference Include="Nethereum.ABI" Version="4.8.0" />
|
||||
<PackageReference Include="Nethereum.JsonRpc.Client" Version="4.8.0" />
|
||||
<PackageReference Include="Nethereum.Web3" Version="4.8.0" />
|
||||
<PackageReference Include="Radzen.Blazor" Version="4.1.5" />
|
||||
<PackageReference Include="RestEase" Version="1.5.7" />
|
||||
<PackageReference Include="Solana.Metaplex" Version="1.2.0" />
|
||||
<PackageReference Include="TG.Blazor.IndexedDB" Version="1.5.0-preview" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
@ -31,7 +22,23 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<_ContentIncludedByDefault Remove="wwwroot\sample-data\weather.json" />
|
||||
<ProjectReference Include="..\NftFaucet.Infrastructure\NftFaucet.Infrastructure.csproj" />
|
||||
<ProjectReference Include="..\plugins\network-plugins\NftFaucet.NetworkPlugins.Arbitrum\NftFaucet.NetworkPlugins.Arbitrum.csproj" />
|
||||
<ProjectReference Include="..\plugins\network-plugins\NftFaucet.NetworkPlugins.Avalanche\NftFaucet.NetworkPlugins.Avalanche.csproj" />
|
||||
<ProjectReference Include="..\plugins\network-plugins\NftFaucet.NetworkPlugins.BinanceSmartChain\NftFaucet.NetworkPlugins.BinanceSmartChain.csproj" />
|
||||
<ProjectReference Include="..\plugins\network-plugins\NftFaucet.NetworkPlugins.Ethereum\NftFaucet.NetworkPlugins.Ethereum.csproj" />
|
||||
<ProjectReference Include="..\plugins\network-plugins\NftFaucet.NetworkPlugins.Moonbeam\NftFaucet.NetworkPlugins.Moonbeam.csproj" />
|
||||
<ProjectReference Include="..\plugins\network-plugins\NftFaucet.NetworkPlugins.Optimism\NftFaucet.NetworkPlugins.Optimism.csproj" />
|
||||
<ProjectReference Include="..\plugins\network-plugins\NftFaucet.NetworkPlugins.Polygon\NftFaucet.NetworkPlugins.Polygon.csproj" />
|
||||
<ProjectReference Include="..\plugins\network-plugins\NftFaucet.NetworkPlugins.Solana\NftFaucet.NetworkPlugins.Solana.csproj" />
|
||||
<ProjectReference Include="..\plugins\provider-plugins\NftFaucet.ProviderPlugins.EthereumKeygen\NftFaucet.ProviderPlugins.EthereumKeygen.csproj" />
|
||||
<ProjectReference Include="..\plugins\provider-plugins\NftFaucet.ProviderPlugins.Metamask\NftFaucet.ProviderPlugins.Metamask.csproj" />
|
||||
<ProjectReference Include="..\plugins\provider-plugins\NftFaucet.ProviderPlugins.Phantom\NftFaucet.ProviderPlugins.Phantom.csproj" />
|
||||
<ProjectReference Include="..\plugins\provider-plugins\NftFaucet.ProviderPlugins.SolanaKeygen\NftFaucet.ProviderPlugins.SolanaKeygen.csproj" />
|
||||
<ProjectReference Include="..\NftFaucet.Plugins\NftFaucet.Plugins.csproj" />
|
||||
<ProjectReference Include="..\plugins\upload-plugins\NftFaucet.UploadPlugins.Crust\NftFaucet.UploadPlugins.Crust.csproj" />
|
||||
<ProjectReference Include="..\plugins\upload-plugins\NftFaucet.UploadPlugins.Infura\NftFaucet.UploadPlugins.Infura.csproj" />
|
||||
<ProjectReference Include="..\plugins\upload-plugins\NftFaucet.UploadPlugins.NftStorage\NftFaucet.UploadPlugins.NftStorage.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
36
NftFaucet/Pages/ConfigurationDialog.razor
Normal file
36
NftFaucet/Pages/ConfigurationDialog.razor
Normal file
@ -0,0 +1,36 @@
|
||||
@page "/configuration"
|
||||
@using NftFaucet.Plugins.Models
|
||||
@using NftFaucet.Plugins.Models.Enums
|
||||
@inherits BasicComponent
|
||||
|
||||
<PageTitle>Configuration</PageTitle>
|
||||
|
||||
<form onsubmit="@OnSavePressed">
|
||||
@foreach (var configurationItem in ConfigurationItems ?? Array.Empty<ConfigurationItem>())
|
||||
{
|
||||
switch (configurationItem.DisplayType)
|
||||
{
|
||||
case UiDisplayType.Input:
|
||||
{
|
||||
<div class="mb-4">
|
||||
<h4>@configurationItem.Name</h4>
|
||||
<RadzenTextBox Placeholder=@configurationItem.Placeholder @bind-Value="@configurationItem.Value" Disabled="@configurationItem.IsDisabled" Class="w-100"/>
|
||||
</div>
|
||||
break;
|
||||
}
|
||||
case UiDisplayType.Button:
|
||||
{
|
||||
<div class="mb-4">
|
||||
<RadzenButton Text="@configurationItem.Name" Click="@(() => configurationItem.ClickAction())" Disabled="@configurationItem.IsDisabled" Class="w-100"/>
|
||||
</div>
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
|
||||
<div style="display: flex; justify-content: end;">
|
||||
<RadzenButton Click="@((args) => OnSavePressed())" Text="Save" Style="width: 120px"/>
|
||||
</div>
|
||||
</form>
|
30
NftFaucet/Pages/ConfigurationDialog.razor.cs
Normal file
30
NftFaucet/Pages/ConfigurationDialog.razor.cs
Normal file
@ -0,0 +1,30 @@
|
||||
using CSharpFunctionalExtensions;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using NftFaucet.Components;
|
||||
using NftFaucet.Plugins.Models;
|
||||
using Radzen;
|
||||
|
||||
namespace NftFaucet.Pages;
|
||||
|
||||
public partial class ConfigurationDialog : BasicComponent
|
||||
{
|
||||
[Parameter]
|
||||
public ConfigurationItem[] ConfigurationItems { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public Func<ConfigurationItem[], Task<Result>> ConfigureAction { get; set; }
|
||||
|
||||
private async Task OnSavePressed()
|
||||
{
|
||||
var result = await ConfigureAction(ConfigurationItems);
|
||||
if (result.IsSuccess)
|
||||
{
|
||||
RefreshMediator.NotifyStateHasChangedSafe();
|
||||
DialogService.Close((bool?)true);
|
||||
}
|
||||
else
|
||||
{
|
||||
NotificationService.Notify(NotificationSeverity.Error, "Invalid configuration", result.Error);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
using System.Globalization;
|
||||
using NftFaucet.Components;
|
||||
using NftFaucet.Components.CardList;
|
||||
using NftFaucet.Plugins.NetworkPlugins;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
using Radzen;
|
||||
|
||||
namespace NftFaucet.Pages;
|
||||
|
@ -1,7 +1,6 @@
|
||||
using MimeTypes;
|
||||
using NftFaucet.Components;
|
||||
using NftFaucet.Models;
|
||||
using NftFaucet.Plugins;
|
||||
using NftFaucet.Domain.Models;
|
||||
using Radzen;
|
||||
|
||||
namespace NftFaucet.Pages;
|
||||
@ -96,4 +95,16 @@ public partial class CreateTokenDialog : BasicComponent
|
||||
Model.CoverFileName = null;
|
||||
Model.CoverFileSize = null;
|
||||
}
|
||||
|
||||
private class NewFileModel
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Description { get; set; }
|
||||
public string MainFileData { get; set; }
|
||||
public string MainFileName { get; set; }
|
||||
public long? MainFileSize { get; set; }
|
||||
public string CoverFileData { get; set; }
|
||||
public string CoverFileName { get; set; }
|
||||
public long? CoverFileSize { get; set; }
|
||||
}
|
||||
}
|
||||
|
@ -1,11 +1,14 @@
|
||||
using System.Text;
|
||||
using CSharpFunctionalExtensions;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Newtonsoft.Json;
|
||||
using NftFaucet.Components;
|
||||
using NftFaucet.Components.CardList;
|
||||
using NftFaucet.Models;
|
||||
using NftFaucet.Plugins;
|
||||
using NftFaucet.Plugins.UploadPlugins;
|
||||
using NftFaucet.Domain.Models;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
using NftFaucet.Domain.Services;
|
||||
using NftFaucet.Domain.Utils;
|
||||
using NftFaucet.Plugins.Models;
|
||||
using NftFaucet.Plugins.Models.Abstraction;
|
||||
using Radzen;
|
||||
|
||||
namespace NftFaucet.Pages;
|
||||
@ -14,10 +17,12 @@ public partial class CreateUploadDialog : BasicComponent
|
||||
{
|
||||
[Parameter] public IToken Token { get; set; }
|
||||
|
||||
[Inject] public ITokenMetadataGenerator TokenMetadataGenerator { get; set; }
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
RefreshCards();
|
||||
base.OnInitialized();
|
||||
RefreshCards();
|
||||
}
|
||||
|
||||
private CardListItem[] UploaderCards { get; set; }
|
||||
@ -28,17 +33,18 @@ public partial class CreateUploadDialog : BasicComponent
|
||||
private void RefreshCards()
|
||||
{
|
||||
UploaderCards = AppState.PluginStorage.Uploaders.Select(MapCardListItem).ToArray();
|
||||
RefreshMediator.NotifyStateHasChangedSafe();
|
||||
}
|
||||
|
||||
private CardListItem MapCardListItem(IUploader uploader)
|
||||
{
|
||||
var configuration = uploader.GetConfiguration();
|
||||
var configurationItems = uploader.GetConfigurationItems();
|
||||
return new CardListItem
|
||||
{
|
||||
Id = uploader.Id,
|
||||
ImageLocation = uploader.ImageName != null ? "./images/" + uploader.ImageName : null,
|
||||
Header = uploader.Name,
|
||||
Properties = uploader.GetProperties(),
|
||||
Properties = uploader.GetProperties().Select(Map).ToArray(),
|
||||
IsDisabled = !uploader.IsSupported,
|
||||
SelectionIcon = uploader.IsConfigured ? CardListItemSelectionIcon.Checkmark : CardListItemSelectionIcon.Warning,
|
||||
Badges = new[]
|
||||
@ -50,22 +56,25 @@ public partial class CreateUploadDialog : BasicComponent
|
||||
? new CardListItemBadge {Style = BadgeStyle.Light, Text = "Not Supported"}
|
||||
: null,
|
||||
}.Where(x => x != null).ToArray(),
|
||||
Configuration = configuration == null
|
||||
? null
|
||||
: new CardListItemConfiguration
|
||||
Buttons = configurationItems != null && configurationItems.Any()
|
||||
? new[]
|
||||
{
|
||||
Objects = configuration.Objects,
|
||||
ConfigureAction = async x =>
|
||||
new CardListItemButton
|
||||
{
|
||||
var result = await configuration.ConfigureAction(x);
|
||||
RefreshCards();
|
||||
if (result.IsSuccess)
|
||||
Icon = "build",
|
||||
Style = ButtonStyle.Secondary,
|
||||
Action = async () =>
|
||||
{
|
||||
await StateRepository.SaveUploaderState(uploader);
|
||||
var result = await OpenConfigurationDialog(uploader);
|
||||
RefreshCards();
|
||||
if (result.IsSuccess)
|
||||
{
|
||||
await StateRepository.SaveUploaderState(uploader);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
: Array.Empty<CardListItemButton>(),
|
||||
};
|
||||
}
|
||||
|
||||
@ -74,7 +83,7 @@ public partial class CreateUploadDialog : BasicComponent
|
||||
IsUploading = true;
|
||||
RefreshMediator.NotifyStateHasChangedSafe();
|
||||
|
||||
var mainFileLocationResult = await SelectedUploader.Upload(Token.MainFile.FileName, Token.MainFile.FileType, Base64DataToBytes(Token.MainFile.FileData));
|
||||
var mainFileLocationResult = await ResultWrapper.Wrap(() => SelectedUploader.Upload(Token.MainFile.FileName, Token.MainFile.FileType, Base64DataToBytes(Token.MainFile.FileData)));
|
||||
if (mainFileLocationResult.IsFailure)
|
||||
{
|
||||
IsUploading = false;
|
||||
@ -87,7 +96,7 @@ public partial class CreateUploadDialog : BasicComponent
|
||||
Uri coverFileLocation = null;
|
||||
if (Token.CoverFile != null)
|
||||
{
|
||||
var coverFileLocationResult = await SelectedUploader.Upload(Token.CoverFile.FileName, Token.CoverFile.FileType, Base64DataToBytes(Token.CoverFile.FileData));
|
||||
var coverFileLocationResult = await ResultWrapper.Wrap(() => SelectedUploader.Upload(Token.CoverFile.FileName, Token.CoverFile.FileType, Base64DataToBytes(Token.CoverFile.FileData)));
|
||||
if (coverFileLocationResult.IsFailure)
|
||||
{
|
||||
IsUploading = false;
|
||||
@ -98,9 +107,9 @@ public partial class CreateUploadDialog : BasicComponent
|
||||
coverFileLocation = coverFileLocationResult.Value;
|
||||
}
|
||||
|
||||
var tokenMetadata = GenerateTokenMetadata(Token, mainFileLocation, coverFileLocation);
|
||||
var tokenMetadata = TokenMetadataGenerator.GenerateTokenMetadata(Token, mainFileLocation, coverFileLocation);
|
||||
var tokenMetadataBytes = Encoding.UTF8.GetBytes(tokenMetadata);
|
||||
var tokenLocationResult = await SelectedUploader.Upload($"{Token.Id}.json", "application/json", tokenMetadataBytes);
|
||||
var tokenLocationResult = await ResultWrapper.Wrap(() => SelectedUploader.Upload($"{Token.Id}.json", "application/json", tokenMetadataBytes));
|
||||
if (tokenLocationResult.IsFailure)
|
||||
{
|
||||
IsUploading = false;
|
||||
@ -124,6 +133,33 @@ public partial class CreateUploadDialog : BasicComponent
|
||||
DialogService.Close(uploadLocation);
|
||||
}
|
||||
|
||||
private async Task<Result> OpenConfigurationDialog(IUploader uploader)
|
||||
{
|
||||
var configurationItems = uploader.GetConfigurationItems();
|
||||
foreach (var configurationItem in configurationItems)
|
||||
{
|
||||
var prevClickHandler = configurationItem.ClickAction;
|
||||
if (prevClickHandler != null)
|
||||
{
|
||||
configurationItem.ClickAction = () =>
|
||||
{
|
||||
prevClickHandler();
|
||||
RefreshMediator.NotifyStateHasChangedSafe();
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
var result = (bool?) await DialogService.OpenAsync<ConfigurationDialog>("Configuration",
|
||||
new Dictionary<string, object>
|
||||
{
|
||||
{ nameof(ConfigurationDialog.ConfigurationItems), configurationItems },
|
||||
{ nameof(ConfigurationDialog.ConfigureAction), uploader.Configure },
|
||||
},
|
||||
new DialogOptions() {Width = "700px", Height = "570px", Resizable = true, Draggable = true});
|
||||
|
||||
return result != null && result.Value ? Result.Success() : Result.Failure("Operation cancelled");
|
||||
}
|
||||
|
||||
private static byte[] Base64DataToBytes(string fileData)
|
||||
{
|
||||
var index = fileData.IndexOf(';');
|
||||
@ -131,17 +167,12 @@ public partial class CreateUploadDialog : BasicComponent
|
||||
return Convert.FromBase64String(encoded);
|
||||
}
|
||||
|
||||
private static string GenerateTokenMetadata(IToken token, Uri mainFileLocation, Uri coverFileLocation)
|
||||
{
|
||||
var tokenMetadata = new TokenMetadata
|
||||
private CardListItemProperty Map(Property model)
|
||||
=> model == null ? null : new CardListItemProperty
|
||||
{
|
||||
Name = token.Name,
|
||||
Description = token.Description,
|
||||
Image = coverFileLocation != null ? coverFileLocation.OriginalString : mainFileLocation.OriginalString,
|
||||
AnimationUrl = coverFileLocation != null ? mainFileLocation.OriginalString : null,
|
||||
ExternalUrl = "https://darkcodi.github.io/nft-faucet/",
|
||||
Name = model.Name,
|
||||
Value = model.Value,
|
||||
ValueColor = model.ValueColor,
|
||||
Link = model.Link,
|
||||
};
|
||||
var metadataJson = JsonConvert.SerializeObject(tokenMetadata, Formatting.Indented);
|
||||
return metadataJson;
|
||||
}
|
||||
}
|
||||
|
@ -7,18 +7,6 @@ public partial class IndexPage : BasicComponent
|
||||
{
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
// if (!await Metamask.IsReady())
|
||||
// {
|
||||
// UriHelper.NavigateToRelative("/connect-metamask");
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// if (!AppState.IpfsContext.IsInitialized)
|
||||
// {
|
||||
// UriHelper.NavigateToRelative("/connect-ipfs");
|
||||
// return;
|
||||
// }
|
||||
|
||||
NavigationManager.NavigateToRelative("/networks");
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,4 @@
|
||||
@page "/mint/in-progress"
|
||||
@using NftFaucet.Models
|
||||
@inherits BasicComponent
|
||||
|
||||
<PageTitle>Minting...</PageTitle>
|
||||
|
@ -1,8 +1,9 @@
|
||||
using System.Numerics;
|
||||
using NftFaucet.Components;
|
||||
using NftFaucet.Models;
|
||||
using NftFaucet.Plugins.NetworkPlugins;
|
||||
using NftFaucet.Utils;
|
||||
using NftFaucet.Domain.Models;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
using NftFaucet.Domain.Utils;
|
||||
using NftFaucet.Plugins.Models;
|
||||
|
||||
namespace NftFaucet.Pages;
|
||||
|
||||
@ -150,4 +151,13 @@ public partial class MintDialog : BasicComponent
|
||||
{
|
||||
DialogService.Close(TransactionHash);
|
||||
}
|
||||
|
||||
private enum MintingState
|
||||
{
|
||||
CheckingNetwork,
|
||||
CheckingAddress,
|
||||
CheckingBalance,
|
||||
SendingTransaction,
|
||||
Done,
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
@page "/mint"
|
||||
@using NftFaucet.Plugins.NetworkPlugins
|
||||
@using NftFaucet.Domain.Models.Enums
|
||||
@inherits BasicComponent
|
||||
|
||||
<PageTitle>Mint</PageTitle>
|
||||
|
@ -1,6 +1,6 @@
|
||||
using CSharpFunctionalExtensions;
|
||||
using NftFaucet.Components;
|
||||
using NftFaucet.Utils;
|
||||
using NftFaucet.Domain.Utils;
|
||||
using Radzen;
|
||||
|
||||
namespace NftFaucet.Pages;
|
||||
|
@ -1,6 +1,7 @@
|
||||
using NftFaucet.Components;
|
||||
using NftFaucet.Components.CardList;
|
||||
using NftFaucet.Plugins.NetworkPlugins;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
using NftFaucet.Domain.Models.Enums;
|
||||
using Radzen;
|
||||
|
||||
namespace NftFaucet.Pages;
|
||||
|
@ -1,7 +1,9 @@
|
||||
using CSharpFunctionalExtensions;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using NftFaucet.Components;
|
||||
using NftFaucet.Components.CardList;
|
||||
using NftFaucet.Plugins.ProviderPlugins;
|
||||
using NftFaucet.Plugins.Models;
|
||||
using NftFaucet.Plugins.Models.Abstraction;
|
||||
using Radzen;
|
||||
|
||||
namespace NftFaucet.Pages;
|
||||
@ -35,14 +37,14 @@ public partial class ProvidersPage : BasicComponent
|
||||
|
||||
private CardListItem MapCardListItem(IProvider provider)
|
||||
{
|
||||
var configuration = provider.GetConfiguration();
|
||||
var configurationItems = provider.GetConfigurationItems();
|
||||
return new CardListItem
|
||||
{
|
||||
Id = provider.Id,
|
||||
ImageLocation = provider.ImageName != null ? "./images/" + provider.ImageName : null,
|
||||
Header = provider.Name,
|
||||
IsDisabled = !provider.IsSupported,
|
||||
Properties = provider.GetProperties().ToArray(),
|
||||
Properties = provider.GetProperties().Select(Map).ToArray(),
|
||||
SelectionIcon = provider.IsConfigured ? CardListItemSelectionIcon.Checkmark : CardListItemSelectionIcon.Warning,
|
||||
Badges = new[]
|
||||
{
|
||||
@ -53,20 +55,25 @@ public partial class ProvidersPage : BasicComponent
|
||||
? new CardListItemBadge {Style = BadgeStyle.Light, Text = "Not Supported"}
|
||||
: null,
|
||||
}.Where(x => x != null).ToArray(),
|
||||
Configuration = configuration == null ? null : new CardListItemConfiguration
|
||||
{
|
||||
Objects = configuration.Objects,
|
||||
ConfigureAction = async x =>
|
||||
Buttons = configurationItems != null && configurationItems.Any()
|
||||
? new[]
|
||||
{
|
||||
var result = await configuration.ConfigureAction(x);
|
||||
RefreshCards();
|
||||
if (result.IsSuccess)
|
||||
new CardListItemButton
|
||||
{
|
||||
await StateRepository.SaveProviderState(provider);
|
||||
Icon = "build",
|
||||
Style = ButtonStyle.Secondary,
|
||||
Action = async () =>
|
||||
{
|
||||
var result = await OpenConfigurationDialog(provider);
|
||||
RefreshCards();
|
||||
if (result.IsSuccess)
|
||||
{
|
||||
await StateRepository.SaveProviderState(provider);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
},
|
||||
},
|
||||
}
|
||||
: Array.Empty<CardListItemButton>(),
|
||||
};
|
||||
}
|
||||
|
||||
@ -74,4 +81,40 @@ public partial class ProvidersPage : BasicComponent
|
||||
{
|
||||
await SaveAppState();
|
||||
}
|
||||
|
||||
private async Task<Result> OpenConfigurationDialog(IProvider provider)
|
||||
{
|
||||
var configurationItems = provider.GetConfigurationItems();
|
||||
foreach (var configurationItem in configurationItems)
|
||||
{
|
||||
var prevClickHandler = configurationItem.ClickAction;
|
||||
if (prevClickHandler != null)
|
||||
{
|
||||
configurationItem.ClickAction = () =>
|
||||
{
|
||||
prevClickHandler();
|
||||
RefreshMediator.NotifyStateHasChangedSafe();
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
var result = (bool?) await DialogService.OpenAsync<ConfigurationDialog>("Configuration",
|
||||
new Dictionary<string, object>
|
||||
{
|
||||
{ nameof(ConfigurationDialog.ConfigurationItems), configurationItems },
|
||||
{ nameof(ConfigurationDialog.ConfigureAction), provider.Configure },
|
||||
},
|
||||
new DialogOptions() {Width = "700px", Height = "570px", Resizable = true, Draggable = true});
|
||||
|
||||
return result != null && result.Value ? Result.Success() : Result.Failure("Operation cancelled");
|
||||
}
|
||||
|
||||
private CardListItemProperty Map(Property model)
|
||||
=> model == null ? null : new CardListItemProperty
|
||||
{
|
||||
Name = model.Name,
|
||||
Value = model.Value,
|
||||
ValueColor = model.ValueColor,
|
||||
Link = model.Link,
|
||||
};
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
using ByteSizeLib;
|
||||
using NftFaucet.Components;
|
||||
using NftFaucet.Components.CardList;
|
||||
using NftFaucet.Plugins;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
using Radzen;
|
||||
|
||||
namespace NftFaucet.Pages;
|
||||
|
@ -1,7 +1,7 @@
|
||||
using System.Globalization;
|
||||
using NftFaucet.Components;
|
||||
using NftFaucet.Components.CardList;
|
||||
using NftFaucet.Plugins;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
using Radzen;
|
||||
|
||||
namespace NftFaucet.Pages;
|
||||
|
@ -1,13 +0,0 @@
|
||||
namespace NftFaucet.Plugins.NetworkPlugins;
|
||||
|
||||
public class Contract : IContract
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Symbol { get; set; }
|
||||
public string Address { get; set; }
|
||||
public ContractType Type { get; set; }
|
||||
public string DeploymentTxHash { get; set; }
|
||||
public DateTime? DeployedAt { get; set; }
|
||||
public bool IsVerified { get; set; }
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
namespace NftFaucet.Plugins.ProviderPlugins;
|
||||
|
||||
public interface IProviderPlugin
|
||||
{
|
||||
public IReadOnlyCollection<IProvider> Providers { get; }
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
using NftFaucet.Plugins.ProviderPlugins.Keygen.Providers;
|
||||
|
||||
namespace NftFaucet.Plugins.ProviderPlugins.Keygen;
|
||||
|
||||
public class KeygenProviderPlugin : IProviderPlugin
|
||||
{
|
||||
public IReadOnlyCollection<IProvider> Providers { get; } = new IProvider[]
|
||||
{
|
||||
new EthereumKeygenProvider(),
|
||||
new SolanaKeygenProvider(),
|
||||
};
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
using NftFaucet.Plugins.ProviderPlugins.Metamask.Providers;
|
||||
|
||||
namespace NftFaucet.Plugins.ProviderPlugins.Metamask;
|
||||
|
||||
public class MetamaskProviderPlugin : IProviderPlugin
|
||||
{
|
||||
public IReadOnlyCollection<IProvider> Providers { get; } = new IProvider[]
|
||||
{
|
||||
new MetamaskProvider(),
|
||||
};
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
using NftFaucet.Plugins.ProviderPlugins.Phantom.Providers;
|
||||
|
||||
namespace NftFaucet.Plugins.ProviderPlugins.Phantom;
|
||||
|
||||
public class PhantomProviderPlugin : IProviderPlugin
|
||||
{
|
||||
public IReadOnlyCollection<IProvider> Providers { get; } = new IProvider[]
|
||||
{
|
||||
new PhantomProvider(),
|
||||
};
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
using NftFaucet.Plugins.UploadPlugins.Crust.Uploaders;
|
||||
|
||||
namespace NftFaucet.Plugins.UploadPlugins.Crust;
|
||||
|
||||
public class CrustUploadPlugin : IUploadPlugin
|
||||
{
|
||||
public IReadOnlyCollection<IUploader> Uploaders { get; } = new[]
|
||||
{
|
||||
new CrustUploader(),
|
||||
};
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
namespace NftFaucet.Plugins.UploadPlugins;
|
||||
|
||||
public interface IUploadPlugin
|
||||
{
|
||||
public IReadOnlyCollection<IUploader> Uploaders { get; }
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
using NftFaucet.Plugins.UploadPlugins.Infura.Uploaders;
|
||||
|
||||
namespace NftFaucet.Plugins.UploadPlugins.Infura;
|
||||
|
||||
public class InfuraUploadPlugin : IUploadPlugin
|
||||
{
|
||||
public IReadOnlyCollection<IUploader> Uploaders { get; } = new[]
|
||||
{
|
||||
new InfuraUploader(),
|
||||
};
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
using NftFaucet.Plugins.UploadPlugins.NftStorage.Uploaders;
|
||||
|
||||
namespace NftFaucet.Plugins.UploadPlugins.NftStorage;
|
||||
|
||||
public class NftStorageUploadPlugin : IUploadPlugin
|
||||
{
|
||||
public IReadOnlyCollection<IUploader> Uploaders { get; } = new[]
|
||||
{
|
||||
new NftStorageUploader(),
|
||||
};
|
||||
}
|
@ -1,10 +1,13 @@
|
||||
using Ethereum.MetaMask.Blazor;
|
||||
using Microsoft.AspNetCore.Components.Web;
|
||||
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
|
||||
using NftFaucet.Models.State;
|
||||
using NftFaucet.Options;
|
||||
using NftFaucet.Services;
|
||||
using NftFaucet;
|
||||
using NftFaucet.Domain.Services;
|
||||
using NftFaucet.Infrastructure.Models.State;
|
||||
using NftFaucet.Infrastructure.Repositories;
|
||||
using NftFaucet.Infrastructure.Services;
|
||||
using Radzen;
|
||||
using TG.Blazor.IndexedDB;
|
||||
|
||||
@ -20,14 +23,18 @@ builder.Services.AddSingleton(settings);
|
||||
builder.Services.AddScoped(sp => new HttpClient {BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)});
|
||||
builder.Services.AddSingleton<PluginLoader>();
|
||||
builder.Services.AddSingleton<Mapper>();
|
||||
builder.Services.AddScoped<InitializationService>();
|
||||
builder.Services.AddScoped<StateRepository>();
|
||||
builder.Services.AddScoped<ITokenMetadataGenerator, TokenMetadataGenerator>();
|
||||
builder.Services.AddScoped<IInitializationService, InitializationService>();
|
||||
builder.Services.AddScoped<IStateRepository, StateRepository>();
|
||||
builder.Services.AddScoped<ScopedAppState>();
|
||||
builder.Services.AddScoped<RefreshMediator>();
|
||||
|
||||
// add Radzen components
|
||||
builder.Services.AddScoped<DialogService>();
|
||||
builder.Services.AddScoped<NotificationService>();
|
||||
builder.Services.AddScoped<TooltipService>();
|
||||
builder.Services.AddScoped<ContextMenuService>();
|
||||
|
||||
builder.Services.AddMetaMaskBlazor();
|
||||
|
||||
builder.Services.AddIndexedDB(dbStore =>
|
||||
@ -107,6 +114,6 @@ builder.Services.AddIndexedDB(dbStore =>
|
||||
});
|
||||
|
||||
var app = builder.Build();
|
||||
var initializationService = app.Services.GetRequiredService<InitializationService>();
|
||||
var initializationService = app.Services.GetRequiredService<IInitializationService>();
|
||||
await initializationService.Initialize();
|
||||
await app.RunAsync();
|
||||
|
6
NftFaucet/Services/IInitializationService.cs
Normal file
6
NftFaucet/Services/IInitializationService.cs
Normal file
@ -0,0 +1,6 @@
|
||||
namespace NftFaucet.Services;
|
||||
|
||||
public interface IInitializationService
|
||||
{
|
||||
public Task Initialize();
|
||||
}
|
@ -1,16 +1,17 @@
|
||||
using NftFaucet.Extensions;
|
||||
using NftFaucet.Models.State;
|
||||
using NftFaucet.Infrastructure.Extensions;
|
||||
using NftFaucet.Infrastructure.Models.State;
|
||||
using NftFaucet.Infrastructure.Repositories;
|
||||
|
||||
namespace NftFaucet.Services;
|
||||
|
||||
public class InitializationService
|
||||
public class InitializationService : IInitializationService
|
||||
{
|
||||
private readonly ScopedAppState _appState;
|
||||
private readonly PluginLoader _pluginLoader;
|
||||
private readonly StateRepository _stateRepository;
|
||||
private readonly IStateRepository _stateRepository;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
|
||||
public InitializationService(ScopedAppState appState, PluginLoader pluginLoader, StateRepository stateRepository, IServiceProvider serviceProvider)
|
||||
public InitializationService(ScopedAppState appState, PluginLoader pluginLoader, IStateRepository stateRepository, IServiceProvider serviceProvider)
|
||||
{
|
||||
_appState = appState;
|
||||
_pluginLoader = pluginLoader;
|
||||
@ -41,10 +42,9 @@ public class InitializationService
|
||||
_appState.PluginStorage.Uploaders == null &&
|
||||
_appState.PluginStorage.Contracts == null;
|
||||
|
||||
_pluginLoader.EnsurePluginsLoaded();
|
||||
_appState.PluginStorage.Networks ??= _pluginLoader.NetworkPlugins.SelectMany(x => x.Networks).Where(x => x != null).ToArray();
|
||||
_appState.PluginStorage.Providers ??= _pluginLoader.ProviderPlugins.SelectMany(x => x.Providers).Where(x => x != null).ToArray();
|
||||
_appState.PluginStorage.Uploaders ??= _pluginLoader.UploadPlugins.SelectMany(x => x.Uploaders).Where(x => x != null).ToArray();
|
||||
_appState.PluginStorage.Providers ??= _pluginLoader.ProviderPlugins.Where(x => x != null).ToArray();
|
||||
_appState.PluginStorage.Uploaders ??= _pluginLoader.UploadPlugins.Where(x => x != null).ToArray();
|
||||
_appState.PluginStorage.Contracts ??= _appState.PluginStorage.Networks.SelectMany(x => x.DeployedContracts).Where(x => x != null).ToArray();
|
||||
|
||||
if (isFirstRun)
|
||||
|
@ -1,36 +1,48 @@
|
||||
using System.Reflection;
|
||||
using NftFaucet.Plugins.NetworkPlugins;
|
||||
using NftFaucet.Plugins.ProviderPlugins;
|
||||
using NftFaucet.Plugins.UploadPlugins;
|
||||
using NftFaucet.NetworkPlugins.Arbitrum;
|
||||
using NftFaucet.NetworkPlugins.Avalanche;
|
||||
using NftFaucet.NetworkPlugins.BinanceSmartChain;
|
||||
using NftFaucet.NetworkPlugins.Ethereum;
|
||||
using NftFaucet.NetworkPlugins.Moonbeam;
|
||||
using NftFaucet.NetworkPlugins.Optimism;
|
||||
using NftFaucet.NetworkPlugins.Polygon;
|
||||
using NftFaucet.NetworkPlugins.Solana;
|
||||
using NftFaucet.Plugins.Models.Abstraction;
|
||||
using NftFaucet.ProviderPlugins.EthereumKeygen;
|
||||
using NftFaucet.ProviderPlugins.Metamask;
|
||||
using NftFaucet.ProviderPlugins.Phantom;
|
||||
using NftFaucet.ProviderPlugins.SolanaKeygen;
|
||||
using NftFaucet.UploadPlugins.Crust;
|
||||
using NftFaucet.UploadPlugins.Infura;
|
||||
using NftFaucet.UploadPlugins.NftStorage;
|
||||
|
||||
namespace NftFaucet.Services;
|
||||
|
||||
public class PluginLoader
|
||||
{
|
||||
public IReadOnlyCollection<INetworkPlugin> NetworkPlugins { get; private set; }
|
||||
public IReadOnlyCollection<IProviderPlugin> ProviderPlugins { get; private set; }
|
||||
public IReadOnlyCollection<IUploadPlugin> UploadPlugins { get; private set; }
|
||||
|
||||
public bool ArePluginsLoaded { get; private set; }
|
||||
|
||||
public void EnsurePluginsLoaded()
|
||||
public IReadOnlyCollection<INetworkPlugin> NetworkPlugins { get; } = new INetworkPlugin[]
|
||||
{
|
||||
if (ArePluginsLoaded)
|
||||
{
|
||||
return;
|
||||
}
|
||||
new EthereumNetworkPlugin(),
|
||||
new PolygonNetworkPlugin(),
|
||||
new BscNetworkPlugin(),
|
||||
new OptimismNetworkPlugin(),
|
||||
new MoonbeamNetworkPlugin(),
|
||||
new ArbitrumNetworkPlugin(),
|
||||
new AvalancheNetworkPlugin(),
|
||||
new SolanaNetworkPlugin(),
|
||||
};
|
||||
|
||||
var assembly = Assembly.GetExecutingAssembly();
|
||||
var allTypes = assembly.GetTypes();
|
||||
|
||||
var networkPluginTypes = allTypes.Where(x => x.IsClass && typeof(INetworkPlugin).IsAssignableFrom(x)).ToArray();
|
||||
var providerPluginTypes = allTypes.Where(x => x.IsClass && typeof(IProviderPlugin).IsAssignableFrom(x)).ToArray();
|
||||
var uploadPluginTypes = allTypes.Where(x => x.IsClass && typeof(IUploadPlugin).IsAssignableFrom(x)).ToArray();
|
||||
public IReadOnlyCollection<IProvider> ProviderPlugins { get; } = new IProvider[]
|
||||
{
|
||||
new MetamaskProvider(),
|
||||
new EthereumKeygenProvider(),
|
||||
new PhantomProvider(),
|
||||
new SolanaKeygenProvider(),
|
||||
};
|
||||
|
||||
NetworkPlugins = networkPluginTypes.Select(x => (INetworkPlugin) Activator.CreateInstance(x)).ToArray();
|
||||
ProviderPlugins = providerPluginTypes.Select(x => (IProviderPlugin) Activator.CreateInstance(x)).ToArray();
|
||||
UploadPlugins = uploadPluginTypes.Select(x => (IUploadPlugin) Activator.CreateInstance(x)).ToArray();
|
||||
|
||||
ArePluginsLoaded = true;
|
||||
}
|
||||
public IReadOnlyCollection<IUploader> UploadPlugins { get; } = new IUploader[]
|
||||
{
|
||||
new InfuraUploader(),
|
||||
new NftStorageUploader(),
|
||||
new CrustUploader(),
|
||||
};
|
||||
}
|
||||
|
@ -11,6 +11,7 @@
|
||||
@using NftFaucet.Components.CardList
|
||||
@using NftFaucet.Components.CheckmarkIcon
|
||||
@using NftFaucet.Components.WarningIcon
|
||||
@using NftFaucet.Shared
|
||||
@using NftFaucet.Components.NavMenu
|
||||
@using NftFaucet.Layouts
|
||||
@using Radzen
|
||||
@using Radzen.Blazor
|
||||
|
@ -1,6 +1,8 @@
|
||||
using NftFaucet.Plugins.NetworkPlugins.Arbitrum.Networks;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
using NftFaucet.NetworkPlugins.Arbitrum.Networks;
|
||||
using NftFaucet.Plugins.Models.Abstraction;
|
||||
|
||||
namespace NftFaucet.Plugins.NetworkPlugins.Arbitrum;
|
||||
namespace NftFaucet.NetworkPlugins.Arbitrum;
|
||||
|
||||
public class ArbitrumNetworkPlugin : INetworkPlugin
|
||||
{
|
@ -1,4 +1,7 @@
|
||||
namespace NftFaucet.Plugins.NetworkPlugins.Arbitrum.Networks;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
using NftFaucet.Domain.Models.Enums;
|
||||
|
||||
namespace NftFaucet.NetworkPlugins.Arbitrum.Networks;
|
||||
|
||||
public class ArbitrumNovaNetwork : INetwork
|
||||
{
|
@ -1,4 +1,7 @@
|
||||
namespace NftFaucet.Plugins.NetworkPlugins.Arbitrum.Networks;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
using NftFaucet.Domain.Models.Enums;
|
||||
|
||||
namespace NftFaucet.NetworkPlugins.Arbitrum.Networks;
|
||||
|
||||
public class ArbitrumOneNetwork : INetwork
|
||||
{
|
@ -1,6 +1,9 @@
|
||||
using System.Globalization;
|
||||
using NftFaucet.Domain.Models;
|
||||
using NftFaucet.Domain.Models.Abstraction;
|
||||
using NftFaucet.Domain.Models.Enums;
|
||||
|
||||
namespace NftFaucet.Plugins.NetworkPlugins.Arbitrum.Networks;
|
||||
namespace NftFaucet.NetworkPlugins.Arbitrum.Networks;
|
||||
|
||||
public class ArbitrumRinkebyNetwork : INetwork
|
||||
{
|
@ -0,0 +1,13 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>disable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\NftFaucet.Plugins\NftFaucet.Plugins.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user