Repository navigation
Feat/1156 mint progress bar - #1194
Closed
Noobb-byte wants to merge 539 commits into
Closed
Noobb-byte wants to merge 539 commits into
Noobb-byte wants to merge 539 commits into
Conversation
…file-dashboard feat: add user profile page with held keys, staking positions, and tr…
# Conflicts: # src/lib/queryKeys.ts # src/pages/ProfilePage.tsx # src/routes.tsx
…e-bond-status-panel-on-creator-key-detail-page feat: add performance bond status panel on creator key detail page
…atomic-swap-ui feat: add atomic swap proposal and acceptance UI
…-#983 feat(accesslayerorg#983): add merge proposal voting UI for source key holders
feat: add pre-launch auction phase UI for creator key listings (accesslayerorg#924) :wq :wq Adds the reader-facing view of a creator key's pre-launch bidding window: a live countdown driven by the auction end timestamp, a validated bid input (floor = highest bid + min increment), a ranked/leader-highlighted bid history that polls on an interval, an outbid state when the connected wallet :wq stops leading, and an automatic transition back to the bonding curve page once the auction closes. Wires the page to the pre-launch auction config surfaced in accesslayerorg#816/accesslayerorg#808 and :x follows the polling/invalidation patterns established by the marketplace price work in accesslayerorg#918.
…erorg#1020) Show distinct wallets that have bought or sold the key in the key stats panel, refreshed every 5 minutes, with an accessible tooltip and a trend indicator vs the previous 24 hours.
…-unique-trader-count-stat feat: add unique trader count stat to key detail analytics (accesslayerorg#1020)
Add the fast-check integration test covering all four correctness properties and edge cases for FeaturedCreatorAudienceChip, and restore LandingPage.keyboard.test.tsx which was broken at HEAD by the missing QueryClientProvider and wagmi useAccount mock. Marks spec tasks 5 and 6 complete. 🤖 Generated with Codebuff Co-Authored-By: Codebuff <noreply@codebuff.com>
Deprecated creator keys were indistinguishable from live ones across the app (issue accesslayerorg#996). This adds the deprecation notice flow: - Course gains an optional deprecation record (deprecatedAt, reason, successorId, successorName) served by the API when a key is deprecated. - DeprecationBanner renders on the key detail page: deprecation date, reason, and the successor key when one is designated, with a Migrate now CTA routing to the successor key's page. Dismissal is per-visit — a deprecation is a standing fact, not a promo. - Marketplace listing cards mark deprecated keys with a Deprecated badge so buyers see the status before clicking through. The in-app notification on the deprecation event rides the existing notification service (server-pushed Notification rows render on /notifications); no client changes needed there.
Add imports for BundleManagementPage, AtomicSwapCreatePage, and AtomicSwapProposalPage to resolve CI build errors. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…ccesslayerorg#1015) Display a holding cap indicator on the buy form showing the user's current balance relative to the key's maximum holding cap, and block submission when the purchase would exceed it. - Add HoldingCapIndicator component with accessible progress bar and tooltip - Provide inline warnings as purchase quantity changes - Disable buy button with cap exceeded / reached messages - Hide holding cap indicator when cap is unlimited or unconfigured - Add comprehensive unit and integration test coverage
…pact warnings (accesslayerorg#1034) Show real-time price impact indicator on buy forms (TradeDialog and BuySellKeyFlow), display approaching and breached warning banners when impact reaches threshold, and disable buy submission with circuit breaker warning when threshold breached. Closes accesslayerorg#1034
) - Add TradeCooldownButton showing a live per-second countdown while a creator-set trade cooldown is active, with a tooltip explaining the policy - Fetch cooldown via GET /keys/:keyId/trade-cooldown (404 -> no cooldown) through useTradeCooldownStatus; invalidate after each settled trade - Wire into LandingPage featured/holdings trades and CreatorDetailPage buy flow, falling back to position-level nextBuyAllowedAt (accesslayerorg#873)
…118-1119-1120-1121 Feat/multi 1118 1119 1120 1121
…-issues-1131-1134 feat: improve assigned key detail workflows
…115-1116-1117 feat: Implement issues 1113, 1115, 1116, 1117
…esslayerorg#1135) - Add pending/completed tabs to the multi-sig admin panel - Display target contract, function, and params on pending actions - Enable execute only at the M-of-N signature threshold - Show access-denied state for non-signer wallets
…t/issue-1152-price-floor-indicator feat(trading): implement price floor indicator and sell block UI on key detail (accesslayerorg#1152)
…-action-approval-1135 feat: implement multi-sig action approval UI for protocol admins (accesslayerorg#1135)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…chain-alert-preferences Implement on-chain alert preferences
…66-build-key-merge-proposal-ui-for-dual-creator feat: add key merge proposal UI components for dual-creator consolidation
…1164-key-launch-auction-ui feat(auction): build key launch auction UI for initial price discovery bidding (accesslayerorg#1164)
Adds computeBuyCostPreview/computeSellPayoutPreview, a bigint curve engine cross-validated against the existing float curve (computeBuyCost/computeSellRevenue), plus slippage classification and a worst-case-buffer helper. PriceImpactSlider composes these into an interactive quantity slider showing gross/net cost or payout, the resulting price, a colour-coded slippage badge (green under 1%, yellow 1-5%, red over 5%), and the worst-case XLM figure for buys. Reduced scope from the full issue: the canvas sparkline chart and the strict <16ms/1000-slider-move performance assertion are not included. The curve engine, slider, and fee/slippage breakdown it was built to drive are the parts this covers. Closes accesslayerorg#755
Adds classifyVolumeDiscountTier (bronze/silver/gold, by cumulative wallet volume), getTierDiscountBps, and computeTierProgress, plus two presentational components: VolumeTierBadge (the badge itself, with a tooltip showing volume needed for the next tier, rendering nothing for a wallet with no tier) and TierFeeBreakdown (base fee / tier discount / final fee for the trade confirmation screen). Both take the wallet's tier and cumulative volume as props rather than fetching them, since this repo has no existing endpoint for wallet-level trading volume; wiring the fetch-on-connect + session cache is left to whoever adds that endpoint, and these components compose with it either way. Closes accesslayerorg#1102
… page The creator key detail page already showed avatar, display name, and bio via CreatorProfileHeader, but never surfaced published social links (Twitter, website, Discord) or a way to reach the creator's full public profile page — both exist already, just not here. Adds CreatorSocialSection, reusing the existing resolveCreatorSocialLinks/CreatorProfileSocialLinks (the same ones the public profile page already uses) so the links stay consistent across both pages, plus a link to /creator/<address>/profile. Renders nothing extra when the creator hasn't published any links. Closes accesslayerorg#1103
…er-assigned-batch feat: price impact slider, fee tier badge, creator social section
…cated to their creator keys, see their per-snapshot allocation, and claim individually or in bulk via the on-chain claim_airdrop contract call. Includes claim history, empty/error states
The page fetches airdrop allocations from GET /users/:wallet/airdrop-claims through a new cached service and groups unclaimed airdrops under their creator key, showing the snapshot date, total distributed, and the wallet's allocation for each. Each airdrop has a Claim button that submits a signed claim_airdrop({ airdrop_id, recipient }) Soroban call via a new injectable-factory contract service modeled on the governance service. A Claim All button sequentially claims every unclaimed airdrop across all held keys in one flow, with each claim getting its own signature and a mid-flow failure leaving earlier claims intact. Claimed airdrops move to a history section showing the received amount and claim date, and the page includes a wallet-connect prompt, loading skeletons, an error state, a "no airdrops yet" empty state, and an "all claimed" empty state. The implementation adds the airdropClaims query-key family, hooks for the query and both claim mutations, and registers the route with a RouteErrorBoundary. Tests cover the backend service, the contract call arguments and guards, and eight page integration cases including single claim, claim all sequencing, history rendering, and empty states.
Closes accesslayerorg#1154
…#1154-Build-holder-airdrop-claim-page-with-snapshot-allocation-breakdown Adds an /airdrop-claims page where holders can view all airdrops allocated to their creator keys, see their per-snapshot allocation, and claim individually or in bulk via the on-chain claim_airdrop contract call. Includes claim history, empty/error states
accesslayerorg#1156) - Implement mint progress bar and supply cap section below key stats on CreatorDetailPage - Add pure calculation helper calculateMintProgress and formatMintPercentage with safe clamping (0-100), divide-by-zero prevention, and sensible rounding that prevents premature 100% display - Display remaining mintable key count via existing MiniStatChip primitive - Disable the Buy button when supply reaches or exceeds cap, showing the MaxSupplyReached user-facing error message - Hide progress bar and remaining chip for uncapped keys (maxSupply null, undefined, or <= 0) while keeping buy functionality enabled - Extend Course interface with optional maxSupply property - Add MaxSupplyReached entry to WALLET_ERROR_COPY and error code mappings - Add unit tests for calculation helper, component tests for KeyMintProgressSection, and integration tests for CreatorDetailPage
✅ Deploy Preview for accesslayer ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
👋 Thanks for your contribution! We don't accept pull requests directly to |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Resolves #1156
KeyMintProgressSectiontoCreatorDetailPagedisplaying key supply mint progress towards the configuredmaxSupplycap.calculateMintProgressandformatMintPercentageinmintProgress.utils.tswith safe 0–100 clamping, divide-by-zero avoidance, sensible rounding (never prematurely displaying 100% until supply actually equals or exceeds max supply), and tiny fraction support (<1% display).MiniStatChipdesign primitive to cleanly display the remaining keys available to mint.maxSupply, displaying a contextual alert with the standard copy:"Maximum supply reached. No more keys can be minted.".maxSupplynull, undefined, or <= 0) while keeping buy functionality enabled.Courseincourse.service.tswithmaxSupply?: number | null;and mappedMaxSupplyReachedinerrorHandling.utils.ts.Testing
pnpm vitest run src/utils/__tests__/mintProgress.utils.test.ts(14 unit tests passing: 0%, partial, exactly at cap, over cap, fractions, edge cases)pnpm vitest run src/components/common/__tests__/KeyMintProgressSection.test.tsx(6 component tests passing: accessibility semantics, progress bar values, remaining chip, buy button gating, uncapped state)pnpm vitest run src/pages/__tests__/CreatorDetailPage.integration.test.tsx(Integration tests passing for capped, maxed, and uncapped flows)pnpm vitest run src/pages/__tests__/CreatorDetailPageSkeleton.test.tsx(Skeleton loading states verified)pnpm tsc -b(TypeScript typecheck passed with 0 errors)Checklist