Soulbound Token (SBT) Development

We design and develop full-cycle blockchain solutions: from smart contract architecture to launching DeFi protocols, NFT marketplaces and crypto exchanges. Security audits, tokenomics, integration with existing infrastructure.
Showing 1 of 1 servicesAll 1306 services
Soulbound Token (SBT) Development
Medium
~2-3 business days
FAQ
Blockchain Development Services
Blockchain Development Stages
Latest works
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1161
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1051
  • image_logo-advance_0.png
    B2B Advance company logo design
    561
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    827
  • image_logo-aider_0.jpg
    AIDER company logo development
    762
  • image_crm_chasseurs_493_0.webp
    CRM development for Chasseurs
    850

Soulbound Token (SBT) Development

Soulbound Token (SBT) is a non-transferable NFT. Cannot be sold, transferred, or purchased. The token is "bound to the soul" — the address that received it. The concept was proposed by Vitalik Buterin, Glen Weyl, and Puja Ohlhaver in 2022 to represent reputation, achievements, and credentials in Web3.

Technical Implementations

ERC-5192: Minimal Soulbound NFT

The official standard for soulbound NFTs (finalized EIP):

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

interface IERC5192 {
    event Locked(uint256 tokenId);
    event Unlocked(uint256 tokenId);
    
    function locked(uint256 tokenId) external view returns (bool);
}

contract SoulboundToken is ERC721, IERC5192 {
    mapping(uint256 => bool) private _locked;
    
    function locked(uint256 tokenId) external view override returns (bool) {
        return _locked[tokenId];
    }
    
    // Override transfer functions to block transfers
    function _beforeTokenTransfer(
        address from, address to, uint256 tokenId, uint256 batchSize
    ) internal override {
        require(
            from == address(0) || to == address(0),
            "SBT: Token is non-transferable"
        );
        super._beforeTokenTransfer(from, to, tokenId, batchSize);
    }
    
    function mint(address to, uint256 tokenId) external onlyOwner {
        _locked[tokenId] = true;
        _mint(to, tokenId);
        emit Locked(tokenId);
    }
}

from == address(0) — mint (allowed). to == address(0) — burn (if allowed).

Use Cases and Metadata

Educational certificates: completed course, degree. Metadata: issuer, date, course name, grade.

DAO voting participation: proof of participation. Metadata: dao_address, proposal_id, vote, timestamp.

KYC/AML verified: address passed verification. Metadata: issuer (Persona, Jumio), expiry, level.

Achievements: first 1000 protocol users, liquidity provider > 1 year, contributor.

POAPs (Proof of Attendance Protocol): events, conferences. Technically POAPs are transferable, but by spirit — soulbound.

SBT Privacy

Public SBTs expose full address history. Everyone sees all credentials of a wallet owner. This is a privacy problem.

zkSBT: Zero-Knowledge Soulbound Token. Owner proves possession of a certain type of SBT without revealing the specific token or other SBTs. Implementations: Sismo Protocol, Polygon ID.

Claim: "I have KYC verification SBT from Persona"
ZK Proof: proves the fact without revealing address or other SBTs

Revocation

SBTs should support revocation: if verification expires (outdated KYC), if holder commits a violation.

mapping(uint256 => bool) public revoked;

function revoke(uint256 tokenId) external onlyIssuer {
    revoked[tokenId] = true;
    emit Revoked(tokenId);
}

function isValid(uint256 tokenId) public view returns (bool) {
    return _exists(tokenId) && !revoked[tokenId] && !_isExpired(tokenId);
}

SBT is a building block for on-chain reputation systems. Developing a basic SBT contract takes 1-2 days. With privacy and revocation — 1-2 weeks.