The front-end for the finalized minted-holding interaction model — how a holder or a team works with a Stack (a fungible bucket with a quantity) versus a Single (an individualized unit). One consolidated reference for every surface where you can meet a stackable holding: the wallet, collection minted-token inventory, vendor inventory, the launchpad, claiming, and the marketplace. Backend is built; these are the FE locations that drive it.
01The rules every surface obeysDeveloper reference — not a screen. The same canonical checks gate every stack operation, everywhere; the UI just exposes them per surface. These six hold across the wallet, inventory, launchpad, claim and marketplace (rules 3, 5 and 6 updated/added per the 2026-07-21 rulings).
Two holdings only stack when all match. token_id is the family, variant is the class, the frozen resale split rides along — different-split copies of the same token coexist as separate stacks, never silently merge. Never-vendored copies get the R11 fallback split stamped at their first ownership event (ruled 2026-07-21), so "unset vs unset" never arises in the compatibility check.
Variant is identity everywhere
Every variant is its own line — never a mixed-variant stack. Combine and Merge scope to a single variant; holdings of other variants are greyed out as ineligible, and copy names the variant (“2 Red stacks”), not just “identical copies”.
Listed or locked blocks every mutation
A holding that is listed for sale, mid-claim, redemption-locked (ruled 2026-07-21 — locked from the moment Redeem is pressed until paid-and-shipped or cancelled; auto-cancels unpaid after 30 days), or in an in-flight operation is action-locked: Split, Unstack, Merge, Combine, Compact and Transfer are all blocked until the listing is cancelled or the lock clears. (Redeemable tokens are RWA 1/1s, so the redemption lock never meets a stack tool in practice — but the shared Transfer path honours it.)
No rollback → seams are benign
On the IC a failed step never reverses a committed one. Two-step flows (split-then-open, split-then-transfer) are designed so a half-finished sequence loses nothing — the split Single simply stays, ready to retry.
Copy identity exists from mint
Ruled 2026-07-21 (#480): a quantity mint of N allocates N copy_sequence values up front and the stack holds them as a set — split partitions the set, merge unions it, unstack materializes its members. Ledger events always carry copy identity + quantity (R43); sequences are never invented later.
Large operations run as capped batches
Ruled 2026-07-21 (#480): unstack-all / compact over big stacks execute as bounded per-call batches (~100 units; dev tunes the number) with client-driven continuation carrying an idempotency key — resumable by construction, no job runner in V1.
Which operations live on which surface
Operation
Wallet
Collection inventory
Vendor inventory
Claim / Launchpad
Marketplace
Split stack (N)
✓
✓
✓
—
—
Merge (drag / fold)
✓
✓
✓
—
—
Combine (multi-select)
✓
✓
✓
—
—
Compact all
✓
✓
✓
—
—
Unstack (1 / all)
✓
opt.
opt.
—
—
Transfer amount (partial)
✓
✓
✓
—
—
Claim / buy partial quantity
—
—
—
✓
✓
Unstack is a wallet convenience (break a stack into individually transferable/burnable Singles); it may be omitted on creator/vendor surfaces where per-unit individualization isn’t needed. Claim and marketplace never mutate a stack’s structure — they draw units off it at a per-unit price (R41). On the vendor surface these tools run through Select while the vendor is Paused; returning stock is “Remove from vendor” (it returns to the collection), never a “transfer back”.
02Wallet · the stack holding & its actionsMy Tokens is the wallet home — a grid of the canonical token card. A stack shows a ×N badge on its artwork; a single shows its edition. The grid card carries no buttons: opening a stack goes to its token detail page, where Split / Unstack / Merge live as an inline Stack panel (frame 03 — reworked 2026-07-21; the old Stack-actions modal is retired). Everything is scoped to the stack’s token + variant and blocked while it is listed or locked.
My Tokens
k1m9…7uvw
Wallet
My Tokens.
Everything owned by your connected principal. Stacks show a quantity; singles show their edition.
03Wallet · stack detail — the inline Stack panelReworked 2026-07-21 (Donna): a stack uses the same token detail page as any wallet token (canonical anatomy: my-tokens gallery, frame 07) — same asset column, same info card, same footer actions. The one addition is a Stack section inline in the right column: Split, Unstack and Merge as rows, right where the token already is. The old Stack-actions modal is retired — a floating card repeating a tiny thumbnail of the token you're already looking at wasted the space. Split peels N (1 ≤ N < quantity) into a new stack (12 → 8 + 4); Unstack materializes individual tokens (one, or all — large unstacks continue automatically in capped batches, ruled 2026-07-21); Merge lists your other eligible stacks of the same token + variant (unlocked, matching split) and folds them in. Combining from the grid and Compact stay in Select mode (frame 04). This frame also absorbs my-tokens' old frame 08 (moved 2026-07-21 — stack tools are a later-phase feature and no longer appear in the V1 wallet gallery).
04Wallet · Combine & Compact — a Select mode over My TokensThere is no separate “Combine” section. Combine is a Select mode on the My Tokens grid: turn it on and corner checkboxes appear. Tick identical, unlocked holdings of one token+variant to Combine into a stack, or Compact stacks to fold every eligible stack of that token at once. Other variants and listed copies are ineligible — the golden rule, enforced visually: ineligible cards are simply dimmed (here, the other-variant stack and the listed ×3 stack — its listing must be cancelled first). Eligibility = identical copies of the same token + variant, unlocked, carrying the same frozen resale terms; a listed copy needs its listing cancelled first. All of that lives here in the caption — the UI itself just dims ineligible cards and names the scope in the select bar ("Swampie · Green · identical & unlocked").
My Tokens
k1m9…7uvw
Wallet · select
My Tokens.
Combine identical copies (same variant, same resale terms) into a stack, or compact all eligible stacks of a token.
05Wallet · Transfer & the listed lockTransfer aligns with the wallet’s existing Transfer modal — recipient principal, the “no undo” warning, a one-verb Transfer button. For a stack it adds exactly one field: an amount (a split immediately followed by a transfer, in one atomic step; variant is always preserved). A listed stack is the locked state: the wallet disables its stack tools with one route out — cancel the listing. The sale-lock is only on the owner’s structural edits — buyers still take partial quantity off the listing (frame 09). (The wallet’s other holding lock — the RWA redemption lock, ruled 2026-07-21 — never appears on stacks: redeemable tokens are 1/1; Transfer honours it all the same. See the redemption gallery.)
Transfer token
✕
Swampie · ×12
Marsh Run · Green · Stack
of 12
Please double check this is the correct recipient. Transfers cannot be undone.
They receive×5 Green
You keep×7 Green
Listed stack — sale-locked
Swampie · ×6
Marsh Run · Green · listed at 0.8 ICP each
Listed · selling in parts
4 of 6 sold · 2 left. Cancel the listing to edit the remainder.
06Collection minted-token inventory — grid & listThe team surface is the collection’s Minted page (manage-minted). It shows minted copies the collection itself holds, in grid or list view via the same toggle. A stack shows a ×N badge and reads “stack ×N”. The stack tools are a minor addition: Select → Compact stacks in the bulk bar, and Split / Merge on one stack via its Stack actions (the same Split / Unstack / Merge rows as the wallet's inline Stack panel, frame 03). These act on minted holdings only, never on token definitions.
Minted copies currently held by this collection. Moving to a vendor, selling, or transferring out removes it from this list.
Live
Minted
1,000 of 1,000
Held here
620
In vendors
180
Held externally
200
Burned
0
Swampie×220
Held
Swampie
Common
Swampie×64
Held
Swampie
Common
Staff
Held
Ember Staff
copy 3 / 50Uncommon
06List view — same holdings, same toggle
×220
Swampie
#221 · Green · Stack · Common
Held
×64
Swampie
#221 · Red · Stack · Common
Held
Ember Staff
#007 · Copy 3 / 50 · Single · Uncommon
Held
Where the stack tools live here
Turn on Select → the bulk bar exposes Compact stacks (fold every eligible stack of a token). Split and Merge on one stack open its Stack actions — the same Split / Unstack / Merge rows as the wallet's inline Stack panel (frame 03).
Minor addition, not a redesign
Everything above is the existing Minted page. Stacks simply carry a ×N badge and gain the same Compact / Split / Merge already available in the wallet.
07Vendor inventory (staged for claim)Vendor inventory is the vendor’s Inventory tab — staged stock as token cards with a ×N stack badge. Editing is gated on Pause (a collector could be claiming while it is Running). The real return path is Select → Remove from vendor, which returns those copies to the collection — there is no “Transfer back to project”. Stack tools (Split / Merge / Compact) run through the same Select → bulk actions, only while Paused. What is staged here is exactly what claimants draw from on the launchpad (frame 08). Per-unit claim price is set on the Costs & rules tab, per tier — never on the inventory card; low stock (×3) surfaces to claimants as “×3 left”.
The tokens this vendor is selling, drawn from the project's collections. Pause to edit; removing returns copies to their collection.
LivePausedEditable · paused
1 selectedSwampie · Green
Swampie×80
Swampie
Common
Swampie×3
Swampie
Common
08Launchpad & claiming · draw units off a stackDiscovery and claim never restructure a stack — they draw units off it at a per-unit price (R41). The storefront card shows the stack as availability (×N left) + a per-unit price; the claim modal is a “How many?” quantity picker (1 … remaining) with a running total. If someone claims first, it fails cleanly with the remaining count and a one-tap “claim the remaining N”.
The card shows availability + a per-unit price — no split/merge tools on a discovery surface. (Vendors carry no rarity colour, so the frame is neutral.)
Claim Swampie · Green
✕
Swampie · Green
×80 available · 0.5 ICP each
of 80 remaining
Cost per unit0.5 ICP
Total (6 × 0.5 ICP)3.0 ICP
Only 2 left
✕
Someone beat you to it! There are still 2 available, do you want to claim them?
New total (2 × 0.5 ICP)1.0 ICP
Quantity is race-protected by an atomic check-and-decrement — first call wins; remaining 0 falls through to sold-out. A single Single can be peeled straight off a stack too (the “open one” pattern from variants); if the open half fails, the split Single stays, ready to retry.
09Marketplace · list a stack, buy in partsSecondary listings price a stack per unit with partial buys allowed (R41). The browse card carries availability once — the ×N-left badge top-right on the art — the stack-badge position, where quantity always lives — with a per-unit price in the foot; the seller sets that per-unit price; the buy modal is the same “How many?” picker with the same take-the-remainder race handling. Listing a stack is what sale-locks it from the owner’s stack tools (frame 05).
“each · ×N left” tells a buyer it is a divisible stack, not a single item.
List a stack · priced per unit
Swampie · ×6
Green · your stack
Per unit — buyers choose how many to take. Full stack total: 4.8 ICP.
Buyers can take any amount. Someone might buy all 6, or just 1 — each pays quantity × your unit price, and whatever is left stays listed until it sells out or the listing ends.
Once listed, this stack is sale-locked from Split, Merge and Combine until you cancel the listing.
Buy · pick a quantity
Swampie · Green
Marsh Run · ×6 remaining · seller k1m9…7uvw
of 6 remaining
Price per unit0.8 ICP
You pay (3 × 0.8)2.4 ICP
Only 1 left
✕
Someone beat you to it! There is still 1 available, do you want to buy that?