> ## Documentation Index
> Fetch the complete documentation index at: https://core.anylayer.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Create Achievement

> Create custom achievements for your protocol or application

## Overview

Create custom achievements that users can earn based on specific actions or milestones in your protocol or application.

## Prerequisites

* **Protocol Registration**: Your protocol must be registered
* **Admin Permissions**: Must have achievement creation permissions
* **Gas Fees**: Sufficient ETH for transaction fees
* **Achievement Design**: Well-defined achievement criteria

## Achievement Creation Process

### 1. Define Achievement Parameters

<CodeGroup>
  ```javascript JavaScript theme={null}
  // Achievement parameters
  const achievementData = {
    name: 'DeFi Pioneer',
    description: 'Complete your first DeFi transaction',
    category: 'defi',
    rarity: 'common', // common, uncommon, rare, epic, legendary
    points: 50,
    requirements: {
      type: 'transaction_count',
      protocol: 'uniswap',
      minimum: 1
    },
    imageUrl: 'https://api.onzks.com/achievements/defi-pioneer.png',
    metadata: {
      protocol: 'uniswap',
      version: 'v3'
    }
  };
  ```
</CodeGroup>

### 2. Create Achievement

<CodeGroup>
  ```javascript JavaScript theme={null}
  // Create achievement
  const tx = await achievementRegistry.createAchievement(
    achievementData.name,
    achievementData.description,
    achievementData.category,
    achievementData.rarity,
    achievementData.points,
    achievementData.requirements,
    achievementData.imageUrl,
    achievementData.metadata
  );

  await tx.wait();
  console.log('Achievement created!', tx.hash);
  ```

  ```solidity Solidity theme={null}
  // Create achievement in contract
  achievementRegistry.createAchievement(
    'DeFi Pioneer',
    'Complete your first DeFi transaction',
    'defi',
    'common',
    50,
    requirements,
    'https://api.onzks.com/achievements/defi-pioneer.png',
    metadata
  );
  ```
</CodeGroup>

### 3. Verify Creation

<CodeGroup>
  ```javascript JavaScript theme={null}
  // Get achievement details
  const achievementId = await achievementRegistry.getLatestAchievementId();
  const achievement = await achievementRegistry.getAchievement(achievementId);

  console.log('Achievement created:', achievement);
  console.log('Achievement ID:', achievementId.toString());
  ```
</CodeGroup>

## Achievement Parameters

### Required Parameters

* **name**: Achievement display name
* **description**: Detailed description
* **category**: Achievement category (defi, nft, social, etc.)
* **rarity**: Rarity level (common, uncommon, rare, epic, legendary)
* **points**: Points awarded
* **requirements**: Requirements object
* **imageUrl**: Achievement badge image URL

### Optional Parameters

* **metadata**: Additional metadata object
* **expiration**: Optional expiration timestamp
* **maxClaims**: Maximum number of claims allowed
* **protocol**: Associated protocol identifier

## Requirement Types

### Transaction Count

```javascript theme={null}
const requirements = {
  type: 'transaction_count',
  protocol: 'uniswap',
  minimum: 10,
  timeframe: 30 * 24 * 60 * 60 // 30 days in seconds
};
```

### Score Threshold

```javascript theme={null}
const requirements = {
  type: 'score_threshold',
  category: 'defi',
  minimum: 500
};
```

### Achievement Prerequisites

```javascript theme={null}
const requirements = {
  type: 'achievement_prerequisites',
  achievements: ['defi-pioneer', 'liquidity-provider']
};
```

### Custom Logic

```javascript theme={null}
const requirements = {
  type: 'custom',
  contract: '0x...', // Custom verification contract
  function: 'verifyAchievement',
  parameters: ['user', 'data']
};
```

## Rarity and Points

### Rarity Levels

| Rarity    | Points   | Description         |
| --------- | -------- | ------------------- |
| Common    | 10-50    | Easy to earn        |
| Uncommon  | 50-100   | Moderate difficulty |
| Rare      | 100-250  | Challenging         |
| Epic      | 250-500  | Very difficult      |
| Legendary | 500-1000 | Extremely rare      |

### Points Calculation

<CodeGroup>
  ```javascript JavaScript theme={null}
  // Calculate points based on rarity
  function calculatePoints(rarity) {
    const basePoints = {
      common: 25,
      uncommon: 75,
      rare: 175,
      epic: 375,
      legendary: 750
    };
    
    return basePoints[rarity] || 25;
  }
  ```
</CodeGroup>

## Error Handling

### Common Errors

| Error                      | Description                     | Solution                |
| -------------------------- | ------------------------------- | ----------------------- |
| `PROTOCOL_NOT_REGISTERED`  | Protocol not registered         | Register protocol first |
| `INSUFFICIENT_PERMISSIONS` | No creation permissions         | Get admin permissions   |
| `INVALID_REQUIREMENTS`     | Invalid requirements format     | Fix requirements object |
| `ACHIEVEMENT_EXISTS`       | Achievement name already exists | Use unique name         |

### Error Handling Example

<CodeGroup>
  ```javascript JavaScript theme={null}
  try {
    const tx = await achievementRegistry.createAchievement(
      'DeFi Pioneer',
      'Complete your first DeFi transaction',
      'defi',
      'common',
      50,
      requirements,
      imageUrl,
      metadata
    );
    
    await tx.wait();
    console.log('Achievement created successfully!');
  } catch (error) {
    if (error.code === 'PROTOCOL_NOT_REGISTERED') {
      console.error('Protocol not registered. Register first.');
    } else if (error.code === 'INSUFFICIENT_PERMISSIONS') {
      console.error('Insufficient permissions to create achievements.');
    } else {
      console.error('Achievement creation failed:', error.message);
    }
  }
  ```
</CodeGroup>

## Best Practices

1. **Clear Requirements**: Define clear, measurable requirements
2. **Appropriate Rarity**: Match rarity to difficulty
3. **Unique Names**: Use unique achievement names
4. **Test Thoroughly**: Test requirements before deployment
5. **Monitor Usage**: Track achievement claiming patterns

## Related Documentation

* [Achievement Registry Overview](/contracts/achievement-registry/overview)
* [Claim Achievement](/api-reference/achievements/claim-achievement)
* [Protocol Registry](/contracts/protocol-registry/overview)
