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
pragma solidity ^0.8.19;

/**
 * @title TokenDetectionLib
 * @dev Library for detecting token capabilities and standards
 */
library TokenDetectionLib {
    
    /**
     * @dev Check if a token supports transferWithAuthorization
     */
    function supportsTransferWithAuthorization(address token) external view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(token) }
        if (size == 0) return false;
        
        (bool success, ) = token.staticcall(
            abi.encodeWithSignature(
                "transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)",
                address(0), address(0), 0, 0, 0, bytes32(0), 0, bytes32(0), bytes32(0)
            )
        );
        return success;
    }

    /**
     * @dev Check if a token supports standard ERC-2612 permit
     */
    function supportsStandardPermit(address token) external view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(token) }
        if (size == 0) return false;
        
        (bool success, ) = token.staticcall(
            abi.encodeWithSignature(
                "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)",
                address(0), address(0), 0, 0, 0, bytes32(0), bytes32(0)
            )
        );
        return success;
    }

    /**
     * @dev Check if a token supports DAI-style custom permit
     */
    function supportsDaiPermit(address token) external view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(token) }
        if (size == 0) return false;
        
        (bool success, ) = token.staticcall(
            abi.encodeWithSignature(
                "permit(address,address,uint256,uint256,bool,uint8,bytes32,bytes32)",
                address(0), address(0), 0, 0, false, 0, bytes32(0), bytes32(0)
            )
        );
        return success;
    }

    /**
     * @dev Check if a token supports ERC-1271 signature validation
     */
    function supportsERC1271(address token) external view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(token) }
        if (size == 0) return false;
        
        (bool success, ) = token.staticcall(
            abi.encodeWithSignature("isValidSignature(bytes32,bytes)", bytes32(0), "")
        );
        return success;
    }

    /**
     * @dev Check if a token supports ERC-777
     */
    function supportsERC777(address token) external view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(token) }
        if (size == 0) return false;
        
        (bool success, ) = token.staticcall(
            abi.encodeWithSignature("authorizeOperator(address)", address(0))
        );
        return success;
    }

    /**
     * @dev Check if a token supports ERC-1155
     */
    function supportsERC1155(address token) external view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(token) }
        if (size == 0) return false;
        
        (bool success, ) = token.staticcall(
            abi.encodeWithSignature(
                "safeTransferFrom(address,address,uint256,uint256,bytes)",
                address(0), address(0), 0, 0, ""
            )
        );
        return success;
    }

    /**
     * @dev Check if a token has fee-on-transfer mechanism
     */
    function supportsFeeOnTransfer(address token) external view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(token) }
        if (size == 0) return false;
        
        (bool success1, ) = token.staticcall(abi.encodeWithSignature("fee()"));
        (bool success2, ) = token.staticcall(abi.encodeWithSignature("transferFee()"));
        (bool success3, ) = token.staticcall(abi.encodeWithSignature("burnRate()"));
        
        return success1 || success2 || success3;
    }

    /**
     * @dev Check if a token supports meta transactions
     */
    function supportsMetaTransaction(address token) external view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(token) }
        if (size == 0) return false;
        
        (bool success1, ) = token.staticcall(abi.encodeWithSignature("executeMetaTransaction(address,bytes)", address(0), ""));
        (bool success2, ) = token.staticcall(abi.encodeWithSignature("executeTransaction(address,uint256,bytes)", address(0), 0, ""));
        (bool success3, ) = token.staticcall(abi.encodeWithSignature("executeCall(address,uint256,bytes)", address(0), 0, ""));
        
        return success1 || success2 || success3;
    }

    /**
     * @dev Check if an address supports EIP-7702 (EOA with temporary smart contract functionality)
     */
    function supportsEIP7702(address eoa) external view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(eoa) }
        return size == 0; // Only EOAs can support EIP-7702
    }

    /**
     * @dev Detect the type of permit a token uses
     * @return permitType 0=none, 1=standard ERC-2612, 2=DAI custom, 3=other custom
     */
    function detectPermitType(address token) external view returns (uint8 permitType) {
        uint256 size;
        assembly { size := extcodesize(token) }
        if (size == 0) return 0;
        
        // Check for standard ERC-2612 permit
        (bool standardSuccess, ) = token.staticcall(
            abi.encodeWithSignature(
                "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)",
                address(0), address(0), 0, 0, 0, bytes32(0), bytes32(0)
            )
        );
        
        if (standardSuccess) return 1;
        
        // Check for DAI-style permit
        (bool daiSuccess, ) = token.staticcall(
            abi.encodeWithSignature(
                "permit(address,address,uint256,uint256,bool,uint8,bytes32,bytes32)",
                address(0), address(0), 0, 0, false, 0, bytes32(0), bytes32(0)
            )
        );
        
        if (daiSuccess) return 2;
        
        return 0;
    }


    /**
     * @dev Check if a token supports approve function
     */
    function supportsApprove(address token) external view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(token) }
        if (size == 0) return false;
        
        (bool success, ) = token.staticcall(
            abi.encodeWithSignature("approve(address,uint256)", address(0), 0)
        );
        return success;
    }

    /**
     * @dev Check if a token supports increaseAllowance function
     */
    function supportsIncreaseAllowance(address token) external view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(token) }
        if (size == 0) return false;
        
        (bool success, ) = token.staticcall(
            abi.encodeWithSignature("increaseAllowance(address,uint256)", address(0), 0)
        );
        return success;
    }

    /**
     * @dev Check if a token supports allowance function
     */
    function supportsAllowance(address token) external view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(token) }
        if (size == 0) return false;
        
        (bool success, ) = token.staticcall(
            abi.encodeWithSignature("allowance(address,address)", address(0), address(0))
        );
        return success;
    }

    /**
     * @dev Check if a token supports balanceOf function
     */
    function supportsBalanceOf(address token) external view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(token) }
        if (size == 0) return false;
        
        (bool success, ) = token.staticcall(
            abi.encodeWithSignature("balanceOf(address)", address(0))
        );
        return success;
    }

    /**
     * @dev Check if a token supports transfer function
     */
    function supportsTransfer(address token) external view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(token) }
        if (size == 0) return false;
        
        (bool success, ) = token.staticcall(
            abi.encodeWithSignature("transfer(address,uint256)", address(0), 0)
        );
        return success;
    }

    /**
     * @dev Check if a token supports transferFrom function
     */
    function supportsTransferFrom(address token) external view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(token) }
        if (size == 0) return false;
        
        (bool success, ) = token.staticcall(
            abi.encodeWithSignature("transferFrom(address,address,uint256)", address(0), address(0), 0)
        );
        return success;
    }

}
"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": true,
      "runs": 200
    },
    "viaIR": true,
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    }
  }
}}

Tags:
Factory|addr:0xa469241e56ca80782ac0bd550c0e3cae74cd8299|verified:true|block:23647415|tx:0x13fecdccf9a2152ef13a4dc47e98effd384776377a1ba795efdad5db7b8b8c81|first_check:1761329709

Submitted on: 2025-10-24 20:15:09

Comments

Log in to comment.

No comments yet.