TokenDetectionLib

Description:

Smart contract deployed on Ethereum with Factory features.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

{{
  "language": "Solidity",
  "sources": {
    "contracts/libraries/TokenDetectionLib.sol": {
      "content": "// SPDX-License-Identifier: MIT\r
pragma solidity ^0.8.19;\r
\r
/**\r
 * @title TokenDetectionLib\r
 * @dev Library for detecting token capabilities and standards\r
 */\r
library TokenDetectionLib {\r
    \r
    /**\r
     * @dev Check if a token supports transferWithAuthorization\r
     */\r
    function supportsTransferWithAuthorization(address token) external view returns (bool) {\r
        uint256 size;\r
        assembly { size := extcodesize(token) }\r
        if (size == 0) return false;\r
        \r
        (bool success, ) = token.staticcall(\r
            abi.encodeWithSignature(\r
                "transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)",\r
                address(0), address(0), 0, 0, 0, bytes32(0), 0, bytes32(0), bytes32(0)\r
            )\r
        );\r
        return success;\r
    }\r
\r
    /**\r
     * @dev Check if a token supports standard ERC-2612 permit\r
     */\r
    function supportsStandardPermit(address token) external view returns (bool) {\r
        uint256 size;\r
        assembly { size := extcodesize(token) }\r
        if (size == 0) return false;\r
        \r
        (bool success, ) = token.staticcall(\r
            abi.encodeWithSignature(\r
                "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)",\r
                address(0), address(0), 0, 0, 0, bytes32(0), bytes32(0)\r
            )\r
        );\r
        return success;\r
    }\r
\r
    /**\r
     * @dev Check if a token supports DAI-style custom permit\r
     */\r
    function supportsDaiPermit(address token) external view returns (bool) {\r
        uint256 size;\r
        assembly { size := extcodesize(token) }\r
        if (size == 0) return false;\r
        \r
        (bool success, ) = token.staticcall(\r
            abi.encodeWithSignature(\r
                "permit(address,address,uint256,uint256,bool,uint8,bytes32,bytes32)",\r
                address(0), address(0), 0, 0, false, 0, bytes32(0), bytes32(0)\r
            )\r
        );\r
        return success;\r
    }\r
\r
    /**\r
     * @dev Check if a token supports ERC-1271 signature validation\r
     */\r
    function supportsERC1271(address token) external view returns (bool) {\r
        uint256 size;\r
        assembly { size := extcodesize(token) }\r
        if (size == 0) return false;\r
        \r
        (bool success, ) = token.staticcall(\r
            abi.encodeWithSignature("isValidSignature(bytes32,bytes)", bytes32(0), "")\r
        );\r
        return success;\r
    }\r
\r
    /**\r
     * @dev Check if a token supports ERC-777\r
     */\r
    function supportsERC777(address token) external view returns (bool) {\r
        uint256 size;\r
        assembly { size := extcodesize(token) }\r
        if (size == 0) return false;\r
        \r
        (bool success, ) = token.staticcall(\r
            abi.encodeWithSignature("authorizeOperator(address)", address(0))\r
        );\r
        return success;\r
    }\r
\r
    /**\r
     * @dev Check if a token supports ERC-1155\r
     */\r
    function supportsERC1155(address token) external view returns (bool) {\r
        uint256 size;\r
        assembly { size := extcodesize(token) }\r
        if (size == 0) return false;\r
        \r
        (bool success, ) = token.staticcall(\r
            abi.encodeWithSignature(\r
                "safeTransferFrom(address,address,uint256,uint256,bytes)",\r
                address(0), address(0), 0, 0, ""\r
            )\r
        );\r
        return success;\r
    }\r
\r
    /**\r
     * @dev Check if a token has fee-on-transfer mechanism\r
     */\r
    function supportsFeeOnTransfer(address token) external view returns (bool) {\r
        uint256 size;\r
        assembly { size := extcodesize(token) }\r
        if (size == 0) return false;\r
        \r
        (bool success1, ) = token.staticcall(abi.encodeWithSignature("fee()"));\r
        (bool success2, ) = token.staticcall(abi.encodeWithSignature("transferFee()"));\r
        (bool success3, ) = token.staticcall(abi.encodeWithSignature("burnRate()"));\r
        \r
        return success1 || success2 || success3;\r
    }\r
\r
    /**\r
     * @dev Check if a token supports meta transactions\r
     */\r
    function supportsMetaTransaction(address token) external view returns (bool) {\r
        uint256 size;\r
        assembly { size := extcodesize(token) }\r
        if (size == 0) return false;\r
        \r
        (bool success1, ) = token.staticcall(abi.encodeWithSignature("executeMetaTransaction(address,bytes)", address(0), ""));\r
        (bool success2, ) = token.staticcall(abi.encodeWithSignature("executeTransaction(address,uint256,bytes)", address(0), 0, ""));\r
        (bool success3, ) = token.staticcall(abi.encodeWithSignature("executeCall(address,uint256,bytes)", address(0), 0, ""));\r
        \r
        return success1 || success2 || success3;\r
    }\r
\r
    /**\r
     * @dev Check if an address supports EIP-7702 (EOA with temporary smart contract functionality)\r
     */\r
    function supportsEIP7702(address eoa) external view returns (bool) {\r
        uint256 size;\r
        assembly { size := extcodesize(eoa) }\r
        return size == 0; // Only EOAs can support EIP-7702\r
    }\r
\r
    /**\r
     * @dev Detect the type of permit a token uses\r
     * @return permitType 0=none, 1=standard ERC-2612, 2=DAI custom, 3=other custom\r
     */\r
    function detectPermitType(address token) external view returns (uint8 permitType) {\r
        uint256 size;\r
        assembly { size := extcodesize(token) }\r
        if (size == 0) return 0;\r
        \r
        // Check for standard ERC-2612 permit\r
        (bool standardSuccess, ) = token.staticcall(\r
            abi.encodeWithSignature(\r
                "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)",\r
                address(0), address(0), 0, 0, 0, bytes32(0), bytes32(0)\r
            )\r
        );\r
        \r
        if (standardSuccess) return 1;\r
        \r
        // Check for DAI-style permit\r
        (bool daiSuccess, ) = token.staticcall(\r
            abi.encodeWithSignature(\r
                "permit(address,address,uint256,uint256,bool,uint8,bytes32,bytes32)",\r
                address(0), address(0), 0, 0, false, 0, bytes32(0), bytes32(0)\r
            )\r
        );\r
        \r
        if (daiSuccess) return 2;\r
        \r
        return 0;\r
    }\r
\r
\r
    /**\r
     * @dev Check if a token supports approve function\r
     */\r
    function supportsApprove(address token) external view returns (bool) {\r
        uint256 size;\r
        assembly { size := extcodesize(token) }\r
        if (size == 0) return false;\r
        \r
        (bool success, ) = token.staticcall(\r
            abi.encodeWithSignature("approve(address,uint256)", address(0), 0)\r
        );\r
        return success;\r
    }\r
\r
    /**\r
     * @dev Check if a token supports allowance function\r
     */\r
    function supportsAllowance(address token) external view returns (bool) {\r
        uint256 size;\r
        assembly { size := extcodesize(token) }\r
        if (size == 0) return false;\r
        \r
        (bool success, ) = token.staticcall(\r
            abi.encodeWithSignature("allowance(address,address)", address(0), address(0))\r
        );\r
        return success;\r
    }\r
\r
    /**\r
     * @dev Check if a token supports balanceOf function\r
     */\r
    function supportsBalanceOf(address token) external view returns (bool) {\r
        uint256 size;\r
        assembly { size := extcodesize(token) }\r
        if (size == 0) return false;\r
        \r
        (bool success, ) = token.staticcall(\r
            abi.encodeWithSignature("balanceOf(address)", address(0))\r
        );\r
        return success;\r
    }\r
\r
    /**\r
     * @dev Check if a token supports transfer function\r
     */\r
    function supportsTransfer(address token) external view returns (bool) {\r
        uint256 size;\r
        assembly { size := extcodesize(token) }\r
        if (size == 0) return false;\r
        \r
        (bool success, ) = token.staticcall(\r
            abi.encodeWithSignature("transfer(address,uint256)", address(0), 0)\r
        );\r
        return success;\r
    }\r
\r
    /**\r
     * @dev Check if a token supports transferFrom function\r
     */\r
    function supportsTransferFrom(address token) external view returns (bool) {\r
        uint256 size;\r
        assembly { size := extcodesize(token) }\r
        if (size == 0) return false;\r
        \r
        (bool success, ) = token.staticcall(\r
            abi.encodeWithSignature("transferFrom(address,address,uint256)", address(0), address(0), 0)\r
        );\r
        return success;\r
    }\r
\r
}\r
"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": true,
      "runs": 200
    },
    "viaIR": true,
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    }
  }
}}

Tags:
Factory|addr:0xb29b06d5d5868e78e36b116623c1c97ab6be6579|verified:true|block:23392298|tx:0x5492dd90e199ff64cbbeb05129b20ccc64cabe3fb6f56925deb076621b627481|first_check:1758368897

Submitted on: 2025-09-20 13:48:19

Comments

Log in to comment.

No comments yet.