Imagine: a user passes KYC on a DeFi platform, receives an NFT certificate, and then sells it. Verification becomes meaningless — the platform cannot trust credentials that are freely transferred. Soulbound tokens (SBTs) solve this by permanently binding reputation, achievements, or legal status to a single address. No one can transfer or sell them — only the owner and issuer have control. With extensive soulbound token development experience, we ensure robust ERC-5192 contracts.
The typical approach is to take ERC-721 and block transfers. But that's a naive implementation. In practice, support for revocation, private proofs via ZK-SBT, and integration with oracles for status verification are required. Architecture errors lead to vulnerabilities: tokens become permanently stuck in the contract or owner data leaks. We solve these problems at the design stage using formal contract verification.
How to Implement SBT Revocation Without Compromising Reputation?
Revocation is a critical feature for verifications with expiring periods (e.g., KYC). Implementation requires several steps:
- Define the issuer role and add an
onlyIssuermodifier. - Create
mapping(uint256 => bool) public revoked; - Implement a
revokefunction with permission checks. - Add an
isValidfunction that checks existence, revoked flag, and expiration.
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); } Important: revocation does not destroy the token, only makes it invalid. This preserves history for audit purposes.
Why ERC-5192 is the Basic Standard for Soulbound?
ERC-5192 (Minimal Soulbound NFT) is a finalized EIP defining the Locked event and locked() function. It is compatible with OpenZeppelin and easy to integrate. ERC-5192 reduces audit time by 2x compared to custom contracts, as common access errors are already closed. Here is an example contract:
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]; } 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); } } Compared to a custom implementation, ERC-5192 provides a standardized interface that simplifies integration with wallets and marketplaces. Development following the standard passes audits with fewer vulnerabilities — common access errors are already closed.
Comparison of ERC-5192 and Custom ERC-721
| Parameter | ERC-5192 | Custom ERC-721 with Locking |
|---|---|---|
| Compatibility | High (OpenZeppelin, wallets) | Only your contract |
| Development time | 1-2 days | 3-5 days |
| Audit pass | Faster, fewer vulnerabilities | Requires additional checks |
What's Included in Turnkey SBT Development?
| Component | Description | Time (days) |
|---|---|---|
| Requirements analysis | Defining metadata, emission rights, revocation logic | 1-2 |
| Smart contract | Implementation of ERC-5192 or custom with ZK-proofs | 3-5 |
| Security audit | Check for reentrancy, access control, gas optimization | 2-3 |
| Integration | Connecting frontend (wagmi, RainbowKit) and oracles | 2-4 |
| Testnet | Deploy to Goerli/Sepolia, write tests (Foundry) | 1-2 |
| Documentation | API, minting and revocation instructions | 1 |
We prepare smart contract documentation and provide access to a private repository with tests. Basic SBT contract from $5,000; full turnkey from $15,000.
What Metadata to Store in SBT?
Typical fields: issuer (issuer address), date (issue date), expiry (expiration date), proof (verification link). For educational certificates — courseName, grade. For KYC — verification level. All data is stored in tokenURI in JSON format, accessible only to the owner.
Example SBT Metadata
{ "issuer": "0x...", "date": "2023-10-01", "expiry": "2024-10-01", "type": "KYC", "level": "advanced" } ZK-SBT: Privacy on Top of Soulbound
Public SBTs reveal all owner credentials. For confidentiality, we use zero-knowledge proofs. The owner proves possession of an SBT of a certain type without revealing the address or other tokens. Implementations: Sismo Protocol, Polygon ID. Using ZK-SBT reduces the risk of data leakage by 10 times compared to the public model.
Claim: "I have a KYC verification SBT from Persona" ZK Proof: proves the fact without revealing the address or other SBTs Use Cases
- Educational certificates: issuer, date, course name, grade.
- DAO participation: proof of participation with dao_address, proposal_id, vote.
- KYC/AML verified: issuer (Persona, Jumio), expiry, level.
- Achievements: first 1000 users, liquidity provider > 1 year.
- POAPs — events and conferences (technically transferable, but spirit soulbound).
The concept of soulbound tokens was proposed by Vitalik Buterin, Glen Weyl, and Puja Olhaver in the paper Decentralized Society.
We have been working with Web3 projects for over 5 years, having implemented more than 20 smart contracts for DeFi, NFT, and SBT. Each contract passes formal verification (Slither, Mythril) and audit for reentrancy, MEV-resistance. We provide a security guarantee for 6 months after the audit.
Contact us — we will assess your project in 1 day and propose an architecture with gas optimizations and future-proofing. Development of a basic SBT contract takes 1 to 2 days; with privacy and revocation — 1-2 weeks. Order SBT solution development today to gain a competitive advantage.







