aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-10-22 22:37:40 -0700
committerAdam Soltys <[email protected]>2026-10-22 22:37:40 -0700
commit36f517e6dfb29a80d572b28922bf982d4d979056 (patch)
tree44ac01e7483f56a50d11b1c19e2bd7a288975f87
parentdf1972d49d166955f36bde1dbe05f52669384c1a (diff)
downloadcoinosv3-36f517e6dfb29a80d572b28922bf982d4d979056.tar.gz
coinosv3-36f517e6dfb29a80d572b28922bf982d4d979056.zip
Custody card: plain words — "Allow coins to expire", "Minimize renewal cost", "Minimize exit cost"; no timelocks, rounds or "the old Coinos"
Adam, 2026-10-23. Coins "expire"; the exit is "yours until then"; what a renewal buys is said without naming the mechanism. Co-Authored-By: Claude Fable 5.1 <[email protected]>
-rw-r--r--src/i18n.js20
-rw-r--r--tools/ark/custody-ui-test.js14
2 files changed, 17 insertions, 17 deletions
diff --git a/src/i18n.js b/src/i18n.js
index 8e816e2..e9e298f 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -779,20 +779,20 @@ const STR = {
arkCoinsExpired: 'expired',
arkCoinsHeld: 'held by Coinos',
arkCustodyTitle: 'Custody',
- 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, 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.',
+ arkCustodyDesc: 'Each coin expires about {days} days after it was made. Until then you can bring it on-chain yourself, without Coinos. Renewing a coin before it expires keeps that right for another {days} days and costs a small fee. Coinos keeps honoring expired coins, so renewing is a choice:',
+ arkCustodyCustodial: 'Allow coins to expire',
+ arkCustodyCustodialDesc: 'Nothing renews and no renewal fees are paid. A coin keeps its own exit until it expires. After that Coinos holds it for you: paying, receiving and withdrawing keep working, but bringing it on-chain needs Coinos’s cooperation.',
+ arkCustodySelf: 'Minimize renewal cost',
+ arkCustodySelfDesc: 'Coins renew in the last hours before they expire, when renewal is cheapest, so you can always exit on your own without Coinos. Roughly once every {days} days per coin.',
+ arkCustodyExit: 'Minimize exit cost',
+ arkCustodyExitDesc: 'Every transfer adds a hop to a coin’s history, and a unilateral exit pays one on-chain transaction per hop. This renews a coin before it expires, and also as soon as its 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',
arkCustodyCostSelf: '{base} per renewal',
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 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:',
+ arkCustodyNotHere: 'This server does not honor expired coins, so they renew automatically here.',
+ arkExitNoneExitable: 'Every coin has expired, 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 “Allow coins to expire”, nothing renews on its own. A renewal replaces the selected coins with a single fresh one and restores your own exit for them. Every renewal costs a flat {base} toward its on-chain fee, plus a share that depends on how close each coin is to expiry. 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 0b55d1c..7ebc2ea 100644
--- a/tools/ark/custody-ui-test.js
+++ b/tools/ark/custody-ui-test.js
@@ -77,18 +77,18 @@ try {
let tx = await text();
assert.match(tx, /Custody/);
- 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, /Allow coins to expire[\s\S]*no fees/);
+ assert.match(tx, /keeps its own exit until it expires/);
+ assert.doesNotMatch(tx, /timelock|Spending coin carries|old Coinos/, 'no jargon on the card');
+ assert.match(tx, /Minimize renewal cost[\s\S]*300 sats per renewal/);
+ assert.match(tx, /Minimize exit cost[\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.doesNotMatch(tx, /\bexpired\b/);
- assert.match(tx, /With “Coinos holds my coins once they expire”, nothing renews on its own/);
+ assert.doesNotMatch(tx, /5,000 sats\s+expired/, 'the row never says "expired"');
+ assert.match(tx, /With “Allow coins to 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');