Skip to main content
Capabilities are a powerful pattern for access control in Move. Instead of checking addresses, you grant specific permissions through unforgeable objects.

What are Capabilities?

Capabilities are objects that grant specific permissions. Only the holder of a capability can perform the associated actions.

Basic Capability

Real Example: Flash Lender Admin

From examples/move/flash_lender:

Game Admin Example

From examples/move/hero:

Capability Patterns

Pattern 1: Single Admin

One capability for one resource:

Pattern 2: Multiple Capabilities

Different capabilities for different permissions:

Pattern 3: Transferable Capabilities

Capabilities with store can be transferred:

Pattern 4: Non-transferable Capabilities

Without store, capabilities can’t be transferred:

Pattern 5: Witness Pattern

One-time-use capability for initialization:

Advanced Patterns

Tiered Capabilities

Time-limited Capabilities

Revocable Capabilities

Capability Distribution

At Initialization

Via Function Call

Via Purchase

Testing Capabilities

Best Practices

1. Bind capabilities to resources

2. Use appropriate abilities

3. Validate capabilities

4. Document capability usage

5. Consider capability lifecycle

Common Mistakes

❌ Not binding capabilities

✅ Binding capabilities

❌ Using address checks

✅ Using capabilities

Next Steps