# mintTicketPayable

This function allows the minting of tickets for specified recipients, events, access levels, and ticket amounts while collecting payment in Ether. It takes four parameters:

* `_to`: An array containing the addresses of recipients for whom tickets are to be minted.
* `_eventIds`: An array containing the unique identifiers for the events for which tickets are to be minted.
* `_accessLevels`: An array containing the access levels associated with the tickets being minted.
* `_amounts`: An array containing the amounts of tickets to be minted for each recipient.

````solidity
// Some code
```remix-solidity
/**
    MintTicketPayable: Mint tickets for the specified recipients, events, access levels, and amounts, collecting payment in Ether.
    @param _to: Array of recipient addresses for whom tickets are to be minted.
    @param _eventIds: Array of event IDs for which tickets are to be minted.
    @param _accessLevels: Array of access levels associated with the tickets being minted.
    @param _amounts: Array of amounts of tickets to be minted for each recipient.

    Format: to, eventIds, accessLevels, amounts
    */
    function mintTicketPayable(
        address[] calldata _to,
        string[] calldata _eventIds,
        string[] calldata _accessLevels,
        uint256[] calldata _amounts
    ) public payable nonReentrant {
        // Check if the lengths of input arrays match
        if (!checkLengths(_to, _eventIds, _accessLevels, _amounts))
            revert DecastGating__UnmatchedArrayLength();

        // Initialize variable to store total collected amount
        uint256 totalCollectedAmount = 0;

        // Iterate through each recipient
        for (uint256 i = 0; i < _to.length; ++i) {
            // Get the token ID for the specified event and access level
            uint256 _tokenId = getTokenIdOfAccessLevel(
                _eventIds[i],
                _accessLevels[i]
            );

            // Check if the ticket price is not 0 and the amount is valid
            if (getTicketPriceFromTokenId(_tokenId) == 0)
                revert DecastGating__UnMatchedInputAmount();
            if (_amounts[i] <= 0) revert DecastGating__InvalidInputAmount();

            // Check if the token ID exists for the specified event
            if (!checkTokenIdExistsForEventId(_eventIds[i], _tokenId))
                revert DecastGating__TokenIdDoesNotExists();

            // Calculate and accumulate the total amount to be collected
            totalCollectedAmount +=
                getTicketPriceFromTokenId(_tokenId) *
                _amounts[i];

            // Update collected amount for the event ID
            s_collectedAmountForEventId[_eventIds[i]] +=
                _amounts[i] *
                getTicketPriceFromTokenId(_tokenId);

            // Mint the ticket
            _mintTicket(_eventIds[i], _to[i], _tokenId, _amounts[i]);
        }

        // Check if the total collected amount matches the sent Ether value
        if (totalCollectedAmount != msg.value)
            revert DecastGating__UnMatchedAccumulatedAmount();
    }
```
````

## Explanation:

The function begins by verifying whether the lengths of the input arrays match using the [`checkLengths` ](/decast-gating-document/helper-pure-functions.md)function to ensure data consistency. It then initializes a variable to store the total collected amount of Ether. Next, the function iterates through each recipient in the `_to` array. For each recipient, it retrieves the corresponding token ID for the specified event and access level using the [`getTokenIdOfAccessLevel` ](/decast-gating-document/helper-view-functions/gettokenidofaccesslevel.md)function. It checks whether the ticket price associated with the token ID is not zero and whether the requested ticket amount is valid. Additionally, it verifies whether the token ID exists for the specified event. If all validation checks pass, the function calculates and accumulates the total amount to be collected in Ether based on the ticket prices and amounts. It updates the collected amount for the respective event ID and then mints the tickets using the [`_mintTicket` ](/decast-gating-document/internal-functions/_mintticket.md)internal function.

Finally, the function checks whether the total collected amount matches the sent Ether value. If the amounts do not match, indicating an inconsistency, the function reverts the transaction to maintain data integrity.


---

# Agent Instructions: 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:

```
GET https://mujahid.gitbook.io/decast-gating-document/state-update-functions/mintticketpayable.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
