91 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
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
 |