Repository navigation
Conversation
|
Pushed 1de408c: Transfer To Spending (Savings and hardware wallet) and Transfer from Savings (empty Spending wallet) are back, and they now open a "New Channels Unavailable" sheet instead of the transfer flow. Following the request in the Blocktank wind-down thread, users who try to move savings to spending now see why they can't. For wallets with a Blocktank channel the sheet also shows the close date. No Blocktank order or CJIT entry is created from anywhere.
|
|
Pushed c0aae97. The savings-to-spending sheet now uses @aldertnl's copy ("No automatic transfer") and offers Cancel and Open Channel, following the Blocktank wind-down thread. Open Channel leads to a new "Choose a Lightning provider" screen built from the Third-party LSP design:
Still no Blocktank order or CJIT entry is created from anywhere. New journey |
|
Pushed d749648. The savings-to-spending sheet now follows @aldertnl's full design (thread):
The provider links (LNBIG, ZEUS Olympus, Megalithic, Amboss Magma) were checked and return 200. The description notes how LNURL-channel claims from these providers work and that no claim was tried against a live provider. |
|
Pushed 8e42a49: the Home banner "CHANNELS CLOSE ON DEC 15, 2026" no longer wraps onto two lines. The banner component gets an optional |
|
Pushed 6086f96: the app no longer calls Blocktank for orders, CJIT entries, geocheck or refund addresses, and no longer reads trusted peers from Blocktank's |
6086f96 to
6f86a1b
Compare
|
Rebased onto master (no conflicts) and pushed 1adc54a, which adds one fix: the hardcoded address of Blocktank's LND4 node was stale ( On the rebased head, |
|
Replaced by #1696, which keeps the Transfer Unavailable sheet and drops the provider list and closing banner. |
Closes #1669
Twin: synonymdev/bitkit-ios#1102
Companion: synonymdev/bitkit-e2e-tests#284
This PR stops the app from buying new Lightning channels from Blocktank 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 locale's medium date style.info.nodes; with the old address, channels with LND4 could not reconnect.The purchase screens (Funding, Transfer intro, the spending amount, confirm and advanced screens, the hardware-wallet signing screens, and the receive amount, confirm and liquidity screens) stay in the navigation graph with no UI entry point. Release builds disable screen deep links, so only dev mode in a debug build reaches them.
Out of Scope
ui/screens/transfer,TransferViewModel,BlocktankRepo: deleting the dormant purchase screens and the order and CJIT code they call; this PR only removes every way to reach them.infoand FX endpoints until another source replaces them.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. Each link answered HTTP 200 on 22 Oct:
I didn't open a mainnet channel with any of them. They can be removed by deleting their entries in
THIRD_PARTY_LSPS.LNURL-channel claims from these providers go through the existing LNURL channel flow. That flow connects to whatever node the QR names, sends the channel request, and doesn't limit it to Blocktank. LDK accepts the inbound channel from a peer it doesn't trust (the anchor reserve per channel is 1 sat). Zero-conf stays limited to Blocktank's nodes, so a third-party channel becomes usable after it confirms. I didn't try a claim against a live provider.
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 (Ovi's scope, confirmed by Blocktank).
Removed:
/api/geocheck): the region check that gated channel purchases. The geo-blocked state, its UI variants and the onboarding geo note are gone with it.info.nodes: the node now always uses the hardcoded Blocktank peers inEnv.trustedLnPeers, which were already the fallback.openany more.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./api/notifications): receiving while the app is closed, until the channels close in about six weeks.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 that was paid before the upgrade, and 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.
Design
docs/screens-map.mdlists the screen astodo. The design embeds the provider's page in the app; this PR opens it in the browser.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, on regtest (2x):
j12-transfer-unavailable-2xs.mp4
j10-manual-from-choose-lsp-2xs.mp4
Closing notice for a Blocktank channel (the banner title shrinks to fit one line), and a wallet without channels (2x):
j1b-banner-2xs.mp4
j2-onchain-only-2xs.mp4
An existing channel keeps working (2x):
j3-receive-2xs.mp4
j4-send-2xs.mp4
to-savings-m5a-2xs.mp4
QA Notes
Setup
just build, regtest) against the staging regtest LSP; fund and mine with./lsp POST /regtest/chain/depositand./lsp POST /regtest/chain/mine.masterbuild from before this PR (d5526d4), onboard, fund, open a channel with Savings › Transfer To Spending, 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./lsp GET /info) also counts as a Blocktank channel../lsp POST /cjitfor another wallet's node id gives a Lightning invoice to pay; hand it to the app aslightning:<invoice>withadb shell am start -a android.intent.action.VIEW -d.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; Transfer To Savings stays, and 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 and no banner; Transfer To Spending and Transfer from Savings open the Transfer Unavailable sheetexternal-amount-over-max.xml— the route starts from Funding Advancedrestore-keeps-tags-and-closed-channels.xml— channel set up through manual setup to the LSP nodenon-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 Transfer Unavailable sheetcancelled-node-restart.xml— channel precondition says how to get onereceive-auto-tab-selection.xml— channel precondition; without a channel the sheet shows Savings onlyreceive-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 Savingstransfer-to-savings-returns-home.xml— channel precondition says how to get oneusdt-wallet-navigation.xml— the Spending tab shows only over a channelchoose-lsp-from-transfer.xml— the sheet's Continue leads to Choose a Lightning provider; provider rows open their sites, and Manual Setup and QR Code open the existing manual setup and scannerRetired, 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 CJIT and transfer notification-toggle journeys,spending-confirm-amount-change.xmlandclosed-channel-transfer-settles.xml; the transfer, CJIT and gift flows behind them no longer open.Manual Tests
N/A
Automated Checks
HomeViewModelTest.kt— the channels-closing banner shows with Blocktank channels and hides without themReceiveLiquidityDecisionTest.kt— keeps the Lightning-invoice checksSuggestionsRepoTest.kt— no transfer dependency now that the Spend card is goneContentViewTest.kt— drops the hardware-wallet transfer start routeReceiveAutoTabSelectionTest.kt— picks Savings, since a wallet without a ready channel has no Spending tabBlocktankRepoTest.kt— orders and CJIT entries load from the local cache only; orders submit without a refund addressTransferRepoTest.kt— pending transfers settle without fetching ordersLightningRepoTest.kt,WalletRepoTest.kt— no geocheck or trusted-peer fetch on start and invoice refreshBlocktankRepoTest.ktandTransferRepoTest.kt, and the trusted-peers-from-Blocktank tests inLightningRepoTest.kt— those calls are goneEditInvoiceVMTest.kt— its view model only decided CJIT offers for Edit Invoicejust compile,just test,just lintandcompileDevDebugAndroidTestKotlinon the rebased branch — passbuildand unit tests by workflow dispatch on 6f86a1b, since draft PRs skip them — passEvidence
Dev builds on a Pixel 9 emulator (Android 16) against the staging regtest LSP. On 24 Oct the branch was rebased onto master; the shas below from before that date are the pre-rebase commits.
Earlier runs: The Transfer Unavailable sheet ran on d749648; Choose a Lightning provider and Manual Setup on c0aae97; cases 1 and 4 ran on 46e67b5; 2, 3 and 5 ran on an earlier build of this branch, before the review fixes that limited the notice to Blocktank channels and moved the banner out of the activity block, which do not touch those flows.
masterwith a 100 000 sat Blocktank channel: banner "CHANNELS CLOSE ON DEC 15, 2026", tap opens the Spending wallet with the notice and Transfer To Savings, and Savings has no Transfer To Spending.lightning:URI.Gaps
@hardware_wallet_3) did not run: the dispatched E2E matrix has no Trezor emulator suite.Models used
claude-opus-5-5(reasoning:medium)claude-opus-5-5(reasoning:medium),claude-sonnet-5-5(reasoning:Not exposed)claude-opus-5-5(reasoning:Not exposed)Metadata note: the session's model and effort come from the app's session record. The journey-update and review subagents reported their models from their own prompts; their reasoning settings were not exposed in any record available here.