Etched is a decentralized platform for issuing and verifying academic credentials as Soulbound Tokens (SBT). SBTs are non-transferable NFTs permanently bound to a recipient's wallet, making them ideal for credentials that should never be sold or transferred.
- π Soulbound Tokens - Certificates cannot be transferred or sold
- β Multi-level verification - Admin β Validator β Certificator workflow
- ποΈ Institution-based - Validators are tied to specific institutions
- π On-chain verification - Anyone can verify a certificate by its hash
- π Wallet-based auth - No passwords, just sign with your wallet
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β Frontend ββββββΆβ Backend ββββββΆβ Smart Contract β
β (Next.js) β β (Actix Web) β β (Solidity) β
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β β β
βΌ βΌ βΌ
React + ethers.js JWT + Wallet Auth ERC721 + SBT
Wallet Connect Metadata Hosting AccessControl
| Role | Description |
|---|---|
| Admin | Verifies validators from institutions. Adds/removes validators on-chain. |
| Validator | Reviews certificate requests. Approves or rejects, triggering SBT mint. |
| Certificator | Submits certificate data. Receives hash for public verification. |
- Node.js 18+
- Rust 1.70+
- MetaMask or compatible wallet
cd contracts
npm install
cp .env.example .env
# Edit .env with your PRIVATE_KEY
# Start local Hardhat node
npx hardhat node
# Deploy (in new terminal)
npx hardhat run scripts/deploy.js --network localhostSave the deployed contract address for frontend config.
cd backend
cp .env.example .env
# Edit .env - set ADMIN_ADDRESSES to your wallet address
cargo run
# Server runs at http://localhost:8080cd frontend
npm install
cp .env.example .env.local
# Edit .env.local:
# - NEXT_PUBLIC_CONTRACT_ADDRESS=<deployed address>
# - NEXT_PUBLIC_CHAIN_ID=31337
npm run dev
# App runs at http://localhost:3000- Add network:
http://localhost:8545(Chain ID: 31337) - Import test account from Hardhat (first account is admin)
- Connect wallet on the app
Admin wallet β Sign in β Add validator address + institution info β On-chain tx
Certificator β Fill certificate form β Create metadata β Submit on-chain request
Validator β View pending requests β Verify off-chain β Approve β SBT minted to recipient
Anyone β Enter certificate hash β Verify on-chain β See token details
JWT_SECRET=your-secret-key
ADMIN_ADDRESSES=0xYourAdminWallet,0xAnotherAdmin
PUBLIC_BASE_URL=http://localhost:8080
BIND_ADDR=0.0.0.0:8080NEXT_PUBLIC_API_BASE=http://localhost:8080
NEXT_PUBLIC_CONTRACT_ADDRESS=0xDeployedContractAddress
NEXT_PUBLIC_CHAIN_ID=31337PRIVATE_KEY=0xYourPrivateKey
SEPOLIA_RPC_URL=https://sepolia.infura.io/v3/YOUR_KEY
MUMBAI_RPC_URL=https://polygon-mumbai.infura.io/v3/YOUR_KEY
POLYGON_RPC_URL=https://polygon-mainnet.infura.io/v3/YOUR_KEYSee docs/API.md for complete API reference.
# Get auth nonce
curl -X POST http://localhost:8080/auth/nonce \
-H 'Content-Type: application/json' \
-d '{"address":"0x..."}'
# List validators
curl http://localhost:8080/validators
# Create metadata (requires JWT)
curl -X POST http://localhost:8080/metadata \
-H 'Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{"certificate_name":"Diploma","recipient_name":"John",...}'| Network | Chain ID | Status |
|---|---|---|
| Localhost | 31337 | Development |
| Sepolia | 11155111 | Testnet |
| Polygon Mumbai | 80001 | Testnet |
| Polygon Mainnet | 137 | Production |
etched/
βββ contracts/ # Solidity smart contracts
β βββ CertificateSBT.sol
β βββ scripts/deploy.js
β βββ hardhat.config.js
βββ backend/ # Rust Actix Web API
β βββ src/main.rs
β βββ Cargo.toml
βββ frontend/ # Next.js React app
β βββ src/app/
β βββ src/lib/
β βββ package.json
βββ docs/ # Documentation
β βββ API.md
βββ README.md
- Soulbound: Tokens cannot be transferred after minting
- Role-based access: Smart contract enforces Admin/Validator permissions
- Signature verification: Backend verifies EIP-191 signatures
- Institution binding: Validators can only approve requests from their institution
MIT License - see LICENSE for details.
Built with β€οΈ for trustworthy credentials