contract MochiAirdrop is ERC1155, ERC1155Supply, Ownable {
    constructor(string memory _uri) ERC1155(_uri) {
        _setURI(_uri);
    }

    /// @dev set the URI to your base URI, don't forget the {id} placeholder
    function setURI(string memory newuri) external onlyOwner {
        _setURI(newuri);
    }

    /**
     * @notice Airdrop a token to multiple addresses at once.
     * No strict supply is set in the contract. All methods are ownerOnly,
     * it is up to the owner to control the supply by not minting
     * past their desired number for each token.
     * @dev Airdrop one token to each address in the calldata list,
     * setting the supply to the length of the list + previously minted (airdropped) supply. Add an addess once per
     * token you would like to send.
     * @param _dropNumber The tokenID to send
     * @param _list address[] list of wallets to send 1 token to, each.
     */
    function airdrop(uint256 _dropNumber, address[] calldata _list)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < _list.length; i++) {
            _mint(_list[i], _dropNumber, 1, "");
        }
    }

    /**
     * @notice Sends multiple tokens to a single address
     * @param _tokenID The address to receive the tokens
     * @param _address The address to receive the tokens
     * @param _quantity How many to send she receiver
     */
    function batchMint(
        uint256 _tokenID,
        address _address,
        uint256 _quantity
    ) external onlyOwner {
        _mint(_address, _tokenID, _quantity, "");
    }

    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal override(ERC1155, ERC1155Supply) {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }
}
/*
 _  _   __   ____  _  _  __    _  _   __    ___  _  _  __
 ( \/ ) /  \ / ___)/ )( \(  )  ( \/ ) /  \  / __)/ )( \(  )
 / \/ \(  O )\___ \) __ ( )(   / \/ \(  O )( (__ ) __ ( )(
 \_)(_/ \__/ (____/\_)(_/(__)  \_)(_/ \__/  \___)\_)(_/(__)
 ======================== AIRDROPS ========================
 */
function airdrop(uint256 _dropNumber, address[] calldata _list)
    external
    onlyOwner
{
    for (uint256 i = 0; i < _list.length; i++) {
        _mint(_list[i], _dropNumber, 1, "");
    }
}

/**
 * @notice Airdrop a token to multiple addresses at once.
 * No strict supply is set in the contract. All methods are ownerOnly,
 * it is up to the owner to control the supply by not minting
 * past their desired number for each token.
 * @dev Airdrop one token to each address in the calldata list,
 * setting the supply to the length of the list + previously minted (airdropped) supply. Add an addess once per
 * token you would like to send.
 * @param _dropNumber The tokenID to send
 * @param _list address[] list of wallets to send 1 token to, each.
 */