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
|
@ -154,14 +154,14 @@ let getRafflesWithPurchases storeId =
|
|||||||
|> Sql.connect
|
|> Sql.connect
|
||||||
|> Sql.parameters [ "sid" , Sql.string storeId ]
|
|> Sql.parameters [ "sid" , Sql.string storeId ]
|
||||||
|> Sql.query """
|
|> 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,
|
(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
|
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
|
FROM store_item
|
||||||
JOIN item i on store_item.item_id = i.id
|
JOIN item i on store_item.item_id = i.id
|
||||||
WHERE store_id = @sid AND store_item.unlisted = false)
|
WHERE store_id = @sid AND store_item.unlisted = false)
|
||||||
SELECT * FROM raffles
|
SELECT * FROM raffles
|
||||||
FULL JOIN (SELECT item_id, count(*) AS total FROM inventory_item
|
FULL JOIN (SELECT item_id, count(*) AS total FROM inventory_item
|
||||||
WHERE item_id = ANY (SELECT raffle_id FROM raffles)
|
WHERE item_id = ANY (SELECT raffle_id FROM raffles)
|
||||||
GROUP BY item_id) total_raffles ON total_raffles.item_id = raffle_id;
|
GROUP BY item_id) total_raffles ON total_raffles.item_id = raffle_id;
|
||||||
"""
|
"""
|
||||||
|
@ -76,7 +76,7 @@ let strengthBonus attacker defender =
|
|||||||
|> (*) 0.01
|
|> (*) 0.01
|
||||||
|> (*) 200.0 // Bonus
|
|> (*) 200.0 // Bonus
|
||||||
|> int
|
|> int
|
||||||
|
|
||||||
let runHackerBattle defender (hack : HackItem) =
|
let runHackerBattle defender (hack : HackItem) =
|
||||||
defender
|
defender
|
||||||
|> Player.removeExpiredActions
|
|> Player.removeExpiredActions
|
||||||
@ -108,7 +108,7 @@ let updateCombatants successfulHack (attacker : PlayerData) (defender : PlayerDa
|
|||||||
DbService.addPlayerEvent defender.DiscordId (event true) ]
|
DbService.addPlayerEvent defender.DiscordId (event true) ]
|
||||||
|> Async.Parallel
|
|> Async.Parallel
|
||||||
|> Async.Ignore
|
|> Async.Ignore
|
||||||
|
|
||||||
let hackerResult successfulHack (ctx : IDiscordContext) attacker defender (hack : HackItem) =
|
let hackerResult successfulHack (ctx : IDiscordContext) attacker defender (hack : HackItem) =
|
||||||
async {
|
async {
|
||||||
let prizeAmount , bonus =
|
let prizeAmount , bonus =
|
||||||
@ -120,9 +120,9 @@ let hackerResult successfulHack (ctx : IDiscordContext) attacker defender (hack
|
|||||||
if hack.Power < int attacker.Bank
|
if hack.Power < int attacker.Bank
|
||||||
then gbt hack.Power , 0<GBT>
|
then gbt hack.Power , 0<GBT>
|
||||||
else attacker.Bank , 0<GBT>
|
else attacker.Bank , 0<GBT>
|
||||||
|
|
||||||
do! updateCombatants successfulHack attacker defender hack prizeAmount
|
do! updateCombatants successfulHack attacker defender hack prizeAmount
|
||||||
|
|
||||||
let! defenderMember = ctx.GetGuild().GetMemberAsync(defender.DiscordId) |> Async.AwaitTask
|
let! defenderMember = ctx.GetGuild().GetMemberAsync(defender.DiscordId) |> Async.AwaitTask
|
||||||
let embed = Embeds.responseSuccessfulHack2 successfulHack attacker defender (ctx.GetDiscordMember()) defenderMember prizeAmount bonus hack
|
let embed = Embeds.responseSuccessfulHack2 successfulHack attacker defender (ctx.GetDiscordMember()) defenderMember prizeAmount bonus hack
|
||||||
do! ctx.GetChannel().SendMessageAsync(embed)
|
do! ctx.GetChannel().SendMessageAsync(embed)
|
||||||
@ -368,7 +368,7 @@ type HackerGame() =
|
|||||||
[<SlashCommand("scan", "Find 5 targets connected to the network we can try to hack")>]
|
[<SlashCommand("scan", "Find 5 targets connected to the network we can try to hack")>]
|
||||||
member this.ScanCommand (ctx : InteractionContext) =
|
member this.ScanCommand (ctx : InteractionContext) =
|
||||||
enforceChannels (DiscordInteractionContext ctx) scan scan
|
enforceChannels (DiscordInteractionContext ctx) scan scan
|
||||||
|
|
||||||
// [<SlashCommand("test-autocomplete", "Create a passive defense that will last 24 hours")>]
|
// [<SlashCommand("test-autocomplete", "Create a passive defense that will last 24 hours")>]
|
||||||
member this.TestAutoComplete (ctx : InteractionContext) =
|
member this.TestAutoComplete (ctx : InteractionContext) =
|
||||||
async {
|
async {
|
||||||
@ -377,4 +377,4 @@ type HackerGame() =
|
|||||||
do! ctx.Interaction.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, builder)
|
do! ctx.Interaction.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource, builder)
|
||||||
|> Async.AwaitTask
|
|> Async.AwaitTask
|
||||||
} |> Async.StartAsTask
|
} |> Async.StartAsTask
|
||||||
:> Task
|
:> Task
|
||||||
|
@ -7,4 +7,5 @@ Npgsql.FSharp
|
|||||||
mixpanel-csharp
|
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" ]
|
||||||
|
@ -17,4 +17,6 @@ nuget mixpanel-csharp 5.0.0
|
|||||||
nuget Solnet.Extensions
|
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