Harden claimCred post-transaction lifecycle #347
Labels
No labels
agent:fix_bugfix
agent:fix_conflicts
agent:fix_security
agent:gap_analysis
agent:implement
agent:open_issues
agents
agent:security_audit
agent:verify
area
timecurve
arena
arena-v2
audit
block:feature_review
block:security
bug
contracts
design
devops
docs
documentation
enhancement
epic
feature
frontend
indexer
low priority
megaeth
operations
ops
performance
QA
qa checklist
referrals
removal
security
smart-contracts
tech-debt
testing
time-arena
timecurve
visual-qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
code/yieldomega#347
Loading…
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
Transition Gap Analysis (#342) — P1 #6.
Current codebase
ArenaCharmCredCard.tsxcallswriteContractAsync({ functionName: "claimCred", … })with nowaitForTransactionReceiptand no query invalidation.useArenaSaleSession.tsclaimWarBowFlagpattern:writeContractAsync→waitForWriteReceipt→refetchAll().ArenaSimplePage.tsxusesinvalidateArenaWalletStatsQueriesafter buys; CRED card does not.Why needed
After claiming CRED, wallet stats and claimable epoch UI stay stale until next poll — poor transition UX and inconsistent with WarBow flag claim.
Constraints / guardrails
claimWarBowFlagreceipt + invalidation pattern.ChainMismatchWriteBarrier(already wrapped).Relevant files
frontend/src/pages/arena/ArenaCharmCredCard.tsxfrontend/src/pages/arena/useArenaSaleSession.ts(reference)frontend/src/lib/arenaWalletXpOptimistic.ts(invalidateArenaWalletStatsQueries)frontend/src/hooks/useWalletStats.tsRecommended direction
claimCredtx,await waitForWriteReceipt(wagmiConfig, { hash }).invalidateArenaWalletStatsQueries(queryClient)(and any CRED-specific queries).Acceptance criteria
claimWritePending).ArenaCharmCredCard.test.tsxcovers success path invalidation.Test plan
cd frontend && npm run typecheck && npm run lint && npm testArenaCharmCredCard.test.tsxAttack / abuse test plan
Verification criteria
mentioned in issue #342
mentioned in commit
da317e1d3dmentioned in merge request !518
mentioned in commit
7e8129dc1aVerification — GitLab #347 (agent:verify)
Result: PASS —
claimCredpost-transaction lifecycle matchesclaimWarBowFlagreceipt + invalidation pattern onmain.Acceptance criteria
executeClaimCredawaitswaitForWriteReceipt;ArenaCharmCredCardkeepsclaimSubmittinguntilexecuteClaimCredresolves (claimPending = claimWritePending || claimSubmitting). Playwright: claim button disabled during tx+receipt wait.invalidateArenaWalletStatsQueries(queryClient)called only afterreceipt.status === "success". Playwright: CRED balance text updated without page reload; indexerclaimable_cred→0within one poll cycle.disabled={!claimReady || claimPending || !address}; Playwright asserted disabled immediately after click.ArenaCharmCredCard.test.tsxcovers success path invalidationcd frontend && npm test— 8 tests inArenaCharmCredCard.test.tsx+ 4 inarenaCharmCredClaim.test.ts.Test plan
cd frontend && npm run typecheck && npm run lint && npm testArenaCharmCredCard.test.tsx,arenaCharmCredClaim.test.tsANVIL_E2E=1) + Playwright mock wallet: claim after epoch 0 endGET /v1/arena/wallet/{addr}/statsclaimable_credclearedAttack / abuse checks
executeClaimCred does not invalidate on reverted receipt (#347)inArenaCharmCredCard.test.tsxandarenaCharmCredClaim.test.tsclaimPending; Playwright asserted disabled state on clickImplementation reference (already on
main)frontend/src/lib/arenaCharmCredClaim.ts—executeClaimCred: write → receipt → invalidatefrontend/src/pages/arena/ArenaCharmCredCard.tsx— wires helper withChainMismatchWriteBarrier, error toast viafriendlyRevertFromUnknownINV-FRONTEND-347-CLAIM-CRED-LIFECYCLEindocs/testing/invariants-and-business-logic.mddocs/frontend/arena-views.md§ claim-cred-post-tx-lifecycleNo repo changes required; closing issue.