96 lines
2.8 KiB
Plaintext
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 |