Deployment failed: code hit an invalid opcode while deploying

This is a token maker code, so its failing to deploy with the following reason:

Deployment Failed

"TokenMaker" hit an invalid opcode while deploying. Try:

* Verifying that your constructor params satisfy all assert conditions.
* Verifying your constructor code doesn't access an array out of bounds.
* Adding reason strings to your assert statements.

Exiting: Review successful transactions manually by checking the transaction hashes above on Etherscan.

Error: *** Deployment Failed ***

"TokenMaker" hit an invalid opcode while deploying. Try:

* Verifying that your constructor params satisfy all assert conditions.
* Verifying your constructor code doesn't access an array out of bounds.
* Adding reason strings to your assert statements.

This is the code below

// SPDX-License-Identifier: MIT pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract Token is ERC20 { address private _owner; uint8 private _decimals; uint256 private _totalSupply;

constructor(string memory name_, string memory symbol_, address tOwner, uint8 decimals, uint256 tSupply) ERC20(name, symbol_) {
_owner = _tOwner;
decimals = decimals;
_totalSupply = _tSupply * (10 ** uint256(decimals()));
_mint(_owner, _totalSupply);
}

function owner() public view returns(address){
return _owner;
}
function decimals() public view override returns(uint8){
return _decimals;
}

function totalSupply() public view override returns(uint256){
return _totalSupply;
}


} contract TokenMaker{ uint256 public baseFee = 0.0005 ether; mapping(address => address) private _myToken; address public owner; bool locked;

constructor(){
owner = msg.sender;
}

function create(
string memory _name,
string memory _symbol,
address _owner,
uint8 _decimals,
uint256 _totalSupply
) public payable{
require(msg.value == baseFee, "Insufficient Fee");
_myToken[msg.sender] = address(new Token(
_name,
_symbol,
_owner,
_decimals,
_totalSupply
));
}

function withdraw() public {
require(!locked, "Locked");
require(owner == msg.sender, "Not owner");
require(address(this).balance > 0, "Insufficient contract balance");
locked = true;
payable(owner).transfer(address(this).balance);
locked = false;
}

function myToken() public view returns(address){
return _myToken[msg.sender];
}

}


this is the deployment script:


const TokenMaker = artifacts.require('TokenMaker'); const Token = artifacts.require('Token');

module.exports = function(deployer){

deployer.deploy(TokenMaker);

}