Merge currency endpoint
This commit is contained in:
		
						commit
						027074a13e
					
				
							
								
								
									
										179
									
								
								Airdrop.fsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								Airdrop.fsx
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,179 @@ | |||||||
|  | #load "/home/joe/Development/DegenzGame/.paket/load/net6.0/main.group.fsx";; | ||||||
|  | 
 | ||||||
|  | open System | ||||||
|  | open System.IO | ||||||
|  | open Npgsql.FSharp | ||||||
|  | open dotenv.net | ||||||
|  | open Solnet.Rpc | ||||||
|  | open Solnet.Rpc.Models | ||||||
|  | open Solnet.Rpc.Builders | ||||||
|  | open Solnet.Wallet | ||||||
|  | open Solnet.Programs | ||||||
|  | open Solnet.KeyStore | ||||||
|  | 
 | ||||||
|  | let devEnv = DotEnv.Read(DotEnvOptions(envFilePaths = [ "./.dev.env" ])) | ||||||
|  | 
 | ||||||
|  | let ( _ , devConnStr )= devEnv.TryGetValue("DATABASE_URL") | ||||||
|  | 
 | ||||||
|  | let keystore = SolanaKeyStoreService() | ||||||
|  | let file = File.ReadAllText("/home/joe/.config/solana/devnet.json") | ||||||
|  | let authority = keystore.RestoreKeystore(file) | ||||||
|  | 
 | ||||||
|  | //let rpcClient = ClientFactory.GetClient("https://still-empty-field.solana-mainnet.quiknode.pro/5b1b6b5c913ec79a20bef19d5ba5f63023e470d6/") | ||||||
|  | let rpcClient = ClientFactory.GetClient(Cluster.DevNet) | ||||||
|  | 
 | ||||||
|  | let mintAccount = PublicKey("2iS6gcoB5VhiLC4eNB7NdcaLgEHjLrXHYpz7T2JMGBDw") | ||||||
|  | //let associatedTokenAccountOwner = PublicKey("GutKESfJw8PDMbFVqByxTr4f5TUSHUVmkf5gtsWWWqrU") | ||||||
|  | 
 | ||||||
|  | type AirdropStatus = | ||||||
|  |     | Hold = 0 | ||||||
|  |     | Ready = 1 | ||||||
|  |     | Pending = 2 | ||||||
|  |     | Error = 3 | ||||||
|  |     | PendingError = 4 | ||||||
|  |     | Completed = 5 | ||||||
|  |     | Verified = 6 | ||||||
|  | 
 | ||||||
|  | let updateError wallet msg = | ||||||
|  |     devConnStr | ||||||
|  |     |> Sql.connect | ||||||
|  |     |> Sql.parameters [ "wallet" , Sql.string wallet ; "msg" , Sql.string msg ] | ||||||
|  |     |> Sql.query """ | ||||||
|  |             UPDATE crypto SET error_msg = @msg, status = 'Error' WHERE crypto.wallet_address = @wallet; | ||||||
|  |         """ | ||||||
|  |     |> Sql.executeNonQueryAsync | ||||||
|  | 
 | ||||||
|  | let updatePendingError wallet msg txId = | ||||||
|  |     devConnStr | ||||||
|  |     |> Sql.connect | ||||||
|  |     |> Sql.parameters [ "wallet" , Sql.string wallet ; "msg" , Sql.string msg ; "txId" , Sql.string txId ] | ||||||
|  |     |> Sql.query """ | ||||||
|  |             UPDATE crypto SET error_msg = @msg, pending_tx = @txId, status = 'PendingError' WHERE crypto.wallet_address = @wallet; | ||||||
|  |         """ | ||||||
|  |     |> Sql.executeNonQueryAsync | ||||||
|  | 
 | ||||||
|  | let updatePending wallet txId = | ||||||
|  |     devConnStr | ||||||
|  |     |> Sql.connect | ||||||
|  |     |> Sql.parameters [ "wallet" , Sql.string wallet ; "txId" , Sql.string txId ] | ||||||
|  |     |> Sql.query """ | ||||||
|  |             UPDATE crypto SET pending_tx = @txId, status = 'Pending' WHERE crypto.wallet_address = @wallet; | ||||||
|  |         """ | ||||||
|  |     |> Sql.executeNonQueryAsync | ||||||
|  | 
 | ||||||
|  | let updateCompleted wallet txId = | ||||||
|  |     devConnStr | ||||||
|  |     |> Sql.connect | ||||||
|  |     |> Sql.parameters [ "wallet" , Sql.string wallet ; "txId" , Sql.string txId ] | ||||||
|  |     |> Sql.query """ | ||||||
|  |             UPDATE crypto SET successful_tx = pending_tx, status = 'Completed' WHERE crypto.wallet_address = @wallet; | ||||||
|  |         """ | ||||||
|  |     |> Sql.executeNonQueryAsync | ||||||
|  | 
 | ||||||
|  | let updateVerified wallet txId amount = | ||||||
|  |     devConnStr | ||||||
|  |     |> Sql.connect | ||||||
|  |     |> Sql.parameters [ "wallet" , Sql.string wallet ; "txId" , Sql.string txId ; "amount" , Sql.int amount ] | ||||||
|  |     |> Sql.query """ | ||||||
|  |             UPDATE crypto SET pending_tx = @txId, status = 'Verified', total_dropped = @amount WHERE crypto.wallet_address = @wallet; | ||||||
|  |         """ | ||||||
|  |     |> Sql.executeNonQueryAsync | ||||||
|  | 
 | ||||||
|  | let getTokenCountToDrop wallet = | ||||||
|  |     task { | ||||||
|  |         let! wl = | ||||||
|  |             devConnStr | ||||||
|  |             |> Sql.connect | ||||||
|  |             |> Sql.parameters [ "wallet" , Sql.string wallet ] | ||||||
|  |             |> Sql.query """ | ||||||
|  |                     SELECT has_wl, has_og FROM crypto WHERE wallet_address = @wallet; | ||||||
|  |                 """ | ||||||
|  |             |> Sql.executeRowAsync (fun reader -> {| HasWhitelist = reader.bool "has_wl" ; HasOg = reader.bool "has_og" |}) | ||||||
|  |         return (if wl.HasWhitelist then 1uL else 0uL) + (if wl.HasOg then 2uL else 0uL) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | // TODO: Change was_successful to status and check if attempted, pending, errored, or completed | ||||||
|  | let executeDrop (wallet : string) = | ||||||
|  |     let associatedTokenAccountOwner = PublicKey(wallet) | ||||||
|  |     let associatedTokenAccount = AssociatedTokenAccountProgram.DeriveAssociatedTokenAccount(associatedTokenAccountOwner, mintAccount) | ||||||
|  |     let log msg = printfn $"{wallet} || {msg}" | ||||||
|  | 
 | ||||||
|  |     log $"ATA: {associatedTokenAccount.Key}" | ||||||
|  |     let buildTransaction (block : LatestBlockHash) amount (targetWallet : string) = | ||||||
|  |         TransactionBuilder() | ||||||
|  |             .SetRecentBlockHash(block.Blockhash) | ||||||
|  |             .SetFeePayer(authority.Account) | ||||||
|  |             .AddInstruction(AssociatedTokenAccountProgram.CreateAssociatedTokenAccount( | ||||||
|  |                 authority.Account, | ||||||
|  |                 PublicKey(targetWallet), | ||||||
|  |                 mintAccount)) | ||||||
|  |             .AddInstruction(TokenProgram.Transfer( | ||||||
|  |                 PublicKey("CRa7GCMUaB4np32XoTD2sEyCXFVfYKKF4JRPkQTwV3EY"), | ||||||
|  |                 associatedTokenAccount, | ||||||
|  |                 amount, | ||||||
|  |                 authority.Account)) | ||||||
|  |             .Build(authority.Account); | ||||||
|  |     task { | ||||||
|  | //        let streamingClient = ClientFactory.GetStreamingClient("wss://still-empty-field.solana-mainnet.quiknode.pro/5b1b6b5c913ec79a20bef19d5ba5f63023e470d6/") | ||||||
|  |         let streamingClient = ClientFactory.GetStreamingClient(Cluster.DevNet) | ||||||
|  |         do! streamingClient.ConnectAsync() | ||||||
|  |         let blockHash = rpcClient.GetLatestBlockHash() | ||||||
|  |         let! amount = getTokenCountToDrop wallet | ||||||
|  |         log $"Dropping {amount} tokens" | ||||||
|  |         let tx = buildTransaction blockHash.Result.Value amount wallet | ||||||
|  |         let! tx = rpcClient.SendTransactionAsync(tx) | ||||||
|  |         if tx.ErrorData <> null then | ||||||
|  |             let! _ = updateError wallet (tx.ErrorData.Logs |> String.concat "\n") | ||||||
|  |             () | ||||||
|  |             log $"Transaction error: {wallet}" | ||||||
|  |             return () | ||||||
|  |         elif String.IsNullOrWhiteSpace(tx.Result) then | ||||||
|  |             let msg = $"Transaction did not have an ID but the ErrorData was null: {tx.Reason}" | ||||||
|  |             let! _ = updateError wallet msg | ||||||
|  |             log $"Odd Transaction Error" | ||||||
|  |             return () | ||||||
|  |         else | ||||||
|  |             log $"Successful, now waiting for RPC" | ||||||
|  |             let! _ = updatePending wallet tx.Result | ||||||
|  |             let! _ = streamingClient.SubscribeSignatureAsync(tx.Result, fun _ result -> | ||||||
|  |                 if result.Value.Error = null then | ||||||
|  |                     log "RPC Finished" | ||||||
|  |                     task { | ||||||
|  |                         let! _ = updateCompleted wallet tx.Result | ||||||
|  |                         log "Getting Transaction and Token Balance" | ||||||
|  |                         let! txInfo = rpcClient.GetTransactionAsync(tx.Result) | ||||||
|  |                         let! tokenBalance = rpcClient.GetTokenAccountBalanceAsync(associatedTokenAccount) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                         log $"Transaction Successful? {txInfo.WasSuccessful} - Token Balance {tokenBalance.Result.Value.AmountUlong}" | ||||||
|  |                         if txInfo.WasSuccessful = true && tokenBalance.Result.Value.AmountUlong = amount then | ||||||
|  |                             let! _ = updateVerified wallet tx.Result (int amount) | ||||||
|  |                             () | ||||||
|  |                         return () | ||||||
|  |                     } |> Async.AwaitTask |> Async.Start | ||||||
|  |                 else | ||||||
|  |                     let msg =  $"Got an error, let's check it out {result.Value.Error}" | ||||||
|  |                     updatePendingError wallet msg tx.Result |> Async.AwaitTask |> Async.Ignore |> Async.Start) | ||||||
|  |             return () | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | let targetWallets = | ||||||
|  |     devConnStr | ||||||
|  |     |> Sql.connect | ||||||
|  |     |> Sql.query """ | ||||||
|  |             SELECT wallet_address FROM crypto WHERE status = 'Ready'; | ||||||
|  |         """ | ||||||
|  |     |> Sql.execute (fun reader -> reader.string "wallet_address") | ||||||
|  | 
 | ||||||
|  | printfn $"Got target wallets: {targetWallets.Length}" | ||||||
|  | 
 | ||||||
|  | // "GK7rkZYrdAEpTm9n9TkHWK1T5nDXeRfVUVfcHQwSDyuJ" | ||||||
|  | let asyncs = | ||||||
|  |     targetWallets | ||||||
|  |     |> List.map executeDrop | ||||||
|  |     |> List.map Async.AwaitTask | ||||||
|  | 
 | ||||||
|  | Async.Parallel ( asyncs , 16 ) |> Async.StartChild | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Console.ReadLine() |> ignore | ||||||
| @ -8,3 +8,4 @@ mixpanel-csharp | |||||||
| Solnet.Rpc | Solnet.Rpc | ||||||
| FsToolkit.ErrorHandling | FsToolkit.ErrorHandling | ||||||
| FSharp.Data | FSharp.Data | ||||||
|  | Newtonsoft.Json | ||||||
|  | |||||||
							
								
								
									
										117
									
								
								CurrencyAPI/Currency.fs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								CurrencyAPI/Currency.fs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,117 @@ | |||||||
|  | module CurrencyAPI.App | ||||||
|  | 
 | ||||||
|  | open System | ||||||
|  | open System.IO | ||||||
|  | open Microsoft.AspNetCore.Builder | ||||||
|  | open Microsoft.AspNetCore.Hosting | ||||||
|  | open Microsoft.AspNetCore.Http | ||||||
|  | open Microsoft.Extensions.Hosting | ||||||
|  | open Microsoft.Extensions.Logging | ||||||
|  | open Microsoft.Extensions.DependencyInjection | ||||||
|  | open Giraffe | ||||||
|  | open dotenv.net | ||||||
|  | open Npgsql.FSharp | ||||||
|  | 
 | ||||||
|  | DotEnv.Load(DotEnvOptions(envFilePaths = [ "../.prod.env" ], overwriteExistingVars = false)) | ||||||
|  | 
 | ||||||
|  | let connStr = Environment.GetEnvironmentVariable("DATABASE_URL") | ||||||
|  |                 .Replace("postgresql://", "postgres://") | ||||||
|  |                 .Replace("?sslmode=require", "") | ||||||
|  | let apiKey  = Environment.GetEnvironmentVariable("API_KEY") | ||||||
|  | 
 | ||||||
|  | let validateApiKey (ctx : HttpContext) = | ||||||
|  |     match ctx.TryGetRequestHeader "X-API-Key" with | ||||||
|  |     | Some key -> apiKey.Equals key | ||||||
|  |     | None     -> false | ||||||
|  | 
 | ||||||
|  | let accessDenied = setStatusCode 401 >=> text "Access Denied" | ||||||
|  | let requiresApiKey = authorizeRequest validateApiKey accessDenied | ||||||
|  | 
 | ||||||
|  | let getCurrentBalance (discordId : string) = | ||||||
|  |     task { | ||||||
|  |         let! amounts = | ||||||
|  |             connStr | ||||||
|  |             |> Sql.connect | ||||||
|  |             |> Sql.parameters [ "did" , Sql.string discordId ] | ||||||
|  |             |> Sql.query """SELECT gbt FROM "user" WHERE discord_id = @did""" | ||||||
|  |             |> Sql.executeAsync (fun r -> r.int "gbt") | ||||||
|  |         match amounts with | ||||||
|  |         | []   -> return Error "User not found" | ||||||
|  |         | a::_ -> return Ok a | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | let get (discordId : string) : HttpHandler = | ||||||
|  |     fun (next : HttpFunc) (ctx : HttpContext) -> | ||||||
|  |         task { | ||||||
|  |             try | ||||||
|  |                 match! getCurrentBalance discordId with | ||||||
|  |                 | Ok amount -> return! json {| Amount = amount |} next ctx | ||||||
|  |                 | Error e -> return! RequestErrors.notFound (json {| Error = e |}) next ctx | ||||||
|  |             with ex -> | ||||||
|  |                 return! ServerErrors.internalError (json {| Error = ex.Message |}) next ctx | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | let modify sign (discordId : string) : HttpHandler = | ||||||
|  |     fun (next : HttpFunc) (ctx : HttpContext) -> | ||||||
|  |         task { | ||||||
|  |             let! body = ctx.BindJsonAsync<{|Amount:int|}>() | ||||||
|  |             match! getCurrentBalance discordId with | ||||||
|  |             | Ok current -> | ||||||
|  |                 let amount = body.Amount * sign | ||||||
|  |                 if current + amount < 0 then | ||||||
|  |                     return! RequestErrors.badRequest (json {| Error = "Insufficient funds" |}) next ctx | ||||||
|  |                 else | ||||||
|  |                 try | ||||||
|  |                     let! _ = | ||||||
|  |                         connStr | ||||||
|  |                         |> Sql.connect | ||||||
|  |                         |> Sql.parameters [ "did" , Sql.string discordId ; "amount" , Sql.int amount ] | ||||||
|  |                         |> Sql.query """UPDATE "user" SET gbt = GREATEST(gbt + @amount, 0) WHERE discord_id = @did""" | ||||||
|  |                         |> Sql.executeNonQueryAsync | ||||||
|  |                     return! json {| NewBalance = current + amount |} next ctx | ||||||
|  |                 with ex -> return! RequestErrors.notFound (json {| Error = ex.Message |}) next ctx | ||||||
|  |             | Error e -> return! RequestErrors.notFound (json {| Error = e |}) next ctx | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | let webApp = | ||||||
|  |     choose [ | ||||||
|  |         GET   >=> requiresApiKey >=> routef "/user/%s/balance" get | ||||||
|  |         PATCH >=> requiresApiKey >=> routef "/user/%s/balance/withdraw" (modify -1) | ||||||
|  |         PATCH >=> requiresApiKey >=> routef "/user/%s/balance/deposit" (modify +1) | ||||||
|  |         RequestErrors.NOT_FOUND "Not Found" ] | ||||||
|  | 
 | ||||||
|  | let errorHandler (ex : Exception) (logger : ILogger) = | ||||||
|  |     logger.LogError(ex, "An unhandled exception has occurred while executing the request.") | ||||||
|  |     clearResponse >=> setStatusCode 500 >=> text ex.Message | ||||||
|  | 
 | ||||||
|  | let configureApp (app : IApplicationBuilder) = | ||||||
|  |     let env = app.ApplicationServices.GetService<IWebHostEnvironment>() | ||||||
|  |     if env.IsDevelopment() then | ||||||
|  |         app.UseDeveloperExceptionPage() | ||||||
|  |     else | ||||||
|  |         app.UseGiraffeErrorHandler(errorHandler) | ||||||
|  |     |> ignore | ||||||
|  |     app.UseGiraffe(webApp) | ||||||
|  | 
 | ||||||
|  | let configureServices (services : IServiceCollection) = | ||||||
|  |     services.AddGiraffe() |> ignore | ||||||
|  | 
 | ||||||
|  | let configureLogging (builder : ILoggingBuilder) = | ||||||
|  |     builder.AddConsole() | ||||||
|  |            .AddDebug() |> ignore | ||||||
|  | 
 | ||||||
|  | [<EntryPoint>] | ||||||
|  | let main args = | ||||||
|  |     Host.CreateDefaultBuilder(args) | ||||||
|  |         .ConfigureWebHostDefaults( | ||||||
|  |             fun webHostBuilder -> | ||||||
|  |                 webHostBuilder | ||||||
|  |                     .ConfigureKestrel(fun opt -> | ||||||
|  |                         opt.AddServerHeader <- false) | ||||||
|  |                     .Configure(Action<IApplicationBuilder> configureApp) | ||||||
|  |                     .ConfigureServices(configureServices) | ||||||
|  |                     .ConfigureLogging(configureLogging) | ||||||
|  |                     |> ignore) | ||||||
|  |         .Build() | ||||||
|  |         .Run() | ||||||
|  |     0 | ||||||
							
								
								
									
										19
									
								
								CurrencyAPI/CurrencyAPI.fsproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								CurrencyAPI/CurrencyAPI.fsproj
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <Project Sdk="Microsoft.NET.Sdk.Web"> | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net6.0</TargetFramework> | ||||||
|  |     <AssemblyName>CurrencyAPI.App</AssemblyName> | ||||||
|  |     <EnableDefaultContentItems>false</EnableDefaultContentItems> | ||||||
|  |     <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Compile Include="Currency.fs" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <None Include="web.config" CopyToOutputDirectory="PreserveNewest" /> | ||||||
|  |     <Content Include="WebRoot\**\*"> | ||||||
|  |       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | ||||||
|  |     </Content> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <Import Project="..\.paket\Paket.Restore.targets" /> | ||||||
|  | </Project> | ||||||
							
								
								
									
										18
									
								
								CurrencyAPI/currency.rest
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								CurrencyAPI/currency.rest
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | |||||||
|  | :headers = << | ||||||
|  | Content-Type: application/json | ||||||
|  | X-API-Key: 1a2ff166-8985-47f0-8e5a-a7c6fb321a3f | ||||||
|  | # | ||||||
|  | 
 | ||||||
|  | # Get balance | ||||||
|  | GET https://degenz-currency-api-prod-jv56z.ondigitalocean.app/user/90588624566886400/balance | ||||||
|  | :headers | ||||||
|  | 
 | ||||||
|  | # Increment balance | ||||||
|  | PATCH https://degenz-currency-api-prod-jv56z.ondigitalocean.app/user/90588624566886400/balance/deposit | ||||||
|  | :headers | ||||||
|  | { "amount" : 10 } | ||||||
|  | 
 | ||||||
|  | # Decrement balance | ||||||
|  | PATCH https://degenz-currency-api-prod-jv56z.ondigitalocean.app/user/90588624566886400/balance/withdraw | ||||||
|  | :headers | ||||||
|  | { "amount" : 100 } | ||||||
							
								
								
									
										5
									
								
								CurrencyAPI/paket.references
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								CurrencyAPI/paket.references
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | |||||||
|  | FSharp.Data | ||||||
|  | FSharp.Core | ||||||
|  | dotenv.net | ||||||
|  | Npgsql.FSharp | ||||||
|  | Giraffe | ||||||
							
								
								
									
										9
									
								
								CurrencyAPI/web.config
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								CurrencyAPI/web.config
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <configuration> | ||||||
|  |   <system.webServer> | ||||||
|  |     <handlers> | ||||||
|  |       <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> | ||||||
|  |     </handlers> | ||||||
|  |     <aspNetCore processPath="dotnet" arguments="CurrencyAPI.dll" stdoutLogEnabled="false" stdoutLogFile="logs/stdout" /> | ||||||
|  |   </system.webServer> | ||||||
|  | </configuration> | ||||||
| @ -5,6 +5,8 @@ VisualStudioVersion = 16.0.30114.105 | |||||||
| MinimumVisualStudioVersion = 10.0.40219.1 | MinimumVisualStudioVersion = 10.0.40219.1 | ||||||
| Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Bot", "Bot\Bot.fsproj", "{FF9E58A6-1A1D-4DEC-B52D-265F215BF315}" | Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Bot", "Bot\Bot.fsproj", "{FF9E58A6-1A1D-4DEC-B52D-265F215BF315}" | ||||||
| EndProject | EndProject | ||||||
|  | Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "CurrencyAPI", "CurrencyAPI\CurrencyAPI.fsproj", "{AFA1A9F3-625E-44CA-83DA-A50756D119B5}" | ||||||
|  | EndProject | ||||||
| Global | Global | ||||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||||
| 		Debug|Any CPU = Debug|Any CPU | 		Debug|Any CPU = Debug|Any CPU | ||||||
| @ -22,5 +24,9 @@ Global | |||||||
| 		{44151B85-0D17-4270-AD72-490A6D8D6290}.Debug|Any CPU.Build.0 = Debug|Any CPU | 		{44151B85-0D17-4270-AD72-490A6D8D6290}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
| 		{44151B85-0D17-4270-AD72-490A6D8D6290}.Release|Any CPU.ActiveCfg = Release|Any CPU | 		{44151B85-0D17-4270-AD72-490A6D8D6290}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
| 		{44151B85-0D17-4270-AD72-490A6D8D6290}.Release|Any CPU.Build.0 = Release|Any CPU | 		{44151B85-0D17-4270-AD72-490A6D8D6290}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{AFA1A9F3-625E-44CA-83DA-A50756D119B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{AFA1A9F3-625E-44CA-83DA-A50756D119B5}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{AFA1A9F3-625E-44CA-83DA-A50756D119B5}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{AFA1A9F3-625E-44CA-83DA-A50756D119B5}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
| 	EndGlobalSection | 	EndGlobalSection | ||||||
| EndGlobal | EndGlobal | ||||||
|  | |||||||
							
								
								
									
										14
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								Dockerfile
									
									
									
									
									
								
							| @ -8,16 +8,18 @@ COPY . . | |||||||
| 
 | 
 | ||||||
| RUN dotnet tool restore | RUN dotnet tool restore | ||||||
| 
 | 
 | ||||||
| RUN dotnet restore "Bot/Bot.fsproj" | RUN dotnet restore "CurrencyAPI/CurrencyAPI.fsproj" | ||||||
| 
 | 
 | ||||||
| WORKDIR "/src/Bot" | WORKDIR "/src/CurrencyAPI/" | ||||||
| 
 | 
 | ||||||
| RUN dotnet build "Bot.fsproj" -c Release -o /app/build | RUN dotnet build "CurrencyAPI.fsproj" -c Release -o /app/build | ||||||
| 
 | 
 | ||||||
| FROM build AS publish | FROM build AS publish | ||||||
| RUN dotnet publish "Bot.fsproj" -c Release -o /app/publish | RUN dotnet publish "CurrencyAPI.fsproj" -c Release -o /app/publish --no-restore | ||||||
| 
 | 
 | ||||||
| FROM base AS final | FROM mcr.microsoft.com/dotnet/aspnet:6.0 | ||||||
| WORKDIR /app | WORKDIR /app | ||||||
| COPY --from=publish /app/publish . | COPY --from=publish /app/publish . | ||||||
| ENTRYPOINT "./Bot" | EXPOSE 80 | ||||||
|  | EXPOSE 443 | ||||||
|  | ENTRYPOINT [ "dotnet", "./CurrencyAPI.App.dll" ] | ||||||
|  | |||||||
| @ -18,3 +18,5 @@ nuget Solnet.Extensions | |||||||
| nuget Solnet.KeyStore | nuget Solnet.KeyStore | ||||||
| nuget Solnet.Programs | nuget Solnet.Programs | ||||||
| nuget Solnet.Rpc | nuget Solnet.Rpc | ||||||
|  | 
 | ||||||
|  | nuget Giraffe | ||||||
|  | |||||||
							
								
								
									
										96
									
								
								paket.lock
									
									
									
									
									
								
							
							
						
						
									
										96
									
								
								paket.lock
									
									
									
									
									
								
							| @ -6,7 +6,7 @@ NUGET | |||||||
|     ConcurrentHashSet (1.3) |     ConcurrentHashSet (1.3) | ||||||
|     dotenv.net (3.1.1) |     dotenv.net (3.1.1) | ||||||
|       System.Memory (>= 4.5.4) - restriction: || (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) (&& (== netstandard2.1) (< netstandard2.0)) |       System.Memory (>= 4.5.4) - restriction: || (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) (&& (== netstandard2.1) (< netstandard2.0)) | ||||||
|     DSharpPlus (4.3.0-nightly-01160) |     DSharpPlus (4.3.0-nightly-01135) | ||||||
|       Emzi0767.Common (>= 2.6.2) |       Emzi0767.Common (>= 2.6.2) | ||||||
|       Microsoft.Extensions.Logging.Abstractions (>= 5.0) |       Microsoft.Extensions.Logging.Abstractions (>= 5.0) | ||||||
|       Newtonsoft.Json (>= 13.0.1) |       Newtonsoft.Json (>= 13.0.1) | ||||||
| @ -16,22 +16,34 @@ NUGET | |||||||
|       System.Net.WebSockets.Client (>= 4.3.2) |       System.Net.WebSockets.Client (>= 4.3.2) | ||||||
|       System.Runtime.InteropServices.RuntimeInformation (>= 4.3) |       System.Runtime.InteropServices.RuntimeInformation (>= 4.3) | ||||||
|       System.Threading.Channels (>= 5.0) |       System.Threading.Channels (>= 5.0) | ||||||
|     DSharpPlus.Interactivity (4.3.0-nightly-01160) |     DSharpPlus.Interactivity (4.3.0-nightly-01135) | ||||||
|       ConcurrentHashSet (>= 1.1) |       ConcurrentHashSet (>= 1.1) | ||||||
|       DSharpPlus (>= 4.3.0-nightly-01160) |       DSharpPlus (>= 4.3.0-nightly-01135) | ||||||
|     DSharpPlus.SlashCommands (4.3.0-nightly-01160) |     DSharpPlus.SlashCommands (4.3.0-nightly-01135) | ||||||
|       DSharpPlus (>= 4.3.0-nightly-01160) |       DSharpPlus (>= 4.3.0-nightly-01135) | ||||||
|       Microsoft.Extensions.DependencyInjection (>= 5.0.1) |       Microsoft.Extensions.DependencyInjection (>= 5.0.1) | ||||||
|     Emzi0767.Common (2.6.6) |     Emzi0767.Common (2.6.2) | ||||||
|       System.Collections.Immutable (>= 6.0) |       System.Collections.Immutable (>= 5.0) | ||||||
|       System.Runtime.CompilerServices.Unsafe (>= 6.0) |       System.Memory (>= 4.5.4) | ||||||
|     FSharp.Core (6.0.5) |       System.Runtime.CompilerServices.Unsafe (>= 5.0) | ||||||
|     FSharp.Data (4.2.9) |       System.ValueTuple (>= 4.5) | ||||||
|       FSharp.Core (>= 5.0.1) |     FSharp.Core (6.0.3) | ||||||
|  |     FSharp.Data (4.2.8) | ||||||
|  |       FSharp.Core (>= 4.7.2) | ||||||
|     FsToolkit.ErrorHandling (2.13) |     FsToolkit.ErrorHandling (2.13) | ||||||
|       FSharp.Core (>= 4.7.2) |       FSharp.Core (>= 4.7.2) | ||||||
|     Microsoft.Bcl.AsyncInterfaces (6.0) - restriction: || (&& (== net6.0) (>= net461)) (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) (&& (== netstandard2.1) (>= net461)) |     Giraffe (6.0) | ||||||
|  |       FSharp.Core (>= 6.0.1) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|  |       Giraffe.ViewEngine (>= 1.3) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|  |       Microsoft.IO.RecyclableMemoryStream (>= 2.2) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|  |       Newtonsoft.Json (>= 13.0.1) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|  |       System.Text.Json (>= 6.0.2) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|  |       Utf8Json (>= 1.3.7) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|  |     Giraffe.ViewEngine (1.4) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|  |       FSharp.Core (>= 5.0) | ||||||
|  |     Microsoft.Bcl.AsyncInterfaces (6.0) - restriction: || (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) | ||||||
|       System.Threading.Tasks.Extensions (>= 4.5.4) - restriction: || (&& (== net6.0) (>= net461)) (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) (&& (== netstandard2.1) (>= net461)) |       System.Threading.Tasks.Extensions (>= 4.5.4) - restriction: || (&& (== net6.0) (>= net461)) (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) (&& (== netstandard2.1) (>= net461)) | ||||||
|  |     Microsoft.Bcl.HashCode (1.1.1) - restriction: || (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) | ||||||
|     Microsoft.Extensions.Configuration (6.0.1) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |     Microsoft.Extensions.Configuration (6.0.1) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|       Microsoft.Extensions.Configuration.Abstractions (>= 6.0) |       Microsoft.Extensions.Configuration.Abstractions (>= 6.0) | ||||||
|       Microsoft.Extensions.Primitives (>= 6.0) |       Microsoft.Extensions.Primitives (>= 6.0) | ||||||
| @ -83,7 +95,8 @@ NUGET | |||||||
|       Microsoft.Extensions.Primitives (>= 6.0) |       Microsoft.Extensions.Primitives (>= 6.0) | ||||||
|     Microsoft.Extensions.Primitives (6.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |     Microsoft.Extensions.Primitives (6.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|       System.Runtime.CompilerServices.Unsafe (>= 6.0) |       System.Runtime.CompilerServices.Unsafe (>= 6.0) | ||||||
|     Microsoft.NETCore.Platforms (6.0.5) |     Microsoft.IO.RecyclableMemoryStream (2.2) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|  |     Microsoft.NETCore.Platforms (6.0.2) | ||||||
|     Microsoft.NETCore.Targets (5.0) |     Microsoft.NETCore.Targets (5.0) | ||||||
|     Microsoft.Win32.Primitives (4.3) |     Microsoft.Win32.Primitives (4.3) | ||||||
|       Microsoft.NETCore.Platforms (>= 1.1) |       Microsoft.NETCore.Platforms (>= 1.1) | ||||||
| @ -91,11 +104,24 @@ NUGET | |||||||
|       System.Runtime (>= 4.3) |       System.Runtime (>= 4.3) | ||||||
|     mixpanel-csharp (5.0) |     mixpanel-csharp (5.0) | ||||||
|     Newtonsoft.Json (13.0.1) |     Newtonsoft.Json (13.0.1) | ||||||
|     Npgsql (6.0.5) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |     Npgsql (6.0.3) | ||||||
|  |       Microsoft.Bcl.AsyncInterfaces (>= 6.0) - restriction: || (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) | ||||||
|  |       Microsoft.Bcl.HashCode (>= 1.1.1) - restriction: || (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) | ||||||
|  |       System.Collections.Immutable (>= 6.0) - restriction: || (&& (== net6.0) (< netcoreapp3.1)) (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) (== netstandard2.1) | ||||||
|  |       System.Diagnostics.DiagnosticSource (>= 6.0) - restriction: || (&& (== net6.0) (< net5.0)) (&& (== net6.0) (< netcoreapp3.1)) (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) (== netstandard2.1) | ||||||
|  |       System.Memory (>= 4.5.4) - restriction: || (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) | ||||||
|       System.Runtime.CompilerServices.Unsafe (>= 6.0) |       System.Runtime.CompilerServices.Unsafe (>= 6.0) | ||||||
|     Npgsql.FSharp (5.2) |       System.Text.Json (>= 6.0) - restriction: || (&& (== net6.0) (< netcoreapp3.1)) (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) (== netstandard2.1) | ||||||
|       FSharp.Core (>= 6.0.2) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |       System.Threading.Channels (>= 6.0) - restriction: || (&& (== net6.0) (< netcoreapp3.1)) (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) (== netstandard2.1) | ||||||
|       Npgsql (>= 6.0.5) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |       System.Threading.Tasks.Extensions (>= 4.5.4) - restriction: || (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) | ||||||
|  |       System.ValueTuple (>= 4.5) - restriction: || (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) | ||||||
|  |     Npgsql.FSharp (4.1) | ||||||
|  |       FSharp.Core (>= 4.7.2) | ||||||
|  |       Npgsql (>= 5.0.3) | ||||||
|  |       Ply (>= 0.3.1) | ||||||
|  |     Ply (0.3.1) | ||||||
|  |       FSharp.Core (>= 4.6.2) | ||||||
|  |       System.Threading.Tasks.Extensions (>= 4.5.4) | ||||||
|     Portable.BouncyCastle (1.9) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |     Portable.BouncyCastle (1.9) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|     runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) |     runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) | ||||||
|     runtime.debian.9-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) |     runtime.debian.9-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) | ||||||
| @ -140,21 +166,21 @@ NUGET | |||||||
|     runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) |     runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) | ||||||
|     runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) |     runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) | ||||||
|     runtime.ubuntu.18.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) |     runtime.ubuntu.18.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) | ||||||
|     Solnet.Extensions (6.1) |     Solnet.Extensions (6.0.11) | ||||||
|       Solnet.Programs (>= 6.1) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |       Solnet.Programs (>= 6.0.11) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|       Solnet.Rpc (>= 6.1) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |       Solnet.Rpc (>= 6.0.11) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|       Solnet.Wallet (>= 6.1) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |       Solnet.Wallet (>= 6.0.11) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|     Solnet.KeyStore (6.1) |     Solnet.KeyStore (6.0.11) | ||||||
|       Chaos.NaCl.Standard (>= 1.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |       Chaos.NaCl.Standard (>= 1.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|       Portable.BouncyCastle (>= 1.9) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |       Portable.BouncyCastle (>= 1.9) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|       Solnet.Wallet (>= 6.1) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |       Solnet.Wallet (>= 6.0.11) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|     Solnet.Programs (6.1) |     Solnet.Programs (6.0.11) | ||||||
|       Solnet.Rpc (>= 6.1) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |       Solnet.Rpc (>= 6.0.11) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|     Solnet.Rpc (6.1) |     Solnet.Rpc (6.0.11) | ||||||
|       Microsoft.Extensions.Logging (>= 6.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |       Microsoft.Extensions.Logging (>= 6.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|       Microsoft.Extensions.Logging.Console (>= 6.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |       Microsoft.Extensions.Logging.Console (>= 6.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|       Solnet.Wallet (>= 6.1) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |       Solnet.Wallet (>= 6.0.11) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|     Solnet.Wallet (6.1) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |     Solnet.Wallet (6.0.11) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|       Chaos.NaCl.Standard (>= 1.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |       Chaos.NaCl.Standard (>= 1.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|       Portable.BouncyCastle (>= 1.9) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |       Portable.BouncyCastle (>= 1.9) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|     System.Buffers (4.5.1) - restriction: || (&& (== net6.0) (>= monotouch)) (&& (== net6.0) (>= net461)) (&& (== net6.0) (< netcoreapp2.0) (< netstandard2.1)) (&& (== net6.0) (< netstandard1.1)) (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (< netstandard2.1) (>= xamarinios)) (&& (== net6.0) (< netstandard2.1) (>= xamarinmac)) (&& (== net6.0) (< netstandard2.1) (>= xamarintvos)) (&& (== net6.0) (< netstandard2.1) (>= xamarinwatchos)) (== netstandard2.0) (== netstandard2.1) |     System.Buffers (4.5.1) - restriction: || (&& (== net6.0) (>= monotouch)) (&& (== net6.0) (>= net461)) (&& (== net6.0) (< netcoreapp2.0) (< netstandard2.1)) (&& (== net6.0) (< netstandard1.1)) (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (< netstandard2.1) (>= xamarinios)) (&& (== net6.0) (< netstandard2.1) (>= xamarinmac)) (&& (== net6.0) (< netstandard2.1) (>= xamarintvos)) (&& (== net6.0) (< netstandard2.1) (>= xamarinwatchos)) (== netstandard2.0) (== netstandard2.1) | ||||||
| @ -226,7 +252,7 @@ NUGET | |||||||
|       System.Resources.ResourceManager (>= 4.3) |       System.Resources.ResourceManager (>= 4.3) | ||||||
|       System.Runtime (>= 4.3) |       System.Runtime (>= 4.3) | ||||||
|       System.Runtime.Extensions (>= 4.3) |       System.Runtime.Extensions (>= 4.3) | ||||||
|     System.Memory (4.5.5) |     System.Memory (4.5.4) | ||||||
|       System.Buffers (>= 4.5.1) - restriction: || (&& (== net6.0) (>= monotouch)) (&& (== net6.0) (>= net461)) (&& (== net6.0) (< netcoreapp2.0)) (&& (== net6.0) (< netstandard1.1)) (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (>= xamarinios)) (&& (== net6.0) (>= xamarinmac)) (&& (== net6.0) (>= xamarintvos)) (&& (== net6.0) (>= xamarinwatchos)) (== netstandard2.0) (== netstandard2.1) |       System.Buffers (>= 4.5.1) - restriction: || (&& (== net6.0) (>= monotouch)) (&& (== net6.0) (>= net461)) (&& (== net6.0) (< netcoreapp2.0)) (&& (== net6.0) (< netstandard1.1)) (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (>= xamarinios)) (&& (== net6.0) (>= xamarinmac)) (&& (== net6.0) (>= xamarintvos)) (&& (== net6.0) (>= xamarinwatchos)) (== netstandard2.0) (== netstandard2.1) | ||||||
|       System.Numerics.Vectors (>= 4.4) - restriction: || (&& (== net6.0) (< netcoreapp2.0)) (== netstandard2.0) (== netstandard2.1) |       System.Numerics.Vectors (>= 4.4) - restriction: || (&& (== net6.0) (< netcoreapp2.0)) (== netstandard2.0) (== netstandard2.1) | ||||||
|       System.Runtime.CompilerServices.Unsafe (>= 4.5.3) - restriction: || (&& (== net6.0) (>= monotouch)) (&& (== net6.0) (>= net461)) (&& (== net6.0) (< netcoreapp2.0)) (&& (== net6.0) (< netcoreapp2.1)) (&& (== net6.0) (< netstandard1.1)) (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (>= uap10.1)) (&& (== net6.0) (>= xamarinios)) (&& (== net6.0) (>= xamarinmac)) (&& (== net6.0) (>= xamarintvos)) (&& (== net6.0) (>= xamarinwatchos)) (== netstandard2.0) (== netstandard2.1) |       System.Runtime.CompilerServices.Unsafe (>= 4.5.3) - restriction: || (&& (== net6.0) (>= monotouch)) (&& (== net6.0) (>= net461)) (&& (== net6.0) (< netcoreapp2.0)) (&& (== net6.0) (< netcoreapp2.1)) (&& (== net6.0) (< netstandard1.1)) (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (>= uap10.1)) (&& (== net6.0) (>= xamarinios)) (&& (== net6.0) (>= xamarinmac)) (&& (== net6.0) (>= xamarintvos)) (&& (== net6.0) (>= xamarinwatchos)) (== netstandard2.0) (== netstandard2.1) | ||||||
| @ -357,6 +383,8 @@ NUGET | |||||||
|       System.IO (>= 4.3) |       System.IO (>= 4.3) | ||||||
|       System.Reflection.Primitives (>= 4.3) |       System.Reflection.Primitives (>= 4.3) | ||||||
|       System.Runtime (>= 4.3) |       System.Runtime (>= 4.3) | ||||||
|  |     System.Reflection.Emit (4.7) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|  |     System.Reflection.Emit.Lightweight (4.7) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|     System.Reflection.Extensions (4.3) |     System.Reflection.Extensions (4.3) | ||||||
|       Microsoft.NETCore.Platforms (>= 1.1) |       Microsoft.NETCore.Platforms (>= 1.1) | ||||||
|       Microsoft.NETCore.Targets (>= 1.1) |       Microsoft.NETCore.Targets (>= 1.1) | ||||||
| @ -506,7 +534,7 @@ NUGET | |||||||
|       System.Text.Encoding (>= 4.3) |       System.Text.Encoding (>= 4.3) | ||||||
|     System.Text.Encodings.Web (6.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |     System.Text.Encodings.Web (6.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|       System.Runtime.CompilerServices.Unsafe (>= 6.0) |       System.Runtime.CompilerServices.Unsafe (>= 6.0) | ||||||
|     System.Text.Json (6.0.5) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) |     System.Text.Json (6.0.2) | ||||||
|       System.Runtime.CompilerServices.Unsafe (>= 6.0) |       System.Runtime.CompilerServices.Unsafe (>= 6.0) | ||||||
|       System.Text.Encodings.Web (>= 6.0) |       System.Text.Encodings.Web (>= 6.0) | ||||||
|     System.Threading (4.3) |     System.Threading (4.3) | ||||||
| @ -518,7 +546,7 @@ NUGET | |||||||
|       Microsoft.NETCore.Platforms (>= 1.1) |       Microsoft.NETCore.Platforms (>= 1.1) | ||||||
|       Microsoft.NETCore.Targets (>= 1.1) |       Microsoft.NETCore.Targets (>= 1.1) | ||||||
|       System.Runtime (>= 4.3) |       System.Runtime (>= 4.3) | ||||||
|     System.Threading.Tasks.Extensions (4.5.4) - restriction: || (&& (== net6.0) (>= net461)) (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) (&& (== netstandard2.1) (>= net461)) |     System.Threading.Tasks.Extensions (4.5.4) | ||||||
|       System.Runtime.CompilerServices.Unsafe (>= 4.5.3) - restriction: || (&& (== net6.0) (>= net461)) (&& (== net6.0) (< netcoreapp2.1)) (&& (== net6.0) (< netstandard1.0)) (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (>= wp8)) (== netstandard2.0) (== netstandard2.1) |       System.Runtime.CompilerServices.Unsafe (>= 4.5.3) - restriction: || (&& (== net6.0) (>= net461)) (&& (== net6.0) (< netcoreapp2.1)) (&& (== net6.0) (< netstandard1.0)) (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (>= wp8)) (== netstandard2.0) (== netstandard2.1) | ||||||
|     System.Threading.ThreadPool (4.3) |     System.Threading.ThreadPool (4.3) | ||||||
|       System.Runtime (>= 4.3) |       System.Runtime (>= 4.3) | ||||||
| @ -527,3 +555,9 @@ NUGET | |||||||
|       Microsoft.NETCore.Platforms (>= 1.1) |       Microsoft.NETCore.Platforms (>= 1.1) | ||||||
|       Microsoft.NETCore.Targets (>= 1.1) |       Microsoft.NETCore.Targets (>= 1.1) | ||||||
|       System.Runtime (>= 4.3) |       System.Runtime (>= 4.3) | ||||||
|  |     System.ValueTuple (4.5) | ||||||
|  |     Utf8Json (1.3.7) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) | ||||||
|  |       System.Reflection.Emit (>= 4.3) | ||||||
|  |       System.Reflection.Emit.Lightweight (>= 4.3) | ||||||
|  |       System.Threading.Tasks.Extensions (>= 4.4) | ||||||
|  |       System.ValueTuple (>= 4.4) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user