<feed xmlns='http://www.w3.org/2005/Atom'>
<title>coinos-server.git/routes, branch regtest-fulcrum</title>
<subtitle>coinos server — legacy coinos.io backend (Lightning, on-chain, Liquid)</subtitle>
<id>https://git.coinos.io/coinos-server.git/atom?h=regtest-fulcrum</id>
<link rel='self' href='https://git.coinos.io/coinos-server.git/atom?h=regtest-fulcrum'/>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/'/>
<updated>2026-06-16T06:35:50Z</updated>
<entry>
<title>lnurl: SSRF-guard user-supplied URL fetches + validate zap events</title>
<updated>2026-06-16T06:35:50Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-06-16T06:35:50Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=497277ef7b48c86aa2f44b613e0a35a0c3b0c238'/>
<id>urn:sha1:497277ef7b48c86aa2f44b613e0a35a0c3b0c238</id>
<content type='text'>
The /lnurl/proxy, /decode and /encode handlers fetched an arbitrary
user-supplied URL via got() and returned the body — an unauthenticated
SSRF reaching internal services. Route those fetches through a new
safeGot() that rejects hosts resolving to loopback/private/link-local/
CGNAT/metadata ranges, re-validates on each redirect hop, restricts the
scheme to http(s), and caps timeout + response size. Also validate the
NIP-57 zap request (kind 9734 + signature) before storing it, instead of
trusting the client-supplied event.

These endpoints can't be removed — they back lightning-address/LNURL
parsing and resolution in the wallet UI.

Co-Authored-By: Claude Opus 4.8 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>users: add authenticated self-delete endpoint</title>
<updated>2026-06-13T21:21:49Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-06-13T21:21:49Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=2548f7578ab879bc7eb292462b13f41e7f3112e5'/>
<id>urn:sha1:2548f7578ab879bc7eb292462b13f41e7f3112e5</id>
<content type='text'>
POST /delete (auth) wipes every key tied to the calling user, mirroring
scripts/delall-legacy.ts: user records, payments/invoices, sub-accounts,
NWC apps, nostr follow graph + nip5. Gated by typing the username and
refuses while balance+pending &gt; 10k sats so funds can't be destroyed by
accident.

Co-Authored-By: Claude Opus 4.8 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>nwc: keep notifications opt-in (revert default-on)</title>
<updated>2026-06-06T16:14:11Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-06-06T16:14:11Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=10284aa1b8868012829c0b643def73ee55e4822d'/>
<id>urn:sha1:10284aa1b8868012829c0b643def73ee55e4822d</id>
<content type='text'>
Reverting the notify default-on from 8cb18821 — most users don't consume
notifications and defaulting on would flood the relay with payment_sent/
payment_received for ~3k apps. Notifications stay opt-in: clients enable by
sending notify:"true" when creating the NWC connection. The pay_invoice
reply-reliability and rate-limit fixes from 8cb18821 are unaffected.

Co-Authored-By: Claude Opus 4.8 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>nwc: fix pay_invoice reply reliability, rate-limit drops, notifications</title>
<updated>2026-06-06T16:10:16Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-06-06T16:10:16Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=8cb1882111c079cfac9870054d9917fa5f94de76'/>
<id>urn:sha1:8cb1882111c079cfac9870054d9917fa5f94de76</id>
<content type='text'>
Three issues reported by an NWC client integrator (refs #80):

(a) pay_invoice sync reply: the handler polled listpays for ~20s then returned
a misleading "Payment timed out" error on slow routes even though the payment
settled — client never got the preimage. sendLightning already runs xpay to
completion and finalize() sets p.ref = preimage, so return that directly; keep
a longer listpays loop only as a fallback, and on still-in-flight return an
explicit "check with lookup_invoice" rather than implying failure.

(b) rate limiting: raised per-pubkey cap 5/min -&gt; 60/min (normal usage — a
balance check + payment + a few lookup_invoice reconciles — trivially exceeded
5), and over-limit requests now get a NIP-47 RATE_LIMITED error reply instead
of a silent drop that looked exactly like a lost reply. Also: every request
path now always sends a 23195 reply (success, error, or handler-returned-
nothing) so a client never hangs waiting.

(c) notifications: payment_received/payment_sent are advertised in the info
event but app.notify defaulted to false unless the client sent notify:"true"
(only ~1% of apps had it on), so they never fired. Default notify ON; only
disable when explicitly "false". (Existing apps still false — backfill TBD.)

Co-Authored-By: Claude Opus 4.8 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>mirror payment records to arc + atomic /confirm lock to prevent double-credits</title>
<updated>2026-05-18T06:22:51Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-05-18T06:22:51Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=0e368dab0943067c060ad45578a4c4cbdc3434a6'/>
<id>urn:sha1:0e368dab0943067c060ad45578a4c4cbdc3434a6</id>
<content type='text'>
Follows up the Apr 29 double-credit incident. Two parallel callers of
/confirm (walletnotify, catchUp, bulk sweeps) could each read
p.confirmed=false and each run the multi() that increments balance —
because main-db pointers were sometimes missing while arc still had them,
gf()'s arc fallback returned stale state. Three pieces here:

- routes/payments.ts: SET NX EX 60 lock around the /confirm credit block
  keyed by `confirmlock:${txid}:${vout}`. Concurrent callers short-circuit
  cleanly. The lock is released on success and on every early-return.

- lib/payments.ts credit() + routes/payments.ts /confirm: mirror the
  payment/invoice records and the `payment:&lt;txid&gt;:&lt;vout&gt;` / `payment:&lt;hash&gt;`
  pointer keys into arc as soon as they're written. gf() will then find
  the prior credit via arc fallback even if the main-db copy is wiped by
  a future data-loss event.

- routes/payments.ts hide `revertedDuplicate` payments from the user's
  payment list — matches the same filter added to lib/nwc.ts list_transactions
  so reverted records never surface in either rendering path.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>remove /gateway endpoint</title>
<updated>2026-05-18T06:21:39Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-05-18T06:21:39Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=3c4d0b6914bbc7ecf49312a264d55af3c2e2d7a6'/>
<id>urn:sha1:3c4d0b6914bbc7ecf49312a264d55af3c2e2d7a6</id>
<content type='text'>
Unauthenticated arbitrary db.set abuse vector. Exploited to inflate user
balances and override safety controls (bitcoin:limit, limit, hardfreeze,
freeze) in real time, leading to a hot-wallet drain. Route and handler
both fully removed.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>lnurl proxy</title>
<updated>2026-03-28T06:41:08Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-03-28T06:41:08Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=ef06f2eb48581c201e62fc2cde27b106e898e54d'/>
<id>urn:sha1:ef06f2eb48581c201e62fc2cde27b106e898e54d</id>
<content type='text'>
</content>
</entry>
<entry>
<title>don't remove missing payments</title>
<updated>2026-03-25T06:51:08Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-03-25T06:51:08Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=13372a9ee10a00ce3e17676198e97d2991b4855d'/>
<id>urn:sha1:13372a9ee10a00ce3e17676198e97d2991b4855d</id>
<content type='text'>
</content>
</entry>
<entry>
<title>listener logs</title>
<updated>2026-03-18T18:37:33Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-03-18T18:37:33Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=42a90f201d03aa96d004e6c3cf3f37f5afd8d1ee'/>
<id>urn:sha1:42a90f201d03aa96d004e6c3cf3f37f5afd8d1ee</id>
<content type='text'>
</content>
</entry>
<entry>
<title>remove logs</title>
<updated>2026-03-17T06:53:13Z</updated>
<author>
<name>Adam Soltys</name>
<email>asoltys@gmail.com</email>
</author>
<published>2026-03-17T06:53:13Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=92e7d1564deb25f9e58e3b268c077018c4b2c4c4'/>
<id>urn:sha1:92e7d1564deb25f9e58e3b268c077018c4b2c4c4</id>
<content type='text'>
</content>
</entry>
</feed>
