A trustless escrow platform built on Stellar blockchain that enables secure freelance transactions with automated payment workflows, IPFS file storage, and client-side encryption.
- Trustless Transactions: Funds locked in Soroban smart contract until work approval
- Automated Workflows: No intermediaries - smart contract handles fund release/refund
- Multi-state Management: Created β Submitted β Approved/Cancelled/Revision
- Client-Side Encryption: Files encrypted before IPFS upload using AES-256-CBC
- Watermarking: Automatic watermark on preview files to prevent unauthorized use
- Secure Key Management: Encryption keys stored securely, only accessible post-approval
- Decentralized Storage: All work files stored on IPFS via Pinata
- Encrypted Uploads: Files encrypted before upload for maximum privacy
- Preview System: Watermarked previews for client review before approval
- Freighter Wallet Integration: Connect with Stellar Freighter wallet
- No Wallet Popups for Non-Payment Actions: Submit work and request revisions without blockchain confirmations
- Wallet Confirmations Only for Fund Movements: Approve and cancel operations require signatures
Frontend
- Next.js 14 (App Router)
- React 18
- TypeScript
- Freighter Wallet SDK
Backend
- Next.js API Routes
- File-based storage (jobs.json)
- IPFS (Pinata)
Blockchain
- Stellar Testnet
- Soroban Smart Contracts (Rust)
- Stellar SDK
Storage & Encryption
- IPFS via Pinata
- AES-256-CBC encryption
- Watermarking with Sharp.js
FairDeal(stellar)/
βββ app/ # Next.js App Router
β βββ api/ # API Routes
β β βββ jobs/ # Job management endpoints
β β βββ upload/ # File upload (IPFS)
β β βββ download/ # File download (decrypt)
β βββ jobs/[jobId]/ # Job details page
β βββ submit-work/[jobId]/ # Freelancer submission page
β βββ dashboard/ # User dashboard
βββ components/ # React components
β βββ WalletProvider.tsx # Freighter wallet integration
β βββ ...
βββ contract/ # Soroban smart contract
β βββ src/lib.rs # Contract logic
β βββ Cargo.toml
βββ utils/ # Utilities
β βββ contract-utils.ts # Contract interaction
β βββ encryption.ts # AES encryption
β βββ ipfs.ts # IPFS upload/download
βββ data/ # Backend storage
β βββ jobs.json # Job metadata
βββ .env.local # Environment variables
- Node.js 18+
- Rust & Cargo
- Stellar CLI (
stellar) - Freighter Wallet Extension
-
Clone the repository
git clone https://github.com/yourusername/fairdeal.git cd fairdeal -
Install dependencies
npm install
-
Configure environment variables
Create
.env.local:# Stellar Configuration NEXT_PUBLIC_STELLAR_NETWORK=testnet NEXT_PUBLIC_CONTRACT_ID=your_contract_id_here # Escrow Configuration ESCROW_SECRET_KEY=your_escrow_secret_key # IPFS (Pinata) PINATA_API_KEY=your_pinata_api_key PINATA_SECRET_API_KEY=your_pinata_secret PINATA_JWT=your_pinata_jwt
-
Build and deploy smart contract
cd contract cargo build --target wasm32-unknown-unknown --release stellar contract optimize --wasm target/wasm32-unknown-unknown/release/fairdeal_escrow.wasm stellar contract deploy --wasm target/wasm32-unknown-unknown/release/fairdeal_escrow.optimized.wasm --source-account default --network testnet -
Update contract ID in
.env.local -
Run development server
npm run dev
- Connect Wallet: Click "Connect Wallet" and approve Freighter connection
- Post Job: Create job with amount, deadline, and description
- Funds Locked: Payment automatically locked in smart contract escrow
- Review Work: View watermarked preview when freelancer submits
- Decide:
- Approve & Pay: Release funds to freelancer (requires wallet confirmation)
- Request Revision: Ask for changes without affecting escrow
- Cancel Deal: Refund to your wallet (requires wallet confirmation)
- Download: Access unencrypted files after approval
- Connect Wallet: Link your Freighter wallet
- View Jobs: Browse available jobs on dashboard
- Submit Work: Upload files (encrypted automatically before IPFS upload)
- No Wallet Popup: Submission happens without blockchain confirmation
- Get Paid: Receive payment when client approves (automatic via smart contract)
- Upload: Files encrypted with AES-256-CBC before IPFS upload
- Storage: Encrypted files stored on IPFS, keys stored in backend
- Preview: Watermarked preview generated for client review
- Approval: Original files decrypted and provided to client post-approval
- Trustless Escrow: Funds held by smart contract, not platform
- State Validation: Backend validates workflow transitions
- Authorization: Only job client can approve/cancel
- No Double-Spend: Contract prevents duplicate approvals
| Function | Description | Wallet Required? |
|---|---|---|
create_job |
Lock funds in escrow | β Yes |
submit_work |
Mark work as submitted | β No (backend only) |
approve_work |
Release funds to freelancer | β Yes |
cancel_deal |
Refund client | β Yes |
get_job |
Query job details | β No |
get_job_count |
Get total jobs | β No |
npm test # Frontend tests
cd contract && cargo test # Contract testsnpm run build
npm startcd contract
cargo build --target wasm32-unknown-unknown --release
stellar contract optimize --wasm target/wasm32-unknown-unknown/release/fairdeal_escrow.wasm| Variable | Description | Required |
|---|---|---|
NEXT_PUBLIC_STELLAR_NETWORK |
Stellar network (testnet/mainnet) | β |
NEXT_PUBLIC_CONTRACT_ID |
Deployed contract ID | β |
ESCROW_SECRET_KEY |
Escrow account secret key | β |
PINATA_API_KEY |
Pinata API key | β |
PINATA_SECRET_API_KEY |
Pinata secret | β |
PINATA_JWT |
Pinata JWT token | β |
- Support for multiple currencies (USDC, XLM)
- Dispute resolution mechanism
- Reputation system for freelancers
- Multi-milestone payments
- Mobile app (React Native)
- Mainnet deployment
Contributions are welcome! Please follow these steps:
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Stellar Development Foundation - Blockchain infrastructure
- Soroban - Smart contract platform
- Pinata - IPFS pinning service
- Freighter Wallet - Stellar wallet
For questions and support, please open an issue or contact your-email@example.com.
Built with β€οΈ for the Stellar ecosystem