Use lndhub.go v2 endpoint for invoice creation
This commit is contained in:
parent
5685e1b7bc
commit
596ed7fccc
@ -71,11 +71,7 @@ class LnurlpayController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def metadata(address)
|
def metadata(address)
|
||||||
"[[\"text/identifier\", \"#{address}\"], [\"text/plain\", \"Send sats, receive thanks.\"]]"
|
"[[\"text/identifier\",\"#{address}\"],[\"text/plain\",\"Sats for #{address}\"]]"
|
||||||
end
|
|
||||||
|
|
||||||
def zap_metadata(event)
|
|
||||||
"[[\"application/json\", #{event.to_json}]]"
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def valid_amount?(amount_in_sats)
|
def valid_amount?(amount_in_sats)
|
||||||
@ -92,14 +88,14 @@ class LnurlpayController < ApplicationController
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
memo = "To #{address}"
|
desc = "To #{address}"
|
||||||
memo = "#{memo}: \"#{comment}\"" if comment.present?
|
desc = "#{desc}: \"#{comment}\"" if comment.present?
|
||||||
|
|
||||||
payment_request = LndhubManager::CreateUserInvoice.call(
|
invoice = LndhubManager::CreateUserInvoice.call(
|
||||||
user: @user, payload: {
|
user: @user, payload: {
|
||||||
amount: amount, # sats
|
amount: amount, # sats
|
||||||
memo: memo,
|
description: desc,
|
||||||
description_hash: Digest::SHA2.hexdigest(metadata(address)),
|
description_hash: Digest::SHA256.hexdigest(metadata(address)),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -110,7 +106,7 @@ class LnurlpayController < ApplicationController
|
|||||||
message: "Sats received. Thank you!"
|
message: "Sats received. Thank you!"
|
||||||
},
|
},
|
||||||
routes: [],
|
routes: [],
|
||||||
pr: payment_request
|
pr: invoice["payment_request"]
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -135,15 +131,14 @@ class LnurlpayController < ApplicationController
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
payment_request = LndhubManager::CreateUserInvoice.call(
|
invoice = LndhubManager::CreateUserInvoice.call(
|
||||||
user: @user, payload: {
|
user: @user, payload: {
|
||||||
amount: amount, # sats
|
amount: amount, # sats
|
||||||
# TODO should be npub instead of address?
|
description: event.to_json,
|
||||||
memo: "Zapped #{@user.address} on Nostr", # TODO include event ID if given
|
description_hash: Digest::SHA256.hexdigest(event.to_json),
|
||||||
description_hash: Digest::SHA2.hexdigest(zap_metadata(event)),
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
render json: { status: "OK", pr: payment_request }
|
render json: { status: "OK", pr: invoice["payment_request"] }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
module LndhubManager
|
module LndhubManager
|
||||||
class CreateUserInvoice < Lndhub
|
class CreateUserInvoice < LndhubV2
|
||||||
def initialize(user:, payload:)
|
def initialize(user:, payload:)
|
||||||
@user = user
|
@user = user
|
||||||
@payload = payload
|
@payload = payload
|
||||||
@ -7,7 +7,7 @@ module LndhubManager
|
|||||||
|
|
||||||
def call
|
def call
|
||||||
authenticate @user
|
authenticate @user
|
||||||
addinvoice @payload
|
create_invoice @payload
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -48,14 +48,22 @@ RSpec.describe "/lnurlpay", type: :request do
|
|||||||
end
|
end
|
||||||
|
|
||||||
describe "GET /lnurlpay/:username/invoice" do
|
describe "GET /lnurlpay/:username/invoice" do
|
||||||
|
let(:invoice) {
|
||||||
|
{
|
||||||
|
"payment_hash" => "35778ccdb8319b5104e41d2043d18446bf91bcd51450b5f1cf1b6082a7cc6203",
|
||||||
|
"payment_request" => "lnbc210n1pnzzr6rpp5x4mcendcxxd4zp8yr5sy85vyg6ler0x4z3gttuw0rdsg9f7vvgpshp52y6nf64apaqta2kjuwp2apglewqa9fva2mada6x2mmdj20t57jdscqzzsxqyz5vqsp5a3h88efdc436wunupz293gdtvm5843yfcfc8hxm2rpdunaetl39q9qyyssq07ec02dqr4epa73ssy0lzwglw49aa9rfywlp0c7jpnf448uapsgqch79d4222xqlh8674lzddvcyptpnwqqq8vpppf8djrn8yjf53dqpzwx5kh",
|
||||||
|
"expires_at" => "2024-04-19T12:17:07.725314947Z"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
before do
|
before do
|
||||||
allow(LndhubManager::CreateUserInvoice).to receive(:call)
|
allow(LndhubManager::CreateUserInvoice).to receive(:call)
|
||||||
.and_return("lnbc50u1p3lwgknpp52g78gqya5euvzjc53fc6hkmlm2rfjhcd305tcmc0g9gaestav48sdq4gdhkven9v5sx6mmwv4ujzcqzpgxqyz5vqsp5skkz4jlqr6tkvv2g9739ygrjupc4rkqd94mc7dfpj3pgx3f6w7qs9qyyssq7mf3fzcuxlmkr9nqatcch3u8uf4gjyawe052tejz8e9fqxu4pncqk3qklt8g6ylpshg09xyjquyrgtc72vcw5cp0dzcf406apyua7dgpnfn7an")
|
.and_return(invoice)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "returns a formatted lnurlpay response" do
|
it "returns a formatted lnurlpay response" do
|
||||||
get lnurlpay_invoice_path(username: "satoshi", params: {
|
get lnurlpay_invoice_path(username: "satoshi", params: {
|
||||||
amount: 50000, comment: "Coffee time!"
|
amount: 21000, comment: "Coffee time!"
|
||||||
})
|
})
|
||||||
|
|
||||||
expect(response).to have_http_status(:ok)
|
expect(response).to have_http_status(:ok)
|
||||||
@ -64,7 +72,7 @@ RSpec.describe "/lnurlpay", type: :request do
|
|||||||
expect(res["status"]).to eq('OK')
|
expect(res["status"]).to eq('OK')
|
||||||
expect(res["successAction"]["tag"]).to eq('message')
|
expect(res["successAction"]["tag"]).to eq('message')
|
||||||
expect(res["successAction"]["message"]).to match('Thank you')
|
expect(res["successAction"]["message"]).to match('Thank you')
|
||||||
expect(res["pr"]).to eq("lnbc50u1p3lwgknpp52g78gqya5euvzjc53fc6hkmlm2rfjhcd305tcmc0g9gaestav48sdq4gdhkven9v5sx6mmwv4ujzcqzpgxqyz5vqsp5skkz4jlqr6tkvv2g9739ygrjupc4rkqd94mc7dfpj3pgx3f6w7qs9qyyssq7mf3fzcuxlmkr9nqatcch3u8uf4gjyawe052tejz8e9fqxu4pncqk3qklt8g6ylpshg09xyjquyrgtc72vcw5cp0dzcf406apyua7dgpnfn7an")
|
expect(res["pr"]).to eq("lnbc210n1pnzzr6rpp5x4mcendcxxd4zp8yr5sy85vyg6ler0x4z3gttuw0rdsg9f7vvgpshp52y6nf64apaqta2kjuwp2apglewqa9fva2mada6x2mmdj20t57jdscqzzsxqyz5vqsp5a3h88efdc436wunupz293gdtvm5843yfcfc8hxm2rpdunaetl39q9qyyssq07ec02dqr4epa73ssy0lzwglw49aa9rfywlp0c7jpnf448uapsgqch79d4222xqlh8674lzddvcyptpnwqqq8vpppf8djrn8yjf53dqpzwx5kh")
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "amount too low" do
|
describe "amount too low" do
|
||||||
@ -110,7 +118,7 @@ RSpec.describe "/lnurlpay", type: :request do
|
|||||||
|
|
||||||
describe "with valid request event" do
|
describe "with valid request event" do
|
||||||
let(:event) {
|
let(:event) {
|
||||||
{
|
Nostr::Event.new(
|
||||||
id: "3cf02d7f0ccd9711c25098fc50b3a7ab880326e4e51cc8c7a7b59f147cff4fff",
|
id: "3cf02d7f0ccd9711c25098fc50b3a7ab880326e4e51cc8c7a7b59f147cff4fff",
|
||||||
pubkey: "730b43e6f62c2ab22710b046e481802c8ac1108ed2cb9c21dff808d57ba24b6c",
|
pubkey: "730b43e6f62c2ab22710b046e481802c8ac1108ed2cb9c21dff808d57ba24b6c",
|
||||||
created_at: 1712487443,
|
created_at: 1712487443,
|
||||||
@ -120,27 +128,35 @@ RSpec.describe "/lnurlpay", type: :request do
|
|||||||
["p", "07e188a1ff87ce171d517b8ed2bb7a31b1d3453a0db3b15379ec07b724d232f3"]],
|
["p", "07e188a1ff87ce171d517b8ed2bb7a31b1d3453a0db3b15379ec07b724d232f3"]],
|
||||||
content: "",
|
content: "",
|
||||||
sig: "e9e9bb2bac4267a107ab5c3368f504b4f11b8e3b5ae875a1d63c74d6934138d2521dc35815b6f534fc5d803cbf633736d871886368bb8f92c4ad3837a68a06f2"
|
sig: "e9e9bb2bac4267a107ab5c3368f504b4f11b8e3b5ae875a1d63c74d6934138d2521dc35815b6f534fc5d803cbf633736d871886368bb8f92c4ad3837a68a06f2"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
let(:invoice) {
|
||||||
|
{
|
||||||
|
"payment_hash" => "d6fa1d4b66587ab247d7b1f7608f2aed780a0cca021d09a30279c3dd9ff80f85",
|
||||||
|
"payment_request" => "lnbc210n1pnzzyvjpp56map6jmxtpaty37hk8mkpre2a4uq5rx2qgwsngcz08pam8lcp7zshp5xs7v3qlx0j0gyu9grrzx9xgews3t9vq64v30579le9z9wqr6fc5scqzzsxqyz5vqsp5kmltj5eayh47c6trwj8wdrz5nxymqp0eqwtk7k5nk6ytyz522nvs9qyyssqvkluufkp34gtzxdg0uyqcsdum2n34xz94tqr4jfwwx53czteutvj7eptz4lm5vcu0m8jqzxck484ycxzcqgqlqmpj2r3jxjlj4x6nygp8fvnag",
|
||||||
|
"expires_at" => "2024-04-19T12:26:58.432434748Z"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
it "returns an invoice" do
|
it "returns an invoice" do
|
||||||
expect(LndhubManager::CreateUserInvoice).to receive(:call)
|
expect(LndhubManager::CreateUserInvoice).to receive(:call)
|
||||||
.with(user: user, payload: {
|
.with(user: user, payload: {
|
||||||
amount: 2100,
|
amount: 21,
|
||||||
memo: "Zapped satoshi@kosmos.org on Nostr",
|
description: event.to_json,
|
||||||
description_hash: "540279cd9da15279c8299d6d9ff1ab2a79eb259ee218adf3de393e1abe723077"
|
description_hash: "b1a9910724bc9c1b03b4eba2e2d78ac69a8ac7b244e6ff6d4e7391bf6893f26a"
|
||||||
})
|
})
|
||||||
.and_return("lnbc50u1p3lwgknpp52g78gqya5euvzjc53fc6hkmlm2rfjhcd305tcmc0g9gaestav48sdq4gdhkven9v5sx6mmwv4ujzcqzpgxqyz5vqsp5skkz4jlqr6tkvv2g9739ygrjupc4rkqd94mc7dfpj3pgx3f6w7qs9qyyssq7mf3fzcuxlmkr9nqatcch3u8uf4gjyawe052tejz8e9fqxu4pncqk3qklt8g6ylpshg09xyjquyrgtc72vcw5cp0dzcf406apyua7dgpnfn7an")
|
.and_return(invoice)
|
||||||
|
|
||||||
get lnurlpay_invoice_path(username: "satoshi", params: {
|
get lnurlpay_invoice_path(username: "satoshi", params: {
|
||||||
amount: 2100000, nostr: event.to_json
|
amount: 21000, nostr: event.to_json
|
||||||
})
|
})
|
||||||
|
|
||||||
expect(response).to have_http_status(:ok)
|
expect(response).to have_http_status(:ok)
|
||||||
|
|
||||||
res = JSON.parse(response.body)
|
res = JSON.parse(response.body)
|
||||||
expect(res["status"]).to eq('OK')
|
expect(res["status"]).to eq('OK')
|
||||||
expect(res["pr"]).to match(/^lnbc/)
|
expect(res["pr"]).to eq("lnbc210n1pnzzyvjpp56map6jmxtpaty37hk8mkpre2a4uq5rx2qgwsngcz08pam8lcp7zshp5xs7v3qlx0j0gyu9grrzx9xgews3t9vq64v30579le9z9wqr6fc5scqzzsxqyz5vqsp5kmltj5eayh47c6trwj8wdrz5nxymqp0eqwtk7k5nk6ytyz522nvs9qyyssqvkluufkp34gtzxdg0uyqcsdum2n34xz94tqr4jfwwx53czteutvj7eptz4lm5vcu0m8jqzxck484ycxzcqgqlqmpj2r3jxjlj4x6nygp8fvnag")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user