Claim all parked UI on LimitOrderMyPlacementsPanel (batch claim #246 follow-up) #253

Closed
opened 2026-05-31 13:07:55 +00:00 by PlasticDigits · 10 comments
PlasticDigits commented 2026-05-31 13:07:55 +00:00 (Migrated from gitlab.com)

Summary

Add a Claim all parked control to LimitOrderMyPlacementsPanel so makers with multiple lifecycle_status: parked_expired rows can recover escrow in one on-chain transaction via ClaimExpiredLimitOrders, mirroring the Cancel all mine batch UX shipped in GitLab #246.

Current codebase

Why this is needed

Ladder traders and market makers can accumulate many parked-expired rows after expiry parks during taker walks. Today they must click Claim refund per row — poor UX, high cumulative gas (~4.5M for 10 claims vs ~1.2M batch), and unnecessary wallet friction. On-chain + indexer support exists from #246; only the placements panel UI + shared mutation hook are missing.

Constraints / guardrails

  • Reuse existing batch execute path — call claimExpiredLimitOrders, do not add new contract messages.
  • Cap: batch size ≤ 30 ids (pair max_batch_rungs / MAX_LIMIT_BATCH_RUNGS_HARD_CAP). If indexed parked count exceeds cap, UI must chunk (multiple batch txs) or disable Claim all with clear copy — document chosen behavior in PR.
  • All-or-nothing on-chain: any invalid / foreign / already-claimed id in the vec reverts the whole tx — client must only submit ids from parkedExpired rows for the connected wallet on this pair.
  • Pause (L6): disable Claim all when isPairPaused (same as per-row claim).
  • Indexer lag: do not submit ids that are parked_expired in UI but already refunded on-chain — optional preflight via stale-row filter or rely on revert + humanized error (extend limitClaimUserMessage.ts for batch failures if needed).
  • Single parked row: Claim all hidden or disabled; keep per-row Claim refund (or route single id to claimExpiredLimitOrder for gas parity with cancel-all pattern).
  • Query invalidation: match existing claim success path — limitPlacements, book previews, tokenBalance.
  • No new indexer work expected (batch claim parser landed in #246) unless attrs differ from spec — verify ingestion in QA.

Relevant files

Area Files
UI frontend-dapp/src/components/trade/LimitOrderMyPlacementsPanel.tsx
New hook (recommended) frontend-dapp/src/hooks/useLimitExpiredClaimMutation.ts (mirror useLimitOrderCancelMutation)
Service frontend-dapp/src/services/terraclassic/pair.ts (claimExpiredLimitOrder, claimExpiredLimitOrders)
Gas frontend-dapp/src/services/terraclassic/terraGas.ts (gasLimitForLimitOrderCancelBatch, getGasLimitForTx)
Lifecycle / copy frontend-dapp/src/utils/limitPlacementLifecycle.ts, frontend-dapp/src/utils/limitClaimUserMessage.ts
Consumers frontend-dapp/src/pages/LimitOrdersPage.tsx, frontend-dapp/src/components/trade/TradeOrderTicket.tsx (mount panel only)
Docs / skills docs/limit-orders.md, docs/frontend.md, skills/AGENTS_FRONTEND_LIMIT_PARKED_EXPIRED.md
Tests Vitest for hook/panel; optional Playwright extension to frontend-dapp/e2e/limit-orders-tx.spec.ts
  1. Extract shared claim mutation — useLimitExpiredClaimMutation(pairAddr, walletAddress) accepting number | number[]: length 1 → claimExpiredLimitOrder; length > 1 → claimExpiredLimitOrders. Same invalidation + sounds as today's inline mutation.
  2. Panel UI — in Expired — refund pending section header, add Claim all parked (N) button when parkedExpired.length > 1:
    • Confirm dialog: Claim all N expired refund(s) in one transaction?
    • Disabled when: wallet disconnected, pair paused, mutation pending, or zero parked rows.
    • Per-row buttons remain for single-order recovery and in-flight feedback.
  3. Cap handling — if parkedExpired.length > 30, either batch in chunks of 30 with sequential txs (confirm once per chunk) or show inline notice + cap button at 30 — prefer chunked batch with progress copy over silent omission.
  4. Gas display (optional): show estimated LUNC fee using gasLimitForLimitOrderCancelBatch(N) + estimateFeeUlunaAmountForGasLimit in confirm dialog (nice-to-have, not blocking).
  5. Docs: update docs/limit-orders.md parked-expired bullet + skills/AGENTS_FRONTEND_LIMIT_PARKED_EXPIRED.md with Claim all behavior and crosslink #246 / this issue.

Acceptance criteria

  • Claim all parked visible when ≥ 2 parkedExpired rows for connected wallet on current pair (both /limits and /trade compact panel).
  • One batch tx claims all listed parked ids (≤ 30 per tx); refunds arrive as ≤ 2 CW20 transfers on-chain.
  • Single parked row: no Claim all; per-row Claim refund unchanged.
  • Claim all disabled while pair paused; per-row buttons match existing pause copy.
  • Successful batch claim invalidates placements + balances; parked rows disappear after indexer catches up.
  • Shared hook used by panel (inline mutation removed or delegated).
  • Docs + agent skill updated with Claim all invariants.

Test plan — functional paths

  • Vitest: hook selects single vs batch execute msg by id count; normalizes invalid ids.
  • Vitest / RTL: panel renders Claim all only when parkedExpired.length >= 2; disabled when paused / disconnected.
  • Vitest: confirm dialog copy includes count N.
  • Manual LocalTerra: expire-park 3+ ladder bids → Claim all parked → one tx, all rows → refunded lifecycle.
  • Manual: 1 parked row → no Claim all; single claim still works.
  • Manual: > 30 parked (if reproducible) → chunked batches or cap message per implementation choice.
  • Playwright (optional): extend limit-orders tx spec with parked claim-all happy path when e2e harness supports expiry park.

Test plan — attack / abuse vectors

  • Unauthorized ids: UI only submits indexed parkedExpired ids for connected wallet — cannot inject foreign ids via devtools without revert (on-chain owner check).
  • Double claim: claim already-refunded id → whole batch reverts; UI shows humanized error, no partial indexer corruption.
  • Pause bypass: Claim all while paused → button disabled; forced broadcast reverts Paused.
  • Duplicate ids: client dedupes order ids before submit (defense in depth; contract also rejects duplicates).
  • Gas griefing: batch capped at 30; UI does not loop unbounded prompts without user confirm per chunk.

Verification criteria

  • npm test / Vitest for new hook + panel tests pass.
  • npm run build (frontend) clean.
  • Manual: 5 parked rows → 1 tx vs 5× single claim; document gas used in PR.
  • Indexer: N claim_expired_limit_order lifecycle updates from one batch tx (existing parser).
  • QA sign-off on /trade and /limits with wallet connected.
## Summary Add a **Claim all parked** control to **`LimitOrderMyPlacementsPanel`** so makers with multiple **`lifecycle_status: parked_expired`** rows can recover escrow in **one on-chain transaction** via **`ClaimExpiredLimitOrders`**, mirroring the **Cancel all mine** batch UX shipped in [GitLab #246](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/246). ## Current codebase - **Shared placements UI:** [`frontend-dapp/src/components/trade/LimitOrderMyPlacementsPanel.tsx`](frontend-dapp/src/components/trade/LimitOrderMyPlacementsPanel.tsx) — used on **`/limits`** and **`/trade`** (compact variant). Partitions indexer rows via [`partitionLimitPlacementsByLifecycle`](frontend-dapp/src/utils/limitPlacementLifecycle.ts) into **`active`** vs **`parkedExpired`**. - **Per-row claim only:** each parked row renders an individual **Claim refund** button wired to inline `useMutation` → [`claimExpiredLimitOrder`](frontend-dapp/src/services/terraclassic/pair.ts) → pair **`ExecuteMsg::ClaimExpiredLimitOrder { order_id }`**. N parked rows ⇒ **N wallet prompts / N txs** at ~450k gas each. - **Batch claim already on-chain (no UI):** [GitLab #246](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/246) added **`ClaimExpiredLimitOrders { order_ids }`** in [`smartcontracts/contracts/pair/src/limit_batch_withdraw.rs`](smartcontracts/contracts/pair/src/limit_batch_withdraw.rs) and frontend service [`claimExpiredLimitOrders`](frontend-dapp/src/services/terraclassic/pair.ts). Gas model reuses **`gasLimitForLimitOrderCancelBatch(n)`** in [`terraGas.ts`](frontend-dapp/src/services/terraclassic/terraGas.ts) (400k + 80k×N). Indexer parses columnar batch claim attrs in [`indexer/src/indexer/parser.rs`](indexer/src/indexer/parser.rs). - **Cancel-all precedent (same panel family):** [`OrderBookPanel`](frontend-dapp/src/components/trade/OrderBookPanel.tsx) **Cancel all mine** uses shared [`useLimitOrderCancelMutation`](frontend-dapp/src/hooks/useLimitOrderCancelMutation.ts) (`number | number[]`) → batch when `orderIds.length > 1`. - **Pause / L6:** claim (single or batch) is **blocked while pair is paused** — buttons disabled with copy **Unavailable (pair paused)** ([GitLab #120](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/120)). - **Error humanization:** [`limitClaimUserMessage.ts`](frontend-dapp/src/utils/limitClaimUserMessage.ts) maps **`NoExpiredLimitClaim`** for single claims via [`humanizeTerraTxError`](frontend-dapp/src/utils/humanizeTerraTxError.ts). - **Agent playbook:** [`skills/AGENTS_FRONTEND_LIMIT_PARKED_EXPIRED.md`](skills/AGENTS_FRONTEND_LIMIT_PARKED_EXPIRED.md) · product invariants in [`docs/limit-orders.md` § parked-expired recovery](docs/limit-orders.md#dapp-retail-form-wires-invariants) · contract **L11** in [`docs/contracts-security-audit.md`](docs/contracts-security-audit.md). ## Why this is needed Ladder traders and market makers can accumulate **many parked-expired** rows after expiry parks during taker walks. Today they must click **Claim refund** per row — poor UX, high cumulative gas (~4.5M for 10 claims vs ~1.2M batch), and unnecessary wallet friction. On-chain + indexer support exists from #246; only the **placements panel UI + shared mutation hook** are missing. ## Constraints / guardrails - **Reuse existing batch execute path** — call **`claimExpiredLimitOrders`**, do not add new contract messages. - **Cap:** batch size ≤ **30** ids (pair `max_batch_rungs` / `MAX_LIMIT_BATCH_RUNGS_HARD_CAP`). If indexed parked count exceeds cap, UI must **chunk** (multiple batch txs) or **disable Claim all** with clear copy — document chosen behavior in PR. - **All-or-nothing on-chain:** any invalid / foreign / already-claimed id in the vec reverts the **whole** tx — client must only submit ids from **`parkedExpired`** rows for the connected wallet on this pair. - **Pause (L6):** disable **Claim all** when **`isPairPaused`** (same as per-row claim). - **Indexer lag:** do not submit ids that are **`parked_expired` in UI but already `refunded` on-chain** — optional preflight via stale-row filter or rely on revert + humanized error (extend [`limitClaimUserMessage.ts`](frontend-dapp/src/utils/limitClaimUserMessage.ts) for batch failures if needed). - **Single parked row:** **Claim all** hidden or disabled; keep per-row **Claim refund** (or route single id to **`claimExpiredLimitOrder`** for gas parity with cancel-all pattern). - **Query invalidation:** match existing claim success path — `limitPlacements`, book previews, **`tokenBalance`**. - **No new indexer work** expected (batch claim parser landed in #246) unless attrs differ from spec — verify ingestion in QA. ## Relevant files | Area | Files | |------|-------| | UI | `frontend-dapp/src/components/trade/LimitOrderMyPlacementsPanel.tsx` | | New hook (recommended) | `frontend-dapp/src/hooks/useLimitExpiredClaimMutation.ts` (mirror `useLimitOrderCancelMutation`) | | Service | `frontend-dapp/src/services/terraclassic/pair.ts` (`claimExpiredLimitOrder`, `claimExpiredLimitOrders`) | | Gas | `frontend-dapp/src/services/terraclassic/terraGas.ts` (`gasLimitForLimitOrderCancelBatch`, `getGasLimitForTx`) | | Lifecycle / copy | `frontend-dapp/src/utils/limitPlacementLifecycle.ts`, `frontend-dapp/src/utils/limitClaimUserMessage.ts` | | Consumers | `frontend-dapp/src/pages/LimitOrdersPage.tsx`, `frontend-dapp/src/components/trade/TradeOrderTicket.tsx` (mount panel only) | | Docs / skills | `docs/limit-orders.md`, `docs/frontend.md`, `skills/AGENTS_FRONTEND_LIMIT_PARKED_EXPIRED.md` | | Tests | Vitest for hook/panel; optional Playwright extension to `frontend-dapp/e2e/limit-orders-tx.spec.ts` | ## Recommended solution direction 1. **Extract shared claim mutation** — `useLimitExpiredClaimMutation(pairAddr, walletAddress)` accepting **`number | number[]`**: length 1 → `claimExpiredLimitOrder`; length > 1 → `claimExpiredLimitOrders`. Same invalidation + sounds as today's inline mutation. 2. **Panel UI** — in **Expired — refund pending** section header, add **Claim all parked (N)** button when `parkedExpired.length > 1`: - Confirm dialog: *Claim all N expired refund(s) in one transaction?* - Disabled when: wallet disconnected, pair paused, mutation pending, or zero parked rows. - Per-row buttons remain for single-order recovery and in-flight feedback. 3. **Cap handling** — if `parkedExpired.length > 30`, either batch in chunks of 30 with sequential txs (confirm once per chunk) or show inline notice + cap button at 30 — prefer **chunked batch** with progress copy over silent omission. 4. **Gas display (optional):** show estimated LUNC fee using `gasLimitForLimitOrderCancelBatch(N)` + `estimateFeeUlunaAmountForGasLimit` in confirm dialog (nice-to-have, not blocking). 5. **Docs:** update `docs/limit-orders.md` parked-expired bullet + `skills/AGENTS_FRONTEND_LIMIT_PARKED_EXPIRED.md` with Claim all behavior and crosslink #246 / this issue. ## Acceptance criteria - [ ] **Claim all parked** visible when ≥ 2 **`parkedExpired`** rows for connected wallet on current pair (both `/limits` and `/trade` compact panel). - [ ] One batch tx claims all listed parked ids (≤ 30 per tx); refunds arrive as ≤ 2 CW20 transfers on-chain. - [ ] Single parked row: no **Claim all**; per-row **Claim refund** unchanged. - [ ] **Claim all** disabled while pair paused; per-row buttons match existing pause copy. - [ ] Successful batch claim invalidates placements + balances; parked rows disappear after indexer catches up. - [ ] Shared hook used by panel (inline mutation removed or delegated). - [ ] Docs + agent skill updated with Claim all invariants. ## Test plan — functional paths - [ ] Vitest: hook selects single vs batch execute msg by id count; normalizes invalid ids. - [ ] Vitest / RTL: panel renders **Claim all** only when `parkedExpired.length >= 2`; disabled when paused / disconnected. - [ ] Vitest: confirm dialog copy includes count N. - [ ] Manual LocalTerra: expire-park 3+ ladder bids → **Claim all parked** → one tx, all rows → `refunded` lifecycle. - [ ] Manual: 1 parked row → no Claim all; single claim still works. - [ ] Manual: > 30 parked (if reproducible) → chunked batches or cap message per implementation choice. - [ ] Playwright (optional): extend limit-orders tx spec with parked claim-all happy path when e2e harness supports expiry park. ## Test plan — attack / abuse vectors - [ ] **Unauthorized ids:** UI only submits indexed **`parkedExpired`** ids for connected wallet — cannot inject foreign ids via devtools without revert (on-chain owner check). - [ ] **Double claim:** claim already-refunded id → whole batch reverts; UI shows humanized error, no partial indexer corruption. - [ ] **Pause bypass:** Claim all while paused → button disabled; forced broadcast reverts `Paused`. - [ ] **Duplicate ids:** client dedupes order ids before submit (defense in depth; contract also rejects duplicates). - [ ] **Gas griefing:** batch capped at 30; UI does not loop unbounded prompts without user confirm per chunk. ## Verification criteria - [ ] `npm test` / Vitest for new hook + panel tests pass. - [ ] `npm run build` (frontend) clean. - [ ] Manual: 5 parked rows → 1 tx vs 5× single claim; document gas used in PR. - [ ] Indexer: N **`claim_expired_limit_order`** lifecycle updates from one batch tx (existing parser). - [ ] QA sign-off on `/trade` and `/limits` with wallet connected. ## Related - Depends on: [GitLab #246](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/246) (batch claim execute + service) - Product: [GitLab #141](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/141) (parked-expired UX), [GitLab #142](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/142) (indexer lifecycle)
PlasticDigits commented 2026-05-31 13:50:41 +00:00 (Migrated from gitlab.com)

mentioned in commit b5d3664f45

mentioned in commit b5d3664f453cc53bd76956e061eb223b8008672e
PlasticDigits commented 2026-05-31 13:50:48 +00:00 (Migrated from gitlab.com)

Implementation complete (merged to main @ b5d3664)

Added Claim all parked (N) to LimitOrderMyPlacementsPanel on /limits and /trade (compact), mirroring the Cancel all mine batch UX from #246.

What changed

  • useLimitExpiredClaimMutation — shared hook: 1 id → claimExpiredLimitOrder; 2+ ids → claimExpiredLimitOrders (same invalidation + sounds as per-row claim).
  • limitExpiredClaimBatch — dedupe/sort ids, chunk at 30 (MAX_LIMIT_BATCH_RUNGS_HARD_CAP), confirm copy per chunk.
  • Panel UI — section header button when ≥ 2 parked_expired rows; hidden for single row; disabled when wallet disconnected or pair paused (L6).
  • Docs — docs/limit-orders.md invariants (#253), docs/frontend.md gas table, skills/AGENTS_FRONTEND_LIMIT_PARKED_EXPIRED.md QA checklist.

Verification checklist (QA agent team — please sign off)

  • /limits + /trade compact: Claim all parked (N) visible when N ≥ 2 parked rows for connected wallet; absent when N = 1.
  • Confirm dialog shows count; one batch tx refunds all listed ids (≤ 30 per tx).
  • N > 30: sequential chunked batches with confirm per chunk (progress copy in dialog).
  • Pair paused: Claim all + per-row buttons disabled (Unavailable (pair paused)).
  • Successful batch claim invalidates placements + balances; rows disappear after indexer catch-up.
  • Double-claim / stale id: whole batch reverts; humanized error via existing limitClaimUserMessage path.
  • Vitest: useLimitExpiredClaimMutation.test.tsx, limitExpiredClaimBatch.test.ts, LimitOrderMyPlacementsPanel.test.tsx — all pass locally.

Automated tests run

  • npm test -- --run on the three Vitest files above — 12/12 passed.

Follow-ups (optional)

  • Playwright happy path for claim-all when e2e harness supports expiry-park setup (issue test plan noted as optional).
  • Confirm-dialog gas estimate (nice-to-have from issue spec; not implemented).

Requesting verification from @qa agent team on LocalTerra with 3+ parked-expired ladder rows (gas compare: 1 batch vs N single claims).

Issue left open pending QA sign-off.

## Implementation complete (merged to `main` @ b5d3664) Added **Claim all parked (N)** to `LimitOrderMyPlacementsPanel` on `/limits` and `/trade` (compact), mirroring the **Cancel all mine** batch UX from #246. ### What changed - **`useLimitExpiredClaimMutation`** — shared hook: 1 id → `claimExpiredLimitOrder`; 2+ ids → `claimExpiredLimitOrders` (same invalidation + sounds as per-row claim). - **`limitExpiredClaimBatch`** — dedupe/sort ids, chunk at **30** (`MAX_LIMIT_BATCH_RUNGS_HARD_CAP`), confirm copy per chunk. - **Panel UI** — section header button when **≥ 2** `parked_expired` rows; hidden for single row; disabled when wallet disconnected or pair paused (L6). - **Docs** — `docs/limit-orders.md` invariants (#253), `docs/frontend.md` gas table, `skills/AGENTS_FRONTEND_LIMIT_PARKED_EXPIRED.md` QA checklist. ### Verification checklist (QA agent team — please sign off) - [ ] `/limits` + `/trade` compact: **Claim all parked (N)** visible when **N ≥ 2** parked rows for connected wallet; absent when **N = 1**. - [ ] Confirm dialog shows count; one batch tx refunds all listed ids (≤ 30 per tx). - [ ] **N > 30**: sequential chunked batches with confirm per chunk (progress copy in dialog). - [ ] Pair **paused**: Claim all + per-row buttons disabled (`Unavailable (pair paused)`). - [ ] Successful batch claim invalidates placements + balances; rows disappear after indexer catch-up. - [ ] Double-claim / stale id: whole batch reverts; humanized error via existing `limitClaimUserMessage` path. - [ ] Vitest: `useLimitExpiredClaimMutation.test.tsx`, `limitExpiredClaimBatch.test.ts`, `LimitOrderMyPlacementsPanel.test.tsx` — all pass locally. ### Automated tests run - `npm test -- --run` on the three Vitest files above — **12/12 passed**. ### Follow-ups (optional) - Playwright happy path for claim-all when e2e harness supports expiry-park setup (issue test plan noted as optional). - Confirm-dialog gas estimate (nice-to-have from issue spec; not implemented). **Requesting verification from @qa agent team** on LocalTerra with 3+ parked-expired ladder rows (gas compare: 1 batch vs N single claims). Issue left **open** pending QA sign-off.
PlasticDigits commented 2026-05-31 13:52:01 +00:00 (Migrated from gitlab.com)

mentioned in issue #259

mentioned in issue #259
PlasticDigits commented 2026-05-31 13:52:01 +00:00 (Migrated from gitlab.com)

marked as related to #259

marked as related to #259
Brouie commented 2026-06-02 16:07:55 +00:00 (Migrated from gitlab.com)

Heads up on #253 — the Claim-all panel test is red on main.

LimitOrderMyPlacementsPanel.test.tsx asserts the exact Claim-all confirm string, but #259 (2e6f2cf) added the gas-estimate suffix to that copy ("... Est. ~X LUNC gas (saves ~Y LUNC vs N separate claims).") and didn't update this panel test, so it has failed since that merge:

expected '...in one transaction?'
received '...in one transaction? Est. ~15.86 LUNC gas (saves ~9.63 LUNC vs 2 separate claims).'

Feature's fine — just a stale assertion. Fix: match the stable prefix via stringContaining; the exact gas copy is already covered by regex in limitExpiredClaimBatch.test.ts, so no coverage loss. The three #253 vitest files go 13/13 with that. MR incoming.

Still to come: browser Claim-all sign-off with a few seeded parked-expired rows (one batch tx vs N single claims).

Heads up on #253 — the Claim-all panel test is red on main. LimitOrderMyPlacementsPanel.test.tsx asserts the exact Claim-all confirm string, but #259 (2e6f2cf) added the gas-estimate suffix to that copy ("... Est. ~X LUNC gas (saves ~Y LUNC vs N separate claims).") and didn't update this panel test, so it has failed since that merge: expected '...in one transaction?' received '...in one transaction? Est. ~15.86 LUNC gas (saves ~9.63 LUNC vs 2 separate claims).' Feature's fine — just a stale assertion. Fix: match the stable prefix via stringContaining; the exact gas copy is already covered by regex in limitExpiredClaimBatch.test.ts, so no coverage loss. The three #253 vitest files go 13/13 with that. MR incoming. Still to come: browser Claim-all sign-off with a few seeded parked-expired rows (one batch tx vs N single claims).
Brouie commented 2026-06-02 16:08:29 +00:00 (Migrated from gitlab.com)

mentioned in merge request !736

mentioned in merge request !736
Brouie commented 2026-06-02 16:23:07 +00:00 (Migrated from gitlab.com)

Live Claim-all sign-off on LocalTerra (dev wallet, /limits) — the batch path works end to end.

Setup: 2 parked-expired bids for the maker (order 128 @ 2, 129 @ 1.99; ExpiredLimitRefund remaining 9996 each after the 4 bps maker fee).

Walkthrough:

  • "Claim all parked (2)" rendered in the Expired — refund pending section (>= 2 parked rows).
  • Confirm dialog showed the count + gas estimate: "Claim all 2 expired refund(s) in one transaction? Est. ~15.86 LUNC gas (saves ~9.630 LUNC vs 2 separate claims)."
  • Confirm -> ONE ClaimExpiredLimitOrders tx (DDEAC2E7...) claimed both ids.

On-chain after:

  • expired_limit_refund{order_id:128} and {order_id:129} both return null -> both parked refunds released in that single tx.
  • Maker CORAL refunded (2 x 9996); both rows dropped from the placements feed (acceptance: parked rows disappear after claim).

Acceptance criteria:

  • Claim all parked visible at >= 2 parked rows; one batch tx claims all listed ids.
  • Successful batch claim invalidates placements + balances; rows disappear after indexer catch-up.
  • Single-row (no Claim all) and paused-disabled paths covered by the panel unit tests.
  • Shared useLimitExpiredClaimMutation used by the panel.

Unit: the three #253 vitest files pass 13/13 after the stale-assertion fix in LimitOrderMyPlacementsPanel.test.tsx (MR !736 — the test had gone red on main when #259 added the gas-estimate suffix to the confirm copy).

Good to close from my side once !736 lands. @PlasticDigits

Live Claim-all sign-off on LocalTerra (dev wallet, /limits) — the batch path works end to end. Setup: 2 parked-expired bids for the maker (order 128 @ 2, 129 @ 1.99; ExpiredLimitRefund remaining 9996 each after the 4 bps maker fee). Walkthrough: - "Claim all parked (2)" rendered in the Expired — refund pending section (>= 2 parked rows). - Confirm dialog showed the count + gas estimate: "Claim all 2 expired refund(s) in one transaction? Est. ~15.86 LUNC gas (saves ~9.630 LUNC vs 2 separate claims)." - Confirm -> ONE ClaimExpiredLimitOrders tx (DDEAC2E7...) claimed both ids. On-chain after: - expired_limit_refund{order_id:128} and {order_id:129} both return null -> both parked refunds released in that single tx. - Maker CORAL refunded (2 x 9996); both rows dropped from the placements feed (acceptance: parked rows disappear after claim). Acceptance criteria: - [x] Claim all parked visible at >= 2 parked rows; one batch tx claims all listed ids. - [x] Successful batch claim invalidates placements + balances; rows disappear after indexer catch-up. - [x] Single-row (no Claim all) and paused-disabled paths covered by the panel unit tests. - [x] Shared useLimitExpiredClaimMutation used by the panel. Unit: the three #253 vitest files pass 13/13 after the stale-assertion fix in LimitOrderMyPlacementsPanel.test.tsx (MR !736 — the test had gone red on main when #259 added the gas-estimate suffix to the confirm copy). Good to close from my side once !736 lands. @PlasticDigits
Brouie commented 2026-06-02 18:00:12 +00:00 (Migrated from gitlab.com)

mentioned in issue #246

mentioned in issue #246
PlasticDigits commented 2026-06-03 01:59:00 +00:00 (Migrated from gitlab.com)

mentioned in commit 487f46569a

mentioned in commit 487f46569a693c6447f68d5b9b2c276bd6e722e9
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-06-03 01:59:48 +00:00
PlasticDigits commented 2026-06-25 14:12:57 +00:00 (Migrated from gitlab.com)

mentioned in issue #419

mentioned in issue #419
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
code/cl8y-dex-terraclassic#253
No description provided.