A user-friendly dApp for quick token deployment on Stellar, targeting creators in Nigeria and emerging markets.
Features β’ Quick Start β’ Documentation β’ Contributing β’ Roadmap
- Overview
- Features
- Architecture
- Tech Stack
- Getting Started
- Project Structure
- Smart Contracts
- Frontend Application
- Testing
- Deployment
- Configuration
- API Reference
- Contributing
- Roadmap
- FAQ
- License
- Support
Stellar Token Deployer (Nova Launch) is a decentralized application that enables creators, entrepreneurs, and businesses in emerging markets to deploy custom tokens on the Stellar blockchain without writing a single line of code.
- π― No Coding Required: Simple form-based interface for token deployment
- π° Low Fees: Leverage Stellar's ultra-low transaction costs (~0.00001 XLM)
- β‘ Fast: Deploy tokens in seconds, not hours
- π Emerging Markets Focus: Optimized for users in Nigeria and other developing regions
- π Secure: Non-custodial, wallet-based authentication
- π± Mobile-First: Responsive design for all devices
Pay minimal XLM fees to deploy and mint tokens directly to your wallet. Optional metadata (images, descriptions) can be added via IPFS for a small additional fee. All fees funnel to the platform treasury, creating a sustainable business model aligned with Stellar's cheap transaction model.
- β Deploy custom tokens with configurable parameters
- β Set token name, symbol, decimals, and initial supply
- β Automatic minting to creator's wallet
- β Admin-controlled post-deployment minting
- β Fee collection to platform treasury
- β Token registry for tracking deployments
- β Wallet connection via Freighter
- β Network switching (Testnet/Mainnet)
- β Multi-step token deployment form
- β Real-time input validation
- β Fee calculation and breakdown
- β Transaction history tracking
- β Responsive, mobile-first design
- β Accessibility compliant (WCAG 2.1)
- β Optional IPFS metadata upload
- β Token images and descriptions
- β On-chain metadata URI storage
- β Image validation and preview
- β Comprehensive unit tests
- β Property-based testing
- β 27+ passing tests
- β >80% code coverage
- β TypeScript strict mode
- π Batch token deployment
- π Token analytics dashboard
- π Pro tier (clawback, multi-sig)
- π Multi-wallet support
- π± Mobile app (iOS/Android)
- π¨ Token templates
- π Token discovery marketplace
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Frontend (React/TS) β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β Token Deploy β β Wallet β β Transaction β β
β β Form β β Connection β β History β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Integration Layer β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β Stellar SDK β β Freighter β β IPFS β β
β β β β Wallet β β (Pinata) β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Stellar Network (Soroban) β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Token Factory Contract (Rust) β β
β β - create_token() β β
β β - mint_tokens() β β
β β - set_metadata() β β
β β - collect_fees() β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- User Input: User fills deployment form with token parameters
- Validation: Frontend validates all inputs client-side
- Metadata Upload (optional): Images uploaded to IPFS via Pinata
- Transaction Building: Stellar SDK builds contract invocation
- Wallet Signing: User signs transaction via Freighter
- Submission: Transaction submitted to Stellar network
- Confirmation: Monitor transaction status and confirmation
- Result: Display token address and transaction details
- History: Store deployment info in local storage
| Technology | Version | Purpose |
|---|---|---|
| Rust | 2021 | Smart contract language |
| Soroban SDK | 21.0.0 | Stellar smart contract framework |
| soroban-token-sdk | Latest | Token standard implementation |
| proptest | 1.4 | Property-based testing |
| Technology | Version | Purpose |
|---|---|---|
| React | 19.2.0 | UI framework |
| TypeScript | 5.9.3 | Type safety |
| Vite | 8.0.0-beta | Build tool |
| Tailwind CSS | 4.1.18 | Styling |
| Vitest | 4.0.18 | Testing framework |
| fast-check | 4.5.3 | Property-based testing |
| Service | Purpose |
|---|---|
| Stellar SDK | Blockchain interaction |
| Freighter | Wallet connection |
| Pinata | IPFS metadata storage |
| Horizon API | Transaction monitoring |
Before you begin, ensure you have the following installed:
- Node.js 18+ (Download)
- npm or yarn
- Rust 1.70+ (Install)
- Soroban CLI (Install Guide)
- Freighter Wallet (Chrome Extension)
- Clone the repository
git clone https://github.com/Emmyt24/Nova-launch.git
cd Nova-launch- Install frontend dependencies
cd frontend
npm install- Install Rust dependencies
cd ../contracts/token-factory
cargo build- Set up Soroban environment
# Run the setup script
chmod +x ../../scripts/setup-soroban.sh
../../scripts/setup-soroban.shThis script will:
- Install Rust and wasm32 target
- Install Soroban CLI
- Configure Stellar testnet
- Generate admin identity
- Provide funding instructions
cd frontend
# Start development server
npm run dev
# Run tests
npm test
# Run tests with UI
npm run test:ui
# Build for production
npm run build
# Preview production build
npm run previewThe frontend will be available at http://localhost:5173
cd contracts/token-factory
# Build contract
cargo build --target wasm32-unknown-unknown --release
# Run tests
cargo test
# Optimize WASM (requires soroban-cli)
soroban contract optimize \
--wasm target/wasm32-unknown-unknown/release/token_factory.wasm# Deploy
soroban contract deploy \
--wasm target/wasm32-unknown-unknown/release/token_factory.wasm \
--network testnet \
--source admin
# Initialize factory
soroban contract invoke \
--id <CONTRACT_ID> \
--network testnet \
--source admin \
-- initialize \
--admin <ADMIN_ADDRESS> \
--treasury <TREASURY_ADDRESS> \
--base_fee 70000000 \
--metadata_fee 30000000nova-launch/
βββ contracts/ # Smart contracts
β βββ token-factory/ # Token factory contract
β β βββ src/
β β β βββ lib.rs # Main contract logic
β β β βββ types.rs # Data structures
β β β βββ storage.rs # Storage management
β β β βββ test.rs # Contract tests
β β βββ Cargo.toml
β βββ Cargo.toml # Workspace config
β
βββ frontend/ # React frontend
β βββ src/
β β βββ components/ # React components
β β β βββ Layout/ # Layout components
β β β βββ UI/ # Reusable UI components
β β β βββ TokenDeployForm/
β β β βββ WalletConnect/
β β β βββ TransactionHistory/
β β βββ services/ # API services
β β β βββ stellar.ts # Stellar SDK integration
β β β βββ wallet.ts # Wallet service
β β β βββ ipfs.ts # IPFS service
β β βββ hooks/ # Custom React hooks
β β βββ types/ # TypeScript types
β β βββ utils/ # Utility functions
β β βββ config/ # Configuration
β β βββ test/ # Test utilities
β β βββ App.tsx # Main app component
β β βββ main.tsx # Entry point
β βββ public/ # Static assets
β βββ package.json
β βββ vite.config.ts
β
βββ scripts/ # Utility scripts
β βββ setup-soroban.sh # Soroban setup script
β
βββ .kiro/ # Kiro specs (excluded from git)
β βββ specs/
β βββ stellar-token-deployer/
β βββ requirements.md
β βββ design.md
β βββ tasks.md
β
βββ .gitignore
βββ README.md
The Token Factory is the core smart contract that handles token deployment and management.
Initialize the factory with admin, treasury, and fee structure.
pub fn initialize(
env: Env,
admin: Address,
treasury: Address,
base_fee: i128,
metadata_fee: i128,
) -> Result<(), Error>Deploy a new token with specified parameters.
pub fn create_token(
env: Env,
creator: Address,
name: String,
symbol: String,
decimals: u32,
initial_supply: i128,
fee_payment: i128,
) -> AddressAdd metadata URI to an existing token.
pub fn set_metadata(
env: Env,
token_address: Address,
admin: Address,
metadata_uri: String,
fee_payment: i128,
) -> Result<(), Error>Mint additional tokens (admin only).
pub fn mint_tokens(
env: Env,
token_address: Address,
admin: Address,
to: Address,
amount: i128,
fee_payment: i128,
) -> Result<(), Error>Update fee structure (admin only).
pub fn update_fees(
env: Env,
admin: Address,
base_fee: Option<i128>,
metadata_fee: Option<i128>,
) -> Result<(), Error>Get current factory state.
pub fn get_state(env: Env) -> FactoryStateGet information about a deployed token.
pub fn get_token_info(
env: Env,
index: u32
) -> Result<TokenInfo, Error>| Code | Error | Description |
|---|---|---|
| 1 | InsufficientFee |
Fee payment is below minimum |
| 2 | Unauthorized |
Caller not authorized for action |
| 3 | InvalidParameters |
Invalid token parameters |
| 4 | TokenNotFound |
Token not found in registry |
| 5 | MetadataAlreadySet |
Metadata already set for token |
| 6 | AlreadyInitialized |
Factory already initialized |
Located in frontend/src/components/UI/:
- Button: Configurable button with variants and loading states
- Input: Form input with validation and error display
- Card: Content card with optional title
- Spinner: Loading spinner with size variants
- Tooltip: Contextual help tooltips
- Modal: Accessible modal dialogs
- Toast: Notification system
- Skeleton: Loading placeholders
- ErrorBoundary: Error handling wrapper
- Header: Application header with branding
- Container: Responsive content container
Handles all Stellar network interactions.
class StellarService {
constructor(network: 'testnet' | 'mainnet');
async deployToken(params: TokenDeployParams): Promise<DeploymentResult>;
async mintTokens(tokenAddress: string, recipient: string, amount: string): Promise<string>;
async getTokenInfo(tokenAddress: string): Promise<TokenInfo>;
async getTransaction(hash: string): Promise<TransactionDetails>;
}Manages Freighter wallet connection.
class WalletService {
async connect(): Promise<string>;
disconnect(): void;
async signTransaction(xdr: string): Promise<string>;
async getBalance(address: string): Promise<string>;
isInstalled(): boolean;
}Handles metadata upload to IPFS.
class IPFSService {
async uploadMetadata(image: File, description: string, tokenName: string): Promise<string>;
async getMetadata(uri: string): Promise<TokenMetadata>;
}Manages wallet connection state.
const {
wallet, // WalletState
connect, // () => Promise<void>
disconnect, // () => void
isConnecting, // boolean
error // string | null
} = useWallet();Manages token deployment process.
const {
deploy, // (params: TokenDeployParams) => Promise<DeploymentResult>
isDeploying, // boolean
status, // DeploymentStatus
error // AppError | null
} = useTokenDeploy();Manages toast notifications.
const {
toasts, // ToastState[]
success, // (message: string) => void
error, // (message: string) => void
info, // (message: string) => void
warning // (message: string) => void
} = useToast();// Validate Stellar address
isValidStellarAddress(address: string): boolean
// Validate token parameters
validateTokenParams(params): { valid: boolean; errors: Record<string, string> }
// Validate image file
isValidImageFile(file: File): { valid: boolean; error?: string }// Format XLM amounts
formatXLM(amount: string | number): string
// Truncate addresses
truncateAddress(address: string, startChars?: number, endChars?: number): string
// Convert stroops to XLM
stroopsToXLM(stroops: number | string): number
// Convert XLM to stroops
xlmToStroops(xlm: number | string): number# Frontend tests
cd frontend
npm test # Run all tests
npm run test:ui # Run with UI
npm run test:coverage # Generate coverage report
# Contract tests
cd contracts/token-factory
cargo test # Run all tests
cargo test -- --nocapture # Run with outputLocated in __tests__ directories:
- Validation utilities
- Formatting utilities
- Component rendering
- Hook behavior
Using fast-check for frontend and proptest for contracts:
- Fee calculation consistency
- Token creation atomicity
- Supply conservation
- Admin-only operations
- Full deployment flow
- Wallet connection
- IPFS upload
- Transaction monitoring
Current coverage: >80%
# Generate coverage report
cd frontend
npm run test:coverage
# View report
open coverage/index.htmlcd contracts/token-factory
# Build optimized WASM
cargo build --target wasm32-unknown-unknown --release
soroban contract optimize --wasm target/wasm32-unknown-unknown/release/token_factory.wasm
# Deploy
CONTRACT_ID=$(soroban contract deploy \
--wasm target/wasm32-unknown-unknown/release/token_factory.wasm \
--network testnet \
--source admin)
echo "Contract deployed: $CONTRACT_ID"
# Initialize
soroban contract invoke \
--id $CONTRACT_ID \
--network testnet \
--source admin \
-- initialize \
--admin $(soroban keys address admin) \
--treasury $(soroban keys address treasury) \
--base_fee 70000000 \
--metadata_fee 30000000# Same as testnet but use --network mainnet
# Ensure you have funded mainnet accountscd frontend
# Install Vercel CLI
npm i -g vercel
# Deploy
vercel
# Production deployment
vercel --prodcd frontend
# Build
npm run build
# Deploy dist/ folder to NetlifyCreate .env file in frontend/:
VITE_FACTORY_CONTRACT_ID=<your_contract_id>
VITE_NETWORK=testnet
VITE_IPFS_API_KEY=<your_pinata_api_key>
VITE_IPFS_API_SECRET=<your_pinata_api_secret>Edit frontend/src/config/stellar.ts:
export const STELLAR_CONFIG = {
network: import.meta.env.VITE_NETWORK || 'testnet',
factoryContractId: import.meta.env.VITE_FACTORY_CONTRACT_ID || '',
testnet: {
networkPassphrase: 'Test SDF Network ; September 2015',
horizonUrl: 'https://horizon-testnet.stellar.org',
sorobanRpcUrl: 'https://soroban-testnet.stellar.org',
},
mainnet: {
networkPassphrase: 'Public Global Stellar Network ; September 2015',
horizonUrl: 'https://horizon.stellar.org',
sorobanRpcUrl: 'https://soroban-mainnet.stellar.org',
},
};Edit frontend/src/config/ipfs.ts:
export const IPFS_CONFIG = {
apiKey: import.meta.env.VITE_IPFS_API_KEY || '',
apiSecret: import.meta.env.VITE_IPFS_API_SECRET || '',
pinataApiUrl: 'https://api.pinata.cloud',
pinataGateway: 'https://gateway.pinata.cloud/ipfs',
};Default fees (in stroops, 1 XLM = 10,000,000 stroops):
| Tier | Features | Fee (XLM) | Fee (stroops) |
|---|---|---|---|
| Basic | Token deployment | 7 | 70,000,000 |
| Metadata | + IPFS metadata | +3 | +30,000,000 |
| Total | With metadata | 10 | 100,000,000 |
Fees can be updated by factory admin using update_fees function.
Currently, all interactions are direct with the blockchain via Stellar SDK.
Future versions will include a GraphQL API for:
- Token discovery
- Analytics
- User profiles
- Transaction history
We welcome contributions from the community! Please see our Contributing Guidelines for details.
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes
- Write/update tests
- Ensure tests pass:
npm test - Commit your changes:
git commit -m 'feat: add amazing feature' - Push to branch:
git push origin feature/amazing-feature - Open a Pull Request
- Follow existing code style
- Write TypeScript with strict mode
- Add JSDoc comments for public APIs
- Include unit tests for new features
- Update documentation as needed
- Maintain >80% code coverage
We follow Conventional Commits:
feat: add new feature
fix: bug fix
docs: documentation changes
style: code style changes
refactor: code refactoring
test: test changes
chore: build/tooling changes
good first issue- Great for newcomersenhancement- New featurebug- Something isn't workingdocumentation- Documentation improvementshelp wanted- Extra attention needed
- Token Factory smart contract
- Basic frontend UI
- Wallet connection
- Token deployment
- Metadata upload
- Transaction history
- Testing infrastructure
- Wallet integration (Freighter, Albedo, xBull)
- Stellar SDK integration
- IPFS integration
- Multi-step deployment form
- Real-time fee calculation
- Transaction monitoring
- Mobile optimization
- Batch token deployment
- Token templates
- Analytics dashboard
- Token discovery marketplace
- Social features
- Multi-language support
- Clawback functionality
- Multi-sig support
- Advanced token management
- API access
- White-label solutions
- Enterprise features
- Mobile apps (iOS/Android)
- Token launchpad
- Liquidity pools integration
- DEX integration
- NFT support
- DAO governance
Q: What is Nova Launch?
A: Nova Launch is a no-code platform for deploying custom tokens on the Stellar blockchain.
Q: Do I need coding experience?
A: No! Nova Launch is designed for non-technical users.
Q: What are the fees?
A: Base deployment is 7 XLM, with an additional 3 XLM for metadata.
Q: Which networks are supported?
A: Both Stellar testnet (for testing) and mainnet (for production).
**Q: Whi