Time-locked savings
on Solana

Lock your SOL in an on-chain vault for a set duration. When the timer expires, unlock and get it back. Built with Rails 8 and a custom Anchor program.

Devnet
Fqgr...HC12
0.3 SOL Locked

Unlocks in 3m 24s

0.1 SOL Locked

Unlocks in 1m 08s

0.2 SOL Ready

Ready to unlock

Unlock →

How it works

Three steps. No accounts, no passwords, no custody.

1

Connect wallet

Sign in with Phantom, Solflare, or any Solana wallet. No account needed.

2

Lock SOL

Choose an amount and duration. Your SOL is stored in an on-chain program account.

3

Unlock when ready

Watch the countdown. When time is up, unlock and your SOL returns to your wallet.

What makes it different

Not a smart contract wrapper. A full-stack Rails app that talks to Solana.

On-chain time locks

SOL is locked in a program account with an expiration timestamp enforced by the Anchor program. Not custodial.

Anchor IDL in Ruby

The solrengine-programs gem parses the Anchor IDL and generates Ruby models for on-chain accounts with Borsh encoding.

Live countdown

Each lock shows a real-time countdown with a progress bar. Know exactly when your SOL is ready to unlock.

Wallet auth (SIWS)

Sign In With Solana — Ed25519 signature verification in Ruby. No passwords, no emails. Just your wallet.

Non-custodial

Your SOL stays in a program-derived account on Solana. The app never holds your funds — only you can unlock.

Rails 8 default stack

Hotwire, Turbo, Stimulus, Tailwind 4, esbuild. No React. Server-side instruction building, client-side signing.

Anchor programs, meet Rails

Parse IDL, read on-chain accounts, build instructions — all in Ruby.

lock.rb
class PiggyBank::Lock < Solrengine::Programs::Account
  borsh_field :dst, "pubkey"
  borsh_field :exp, "u64"

  def expired?
    exp < Time.now.to_i
  end

  def self.for_wallet(addr)
    query(filters: [{ "memcmp" => { "offset" => 8, "bytes" => addr } }])
  end
end
locks_controller.rb
def build_lock
  ix = PiggyBank::LockInstruction.new(
    amt: amount_lamports,
    exp: expiration,
    payer: current_user.wallet_address,
    dst: current_user.wallet_address,
    lock: lock_address
  )

  render json: {
    instruction_data: ix.to_instruction[:data],
    program_id: PiggyBank::PROGRAM_ID,
    blockhash: blockhash_data[:blockhash]
  }
end
SolRengine

Built with SolRengine

Open-source Ruby gems for building Solana dApps with Rails 8. Wallet auth, RPC, tokens, transactions, and program interaction out of the box.

$ bundle add solrengine