package main
import (
"context"
"fmt"
"log"
"os"
"time"
"github.com/btcsuite/btcutil/base58"
"github.com/coinbase/coinbase-sdk-go/pkg/coinbase"
bin "github.com/gagliardetto/binary"
"github.com/gagliardetto/solana-go"
"github.com/gagliardetto/solana-go/rpc"
)
const (
walletPrivateKey = "YOUR_WALLET_PRIVATE_KEY"
devnetRPC = "https://api.devnet.solana.com"
)
func main() {
ctx := context.Background()
// This code assumes a solana stakingOperation has already been created.
privateKey, err := decodePrivateKey(walletPrivateKey)
err = stakingOperation.Sign(privateKey)
if err != nil {
log.Fatalf("error signing transaction: %v", err)
}
rpcClient := rpc.New(rpcURL)
maxRetries := uint(5)
opts := rpc.TransactionOpts{
SkipPreflight: false,
MaxRetries: &maxRetries,
// NOTE: In production, consider using rpc.CommitmentFinalized instead to ensure the block is included.
PreflightCommitment: rpc.CommitmentProcessed,
}
for _, transaction := range stakingOperation.Transactions() {
unsignedTx := transaction.UnsignedPayload()
signedTx := transaction.SignedPayload()
log.Printf("Unsigned tx payload: %s\n\n", unsignedTx)
log.Printf("Signed tx payload: %s\n\n", signedTx)
rawTx := transaction.Raw()
solanaTx, ok := rawTx.(*solana.Transaction)
if !ok {
log.Fatal("failed to cast raw transaction to solana.Transaction")
}
sig, err := rpcClient.SendTransactionWithOpts(ctx, solanaTx, opts)
if err != nil {
log.Fatalf("failed to send transaction: %v", err)
}
log.Printf("Broadcasted tx: %s\n\n", getTxLink(stakingOperation.NetworkID(), sig.String()))
}
}
func decodePrivateKey(privateKeyString string) (*ed25519.PrivateKey, error) {
// Decode the base58 encoded private key
privateKeyBytes := base58.Decode(privateKeyString)
if len(privateKeyBytes) != ed25519.PrivateKeySize {
log.Fatalf("invalid private key length: expected %d bytes, got %d bytes", ed25519.PrivateKeySize, len(privateKeyBytes))
}
// Convert the byte slice to an ed25519 private key
privateKey := ed25519.PrivateKey(privateKeyBytes)
return &privateKey, nil
}
func getTxLink(networkID, signature string) string {
if networkID == coinbase.SolanaMainnet {
return fmt.Sprintf("https://explorer.solana.com/tx/%s", signature)
} else if networkID == coinbase.SolanaDevnet {
return fmt.Sprintf("https://explorer.solana.com/tx/%s?cluster=devnet", signature)
}
return ""
}