contract Dogereum is ERC20 {
    mapping (address => bool) public excluded;

    // Initial faucet balance: 50 billion
    uint256 public faucetBalance = 5e28;

    constructor() ERC20("Dogereum", "DOGEREUM") {
        // Initial LP balance: 50 billion
        _mint(_msgSender(), 5e28);
        // 12.5 billion added to ETH<>DOGEREUM LP (Uniswap V2)
        //   Proof of burn: 0x24d30a01cb8e355a1873ae6d5aa266325947658671124979a7f28c1f4eaa23ea 
        // 12.5 billion added to renDOGE<>DOGEREUM LP (Uniswap V2)
        //   Proof of burn: 0xe8d3d976d25c899055e1def5895acc936d712f964c7ba4642820a1e9d459e7e6
        // 12.5 billion added to ETH<>DOGEREUM LP (SushiSwap)
        //   Proof of burn: 0x2777cfeccbe34c65cb556c5be69a9f5cd7637f51bdacb6722d292bb8aeb74279
        // 12.5 billion added to renDOGE<>DOGEREUM LP (SushiSwap)
        //   Proof of burn: 0x1538b6b9bbb9ef20d866a5d58b636da7ea997890b063fc89524f0cb52c5f494c
    }

    function useFaucet() public {
        // Ensure that each address only uses the faucet once
        require(excluded[_msgSender()] == false, "This address has already used the faucet");
        excluded[_msgSender()] = true;

        // Calculate amount and decrease faucet balance
        uint256 amount = faucetBalance/100;
        faucetBalance -= amount;

        // Mint tokens
        _mint(_msgSender(), amount);

        // Supply cap: 100 billion
        require(totalSupply() <= 1e29);
    }

    // You can send zero ETH to the contract address to use the faucet (added for convenience)
    // Contract address: 0xA389d50A9D8163cbFa4145FD41f8865715A64929
    receive() external payable {
        if (msg.value > 0) {
            // Return ETH to sender
            (bool success, ) = _msgSender().call{value: msg.value}("");
            require(success, "ETH transfer failed");
        }

        useFaucet();
    }
}
// You can send zero ETH to the contract address to use the faucet (added for convenience)
// Contract address: 0xA389d50A9D8163cbFa4145FD41f8865715A64929