aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-04-25 09:21:14 -0700
committerAdam Soltys <[email protected]>2026-04-25 09:21:14 -0700
commit669b13189180ea40f73e7202052f04039cfc9dac (patch)
tree7b06d9bedb0d3ebfd1ae4745379b6d739dff7918
parent15b94857f6f917f032968c0d052b1d387cb99cca (diff)
downloadcoinos-server-669b13189180ea40f73e7202052f04039cfc9dac.tar.gz
coinos-server-669b13189180ea40f73e7202052f04039cfc9dac.zip
check listpays before reversing
-rw-r--r--index.ts4
-rw-r--r--lib/payments.ts15
2 files changed, 14 insertions, 5 deletions
diff --git a/index.ts b/index.ts
index 5a3f172b..78c43598 100644
--- a/index.ts
+++ b/index.ts
@@ -34,7 +34,7 @@ try {
setTimeout(listenForLightning, 2000);
setInterval(ensureListenerAlive, 120000);
-setInterval(sendHeartbeat, 2000);
+setInterval(sendHeartbeat, 5000);
app.get("/balances", info.balances);
app.get("/health", info.health);
@@ -46,7 +46,7 @@ app.get("/rates", rates.index);
app.get("/locations", locations.list);
-app.get("/invoice/:id", invoices.get);
+app.get("/invoice/:id", { config: { rateLimit: { max: 30, timeWindow: 10000, keyGenerator: (req) => { const ip = (req.headers["cf-connecting-ip"] as string) || req.ip; const token = (req.headers.authorization || "").slice(0, 50); return token ? `invoice:${token}` : `invoice:${ip}`; } } } }, invoices.get);
app.get("/invoices", auth, invoices.list);
app.post("/invoice", optional, invoices.create);
app.post("/invoice/:id", optional, invoices.update);
diff --git a/lib/payments.ts b/lib/payments.ts
index 71d6c990..5d823b4d 100644
--- a/lib/payments.ts
+++ b/lib/payments.ts
@@ -597,7 +597,16 @@ export const sendLightning = async ({
}
} catch (e) {
err("failed to pay", pr.substr(-8));
- try { await reverse(p); } catch (_) {}
+ try {
+ const { pays } = await ln.listpays(pr);
+ const completed = pays.find((p) => p.status === "complete");
+ if (completed) {
+ warn("payment completed despite error, finalizing", p.id);
+ try { await finalize(completed, p); } catch (_) {}
+ } else {
+ await reverse(p);
+ }
+ } catch (_) {}
throw e;
}
@@ -780,7 +789,7 @@ export const catchUp = async () => {
err("problem syncing", e.message);
}
- setTimeout(catchUp, 10000);
+ setTimeout(catchUp, 30000);
};
export const check = async () => {
@@ -814,7 +823,7 @@ export const check = async () => {
err("payment check failed", e.message);
}
- setTimeout(check, 2000);
+ setTimeout(check, 5000);
};
const finalize = async (r, p) => {