Skip to content
This repository has been archived by the owner on Nov 21, 2024. It is now read-only.

Commit

Permalink
feat(nut05): impl get_mint_quote and integration test
Browse files Browse the repository at this point in the history
  • Loading branch information
tdelabro committed Oct 30, 2024
1 parent c53edc8 commit ccfab98
Show file tree
Hide file tree
Showing 8 changed files with 62 additions and 26 deletions.
20 changes: 16 additions & 4 deletions integration-tests/nut05.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,31 @@ pub async fn melt_quote_ok() {
assert_matches!(
melt_quote,
MeltQuote {
id,
ref id,
unit: _,
amount,
request: _,
fee_reserve,
state,
expiry,
payment_preimage
} if Uuid::try_parse(&id).is_ok()
ref payment_preimage
} if Uuid::try_parse(id).is_ok()
&& amount == Amount::from(10)
&& fee_reserve == Amount::from(1)
&& state == MeltQuoteState::Unpaid
&& expiry >= now
&& payment_preimage.is_none()
)
);

let melt_quote_status = wallet.melt_quote_status(&melt_quote.id).await.unwrap();

assert_eq!(melt_quote.id, melt_quote_status.quote);
assert_eq!(melt_quote.amount, melt_quote_status.amount);
assert_eq!(melt_quote.fee_reserve, melt_quote_status.fee_reserve);
assert_eq!(melt_quote.state, melt_quote_status.state);
assert_eq!(melt_quote.expiry, melt_quote_status.expiry);
assert_eq!(
melt_quote.payment_preimage,
melt_quote_status.payment_preimage
);
}
12 changes: 9 additions & 3 deletions lib/cashubrew/NUTs/NUT-05/impl.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ defmodule Cashubrew.Nuts.Nut05.Impl do
Implementation and structs of the NUT-05
"""
alias Cashubrew.Schema
require Logger

defp percent_fee_reserve, do: 1
defp min_fee_reserve, do: 1
Expand All @@ -26,8 +27,7 @@ defmodule Cashubrew.Nuts.Nut05.Impl do
fee = max(relative_fee_reserve, min_fee_reserve())

expiry = System.os_time(:second) + melt_quote_validity_duration_in_sec()
quote_id = Ecto.UUID.bingenerate()
quote_id_as_string = Ecto.UUID.cast!(quote_id)
quote_id = Ecto.UUID.generate()

Schema.MeltQuote.create!(repo, %{
id: quote_id,
Expand All @@ -40,11 +40,17 @@ defmodule Cashubrew.Nuts.Nut05.Impl do
})

%{
quote: quote_id_as_string,
quote: quote_id,
amount: amount,
fee_reserve: fee,
state: "UNPAID",
expiry: expiry
}
end

def get_melt_quote_by_id(quote_id) do
repo = Application.get_env(:cashubrew, :repo)

repo.get!(Schema.MeltQuote, quote_id)
end
end
2 changes: 1 addition & 1 deletion lib/cashubrew/NUTs/NUT-05/routes.ex
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ defmodule Cashubrew.Nuts.Nut05.Routes do
@doc """
The route to check a melt quote state
"""
def v1_melt_quote_for_quote_id do
def v1_melt_quote_by_id do
v1_melt_quote() <> "/:quote_id"
end

Expand Down
11 changes: 11 additions & 0 deletions lib/cashubrew/NUTs/NUT-05/serde.ex
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,15 @@ defmodule Cashubrew.Nuts.Nut05.Serde.PostMeltQuoteBolt11Response do
@enforce_keys [:quote, :amount, :fee_reserve, :state, :expiry]
@derive [Jason.Encoder]
defstruct [:quote, :amount, :fee_reserve, :state, :expiry, :payment_preimage]

def from_melt_quote(melt_quote, state, payment_preimage) do
%__MODULE__{
quote: Ecto.UUID.cast!(melt_quote.id),
amount: melt_quote.amount,
fee_reserve: melt_quote.fee_reserve,
expiry: melt_quote.expiry,
state: state,
payment_preimage: payment_preimage
}
end
end
12 changes: 10 additions & 2 deletions lib/cashubrew/schema/melt_quote.ex
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,16 @@ defmodule Cashubrew.Schema.MeltQuote do

def changeset(quote, attrs) do
quote
|> cast(attrs, [:request, :unit, :amount, :fee_reserve, :expiry, :request_lookup_id])
|> validate_required([:request, :unit, :amount, :fee_reserve, :expiry, :request_lookup_id])
|> cast(attrs, [:id, :request, :unit, :amount, :fee_reserve, :expiry, :request_lookup_id])
|> validate_required([
:id,
:request,
:unit,
:amount,
:fee_reserve,
:expiry,
:request_lookup_id
])
end

def create!(repo, values) do
Expand Down
27 changes: 12 additions & 15 deletions lib/cashubrew/web/controllers/mint_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ defmodule Cashubrew.Web.MintController do
use Cashubrew.Web, :controller
require :logger
require Logger
alias Cashubrew.Lightning
alias Cashubrew.Mint
alias Cashubrew.Nuts.Nut00
alias Cashubrew.Nuts.Nut01
Expand Down Expand Up @@ -96,28 +95,26 @@ defmodule Cashubrew.Web.MintController do
e in RuntimeError -> conn |> put_status(:bad_request) |> json(Nut00.Error.new_error(0, e))
end

def create_melt_quote(conn, params) do
method = params["method"]

def create_melt_quote(conn, %{"method" => method, "request" => request, "unit" => unit}) do
if method != "bolt11" do
raise "UnsuportedMethod"
end

request = params["request"]

if !request do
raise "NoRequest"
end
res = Nut05.Impl.create_melt_quote!(request, unit)

unit = params["unit"]
json(conn, struct(Nut05.Serde.PostMeltQuoteBolt11Response, res))
rescue
e in RuntimeError -> conn |> put_status(:bad_request) |> json(Nut00.Error.new_error(0, e))
end

if !unit do
raise "NoUnit"
def get_melt_quote(conn, %{"method" => method, "quote_id" => quote_id}) do
if method != "bolt11" do
raise "UnsuportedMethod"
end

res = Nut05.Impl.create_melt_quote!(request, unit)

json(conn, struct(Nut05.Serde.PostMeltQuoteBolt11Response, res))
melt_quote = Nut05.Impl.get_melt_quote_by_id(quote_id)
# TODO: get actual state from ln and payment_preimage
json(conn, Nut05.Serde.PostMeltQuoteBolt11Response.from_melt_quote(melt_quote, "UNPAID", nil))
rescue
e in RuntimeError -> conn |> put_status(:bad_request) |> json(Nut00.Error.new_error(0, e))
end
Expand Down
1 change: 1 addition & 0 deletions lib/cashubrew/web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ defmodule Cashubrew.Web.Router do
get("/v1/info", MintController, :info)
# NUT-05
post(Nut05.Routes.v1_melt_quote(), MintController, :create_melt_quote)
get(Nut05.Routes.v1_melt_quote_by_id(), MintController, :get_melt_quote)
end

if Mix.env() == :dev do
Expand Down
3 changes: 2 additions & 1 deletion priv/repo/migrations/20240918113124_create_melt_quote.exs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ defmodule Cashubrew.Repo.Migrations.CreateMeltQuote do
use Ecto.Migration

def change do
create table(:melt_quote) do
create table(:melt_quote, primary_key: false) do
add :id, :binary_id, primary_key: true
add :request, :string, null: false
add :unit, :string, null: false
add :amount, :integer, null: false
Expand Down

0 comments on commit ccfab98

Please sign in to comment.