1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
import store from "$lib/store";
import { l } from "$lib/logging";
import { emit } from "$lib/sockets";
import { db, g, s } from "$lib/db";
import { getUser, bip21, fail, SATS } from "$lib/utils";
import { types } from "$lib/payments";
import { v4 } from "uuid";
import bc from "$lib/bitcoin";
import ln from "$lib/ln";
export let generate = async ({ invoice, user, sender, memo }) => {
let {
currency,
expiry,
fiat,
tip,
amount,
rate,
request_id,
prompt,
type,
webhook,
secret
} = invoice;
amount = parseInt(amount || 0);
tip = parseInt(tip) || null;
if (user) user = await getUser(user.username);
else if (sender) user = await getUser(sender.username);
else fail("user not provided");
if (!currency) currency = user.currency;
if (!rate) rate = store.rates[currency];
if (fiat) amount = Math.round((SATS * fiat) / rate);
if (amount < 0) fail("invalid amount");
let id = v4();
let hash, text;
if (type === types.lightning) {
let r = await ln.invoice({
amount_msat: amount ? `${amount + tip}sat` : "any",
label: new Date(),
description: memo || "",
expiry: expiry || 60 * 60 * 24 * 30,
deschashonly: true
});
hash = r.bolt11;
text = r.bolt11;
} else if (type === types.bitcoin) {
hash = await bc.getNewAddress();
text = bip21(hash, invoice);
} else if (type === types.internal) {
hash = id;
} else {
fail("unrecognized type");
}
invoice = {
amount,
created: Date.now(),
currency,
hash,
id,
rate,
pending: 0,
received: 0,
request_id,
prompt,
secret,
text,
tip,
type,
uid: user.id,
webhook
};
l("creating invoice", id, user.username, amount, tip, currency, invoice.hash);
await s(`invoice:${hash}`, id);
console.log("SETTING", invoice)
await s(`invoice:${id}`, invoice);
await db.lPush(`${user.id}:invoices`, id);
if (request_id) {
let request = await g(`request:${request_id}`);
if (request) {
let { invoice_id: prev } = request;
request.invoice_id = id;
await s(`request:${request_id}`, request);
if (!prev) emit(request.requester_id, "invoice", invoice);
}
}
return invoice;
};
|