From a056ea615498ee62e4180c1e09b3ce0a5a03de0f Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Fri, 28 Aug 2026 20:40:36 -0700 Subject: Max learns the ark rail: an ark address gets its own Max button filling the whole spendable Spending balance — free sends mean the maximum really is the balance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi --- src/app.js | 10 +++++++++- src/features/ark.js | 8 ++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/app.js b/src/app.js index a8cde9e..77f0c01 100644 --- a/src/app.js +++ b/src/app.js @@ -3857,7 +3857,15 @@ function recipientRow(s, r, i) { }, }), h('button', { type: 'button', title: t('switchUnit'), onClick: toggleUnit }, unitLabel()), - single && !featureHook('hideSendControls', r.address) && h('button', { type: 'button', class: s.max ? 'btn-primary' : '', onClick: () => { s.max = !s.max; render(); } }, t('max')) + single && !featureHook('hideSendControls', r.address) && h('button', { type: 'button', class: s.max ? 'btn-primary' : '', onClick: () => { s.max = !s.max; render(); } }, t('max')), + // features that hide the fee controls (ark) can still offer their own + // Max — it fills the amount with that rail's spendable balance + single && featureHook('hideSendControls', r.address) + ? (() => { + const v = featureHook('sendMaxFill', r.address); + return v != null ? h('button', { type: 'button', onClick: () => { r.amount = v; s.max = false; render(); } }, t('max')) : null; + })() + : null ) : null ); syncCheck(); diff --git a/src/features/ark.js b/src/features/ark.js index 59c293f..3e614c4 100644 --- a/src/features/ark.js +++ b/src/features/ark.js @@ -2338,6 +2338,14 @@ export function arkFeature(ctx) { }, isSendDest(a) { return isArkAddress(a) && arkAvailable(); }, hideSendControls(a) { return isArkAddress(a); }, + // Max for an ark recipient: arkoor sends are free, so the whole + // spendable Spending balance is the honest maximum. + sendMaxFill(a) { + if (!isArkAddress(a)) return null; + const sat = arkBalance()?.spendableSat || 0; + if (!sat) return null; + return ctx.getUnit() === 'sats' ? String(sat) : (sat / 1e8).toFixed(8); + }, sendFormNote(a) { if (!isArkAddress(a)) return null; maybeReconcile(); -- cgit v1.2.3