aboutsummaryrefslogtreecommitdiffstats
path: root/src/features
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-07-31 01:10:13 -0700
committerAdam Soltys <[email protected]>2026-07-31 01:10:13 -0700
commit72e407bf6d7d09923d15461be82685017a0887be (patch)
treed9f9dbbf6955384ea10e1b1ada046258158e4fcc /src/features
parent78789e0b2eaf91e2de6b4e488324fbec0fcefb9d (diff)
downloadcoinosv3-72e407bf6d7d09923d15461be82685017a0887be.tar.gz
coinosv3-72e407bf6d7d09923d15461be82685017a0887be.zip
Dust-isolate arkoor outputs; prove lightning E2E on regtest
The server rejects an arkoor mixing dust and non-dust outputs, which broke small Lightning payments (a 45-sat HTLC next to change) and tiny plain sends. Mirror bark's isolation: dust outputs route through a combined isolation output spent by a fanout tx, splitting a non-dust output to pad the dust below-threshold. Outputs can therefore split across two vtxos, so the manager now classifies results by policy instead of index (legacy single-field actions still resume). Regtest now runs the full stack: dedicated cln-ark node (secondark/cln-hold, hold plugin + xpay) wired into captaind with a channel to the coinos dev clc node. tools/ark/ln-e2e-test.js proves pay (5000 sat and a 25-sat dust zap), hold-invoice receive with claim, and spending the claimed vtxos. Co-Authored-By: Claude Fable 5 <[email protected]>
Diffstat (limited to 'src/features')
-rw-r--r--src/features/ark.js4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/features/ark.js b/src/features/ark.js
index 9b057b1..03041a2 100644
--- a/src/features/ark.js
+++ b/src/features/ark.js
@@ -722,7 +722,7 @@ export function arkFeature(ctx) {
const actionId = await mgr.send(z.address, sats);
const action = mgr.state.actions.find((a) => a.id === actionId);
if (!action || action.step === 'failed') throw new Error(action?.error || t('claimFailed'));
- const vtxoId = decodeVtxo(hex.decode(action.destBytes)).id;
+ const vtxoId = decodeVtxo(hex.decode((action.destBytesList || [action.destBytes])[0])).id;
// the receipt is best-effort: the sats are already delivered via mailbox
await wallet.nostrPublish({
kind: ARK_ZAP_KIND,
@@ -1425,7 +1425,7 @@ export function arkFeature(ctx) {
const actionId = await mgr.send(gm.address(), amountSat);
const action = mgr.state.actions.find((a) => a.id === actionId);
if (!action || action.step === 'failed') throw new Error(action?.error || t('claimFailed'));
- const vtxoId = decodeVtxo(hex.decode(action.destBytes)).id;
+ const vtxoId = decodeVtxo(hex.decode((action.destBytesList || [action.destBytes])[0])).id;
arkGiftRecords().push({ id: vtxoId, amountSat, secretHex, created: Date.now(), revoked: false, claimed: false });
mgr._save();
return { code: encodeArkGiftCode(getNetwork(), amountSat, secret), amount: amountSat };