-
MetaMask Browser Extension
- Download from: https://metamask.io/download/
- Install on your browser
-
NFT.storage Account
- Sign up at: https://nft.storage/
- Create an API key in your account dashboard
- Go to https://nft.storage/
- Sign in to your account
- Click on "API Keys" in the dashboard
- Copy your API key
- Create a
.env.localfile in the project root:
```env NFT_STORAGE_TOKEN=your_copied_api_key_here ```
Important: This token is NOT prefixed with NEXT_PUBLIC_ because it's kept securely on the server only and never exposed to the client.
```bash npm install ```
```bash npm run dev ```
Visit http://localhost:3000 to start using SkillChain.
- Click "Connect Wallet" button in the header
- Approve the connection in MetaMask
- View your stored credentials
- Share QR codes with employers or institutions
- Verify credentials instantly
- Connect your MetaMask wallet
- Go to "Issuer" page
- Fill in:
- Credential name (e.g., "Bachelor of Science")
- Field of study
- Student's wallet address
- Optional expiry date
- Click "Issue Credential"
- Sign the transaction in MetaMask
- Credential is stored on IPFS (securely via server) and signed on-chain
- Scan a credential QR code with your device
- Upload credential metadata or enter token ID
- Verify instant authenticity check
- View credential details and issuer information
- Ensure MetaMask extension is installed and enabled
- Check that you have at least one account created in MetaMask
- Try switching networks in MetaMask and reconnecting
- Verify your API key is correctly set in
.env.local - Check that the token has sufficient credits
- Ensure you're connected to the internet
- Restart the development server after updating
.env.local
- Refresh the page after issuing
- Check your wallet address matches in MetaMask
- Verify the IPFS CID was returned from NFT.storage
- Development: Use Sepolia or Mumbai testnet (free faucets available)
- Production: Use Ethereum Mainnet or Polygon
- Demo: Sepolia Testnet is pre-configured
Visit: https://sepoliafaucet.com/ and paste your wallet address
Edit lib/web3.ts to add support for additional networks:
```typescript export const NETWORKS = { YOUR_NETWORK: { chainId: "0x...", name: "Your Network Name", rpcUrl: "https://your-rpc-url", }, } ```
Credentials are verified through:
- MetaMask signature validation
- IPFS content hash verification
- Timestamp validation
- Issuer wallet verification
- Client Side: MetaMask wallet connection and signing (user controls keys)
- Server Side: NFT.storage API key (securely stored, never exposed to client)
- IPFS: Immutable credential storage with content-addressed hashes
- Blockchain: Credential issuance events and signatures
For issues or questions:
- Check the troubleshooting section above
- Review MetaMask documentation: https://docs.metamask.io/
- Check NFT.storage docs: https://nft.storage/docs/
- Never share your MetaMask private keys
- Always verify wallet addresses before approving transactions
- NFT.storage API key is kept private on the server
- Credentials are immutable once stored on IPFS
Last Updated: 2025-11-22