Skip to content

Feat/1156 mint progress bar - #1194

Closed
Noobb-byte wants to merge 539 commits into
accesslayerorg:mainfrom
Noobb-byte:feat/1156-mint-progress-bar
Closed

Noobb-byte wants to merge 539 commits into
accesslayerorg:mainfrom
Noobb-byte:feat/1156-mint-progress-bar

Conversation

@Noobb-byte

Copy link
Copy Markdown
Contributor

Summary

Resolves #1156

  • Mint Progress Bar & Supply Cap: Added a dedicated KeyMintProgressSection to CreatorDetailPage displaying key supply mint progress towards the configured maxSupply cap.
  • Pure Calculation Helpers: Implemented calculateMintProgress and formatMintPercentage in mintProgress.utils.ts with 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).
  • Remaining Mintable Keys: Integrated the existing MiniStatChip design primitive to cleanly display the remaining keys available to mint.
  • Cap Enforcement & Error Copy: Automatically disables the "Buy Key" button when supply meets or exceeds maxSupply, displaying a contextual alert with the standard copy: "Maximum supply reached. No more keys can be minted.".
  • Uncapped Key Handling: Cleanly hides the progress bar and remaining stat chip for uncapped keys (maxSupply null, undefined, or <= 0) while keeping buy functionality enabled.
  • Type Definitions & Error Mapping: Extended Course in course.service.ts with maxSupply?: number | null; and mapped MaxSupplyReached in errorHandling.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

Chucks1093 and others added 30 commits September 27, 2026 08:19
…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)
cryptBeckley and others added 27 commits October 18, 2026 10:23
…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
@netlify

netlify Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for accesslayer ready!

Name Link
🔨 Latest commit dc6efef
🔍 Latest deploy log https://app.netlify.com/projects/accesslayer/deploys/6ad644e108019627e76e9ab7
😎 Deploy Preview https://deploy-preview-1194--accesslayer.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@github-actions

Copy link
Copy Markdown

👋 Thanks for your contribution! We don't accept pull requests directly to main. Please re-open your PR targeting the dev branch instead. See our contributing guide for details.

@github-actions github-actions Bot closed this Oct 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.