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# Quick deployment (recommended)
./scripts/deploy-testnet.sh
# This script will:
# - Verify admin identity
# - Create treasury identity if needed
# - Deploy the contract
# - Initialize with proper configuration
# - Save deployment info to deployment-testnet.json
# - Run basic smoke tests
# Verify deployment
./scripts/verify-deployment.sh
# Update frontend environment
./scripts/update-frontend-env.shFor detailed deployment instructions, see DEPLOYMENT_GUIDE.md.
nova-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>Allows token holders to burn their own tokens, permanently removing them from circulation.
pub fn burn(
env: Env,
token_address: Address,
from: Address,
amount: i128,
) -> Result<(), Error>Parameters:
token_address: Address of the token contractfrom: Address of the token holder burning tokensamount: Amount of tokens to burn (in smallest unit)
Example:
// Burn 1000 tokens (with 7 decimals)
factory.burn(
&token_address,
&user_address,
&1000_0000000
);Allows token admin to burn tokens from any address (clawback).
pub fn admin_burn(
env: Env,
token_address: Address,
admin: Address,
from: Address,
amount: i128,
) -> Result<(), Error>Security Note: Only the token creator can perform admin burns.
Burn tokens from multiple addresses in a single transaction.
pub fn burn_batch(
env: Env,
token_address: Address,
burns: Vec<(Address, i128)>,
) -> Result<(), Error>Gas Optimization: More efficient than multiple individual burns.
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 |
| 7 | BurnAmountExceedsBalance |
Burn amount exceeds token balance |
| 8 | BurnNotEnabled |
Burn functionality not enabled |
| 9 | InvalidBurnAmount |
Burn amount is zero or negative |
Emitted when tokens are burned.
Data:
token_address: Addressfrom: Addressamount: i128burned_by: Addresstimestamp: u64is_admin_burn: bool
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