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

ContractStandardPurpose
IdentityBadge.solERC-5192Soulbound identity tokens
CapabilityBadge.solERC-1155Grantable capability tokens
TAGITAccess.solFacadeUnified access controller queried by every core module
ITAGITAccess.solInterfaceExternal 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.

IDBadgeDescriptionIssuance requirements
1KYC_L1Basic identity verifiedEmail + phone
2KYC_L2Enhanced verificationGovernment ID document + liveness check
3KYC_L3Institutional / accreditedBusiness registration
10MANUFACTURERVerified brand or factoryBusiness license + factory audit
11RETAILERAuthorized sellerReseller agreement
20GOV_MILGovernment / militaryAgency verification, federal credentials
21LAW_ENFORCEMENTPolice / customs authorityBadge + 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.

IDBadgePermission
100CAP_MINTCreate new asset NFTs (digital twins)
101CAP_BINDBind NFC tags to assets
102CAP_ACTIVATEQA activation approval
104CAP_FLAGFlag suspicious, lost, stolen, or recalled assets
105CAP_RECOVERY_INITOpen an AIRP recovery case (TAGITRecovery)
106CAP_RECOVERY_APPROVEApprove recovery resolutions
107CAP_FREEZEEmergency pause (circuit breaker)
108CAP_DAO_VOTEGovernance voting (TAGITGovernor)
Superseded ID scheme. Earlier versions of these docs listed identity badges with IDs 0–6 (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:

CapabilityGated functionLifecycle 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 caseStarts an AIRP investigation on a FLAGGED asset
CAP_RECOVERY_APPROVE (106)TAGITRecovery — approve; resolve()FLAGGED → exact pre-flag state
CAP_FREEZE (107)Circuit breakerEmergency pause of capability checks
CAP_DAO_VOTE (108)TAGITGovernorVote 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 hour

NIST CSF 2.0 alignment

ControlImplementation
AC-2 Account managementIdentity badges with tiered KYC levels
AC-3 Access enforcementCapability checks on every state-changing function
AC-6 Least privilegeMinimal capability sets per role
AC-7 Rate limitingRateLimiter + CircuitBreaker
IR-4 Incident responseCircuitBreaker emergency pause
Audit status. The BIDGES contracts went through internal review and Slither static analysis in January 2026 (four high-severity findings across the suite were triaged as false positives), backed by the suite's unit and fuzz tests. A Hacken external audit was engaged in July 2026; no report has been published, and there is no bug bounty program today. Report issues to info@tagit.network.

Deployed contracts (Base Sepolia)

Mainnet deployment is audit-gated, targeted H1 2027. See Contract Addresses for the full registry.

Next steps