Repository navigation
feat: blocktank sunset - #1696
Conversation
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
a1412d5 to
a1c333c
Compare
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
901ecd8 to
2ba664e
Compare
|
Pushed 4eeb421: this PR is rebuilt on the latest master and now turns Blocktank channel purchases off in the app outright. Blocktank's order, CJIT and gift endpoints return 404, so every path that used to buy a channel shows the Transfer Unavailable sheet and leads to Manual Setup. The purchase screens, order and CJIT creation, the gift flow and their tests are removed. Paid-order recovery, order reads and the Cancel for a never-broadcast funding stay. The description is rewritten for the new shape. Device results on this head will follow in the QA comment. |
Dismissed per @ovitrif: this PR was rewritten (no geocheck; Blocktank purchase endpoints return 404), so this review of the old head no longer applies. @jvsena42 is off until 1 Nov; @ben-kaufman and @piotr-iohk review the new head.
|
This PR was refactored into a proper Blocktank sunset. Blocktank no longer sells channels and its order, CJIT and gift endpoints return 404, so the app now turns channel purchases off outright: no geocheck call and no geo state remain, and every former purchase path leads to the sunset sheet and Manual Setup. The description is rewritten for the new head. Comments and reviews from before the refactor are hidden as outdated: they reviewed the geocheck-based version, which no longer exists. Now:
|
|
QA for 94208b3: 🟢 Refused funding: Retry original, Cancel and a later sendA Blocktank funding whose broadcast the backend refused (`min relay fee not met, 0 < 141`, txid `836c19ab…`) leaves Savings at the full balance with no pending outgoing transaction. A new on-chain send opens Payment Pending for it; Retry original opens the Transfer Unavailable sheet and broadcasts nothing (`Stopped retrying a transfer to spending`); Cancel shows the transfer note and the fee prompt, then sends the coins back through `12fd2105…`; after one block a new on-chain send goes through (`Accepted on-chain send '9f692b7a…'`).
🟢 Every former purchase path shows the sheetThe Home Lightning card, Savings › Transfer To Spending and Spending › Transfer from Savings open the Transfer Unavailable sheet at once; Learn More opens blog.bitkit.to and Continue opens Manual Setup. Receive › Spending › Receive Lightning funds shows the same screen. Lightning Connections › add connection lists Manual Setup first and enabled, with the other three options disabled; tapping Transfer from Savings opens nothing. The app log has no request to Blocktank's purchase API on any of these paths.
🟢 A scanned gift code gets the regular unsupported-code errorOpening `bitkit://gift-abc123-3000` shows the scanner's "Unable To Read QR" warning, and no Transfer Unavailable sheet opens.
Note Staging creates no Blocktank orders, so a local debug build tagged a 100 000-sat on-chain send as a Blocktank funding and prepared it at 0 sat/vB; the backend refused its real broadcast. The unmodified 94208b3 build was then installed over that wallet and ran every other step shown. |
jvsena42
left a comment
There was a problem hiding this comment.
Re-reviewed to 94208b3 (the Blocktank sunset commits). No HIGH or MEDIUM. One LOW inline: the gift error sheet is left unused.
- Dropping paid-order recovery doesn't put funds at risk. The sent activity and the Channel Orders entry remain, and refund detection still works, because P2WPKH monitoring is forced and the refund address was a revealed wallet address.
- Accepted but unfinished funding attempts now complete through the ordinary follow-up.
- The removed persisted fields still decode, thanks to
ignoreUnknownKeys. - A scanned gift code now shows an "Unsupported" toast: no crash and no silent drop.
- New strings are present in all 16 locales.
Device gate (partial): 94208b3, not run yet. Pending: refused funding → Cancel → a later send works; geocheck allowed → no Cancel; transfer/transfer-unavailable-sheet.xml; and the gift deep link.
|
Pushed e7f8476: removes |
|
Device gate (partial):
Still running: refused funding → a later send is blocked → Cancel → a later send works, which needs a local Blocktank stand-in now that staging no longer creates orders. |
jvsena42
left a comment
There was a problem hiding this comment.
Approving. My MEDIUM is fixed and the LOW is gone in e7f8476. The device gate passed.
Device gate: e7f8476 (CI APK), Pixel_9 emulator, regtest on staging.
transfer/transfer-unavailable-sheet.xml: 11 of 11 pass.- Gift code by deep link, manual entry and a scanned QR: each shows the "Unable To Read QR" toast, with no sheet, no request and no crash.
- Refused funding:
- Setup: a master build with a local Blocktank stand-in made the funding, and an Electrum proxy refused its broadcast. I then upgraded to this build with the data kept.
- The next ordinary send is blocked and Payment Pending opens. Retry opens Transfer Unavailable and broadcasts nothing.
- Cancel shows the transfer note, the 703 sat fee and the PIN, then logs
Released on-chain payment 'b7ad6ac0…' through '9fc1d01c…'. A new 20 000 sat send then succeeded.
Android has no geocheck in this flow, since Cancel depends only on canBeAbandoned / isBlocktankFunding, so the iOS "geocheck allowed → no Cancel" case doesn't apply.
Perf: not relevant.
Note: every blocked send logs an ERROR-level findActivityByPaymentId error for the funding that never reached the chain. It has no user effect.

Twin: synonymdev/bitkit-ios#1127
This PR turns Blocktank channel purchases off in the app. Blocktank no longer sells channels, and its order, CJIT and gift endpoints now return 404, so every path that used to buy a channel shows the Transfer Unavailable sheet and leads to Manual Setup.
Description
Out of Scope
Design
Bitkit Wallet › Bitkit - Final Review v63 › Blocktank sunsetting:
Preview
Figma (left) next to the app (right):
Recordings of every path on the current head follow in the QA comment.
QA Notes
Setup
just build, regtest, staging LSP)../lsp POST /regtest/chain/deposit '{"address":"<savings address>","amountSat":100000}', then./lsp POST /regtest/chain/mine '{"count":3}'.Journeys
transfer-unavailable-sheet.xml— the wallet screens' Transfer To Spending buttons open the sheet, Learn More opens https://blog.bitkit.to/, Continue opens Manual Setup, the Funding screen leads with Manual Setup with the other options disabled, and Receive's Lightning screen shows the sheet's contentManual Tests
bitkit://gift-abc123-3000→ the scanner's regular unsupported-code error, no sheetAutomated Checks
FundingScreenTest.kt— Manual Setup is the only enabled optionEditInvoiceVMTest.ktandReceiveLiquidityDecisionTest.kt— a Spending invoice above inbound capacity leads to Transfer UnavailableAppViewModelSendFlowTest.kt— Retry original on a Blocktank funding shows the sheet and broadcasts nothingPaykitPaymentProofRepoTest.kt— a refused Blocktank funding is releasable and keeps Shop proofsLightningRepoTest.kt,BackupRepoTest.ktandTransferRepoTest.kt— an accepted Blocktank funding finishes through the ordinary follow-up without blocking sends, and an old order-backed transfer settles once its order has no channelAppViewModelSendFlowTest.ktcase — a scanned gift code gets the regular unsupported-code toast and no sheetLightningServiceTest.kt— the node config trusts no peer for zero-conf or force-close broadcasts; only stored peers with no channel and no claimable balance count as idle, and none while a sweep is pendingLightningRepoTest.kt— start disconnects idle peers and connects to no fixed peerNotificationsTimedSheetTest.kt— the prompt depends on Paykit subscriptionsTransferViewModelTest.kt,BlocktankRepoTest.kt,BlocktankTest.kt,ContentViewTest.kt,BackupRepoTest.ktand the receive tests, plusCjitQuoteValidatorTest.kt,CjitEntryDetailsTest.kt,FeesChangedStringsTest.ktandWakeNodeWorkerTest.ktjust compile,just test,just lintandcompileDevDebugAndroidTestKotlin— passSide effects checked
perChannelReserveSatsstays 1, so each open Blocktank channel holds 1 sat of on-chain reserve. Spendable balance is effectively unchanged.disconnectremoves the peer from the store.Evidence
J1 and tests 2 and 4 run on 94208b3, a dev build on a Pixel 9 emulator (Android 16) against the staging regtest LSP; all pass: QA comment. The refused funding was staged with a local debug build; every other step ran on the unmodified build.
Gaps
Models used
claude-opus-5-5(reasoning:Not exposed)claude-opus-5-5(reasoning:Not exposed)claude-sonnet-5-5(reasoning:Not exposed)Metadata note: the session records name the models but do not expose their reasoning settings.