// File: contracts/IFilteredMinterV0.sol



// SPDX-License-Identifier: LGPL-3.0-only
// Created By: Art Blocks Inc.

pragma solidity ^0.8.0;

interface IFilteredMinterV0 {
    /**
     * @notice Price per token in wei updated for project `_projectId` to
     * `_pricePerTokenInWei`.
     */
    event PricePerTokenInWeiUpdated(
        uint256 indexed _projectId,
        uint256 indexed _pricePerTokenInWei
    );

    /**
     * @notice Currency updated for project `_projectId` to symbol
     * `_currencySymbol` and address `_currencyAddress`.
     */
    event ProjectCurrencyInfoUpdated(
        uint256 indexed _projectId,
        address indexed _currencyAddress,
        string _currencySymbol
    );

    /// togglePurchaseToDisabled updated
    event PurchaseToDisabledUpdated(
        uint256 indexed _projectId,
        bool _purchaseToDisabled
    );

    // getter function of public variable
    function minterType() external view returns (string memory);

    function genArt721CoreAddress() external returns (address);

    function minterFilterAddress() external returns (address);

    // Triggers a purchase of a token from the desired project, to the
    // TX-sending address.
    function purchase(
        uint256 _projectId
    ) external payable returns (uint256 tokenId);

    // Triggers a purchase of a token from the desired project, to the specified
    // receiving address.
    function purchaseTo(
        address _to,
        uint256 _projectId
    ) external payable returns (uint256 tokenId);

    // Toggles the ability for `purchaseTo` to be called directly with a
    // specified receiving address that differs from the TX-sending address.
    function togglePurchaseToDisabled(uint256 _projectId) external;

    // Called to make the minter contract aware of the max invocations for a
    // given project.
    function setProjectMaxInvocations(uint256 _projectId) external;

    // Gets if token price is configured, token price in wei, currency symbol,
    // and currency address, assuming this is project's minter.
    // Supersedes any defined core price.
    function getPriceInfo(
        uint256 _projectId
    )
        external
        view
        returns (
            bool isConfigured,
            uint256 tokenPriceInWei,
            string memory currencySymbol,
            address currencyAddress
        );
}

// File: contracts/MultiMint.sol



// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.9;

import "./IFilteredMinterV0.sol";

/// @title Art Blocks MultiMint
/// @author @arkaydeus - SquiggleDAO
/// @notice MultiMinter to allow for bulk minting of Art Blocks projects

contract MultiMint {
  event MultiMintEvent(
    uint256 mints,
    uint256 mintPrice,
    address indexed contractAddress,
    uint256 projectId
  );

  function multiMint(
    uint256 _mints,
    uint256 _mintPrice,
    address _contractAddress,
    uint256 _projectId
  ) public payable {
    for (uint256 i = 0; i < _mints; i++) {
      IFilteredMinterV0(_contractAddress).purchaseTo{value: _mintPrice}(
        msg.sender,
        _projectId
      );
    }

    emit MultiMintEvent(_mints, _mintPrice, _contractAddress, _projectId);
  }
}