<feed xmlns='http://www.w3.org/2005/Atom'>
<title>coinosv3.git/tools/ark/gift-shot.js, branch master</title>
<subtitle>coinos v3 — bitcoin, Ark, Lightning and nostr wallet (web + Android)</subtitle>
<id>https://git.coinos.io/coinosv3.git/atom?h=master</id>
<link rel='self' href='https://git.coinos.io/coinosv3.git/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/'/>
<updated>2026-10-07T19:02:51Z</updated>
<entry>
<title>Browser tests: public relays answered in the page, never reached</title>
<updated>2026-10-07T19:02:51Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-10-07T19:02:51Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=86d9818abfc160dac031bb292abe28d6f28fc624'/>
<id>urn:sha1:86d9818abfc160dac031bb292abe28d6f28fc624</id>
<content type='text'>
A suite run let ~90 throwaway test wallets subscribe and publish on public
relays from one home address, and nos.lol and relay.damus.io banned it.
tools/puppeteer.js wraps puppeteer-core: every socket to a non-local host
gets an in-page stand-in relay (EVENT -&gt; OK, REQ -&gt; EOSE). Tests that read
real content launch with { relays: 'read' } (real reads, publishes answered
in place); feed-live, chat-layout and cordn-ui launch with { relays: 'live' }.
LIVE_RELAYS=read|1|host,... overrides per run.

profile-key-qr: measure the QR again if a repaint swapped it out.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>ark board/refresh tests: current regtest chain and server rules</title>
<updated>2026-10-07T15:21:41Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-10-07T15:21:41Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=bba8280a241ce86b0f372818d7aca85073d8e53a'/>
<id>urn:sha1:bba8280a241ce86b0f372818d7aca85073d8e53a</id>
<content type='text'>
- mine/fund through the bc container (the standalone :18543 node was retired
  in the July consolidation)
- board-test hands the server the funding tx (require_board_funding_tx) and
  waits for esplora to see the board confirmed: bark silently drops a received
  vtxo whose board tx it can't find yet
- refresh-test rounds the ppm fee up like the server (and the manager) do

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Features phase 2: gift/swap/ark primitives leave the core wallet</title>
<updated>2026-07-04T16:33:52Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-07-04T16:33:52Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=b7c5abd93868b97c25f52610510544764a3e44eb'/>
<id>urn:sha1:b7c5abd93868b97c25f52610510544764a3e44eb</id>
<content type='text'>
wallet.js drops from 2,762 to 2,374 lines and now exposes two generic
seams instead of feature code:
- registerCoinLock()/lockedCoinIds(): features contribute coin ids that
  spending and the balance treat as unavailable (gift reservations).
- loadFeatureState()/saveFeatureState(): namespaced per-wallet persisted
  state.

src/features/gifts-wallet.js takes the whole gift engine — reservation
sets, gift records, coin selection, the SIGHASH_SINGLE/NONE PSBT
builder, the compact codec, claim building, nostr-locked gifts — as an
installGiftWallet(wallet) instance install plus standalone exports.
Swap storage/key helpers (loadSwaps/saveSwaps/swapNode/nextSwapIndex)
install from swap.js; ark state storage installs from the ark feature.
The silent-payment scan worker only embeds when the sp feature ships
(wallet.js already tolerated its absence).

Minimal profile: 412KB, down from 476KB (full: 578KB). All suites pass:
ark UI e2e, ArkManager crash-resume, gift lifecycle, minimal smoke.

SP's engine (scanning, BIP-352 signing) stays in wallet.js — extracting
it safely wants an SP e2e harness on this stack first.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01QFAcD4V284DvYZZHP7Rxxy
</content>
</entry>
<entry>
<title>History: gifts are timeline entries, not a separate section</title>
<updated>2026-07-04T15:38:12Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-07-04T15:38:12Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=65ad54a060a8035d8cf1e1ca2004f7c3bc5ff296'/>
<id>urn:sha1:65ad54a060a8035d8cf1e1ca2004f7c3bc5ff296</id>
<content type='text'>
Gift links now sort into the send/receive timeline like any entry: a
clickable row (🎁, status tag, age, amount) opening a detail page that
carries the date/status plus the actions that used to crowd the list
row (view gift link, cancel/reclaim with the existing confirm flow).
A claimed gift merges into its claim transaction's row — labeled as the
gift, clickable to the tx detail, which gains a "This transaction
delivered your gift" section (claim txid resolved via outspend and
cached on the gift record). The old pinned gifts header and the
paginated all-gifts view are gone.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01QFAcD4V284DvYZZHP7Rxxy
</content>
</entry>
<entry>
<title>Gift claim: instant 'Payment received!' after claiming</title>
<updated>2026-07-04T15:20:41Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-07-04T15:20:41Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=fdbae7472b42cf9bb8bbdf7d069be287a1cb7fc9'/>
<id>urn:sha1:fdbae7472b42cf9bb8bbdf7d069be287a1cb7fc9</id>
<content type='text'>
Claiming into an existing wallet used to drop onto the Receive tab
(address/QR visibly rotating) until the background scan noticed the
credit and fired the celebration. The claim already knows it succeeded
and for how much, so the celebration now shows immediately; the scan
runs behind it and its receive-index advance is acknowledged so the
generic celebration doesn't fire a second time.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01QFAcD4V284DvYZZHP7Rxxy
</content>
</entry>
<entry>
<title>Gift claim: correct copy when claiming into an existing wallet</title>
<updated>2026-07-04T15:02:14Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-07-04T15:02:14Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=cbbf90ed86c29f2c7c61b216be5e51946adaef52'/>
<id>urn:sha1:cbbf90ed86c29f2c7c61b216be5e51946adaef52</id>
<content type='text'>
"Claim it into a brand-new wallet that only you control." only fits the
new-wallet path; claiming into an existing wallet now says which wallet
it lands in ("Claim it into your wallet "Wallet 1".").

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01QFAcD4V284DvYZZHP7Rxxy
</content>
</entry>
<entry>
<title>Gift claim: make the wallet chooser read as a choice</title>
<updated>2026-07-04T14:53:03Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-07-04T14:53:03Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=2da22a3dc82bc8c0beb456097c2749ebc02d8017'/>
<id>urn:sha1:2da22a3dc82bc8c0beb456097c2749ebc02d8017</id>
<content type='text'>
The existing-wallet buttons looked like inert inputs. Now: a "Receive
into one of your wallets:" label, a chevron on each wallet row so it
reads as tappable, and an "or" divider before the new-wallet button.

(tools/ark/gift-shot.js: screenshot harness that mints a real regtest
gift and opens its link.)

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01QFAcD4V284DvYZZHP7Rxxy
</content>
</entry>
</feed>
