Reorganize project structure

This commit is contained in:
Ivan Yaremenchuk 2022-10-02 13:30:56 -05:00
parent 72ff876891
commit a0c05f3bbf
161 changed files with 1281 additions and 672 deletions

View File

@ -1,4 +1,4 @@
namespace NftFaucet.Attributes;
namespace NftFaucet.Domain.Attributes;
[AttributeUsage(AttributeTargets.Class)]
public class FunctionHashAttribute : Attribute

View File

@ -1,6 +1,6 @@
using System.Reflection;
namespace NftFaucet.Extensions;
namespace NftFaucet.Domain.Extensions;
public static class TypeExtensions
{

View File

@ -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

View File

@ -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

View File

@ -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
{

View File

@ -1,4 +1,6 @@
namespace NftFaucet.Plugins.NetworkPlugins;
using NftFaucet.Domain.Models.Enums;
namespace NftFaucet.Domain.Models.Abstraction;
public interface IContract
{

View File

@ -1,4 +1,6 @@
namespace NftFaucet.Plugins.NetworkPlugins;
using NftFaucet.Domain.Models.Enums;
namespace NftFaucet.Domain.Models.Abstraction;
public interface INetwork
{

View File

@ -1,4 +1,4 @@
namespace NftFaucet.Plugins;
namespace NftFaucet.Domain.Models.Abstraction;
public interface IToken
{

View File

@ -1,4 +1,4 @@
namespace NftFaucet.Plugins;
namespace NftFaucet.Domain.Models.Abstraction;
public interface ITokenMedia
{

View File

@ -1,4 +1,4 @@
namespace NftFaucet.Plugins;
namespace NftFaucet.Domain.Models.Abstraction;
public interface ITokenUploadLocation
{

View 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));
}
}

View 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; }
}

View File

@ -1,4 +1,4 @@
namespace NftFaucet.Plugins.NetworkPlugins;
namespace NftFaucet.Domain.Models.Enums;
public enum ContractType
{

View File

@ -1,4 +1,4 @@
namespace NftFaucet.Plugins.NetworkPlugins;
namespace NftFaucet.Domain.Models.Enums;
public enum NetworkSubtype
{

View File

@ -1,4 +1,4 @@
namespace NftFaucet.Plugins.NetworkPlugins;
namespace NftFaucet.Domain.Models.Enums;
public enum NetworkType
{

View File

@ -1,4 +1,6 @@
namespace NftFaucet.Plugins;
using NftFaucet.Domain.Models.Abstraction;
namespace NftFaucet.Domain.Models;
public class Token : IToken
{

View File

@ -1,4 +1,6 @@
namespace NftFaucet.Plugins;
using NftFaucet.Domain.Models.Abstraction;
namespace NftFaucet.Domain.Models;
public class TokenMedia : ITokenMedia
{

View File

@ -1,6 +1,6 @@
using Newtonsoft.Json;
namespace NftFaucet.Models;
namespace NftFaucet.Domain.Models;
public class TokenMetadata
{

View File

@ -1,4 +1,6 @@
namespace NftFaucet.Plugins;
using NftFaucet.Domain.Models.Abstraction;
namespace NftFaucet.Domain.Models;
public class TokenUploadLocation : ITokenUploadLocation
{

View 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>

View 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);
}

View 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;
}
}

View File

@ -1,6 +1,6 @@
using CSharpFunctionalExtensions;
namespace NftFaucet.Utils;
namespace NftFaucet.Domain.Utils;
public static class ResultWrapper
{

View File

@ -1,4 +1,4 @@
namespace NftFaucet.Extensions;
namespace NftFaucet.Infrastructure.Extensions;
public static class EnumerableExtensions
{

View File

@ -1,4 +1,4 @@
namespace NftFaucet.Models.Dto;
namespace NftFaucet.Infrastructure.Models.Dto;
public class AppStateDto
{

View File

@ -1,4 +1,4 @@
namespace NftFaucet.Models.Dto;
namespace NftFaucet.Infrastructure.Models.Dto;
public class ProviderStateDto
{

View File

@ -1,4 +1,4 @@
namespace NftFaucet.Models.Dto;
namespace NftFaucet.Infrastructure.Models.Dto;
public class TokenDto
{

View File

@ -1,4 +1,4 @@
namespace NftFaucet.Models.Dto;
namespace NftFaucet.Infrastructure.Models.Dto;
public class UploadLocationDto
{

View File

@ -1,4 +1,4 @@
namespace NftFaucet.Models.Dto;
namespace NftFaucet.Infrastructure.Models.Dto;
public class UploaderStateDto
{

View File

@ -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
{

View File

@ -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
{

View File

@ -1,6 +1,6 @@
using NftFaucet.Plugins;
using NftFaucet.Domain.Models.Abstraction;
namespace NftFaucet.Models.State;
namespace NftFaucet.Infrastructure.Models.State;
public class UserStateStorage
{

View 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>

View 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();
}

View File

@ -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;

View File

@ -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
{

View File

@ -1,4 +1,4 @@
namespace NftFaucet.Services;
namespace NftFaucet.Infrastructure.Services;
public class RefreshMediator
{

View File

@ -1,4 +1,6 @@
namespace NftFaucet.Plugins.NetworkPlugins;
using NftFaucet.Domain.Models.Abstraction;
namespace NftFaucet.Plugins.Models.Abstraction;
public interface INetworkPlugin
{

View File

@ -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);

View File

@ -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);
}

View 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; }
}

View File

@ -0,0 +1,7 @@
namespace NftFaucet.Plugins.Models.Enums;
public enum UiDisplayType
{
Input,
Button,
}

View File

@ -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,

View 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; }
}

View 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>

View File

@ -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

View File

@ -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()
{

View File

@ -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>

View File

@ -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();
}
}
}

View File

@ -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>();
}

View 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; }
}

View File

@ -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; }
}

View File

@ -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>

View File

@ -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);
}
}

View File

@ -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; }
}

View File

@ -1,7 +0,0 @@
namespace NftFaucet.Components.CardList;
public enum CardListItemConfigurationObjectType
{
Input,
Button,
}

View File

@ -1,6 +1,4 @@
using NftFaucet.Components;
namespace NftFaucet.Shared;
namespace NftFaucet.Components.NavMenu;
public partial class NavMenu : BasicComponent
{

View File

@ -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
{

View File

@ -1,9 +0,0 @@
using System.Numerics;
namespace NftFaucet.Models;
public class Balance
{
public BigInteger Amount { get; set; }
public string Currency { get; set; }
}

View File

@ -1,10 +0,0 @@
namespace NftFaucet.Models;
public enum MintingState
{
CheckingNetwork,
CheckingAddress,
CheckingBalance,
SendingTransaction,
Done,
}

View File

@ -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; }
}

View File

@ -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>

View 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>

View 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);
}
}
}

View File

@ -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;

View File

@ -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; }
}
}

View File

@ -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;
}
}

View File

@ -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");
}
}

View File

@ -1,5 +1,4 @@
@page "/mint/in-progress"
@using NftFaucet.Models
@inherits BasicComponent
<PageTitle>Minting...</PageTitle>

View File

@ -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,
}
}

View File

@ -1,5 +1,5 @@
@page "/mint"
@using NftFaucet.Plugins.NetworkPlugins
@using NftFaucet.Domain.Models.Enums
@inherits BasicComponent
<PageTitle>Mint</PageTitle>

View File

@ -1,6 +1,6 @@
using CSharpFunctionalExtensions;
using NftFaucet.Components;
using NftFaucet.Utils;
using NftFaucet.Domain.Utils;
using Radzen;
namespace NftFaucet.Pages;

View File

@ -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;

View File

@ -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,
};
}

View File

@ -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;

View File

@ -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;

View File

@ -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; }
}

View File

@ -1,6 +0,0 @@
namespace NftFaucet.Plugins.ProviderPlugins;
public interface IProviderPlugin
{
public IReadOnlyCollection<IProvider> Providers { get; }
}

View File

@ -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(),
};
}

View File

@ -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(),
};
}

View File

@ -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(),
};
}

View File

@ -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(),
};
}

View File

@ -1,6 +0,0 @@
namespace NftFaucet.Plugins.UploadPlugins;
public interface IUploadPlugin
{
public IReadOnlyCollection<IUploader> Uploaders { get; }
}

View File

@ -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(),
};
}

View File

@ -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(),
};
}

View File

@ -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();

View File

@ -0,0 +1,6 @@
namespace NftFaucet.Services;
public interface IInitializationService
{
public Task Initialize();
}

View File

@ -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)

View File

@ -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(),
};
}

View File

@ -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

View File

@ -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
{

View File

@ -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
{

View File

@ -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
{

View File

@ -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
{

View 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.Plugins\NftFaucet.Plugins.csproj" />
</ItemGroup>
</Project>

Some files were not shown because too many files have changed in this diff Show More