Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
LABS
Guides

Setting Up a Non-Transferable Soulbound Token (SBT) System for Degrees

This guide provides a technical blueprint for issuing academic degrees as soulbound tokens on EVM-compatible chains. It covers smart contract design to prevent transfer, integration with registrar systems for minting, and building verification interfaces for employers. It also addresses revocation mechanisms for rare cases like degree rescindment.
Chainscore © 2026
introduction
TUTORIAL

Introduction: Digital Degrees as Soulbound Tokens

This guide explains how to implement a non-transferable, on-chain credential system for academic degrees using Soulbound Tokens (SBTs) and the ERC-721 standard.

A Soulbound Token (SBT) is a non-transferable, non-financialized NFT that represents a credential, affiliation, or achievement bound to a single blockchain address (a "Soul"). For digital degrees, this creates a permanent, verifiable, and tamper-proof record of academic accomplishment. Unlike traditional NFTs, SBTs cannot be sold or transferred, ensuring the credential's authenticity remains tied to the graduate's identity. This concept, popularized by Vitalik Buterin, Glen Weyl, and Puja Ohlhaver in their 2022 paper "Decentralized Society: Finding Web3's Soul," provides the foundation for building trustless verification systems.

To implement this, we use a modified ERC-721 standard, the most common NFT specification. The key modification is overriding the transferFrom and safeTransferFrom functions to revert all transactions, rendering the token permanently soulbound. The issuer—typically a university's administrative wallet—retains exclusive minting rights. When a student graduates, the issuer mints a unique SBT to the graduate's wallet address. The token's metadata, stored on-chain or via a decentralized storage solution like IPFS or Arweave, contains essential details: the graduate's name, degree title, field of study, issuing institution, and date of conferral.

Here is a simplified code snippet for the core smart contract logic, written in Solidity. The contract inherits from OpenZeppelin's ERC-721 implementation and uses the onlyOwner modifier to restrict minting.

solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract DegreeSBT is ERC721, Ownable {
    uint256 private _nextTokenId;

    constructor(string memory name, string memory symbol)
        ERC721(name, symbol)
        Ownable(msg.sender)
    {}

    // Mint a new SBT to the graduate's address
    function safeMint(address to, string memory tokenURI) public onlyOwner {
        uint256 tokenId = _nextTokenId++;
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, tokenURI);
    }

    // Override transfer functions to make token non-transferable
    function _update(address to, uint256 tokenId, address auth) internal virtual override returns (address) {
        address from = _ownerOf(tokenId);
        if (from != address(0) && to != address(0)) {
            revert("SoulboundToken: Non-transferable");
        }
        return super._update(to, tokenId, auth);
    }
}

Deploying this system requires careful planning. The issuer must manage private keys securely, establish a clear process for minting requests, and decide on metadata standards. Using a structured metadata schema (like those proposed by the W3C for Verifiable Credentials) ensures interoperability. Verification is permissionless: anyone can query the blockchain to confirm a degree's existence, issuer, and recipient without contacting the university. This reduces administrative overhead and fraud. However, considerations around student privacy (e.g., storing hashed data off-chain) and the permanence of on-chain data are critical.

Real-world implementations are emerging. The Blockchain-based Diploma project at MIT and the European Blockchain Services Infrastructure (EBSI) for educational credentials demonstrate practical use cases. These systems shift the paradigm from institution-held records to user-controlled, portable credentials. The next sections will cover advanced topics: integrating zero-knowledge proofs for selective disclosure, building a front-end verifier dApp, and managing revocation mechanisms for exceptional cases like degree rescindment.

prerequisites
GETTING STARTED

Prerequisites and Tech Stack

Before deploying a non-transferable Soulbound Token (SBT) system for academic credentials, you need to establish a solid technical foundation. This guide outlines the required knowledge, tools, and infrastructure.

A foundational understanding of blockchain fundamentals and smart contract development is essential. You should be comfortable with concepts like accounts, transactions, gas, and the Ethereum Virtual Machine (EVM). Proficiency in Solidity is required, as it's the primary language for writing the SBT logic on EVM-compatible chains like Ethereum, Polygon, or Base. Familiarity with development frameworks such as Hardhat or Foundry is necessary for compiling, testing, and deploying your contracts.

You will need a development environment and key tools. Install Node.js (v18 or later) and a package manager like npm or yarn. Use Hardhat for its robust testing environment and plugin ecosystem, or Foundry for its speed and built-in fuzzing tests. An Ethereum wallet (e.g., MetaMask) is required for deployment, and you'll need test ETH or MATIC from a faucet for your target network. For interacting with contracts programmatically, a library like ethers.js (v6) or viem is recommended.

The core of the system is the smart contract implementing the SBT standard. While you can write a custom contract, using established, audited bases like OpenZeppelin's contracts is a security best practice. Import ERC721 and utilize the _burn function override to prevent transfers, or use community-vetted implementations like the SBT-specific EIP-4973 reference. Your contract must include functions for authorized minting (restricted to the university's admin wallet) and potentially revocation of credentials.

A secure and reliable method for storing the credential's metadata is critical. Avoid storing large data on-chain due to cost. Instead, use a decentralized storage protocol like IPFS or Arweave. The on-chain token should contain a tokenURI pointing to a JSON file on IPFS (e.g., ipfs://QmX.../degree.json). This JSON file follows the ERC721 Metadata Standard, containing the degree name, recipient, issuing institution, issuance date, and a link to a verifiable PDF or transcript.

Consider the deployment architecture and access control. You will need a secure admin wallet (likely a multi-sig like Safe{Wallet}) to own the contract and perform privileged actions. Plan the user onboarding flow: will graduates claim their SBT via a signature from the admin (EIP-712), or will the university mint directly to their wallets? You'll need a backend service or oracle to verify real-world data before triggering a mint.

Finally, prepare for testing and verification. Write comprehensive unit and integration tests for all minting, revocation, and non-transferability logic. Use Hardhat's mainnet forking to simulate real conditions. Before mainnet deployment, get a security audit from a reputable firm. After deployment, verify your contract's source code on block explorers like Etherscan or Polygonscan to ensure transparency and allow for easy verification by third parties like employers.

key-concepts
DEVELOPER FOUNDATIONS

Core Concepts for SBT Degree Systems

Essential technical concepts and tools for building a secure, verifiable, and non-transferable credentialing system on-chain.

04

Revocation and Expiry Mechanisms

Academic credentials may need to be revoked (e.g., for academic misconduct) or expire (e.g., professional certifications). Build these states into your contract logic. Common patterns include:

  • Revocation List: Maintain a mapping or merkle tree of revoked token IDs. Verifiers must check this state.
  • Expiry Timestamp: Store a uint256 expiryDate in the token's metadata. The credential is considered valid only if block.timestamp < expiryDate.
  • Status Registry: Use an external, updatable contract managed by the issuer to query the current validity of any SBT, separating the immutable record from its current status.
06

Gas Optimization for Mass Issuance

Issuing degrees to thousands of students can be prohibitively expensive. Implement gas-efficient patterns:

  • Use ERC-1155 for batch mints, reducing transaction overhead.
  • Store metadata off-chain (IPFS CID) and only hash on-chain.
  • Implement a merkle tree allowlist where students can claim their SBT, distributing gas costs.
  • Deploy on a Layer 2 like Polygon, Arbitrum, or Base where transaction fees are a fraction of Ethereum Mainnet costs (often < $0.01). Test gas costs thoroughly; a batch mint of 1000 SBTs on an L2 should cost under $10.
< $0.01
Typical L2 Tx Cost
~90%
Gas Savings vs Mainnet
contract-design
CORE ARCHITECTURE

Step 1: Designing the Non-Transferable SBT Contract

This step covers the foundational smart contract design for a non-transferable token representing an academic degree, focusing on the ERC-5192 standard and key security considerations.

The core of a degree verification system is a non-transferable token contract. The industry standard for this is ERC-5192: Minimal Soulbound NFTs. This standard extends ERC-721 and enforces non-transferability by locking tokens in a user's wallet. The primary function you must implement is locked(uint256 tokenId), which must return true to prevent all transfers, including safeTransferFrom and approve. Using a recognized standard like ERC-5192 ensures your contract is interoperable with wallets and marketplaces that understand soulbound tokens, providing a clear signal that the asset is permanently bound.

Your contract's constructor should initialize essential parameters. This typically includes setting the token's name and symbol (e.g., "University Diploma", "UDIP"), and assigning a privileged minter role, often to a secure, multi-signature wallet controlled by the university's administration. The minting logic is critical: the mint function should include access control, allowing only the designated minter to issue tokens. It should also enforce that a recipient can only hold one token for a specific degree program, preventing duplicate claims. This is often managed by mapping an identifier (like a student ID hash) to a token ID.

Beyond basic minting, you must design the token metadata structure to immutably store the degree's details. While the tokenURI can point to dynamic data, for maximum trustlessness, consider storing key attributes on-chain. You can encode data directly into the token ID or use an on-chain struct stored in a mapping. Essential metadata fields include the recipient's wallet address, degree name (e.g., B.Sc. Computer Science), issuance date, and a unique issuer identifier. Storing a hash of the official diploma document on-chain allows for cryptographic verification against a physical or PDF copy.

Security and upgradeability are paramount for a long-lived credential system. Use established libraries like OpenZeppelin's AccessControl for managing the minter role. To future-proof the system without compromising the immutability of issued credentials, consider a proxy pattern like the Transparent Upgradeable Proxy. This allows you to fix bugs or adjust minting logic in the future, while keeping the storage and token ownership of already-minted SBTs intact. All administrative functions, like pausing or updating the metadata base URI, must be behind robust multi-signature controls.

Finally, thorough testing is non-negotiable. Write comprehensive unit tests (using Foundry or Hardhat) that verify: the locked function always returns true, transfers are reverted, only the minter can mint tokens, and duplicate minting for the same student is prevented. Test edge cases like minting to a contract that does not support ERC-721. Once tested, verify and publish the contract source code on a block explorer like Etherscan. This transparency builds trust with degree holders and third-party verifiers, completing the technical foundation for your SBT system.

minting-integration
BACKEND ARCHITECTURE

Step 3: Integrating with Registrar Backend Systems

This step details how to connect your smart contract to the university's existing student information system to automate SBT issuance.

The core of a functional SBT system is the secure, automated link between the on-chain contract and the off-chain registrar's database. This integration ensures that only verified graduates receive tokens and that the token metadata (student name, degree, graduation date) is accurate. You will typically build a backend service (using Node.js, Python, etc.) that acts as a middleware API. This service listens for events from the university's Student Information System (SIS), such as a confirmed graduation, and then calls the appropriate function on your DegreeSBT smart contract.

Your backend service needs two critical components: a secure signer and a data verification layer. The signer uses a private key (stored securely using environment variables or a secrets manager) to submit transactions. The verification layer must query the SIS or a dedicated admin portal to confirm the issuance request is authorized. For example, before minting, your service should check that the recipient's wallet address is linked to a student ID that has a status: graduated flag. This prevents unauthorized minting if the API endpoint is somehow exposed.

Implement a robust event-driven architecture. Instead of polling the database, set up webhooks so your SBT service receives a POST request when a graduation is finalized. The payload should include the student's wallet address (collected during a prior registration step) and the degree particulars. Here is a simplified Node.js example using ethers.js to trigger a mint:

javascript
async function mintDegreeSBT(recipient, studentId, degreeHash) {
  const wallet = new ethers.Wallet(process.env.ISSUER_PRIVATE_KEY, provider);
  const contract = new ethers.Contract(contractAddress, abi, wallet);
  const tx = await contract.safeMint(recipient, studentId, degreeHash);
  await tx.wait();
  console.log(`SBT minted for ${studentId} at tx: ${tx.hash}`);
}

You must also design a failure and retry mechanism. Blockchain transactions can fail due to gas spikes or network congestion. Your backend should log failed transactions and retry them with an exponential backoff strategy. Furthermore, implement idempotency checks using the studentId to prevent duplicate minting if a webhook is sent twice. Store a record in your service's database with the student ID, transaction hash, and status (pending, minted, failed).

Finally, consider access control and monitoring. The backend API endpoints that trigger mints should be protected with strict authentication (like API keys or JWT tokens) and rate-limited. Use logging and monitoring tools (e.g., Sentry, Datadog) to track minting events, gas costs, and errors. This operational visibility is crucial for maintaining the integrity and reliability of the credentialing system for thousands of graduates.

verification-interface
IMPLEMENTATION

Step 4: Building a Verification Interface for Employers

This guide details how to create a frontend application that allows employers to instantly verify academic credentials stored as Soulbound Tokens (SBTs) on the blockchain.

The verification interface is the employer-facing component of the SBT system. Its primary function is to provide a simple, secure way to confirm the authenticity of a candidate's degree without needing blockchain expertise. The core user flow involves a candidate providing a verification link or a unique token ID, which the employer enters into your web application. The app then queries the smart contract on-chain to fetch and display the immutable credential data.

To build this, you'll need a frontend framework like React or Vue.js and a Web3 library such as ethers.js or viem. The key technical steps are: 1) connecting to the user's wallet (for a candidate to generate a verification signature), 2) reading data from the SBT contract using its tokenURI or a custom getCredential function, and 3) parsing and displaying the metadata. You can use public RPC providers from services like Infura or Alchemy to connect to the blockchain without running a node.

A critical feature is implementing a cryptographic proof mechanism to prevent fraud. Instead of just showing on-chain data, the candidate should sign a unique message (e.g., "Verify my degree for job ID: X") with their wallet's private key. Your interface sends this signature to the backend, which recovers the signer's address using ecrecover (Solidity) or an equivalent library. It then checks if this address owns the SBT in question. This proves the candidate currently controls the wallet that holds the credential.

For the backend, a lightweight Node.js or Python server can handle signature verification and cache on-chain data to improve response times. Use the @ethersproject/bytes or web3.py libraries for signature recovery. The API endpoint would accept the candidate's address, token ID, and signature, verify them against the blockchain, and return a JSON object with the credential details and a verified: true/false status. This decouples the verification logic from the frontend for better security and performance.

Finally, design a clear results page. For a successful verification, display the university name, degree title, graduation date, and the issuing wallet address. Clearly indicate the block number and transaction hash of the original minting transaction as immutable proof. For failed verifications, provide specific error messages (e.g., "Signature invalid" or "No SBT found for this address"). You can find a complete example frontend and backend code structure in the Chainscore Labs GitHub repository.

TECHNICAL APPROACHES

SBT Implementation Standards Comparison

Comparison of primary smart contract standards for implementing non-transferable tokens, evaluating their suitability for academic credential systems.

Feature / MetricERC-721 (Modified)ERC-1155 (Modified)ERC-5192 (Minimal Soulbound)

Native Non-Transferability

Gas Cost for Mint (Avg)

$15-25

$10-20

$8-15

Batch Minting Support

Metadata Flexibility (IPFS, Arweave)

High

High

Standard

On-Chain Revocation Logic

Custom Required

Custom Required

Standard Optional

Ecosystem Wallet Support

Universal

Universal

Growing (EIP-4973)

Implementation Complexity

Medium-High

Medium

Low

Suitability for Academic Credentials

Good (with custom locks)

Better (batch issuance)

Best (purpose-built)

DEVELOPER GUIDE

Frequently Asked Questions (FAQ)

Common technical questions and solutions for implementing a secure, non-transferable Soulbound Token (SBT) system for academic credentials on EVM-compatible blockchains.

A Soulbound Token (SBT) is a non-transferable, non-fungible token representing a credential, affiliation, or reputation. Unlike ERC-20 (fungible) or standard ERC-721 (transferable NFT) tokens, SBTs are permanently bound to a single wallet address (a "Soul").

Key Technical Differences:

  • Transfer Function: The core transferFrom and safeTransferFrom functions are overridden to revert all transfer attempts.
  • Burnability: SBTs are typically non-burnable by the holder to prevent credential destruction, though the issuing authority may retain a burn function for revocation.
  • Metadata: SBT metadata often includes immutable, on-chain details like the issuer's address, issuance date, and a unique credential identifier (e.g., a degree hash).

Common implementation standards include ERC-5192 (Minimal Soulbound NFT) which enforces the locked status, or custom extensions of ERC-721.

SOULBOUND TOKENS

Common Issues and Troubleshooting

Addressing frequent technical hurdles and developer questions when implementing a non-transferable SBT system for academic credentials on-chain.

Non-transferability is enforced at the smart contract logic level, not by the ERC-721 standard itself. The standard transferFrom and safeTransferFrom functions must be overridden to revert all transfer attempts.

Key Implementation:

solidity
function transferFrom(address, address, uint256) public pure override {
    revert("Soulbound: Token is non-transferable");
}

This override makes the token permanently locked to the minting address. Common mistakes include forgetting to also override safeTransferFrom or missing the override keyword, which leaves the inherited, transferable function active. Always verify by attempting a transfer in your test suite.

conclusion
IMPLEMENTATION SUMMARY

Conclusion and Next Steps

You have now built a foundational system for issuing non-transferable Soulbound Tokens (SBTs) to represent academic degrees on the blockchain.

This guide has walked you through the core components: a SoulboundDegree ERC-721 token with a _beforeTokenTransfer hook to enforce non-transferability, a DegreeIssuer contract with role-based access control for secure minting, and a basic frontend for interaction. You have a functional system where an authorized issuer can mint a unique, permanent, and non-transferable credential to a graduate's Ethereum wallet address. The key security feature is the overridden transfer function, which blocks all standard transfer attempts, ensuring the token's soulbound nature.

To move from a proof-of-concept to a production-ready system, several critical next steps are required. First, implement a robust revocation mechanism. While SBTs are permanent, institutions need the ability to revoke a degree in cases of fraud or misconduct. This can be done by adding a revoke function in the issuer contract that burns the token or marks it as invalid in an on-chain registry. Second, consider privacy implications. A degree SBT's metadata is publicly readable on-chain. For sensitive data, use hashes (storing only the bytes32 hash of the diploma on-chain) or explore zero-knowledge proofs with systems like Semaphore to prove credential ownership without revealing the details.

Further development should focus on interoperability and verification. Adhere to emerging standards like EIP-4973 (Account-bound Tokens) for wider compatibility. Build a verifier portal that allows employers to cryptographically verify a candidate's credential by simply connecting their wallet, eliminating manual background checks. Also, explore modular design by separating the issuance logic, revocation list, and metadata storage into upgradeable components using proxy patterns for easier maintenance.

Finally, address the user experience and key management. Graduates are not typically crypto-native. Partner with wallet providers for seamless onboarding or implement gasless minting via meta-transactions with a relayer. Consider the long-term custody issue: a lost private key means a lost credential. Research social recovery wallets or delegatable SBT patterns that allow a trusted family member to recover access without transferring the credential itself. The journey from a simple contract to a resilient, user-friendly credentialing system is iterative, but the foundation you've built is a powerful start.

How to Issue Degrees as Soulbound Tokens (SBTs) on Ethereum | ChainScore Guides