# Core Data Structure

#### `UserDID`

This structure represents a user's specific verification request and its status. It is created when a user begins the verification process.

Code snippet

```
public struct UserDID has key, store {
    id: UID,
    owner: address,                  // User's Sui address
    did_type: u8,                    // 1=AGE_VERIFY, 2=CITIZENSHIP_VERIFY
    verification_status: u8,         // 0=PENDING, 1=VERIFIED, 2=REJECTED
    verification_timestamp: u64,     // When verification completed
    expiry_epoch: u64,               // When DID expires
    blob_id: String,                 // Walrus blob ID (stored in NFT metadata)
    encryption_id: vector<u8>,       // Seal encryption ID (stored in NFT metadata)
    claimed: bool,                   // Whether NFT has been claimed
}
```

#### `DIDSoulBoundNFT`

Once verification is complete, the user can claim a Soul-Bound (non-transferable) NFT. This NFT acts as their on-chain proof of verification. It intentionally omits the `store` ability to prevent it from being transferred.

Code snippet

```
public struct DIDSoulBoundNFT has key { // No store ability = non-transferable
    id: UID,
    owner: address,                  // NFT owner
    did_type: u8,                    // DID type
    name: String,                    // "18+ Age Verification"
    description: String,             // DID description
    image_url: Url,                  // NFT image URL
    blob_id: String,                 // Walrus blob ID reference
    nautilus_signature: vector<u8>,  // Nautilus TEE signature for attestation
    expiry_epoch: u64,               // When DID expires
    minted_at: u64,                  // When NFT was minted
}
```

#### `DocumentInfo`

This structure is stored within the `Government Whitelist` contract and links a user's encrypted document to their DID type.

Code snippet

```
public struct DocumentInfo has store {
    blob_id: String,                 // Walrus blob ID
    encryption_id: vector<u8>,       // Seal encryption ID
    did_type: u8,                    // DID type this document is for
    uploaded_at: u64,                // Timestamp when uploaded
}
```
