aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docker-compose.yml16
-rw-r--r--lib/store.js1
-rw-r--r--lib/sync.js50
-rw-r--r--routes/bitcoin/receive.js3
-rw-r--r--routes/lightning/index.js4
-rw-r--r--routes/lightning/parse.js20
-rw-r--r--routes/lightning/receive.js2
-rw-r--r--routes/liquid/receive.js1
-rw-r--r--routes/payments.js1
9 files changed, 69 insertions, 29 deletions
diff --git a/docker-compose.yml b/docker-compose.yml
index d492d56d..0c2f4f2b 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -23,9 +23,6 @@ services:
container_name: app
image: gcr.io/coinos-326717/github.com/coinos/coinos-server:prod
command: "pnpm dev"
- ports:
- - '3118:3118'
- - '3119:3119'
environment:
NODE_OPTIONS: "--es-module-specifier-resolution=node --experimental-modules --loader ./loader.js --openssl-legacy-provider"
NODE_ENV: development
@@ -40,9 +37,6 @@ services:
bitcoin:
image: ghcr.io/vulpemventures/bitcoin
container_name: bitcoin
- ports:
- - ${BITCOIN_PEER_PORT}:18442
- - ${BITCOIN_NODE_PORT}:18443
volumes:
- ./config/bitcoin:/home/bitcoin/.bitcoin
restart: unless-stopped
@@ -52,11 +46,6 @@ services:
liquid:
image: ghcr.io/vulpemventures/elements
container_name: liquid
- ports:
- - ${LIQUID_NODE_PORT}:7040
- - ${LIQUID_PEER_PORT}:18444
- - ${LIQUID_BLOCK_PORT}:18606
- - ${LIQUID_TX_PORT}:18607
volumes:
- ./config/liquid:/home/elements/.elements
restart: unless-stopped
@@ -123,8 +112,6 @@ services:
volumes:
- ./config/bitcoin/:/config
restart: unless-stopped
- ports:
- - 3095:3095
networks:
default:
ipv4_address: 172.18.0.28
@@ -154,9 +141,6 @@ services:
- 0.0.0.0:60401
- --cors
- "*"
- ports:
- - ${LIQUID_ELECTRS_RPC_PORT}:60401
- - ${LIQUID_ELECTRS_PORT}:3002
volumes:
- ./config/liquid/:/config
restart: unless-stopped
diff --git a/lib/store.js b/lib/store.js
index 1d7e4eef..6f2e47ce 100644
--- a/lib/store.js
+++ b/lib/store.js
@@ -7,6 +7,7 @@ export default {
exceptions: [],
issuances: {},
logins: {},
+ nodes: [],
seen: [],
sessions: {},
sockets: {},
diff --git a/lib/sync.js b/lib/sync.js
index 625d128d..d4900c58 100644
--- a/lib/sync.js
+++ b/lib/sync.js
@@ -9,6 +9,7 @@ import read from "./read";
import { Op } from "@sequelize/core";
import store from "./store";
import { l, err, warn } from "./logging";
+import ln from "./ln";
import lnd from "./lnd";
import { getInvoices } from "lightning";
import bc from "./bitcoin";
@@ -75,11 +76,11 @@ const sync = async () => {
]
});
- let missed, invoices;
+ let missed, invoices, recent;
if (config.lnd) {
({ invoices } = await getInvoices({ lnd, limit: 1000 }));
- let recent = invoices
+ recent = invoices
.filter(
i =>
i.is_confirmed &&
@@ -91,13 +92,34 @@ const sync = async () => {
pr: i.request,
createdAt: new Date(i.created_at)
}));
+ } else {
+ ({ invoices } = await ln.listinvoices());
+ recent = invoices
+ .filter(
+ i => i.status === "paid" && Date.now() - i.paid_at < 60 * 60 * 1000
+ )
+ .map(i => ({
+ amount: parseInt(Math.round(i.msatoshi_received / 1000)),
+ preimage: i.payment_preimage,
+ pr: i.bolt11,
+ createdAt: new Date(i.paid_at * 1000)
+ }));
+ }
+
+ await db.transaction(async transaction => {
const twoDaysAgo = new Date(new Date().setDate(new Date().getDate() - 2));
let settled = (
- await db.Payment.findAll({
- where: { network: "lightning", createdAt: { [Op.gt]: twoDaysAgo } },
- attributes: ["preimage"]
- })
+ await db.Payment.findAll(
+ {
+ where: {
+ network: "lightning",
+ createdAt: { [Op.gt]: twoDaysAgo }
+ },
+ attributes: ["preimage"]
+ },
+ transaction
+ )
).map(p => p.preimage);
missed = recent.filter(i => !settled.includes(i.preimage));
@@ -111,7 +133,8 @@ const sync = async () => {
include: {
model: db.User,
as: "user"
- }
+ },
+ transaction
});
if (invoice && invoice.user_id) {
@@ -120,7 +143,8 @@ const sync = async () => {
user_id: invoice.user_id,
asset: config.liquid.btcasset,
pubkey: null
- }
+ },
+ transaction
});
if (account) {
@@ -141,7 +165,8 @@ const sync = async () => {
updatedAt: createdAt
});
- await account.increment({ balance: amount });
+ await invoice.increment({ received: amount }, { transaction });
+ await account.increment({ balance: amount }, { transaction });
l("lightning missing from account", account.id, amount);
}
@@ -155,7 +180,7 @@ const sync = async () => {
);
}
}
- }
+ });
const unconfirmed = await db.Payment.findAll({
where: {
@@ -167,6 +192,10 @@ const sync = async () => {
as: "account"
},
{
+ model: db.Invoice,
+ as: "invoice"
+ },
+ {
model: db.User,
as: "user"
}
@@ -200,6 +229,7 @@ const sync = async () => {
l("confirming payment", p.id, p.user_id, p.hash, p.address);
await p.save({ transaction });
+ await p.invoice.increment({ received: p.amount }, { transaction });
await p.account.increment({ balance: p.amount }, { transaction });
await p.account.decrement({ pending: p.amount }, { transaction });
});
diff --git a/routes/bitcoin/receive.js b/routes/bitcoin/receive.js
index 7451e868..3bc1750d 100644
--- a/routes/bitcoin/receive.js
+++ b/routes/bitcoin/receive.js
@@ -213,12 +213,13 @@ setInterval(async () => {
if (p && p.user) user = p.user;
if (p && p.account) {
- ({ account } = p);
+ ({ account, invoice } = p);
total = p.amount + p.tip;
p.confirmed = 1;
await account.save({ transaction });
+ await invoice.increment({ received: total }, { transaction });
await account.increment({ balance: total }, { transaction });
await account.decrement(
{ pending: Math.min(account.pending, total) },
diff --git a/routes/lightning/index.js b/routes/lightning/index.js
index 52a94398..b4611ef5 100644
--- a/routes/lightning/index.js
+++ b/routes/lightning/index.js
@@ -2,10 +2,12 @@ import channel from "./channel";
import invoice from "./invoice";
import query from "./query";
import send from "./send";
+import parse from "./parse";
export default {
channel,
invoice,
query,
- send
+ send,
+ parse
};
diff --git a/routes/lightning/parse.js b/routes/lightning/parse.js
new file mode 100644
index 00000000..1d960689
--- /dev/null
+++ b/routes/lightning/parse.js
@@ -0,0 +1,20 @@
+import ln from "$lib/ln";
+import store from "$lib/store";
+
+export default async (req, res) => {
+ let { payreq } = req.body;
+ let hour = 1000 * 60 * 60;
+ let { last } = store.nodes;
+ let { nodes } = store;
+
+ if (!last || last > Date.now() - hour) ({ nodes } = await ln.listnodes());
+ store.nodes = nodes;
+
+
+ let twoWeeksAgo = new Date(new Date().setDate(new Date().getDate() - 14));
+ let { msatoshi, payee } = await ln.decodepay(payreq);
+ let { alias } = nodes.find((n) => n.nodeid === payee);
+ let route = await ln.getroute(payee, msatoshi, 5);
+
+ res.send({ alias, route });
+};
diff --git a/routes/lightning/receive.js b/routes/lightning/receive.js
index 084161b5..898152fe 100644
--- a/routes/lightning/receive.js
+++ b/routes/lightning/receive.js
@@ -70,11 +70,11 @@ const handlePayment = async msg => {
);
total = amount + tip;
- invoice.received += total;
invoice.status = "paid";
await invoice.save({ transaction });
+ await invoice.increment({ received: total }, { transaction });
await account.increment({ balance: total }, { transaction });
// get the # of fee credits you would need to pay off this amount of bitcoin
await account.increment(
diff --git a/routes/liquid/receive.js b/routes/liquid/receive.js
index 480677de..4ad4c7dc 100644
--- a/routes/liquid/receive.js
+++ b/routes/liquid/receive.js
@@ -344,6 +344,7 @@ setInterval(async () => {
p.confirmed = 1;
await p.account.save({ transaction });
+ await p.invoice.increment({ received: total }, { transaction });
await p.account.increment({ balance: total }, { transaction });
await p.account.decrement(
{ pending: Math.min(p.account.pending, total) },
diff --git a/routes/payments.js b/routes/payments.js
index 8b91d9fb..6c489372 100644
--- a/routes/payments.js
+++ b/routes/payments.js
@@ -57,6 +57,7 @@ app.get("/except", adminAuth, (req, res) => {
res.send("updated exceptions");
});
+app.post("/lightning/parse", lnRoutes.parse);
app.post("/lightning/channel", lnRoutes.channel);
app.post("/lightning/query", auth, lnRoutes.query);
app.post("/lightning/send", auth, lnRoutes.send);