> For the complete documentation index, see [llms.txt](https://docs.arpanetwork.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.arpanetwork.io/randcast/using-the-sdk/consumer-contract-examples/example-pick-a-rarity.md).

# Example - Pick a Rarity

The `PickRarityExample` contract, by extending `GeneralRandcastConsumerBase` and calling functions from `RandcastSDK`, demonstrates a system for drawing a rarity level.

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

import {
    GeneralRandcastConsumerBase,
    BasicRandcastConsumerBase
} from "randcast-user-contract/user/GeneralRandcastConsumerBase.sol";
// solhint-disable-next-line no-global-import
import "randcast-user-contract/user/RandcastSDK.sol" as RandcastSDK;

contract PickRarityExample is GeneralRandcastConsumerBase {
    /* requestId -> randomness */
    mapping(bytes32 => uint256) public randomResults;
    mapping(uint256 => string) public rarityValue;
    uint256 public indexResult;
    uint256[] public rarityWeights = new uint256[](5);
    event RarityValueResult(string);
    constructor(address controller) BasicRandcastConsumerBase(controller) {
        rarityValue[0] = "SSSR";
        rarityValue[1] = "SSR";
        rarityValue[2] = "SR";
        rarityValue[3] = "R";
        rarityValue[4] = "C";

        rarityWeights[0] = 1;  // SSSR(1%)
        rarityWeights[1] = 4;  // SSR(4%)
        rarityWeights[2] = 10; // SR(10%)
        rarityWeights[3] = 20; // R(20%)
        rarityWeights[4] = 65; // C(65%)
    }

    /**
     * Requests randomness
     */
    function getRarity() external returns (bytes32) {
        bytes memory params;
        return _requestRandomness(RequestType.Randomness, params);
    }

    /**
     * Callback function used by Randcast Adapter
     */
    // solhint-disable-next-line
    function _fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {
        randomResults[requestId] = randomness;
        uint256 rarityIndex = RandcastSDK.pickByWeights(randomness, rarityWeights);
        indexResult = rarityIndex;
        emit RarityValueResult(rarityValue[rarityIndex]);
    }
}

```

This contract also has three important parts: the `constructor` function, `getRarity` function, and `_fulfillRandomWords` function.

In the `constructor` , the `rarityValue` is being initialized with five string elements. These values correspond to the rarity levels of certain items or characters: 'SSSR,' 'SSR,' 'SR,' 'R,' and 'C,' each with an index from 0 to 4. The `rarityWeights` array is initialized with five integer elements representing the weights associated with the rarity levels defined earlier.

The function `getRarity` is used to request a random number.

`_fulfillRandomness` calls the `RandcastSDK.pickByWeights` function which returns an index based on a predefined `rarityWeights` to determine the rarity of the card drawn in this round. The lower weight corresponds to a lower probability and, therefore, a higher rarity. In this example, 'SSR' is the rarest, with the lowest probability(weight), while 'C' is the most common, with the highest probability(weight).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.arpanetwork.io/randcast/using-the-sdk/consumer-contract-examples/example-pick-a-rarity.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
