akkounts/app/controllers/lnurlpay_controller.rb
Michael Bumann d37b68a6e5
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
Fix LNURL pay amount validation
We allow receiving of more than 100 sats and less than 1M sats
2022-02-03 17:32:18 +01:00

61 lines
1.4 KiB
Ruby

class LnurlpayController < ApplicationController
before_action :find_user_by_address
MIN_SATS = 100
MAX_SATS = 1_000_000
def index
render json: {
status: "OK",
callback: "https://accounts.kosmos.org/lnurlpay/#{@user.address}/invoice",
tag: "payRequest",
maxSendable: MAX_SATS * 1000, # msat
minSendable: MIN_SATS * 1000, # msat
metadata: metadata(@user.address),
commentAllowed: 0
}
end
def invoice
amount = params[:amount].to_i / 1000 # msats
address = params[:address]
if !valid_amount?(amount)
render json: { status: "ERROR", reason: "Invalid amount" }
return
end
payment_request = @user.ln_create_invoice({
amount: amount, # we create invoices in sats
description_hash: Digest::SHA2.hexdigest(metadata(address))
})
render json: {
status: "OK",
successAction: {
tag: "message",
message: "Sats received. Thank you!"
},
routes: [],
pr: payment_request
}
end
private
def find_user_by_address
address = params[:address].split("@")
@user = User.where(cn: address.first, ou: address.last).first
http_status :not_found if @user.nil?
end
def metadata(address)
"[[\"text/identifier\", \"#{address}\"], [\"text/plain\", \"Send sats, receive thanks.\"]]"
end
def valid_amount?(amount_in_sats)
amount_sats <= MAX_SATS && amount_in_sats >= MIN_SATS
end
end