Files
libsam/cmd/send_tx/main.go
2025-12-26 12:03:05 +08:00

94 lines
2.1 KiB
Go

package main
import (
"context"
"fmt"
"os"
"os/signal"
"syscall"
"github.com/gagliardetto/solana-go"
"github.com/gagliardetto/solana-go/programs/system"
"github.com/gagliardetto/solana-go/rpc"
"github.com/samlior/libsam/pkg/consts"
"github.com/samlior/libsam/pkg/enum"
"github.com/samlior/libsam/pkg/swqos"
"github.com/shopspring/decimal"
)
func main() {
_privateKey := os.Getenv("PRIVATE_KEY")
if _privateKey == "" {
panic("PRIVATE_KEY is not set")
}
privateKey, err := solana.PrivateKeyFromBase58(_privateKey)
if err != nil {
panic(err)
}
rpcUrl := os.Getenv("RPC_URL")
if rpcUrl == "" {
panic("RPC_URL is not set")
}
exitSignal := make(chan os.Signal, 1)
ctx, cancel := context.WithCancel(context.Background())
signal.Notify(exitSignal, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-exitSignal
cancel()
}()
blockrazorClient, err := swqos.NewSWQoSClient(
context.Background(),
enum.SWQoSAgentBlockRazor,
&swqos.SWQoSClientConfig{
SendTxUrl: "frankfurt.solana-grpc.blockrazor.xyz:80",
})
if err != nil {
panic(err)
}
amount, _ := decimal.NewFromString("0.001")
amountUint64 := amount.Mul(decimal.New(1, consts.SolDecimals)).BigInt().Uint64()
instructions := make([]solana.Instruction, 0)
instructions = append(instructions, system.NewTransferInstruction(
amountUint64,
privateKey.PublicKey(),
solana.MustPublicKeyFromBase58("EDi4rSy2LZgKJX74mbLTFk4mxoTgT6F7HxxzG2HBAFyK"), // blockrazor fee account
).Build())
client := rpc.New(rpcUrl)
result, err := client.GetLatestBlockhash(ctx, rpc.CommitmentFinalized)
if err != nil {
panic(err)
}
tx, err := solana.NewTransaction(
instructions,
result.Value.Blockhash,
solana.TransactionPayer(privateKey.PublicKey()),
)
if err != nil {
panic(err)
}
// sign tx
_, err = tx.Sign(func(key solana.PublicKey) *solana.PrivateKey {
if privateKey.PublicKey().Equals(key) {
return &privateKey
}
return nil
})
err = blockrazorClient.SendTransaction(ctx, tx)
if err != nil {
panic(err)
}
fmt.Println("Transaction sent successfully, tx hash:", tx.Signatures[0].String())
}