ADR-019: NFT Minting Infrastructure Integration β
Date: 2025-11-09 Status: π€ Proposed Decision Makers: Architecture Team Related ADRs: ADR-008 (EmProps UI Monorepo Integration)
Executive Summary β
This ADR proposes integrating the EmProps NFT minting infrastructure (three standalone packages: emprops-hardhat, emprops-ponder, emprops-react-web3) from the nft_investigation workspace into the emerge-turbo monorepo. The integration enables users to launch NFT collections from AI-generated content, creating a proof-of-concept for blockchain-based content monetization.
Current State:
- β
Smart Contracts - Complete Solidity implementation in
/Users/the_dusky/code/emprops/nft_investigation/emprops-hardhat - β
Blockchain Indexer - Ponder-based event indexing in
/Users/the_dusky/code/emprops/nft_investigation/emprops-ponder - β
React Web3 SDK - Demo implementation in
/Users/the_dusky/code/emprops/nft_investigation/emprops-react-web3 - β Integration - No connection to emerge-turbo platform
Target State:
- β Complete NFT Stack - Smart contracts, indexer, and launchpad UI integrated into monorepo
- β User Flow - "Launch as NFT" button in emprops-studio β NFT launchpad β payment β content generation β NFT minting
- β Proof of Concept - Self-contained NFT modules with minimal changes to existing apps
Key Decision: How do we integrate three separate NFT packages into emerge-turbo while maintaining isolation and creating a working proof-of-concept?
Table of Contents β
- Context
- Problem Statement
- Decision
- Technical Architecture
- Implementation Strategy
- Monorepo Structure
- Integration Points
- Migration Challenges
- Consequences
- Alternatives Considered
- Related Documentation
Context β
Current NFT Infrastructure β
The EmProps NFT system was developed 8 months ago as a proof-of-concept for blockchain-based ownership of AI-generated content. It consists of three packages:
nft_investigation/
βββ emprops-hardhat/ # Smart contract development & deployment
β βββ contracts/ # Solidity contracts (in backup/)
β βββ deploy/ # Hardhat deployment scripts
β βββ scripts/ # DB integration & simulation
β βββ backup/hardhat/ # β
COMPLETE CONTRACT IMPLEMENTATIONS
β βββ contracts/
β βββ OwnerTokenContract.sol # Master NFT for collection ownership
β βββ AppFactoryContract.sol # CREATE2 factory for NFT collections
β βββ SimpleAppContract.sol # ERC721A NFT collection
β βββ SimpleAppInitializerContract.sol # Collection configuration
β
βββ emprops-ponder/ # Blockchain event indexing & API
β βββ src/api/ # Hono HTTP API + WebSocket server
β βββ src/handlers/ # Event handlers for contract monitoring
β βββ ponder.schema.ts # 8-table PostgreSQL schema
β βββ ponder.config.ts # Dynamic contract configuration
β
βββ emprops-react-web3/ # React hooks & components (DEMO)
βββ src/hooks/ # useGetSimpleApps, useMintToken, etc.
βββ src/adapter/ # WagmiAdapter + PonderAdapter
βββ src/provider/ # EmPropsProvider context
βββ src/test/manual/ # Manual testing componentsExisting emerge-turbo Architecture β
The monorepo already has relevant infrastructure:
emerge-turbo/
βββ apps/
β βββ emprops-studio/ # Next.js UI (target for "Launch NFT" button)
β βββ emprops-api/ # Express API (could handle NFT operations)
β βββ monitor/ # Real-time dashboard (could show NFT metrics)
β βββ api/ # Core job orchestration
β
βββ packages/
βββ @emp/core/ # Shared utilities, Redis, OTEL
βββ @emp/database/ # Prisma client
βββ component-library/ # Shared React componentsBusiness Context β
Goal: Enable users to monetize AI-generated content through NFT collections
User Journey:
- User creates AI content in emprops-studio (existing flow)
- User clicks "Launch as NFT Collection" button (NEW)
- NFT launchpad opens with collection configuration form (NEW)
- User configures: name, symbol, max supply, mint price, etc.
- Payment validation (future: could require payment or NFT ownership)
- Content generation using existing ComfyUI workflows
- NFT collection deployed on-chain
- NFTs minted with AI-generated content as metadata
Constraints:
- β Proof of concept - self-contained, minimal impact on existing code
- β New button in emprops-studio is the ONLY change to existing apps
- β All NFT functionality isolated in new modules
- β Can be tested independently
Problem Statement β
Challenges β
Three Separate Repositories
- How do we consolidate without losing functionality?
- How do we maintain the contract deployment pipeline?
- How do we integrate blockchain indexing (Ponder) with existing infrastructure?
React Web3 SDK is a Demo
- The current
emprops-react-web3is a demo/testing harness - Need to extract useful patterns and integrate into actual UI
- Don't want to duplicate Web3 libraries (Wagmi, RainbowKit)
- The current
Database Management
- emprops-hardhat uses PostgreSQL for deployment tracking
- emprops-ponder uses PostgreSQL for event indexing
- emerge-turbo already has Prisma + PostgreSQL
- How do we consolidate database usage?
Minimal Integration
- Only a single button should change in emprops-studio
- All NFT features must be self-contained
- Need clear boundaries between existing platform and NFT modules
Smart Contract State
- Contracts are in
backup/folder, not main contracts folder - Need to validate they compile and work
- Deployment scripts reference database storage
- Contracts are in
Decision β
Integration Approach: Modular Proof-of-Concept Architecture β
We will integrate the NFT infrastructure as three new modules in the monorepo with minimal coupling to existing services:
packages/nft-contracts- Smart contract package (from emprops-hardhat)apps/nft-indexer- Ponder-based blockchain indexer (from emprops-ponder)apps/nft-launchpad- Next.js NFT collection launchpad UI (NEW, inspired by emprops-react-web3)
Key Principles β
β Isolation First - NFT modules are self-contained with clear APIs β Minimal Touch Points - Single button in emprops-studio, everything else is new β Proof of Concept - Not production-critical, can iterate independently β Reuse Patterns - Learn from emprops-react-web3 but don't copy it wholesale β Database Coexistence - NFT indexer uses separate schema, not Prisma
Technical Architecture β
High-Level Architecture β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β emerge-turbo Monorepo β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββ ββββββββββββββββββββ β
β β emprops-studio ββββββββββΆβ nft-launchpad β β
β β β "Launch β (Next.js) β β
β β (existing app) β NFT" β - Collection UI β β
β β β button β - Minting UI β β
β βββββββββββββββββββ β - Payment flow β β
β ββββββββββββββββββββ β
β β β
β β Web3 calls β
β βΌ β
β ββββββββββββββββββββ β
β β Blockchain β β
β β (Base/Ethereum) β β
β β β β
β β - OwnerToken β β
β β - AppFactory β β
β β - SimpleApp β β
β ββββββββββββββββββββ β
β β β
β β Events β
β βΌ β
β ββββββββββββββββββββ β
β β nft-indexer β β
β β (Ponder) β β
β β - Event handlers β β
β β - PostgreSQL β β
β β - WebSocket API β β
β ββββββββββββββββββββ β
β β β
β β Real-time data β
β βΌ β
β ββββββββββββββββββββ β
β β monitor β β
β β (existing) β β
β β + NFT metrics β β
β ββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β packages/nft-contracts β β
β β - Solidity contracts β β
β β - Hardhat config β β
β β - Deployment scripts β β
β β - TypeChain generated types β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββSmart Contract Architecture β
Contract Hierarchy:
OwnerTokenContract (ERC721A Upgradeable)
β
ββββ Represents ownership of an NFT collection
Each token ID = ownership of one collection
AppFactoryContract (UUPS Upgradeable)
β
ββββ Creates new NFT collections using CREATE2
ββββ Deterministic addresses (same on all chains)
ββββ Mints OwnerToken when collection is created
SimpleAppContract (ERC721A, Minimal Proxy)
β
ββββ Individual NFT collection
ββββ Controlled by OwnerToken holder
ββββ Configurable: maxSupply, mintPrice, maxPerMint, startTime
ββββ Public minting with paymentKey Features:
- ERC721A - Gas-optimized batch minting
- UUPS Upgradeable - Can upgrade factory and owner token
- ERC1167 Minimal Proxy - Cheap collection deployment (~$5 vs ~$200)
- Cross-chain Compatible - Same collection address on all chains (CREATE2)
- Owner Token Gating - Only OwnerToken holder can manage collection
Monorepo Structure β
Proposed Directory Layout β
emerge-turbo/
βββ apps/
β βββ emprops-studio/ # EXISTING (minimal change)
β β βββ pages/
β β βββ studio/apps/v2/
β β βββ [id].tsx # βοΈ ADD: "Launch as NFT" button
β β
β βββ nft-launchpad/ # π NEW APP
β β βββ pages/
β β β βββ _app.tsx # Wagmi + RainbowKit providers
β β β βββ index.tsx # Collection gallery
β β β βββ create.tsx # Create collection form
β β β βββ [collection]/
β β β βββ index.tsx # Collection details
β β β βββ mint.tsx # Minting interface
β β βββ components/
β β β βββ CollectionCard.tsx
β β β βββ MintButton.tsx
β β β βββ CreateCollectionForm.tsx
β β βββ hooks/
β β β βββ useCreateCollection.ts
β β β βββ useMintNFT.ts
β β β βββ useCollections.ts
β β βββ lib/
β β β βββ wagmi.ts # Wagmi configuration
β β β βββ contracts.ts # Contract addresses & ABIs
β β βββ package.json
β β
β βββ nft-indexer/ # π NEW APP (from emprops-ponder)
β β βββ src/
β β β βββ api/
β β β β βββ index.ts # Hono API routes
β β β β βββ sockets/ # WebSocket server
β β β βββ handlers/
β β β β βββ OwnerToken.ts
β β β β βββ AppFactory.ts
β β β β βββ SimpleApp.ts
β β β βββ utils/
β β β βββ db.ts # Contract registry
β β βββ ponder.config.ts # Dynamic contract loading
β β βββ ponder.schema.ts # 8-table schema
β β βββ package.json
β β
β βββ monitor/ # EXISTING (optional enhancement)
β β βββ pages/
β β βββ nft-metrics.tsx # π§ OPTIONAL: NFT dashboard
β β
β βββ emprops-api/ # EXISTING (optional enhancement)
β βββ src/routes/
β βββ nft.ts # π§ OPTIONAL: NFT metadata API
β
βββ packages/
β βββ nft-contracts/ # π NEW PACKAGE (from emprops-hardhat)
β β βββ contracts/
β β β βββ OwnerTokenContract.sol
β β β βββ AppFactoryContract.sol
β β β βββ SimpleAppContract.sol
β β β βββ SimpleAppInitializerContract.sol
β β β βββ interfaces/
β β β βββ proxy/
β β βββ deploy/
β β β βββ 00_owner_token.ts
β β β βββ 01_app_factory.ts
β β β βββ 02_simple_app_impl.ts
β β βββ scripts/
β β β βββ db/ # Database storage scripts
β β β βββ simulate/ # Contract testing scripts
β β βββ test/
β β βββ hardhat.config.ts
β β βββ tsconfig.json
β β βββ package.json
β β
β βββ @emp/core/ # EXISTING (no changes)
β
βββ pnpm-workspace.yaml # EXISTING (already includes packages/*, apps/*)Package Naming Conventions β
nft-contracts- Contains smart contracts (not@emp/nft-contractsto keep Hardhat independent)nft-indexer- Ponder application (app, not package)nft-launchpad- Next.js frontend application
Implementation Strategy β
Phase 1: Documentation & Validation (Week 1) β
Goal: Understand what we have and validate it works
Create comprehensive documentation for each of the three repos:
- Document contract architecture and deployment flow
- Document Ponder indexing setup and API
- Document React Web3 patterns worth keeping
Validate contracts compile and test:
bashcd emprops-hardhat pnpm install pnpm compile pnpm testReview and create final integration plan
Phase 2: Contract Package Migration (Week 1-2) β
Goal: Get smart contracts into monorepo and deployable
Create
packages/nft-contracts:- Copy contracts from
backup/hardhat/contracts/topackages/nft-contracts/contracts/ - Copy deployment scripts
- Update hardhat.config.ts for monorepo context
- Update database storage scripts to use shared PostgreSQL
- Copy contracts from
Test compilation:
bashpnpm --filter nft-contracts compile pnpm --filter nft-contracts testDeploy to testnet (Base Sepolia):
bashpnpm --filter nft-contracts deploy --network baseSepoliaStore deployment info in database for Ponder to read
Phase 3: Indexer App Migration (Week 2) β
Goal: Get Ponder indexer running and tracking events
Create
apps/nft-indexer:- Copy from emprops-ponder
- Update ponder.config.ts to read contracts from monorepo database
- Ensure PostgreSQL schema doesn't conflict with Prisma
Test locally:
bashpnpm --filter nft-indexer devVerify API endpoints:
GET /api/apps- List all NFT collectionsGET /api/owner-tokens- List owner tokens- WebSocket connection for real-time events
Phase 4: Launchpad App Creation (Week 2-3) β
Goal: Create NFT launchpad UI inspired by emprops-react-web3
Create
apps/nft-launchpad(new Next.js app):- Set up Wagmi + RainbowKit configuration
- Create collection creation form
- Create minting interface
- Connect to nft-indexer API for data
Extract useful patterns from emprops-react-web3:
- Adapter pattern (WagmiAdapter for on-chain, API for indexed data)
- React Query integration
- Transaction hooks pattern
- Error handling patterns
DO NOT copy wholesale:
- Don't create another provider package
- Build hooks directly in nft-launchpad
- Use established patterns from emprops-studio
Phase 5: emprops-studio Integration (Week 3) β
Goal: Add "Launch as NFT" button - THE ONLY CHANGE to existing apps
Add button to app pages:
tsx// apps/emprops-studio/pages/studio/apps/v2/[id].tsx <Button onClick={() => router.push('/nft-launchpad/create?sourceApp=' + id)}> Launch as NFT Collection </Button>Pass context to launchpad:
- App ID
- Generated content reference
- User wallet (if connected)
That's it - all other NFT functionality is in nft-launchpad
Phase 6: Testing & Documentation (Week 3-4) β
Goal: Validate end-to-end flow and document
Test complete flow:
- Click "Launch as NFT" in emprops-studio
- Configure collection in nft-launchpad
- Deploy collection on testnet
- Verify indexer picks up events
- Mint NFTs
- Verify ownership
Create documentation:
- User guide for NFT launching
- Developer guide for contracts
- API documentation for indexer
Optional: Add metrics to monitor:
- Collections created
- NFTs minted
- Total revenue
Integration Points β
1. emprops-studio β nft-launchpad β
Touch Point: Single button in app pages
// apps/emprops-studio/pages/studio/apps/v2/[id].tsx
import Link from 'next/link';
// Inside component render:
<Link href={`/nft-launchpad/create?sourceApp=${appId}`}>
<Button>Launch as NFT Collection</Button>
</Link>Data Flow:
- App ID passed via query parameter
- nft-launchpad reads app details (could call emprops-api)
- User configures NFT collection
- Collection deployed independently
2. nft-launchpad β nft-indexer β
Touch Point: REST API + WebSocket for data
// apps/nft-launchpad/lib/api.ts
const NFT_INDEXER_URL = process.env.NEXT_PUBLIC_NFT_INDEXER_URL;
export async function getCollections() {
const response = await fetch(`${NFT_INDEXER_URL}/api/apps`);
return response.json();
}
// WebSocket for real-time updates
const socket = io(NFT_INDEXER_URL);
socket.on('emprops:appToken:minted', (data) => {
// Update UI
});3. nft-indexer β Blockchain β
Touch Point: Ponder reads contract events
// apps/nft-indexer/ponder.config.ts
export default {
networks: {
baseSepolia: {
chainId: 84532,
transport: http(process.env.PONDER_RPC_URL_84532)
}
},
contracts: {
AppFactory: {
// Dynamically loaded from database
abi: AppFactoryAbi,
address: await getContractAddress('AppFactoryProxyContract'),
network: 'baseSepolia',
startBlock: deploymentBlock
}
}
}4. nft-contracts β Database β
Touch Point: Deployment info stored for indexer
// packages/nft-contracts/scripts/db/storeDeployments.ts
await pool.query(`
INSERT INTO contract_deployments (name, address, network, abi)
VALUES ($1, $2, $3, $4)
`, [contractName, address, networkName, JSON.stringify(abi)]);5. Optional: monitor β nft-indexer β
Touch Point: Display NFT metrics (future enhancement)
// apps/monitor/pages/nft-metrics.tsx
import useSWR from 'swr';
export default function NFTMetrics() {
const { data } = useSWR('/api/nft-stats', fetcher);
return (
<div>
<Metric label="Collections Created" value={data?.collections} />
<Metric label="NFTs Minted" value={data?.minted} />
</div>
);
}Migration Challenges β
1. Database Coexistence β
Challenge: emprops-hardhat and emprops-ponder both use PostgreSQL, but emerge-turbo uses Prisma
Solution:
- NFT packages use separate schemas in same PostgreSQL instance
- Don't integrate with Prisma (keep isolated)
- Create
nft_contractsandnft_indexerschemas - Ponder manages its own schema (already does this)
-- Database structure
postgres://
βββ public # emerge-turbo Prisma schema
βββ nft_contracts # Contract deployments (Hardhat)
βββ ponder_* # Ponder indexer tables (auto-managed)2. Contract Location β
Challenge: Contracts currently in backup/ folder
Solution:
- Move from
backup/hardhat/contracts/topackages/nft-contracts/contracts/ - Validate compilation
- Update deployment scripts
- Run tests to ensure nothing broke
3. React Web3 SDK is a Demo β
Challenge: emprops-react-web3 is a testing harness, not production code
Solution:
- Don't migrate emprops-react-web3 as a package
- Extract useful patterns:
- Adapter pattern for dual data sources
- Transaction hooks structure
- React Query integration
- Build fresh in nft-launchpad using these patterns
- Reference emprops-react-web3 as documentation only
4. Dependency Duplication β
Challenge: NFT packages have many overlapping dependencies with emerge-turbo
Solution:
- Use workspace protocol:
"@emp/core": "workspace:*" - Share where possible: TypeScript, Prettier, ESLint configs
- Keep separate where needed: Wagmi, Viem versions for Web3 compatibility
5. Port Conflicts β
Challenge: Multiple apps need to run simultaneously
Solution:
emprops-studio: 3336 (existing)
nft-launchpad: 3337 (new)
nft-indexer: 3338 (new)
monitor: 3334 (existing)6. Environment Variables β
Challenge: Each package needs different config
Solution:
- Create
.env.nftfor NFT-specific variables - Use
dotenv-clito load:dotenv -e .env.nft -- pnpm dev - Document required variables:
# .env.nft
NFT_INDEXER_URL=http://localhost:3338
NEXT_PUBLIC_NFT_INDEXER_URL=http://localhost:3338
PONDER_RPC_URL_84532=https://base-sepolia.g.alchemy.com/v2/YOUR_KEY
PONDER_DATABASE_URL=postgresql://localhost/nft_investigation
HARDHAT_DATABASE_URL=postgresql://localhost/nft_investigation
DEPLOYER_PRIVATE_KEY=0x...Consequences β
Positive Consequences β
β Unified Codebase
- Single repo for entire platform (AI + NFT)
- Easier to coordinate releases
- Shared tooling and CI/CD
β Proof of Concept Isolation
- NFT features are self-contained
- Can iterate independently
- Minimal risk to existing platform
β Clear Boundaries
- One button in emprops-studio
- All NFT complexity isolated in new modules
- Easy to remove if POC fails
β Reusable Infrastructure
- Indexer pattern can be reused for other on-chain features
- Contract deployment pipeline established
- Web3 integration patterns documented
β Learning Foundation
- Team learns blockchain integration
- Establishes patterns for future Web3 features
- Creates monetization pathway
Negative Consequences β
β οΈ Increased Complexity
- More apps to manage (3 new)
- Blockchain dependencies add uncertainty
- Need to understand Solidity, Hardhat, Ponder
β οΈ External Dependencies
- Blockchain RPC reliability
- Gas costs for deployment
- Smart contract security risks
β οΈ Database Proliferation
- Multiple schemas in PostgreSQL
- Not using Prisma for NFT data
- More database management overhead
β οΈ Separate Deployment
- Smart contracts deployed independently
- Indexer needs to be running
- Launchpad depends on both
Mitigation Strategies β
Gradual Rollout
- Start with testnet only
- Internal testing first
- Limited beta with select users
Documentation
- Comprehensive setup guides
- Architecture diagrams
- Troubleshooting playbook
Monitoring
- Contract event tracking
- Indexer health checks
- Transaction failure alerts
Fallback Plan
- Can remove NFT modules without impacting platform
- Contracts are immutable once deployed
- Keep emprops-react-web3 as reference
Alternatives Considered β
Alternative 1: Keep NFT Infrastructure Separate β
Approach: Leave emprops-hardhat, emprops-ponder, emprops-react-web3 as separate repos
Pros:
- No migration effort
- Clear separation of concerns
- Independent versioning
Cons:
- Harder to integrate with emprops-studio
- Duplicate tooling and setup
- Split deployment pipeline
- Rejected: Goal is integration, not separation
Alternative 2: Full Integration with Shared Infrastructure β
Approach: Integrate NFT data into Prisma, use emprops-api for all NFT operations
Pros:
- Single API
- Unified database
- Consistent patterns
Cons:
- High coupling
- Blockchain data doesn't fit Prisma model well
- Changes Ponder's auto-managed schema approach
- Rejected: Too much coupling for a proof of concept
Alternative 3: Microservices with Separate Deployment β
Approach: Deploy NFT services independently, integrate via API only
Pros:
- True isolation
- Independent scaling
- Can use different tech stack
Cons:
- Deployment complexity
- Cross-service coordination
- Network latency
- Rejected: Overkill for proof of concept
Alternative 4: Serverless Functions for NFT Operations β
Approach: Use Vercel/Netlify functions instead of dedicated apps
Pros:
- Auto-scaling
- Pay-per-use
- Simpler deployment
Cons:
- Ponder can't run serverless (needs persistent process)
- Smart contract deployment needs local setup
- Cold start issues for blockchain calls
- Rejected: Ponder requires long-running process
Related Documentation β
ADRs β
- ADR-008: EmProps UI Monorepo Integration (similar migration pattern)
- ADR-006: Logging Architecture (shared observability approach)
Technical Docs β
- EmProps NFT Architecture (to be created)
- Smart Contract Deployment Guide (to be created)
- Ponder Indexer Setup (to be created)
External References β
Decision Log β
| Date | Decision | Rationale |
|---|---|---|
| 2025-11-09 | Integrate as three separate modules | Maintains isolation for POC |
| 2025-11-09 | Don't migrate emprops-react-web3 as package | It's a demo, extract patterns instead |
| 2025-11-09 | Use separate database schemas | Avoid Prisma/Ponder conflicts |
| 2025-11-09 | Single button in emprops-studio only | Minimal touch point reduces risk |
Next Steps β
- Create comprehensive documentation of three repos (emprops-hardhat, emprops-ponder, emprops-react-web3)
- Validate contracts compile and test in current location
- Review and approve this ADR
- Create detailed implementation plan with week-by-week tasks
- Begin Phase 1: Documentation & Validation
Appendix: Contract Details β
OwnerTokenContract β
Purpose: Master NFT representing ownership of an NFT collection
Key Functions:
factoryMint(address to)- Mint new owner token (factory only)getTokensByOwner(address owner)- Get all tokens for an addresssetFactory(address factory)- Set authorized factory (one-time)
Upgrade Pattern: UUPS (owner can upgrade)
AppFactoryContract β
Purpose: Factory for creating NFT collections with deterministic addresses
Key Functions:
registerImplementation(address impl, address initializer)- Register new app typecreateApp(bytes32 appType, string appId, ...)- Create new collectionpredictAppAddress(bytes32 appType, bytes32 salt)- Preview deployment address
Upgrade Pattern: UUPS (owner can upgrade)
SimpleAppContract β
Purpose: Individual ERC721A NFT collection
Key Functions:
mint(uint256 quantity)- Public minting with paymentwithdraw()- Owner withdraws sales proceedssetPaused(bool paused)- Owner pauses/unpauses mintingsetMaxSupply(uint256),setMintPrice(uint256), etc. - Owner/initializer config
Upgrade Pattern: Minimal Proxy (cheap deployment, not upgradeable)
SimpleAppInitializerContract β
Purpose: One-time initialization of SimpleApp parameters
Key Functions:
initializeApp(address app, bytes initData)- Set minting parameters
Pattern: Immutable (deployed per factory)
Status: π€ Awaiting approval
Approvers:
- [ ] Technical Lead
- [ ] Product Owner
- [ ] DevOps Lead
Approval Date: Pending
