diff options
| author | Adam Soltys <[email protected]> | 2026-10-22 22:29:58 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-10-22 22:29:58 -0700 |
| commit | df1972d49d166955f36bde1dbe05f52669384c1a (patch) | |
| tree | 6670637c567ad789ec63627370432d8241c0df57 | |
| parent | a0316a2a462a57a1c5832304820daf4d670c6d1b (diff) | |
| download | coinosv3-df1972d49d166955f36bde1dbe05f52669384c1a.tar.gz coinosv3-df1972d49d166955f36bde1dbe05f52669384c1a.zip | |
Custody card copy: "coin", not "Spending coin"; Coinos capitalized; the default tier says the exit stays until a coin's timelock runs out
Adam, 2026-10-23: "Coinos holds my coins" read as if the holder never had a unilateral exit. They do, until the timelock runs out; only then does Coinos hold the coin. The option is now "Coinos holds my coins once they expire", its description says so, and the intro says what the timelock buys and what renewing keeps.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
| -rw-r--r-- | src/i18n.js | 14 | ||||
| -rw-r--r-- | tools/ark/custody-ui-test.js | 8 |
2 files changed, 12 insertions, 10 deletions
diff --git a/src/i18n.js b/src/i18n.js index d3817b6..8e816e2 100644 --- a/src/i18n.js +++ b/src/i18n.js @@ -777,13 +777,13 @@ const STR = { arkFeeChain: 'On-chain fee', arkFeeService: 'Service fee', arkCoinsExpired: 'expired', - arkCoinsHeld: 'held by coinos', + arkCoinsHeld: 'held by Coinos', arkCustodyTitle: 'Custody', - arkCustodyDesc: 'Each Spending coin carries a timelock of about {days} days. Renewing a coin before it runs out keeps your right to bring it on-chain without coinos, and costs a share of a round’s mining fee. coinos keeps honoring coins past their timelock, so renewing is a choice:', - arkCustodyCustodial: 'coinos holds my coins', - arkCustodyCustodialDesc: 'Nothing renews and no renewal fees are paid. Past its timelock a coin is held by coinos, like a balance on the old coinos: paying, receiving and withdrawing keep working, but bringing it on-chain needs coinos’s cooperation.', + arkCustodyDesc: 'Each coin carries a timelock of about {days} days. Until it runs out, you can bring the coin on-chain yourself, without Coinos. Renewing a coin before then keeps that right for another {days} days and costs a share of a round’s mining fee. Coinos keeps honoring coins past their timelock, so renewing is a choice:', + arkCustodyCustodial: 'Coinos holds my coins once they expire', + arkCustodyCustodialDesc: 'Nothing renews and no renewal fees are paid. A coin keeps its own exit until its timelock runs out. After that it is held by Coinos, like a balance on the old Coinos: paying, receiving and withdrawing keep working, but bringing it on-chain needs Coinos’s cooperation.', arkCustodySelf: 'Keep my own exit', - arkCustodySelfDesc: 'Coins renew in the last hours before their timelock ends — the cheapest moment — so you can always exit on your own. Roughly once every {days} days per coin.', + arkCustodySelfDesc: 'Coins renew in the last hours before their timelock ends — the cheapest moment — so you can always exit on your own, without Coinos. Roughly once every {days} days per coin.', arkCustodyExit: 'Keep my exit cheap', arkCustodyExitDesc: 'Every transfer adds a hop to a coin’s history, and a unilateral exit pays one on-chain transaction per hop. This renews near expiry too, and also as soon as a coin’s history is {hops} hops deep, so bringing any coin on-chain stays close to a fresh coin’s price. Only for coins worth it: never more than a tenth of a coin on its renewal.', arkCustodyCostNone: 'no fees', @@ -791,8 +791,8 @@ const STR = { arkCustodyCostExit: '{base} near expiry, {pct} + {base} when early', arkCustodySaved: 'Custody choice saved', arkCustodyNotHere: 'This server does not honor coins past their timelock, so they renew automatically here.', - arkExitNoneExitable: 'Every coin has passed its timelock, so there is nothing a unilateral exit can take on-chain: coinos holds them now. Renewing restores your own exit; withdrawing with coinos’s cooperation works as before.', - arkCoinsRenewDescCustodial: 'With “coinos holds my coins”, nothing renews on its own. A renewal replaces the selected coins with a single fresh one in the next round ({every}) and restores your own exit for them. Every renewal costs a flat {base} toward the round’s on-chain fee, plus a share that depends on how close each coin is to its timelock. The closer, the cheaper:', + arkExitNoneExitable: 'Every coin has passed its timelock, so there is nothing a unilateral exit can take on-chain: Coinos holds them now. Renewing restores your own exit; withdrawing with Coinos’s cooperation works as before.', + arkCoinsRenewDescCustodial: 'With “Coinos holds my coins once they expire”, nothing renews on its own. A renewal replaces the selected coins with a single fresh one in the next round ({every}) and restores your own exit for them. Every renewal costs a flat {base} toward the round’s on-chain fee, plus a share that depends on how close each coin is to its timelock. The closer, the cheaper:', noteForeignKind: 'A kind {kind} event this app doesn’t show.', zapRowText: 'zapped {n} sats', pollVoter: '{n} vote', diff --git a/tools/ark/custody-ui-test.js b/tools/ark/custody-ui-test.js index 20035ac..0b55d1c 100644 --- a/tools/ark/custody-ui-test.js +++ b/tools/ark/custody-ui-test.js @@ -77,16 +77,18 @@ try { let tx = await text(); assert.match(tx, /Custody/); - assert.match(tx, /coinos holds my coins[\s\S]*no fees/); + assert.match(tx, /Coinos holds my coins once they expire[\s\S]*no fees/); + assert.match(tx, /keeps its own exit until its timelock runs out/); + assert.doesNotMatch(tx, /Spending coin carries/); assert.match(tx, /Keep my own exit[\s\S]*300 sats per renewal/); assert.match(tx, /Keep my exit cheap[\s\S]*300 sats near expiry, 0\.2% \+ 300 sats when early/); assert.match(tx, /4 hops deep/); const checked = await page.$$eval('.ark-custody input[type=radio]', (els) => els.filter((e) => e.checked).map((e) => e.value)); assert.deepEqual(checked, ['custodial'], 'coinos holds the coins by default'); assert.equal(await page.evaluate(() => coopFeature.getCustody()), 'custodial'); - assert.match(tx, /held by coinos/, 'the coin past its timelock is held, not "expired"'); + assert.match(tx, /held by Coinos/, 'the coin past its timelock is held, not "expired"'); assert.doesNotMatch(tx, /\bexpired\b/); - assert.match(tx, /With “coinos holds my coins”, nothing renews on its own/); + assert.match(tx, /With “Coinos holds my coins once they expire”, nothing renews on its own/); if (process.env.SHOT) await page.screenshot({ path: process.env.SHOT, fullPage: true }); console.log('✓ the custody card: three tiers with their prices, coinos holding by default, a past-timelock coin shown as held'); |
