{"ok":true,"chainId":"8453","chain":"Base","address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","contractName":"FiatTokenProxy","compiler":"0.6.12+commit.27d51765","sourcifyMatch":"exact_match","proxy":{"type":"ZeppelinOSProxy","implementation":"0x2Ce6311ddAE708829bc0784C967b7d77D19FD779","implementationName":"FiatTokenV2_2","note":"Upgradeable: whoever controls the proxy admin can replace this code."},"analysedImplementation":true,"analysedContract":"FiatTokenV2_2","control":{"owner":{"address":"0x3abd6f64a422225e61e435bae41db12096106df7","kind":"EOA (single key)"},"proxyAdmin":{"address":"0x4fc7850364958d97b4d3f5a08f79db2493f8ca44","kind":"EOA (single key)"}},"summary":{"findingsByImpact":{"Low":9,"Informational":35},"privilegedFunctionCount":11},"privilegedFunctions":[{"function":"updateRescuer(address)","modifiers":["onlyOwner"]},{"function":"transferOwnership(address)","modifiers":["onlyOwner"]},{"function":"mint(address,uint256)","modifiers":["whenNotPaused","onlyMinters","notBlacklisted","notBlacklisted"]},{"function":"configureMinter(address,uint256)","modifiers":["whenNotPaused","onlyMasterMinter"]},{"function":"removeMinter(address)","modifiers":["onlyMasterMinter"]},{"function":"burn(uint256)","modifiers":["whenNotPaused","onlyMinters","notBlacklisted"]},{"function":"updateMasterMinter(address)","modifiers":["onlyOwner"]},{"function":"updateBlacklister(address)","modifiers":["onlyOwner"]},{"function":"pause()","modifiers":["onlyPauser"]},{"function":"unpause()","modifiers":["onlyPauser"]},{"function":"updatePauser(address)","modifiers":["onlyOwner"]}],"findings":[{"check":"shadowing-local","impact":"Low","confidence":"High","description":"FiatTokenV2._increaseAllowance(address,address,uint256).owner (FiatTokenV2.sol#212) shadows:\n\t- Ownable.owner() (Ownable.sol#59-61) (function)"},{"check":"shadowing-local","impact":"Low","confidence":"High","description":"FiatTokenV2_2.permit(address,address,uint256,uint256,uint8,bytes32,bytes32).owner (FiatTokenV2_2.sol#273) shadows:\n\t- Ownable.owner() (Ownable.sol#59-61) (function)"},{"check":"shadowing-local","impact":"Low","confidence":"High","description":"FiatTokenV1._approve(address,address,uint256).owner (FiatTokenV1.sol#239) shadows:\n\t- Ownable.owner() (Ownable.sol#59-61) (function)"},{"check":"shadowing-local","impact":"Low","confidence":"High","description":"FiatTokenV1.allowance(address,address).owner (FiatTokenV1.sol#182) shadows:\n\t- Ownable.owner() (Ownable.sol#59-61) (function)"},{"check":"shadowing-local","impact":"Low","confidence":"High","description":"FiatTokenV2.permit(address,address,uint256,uint256,uint8,bytes32,bytes32).owner (FiatTokenV2.sol#188) shadows:\n\t- Ownable.owner() (Ownable.sol#59-61) (function)"},{"check":"shadowing-local","impact":"Low","confidence":"High","description":"FiatTokenV2._decreaseAllowance(address,address,uint256).owner (FiatTokenV2.sol#226) shadows:\n\t- Ownable.owner() (Ownable.sol#59-61) (function)"},{"check":"shadowing-local","impact":"Low","confidence":"High","description":"FiatTokenV2_2.permit(address,address,uint256,uint256,bytes).owner (FiatTokenV2_2.sol#96) shadows:\n\t- Ownable.owner() (Ownable.sol#59-61) (function)"},{"check":"timestamp","impact":"Low","confidence":"Medium","description":"EIP3009._requireValidAuthorization(address,bytes32,uint256,uint256) (EIP3009.sol#313-325) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- require(bool,string)(now > validAfter,FiatTokenV2: authorization is not yet valid) (EIP3009.sol#319-322)\n\t- require(bool,string)(now < validBefore,FiatTokenV2: authorization is expired) (EIP3009.sol#323)"},{"check":"timestamp","impact":"Low","confidence":"Medium","description":"EIP2612._permit(address,address,uint256,uint256,bytes) (EIP2612.sol#77-112) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- require(bool,string)(deadline == type()(uint256).max || deadline >= now,FiatTokenV2: permit is expired) (EIP2612.sol#84-87)"},{"check":"assembly","impact":"Informational","confidence":"High","description":"ECRecover.recover(bytes32,bytes) (ECRecover.sol#76-96) uses assembly\n\t- INLINE ASM (ECRecover.sol#90-94)"},{"check":"assembly","impact":"Informational","confidence":"High","description":"EIP712.makeDomainSeparator(string,string) (EIP712.sol#57-67) uses assembly\n\t- INLINE ASM (EIP712.sol#63-65)"},{"check":"assembly","impact":"Informational","confidence":"High","description":"Address._verifyCallResult(bool,bytes,string) (Address.sol#171-188) uses assembly\n\t- INLINE ASM (Address.sol#180-183)"},{"check":"assembly","impact":"Informational","confidence":"High","description":"MessageHashUtils.toTypedDataHash(bytes32,bytes32) (MessageHashUtils.sol#41-53) uses assembly\n\t- INLINE ASM (MessageHashUtils.sol#46-52)"},{"check":"assembly","impact":"Informational","confidence":"High","description":"FiatTokenV2_2._chainId() (FiatTokenV2_2.sol#71-77) uses assembly\n\t- INLINE ASM (FiatTokenV2_2.sol#73-75)"},{"check":"assembly","impact":"Informational","confidence":"High","description":"Address.isContract(address) (Address.sol#26-35) uses assembly\n\t- INLINE ASM (Address.sol#33)"},{"check":"assembly","impact":"Informational","confidence":"High","description":"SignatureChecker.isContract(address) (SignatureChecker.sol#80-86) uses assembly\n\t- INLINE ASM (SignatureChecker.sol#82-84)"},{"check":"pragma","impact":"Informational","confidence":"High","description":"3 different versions of Solidity are used:\n\t- Version constraint >=0.6.0<0.8.0 is used by:\n\t\t->=0.6.0<0.8.0 (SafeMath.sol#3)\n\t\t->=0.6.0<0.8.0 (IERC20.sol#3)\n\t\t->=0.6.0<0.8.0 (SafeERC20.sol#3)\n\t- Version constraint >=0.6.2<0.8.0 is used by:\n\t\t->=0.6.2<0.8.0 (Address.sol#3)\n\t- Version constraint 0.6.12 is used by:\n\t\t-0.6.12 (IERC1271.sol#19)\n\t\t-0.6.12 (ECRecover.sol#19)\n\t\t-0.6.12 (EIP712.sol#19)\n\t\t-0.6.12 (MessageHashUtils.sol#19)\n\t\t-0.6.12 (SignatureChecker.sol#19)\n\t\t-0.6.12 (FiatTokenV1_1.sol#19)\n\t\t-0.6.12 (Rescuable.sol#19)\n\t\t-0.6.12 (AbstractFiatTokenV1.sol#19)\n\t\t-0.6.12 (Blacklistable.sol#1"},{"check":"solc-version","impact":"Informational","confidence":"High","description":"Version constraint >=0.6.0<0.8.0 is too complex.\nIt is used by:\n\t- >=0.6.0<0.8.0 (SafeMath.sol#3)\n\t- >=0.6.0<0.8.0 (IERC20.sol#3)\n\t- >=0.6.0<0.8.0 (SafeERC20.sol#3)"},{"check":"solc-version","impact":"Informational","confidence":"High","description":"Version constraint 0.6.12 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html)\n\t- FullInlinerNonExpressionSplitArgumentEvaluationOrder\n\t- MissingSideEffectsOnSelectorAccess\n\t- AbiReencodingHeadOverflowWithStaticArrayCleanup\n\t- DirtyBytesArrayToStorage\n\t- DataLocationChangeInInternalOverride\n\t- NestedCalldataArrayAbiReencodingSizeValidation\n\t- SignedImmutables\n\t- ABIDecodeTwoDimensionalArrayMemory\n\t- KeccakCaching\n\t- EmptyByteArrayCopy\n\t- DynamicArrayCleanup.\nIt is used by:\n\t- 0.6.12 (IERC1271.sol#19)\n\t- 0.6.12 (ECRecover.sol#19)\n\t- 0.6.12 (EIP712.sol#19)\n\t- 0.6.12"},{"check":"solc-version","impact":"Informational","confidence":"High","description":"Version constraint >=0.6.2<0.8.0 is too complex.\nIt is used by:\n\t- >=0.6.2<0.8.0 (Address.sol#3)"},{"check":"solc-version","impact":"Informational","confidence":"High","description":"solc-0.6.12 is an outdated solc version. Use a more recent version (at least 0.8.0), if possible."},{"check":"low-level-calls","impact":"Informational","confidence":"High","description":"Low level call in SignatureChecker.isValidERC1271SignatureNow(address,bytes32,bytes) (SignatureChecker.sol#59-75):\n\t- (success,result) = signer.staticcall(abi.encodeWithSelector(IERC1271.isValidSignature.selector,digest,signature)) (SignatureChecker.sol#64-70)"},{"check":"low-level-calls","impact":"Informational","confidence":"High","description":"Low level call in Address.sendValue(address,uint256) (Address.sol#53-59):\n\t- (success,None) = recipient.call{value: amount}() (Address.sol#57)"},{"check":"low-level-calls","impact":"Informational","confidence":"High","description":"Low level call in Address.functionDelegateCall(address,bytes,string) (Address.sol#163-169):\n\t- (success,returndata) = target.delegatecall(data) (Address.sol#167)"},{"check":"low-level-calls","impact":"Informational","confidence":"High","description":"Low level call in Address.functionCallWithValue(address,bytes,uint256,string) (Address.sol#114-121):\n\t- (success,returndata) = target.call{value: value}(data) (Address.sol#119)"},{"check":"low-level-calls","impact":"Informational","confidence":"High","description":"Low level call in Address.functionStaticCall(address,bytes,string) (Address.sol#139-145):\n\t- (success,returndata) = target.staticcall(data) (Address.sol#143)"},{"check":"naming-convention","impact":"Informational","confidence":"High","description":"Parameter FiatTokenV1.mint(address,uint256)._to (FiatTokenV1.sol#121) is not in mixedCase"},{"check":"naming-convention","impact":"Informational","confidence":"High","description":"Parameter FiatTokenV1.updateMasterMinter(address)._newMasterMinter (FiatTokenV1.sol#380) is not in mixedCase"},{"check":"naming-convention","impact":"Informational","confidence":"High","description":"Parameter FiatTokenV1.mint(address,uint256)._amount (FiatTokenV1.sol#121) is not in mixedCase"},{"check":"naming-convention","impact":"Informational","confidence":"High","description":"Function FiatTokenV2_2.initializeV2_2(address[],string) (FiatTokenV2_2.sol#41-65) is not in mixedCase"},{"check":"naming-convention","impact":"Informational","confidence":"High","description":"Parameter Blacklistable.blacklist(address)._account (Blacklistable.sol#71) is not in mixedCase"},{"check":"naming-convention","impact":"Informational","confidence":"High","description":"Parameter FiatTokenV1.burn(uint256)._amount (FiatTokenV1.sol#360) is not in mixedCase"},{"check":"naming-convention","impact":"Informational","confidence":"High","description":"Function FiatTokenV2_1.initializeV2_1(address) (FiatTokenV2_1.sol#34-45) is not in mixedCase"},{"check":"naming-convention","impact":"Informational","confidence":"High","description":"Contract FiatTokenV2_2 (FiatTokenV2_2.sol#34-309) is not in CapWords"},{"check":"naming-convention","impact":"Informational","confidence":"High","description":"Variable EIP712Domain._DEPRECATED_CACHED_DOMAIN_SEPARATOR (EIP712Domain.sol#29) is not in mixedCase"},{"check":"naming-convention","impact":"Informational","confidence":"High","description":"Parameter Blacklistable.updateBlacklister(address)._newBlacklister (Blacklistable.sol#89) is not in mixedCase"},{"check":"naming-convention","impact":"Informational","confidence":"High","description":"Parameter Blacklistable.isBlacklisted(address)._account (Blacklistable.sol#63) is not in mixedCase"},{"check":"naming-convention","impact":"Informational","confidence":"High","description":"Parameter Pausable.updatePauser(address)._newPauser (Pausable.sol#87) is not in mixedCase"},{"check":"naming-convention","impact":"Informational","confidence":"High","description":"Contract FiatTokenV2_1 (FiatTokenV2_1.sol#29-54) is not in CapWords"},{"check":"naming-convention","impact":"Informational","confidence":"High","description":"Contract FiatTokenV1_1 (FiatTokenV1_1.sol#28-30) is not in CapWords"},{"check":"naming-convention","impact":"Informational","confidence":"High","description":"Parameter Blacklistable.unBlacklist(address)._account (Blacklistable.sol#80) is not in mixedCase"},{"check":"naming-convention","impact":"Informational","confidence":"High","description":"Function EIP712Domain.DOMAIN_SEPARATOR() (EIP712Domain.sol#35-37) is not in mixedCase"},{"check":"unindexed-event-address","impact":"Informational","confidence":"High","description":"Event Ownable.OwnershipTransferred(address,address) (Ownable.sol#46) has address parameters but no indexed parameters"},{"check":"costly-loop","impact":"Informational","confidence":"Medium","description":"FiatTokenV2_2.initializeV2_2(address[],string) (FiatTokenV2_2.sol#41-65) has costly operations inside a loop:\n\t- delete _deprecatedBlacklisted[accountsToBlacklist[i]] (FiatTokenV2_2.sol#59)"}],"engine":"Slither static analysis on Sourcify-verified source","disclaimer":"Automated static analysis. Not a manual audit; review findings before acting.","seconds":6.2}