Skip to content

Transfer SOL

pzupan edited this page Jul 5, 2026 · 1 revision

Transfer SOL from One Wallet to Another

require 'base64'
require 'solana/ruby/kit'

Kit = Solana::Ruby::Kit

# ── 1. Load your sender keypair ───────────────────────────────────────────────────
sender = Kit::Signers.create_key_pair_signer_from_bytes(File.binread('wallet.bin'))

recipient = Kit::Addresses.address('RECIPIENT_ADDRESS_HERE')

# ── 2. Build the transfer instruction (0.5 SOL) ───────────────────────────────────
ix = Kit::Programs::SystemProgram.transfer_instruction(
  sender:    sender.address,
  recipient: recipient,
  lamports:  500_000_000
)

# ── 2. Fetch blockhash, build message, compile, sign, send ───────────────────────────────────
rpc = Kit::Rpc::Client.new(Kit::RpcTypes.devnet)
bh  = rpc.get_latest_blockhash

message = Kit::Functional.pipe(
  Kit::TransactionMessages.create_transaction_message(version: :legacy),
  ->(tx) { Kit::TransactionMessages.set_fee_payer(sender.address, tx) },
  ->(tx) { Kit::TransactionMessages.set_blockhash_lifetime(
    Kit::TransactionMessages::BlockhashLifetimeConstraint.new(
      blockhash: bh.value.blockhash, last_valid_block_height: bh.value.last_valid_block_height
    ), tx) },
  ->(tx) { Kit::TransactionMessages.append_instructions(tx, [ix]) }
)

transaction = Kit::Transactions.compile_transaction_message(message)
signed      = Kit::Transactions.sign_transaction([sender.key_pair.signing_key], transaction)
wire_base64 = Base64.strict_encode64(Kit::Transactions.wire_encode_transaction(signed))

sig = rpc.send_transaction(wire_base64)
puts "Signature: #{sig}"

← Back to guides

Clone this wiki locally