Retail limit order UX: open orders, fees, claims, and min_return #419
Labels
No labels
agent:fix_bugfix
agent:fix_conflicts
agent:fix_security
agent:gap_analysis
agent:implement
agent:implement
agent:implement
agent:open_issues
agent:ready
agent:research
agent:security_audit
agent:verify
architecture
backend
blocker:hybrid
blocker:launch
blocker:limit-orders
blocker:v2
block:log_only
block:security
bug
ci
contracts
correctness
deploy
dev
devops
docs
documentation
duplicate
e2e
enhancement
epic
feature
frontend
functional-completion
gas
good first issue
governance
help wanted
high-risk
hooks
hybrid
indexer
infra
infrastructure
integrators
invalid
launch-blocker
limit-orders
localnet
localterra
low priority
missing-implementation
needs-design
ops
performance
priority
high
priority
medium
product
qa
QA
question
ready
ready
research
scripts
security
security-hardening
smartcontracts
tech-debt
testing
ux
UX
v2
verification
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
code/cl8y-dex-terraclassic#419
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Parent
#411 — Updated Gap Analysis (recommendation 12 + contract migration surprises §1.4)
Current codebase
UX gaps vs CEX expectations:
TradeOrderTicket.tsx,LimitOrdersPage.tsx) — CEX shows open orders with one-click cancel.LimitOrderMyPlacementsPanel.tsxexists on/tradebut not surfaced as primary flow on/limits.LimitOrderPreSubmitSummary.tsxexplains maker fee as "½ of Y bps effective swap fee" — maker fee charged at placement (orderbook.rs,limit_placement.rs).LIMIT_ORDER_DUST_FLUSH_THRESHOLD).min_returnorbelief_price(max_spread.rs); router may omitbelief_price— not obvious in UI.orderbook.rs,pair/contract.rs).Indexer already exposes
GET /traders/{addr}/limit-placements(#217) and order book panels support wallet-scoped cancel (#162).Why needed
Limit orders are the primary differentiator from pool-only DEXes. CEX migrants expect order management, clear fee timing, and plain-language partial-fill / claim flows.
Constraints / guardrails
min_returnenforcement is on net after hook fees — surface in pre-submit (#1167–1186execute_swap).Relevant files
frontend-dapp/src/components/trade/LimitOrderMyPlacementsPanel.tsxfrontend-dapp/src/components/trade/TradeOrderTicket.tsxfrontend-dapp/src/pages/LimitOrdersPage.tsxfrontend-dapp/src/components/trade/LimitOrderPreSubmitSummary.tsxfrontend-dapp/src/components/trade/OrderBookPanel.tsxfrontend-dapp/src/services/indexer/client.ts(getTraderLimitPlacements)smartcontracts/contracts/pair/src/orderbook.rssmartcontracts/contracts/pair/src/contract.rsdocs/limit-orders.mdRecommended direction
/limitsand/tradelimit tab to wallet placements list; one-click cancel from row (#162).min_returnrequirement and 10% minimum pool leg (#307) in plain language.Acceptance criteria
min_return/ belief price requirement surfaced before hybrid limit/market submit.Test plan
LimitOrderMyPlacementsPanel.test.tsx,TradePage.test.tsx(#162, #161, #253)make test-frontendmake test-contracts— no contract changes expected; run if copy references new fieldslimit-order*.spec.tsif cancel flow changesAttack / abuse test plan
order_id(on-chain enforced).Verification criteria
getTraderLimitPlacementsused (not raw Order ID form as primary).docs/limit-orders.mdupdated for retail fee/claim flows if copy moves there.mentioned in issue #411
mentioned in commit
15802093edmentioned in merge request !944
mentioned in commit
aac5dcea3amentioned in commit
3974e8f899mentioned in merge request !945
Verification summary — #419 (Retail limit order UX)
Verified on
main@6ffd7f44with LocalTerra (make setup-cloud-localterra --fresh --skip-build).Acceptance criteria
LimitOrderMyPlacementsPanelabove place form on/limits;getTraderLimitPlacementswired inLimitOrdersPage/TradeOrderTicket; VitestLimitOrderMyPlacementsPanel.test.tsx(#419 cancel); E2Elimit-orders-tx.spec.tscancel vialimits-page-cancel-placement-*(after local helper fix below)LimitOrderPreSubmitSummary.test.tsx— "Small fee taken from your escrow at placement" + percent labellimit-orders-claim-all-tx.spec.ts(Claim all parked batch tx)min_return/ belief price surfaced before hybrid market submitTradeMarketOrderPanel.submitSnapshot.test.tsx(#419) —trade-market-hybrid-min-return-noticewith 10% pool-leg copylimit-order-pre-submit-summary-maker-feeassertionVerification criteria
getTraderLimitPlacementsused (not raw Order ID as primary)docs/limit-orders.md§ retail form (#419); Advanced Order ID in collapsed<details>docs/limit-orders.mdupdated for retail fee/claim flowsAutomated test runs
make test-frontend— 1084 passedmake test-contracts— pass (no contract changes)playwright e2e/limit-orders-tx.spec.ts(cancel test only, with helper fix) — 1 passedplaywright e2e/limit-orders-claim-all-tx.spec.ts— 1 passedlimit-orders-tx.spec.tssuite — place + cancel pass; 5-rung ladder fail (submit stayed disabled — appears unrelated to #419; pre-existing/env)Finding — E2E drift (fix prepared, MR blocked)
limit-orders-tx.spec.tsstill targeted the removed primary Cancel by order ID card. During verification I updated:frontend-dapp/e2e/helpers/limit-e2e.ts—myOpenLimitsPanel+ panel cancel with confirm dialogfrontend-dapp/e2e/limit-orders-tx.spec.ts— cancel vialimits-page-cancel-placement-*skills/AGENTS_E2E_LIMIT_ORDERS_TX.md— invariant rowChanges are staged on branch
issue-419-verify-e2e-panel-cancel. Could not open MR: this VM has noGIT_USERNAME/GIT_EMAIL(commit rejected). Please commit/push that branch and open a non-draft MR againstmain.Follow-ups
limit-orders-tx.spec.ts(unrelated to #419 scope).Issue left open pending the E2E MR; feature implementation on
mainmeets acceptance criteria.mentioned in commit
4d45409e43mentioned in merge request !950
mentioned in commit
8c56f4b84bVerification summary — #419 (Retail limit order UX)
Verified on
main@8c56f4b8with LocalTerra (./scripts/setup-cloud-agent-localterra.sh --fresh --skip-build).Acceptance criteria
LimitOrderMyPlacementsPanelabove place form on/limits(limits-my-open-limits);getTraderLimitPlacementsinLimitOrdersPage/TradeOrderTicket; Advanced Order ID only in collapsed<details>; VitestLimitOrderMyPlacementsPanel.test.tsx; E2Elimit-orders-tx.spec.tscancel vialimits-page-cancel-placement-*LimitOrderPreSubmitSummary.test.tsx— "Small fee taken from your escrow at placement" + percent label + Learn more linklimit-orders-claim-all-tx.spec.tsbatch claim txmin_return/ belief price surfaced before hybrid market submitTradeMarketOrderPanel.submitSnapshot.test.tsx—trade-market-hybrid-min-return-noticewith 10% pool-leg copyUnavailable (pair paused)limit-order-pre-submit-summary-maker-feeassertionVerification criteria
getTraderLimitPlacementsused (not raw Order ID as primary)docs/limit-orders.md§ retail form (#419)docs/limit-orders.mdupdated for retail fee/claim flowsAutomated test runs
make test-frontend— 1084 passedmake test-contracts— passplaywright e2e/limit-orders-tx.spec.ts -g "cancel limit via my open limits panel"— 1 passedplaywright e2e/limit-orders-claim-all-tx.spec.ts— 1 passedNotes
main(8c56f4b8).Closing as verified.
mentioned in merge request !1041
mentioned in issue #530