aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--names/server.js31
1 files changed, 31 insertions, 0 deletions
diff --git a/names/server.js b/names/server.js
index 118f7fe..ec60e86 100644
--- a/names/server.js
+++ b/names/server.js
@@ -1895,6 +1895,37 @@ Bun.serve({
return json({ ok: true, ...done[hash] });
}
+ // Parked payments (state.parked) are settled by a person: delivered to
+ // the name their owner holds now, or written off (the sats stay on the
+ // node; state.writtenOff keeps the record). Keyed by payment hash.
+ if (url.pathname === '/admin/parked' && req.method === 'POST') {
+ if (!CFG.adminToken || req.headers.get('x-admin-token') !== CFG.adminToken) return json({ error: 'unauthorized' }, 401);
+ let b; try { b = await req.json(); } catch { return json({ error: 'bad body' }, 400); }
+ // by hash, or by its `ts` for the few old ones parked without a hash
+ const hash = String(b.hash || '');
+ const i = (state.parked || []).findIndex((p) => (hash ? p.hash === hash : b.ts && p.ts === Number(b.ts)));
+ if (i < 0) return json({ error: 'no parked payment with that hash' }, 404);
+ const p = state.parked[i];
+ if (b.action === 'writeoff') {
+ state.parked.splice(i, 1);
+ (state.writtenOff ||= []).push({ ...p, note: String(b.note || '').slice(0, 200), writtenOffAt: Date.now() });
+ persist();
+ log(`parked ${(p.hash || String(p.ts)).slice(0, 12)} (${p.sat} sat, ${p.name}) written off: ${b.note || ''}`);
+ return json({ ok: true, writtenOff: p.sat });
+ }
+ if (b.action === 'deliver') {
+ if (!p.hash) return json({ error: 'a payment parked without its hash can only be written off' }, 400);
+ if (!state.names[b.name]) return json({ error: 'need a current name' }, 400);
+ try { await forward(b.name, p.sat, hash, state.names[b.name].pubkey); }
+ catch (e) { return json({ error: e.message }, 502); }
+ state.parked = state.parked.filter((x) => x.hash !== p.hash);
+ persist();
+ log(`parked ${hash.slice(0, 12)} (${p.sat} sat) delivered to ${b.name} (was ${p.name})`);
+ return json({ ok: true, delivered: p.sat, to: b.name });
+ }
+ return json({ error: 'action is deliver or writeoff' }, 400);
+ }
+
if (url.pathname === '/admin/topup' && req.method === 'POST') {
if (!CFG.adminToken || req.headers.get('x-admin-token') !== CFG.adminToken) {
return json({ error: 'unauthorized' }, 401);