Skip to main content

Minting $GNDX

Pre-launch — forward-looking

GNDX Protocol has not yet deployed to mainnet. The instructions and flows on this page describe how minting will work once the dApp is live on Arbitrum One. Get notified when we launch.

Minting $GNDX means depositing USDC into the protocol and receiving $GNDX tokens that represent your proportional share of the underlying basket.

Prerequisites

  • An Arbitrum One wallet (MetaMask, Coinbase Wallet, WalletConnect, etc.)
  • USDC on Arbitrum One
  • Some ETH on Arbitrum for gas (gas costs are typically $0.10–$0.50 per transaction)

Using the App

  1. Go to app.gndx.finance
  2. Connect your wallet
  3. Navigate to Mint
  4. Enter the amount of USDC you want to deposit
  5. Approve USDC spend (one-time per amount, or set an exact approval)
  6. Confirm the mint transaction

Two Execution Paths

The protocol uses different execution paths based on order size:

Instant Path (small orders)

Orders below the instant floor ($25,000 USDC) always execute instantly:

  • Executes in the same transaction
  • Capital instantly purchases basket tokens via the DEX adapter
  • $GNDX minted and sent to your wallet immediately
  • No waiting required

Fuzzy Zone ($25,000–$50,000 USDC)

Orders in this range are probabilistically routed using a quadratic curve:

  • Near $25,000: almost always instant
  • Near $50,000: almost always TWAP
  • The exact threshold is unpredictable to external observers, preventing threshold-splitting attacks

TWAP Path (> $50,000 USDC) — dynamic scaling

The chunk count and interval scale with order size to balance execution speed against price impact:

  • Chunks: clamp(ceil(orderSize / $25K), 4, 24) — between 4 and 24 chunks per order
  • Interval: depends on chunk size (orderSize / chunks):
    • chunk ≤ $15K → 5 minute interval
    • chunk ≤ $30K → 10 minute interval
    • chunk ≤ $60K → 15 minute interval
    • chunk > $60K → 20 minute interval
Order sizeChunksIntervalTotal time
$60,00045 min20 minutes
$250,0001010 min1 h 40 min
$1,000,0002415 min6 hours
  • Any address (keeper bots, or you) can call executeTWAPChunk(orderId) — keepers earn 0.01% of each chunk
  • After the final chunk: call completeMintOrder(orderId, recipient) to receive your $GNDX
  • A slippage check at completion ensures the execution NAV is within your tolerance

Rate Limiting

In addition to the fuzzy zone, two rate limits protect against splitting attacks:

  1. Per-address rolling window: Each address is capped at $50,000 cumulative instant mints per 24-hour rolling window. After that, all orders go to TWAP until the window resets.
  2. Global hourly budget: The protocol caps total instant minting across ALL addresses at $500,000 per hour (governance-adjustable). This prevents coordinated Sybil attacks using many wallets.
Why TWAP for Large Orders?

Splitting a large order across multiple chunks (and dynamically scaling that count to the order size) reduces the price impact of purchasing basket tokens. This protects you from adverse slippage and protects the basket from artificial price spikes.

What Happens to Your USDC

Your USDC is used to purchase underlying basket tokens via the DEX adapter using mint routing (spec: packages/docs/GNDX_TAD_v2.md in the monorepo). Among routable tokens (active in the basket and not flagged isMintRoutingExcluded), the engine either splits USDC by target weights when drifts are small, or sends the full chunk to the single most underweight routable token. Tokens excluded from routing (governance / optional oracle circuit-breaker path) receive no new buy flow until Timelock clears the flag; they remain in the basket for NAV and redemption.

Example: if Token A is 3% below target and Token B is 0.5% below—and both are routable—your USDC prioritizes correcting the larger underweight position. The resulting $GNDX represents your proportional share of all basket tokens.

Anti-Dilution: Value-Based Minting

For routed mints (instant routed + TWAP), the protocol issues $GNDX based on the actual vault value increase from your swap, not the raw USDC you deposited:

gndxOut = (vaultValueAfterSwap − vaultValueBeforeSwap) × 1e18 / navPerToken

What this means for you: Your swap on Uniswap V3 (or via aggregators) incurs DEX fees and price impact (slippage). Value-based minting ensures you bear your own swap friction — you receive slightly fewer $GNDX than the USDC-deposited amount would suggest, but each $GNDX you receive is worth the same NAV as before.

What this means for existing holders: Their $-denominated position value is preserved across new mints. Without this design, large mints would dilute existing NAV by exactly the swap friction. With it, NAV is held flat.

If the vault is empty (genesis) or the path is non-routed (no swaps occur), the simpler USDC-based formula is used as a fallback.

Fees

FeeRate
Mint fee0.10% of USDC deposited
Gas~$0.10–$0.50 per transaction on Arbitrum

The mint fee ceiling is hardcoded at 0.25%. Governance can only reduce the fee, not exceed the ceiling.

Your $GNDX

After minting, you will see $GNDX in your wallet. This token:

  • Represents a proportional share of the underlying basket
  • Has a price that tracks the basket's NAV
  • Is freely transferable and tradeable on Uniswap V3 ($GNDX/USDC pool)
  • Can be redeemed at any time for the underlying basket tokens

Cancelling a TWAP Order

You can cancel a TWAP order before any chunk has executed and receive a full refund of your USDC (minus the mint fee).

MintEngine.cancelOrder(orderId)

After the first chunk executes, cancellation is only possible if the order has stalled (see below).

Recovering a Stalled TWAP Order

If a TWAP order is mid-execution and all basket tokens become circuit-breaker excluded simultaneously, the order cannot progress — executeTWAPChunk() will revert with AllMintRoutingExcluded. In this scenario:

  1. Wait for recovery: If the CB exclusions lift (after stability-gated re-entry), keepers can resume executing chunks normally.
  2. Force complete after grace period: If the order remains stuck past its expected completion time + 2 hours, you can call forceCompleteStalledOrder(orderId, recipient):
    • Mints $GNDX for the USDC that was successfully deployed (partial mint at averaged NAV)
    • Refunds the remaining undeployed USDC to your wallet
  3. Cancel after grace period: Alternatively, you can call cancelOrder(orderId) after the grace period to receive a full refund of remaining USDC (no $GNDX minted for the stalled portion).
MintEngine.forceCompleteStalledOrder(orderId, recipient) // partial mint + USDC refund
MintEngine.cancelOrder(orderId) // USDC refund only (after grace)

Checking Your Order Status

MintEngine.getMintOrder(orderId)    // full order details
MintEngine.getPendingOrders(wallet) // all pending order IDs for an address

All order data is also visible in the app at app.gndx.finance.


See also: Redeeming $GNDX · How It Works