<feed xmlns='http://www.w3.org/2005/Atom'>
<title>coinos-server.git/lib/utils.ts, branch master</title>
<subtitle>coinos server — legacy coinos.io backend (Lightning, on-chain, Liquid)</subtitle>
<id>https://git.coinos.io/coinos-server.git/atom?h=master</id>
<link rel='self' href='https://git.coinos.io/coinos-server.git/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/'/>
<updated>2026-09-14T03:44:48Z</updated>
<entry>
<title>security: drop the admin endpoint surface and land pending hardening</title>
<updated>2026-09-14T03:44:48Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-14T03:44:48Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=d8a361bdcfaa8cc5b39d9675e74b0e1d2e42be2c'/>
<id>urn:sha1:d8a361bdcfaa8cc5b39d9675e74b0e1d2e42be2c</id>
<content type='text'>
Removes the admin-gated endpoints and the account flags they set, plus a
batch of hardening that had accumulated uncommitted in the tree. These were
deployed and verified together, so they land as one change.

admin surface:
  - drop POST /hidepay, POST /unlimit and GET /users, their handlers, and
    the now-unused admin preValidation export
  - `unlimited` was only ever written, never read; `hidepay` only appeared
    in output projections. Both flags go, along with their whitelist,
    public-fields and type entries.

request log:
  - redactBody now recurses. It only masked top-level keys, so a body that
    nests credentials one level down wrote them to the log in plaintext,
    and pin fields were not on the list at all.

payments:
  - sendOnchain/build gate `aid` through requireAccount, so a caller can
    only spend from an account it owns
  - sendOnchain signs only a tx we composed, matched against a short-lived
    per-account build receipt
  - raise xpay retry_for to 60s; route-finding preferred a drained zero-fee
    hop and burned the whole budget on it. check()'s reversal window keeps
    its 2x margin.

ecash / invoices / webhooks:
  - resolve a token's mint through the IP-pinning fetcher instead of plain
    fetch, closing an unauthenticated SSRF path into the internal network
  - reject non-positive amounts before the balance write
  - /sign requires the caller to own the address, rather than signing under
    any address the hot wallet controls
  - webhook delivery no longer disables TLS verification; the body carries
    the merchant's shared secret

registration:
  - refuse a username the v3 registrar holds unless the caller's own nostr
    key is the holder (lib/names.ts)

liquid:
  - honour the deposit kill switch at invoice generation and at credit

elements image:
  - pin 23.3.4 and verify the release tarball checksum

Co-Authored-By: Claude Opus 5 (1M context) &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_0112TGi9GGNWqji1XQ5jZRzc
</content>
</entry>
<entry>
<title>Let a migrated account hand its address to coinos v3</title>
<updated>2026-08-03T20:20:36Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-08-03T20:04:36Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=fb63b96ec90e32bc8adc5b77b2735097dde16bbd'/>
<id>urn:sha1:fb63b96ec90e32bc8adc5b77b2735097dde16bbd</id>
<content type='text'>
A `migrated` flag on the user, settable through /user and visible on the
public user endpoint. It changes exactly one thing: lnurlp for that
username defers to the names registrar, so payments to name@coinos.io
arrive in the person's v3 wallet. The account itself is untouched — same
username, same history, still usable here — which is why this is a flag
and not a rename or a shutdown.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01Wvj4aoeMZwA7VUGdJP9Swi
</content>
</entry>
<entry>
<title>read payments from archive</title>
<updated>2026-01-23T02:48:07Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-01-23T02:48:07Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=d147e04d1b52f1359507a6f9d88e0227cf6bb250'/>
<id>urn:sha1:d147e04d1b52f1359507a6f9d88e0227cf6bb250</id>
<content type='text'>
</content>
</entry>
<entry>
<title>payment types</title>
<updated>2025-02-26T19:59:58Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2025-02-26T19:59:58Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=1d541fd97210389f006e65d46ab783afbe82cea8'/>
<id>urn:sha1:1d541fd97210389f006e65d46ab783afbe82cea8</id>
<content type='text'>
</content>
</entry>
<entry>
<title>nostr work</title>
<updated>2025-01-29T06:15:52Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2025-01-29T06:15:52Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=972c2499fb508424a3a61125f3e45c2d06cfbb43'/>
<id>urn:sha1:972c2499fb508424a3a61125f3e45c2d06cfbb43</id>
<content type='text'>
</content>
</entry>
<entry>
<title>handle no zaps case</title>
<updated>2025-01-17T14:02:01Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2025-01-17T14:02:01Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=4da8b4e77e64fb1f410acb635c0f85d2a8b3603b'/>
<id>urn:sha1:4da8b4e77e64fb1f410acb635c0f85d2a8b3603b</id>
<content type='text'>
</content>
</entry>
<entry>
<title>test for user</title>
<updated>2025-01-15T01:06:05Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2025-01-15T01:06:05Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=f850f8f2a5b9a6ee9c038d5231bdb9c2db98fad0'/>
<id>urn:sha1:f850f8f2a5b9a6ee9c038d5231bdb9c2db98fad0</id>
<content type='text'>
</content>
</entry>
<entry>
<title>public fields</title>
<updated>2025-01-15T00:55:44Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2025-01-15T00:55:44Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=81a576c2007805849f963242bc93ef60bee8efa4'/>
<id>urn:sha1:81a576c2007805849f963242bc93ef60bee8efa4</id>
<content type='text'>
</content>
</entry>
<entry>
<title>use strfry scan</title>
<updated>2025-01-14T23:50:49Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2025-01-14T23:50:49Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=b21b536817449b88c028a6cbe8ca6f21f4abcb46'/>
<id>urn:sha1:b21b536817449b88c028a6cbe8ca6f21f4abcb46</id>
<content type='text'>
</content>
</entry>
<entry>
<title>remove salt and cipher</title>
<updated>2025-01-08T03:57:48Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2025-01-08T03:57:48Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-server.git/commit/?id=6cda2011da9e7fc53b728dacd023271604574f99'/>
<id>urn:sha1:6cda2011da9e7fc53b728dacd023271604574f99</id>
<content type='text'>
</content>
</entry>
</feed>
