contract StripToken is ERC20, Ownable {
    using SafeMath for uint256;

    // modify token name
    string public constant NAME = 'StripCoin';
    // modify token symbol
    string public constant SYMBOL = 'STRIP';
    // modify token decimals
    uint8 public constant DECIMALS = 18;
    // modify initial token supply
    uint256 public constant TOTAL_SUPPLY = 500e9 * (10**uint256(DECIMALS)); // 500,000,000,000 tokens
    // multisig contract address
    address public multiSigAdmin;

    event MultiSigAdminUpdated(address _multiSigAdmin);

    /**
     * @dev Constructor that gives msg.sender all of existing tokens.
     */
    constructor() Ownable() ERC20(NAME, SYMBOL) {
        _mint(msg.sender, TOTAL_SUPPLY);
    }

    /**
     * @dev Override decimals() function to customize decimals
     */
    function decimals() public view virtual override returns (uint8) {
        return DECIMALS;
    }

    function setMultiSigAdminAddress(address _multiSigAdmin) external onlyOwner {
        require (_multiSigAdmin != address(0x00), "Invalid MultiSig admin address");
        multiSigAdmin = _multiSigAdmin;
        emit MultiSigAdminUpdated(multiSigAdmin);
    }
    
    /**
     * @dev Recovers the ERC20 token balance mistakenly sent to the contract. Only multisig contract can call this function
     * @param tokenAddress The token contract address
     * @param tokenAmount Number of tokens to be sent
     */
    function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyMultiSigAdmin {
        IERC20(tokenAddress).transfer(owner(), tokenAmount);
    }

    // modifier for multiSig only
    modifier onlyMultiSigAdmin() {
        require(msg.sender == multiSigAdmin, "Should be multiSig contract");
        _;
    }
}
/**
 * @title StripToken Contract
 * @author 
 * @dev
 */
function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyMultiSigAdmin {
    IERC20(tokenAddress).transfer(owner(), tokenAmount);
}

/**
 * @dev Recovers the ERC20 token balance mistakenly sent to the contract. Only multisig contract can call this function
 * @param tokenAddress The token contract address
 * @param tokenAmount Number of tokens to be sent
 */