Protocol
Access Control (BIDGES)
BIDGES — Badge Identity & Delegation for Gated Execution System — is the access-control layer of the protocol. It separates who you are from what you can do using two token types, unified behind the TAGITAccess facade (one of the six core modules of the contract suite):
- Identity badges (ERC-5192, soulbound) — verify WHO an actor is. Non-transferable, one per address, issued after KYC or institutional verification.
- Capability badges (ERC-1155) — grant WHAT an actor may do. Grantable, revocable, and delegable; authorization is balance-based (
balanceOf(addr, id) > 0).
┌─────────────────────────────────────────────────────────────┐
│ TAGITAccess (facade) │
├─────────────────────────────┬───────────────────────────────┤
│ IdentityBadge (WHO) │ CapabilityBadge (WHAT) │
│ ERC-5192 soulbound │ ERC-1155 │
│ • non-transferable │ • grantable / revocable │
│ • 1 per address │ • multiple per address │
└─────────────────────────────┴───────────────────────────────┘Contract architecture
| Contract | Standard | Purpose |
|---|---|---|
IdentityBadge.sol | ERC-5192 | Soulbound identity tokens |
CapabilityBadge.sol | ERC-1155 | Grantable capability tokens |
TAGITAccess.sol | Facade | Unified access controller queried by every core module |
ITAGITAccess.sol | Interface | External integration surface |
Identity badges (WHO)
Soulbound tokens issued after verification. Each address holds at most one; badges can be upgraded (KYC_L1 → KYC_L2) by authorized issuers and revoked for compliance violations.
| ID | Badge | Description | Issuance requirements |
|---|---|---|---|
| 1 | KYC_L1 | Basic identity verified | Email + phone |
| 2 | KYC_L2 | Enhanced verification | Government ID document + liveness check |
| 3 | KYC_L3 | Institutional / accredited | Business registration |
| 10 | MANUFACTURER | Verified brand or factory | Business license + factory audit |
| 11 | RETAILER | Authorized seller | Reseller agreement |
| 20 | GOV_MIL | Government / military | Agency verification, federal credentials |
| 21 | LAW_ENFORCEMENT | Police / customs authority | Badge + department verification |
Capability badges (WHAT)
ERC-1155 tokens that gate specific protocol actions. They can be delegated to sub-contractors, revoked by admins at any time, stacked per address, and every grant or revoke is logged on-chain.
| ID | Badge | Permission |
|---|---|---|
| 100 | CAP_MINT | Create new asset NFTs (digital twins) |
| 101 | CAP_BIND | Bind NFC tags to assets |
| 102 | CAP_ACTIVATE | QA activation approval |
| 104 | CAP_FLAG | Flag suspicious, lost, stolen, or recalled assets |
| 105 | CAP_RECOVERY_INIT | Open an AIRP recovery case (TAGITRecovery) |
| 106 | CAP_RECOVERY_APPROVE | Approve recovery resolutions |
| 107 | CAP_FREEZE | Emergency pause (circuit breaker) |
| 108 | CAP_DAO_VOTE | Governance voting (TAGITGovernor) |
ADMIN 0 through AGENT 6) and CAN_*-style capability names. That scheme is superseded — use only the identity IDs (1–21) and capability IDs (100–108) on this page.How capabilities gate the lifecycle
Every state-changing function in TAGITCore checks BIDGES before executing. The mapping onto the 7-state asset lifecycle:
| Capability | Gated function | Lifecycle effect |
|---|---|---|
CAP_MINT (100) | mint() | NONE → MINTED |
CAP_BIND (101) | bindTag() | MINTED → BOUND |
CAP_ACTIVATE (102) | activate() | BOUND → ACTIVATED |
CAP_FLAG (104) | flag() | BOUND / ACTIVATED / CLAIMED → FLAGGED |
CAP_RECOVERY_INIT (105) | TAGITRecovery — open case | Starts an AIRP investigation on a FLAGGED asset |
CAP_RECOVERY_APPROVE (106) | TAGITRecovery — approve; resolve() | FLAGGED → exact pre-flag state |
CAP_FREEZE (107) | Circuit breaker | Emergency pause of capability checks |
CAP_DAO_VOTE (108) | TAGITGovernor | Vote on protocol parameters and upgrades |
claim(), transferAsset(), and recycle() are gated by identity plus ownership context (buyer, current owner, authorized recycler) rather than a standalone capability badge — see the transition table for the authorized caller of every transition.
Access check flow
Authorization is a two-step check: an identity badge must exist, then the capability balance must be non-zero.
msg.sender calls mint()
│
▼
TAGITCore.requiresCapability(CAP_MINT)
│
▼
TAGITAccess.requireCapability(sender, CAP_MINT)
│
├─▶ IdentityBadge.hasIdentity(sender)? ✗ revert NO_IDENTITY
│
└─▶ CapabilityBadge.balanceOf(sender, 100) > 0? ✗ revert NO_CAPABILITY
│
▼
✓ execute// Check identity only — identityId is a BIDGES badge id (e.g. KYC_L1 = 1)
bool hasId = tagitAccess.hasIdentity(user, KYC_L1);
// Check a specific capability — non-reverting
bool canMint = tagitAccess.hasCapability(user, CAP_MINT);
// Enforce instead of checking: reverts with MissingCapability if not held.
// This is what the requiresCapability modifier calls internally.
tagitAccess.requireCapability(user, CAP_MINT);Access checks are gas-optimized: requireCapability() costs ~9.2k gas and pure view checks ~8.3k, keeping the authorization overhead of every lifecycle call under 10k gas.
Security features
Circuit breaker
An emergency pause for incident response, gated by CAP_FREEZE. While triggered, all capability checks fail; it auto-resets after 24 hours or can be reset earlier by DAO action.
Rate limiting
Per-address rate limits prevent bulk abuse of granted capabilities:
uint256 constant MINT_RATE_LIMIT = 100; // per hour
uint256 constant BIND_RATE_LIMIT = 100; // per hour
uint256 constant CLAIM_RATE_LIMIT = 50; // per hourNIST CSF 2.0 alignment
| Control | Implementation |
|---|---|
| AC-2 Account management | Identity badges with tiered KYC levels |
| AC-3 Access enforcement | Capability checks on every state-changing function |
| AC-6 Least privilege | Minimal capability sets per role |
| AC-7 Rate limiting | RateLimiter + CircuitBreaker |
| IR-4 Incident response | CircuitBreaker emergency pause |
Deployed contracts (Base Sepolia)
| Contract | Address |
|---|---|
TAGITAccess | 0xb56A1D91995C212342FaA843468F03521340A1D6 |
IdentityBadge | 0xebdAC9A0663c02a7297681b078aaD893EF345030 |
CapabilityBadge | 0xb05d22706B08A3F6409601de520cf7A6dbCB573d |
Mainnet deployment is audit-gated, targeted H1 2027. See Contract Addresses for the full registry.
Next steps
- Asset Lifecycle — the transitions these badges gate
- Smart Contracts — the full 25-contract suite and its libraries
- Security — audit posture and disclosure policy