// SPDX-License-Identifier: UNLICENSED pragma solidity =0.8.18; import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; library ERC20Helper { function name(IERC20 target) internal view returns (string memory) { return name(address(target)); } function name(address target) internal view returns (string memory) { return IERC20Metadata(target).name(); } function tryName(IERC20 target) internal view returns (string memory) { return tryName(address(target), ""); } function tryName(address target) internal view returns (string memory) { return tryName(target, ""); } function tryName(IERC20 target, string memory defaultName) internal view returns (string memory) { return tryName(address(target), defaultName); } function tryName(address target, string memory defaultName) internal view returns (string memory result) { if (!AddressUpgradeable.isContract(target)) return defaultName; try IERC20Metadata(target).name() returns (string memory result_) { result = result_; } catch (bytes memory) { result = defaultName; } } function symbol(IERC20 target) internal view returns (string memory) { return symbol(address(target)); } function symbol(address target) internal view returns (string memory) { return IERC20Metadata(target).symbol(); } function trySymbol(IERC20 target) internal view returns (string memory) { return trySymbol(address(target), ""); } function trySymbol(address target) internal view returns (string memory) { return trySymbol(target, ""); } function trySymbol(IERC20 target, string memory defaultSymbol) internal view returns (string memory) { return trySymbol(address(target), defaultSymbol); } function trySymbol(address target, string memory defaultSymbol) internal view returns (string memory result) { if (!AddressUpgradeable.isContract(target)) return defaultSymbol; try IERC20Metadata(target).symbol() returns (string memory result_) { result = result_; } catch (bytes memory) { result = defaultSymbol; } } function decimals(IERC20 target) internal view returns (uint8) { return decimals(address(target)); } function decimals(address target) internal view returns (uint8) { return IERC20Metadata(target).decimals(); } function tryDecimals(IERC20 target) internal view returns (uint8) { return tryDecimals(address(target), 18); } function tryDecimals(address target) internal view returns (uint8) { return tryDecimals(target, 18); } function tryDecimals(IERC20 target, uint8 defaultDecimals) internal view returns (uint8) { return tryDecimals(address(target), defaultDecimals); } function tryDecimals(address target, uint8 defaultDecimals) internal view returns (uint8 result) { if (!AddressUpgradeable.isContract(target)) return defaultDecimals; try IERC20Metadata(target).decimals() returns (uint8 result_) { result = result_; } catch (bytes memory) { result = defaultDecimals; } } }