# GeneralRandcastConsumerBase

The `GeneralRandcastConsumerBase` contract aims to simplify the process of requesting and consuming randomness provided by Randacst. This contract combines the following aspects: `requestId` generation, gas estimation, callback handling, and gas limit/gas fee configuration.

***

Here is a detailed breakdown of what the `GeneralRandcastConsumerBase` contract does:

#### Imports the necessary contracts and libraries:

```solidity
import "../utils/RequestIdBase.sol";
import "../utils/GasEstimationBase.sol";
import "./BasicRandcastConsumerBase.sol";
import "openzeppelin-contracts/contracts/access/Ownable.sol";
```

`RequestIdBase` helps generate unique request IDs for randomness requests.&#x20;

`GasEstimationBase` aids in calculating the gas needed for the callback functions.&#x20;

`BasicRandcastConsumerBase` is the base contract for handling randomness requests and fulfillment.&#x20;

Lastly, OpenZeppelin's `Ownable` contract is used for access control.

***

#### Inherits the imported contracts and libraries:

```solidity
abstract contract GeneralRandcastConsumerBase is
    BasicRandcastConsumerBase,
    RequestIdBase,
    GasEstimationBase,
    Ownable
{ ... }
```

***

#### Sets important constants:

```solidity
uint256 private constant USER_SEED_PLACEHOLDER = 0;
uint256 private constant GAS_FOR_CALLBACK_OVERHEAD = 30_000;
uint256 private constant RANDOMNESS_PLACEHOLDER = 103921425973949831153159651530394295952228049817797655588722524414385831936256;
```

The variables represent the user seed placeholder, the gas overhead for callback execution, and a placeholder for initial entropy.

***

#### Defines public variables for callback gas limit, max gas fee, and request confirmations(blocks):

```solidity
uint256 public callbackGasLimit;
uint256 public callbackMaxGasFee;
uint16 public requestConfirmations;
```

***Note**: These variables can be set manually or calculated automatically.*

***

#### Provides the `setCallbackGasConfig()` function and `setRequestConfirmations()` function to allow the owner to set the `callbackGasLimit`, `callbackMaxGasFee` and `requestConfirmations` manually:

```solidity
function setCallbackGasConfig(uint256 _callbackGasLimit, uint256 _callbackMaxGasFee) external onlyOwner {
    callbackGasLimit = _callbackGasLimit;
    callbackMaxGasFee = _callbackMaxGasFee;
}

function setRequestConfirmations(uint16 _requestConfirmations) external onlyOwner {
    requestConfirmations = _requestConfirmations;
}
```

***

#### Implements the `requestRandomness()` function for requesting randomness from the Adapter:

```solidity
function _requestRandomness(RequestType requestType, bytes memory params)
    internal
    returns (bytes32)
{ ... }
```

This function takes `requestType` and `params` as arguments and estimates the required gas for the user-implemented callback function when `callbackGasLimit` is not set.

***

#### Estimates the required gas for the callback function:

```solidity
function _dryRunCallbackToEstimateGas(RequestType requestType, bytes memory params, uint64 subId)
    internal
    isDryRun
    returns (uint256)
{
    // Prepares the message call of the callback function according to the request type
    bytes memory data;
    ...
}
```

When the `callbackGasLimit` is not set, this function will estimate the required gas for the callback function based on the request type.

***

#### Sends a raw randomness request to the Adapter:

```solidity
return _rawRequestRandomness(
      requestType,
      params,
      subId,
      _USER_SEED_PLACEHOLDER,
      requestConfirmations,
      callbackGasLimit,
      callbackMaxGasFee == 0 ? tx.gasprice * 3 : callbackMaxGasFee
);   
```

The `rawRequestRandomness()` function sends the randomness request to the Adapter with the proper parameters, including the request type, params, subscription ID, user seed, request confirmations, callback gas limit, and callback max gas price. **If the `callbackMaxGasFee` is not set, it defaults to three times the transaction gas price.** If `requestConfirmations` is not set, it defaults to `minimumRequestConfirmations` in the Adapter config.

***

In summary, the `GeneralRandcastConsumerBase` contract provides an extendable base for contracts that need to request randomness from Randcast. It streamlines requesting and receiving randomness by automating nonce management, gas estimation, and callback handling.&#x20;

Additionally, it allows manual configuration of `requestConfirmations`, callback gas limits and fees for flexibility.

***Note**: To know more about the implementation, please refer to the full* [*source code*](https://github.com/ARPA-Network/Randcast-User-Contract/blob/main/contracts/user/GeneralRandcastConsumerBase.sol) *of the smart contract.*

Next, we will look at an example of requesting a random number by extending `GeneralRandcastConsumerBase`.
