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"
]
}
}
}
}}
Submitted on: 2025-09-20 13:48:19
Comments
Log in to comment.
No comments yet.