diff --git a/Airdrop.fsx b/Airdrop.fsx new file mode 100644 index 0000000..44c17e5 --- /dev/null +++ b/Airdrop.fsx @@ -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 diff --git a/Bot/DbService.fs b/Bot/DbService.fs index db787fe..7867523 100644 --- a/Bot/DbService.fs +++ b/Bot/DbService.fs @@ -154,14 +154,14 @@ let getRafflesWithPurchases storeId = |> Sql.connect |> Sql.parameters [ "sid" , Sql.string storeId ] |> Sql.query """ -WITH raffles AS + WITH raffles AS (SELECT store_id,stock,available,limit_stock,i.id AS raffle_id,name,description,icon_url,image_url,category,require_role,require_invites,sale_end,rank, buy_price,sell_price,rate_limit,expiration,drop_chance,can_trade,can_consume,attack_power,defense_power,class_name,max_stack,mods FROM store_item JOIN item i on store_item.item_id = i.id WHERE store_id = @sid AND store_item.unlisted = false) -SELECT * FROM raffles -FULL JOIN (SELECT item_id, count(*) AS total FROM inventory_item + SELECT * FROM raffles + FULL JOIN (SELECT item_id, count(*) AS total FROM inventory_item WHERE item_id = ANY (SELECT raffle_id FROM raffles) GROUP BY item_id) total_raffles ON total_raffles.item_id = raffle_id; """ diff --git a/Bot/Games/HackerBattle.fs b/Bot/Games/HackerBattle.fs index 26996d5..f295060 100644 --- a/Bot/Games/HackerBattle.fs +++ b/Bot/Games/HackerBattle.fs @@ -76,7 +76,7 @@ let strengthBonus attacker defender = |> (*) 0.01 |> (*) 200.0 // Bonus |> int - + let runHackerBattle defender (hack : HackItem) = defender |> Player.removeExpiredActions @@ -108,7 +108,7 @@ let updateCombatants successfulHack (attacker : PlayerData) (defender : PlayerDa DbService.addPlayerEvent defender.DiscordId (event true) ] |> Async.Parallel |> Async.Ignore - + let hackerResult successfulHack (ctx : IDiscordContext) attacker defender (hack : HackItem) = async { let prizeAmount , bonus = @@ -120,9 +120,9 @@ let hackerResult successfulHack (ctx : IDiscordContext) attacker defender (hack if hack.Power < int attacker.Bank then gbt hack.Power , 0 else attacker.Bank , 0 - + do! updateCombatants successfulHack attacker defender hack prizeAmount - + let! defenderMember = ctx.GetGuild().GetMemberAsync(defender.DiscordId) |> Async.AwaitTask let embed = Embeds.responseSuccessfulHack2 successfulHack attacker defender (ctx.GetDiscordMember()) defenderMember prizeAmount bonus hack do! ctx.GetChannel().SendMessageAsync(embed) @@ -368,7 +368,7 @@ type HackerGame() = [] member this.ScanCommand (ctx : InteractionContext) = enforceChannels (DiscordInteractionContext ctx) scan scan - + // [] member this.TestAutoComplete (ctx : InteractionContext) = async { @@ -377,4 +377,4 @@ type HackerGame() = do! ctx.Interaction.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, builder) |> Async.AwaitTask } |> Async.StartAsTask - :> Task \ No newline at end of file + :> Task diff --git a/Bot/paket.references b/Bot/paket.references index 018add7..c7dcb68 100644 --- a/Bot/paket.references +++ b/Bot/paket.references @@ -7,4 +7,5 @@ Npgsql.FSharp mixpanel-csharp Solnet.Rpc FsToolkit.ErrorHandling -FSharp.Data \ No newline at end of file +FSharp.Data +Newtonsoft.Json diff --git a/CurrencyAPI/Currency.fs b/CurrencyAPI/Currency.fs new file mode 100644 index 0000000..763f3c3 --- /dev/null +++ b/CurrencyAPI/Currency.fs @@ -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() + 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 + +[] +let main args = + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults( + fun webHostBuilder -> + webHostBuilder + .ConfigureKestrel(fun opt -> + opt.AddServerHeader <- false) + .Configure(Action configureApp) + .ConfigureServices(configureServices) + .ConfigureLogging(configureLogging) + |> ignore) + .Build() + .Run() + 0 diff --git a/CurrencyAPI/CurrencyAPI.fsproj b/CurrencyAPI/CurrencyAPI.fsproj new file mode 100644 index 0000000..bbd3e99 --- /dev/null +++ b/CurrencyAPI/CurrencyAPI.fsproj @@ -0,0 +1,19 @@ + + + + net6.0 + CurrencyAPI.App + false + true + + + + + + + + PreserveNewest + + + + \ No newline at end of file diff --git a/CurrencyAPI/currency.rest b/CurrencyAPI/currency.rest new file mode 100644 index 0000000..2027f41 --- /dev/null +++ b/CurrencyAPI/currency.rest @@ -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 } diff --git a/CurrencyAPI/paket.references b/CurrencyAPI/paket.references new file mode 100644 index 0000000..054c675 --- /dev/null +++ b/CurrencyAPI/paket.references @@ -0,0 +1,5 @@ +FSharp.Data +FSharp.Core +dotenv.net +Npgsql.FSharp +Giraffe diff --git a/CurrencyAPI/web.config b/CurrencyAPI/web.config new file mode 100644 index 0000000..aa1be50 --- /dev/null +++ b/CurrencyAPI/web.config @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/DegenzGame.sln b/DegenzGame.sln index 4f1c150..115934b 100644 --- a/DegenzGame.sln +++ b/DegenzGame.sln @@ -5,6 +5,8 @@ VisualStudioVersion = 16.0.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Bot", "Bot\Bot.fsproj", "{FF9E58A6-1A1D-4DEC-B52D-265F215BF315}" EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "CurrencyAPI", "CurrencyAPI\CurrencyAPI.fsproj", "{AFA1A9F3-625E-44CA-83DA-A50756D119B5}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution 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}.Release|Any CPU.ActiveCfg = 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 EndGlobal diff --git a/Dockerfile b/Dockerfile index eb41ac9..5951f44 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,16 +8,18 @@ COPY . . 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 -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 COPY --from=publish /app/publish . -ENTRYPOINT "./Bot" +EXPOSE 80 +EXPOSE 443 +ENTRYPOINT [ "dotnet", "./CurrencyAPI.App.dll" ] diff --git a/paket.dependencies b/paket.dependencies index 0c953bf..f498609 100644 --- a/paket.dependencies +++ b/paket.dependencies @@ -17,4 +17,6 @@ nuget mixpanel-csharp 5.0.0 nuget Solnet.Extensions nuget Solnet.KeyStore nuget Solnet.Programs -nuget Solnet.Rpc \ No newline at end of file +nuget Solnet.Rpc + +nuget Giraffe diff --git a/paket.lock b/paket.lock index a834e89..7ca9e0d 100644 --- a/paket.lock +++ b/paket.lock @@ -6,7 +6,7 @@ NUGET ConcurrentHashSet (1.3) 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)) - DSharpPlus (4.3.0-nightly-01160) + DSharpPlus (4.3.0-nightly-01135) Emzi0767.Common (>= 2.6.2) Microsoft.Extensions.Logging.Abstractions (>= 5.0) Newtonsoft.Json (>= 13.0.1) @@ -16,22 +16,34 @@ NUGET System.Net.WebSockets.Client (>= 4.3.2) System.Runtime.InteropServices.RuntimeInformation (>= 4.3) System.Threading.Channels (>= 5.0) - DSharpPlus.Interactivity (4.3.0-nightly-01160) + DSharpPlus.Interactivity (4.3.0-nightly-01135) ConcurrentHashSet (>= 1.1) - DSharpPlus (>= 4.3.0-nightly-01160) - DSharpPlus.SlashCommands (4.3.0-nightly-01160) - DSharpPlus (>= 4.3.0-nightly-01160) + DSharpPlus (>= 4.3.0-nightly-01135) + DSharpPlus.SlashCommands (4.3.0-nightly-01135) + DSharpPlus (>= 4.3.0-nightly-01135) Microsoft.Extensions.DependencyInjection (>= 5.0.1) - Emzi0767.Common (2.6.6) - System.Collections.Immutable (>= 6.0) - System.Runtime.CompilerServices.Unsafe (>= 6.0) - FSharp.Core (6.0.5) - FSharp.Data (4.2.9) - FSharp.Core (>= 5.0.1) + Emzi0767.Common (2.6.2) + System.Collections.Immutable (>= 5.0) + System.Memory (>= 4.5.4) + System.Runtime.CompilerServices.Unsafe (>= 5.0) + System.ValueTuple (>= 4.5) + FSharp.Core (6.0.3) + FSharp.Data (4.2.8) + FSharp.Core (>= 4.7.2) FsToolkit.ErrorHandling (2.13) 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)) + 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.Abstractions (>= 6.0) Microsoft.Extensions.Primitives (>= 6.0) @@ -83,7 +95,8 @@ NUGET Microsoft.Extensions.Primitives (>= 6.0) Microsoft.Extensions.Primitives (6.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.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.Win32.Primitives (4.3) Microsoft.NETCore.Platforms (>= 1.1) @@ -91,11 +104,24 @@ NUGET System.Runtime (>= 4.3) mixpanel-csharp (5.0) 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) - Npgsql.FSharp (5.2) - FSharp.Core (>= 6.0.2) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) - Npgsql (>= 6.0.5) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) + System.Text.Json (>= 6.0) - restriction: || (&& (== net6.0) (< netcoreapp3.1)) (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) (== netstandard2.1) + System.Threading.Channels (>= 6.0) - restriction: || (&& (== net6.0) (< netcoreapp3.1)) (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) (== netstandard2.1) + 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)) 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) @@ -140,21 +166,21 @@ NUGET 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.18.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - Solnet.Extensions (6.1) - Solnet.Programs (>= 6.1) - 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.Wallet (>= 6.1) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) - Solnet.KeyStore (6.1) + Solnet.Extensions (6.0.11) + Solnet.Programs (>= 6.0.11) - 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.0.11) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) + Solnet.KeyStore (6.0.11) 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)) - Solnet.Wallet (>= 6.1) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) - Solnet.Programs (6.1) - Solnet.Rpc (>= 6.1) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) - Solnet.Rpc (6.1) + Solnet.Wallet (>= 6.0.11) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) + Solnet.Programs (6.0.11) + Solnet.Rpc (>= 6.0.11) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.0)) + Solnet.Rpc (6.0.11) 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)) - Solnet.Wallet (>= 6.1) - 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.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)) 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) @@ -226,7 +252,7 @@ NUGET System.Resources.ResourceManager (>= 4.3) System.Runtime (>= 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.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) @@ -357,6 +383,8 @@ NUGET System.IO (>= 4.3) System.Reflection.Primitives (>= 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) Microsoft.NETCore.Platforms (>= 1.1) Microsoft.NETCore.Targets (>= 1.1) @@ -506,7 +534,7 @@ NUGET System.Text.Encoding (>= 4.3) System.Text.Encodings.Web (6.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) (&& (== netstandard2.1) (>= net6.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.Text.Encodings.Web (>= 6.0) System.Threading (4.3) @@ -518,7 +546,7 @@ NUGET Microsoft.NETCore.Platforms (>= 1.1) Microsoft.NETCore.Targets (>= 1.1) 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.Threading.ThreadPool (4.3) System.Runtime (>= 4.3) @@ -527,3 +555,9 @@ NUGET Microsoft.NETCore.Platforms (>= 1.1) Microsoft.NETCore.Targets (>= 1.1) 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)