require "rqrcode" class WalletController < ApplicationController before_action :require_user_signed_in before_action :authenticate_with_lndhub before_action :set_current_section before_action :fetch_balance def index @wallet_url = "lndhub://#{current_user.ln_account}:#{current_user.ln_password}@#{ENV['LNDHUB_PUBLIC_URL']}" qrcode = RQRCode::QRCode.new(@wallet_url) @svg = qrcode.as_svg( color: "000", shape_rendering: "crispEdges", module_size: 6, standalone: true, use_path: true, svg_attributes: { class: 'inline-block' } ) end def transactions @transactions = fetch_transactions end private def authenticate_with_lndhub(options={}) if session[:ln_auth_token].present? && !options[:force_reauth] @ln_auth_token = session[:ln_auth_token] else lndhub = Lndhub.new auth_token = lndhub.authenticate(current_user) session[:ln_auth_token] = auth_token @ln_auth_token = auth_token end rescue # TODO add exception tracking end def set_current_section @current_section = :wallet end def fetch_balance lndhub = Lndhub.new data = lndhub.balance @ln_auth_token @balance = data["BTC"]["AvailableBalance"] rescue nil rescue authenticate_with_lndhub(force_reauth: true) return nil if @fetch_balance_retried @fetch_balance_retried = true fetch_balance end def fetch_transactions lndhub = Lndhub.new txs = lndhub.gettxs @ln_auth_token invoices = lndhub.getuserinvoices(@ln_auth_token).select{|i| i["ispaid"]} process_transactions(txs + invoices) rescue authenticate_with_lndhub(force_reauth: true) return [] if @fetch_transactions_retried @fetch_transactions_retried = true fetch_transactions end def process_transactions(txs) txs.collect do |tx| if tx["type"] == "bitcoind_tx" tx["amount_sats"] = (tx["amount"] * 100000000).to_i tx["datetime"] = Time.at(tx["time"].to_i) tx["title"] = "Received" tx["description"] = "On-chain topup" tx["received"] = true else tx["amount_sats"] = tx["value"] || tx["amt"] tx["datetime"] = Time.at(tx["timestamp"].to_i) tx["title"] = tx["type"] == "paid_invoice" ? "Sent" : "Received" tx["description"] = tx["memo"] || tx["description"] tx["received"] = tx["type"] == "user_invoice" end end txs.sort{ |a,b| b["datetime"] <=> a["datetime"] } end end