From 4e58ebca11ca68bfe08e3187e6cf13c01982bd4f Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Sat, 1 Oct 2022 16:40:24 -0700 Subject: increment invoice received --- docker-compose.yml | 16 --------------- lib/store.js | 1 + lib/sync.js | 50 ++++++++++++++++++++++++++++++++++++--------- routes/bitcoin/receive.js | 3 ++- routes/lightning/index.js | 4 +++- routes/lightning/parse.js | 20 ++++++++++++++++++ routes/lightning/receive.js | 2 +- routes/liquid/receive.js | 1 + routes/payments.js | 1 + 9 files changed, 69 insertions(+), 29 deletions(-) create mode 100644 routes/lightning/parse.js 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: { @@ -166,6 +191,10 @@ const sync = async () => { model: db.Account, 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); -- cgit v1.2.3