A Solana wallet
built with Rails

Full-featured Solana dapp using the Rails 8 default stack. Wallet auth, token portfolio, real-time updates, and transactions.

Mainnet
Fqgr...HC12

Portfolio Value

$2,847.63

SOL

Solana

24.5 SOL

$2,284.65

USDC

USD Coin

412.50 USDC

$412.50

JUP

Jupiter

182.3 JUP

$150.48

BONK

Bonk

2.4M BONK

$48.20

Everything you need

Built with the Rails 8 default stack. No external dependencies beyond what ships with Rails.

Wallet Authentication

Sign in with any Solana wallet via SIWS. Ed25519 signature verification in Ruby. No passwords.

Token Portfolio

SOL and SPL token balances with icons, names, and USD prices from Jupiter. Metadata persisted in DB.

Real-time Updates

Solana WebSocket subscriptions push balance changes instantly via ActionCable and Turbo Streams.

Send SOL

Rails validates, @solana/kit builds the transaction, wallet signs it. Confirmation tracked via background job.

Solid Everything

Solid Cache for RPC responses, Solid Queue for background jobs, Solid Cable for WebSocket broadcasts. All SQLite.

Rails 8 Default Stack

Hotwire, Turbo, Stimulus, Tailwind, esbuild, Kamal. No React. No external infrastructure. Just Rails.

Looks like Rails, talks to Solana

Standard Rails patterns you already know. No new framework to learn.

siws_verifier.rb
class SiwsVerifier
  def verify!
    verify_message_format!
    verify_domain!
    verify_signature!
  end

  def verify_signature!
    pubkey = Base58.base58_to_binary(addr)
    key = Ed25519::VerifyKey.new(pubkey)
    key.verify(signature, message)
  end
end
sessions_controller.rb
def create
  verifier = SiwsVerifier.new(
    wallet_address: params[:wallet],
    message: params[:message],
    signature: params[:signature]
  )

  if verifier.verify
    session[:user_id] = user.id
  end
end
show.html.erb
<%= turbo_stream_from "wallet_#{@address}" %>

<%= render "portfolio_value" %>
<%= render "token_list" %>
<%= render "recent_activity" %>
transfer_controller.js
import { pipe,
  createTransactionMessage,
  compileTransaction
} from "@solana/kit"

const tx = pipe(
  createTransactionMessage({ version: 0 }),
  tx => setFeePayer(sender, tx),
  tx => appendInstruction(ix, tx),
)
SolRengine

Built with SolRengine

This app is powered by SolRengine — open-source Ruby gems for building Solana dApps with Rails 8. Wallet auth, RPC, tokens, transactions, and real-time updates out of the box.

$ bundle add solrengine