Repository navigation
Conversation
14 tasks
Remove Transfer To Spending, instant receive (CJIT), gift codes and the Spend card, and show wallets with Blocktank channels the date the channels close.
Savings, Spending and hardware wallet Transfer To Spending buttons stay and open a sheet saying new channels are no longer offered, with the close date for wallets with Blocktank channels.
The sheet now says automatic transfers are gone and opens a Choose LSP screen with third-party providers, manual setup and the scanner.
The sheet becomes Transfer Unavailable (manual setup required) with Cancel and Continue to Choose LSP, per the final design; the close date stays on the banner and Spending notice.
Drops the geocheck, the trusted-peer list from Blocktank info (peers come from Env), the refund address for new orders, the order polling timer and the info refresh when Receive opens. Info for fee estimates, FX rates, push registration and the watch of already paid orders stay.
Order and CJIT reads use the local cache only; the app no longer polls a paid order or opens its channel at start, so Blocktank opens or refunds orders paid before the upgrade.
ovitrif
force-pushed
the
feat/stop-new-channels
branch
from
October 24, 2026 17:47
9ae1235 to
8cda3c4
Compare
Collaborator
Author
|
Rebased on
CI's unit-tests run passes at 4adaf7f: https://github.com/synonymdev/bitkit-ios/actions/runs/40117909346 |
2 tasks
Collaborator
Author
|
Replaced by #1127, which keeps the Transfer Unavailable sheet and drops the provider list and closing banner. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #1097
Twin: synonymdev/bitkit-android#1670
Companion: synonymdev/bitkit-e2e-tests#284
This PR stops the app from buying new Lightning channels from Blocktank, points users who want a channel to third-party providers, and tells users with Blocktank channels the date their channels close, so they can move their spending balance to savings first.
Description
CHANNELS_CLOSE_DATE, with a placeholder of Dec 15, 2026 until the shutdown date is final, formatted in the app language's medium date style.The purchase screens (funding options, transfer intro, the spending amount, confirm and advanced screens, the hardware-wallet signing screens, and the CJIT amount, confirm and liquidity screens) stay in code with no UI entry point.
Out of Scope
Views/Transfer,Views/Wallets/Receive/ReceiveCjit*,TransferViewModel,BlocktankViewModel: deleting the dormant purchase screens and the order and CJIT code they call; this PR only removes every way to reach them.Blocktank API calls
This PR removes every order and CJIT call outside the dev screens and the React Native migration, so Blocktank can drop those endpoints. It matches synonymdev/bitkit-android#1670.
Removed:
/api/geocheck): the region check that gated channel purchases, with the geo-blocked state, its UI variants, the onboarding geo note and theCHECK_GEOBLOCKbuild flag.Env.trustedLnPeers, which were already the fallback. The third mainnet peer's address is updated to the one Blocktank's info lists now (34.65.147.55). The LDK debug screen's peer simulation, which only faked that fetch, is gone.openfor them.Kept:
info(): fee estimates for every on-chain send (info.onchain.feeRates). Removing it needs another fee source first./api/fx/rates/btc): fiat conversion. Needs another source first./notifications/api): receiving while the app is closed, until the channels close.Not Blocktank API but hosted on Blocktank domains, unchanged: RGS snapshots, the scorer, VSS backups, LNURL auth, and the staging Electrum and mempool servers.
Orders pending at upgrade: an order paid before the upgrade, whose channel the app had not yet asked Blocktank to open, is no longer opened by the app. Blocktank has to open or refund it from its side. A transfer whose channel already exists still settles when the channel becomes ready.
Third-party LSPs
The list and order are the Third-party LSP design's, and the team removes any it doesn't want to be associated with at review:
They live in
LightningProvider.all. LNURL-channel claims from these providers go through the existing LNURL channel flow; I didn't open a mainnet channel or try a claim with any of them.Design
Preview
Next to the design, each pair with the Figma frame on the left and the app on the right:
Transfer To Spending without Blocktank, then the sheet to the provider list, on regtest (2x):
j32x.mp4
Closing notice for a Blocktank channel, and a wallet without channels (2x):
j1c2x.mp4
j22x.mp4
An existing channel keeps working (2x):
recv2x.mp4
savingsc2x.mp4
QA Notes
Setup
api.stag0.blocktank.to). Fund and mine with the sibling Android checkout's helper:../bitkit-android/lsp POST /regtest/chain/depositand../bitkit-android/lsp POST /regtest/chain/mine.masterbuild from before this PR (2464865), onboard, fund, open a channel with Savings › Transfer To Spending, mine 6 blocks, then install this PR's build over it. A manual channel to the staging LSP node (Settings › Advanced › Lightning Connections › add connection › Manual Setup, node from../bitkit-android/lsp GET /info) also counts as a Blocktank channel.journeys/README.md› Getting a Lightning channel has the same recipes.Journeys
channels-closing-notice.xml— Home banner with the date opens the Spending wallet notice; Savings Transfer To Spending opens the Transfer Unavailable sheetreceive-onchain-only-without-channel.xml— a wallet without channels gets a Savings-only Receive sheet, no CJIT button, no Spend card, no banner, and both transfer buttons open the Transfer Unavailable sheetchoose-lsp-from-transfer.xml— the sheet's Continue opens Choose LSP: provider rows open the browser, QR Code opens the scanner, Manual Setup opens the manual channel setupexternal-amount-over-max.xml— the route starts from Funding Advancednon-cjit-channel-no-payment-notification.xml— channel set up through manual setup to the LSP nodeactivity-blue-icons.xml— precondition notes the transfer row needs a pre-change builddetail-overview.xml— hardware wallet Transfer To Spending opens the sheetreceive-tabs-wraparound.xml— runs on a wallet without channels (Savings and USDT)usdt-receive-swipe-tabs.xml— without a channel, swiping right from USDT lands on Savingsusdt-wallet-navigation.xml— the Spending tab shows only over a channelreceive-above-ten-percent-of-channel.xml— its channel comes from a pre-change build instead of CJITRetired, listed in
journeys/README.md› Retired journeys: the transfer-to-spending amount-limit journeys, the CJIT notification journeys for CJIT orders, the hardware-wallet transfer-to-spending journeys, the notification-permission suite (its routes went through the CJIT and Spending Confirm screens) andspending-confirm-amount-change.xml; their flows no longer exist.Manual Tests
N/A
Automated Checks
ChannelsClosingTests.swift— the close date formats in the medium date style per localeReceiveLiquidityDecisionTests.swift— keeps the Lightning-invoice checks, drops the CJIT routing onesReceiveEditTests.swift— drops the route into the CJIT amount screenPubkyAuthURLSchemeTests.swift— gift code links no longer bypass the node start gateTabBarReceiveTests.swift— its subject, the Spending wallet's Receive shortcut into CJIT, is goneEvidence
Debug builds on an iPhone 17 Pro simulator (iOS 26.5), regtest against the staging Blocktank.
master(2464865) with a 150 000 sat Blocktank channel, at 7ead1a4, and again at f15e3bb on a wallet with a manual 200 000 sat channel to the LSP node (the recording), where the banner title fits on one line: banner "CHANNELS CLOSE ON DEC 15, 2026", tap opens the Spending wallet with the notice and Transfer To Savings; Savings › Transfer To Spending opens the Transfer Unavailable sheet, and Cancel returns to Savings.swiftformat --linton the changed Swift files andnode scripts/validate-translations.jspass.master, on a local simulator: one failure,SendConfirmationLifecycleTests.testCustomFeeWalletSwitchSurvivesFeeScreenNavigation, which fails the same way onmasterlocally and passes in CI. CI's unit-tests run passes at 4adaf7f (https://github.com/synonymdev/bitkit-ios/actions/runs/40117909346).Gaps
Models used
claude-opus-5-5(reasoning:medium)claude-opus-5-5(reasoning:medium)