A decentralized platform for verifying professional skills and managing freelance work with blockchain-powered credential NFTs and escrow payments.
ProofSkill solves the trust problem in the gig economy by combining verifiable skill credentials (NFTs) with a secure marketplace. Service providers get their skills verified and issued as soulbound NFTs, while clients can hire talent with confidence through automated escrow payments.
- Skill Credential NFT System: EIP-5192 compliant soulbound tokens for verified skills
- Secure Marketplace: Trustless escrow with automated dispute resolution
- Reputation System: Weighted scoring based on job value to prevent gaming
- Dispute Protection: 7-day auto-claim window after job completion
- Reentrancy Protection: All payment functions secured with OpenZeppelin ReentrancyGuard
- Batch Operations: Optimized read functions to reduce RPC calls by 80%
- Modern UI: Built with Next.js 14, TypeScript, and TailwindCSS
- Web3 Integration: Wagmi v2 and RainbowKit for wallet connections
- ENS Support: Displays ENS names instead of addresses where available
- Job Timeline: Visual progress tracking with dispute countdown
- Credential Badges: Verified skill indicators throughout the platform
- Solidity 0.8.20
- Hardhat 3.0 for development
- OpenZeppelin Contracts v5.4.0
- Sepolia Testnet deployment
- Next.js 14.2.3
- React 18.2.0
- TypeScript 5.4.5
- TailwindCSS 3.4.3
- Wagmi 2.5.7
- RainbowKit 2.0.4
- Viem 2.43.5
ProofSkill/
├── contracts/ # Smart contracts
│ ├── SkillCredentialNFT.sol
│ ├── SkillMarketplace.sol
│ ├── Reputation.sol
│ └── IssuerRegistry.sol
├── frontend/ # Next.js application
│ ├── src/
│ │ ├── app/ # Pages and routes
│ │ ├── components/ # React components
│ │ └── config/ # Contract addresses and ABIs
│ └── public/ # Static assets
├── ignition/ # Deployment scripts
│ └── modules/
└── test/ # Contract tests
- Node.js v18 or higher
- npm or yarn
- MetaMask or compatible Web3 wallet
- Clone the repository:
git clone https://github.com/yourusername/ProofSkill.git
cd ProofSkill- Install dependencies:
npm install- Create environment file:
cp .env.example .env- Configure your
.envfile:
SEPOLIA_RPC_URL=your_alchemy_or_infura_url
SEPOLIA_PRIVATE_KEY=your_private_key
ETHERSCAN_API_KEY=your_etherscan_api_key
- Navigate to frontend directory:
cd frontend- Install dependencies:
npm install- Create environment file:
cp .env.example .env.local- Configure your
.env.localfile:
NEXT_PUBLIC_ISSUER_REGISTRY_ADDRESS=0x...
NEXT_PUBLIC_SKILL_CREDENTIAL_NFT_ADDRESS=0x...
NEXT_PUBLIC_SKILL_MARKETPLACE_ADDRESS=0x...
NEXT_PUBLIC_REPUTATION_ADDRESS=0x...
NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID=your_project_id
npx hardhat compilenpx hardhat test- Set your private key:
npx hardhat keystore set SEPOLIA_PRIVATE_KEY- Deploy contracts:
npx hardhat ignition deploy ./ignition/modules/ProofSkill.ts --network sepolia-
Update frontend contract addresses in
frontend/src/config/contracts.ts -
Update ABIs in
frontend/src/config/abis.tsfromartifacts/folder
cd frontend
npm run devVisit http://localhost:3000 to access the application.
Manages authorized credential issuers. Only admin can add or remove issuers.
Key Functions:
addIssuer(address)- Add authorized issuer (admin only)removeIssuer(address)- Remove issuer (admin only)isAuthorizedIssuer(address)- Check if address can issue credentials
EIP-5192 compliant NFT system for skill credentials. Supports both soulbound and transferable tokens.
Key Functions:
mintCredential(address, string, string, bool)- Issue new credentiallocked(uint256)- Check if token is soulbound (EIP-5192)tokenURI(uint256)- Get credential metadata
Events:
CredentialMinted- New credential issuedLocked- Token marked as soulbound
Escrow-based marketplace with automatic dispute resolution.
Key Functions:
listService(string, string, uint256)- Create service listingcreateJob(uint256)- Hire a service provideracceptJob(uint256)- Provider accepts jobmarkJobComplete(uint256)- Provider marks work donereleasePayment(uint256)- Client approves and releases paymentautoClaimPayment(uint256)- Provider claims after 7-day dispute windowcancelJob(uint256)- Cancel and refund (before acceptance)getUserProfile(address)- Batch read user datagetMultipleJobs(uint256[])- Batch read job data
Constants:
PLATFORM_FEE_PERCENT= 2%DISPUTE_WINDOW= 7 days
Security:
- Reentrancy protection on all payment functions
- Immutable platform fee and wallet address
- Comprehensive event logging
Value-weighted reputation system to prevent gaming.
Key Functions:
rateProvider(uint256, uint256, string)- Rate completed jobgetProviderStats(address)- Get reputation metrics
Metrics:
- Total score
- Total jobs completed
- Simple average rating
- Weighted average (by job value)
- Total ETH volume
- Get skill verified by authorized issuer
- Receive soulbound NFT credential
- List services on marketplace
- Accept job requests
- Complete work and mark as done
- Receive payment (immediate or after 7 days)
- Build reputation through ratings
- Browse marketplace for verified talent
- Check provider credentials and reputation
- Create job with escrow payment
- Monitor job progress through timeline
- Approve completed work to release payment
- Rate provider (weighted by job value)
- Get authorized by platform admin
- Verify provider skills through assessment
- Issue soulbound credential NFTs
- Build trust in the ecosystem
- Reentrancy Protection: OpenZeppelin ReentrancyGuard on all payment functions
- Access Control: Role-based permissions for admin and issuers
- Immutable Constants: Platform fee and wallet cannot be changed after deployment
- Dispute Window: 7-day buffer for clients to dispute completed work
- Soulbound Tokens: Non-transferable credentials to prevent fraud
- Weighted Reputation: Economic value weighting prevents review manipulation
The project includes comprehensive test coverage:
# Run all tests
npx hardhat test
# Run specific test file
npx hardhat test test/Counter.ts
# Run with gas reporting
REPORT_GAS=true npx hardhat test- 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
SEPOLIA_RPC_URL= # Alchemy or Infura RPC endpoint
SEPOLIA_PRIVATE_KEY= # Deployer private key
ETHERSCAN_API_KEY= # For contract verification
NEXT_PUBLIC_ISSUER_REGISTRY_ADDRESS=
NEXT_PUBLIC_SKILL_CREDENTIAL_NFT_ADDRESS=
NEXT_PUBLIC_SKILL_MARKETPLACE_ADDRESS=
NEXT_PUBLIC_REPUTATION_ADDRESS=
NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID=
This project is licensed under the MIT License.
For questions or support, please open an issue on GitHub.
- OpenZeppelin for secure contract libraries
- Hardhat for development framework
- Next.js and Vercel for frontend infrastructure
- RainbowKit for wallet connection UI