discord-bot-game/Bot/Scripts/TransferNFT.fsx

96 lines
2.8 KiB
Plaintext

#load "/home/joe/Development/DegenzGame/.paket/load/net6.0/main.group.fsx";;
open Npgsql.FSharp
open dotenv.net
open System.IO
open System.Diagnostics
open System.Threading.Tasks
let prodEnv = DotEnv.Read(DotEnvOptions(envFilePaths = [ "./.prod.env" ]))
let ( _ , prodConnStr )= prodEnv.TryGetValue("DATABASE_URL")
type NftTransfer = {
Id : uint64
Name : string
NftName : string
NftAddress : string
UserWallet : string
}
printfn "Getting Wallet Addresses:"
let pending =
prodConnStr
|> Sql.connect
|> Sql.query """
SELECT u.id, u.display_name, token.name, token.address, mpa.tx_wallet FROM gen_one_token token
JOIN mint_pass_assignment mpa on token.id = mpa.token_id
JOIN "user" u on mpa.recipient_id = u.id
WHERE mpa.fulfilled = false AND token.locked = false
ORDER BY mpa.created_at;
"""
|> Sql.execute (fun reader ->
{ Id = reader.string "id" |> uint64
Name = reader.string "display_name"
NftName = reader.string "name"
NftAddress = reader.string "address"
UserWallet = reader.string "tx_wallet" })
let testSample = [ pending |> List.last ]
type CommandResult = {
ExitCode: int;
StandardOutput: string;
StandardError: string
}
let executeCommand executable args =
async {
let startInfo = ProcessStartInfo()
startInfo.FileName <- executable
for a in args do
startInfo.ArgumentList.Add(a)
startInfo.RedirectStandardOutput <- true
startInfo.RedirectStandardError <- true
startInfo.UseShellExecute <- false
startInfo.CreateNoWindow <- true
use p = new Process()
p.StartInfo <- startInfo
p.Start() |> ignore
let outTask =
Task.WhenAll(
[| p.StandardOutput.ReadToEndAsync()
p.StandardError.ReadToEndAsync() |]
)
do! p.WaitForExitAsync() |> Async.AwaitTask
let! out = outTask |> Async.AwaitTask
return
{ ExitCode = p.ExitCode
StandardOutput = out.[0]
StandardError = out.[1] }
}
let executeShellCommand command =
executeCommand "/usr/bin/env" [ "-S"; "bash"; "-c"; command ]
let transfer (nft : NftTransfer) =
printfn $"Transferring {nft.NftName} to {nft.Name} "
let result =
$"spl-token transfer --allow-unfunded-recipient --fund-recipient {nft.NftAddress} 1 {nft.UserWallet}"
|> executeShellCommand
|> Async.RunSynchronously
if result.ExitCode = 0 then
let user = $"{nft.Id} - {nft.Name} - {nft.NftName}"
let tx = result.StandardOutput
File.AppendAllLines("/home/joe/Downloads/transactions", [ user ; tx ])
else
printfn $"{result.StandardError}"
for nft in pending do
transfer nft