OpportunitiesEntities
Docs
    Ring Platform

    Decentralized Self-building Future

    Sign In
    Entities
    Opportunities
    Store
    Docs
    Platform Concepts
    RING EconomySonoratek LLCGlobal ImpactAI Meets Web3
    Get Started
    Quick StartCalculatorRoadmap
    Privacy|Contact
    v1.104.17|Sonoratek LLC

    Documentation

    Concepts, value, and typical clone scenarios — less code.

    Welcome to Ring
    Quick Reference
    Getting Started
    Prerequisites
    Installation
    First Success Validation
    Next Steps
    Features
    Multi-Vendor Store
    Inventory & Stock
    Vendor Management
    Commissions & Settlements
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Payments Overview
    Public Pools & DAO Jars
    WayForPay Payment Integration
    Wallet & Credit System
    WalletConductor
    Affiliate & Referral Enablement
    Referral Codes (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Token Staking System
    Owner Project Lab
    Entities
    Opportunities
    Real-Time Messaging
    Ring Tasks
    WebRTC Calls & STUNner TURN
    Peer Games
    News Module
    Member Blogs
    Public Profile Pages
    Profile Account Widgets
    Ring File Cabinet
    Username Reservation System
    Scientific Editor
    Notifications
    Push Notifications with FCM (Ring-Powered)
    Email AI-CRM
    Ring Mailer & RingdomX Mail
    Tunnel Protocol
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Security & Compliance
    Admin console
    Admin Wiki
    Manage via Telegram
    Locale System
    Mobile Experience
    Performance Optimization Patterns
    Examples
    Quick Start
    Basic Setup
    White Label
    Custom Branding
    Web3 Integration
    Real World
    Advanced Features
    Customization
    Quick Start — Your First Ring Clone
    Customization Guide
    Vertical Presets (SSOT)
    Ringization playbook
    Branding
    Themes
    Features
    Localization
    Token Economics Setup
    Payment Gateway Integration
    Reference Ring deployments
    Project configuration
    Public environment variables
    Order Lab secrets
    WalletConnect Project ID (Reown Cloud)
    Supported services
    NODUS wiki (project knowledge)
    Configuration playbook
    Web3
    Token launch jurisdictions
    Wallet
    Wallet Security Tips
    Integrations
    Ethereum wallets (Wagmi v3)
    RingFileBase (object storage API)
    Ring CDN (RingFileBase edge)
    Deployment
    Self-hosted deployment
    Vercel Deployment
    Docker
    Environment Configuration
    Monitoring & Analytics
    Performance Optimization
    Backup & Recovery
    Architecture
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    PaymentConductor architecture
    WalletConductor architecture
    Backend Services
    Firebase Integration
    Development
    Ring MCP Server

    Quick entry (CTOs · auditors · agents)

    Welcome — mission & audiences
    Quick Reference
    Getting started
    Architecture & Auth.js
    Backend modes & databases (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Security & compliance reads
    ringdom.org — LegioX homebase
    Source — MIT license (GitHub)

    Documentation

    Concepts, value, and typical clone scenarios — less code.

    Welcome to Ring
    Quick Reference
    Getting Started
    Prerequisites
    Installation
    First Success Validation
    Next Steps
    Features
    Multi-Vendor Store
    Inventory & Stock
    Vendor Management
    Commissions & Settlements
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Payments Overview
    Public Pools & DAO Jars
    WayForPay Payment Integration
    Wallet & Credit System
    WalletConductor
    Affiliate & Referral Enablement
    Referral Codes (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Token Staking System
    Owner Project Lab
    Entities
    Opportunities
    Real-Time Messaging
    Ring Tasks
    WebRTC Calls & STUNner TURN
    Peer Games
    News Module
    Member Blogs
    Public Profile Pages
    Profile Account Widgets
    Ring File Cabinet
    Username Reservation System
    Scientific Editor
    Notifications
    Push Notifications with FCM (Ring-Powered)
    Email AI-CRM
    Ring Mailer & RingdomX Mail
    Tunnel Protocol
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Security & Compliance
    Admin console
    Admin Wiki
    Manage via Telegram
    Locale System
    Mobile Experience
    Performance Optimization Patterns
    Examples
    Quick Start
    Basic Setup
    White Label
    Custom Branding
    Web3 Integration
    Real World
    Advanced Features
    Customization
    Quick Start — Your First Ring Clone
    Customization Guide
    Vertical Presets (SSOT)
    Ringization playbook
    Branding
    Themes
    Features
    Localization
    Token Economics Setup
    Payment Gateway Integration
    Reference Ring deployments
    Project configuration
    Public environment variables
    Order Lab secrets
    WalletConnect Project ID (Reown Cloud)
    Supported services
    NODUS wiki (project knowledge)
    Configuration playbook
    Web3
    Token launch jurisdictions
    Wallet
    Wallet Security Tips
    Integrations
    Ethereum wallets (Wagmi v3)
    RingFileBase (object storage API)
    Ring CDN (RingFileBase edge)
    Deployment
    Self-hosted deployment
    Vercel Deployment
    Docker
    Environment Configuration
    Monitoring & Analytics
    Performance Optimization
    Backup & Recovery
    Architecture
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    PaymentConductor architecture
    WalletConductor architecture
    Backend Services
    Firebase Integration
    Development
    Ring MCP Server

    Quick entry (CTOs · auditors · agents)

    Welcome — mission & audiences
    Quick Reference
    Getting started
    Architecture & Auth.js
    Backend modes & databases (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Security & compliance reads
    ringdom.org — LegioX homebase
    Source — MIT license (GitHub)

    Documentation

    Concepts, value, and typical clone scenarios — less code.

    Welcome to Ring
    Quick Reference
    Getting Started
    Prerequisites
    Installation
    First Success Validation
    Next Steps
    Features
    Multi-Vendor Store
    Inventory & Stock
    Vendor Management
    Commissions & Settlements
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Payments Overview
    Public Pools & DAO Jars
    WayForPay Payment Integration
    Wallet & Credit System
    WalletConductor
    Affiliate & Referral Enablement
    Referral Codes (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Token Staking System
    Owner Project Lab
    Entities
    Opportunities
    Real-Time Messaging
    Ring Tasks
    WebRTC Calls & STUNner TURN
    Peer Games
    News Module
    Member Blogs
    Public Profile Pages
    Profile Account Widgets
    Ring File Cabinet
    Username Reservation System
    Scientific Editor
    Notifications
    Push Notifications with FCM (Ring-Powered)
    Email AI-CRM
    Ring Mailer & RingdomX Mail
    Tunnel Protocol
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Security & Compliance
    Admin console
    Admin Wiki
    Manage via Telegram
    Locale System
    Mobile Experience
    Performance Optimization Patterns
    Examples
    Quick Start
    Basic Setup
    White Label
    Custom Branding
    Web3 Integration
    Real World
    Advanced Features
    Customization
    Quick Start — Your First Ring Clone
    Customization Guide
    Vertical Presets (SSOT)
    Ringization playbook
    Branding
    Themes
    Features
    Localization
    Token Economics Setup
    Payment Gateway Integration
    Reference Ring deployments
    Project configuration
    Public environment variables
    Order Lab secrets
    WalletConnect Project ID (Reown Cloud)
    Supported services
    NODUS wiki (project knowledge)
    Configuration playbook
    Web3
    Token launch jurisdictions
    Wallet
    Wallet Security Tips
    Integrations
    Ethereum wallets (Wagmi v3)
    RingFileBase (object storage API)
    Ring CDN (RingFileBase edge)
    Deployment
    Self-hosted deployment
    Vercel Deployment
    Docker
    Environment Configuration
    Monitoring & Analytics
    Performance Optimization
    Backup & Recovery
    Architecture
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    PaymentConductor architecture
    WalletConductor architecture
    Backend Services
    Firebase Integration
    Development
    Ring MCP Server

    Quick entry (CTOs · auditors · agents)

    Welcome — mission & audiences
    Quick Reference
    Getting started
    Architecture & Auth.js
    Backend modes & databases (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Security & compliance reads
    ringdom.org — LegioX homebase
    Source — MIT license (GitHub)
    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Solana NFT Gates

    Use Founder / Developer tabs in the docs sidebar to filter this page. audience frontmatter controls in-page blocks; sidebar visibility is curated in lib/docs/audience-curated-docs.ts.

    MVP-A ships Solana Metaplex Core gate NFTs for membership and vendor unlocks. Buyers pay primary sale with the clone native token (RING on this tree), stake into GateEscrow (not NATIVE_NFT_APR), and GateResolver.hasFeature unlocks product surfaces. Tradeable vendor gates can now list in the NFT Exhibition Marketplace, but a bought gate must still be staked before features activate.

    ConcernTruth
    Mint SSOTMetaplex Core (createCollection / create / fetchAsset)
    Stake SSOTGateEscrow DB + optional program id — not Ring staking APR
    Primary saleRING transferChecked then mint (features/nft-gates/purchase.ts)
    User surface/nft/gates
    Secondary surface/nft/market, /nft/market/[listingId], /nft/market/sell
    Admin/admin/nft/templates, /admin/nft/mint
    Subscription providernft_gate → nftGateSubscriptionProvider
    Schemadata/migrations/029_nft_gates_schema.sql
    Marketplace schemadata/migrations/031_nft_exhibition_market_schema.sql

    Why this matters for your clone

    Sell access as an on-chain certificate instead of only card or credit rails. Membership gates are soulbound; vendor deed / DAGI / license gates are tradeable in the NFT Exhibition Marketplace. Price changes mint a new active template asset — sold assets are never mutated.

    Operator journey

    1. Create the Metaplex Core collection once (admin mint console).
    2. Set nft.collectionMint in ring-config.json (devnet example already set on this tree).
    3. Open Mint / activate + art → pick one of four ImageConductor previews → mint into the collection.
    4. Members buy on /nft/gates; membership slugs auto-stake and unlock member features.
    5. Tradeable vendor gates can be listed on /nft/market/sell only when they are owned, verified, non-soulbound, and not staked.
    6. Before mainnet: move collection update authority and marketplace authorities to Squads (see solana/SECURITY.md).

    Explorer Symbol: KEYS (not RING)

    Solana Explorer Symbol comes from off-chain collection metadata JSON at the collection uri — Metaplex Core has no on-chain symbol. Ring Platform uses KEYS for the gate NFT family (Ringdom Keys Collection). RING remains the SPL sale currency only.

    Live family JSON (devnet on-chain uri): gist collection.json with "symbol":"KEYS". App SSOT: public/nft/gates/collection.json. After deploy, stable path /nft/gates/collection.json rewrites to /api/nft/gates/collection.

    Typical scenarios

    Architecture

    NFT gate buy → stake → feature

    Module map

    PathRole
    features/nft-gates/umi-client.tsSponsor umi from SOLANA_FEE_PAYER_PRIVATE_KEY
    features/nft-gates/metaplex-core-onchain.tscreateCollection, mint, fetchAsset, soulbound freeze
    features/nft-gates/metaplex-core.tsOn-chain vs ledger-dev adapter
    features/nft-gates/purchase.tsRING pay → mint → ownership
    features/nft-gates/gate-escrow.tsStake / unstake + entitlement invalidation

    Backlog (not shipped)

    Related documentation

    SubscriptionConductor

    Provider registry including nft_gate.

    Generative images

    ImageConductor providers and ring-filebase persistence.

    RingFileBase

    Upload API vs CDN read path.

    Staking

    APR pools — do not confuse with GateEscrow.

    Solana NFT Gates

    Use Founder / Developer tabs in the docs sidebar to filter this page. audience frontmatter controls in-page blocks; sidebar visibility is curated in lib/docs/audience-curated-docs.ts.

    MVP-A ships Solana Metaplex Core gate NFTs for membership and vendor unlocks. Buyers pay primary sale with the clone native token (RING on this tree), stake into GateEscrow (not NATIVE_NFT_APR), and GateResolver.hasFeature unlocks product surfaces. Tradeable vendor gates can now list in the NFT Exhibition Marketplace, but a bought gate must still be staked before features activate.

    ConcernTruth
    Mint SSOTMetaplex Core (createCollection / create / fetchAsset)
    Stake SSOTGateEscrow DB + optional program id — not Ring staking APR
    Primary saleRING transferChecked then mint (features/nft-gates/purchase.ts)
    User surface/nft/gates
    Secondary surface/nft/market, /nft/market/[listingId], /nft/market/sell
    Admin/admin/nft/templates, /admin/nft/mint
    Subscription providernft_gate → nftGateSubscriptionProvider
    Schemadata/migrations/029_nft_gates_schema.sql
    Marketplace schemadata/migrations/031_nft_exhibition_market_schema.sql

    Why this matters for your clone

    Sell access as an on-chain certificate instead of only card or credit rails. Membership gates are soulbound; vendor deed / DAGI / license gates are tradeable in the NFT Exhibition Marketplace. Price changes mint a new active template asset — sold assets are never mutated.

    Operator journey

    1. Create the Metaplex Core collection once (admin mint console).
    2. Set nft.collectionMint in ring-config.json (devnet example already set on this tree).
    3. Open Mint / activate + art → pick one of four ImageConductor previews → mint into the collection.
    4. Members buy on /nft/gates; membership slugs auto-stake and unlock member features.
    5. Tradeable vendor gates can be listed on /nft/market/sell only when they are owned, verified, non-soulbound, and not staked.
    6. Before mainnet: move collection update authority and marketplace authorities to Squads (see solana/SECURITY.md).

    Explorer Symbol: KEYS (not RING)

    Solana Explorer Symbol comes from off-chain collection metadata JSON at the collection uri — Metaplex Core has no on-chain symbol. Ring Platform uses KEYS for the gate NFT family (Ringdom Keys Collection). RING remains the SPL sale currency only.

    Live family JSON (devnet on-chain uri): gist collection.json with "symbol":"KEYS". App SSOT: public/nft/gates/collection.json. After deploy, stable path /nft/gates/collection.json rewrites to /api/nft/gates/collection.

    Typical scenarios

    Architecture

    NFT gate buy → stake → feature

    Module map

    PathRole
    features/nft-gates/umi-client.tsSponsor umi from SOLANA_FEE_PAYER_PRIVATE_KEY
    features/nft-gates/metaplex-core-onchain.tscreateCollection, mint, fetchAsset, soulbound freeze
    features/nft-gates/metaplex-core.tsOn-chain vs ledger-dev adapter
    features/nft-gates/purchase.tsRING pay → mint → ownership
    features/nft-gates/gate-escrow.tsStake / unstake + entitlement invalidation

    Backlog (not shipped)

    Related documentation

    SubscriptionConductor

    Provider registry including nft_gate.

    Generative images

    ImageConductor providers and ring-filebase persistence.

    RingFileBase

    Upload API vs CDN read path.

    Staking

    APR pools — do not confuse with GateEscrow.

    Solana NFT Gates

    Use Founder / Developer tabs in the docs sidebar to filter this page. audience frontmatter controls in-page blocks; sidebar visibility is curated in lib/docs/audience-curated-docs.ts.

    MVP-A ships Solana Metaplex Core gate NFTs for membership and vendor unlocks. Buyers pay primary sale with the clone native token (RING on this tree), stake into GateEscrow (not NATIVE_NFT_APR), and GateResolver.hasFeature unlocks product surfaces. Tradeable vendor gates can now list in the NFT Exhibition Marketplace, but a bought gate must still be staked before features activate.

    ConcernTruth
    Mint SSOTMetaplex Core (createCollection / create / fetchAsset)
    Stake SSOTGateEscrow DB + optional program id — not Ring staking APR
    Primary saleRING transferChecked then mint (features/nft-gates/purchase.ts)
    User surface/nft/gates
    Secondary surface/nft/market, /nft/market/[listingId], /nft/market/sell
    Admin/admin/nft/templates, /admin/nft/mint
    Subscription providernft_gate → nftGateSubscriptionProvider
    Schemadata/migrations/029_nft_gates_schema.sql
    Marketplace schemadata/migrations/031_nft_exhibition_market_schema.sql

    Why this matters for your clone

    Sell access as an on-chain certificate instead of only card or credit rails. Membership gates are soulbound; vendor deed / DAGI / license gates are tradeable in the NFT Exhibition Marketplace. Price changes mint a new active template asset — sold assets are never mutated.

    Operator journey

    1. Create the Metaplex Core collection once (admin mint console).
    2. Set nft.collectionMint in ring-config.json (devnet example already set on this tree).
    3. Open Mint / activate + art → pick one of four ImageConductor previews → mint into the collection.
    4. Members buy on /nft/gates; membership slugs auto-stake and unlock member features.
    5. Tradeable vendor gates can be listed on /nft/market/sell only when they are owned, verified, non-soulbound, and not staked.
    6. Before mainnet: move collection update authority and marketplace authorities to Squads (see solana/SECURITY.md).

    Explorer Symbol: KEYS (not RING)

    Solana Explorer Symbol comes from off-chain collection metadata JSON at the collection uri — Metaplex Core has no on-chain symbol. Ring Platform uses KEYS for the gate NFT family (Ringdom Keys Collection). RING remains the SPL sale currency only.

    Live family JSON (devnet on-chain uri): gist collection.json with "symbol":"KEYS". App SSOT: public/nft/gates/collection.json. After deploy, stable path /nft/gates/collection.json rewrites to /api/nft/gates/collection.

    Typical scenarios

    Architecture

    NFT gate buy → stake → feature

    Module map

    PathRole
    features/nft-gates/umi-client.tsSponsor umi from SOLANA_FEE_PAYER_PRIVATE_KEY
    features/nft-gates/metaplex-core-onchain.tscreateCollection, mint, fetchAsset, soulbound freeze
    features/nft-gates/metaplex-core.tsOn-chain vs ledger-dev adapter
    features/nft-gates/purchase.tsRING pay → mint → ownership
    features/nft-gates/gate-escrow.tsStake / unstake + entitlement invalidation

    Backlog (not shipped)

    Related documentation

    SubscriptionConductor

    Provider registry including nft_gate.

    Generative images

    ImageConductor providers and ring-filebase persistence.

    RingFileBase

    Upload API vs CDN read path.

    Staking

    APR pools — do not confuse with GateEscrow.

  1. Lifetime membership NFT as a permanent member seal (stake required).
  2. Vendor DAGI key staked before agent activation (hasFeature('vendor.dagi')).
  3. Store deed / DAGI / annual / quarterly vendor gates listed for RING resale when unstaked.
  4. Bought vendor gate staked after purchase before product access activates.
  5. SubscriptionConductor

    How nft_gate sits beside credit, WayForPay, Stripe, and native token.

    Wallet

    Custodial Solana wallets and RING transfers that fund primary sale.

    RingFileBase

    Where generated NFT art lands after ImageConductor.

    NFT Marketplace

    Shipped Exhibition Marketplace for eligible vendor KEYS gates; audited on-chain GateMarket remains future work.

    A marketplace purchase transfers ownership only. It does not grant features until the buyer stakes the gate. An active listing means hasFeature:false; an active stake means canList:false.

    features/nft-gates/gate-resolver.tshasFeature (cache → stakes → RPC)
    features/nft-gates/admin-mint.tsCollection create + template activate
    features/nft-gates/art-prompt.tsPrompt vars + favicon data URI
    features/nft-market/listing-policy.tsTradeable SKU, soulbound, stake, duplicate listing checks
    features/nft-market/services/listing-service.tsNFT Exhibition listing lifecycle
    features/nft-market/services/solana-market-client.tsLedger-dev marketplace adapter; Anchor branch blocked
    features/admin/nft/gate-art-preview-modal.tsx4-up preview fs-modal
    app/_actions/nft-gates.tsServer actions
    app/_actions/nft-market.tsList, cancel, purchase marketplace actions
    lib/payments/subscription/providers/nft-gate-subscription.tsnft_gate provider

    Config (ring-config.json → nft)

    Verified keys: enabled, collectionMint, collectionUri, collectionSymbol (KEYS), sponsorFeePayer, marketplaceEnabled, marketplaceFeeRecipient, marketplaceFeeBps, gateEscrowProgramId, gateMarketProgramId, templates[].

    Off-chain family metadata: public/nft/gates/collection.json (symbol: KEYS). Admin Point collection URI → KEYS JSON runs Metaplex Core updateCollection when the sponsor still holds update authority.

    Seven templates (slugs): one-month-membership, annual-membership, lifetime-membership, vendor-store-deed, vendor-dagi-key, vendor-annual-store-license, vendor-quarterly-store-license.

    payment.gateways.nft_gate.enabled is true on this tree. nft_gate remains listed under payment.futureMethods (not yet in supportedMethods), so membership PaymentModal may still tag it as coming-soon while /nft/gates and the provider module are live.

    Tradeable marketplace slugs are intentionally narrower: vendor-store-deed, vendor-dagi-key, vendor-annual-store-license, and vendor-quarterly-store-license. Membership slugs remain soulbound and unlistable.

    Server actions

    ActionPurpose
    purchaseGateActionBuy gate NFT with RING
    stakeGateAction / unstakeGateActionGateEscrow
    hasGateFeatureActionEntitlement check
    previewGateArtActionImageConductor n: 4 + favicon reference
    adminActivateGateTemplateActionMint/activate with optional imageUri
    adminCreateGateCollectionActionCreate Core collection

    Admin art preview flow

    1. 1

      Open /admin/nft/templates or /admin/nft/mint and click Mint / activate + art.

    2. 2

      previewGateArtAction interpolates $projectName, $activeColor, $secondaryColor, $projectColor1, $projectColor2, $organization, then calls ImageConductor.generate with n: 4 and favicon referenceImages.

    3. 3

      Fullscreen modal shows a 2×2 grid, collapsible Generation prompt textarea, and Regenerate (session-only prompt edits — not written to ring-config).

    4. 4

      Mint with selected art calls adminActivateGateTemplateAction({ imageUri, regenerateArt: false }) → Metaplex Core mint → nft_gates edition row + db() active-template pointer (nft_active_{slug}). Runtime SSOT is listNftGateTemplatesResolved() (ring-config defaults + DB overlay). ring-config.json is never rewritten in k8s.

    Image + storage wiring

    PiecePath / env
    Conductorlib/images/conductor/image-conductor.ts
    xAI providerlib/images/providers/xai.provider.ts — /images/generations or /images/edits
    Favicon PNGpublic/images/favicon.png → data:image/png;base64,…
    Persistfile().upload → RingBaseAdapter when NEXT_PUBLIC_STORAGE_PROVIDER=ring_filebase
    Local→prod APIPort-forward ring-filebase-api to 127.0.0.1:18080 (see RingFileBase)

    Do not set RINGBASE_API_URL=https://api.ring-platform.org — that host is the Next.js app ingress, not ring-filebase-api. Uploads return HTML and surface as HTTP 500 in RingBaseAdapter.

    Persistence collections

    Migration 029_nft_gates_schema.sql creates JSONB collections: nft_gates, nft_stakes, nft_entitlement_cache, nft_ownership (plus related indexes). Cron: GET /api/cron/nft-gate-expiry → runNftGateExpiry (daily 4am schedule in SubscriptionConductor docs).

    Migration 031_nft_exhibition_market_schema.sql adds secondary-market persistence: nft_listings, nft_market_sales, and nft_market_collections.

    Ledger-dev vs on-chain

    If nft.collectionMint is empty, metaplex-core.ts issues ledger-dev asset ids when not production, or when ALLOW_LEDGER_NFT_MINT=1. Production refuses ledger mint without that flag.

    If nft.gateMarketProgramId is empty, SolanaMarketClient uses the shipped ledger-dev market adapter. If a program id is set in this build, list/cancel/buy throw because audited Anchor GateMarket CPI is not implemented yet.

    Anchor scaffolds exist at solana/programs/{gate-escrow,gate-market}. solana/SECURITY.md keeps both programs out of production until audit, Squads authority control, pinned IDs/IDLs, and invariant tests are complete.

    NFT Exhibition Marketplace

    Secondary trading for eligible vendor KEYS gates.

  6. Lifetime membership NFT as a permanent member seal (stake required).
  7. Vendor DAGI key staked before agent activation (hasFeature('vendor.dagi')).
  8. Store deed / DAGI / annual / quarterly vendor gates listed for RING resale when unstaked.
  9. Bought vendor gate staked after purchase before product access activates.
  10. SubscriptionConductor

    How nft_gate sits beside credit, WayForPay, Stripe, and native token.

    Wallet

    Custodial Solana wallets and RING transfers that fund primary sale.

    RingFileBase

    Where generated NFT art lands after ImageConductor.

    NFT Marketplace

    Shipped Exhibition Marketplace for eligible vendor KEYS gates; audited on-chain GateMarket remains future work.

    A marketplace purchase transfers ownership only. It does not grant features until the buyer stakes the gate. An active listing means hasFeature:false; an active stake means canList:false.

    features/nft-gates/gate-resolver.tshasFeature (cache → stakes → RPC)
    features/nft-gates/admin-mint.tsCollection create + template activate
    features/nft-gates/art-prompt.tsPrompt vars + favicon data URI
    features/nft-market/listing-policy.tsTradeable SKU, soulbound, stake, duplicate listing checks
    features/nft-market/services/listing-service.tsNFT Exhibition listing lifecycle
    features/nft-market/services/solana-market-client.tsLedger-dev marketplace adapter; Anchor branch blocked
    features/admin/nft/gate-art-preview-modal.tsx4-up preview fs-modal
    app/_actions/nft-gates.tsServer actions
    app/_actions/nft-market.tsList, cancel, purchase marketplace actions
    lib/payments/subscription/providers/nft-gate-subscription.tsnft_gate provider

    Config (ring-config.json → nft)

    Verified keys: enabled, collectionMint, collectionUri, collectionSymbol (KEYS), sponsorFeePayer, marketplaceEnabled, marketplaceFeeRecipient, marketplaceFeeBps, gateEscrowProgramId, gateMarketProgramId, templates[].

    Off-chain family metadata: public/nft/gates/collection.json (symbol: KEYS). Admin Point collection URI → KEYS JSON runs Metaplex Core updateCollection when the sponsor still holds update authority.

    Seven templates (slugs): one-month-membership, annual-membership, lifetime-membership, vendor-store-deed, vendor-dagi-key, vendor-annual-store-license, vendor-quarterly-store-license.

    payment.gateways.nft_gate.enabled is true on this tree. nft_gate remains listed under payment.futureMethods (not yet in supportedMethods), so membership PaymentModal may still tag it as coming-soon while /nft/gates and the provider module are live.

    Tradeable marketplace slugs are intentionally narrower: vendor-store-deed, vendor-dagi-key, vendor-annual-store-license, and vendor-quarterly-store-license. Membership slugs remain soulbound and unlistable.

    Server actions

    ActionPurpose
    purchaseGateActionBuy gate NFT with RING
    stakeGateAction / unstakeGateActionGateEscrow
    hasGateFeatureActionEntitlement check
    previewGateArtActionImageConductor n: 4 + favicon reference
    adminActivateGateTemplateActionMint/activate with optional imageUri
    adminCreateGateCollectionActionCreate Core collection

    Admin art preview flow

    1. 1

      Open /admin/nft/templates or /admin/nft/mint and click Mint / activate + art.

    2. 2

      previewGateArtAction interpolates $projectName, $activeColor, $secondaryColor, $projectColor1, $projectColor2, $organization, then calls ImageConductor.generate with n: 4 and favicon referenceImages.

    3. 3

      Fullscreen modal shows a 2×2 grid, collapsible Generation prompt textarea, and Regenerate (session-only prompt edits — not written to ring-config).

    4. 4

      Mint with selected art calls adminActivateGateTemplateAction({ imageUri, regenerateArt: false }) → Metaplex Core mint → nft_gates edition row + db() active-template pointer (nft_active_{slug}). Runtime SSOT is listNftGateTemplatesResolved() (ring-config defaults + DB overlay). ring-config.json is never rewritten in k8s.

    Image + storage wiring

    PiecePath / env
    Conductorlib/images/conductor/image-conductor.ts
    xAI providerlib/images/providers/xai.provider.ts — /images/generations or /images/edits
    Favicon PNGpublic/images/favicon.png → data:image/png;base64,…
    Persistfile().upload → RingBaseAdapter when NEXT_PUBLIC_STORAGE_PROVIDER=ring_filebase
    Local→prod APIPort-forward ring-filebase-api to 127.0.0.1:18080 (see RingFileBase)

    Do not set RINGBASE_API_URL=https://api.ring-platform.org — that host is the Next.js app ingress, not ring-filebase-api. Uploads return HTML and surface as HTTP 500 in RingBaseAdapter.

    Persistence collections

    Migration 029_nft_gates_schema.sql creates JSONB collections: nft_gates, nft_stakes, nft_entitlement_cache, nft_ownership (plus related indexes). Cron: GET /api/cron/nft-gate-expiry → runNftGateExpiry (daily 4am schedule in SubscriptionConductor docs).

    Migration 031_nft_exhibition_market_schema.sql adds secondary-market persistence: nft_listings, nft_market_sales, and nft_market_collections.

    Ledger-dev vs on-chain

    If nft.collectionMint is empty, metaplex-core.ts issues ledger-dev asset ids when not production, or when ALLOW_LEDGER_NFT_MINT=1. Production refuses ledger mint without that flag.

    If nft.gateMarketProgramId is empty, SolanaMarketClient uses the shipped ledger-dev market adapter. If a program id is set in this build, list/cancel/buy throw because audited Anchor GateMarket CPI is not implemented yet.

    Anchor scaffolds exist at solana/programs/{gate-escrow,gate-market}. solana/SECURITY.md keeps both programs out of production until audit, Squads authority control, pinned IDs/IDLs, and invariant tests are complete.

    NFT Exhibition Marketplace

    Secondary trading for eligible vendor KEYS gates.

  11. Lifetime membership NFT as a permanent member seal (stake required).
  12. Vendor DAGI key staked before agent activation (hasFeature('vendor.dagi')).
  13. Store deed / DAGI / annual / quarterly vendor gates listed for RING resale when unstaked.
  14. Bought vendor gate staked after purchase before product access activates.
  15. SubscriptionConductor

    How nft_gate sits beside credit, WayForPay, Stripe, and native token.

    Wallet

    Custodial Solana wallets and RING transfers that fund primary sale.

    RingFileBase

    Where generated NFT art lands after ImageConductor.

    NFT Marketplace

    Shipped Exhibition Marketplace for eligible vendor KEYS gates; audited on-chain GateMarket remains future work.

    A marketplace purchase transfers ownership only. It does not grant features until the buyer stakes the gate. An active listing means hasFeature:false; an active stake means canList:false.

    features/nft-gates/gate-resolver.tshasFeature (cache → stakes → RPC)
    features/nft-gates/admin-mint.tsCollection create + template activate
    features/nft-gates/art-prompt.tsPrompt vars + favicon data URI
    features/nft-market/listing-policy.tsTradeable SKU, soulbound, stake, duplicate listing checks
    features/nft-market/services/listing-service.tsNFT Exhibition listing lifecycle
    features/nft-market/services/solana-market-client.tsLedger-dev marketplace adapter; Anchor branch blocked
    features/admin/nft/gate-art-preview-modal.tsx4-up preview fs-modal
    app/_actions/nft-gates.tsServer actions
    app/_actions/nft-market.tsList, cancel, purchase marketplace actions
    lib/payments/subscription/providers/nft-gate-subscription.tsnft_gate provider

    Config (ring-config.json → nft)

    Verified keys: enabled, collectionMint, collectionUri, collectionSymbol (KEYS), sponsorFeePayer, marketplaceEnabled, marketplaceFeeRecipient, marketplaceFeeBps, gateEscrowProgramId, gateMarketProgramId, templates[].

    Off-chain family metadata: public/nft/gates/collection.json (symbol: KEYS). Admin Point collection URI → KEYS JSON runs Metaplex Core updateCollection when the sponsor still holds update authority.

    Seven templates (slugs): one-month-membership, annual-membership, lifetime-membership, vendor-store-deed, vendor-dagi-key, vendor-annual-store-license, vendor-quarterly-store-license.

    payment.gateways.nft_gate.enabled is true on this tree. nft_gate remains listed under payment.futureMethods (not yet in supportedMethods), so membership PaymentModal may still tag it as coming-soon while /nft/gates and the provider module are live.

    Tradeable marketplace slugs are intentionally narrower: vendor-store-deed, vendor-dagi-key, vendor-annual-store-license, and vendor-quarterly-store-license. Membership slugs remain soulbound and unlistable.

    Server actions

    ActionPurpose
    purchaseGateActionBuy gate NFT with RING
    stakeGateAction / unstakeGateActionGateEscrow
    hasGateFeatureActionEntitlement check
    previewGateArtActionImageConductor n: 4 + favicon reference
    adminActivateGateTemplateActionMint/activate with optional imageUri
    adminCreateGateCollectionActionCreate Core collection

    Admin art preview flow

    1. 1

      Open /admin/nft/templates or /admin/nft/mint and click Mint / activate + art.

    2. 2

      previewGateArtAction interpolates $projectName, $activeColor, $secondaryColor, $projectColor1, $projectColor2, $organization, then calls ImageConductor.generate with n: 4 and favicon referenceImages.

    3. 3

      Fullscreen modal shows a 2×2 grid, collapsible Generation prompt textarea, and Regenerate (session-only prompt edits — not written to ring-config).

    4. 4

      Mint with selected art calls adminActivateGateTemplateAction({ imageUri, regenerateArt: false }) → Metaplex Core mint → nft_gates edition row + db() active-template pointer (nft_active_{slug}). Runtime SSOT is listNftGateTemplatesResolved() (ring-config defaults + DB overlay). ring-config.json is never rewritten in k8s.

    Image + storage wiring

    PiecePath / env
    Conductorlib/images/conductor/image-conductor.ts
    xAI providerlib/images/providers/xai.provider.ts — /images/generations or /images/edits
    Favicon PNGpublic/images/favicon.png → data:image/png;base64,…
    Persistfile().upload → RingBaseAdapter when NEXT_PUBLIC_STORAGE_PROVIDER=ring_filebase
    Local→prod APIPort-forward ring-filebase-api to 127.0.0.1:18080 (see RingFileBase)

    Do not set RINGBASE_API_URL=https://api.ring-platform.org — that host is the Next.js app ingress, not ring-filebase-api. Uploads return HTML and surface as HTTP 500 in RingBaseAdapter.

    Persistence collections

    Migration 029_nft_gates_schema.sql creates JSONB collections: nft_gates, nft_stakes, nft_entitlement_cache, nft_ownership (plus related indexes). Cron: GET /api/cron/nft-gate-expiry → runNftGateExpiry (daily 4am schedule in SubscriptionConductor docs).

    Migration 031_nft_exhibition_market_schema.sql adds secondary-market persistence: nft_listings, nft_market_sales, and nft_market_collections.

    Ledger-dev vs on-chain

    If nft.collectionMint is empty, metaplex-core.ts issues ledger-dev asset ids when not production, or when ALLOW_LEDGER_NFT_MINT=1. Production refuses ledger mint without that flag.

    If nft.gateMarketProgramId is empty, SolanaMarketClient uses the shipped ledger-dev market adapter. If a program id is set in this build, list/cancel/buy throw because audited Anchor GateMarket CPI is not implemented yet.

    Anchor scaffolds exist at solana/programs/{gate-escrow,gate-market}. solana/SECURITY.md keeps both programs out of production until audit, Squads authority control, pinned IDs/IDLs, and invariant tests are complete.

    NFT Exhibition Marketplace

    Secondary trading for eligible vendor KEYS gates.

    1. Docs
    2. /Features
    3. /Solana NFT Gates

    Updated Jul 11, 20266 min listen

    1. Docs
    2. /Features
    3. /Solana NFT Gates

    Updated Jul 11, 20266 min listen

    1. Docs
    2. /Features
    3. /Solana NFT Gates

    Updated Jul 11, 20266 min listen