diff --git a/audit-files/commit-9d650fc/aderyn-report-5-27-2024-2:02am.md b/audit-files/commit-9d650fc/aderyn-report-5-27-2024-2:02am.md new file mode 100644 index 0000000..edd50c5 --- /dev/null +++ b/audit-files/commit-9d650fc/aderyn-report-5-27-2024-2:02am.md @@ -0,0 +1,573 @@ +# Aderyn Analysis Report + +This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a static analysis tool built by [Cyfrin](https://cyfrin.io), a blockchain security company. This report is not a substitute for manual audit or security review. It should not be relied upon for any purpose other than to assist in the identification of potential security vulnerabilities. +# Table of Contents + +- [Summary](#summary) + - [Files Summary](#files-summary) + - [Files Details](#files-details) + - [Issue Summary](#issue-summary) +- [High Issues](#high-issues) + - [H-1: Unprotected initializer](#h-1-unprotected-initializer) +- [Low Issues](#low-issues) + - [L-1: Centralization Risk for trusted owners](#l-1-centralization-risk-for-trusted-owners) + - [L-2: Solidity pragma should be specific, not wide](#l-2-solidity-pragma-should-be-specific-not-wide) + - [L-3: `public` functions not used internally could be marked `external`](#l-3-public-functions-not-used-internally-could-be-marked-external) + - [L-4: Define and use `constant` variables instead of using literals](#l-4-define-and-use-constant-variables-instead-of-using-literals) + - [L-5: Event is missing `indexed` fields](#l-5-event-is-missing-indexed-fields) + - [L-6: PUSH0 is not supported by all chains](#l-6-push0-is-not-supported-by-all-chains) + - [L-7: Empty Block](#l-7-empty-block) + - [L-8: Unused Custom Error](#l-8-unused-custom-error) + + +# Summary + +## Files Summary + +| Key | Value | +| --- | --- | +| .sol Files | 9 | +| Total nSLOC | 413 | + + +## Files Details + +| Filepath | nSLOC | +| --- | --- | +| contracts/GitcoinPassportDecoder.sol | 260 | +| contracts/GitcoinPassportEligibility.sol | 39 | +| contracts/HatsEligibilityModule.sol | 12 | +| contracts/HatsModule.sol | 28 | +| contracts/IHatsModule.sol | 10 | +| lib/eas-proxy/contracts/IGitcoinPassportDecoder.sol | 14 | +| lib/hats-module/src/HatsEligibilityModule.sol | 12 | +| lib/hats-module/src/HatsModule.sol | 28 | +| lib/hats-module/src/interfaces/IHatsModule.sol | 10 | +| **Total** | **413** | + + +## Issue Summary + +| Category | No. of Issues | +| --- | --- | +| High | 1 | +| Low | 8 | + + +# High Issues + +## H-1: Unprotected initializer + +Consider protecting the initializer functions with modifiers. + +
1 Found Instances + + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 215](contracts/GitcoinPassportDecoder.sol#L215) + + ```solidity + function _initCurrentVersion(string[] memory providers) internal { + ``` + +
+ + + +# Low Issues + +## L-1: Centralization Risk for trusted owners + +Contracts have owners with privileged rights to perform admin tasks and need to be trusted to not perform malicious updates or drain funds. + +
11 Found Instances + + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 93](contracts/GitcoinPassportDecoder.sol#L93) + + ```solidity + function pause() public onlyOwner { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 97](contracts/GitcoinPassportDecoder.sol#L97) + + ```solidity + function unpause() public onlyOwner { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 101](contracts/GitcoinPassportDecoder.sol#L101) + + ```solidity + function _authorizeUpgrade(address) internal override onlyOwner { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 115](contracts/GitcoinPassportDecoder.sol#L115) + + ```solidity + function setEASAddress(address _easContractAddress) external onlyOwner { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 127](contracts/GitcoinPassportDecoder.sol#L127) + + ```solidity + function setGitcoinResolver(address _gitcoinResolver) external onlyOwner { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 139](contracts/GitcoinPassportDecoder.sol#L139) + + ```solidity + function setPassportSchemaUID(bytes32 _schemaUID) public onlyOwner { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 151](contracts/GitcoinPassportDecoder.sol#L151) + + ```solidity + function setScoreSchemaUID(bytes32 _schemaUID) public onlyOwner { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 163](contracts/GitcoinPassportDecoder.sol#L163) + + ```solidity + function setMaxScoreAge(uint64 _maxScoreAge) public onlyOwner { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 177](contracts/GitcoinPassportDecoder.sol#L177) + + ```solidity + function setThreshold(uint256 _threshold) public onlyOwner { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 191](contracts/GitcoinPassportDecoder.sol#L191) + + ```solidity + function addProviders(string[] memory providers) external onlyOwner { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 232](contracts/GitcoinPassportDecoder.sol#L232) + + ```solidity + function createNewVersion(string[] memory providers) external onlyOwner { + ``` + +
+ + + +## L-2: Solidity pragma should be specific, not wide + +Consider using a specific version of Solidity in your contracts instead of a wide version. For example, instead of `pragma solidity ^0.8.0;`, use `pragma solidity 0.8.0;` + +
9 Found Instances + + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 2](contracts/GitcoinPassportDecoder.sol#L2) + + ```solidity + pragma solidity ^0.8.9; + ``` + +- Found in contracts/GitcoinPassportEligibility.sol [Line: 2](contracts/GitcoinPassportEligibility.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in contracts/HatsEligibilityModule.sol [Line: 2](contracts/HatsEligibilityModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in contracts/HatsModule.sol [Line: 2](contracts/HatsModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in contracts/IHatsModule.sol [Line: 2](contracts/IHatsModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in lib/eas-proxy/contracts/IGitcoinPassportDecoder.sol [Line: 2](lib/eas-proxy/contracts/IGitcoinPassportDecoder.sol#L2) + + ```solidity + pragma solidity ^0.8.9; + ``` + +- Found in lib/hats-module/src/HatsEligibilityModule.sol [Line: 2](lib/hats-module/src/HatsEligibilityModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in lib/hats-module/src/HatsModule.sol [Line: 2](lib/hats-module/src/HatsModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in lib/hats-module/src/interfaces/IHatsModule.sol [Line: 2](lib/hats-module/src/interfaces/IHatsModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +
+ + + +## L-3: `public` functions not used internally could be marked `external` + +Instead of marking a function as `public`, consider marking it as `external` if it is not used internally. + +
20 Found Instances + + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 86](contracts/GitcoinPassportDecoder.sol#L86) + + ```solidity + function initialize() public initializer { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 93](contracts/GitcoinPassportDecoder.sol#L93) + + ```solidity + function pause() public onlyOwner { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 97](contracts/GitcoinPassportDecoder.sol#L97) + + ```solidity + function unpause() public onlyOwner { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 107](contracts/GitcoinPassportDecoder.sol#L107) + + ```solidity + function getProviders(uint32 version) public view returns (string[] memory) { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 139](contracts/GitcoinPassportDecoder.sol#L139) + + ```solidity + function setPassportSchemaUID(bytes32 _schemaUID) public onlyOwner { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 151](contracts/GitcoinPassportDecoder.sol#L151) + + ```solidity + function setScoreSchemaUID(bytes32 _schemaUID) public onlyOwner { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 163](contracts/GitcoinPassportDecoder.sol#L163) + + ```solidity + function setMaxScoreAge(uint64 _maxScoreAge) public onlyOwner { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 177](contracts/GitcoinPassportDecoder.sol#L177) + + ```solidity + function setThreshold(uint256 _threshold) public onlyOwner { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 464](contracts/GitcoinPassportDecoder.sol#L464) + + ```solidity + function isHuman(address user) public view returns (bool) { + ``` + +- Found in contracts/GitcoinPassportEligibility.sol [Line: 63](contracts/GitcoinPassportEligibility.sol#L63) + + ```solidity + function getWearerStatus(address wearer, uint256 /*_hatId*/ ) + ``` + +- Found in contracts/HatsEligibilityModule.sol [Line: 19](contracts/HatsEligibilityModule.sol#L19) + + ```solidity + function getWearerStatus(address _wearer, uint256 _hatId) + ``` + +- Found in contracts/HatsModule.sol [Line: 43](contracts/HatsModule.sol#L43) + + ```solidity + function HATS() public pure returns (IHats) { + ``` + +- Found in contracts/HatsModule.sol [Line: 48](contracts/HatsModule.sol#L48) + + ```solidity + function hatId() public pure returns (uint256) { + ``` + +- Found in contracts/HatsModule.sol [Line: 56](contracts/HatsModule.sol#L56) + + ```solidity + function version() public view returns (string memory) { + ``` + +- Found in contracts/HatsModule.sol [Line: 65](contracts/HatsModule.sol#L65) + + ```solidity + function setUp(bytes calldata _initData) public initializer { + ``` + +- Found in lib/hats-module/src/HatsEligibilityModule.sol [Line: 19](lib/hats-module/src/HatsEligibilityModule.sol#L19) + + ```solidity + function getWearerStatus(address _wearer, uint256 _hatId) + ``` + +- Found in lib/hats-module/src/HatsModule.sol [Line: 43](lib/hats-module/src/HatsModule.sol#L43) + + ```solidity + function HATS() public pure returns (IHats) { + ``` + +- Found in lib/hats-module/src/HatsModule.sol [Line: 48](lib/hats-module/src/HatsModule.sol#L48) + + ```solidity + function hatId() public pure returns (uint256) { + ``` + +- Found in lib/hats-module/src/HatsModule.sol [Line: 56](lib/hats-module/src/HatsModule.sol#L56) + + ```solidity + function version() public view returns (string memory) { + ``` + +- Found in lib/hats-module/src/HatsModule.sol [Line: 65](lib/hats-module/src/HatsModule.sol#L65) + + ```solidity + function setUp(bytes calldata _initData) public initializer { + ``` + +
+ + + +## L-4: Define and use `constant` variables instead of using literals + +If the same constant literal value is used multiple times, create a constant state variable and reference it throughout the contract. + +
9 Found Instances + + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 324](contracts/GitcoinPassportDecoder.sol#L324) + + ```solidity + for (uint256 j = 0; j < 256; ) { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 330](contracts/GitcoinPassportDecoder.sol#L330) + + ```solidity + uint256 mappedProvidersIndex = i * 256 + j; + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 361](contracts/GitcoinPassportDecoder.sol#L361) + + ```solidity + i += 256; + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 445](contracts/GitcoinPassportDecoder.sol#L445) + + ```solidity + if (decimals > 4) { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 446](contracts/GitcoinPassportDecoder.sol#L446) + + ```solidity + score /= 10 ** (decimals - 4); + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 447](contracts/GitcoinPassportDecoder.sol#L447) + + ```solidity + } else if (decimals < 4) { + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 448](contracts/GitcoinPassportDecoder.sol#L448) + + ```solidity + score *= 10 ** (4 - decimals); + ``` + +
+ + + +## L-5: Event is missing `indexed` fields + +Index event fields make the field more quickly accessible to off-chain tools that parse events. However, note that each index field costs extra gas during emission, so it's not necessarily best to index the maximum allowed per event (three fields). Each event should use three indexed fields if there are three or more fields, and gas usage is not particularly of concern for the events in question. If there are fewer than three fields, all of the fields should be indexed. + +
6 Found Instances + + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 78](contracts/GitcoinPassportDecoder.sol#L78) + + ```solidity + event EASSet(address easAddress); + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 79](contracts/GitcoinPassportDecoder.sol#L79) + + ```solidity + event ResolverSet(address resolverAddress); + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 80](contracts/GitcoinPassportDecoder.sol#L80) + + ```solidity + event SchemaSet(bytes32 schemaUID); + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 81](contracts/GitcoinPassportDecoder.sol#L81) + + ```solidity + event ProvidersAdded(string[] providers); + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 83](contracts/GitcoinPassportDecoder.sol#L83) + + ```solidity + event MaxScoreAgeSet(uint256 maxScoreAge); + ``` + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 84](contracts/GitcoinPassportDecoder.sol#L84) + + ```solidity + event ThresholdSet(uint256 threshold); + ``` + +
+ + + +## L-6: PUSH0 is not supported by all chains + +Solc compiler version 0.8.20 switches the default target EVM version to Shanghai, which means that the generated bytecode will include PUSH0 opcodes. Be sure to select the appropriate EVM version in case you intend to deploy on a chain other than mainnet like L2 chains that may not support PUSH0, otherwise deployment of your contracts will fail. + +
9 Found Instances + + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 2](contracts/GitcoinPassportDecoder.sol#L2) + + ```solidity + pragma solidity ^0.8.9; + ``` + +- Found in contracts/GitcoinPassportEligibility.sol [Line: 2](contracts/GitcoinPassportEligibility.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in contracts/HatsEligibilityModule.sol [Line: 2](contracts/HatsEligibilityModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in contracts/HatsModule.sol [Line: 2](contracts/HatsModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in contracts/IHatsModule.sol [Line: 2](contracts/IHatsModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in lib/eas-proxy/contracts/IGitcoinPassportDecoder.sol [Line: 2](lib/eas-proxy/contracts/IGitcoinPassportDecoder.sol#L2) + + ```solidity + pragma solidity ^0.8.9; + ``` + +- Found in lib/hats-module/src/HatsEligibilityModule.sol [Line: 2](lib/hats-module/src/HatsEligibilityModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in lib/hats-module/src/HatsModule.sol [Line: 2](lib/hats-module/src/HatsModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +- Found in lib/hats-module/src/interfaces/IHatsModule.sol [Line: 2](lib/hats-module/src/interfaces/IHatsModule.sol#L2) + + ```solidity + pragma solidity ^0.8.19; + ``` + +
+ + + +## L-7: Empty Block + +Consider removing empty blocks. + +
5 Found Instances + + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 101](contracts/GitcoinPassportDecoder.sol#L101) + + ```solidity + function _authorizeUpgrade(address) internal override onlyOwner { + ``` + +- Found in contracts/HatsEligibilityModule.sol [Line: 19](contracts/HatsEligibilityModule.sol#L19) + + ```solidity + function getWearerStatus(address _wearer, uint256 _hatId) + ``` + +- Found in contracts/HatsModule.sol [Line: 70](contracts/HatsModule.sol#L70) + + ```solidity + function _setUp(bytes calldata _initData) internal virtual { } + ``` + +- Found in lib/hats-module/src/HatsEligibilityModule.sol [Line: 19](lib/hats-module/src/HatsEligibilityModule.sol#L19) + + ```solidity + function getWearerStatus(address _wearer, uint256 _hatId) + ``` + +- Found in lib/hats-module/src/HatsModule.sol [Line: 70](lib/hats-module/src/HatsModule.sol#L70) + + ```solidity + function _setUp(bytes calldata _initData) internal virtual { } + ``` + +
+ + + +## L-8: Unused Custom Error + +it is recommended that the definition be removed when custom error is unused + +
1 Found Instances + + +- Found in contracts/GitcoinPassportDecoder.sol [Line: 75](contracts/GitcoinPassportDecoder.sol#L75) + + ```solidity + error ScoreDoesNotMeetThreshold(uint256 score); + ``` + +
+ + + diff --git a/audit-files/commit-9d650fc/findings.md b/audit-files/commit-9d650fc/findings.md new file mode 100644 index 0000000..bf0dd20 --- /dev/null +++ b/audit-files/commit-9d650fc/findings.md @@ -0,0 +1,49 @@ +### [I-1] HatsModule::IMPLEMENTATION function does not follow the mixedCase naming convention, resulting in potential confusion from code reviewers + +**Description:** All caps naming convention is reserved for constant variables. Although `HatsModule::IMPLEMENTATION` returns an immutable constant value, it is still a function. Thus it should follow the mixedCase naming convention. + +**Impact:** Reduces the understanding and potential interactibility of the protocol, and muddies up automated tool's results.. + +**Proof of Concept:** Patrick Collins, a leader security smart contract auditor and educator follows the mixedCase naming convention. Alongside automated tools like Slither and Aderyn to report instances of functions not being correctly in mixedCase. Newcomers and the majority of developers, auditors, and researchers will follow these conventions. Alongside muddying up the information that is returned from the automated tools. + +**Recommended Mitigation:** Rename `HatsModule::IMPLEMENTATION` to `HatsModule::getImplementation` to satisfy the requirement of functions being in mixedCase. + +### [I-2] HatsModule::HATS function does not follow the mixedCase naming convention, resulting in potential confusion from code reviewers + +**Description:** All caps naming convention is reserved for constant variables. Although `HatsModule::HATS` returns an immutable constant value, it is still a function. Thus it should follow the mixedCase naming convention. + +**Impact:** Reduces the understanding and potential interactibility of the protocol, and muddies up automated tool's results.. + +**Proof of Concept:** Patrick Collins, a leader security smart contract auditor and educator follows the mixedCase naming convention. Alongside automated tools like Slither and Aderyn to report instances of functions not being correctly in mixedCase. Newcomers and the majority of developers, auditors, and researchers will follow these conventions. Alongside muddying up the information that is returned from the automated tools. + +**Recommended Mitigation:** Rename `HatsModule::HATS` to `HatsModule::getHats` to satisfy the requirement of functions being in mixedCase. + +### [I-3] HatsModule::setUp(bytes)._initData variable does not follow the mixedCase naming convention, resulting in potential confusion from code reviewers + +**Description:** Underscores should not be used in to start variable names. + +**Impact:** Reduces the understanding and potential interactibility of the protocol, and muddies up automated tool's results. + +**Proof of Concept:** Patrick Collins, a leader security smart contract auditor and educator follows the mixedCase naming convention. Alongside automated tools like Slither and Aderyn to report instances of functions not being correctly in mixedCase. Newcomers and the majority of developers, auditors, and researchers will follow these conventions. Alongside muddying up the information that is returned from the automated tools. + +**Recommended Mitigation:** Rename `HatsModule::setUp(bytes)._initData` to `HatsModule::setUp(bytes).initData` to satisfy the requirement of functions being in mixedCase. + +### [I-4] IHatsModule::IMPLEMENTATION function does not follow the mixedCase naming convention, resulting in potential confusion from code reviewers + +**Description:** All caps naming convention is reserved for constant variables. Although `IHatsModule::IMPLEMENTATION` returns an immutable constant value, it is still a function. Thus it should follow the mixedCase naming convention. + +**Impact:** Reduces the understanding and potential interactibility of the protocol, and muddies up automated tool's results.. + +**Proof of Concept:** Patrick Collins, a leader security smart contract auditor and educator follows the mixedCase naming convention. Alongside automated tools like Slither and Aderyn to report instances of functions not being correctly in mixedCase. Newcomers and the majority of developers, auditors, and researchers will follow these conventions. Alongside muddying up the information that is returned from the automated tools. + +**Recommended Mitigation:** Rename `IHatsModule::IMPLEMENTATION` to `IHatsModule::getImplementation` to satisfy the requirement of functions being in mixedCase. + +### [I-5] IHatsModule::HATS function does not follow the mixedCase naming convention, resulting in potential confusion from code reviewers + +**Description:** All caps naming convention is reserved for constant variables. Although `IHatsModule::HATS` returns an immutable constant value, it is still a function. Thus it should follow the mixedCase naming convention. + +**Impact:** Reduces the understanding and potential interactibility of the protocol, and muddies up automated tool's results.. + +**Proof of Concept:** Patrick Collins, a leader security smart contract auditor and educator follows the mixedCase naming convention. Alongside automated tools like Slither and Aderyn to report instances of functions not being correctly in mixedCase. Newcomers and the majority of developers, auditors, and researchers will follow these conventions. Alongside muddying up the information that is returned from the automated tools. + +**Recommended Mitigation:** Rename `IHatsModule::HATS` to `IHatsModule::getHats` to satisfy the requirement of functions being in mixedCase. \ No newline at end of file diff --git a/audit-files/commit-9d650fc/logo.pdf b/audit-files/commit-9d650fc/logo.pdf new file mode 100644 index 0000000..212ad1a Binary files /dev/null and b/audit-files/commit-9d650fc/logo.pdf differ diff --git a/audit-files/commit-9d650fc/metrics.html b/audit-files/commit-9d650fc/metrics.html new file mode 100644 index 0000000..b19b12d --- /dev/null +++ b/audit-files/commit-9d650fc/metrics.html @@ -0,0 +1,668 @@ + + + + Solidity Metrics + + + + +
Rendering Report...

Note: This window will update automatically. In case it is not, close the window and try again (vscode bug) :/
+ + diff --git a/audit-files/commit-9d650fc/metrics.md b/audit-files/commit-9d650fc/metrics.md new file mode 100644 index 0000000..4e215f9 --- /dev/null +++ b/audit-files/commit-9d650fc/metrics.md @@ -0,0 +1,297 @@ + +[get in touch with Consensys Diligence](https://consensys.io/diligence)
+ +[[ ๐ŸŒ ](https://consensys.io/diligence) [ ๐Ÿ“ฉ ](mailto:diligence@consensys.net) [ ๐Ÿ”ฅ ](https://consensys.io/diligence/tools/)] +

+ + + +# Solidity Metrics for 'CLI' + +## Table of contents + +- [Scope](#t-scope) + - [Source Units in Scope](#t-source-Units-in-Scope) + - [Deployable Logic Contracts](#t-deployable-contracts) + - [Out of Scope](#t-out-of-scope) + - [Excluded Source Units](#t-out-of-scope-excluded-source-units) + - [Duplicate Source Units](#t-out-of-scope-duplicate-source-units) + - [Doppelganger Contracts](#t-out-of-scope-doppelganger-contracts) +- [Report Overview](#t-report) + - [Risk Summary](#t-risk) + - [Source Lines](#t-source-lines) + - [Inline Documentation](#t-inline-documentation) + - [Components](#t-components) + - [Exposed Functions](#t-exposed-functions) + - [StateVariables](#t-statevariables) + - [Capabilities](#t-capabilities) + - [Dependencies](#t-package-imports) + - [Totals](#t-totals) + +## Scope + +This section lists files that are in scope for the metrics report. + +- **Project:** `'CLI'` +- **Included Files:** + - `` +- **Excluded Paths:** + - `` +- **File Limit:** `undefined` + - **Exclude File list Limit:** `undefined` + +- **Workspace Repository:** `unknown` (`undefined`@`undefined`) + +### Source Units in Scope + +Source Units Analyzed: **`3`**
+Source Units in Scope: **`3`** (**100%**) + +| Type | File | Logic Contracts | Interfaces | Lines | nLines | nSLOC | Comment Lines | Complex. Score | Capabilities | +| ---- | ------ | --------------- | ---------- | ----- | ------ | ----- | ------------- | -------------- | ------------ | +| ๐Ÿ“ | HatsModule.sol | 1 | **** | 83 | 83 | 28 | 42 | 28 | **** | +| ๐Ÿ” | IHatsModule.sol | **** | 1 | 29 | 9 | 5 | 12 | 13 | **** | +| ๐ŸŽจ | HatsEligibilityModule.sol | 1 | **** | 26 | 20 | 6 | 10 | 7 | **** | +| ๐Ÿ“๐Ÿ”๐ŸŽจ | **Totals** | **2** | **1** | **138** | **112** | **39** | **64** | **48** | **** | + + +Legend: [โž•] + + + + +##### Deployable Logic Contracts +Total: 0 + + + + +#### Out of Scope + +##### Excluded Source Units + +Source Units Excluded: **`0`** + +[โž•] + + + +##### Duplicate Source Units + +Duplicate Source Units Excluded: **`0`** + +[โž•] + + +##### Doppelganger Contracts + +Doppelganger Contracts: **`0`** + +[โž•] + + + +## Report + +### Overview + +The analysis finished with **`0`** errors and **`0`** duplicate files. + + + + + +#### Risk + +
+ +
+ +#### Source Lines (sloc vs. nsloc) + +
+ +
+ +#### Inline Documentation + +- **Comment-to-Source Ratio:** On average there are`0.78` code lines per comment (lower=better). +- **ToDo's:** `0` + +#### Components + +| ๐Ÿ“Contracts | ๐Ÿ“šLibraries | ๐Ÿ”Interfaces | ๐ŸŽจAbstract | +| ------------- | ----------- | ------------ | ---------- | +| 1 | 0 | 1 | 1 | + +#### Exposed Functions + +This section lists functions that are explicitly declared public or payable. Please note that getter methods for public stateVars are not included. + +| ๐ŸŒPublic | ๐Ÿ’ฐPayable | +| ---------- | --------- | +| 12 | 0 | + +| External | Internal | Private | Pure | View | +| ---------- | -------- | ------- | ---- | ---- | +| 6 | 5 | 0 | 6 | 4 | + +#### StateVariables + +| Total | ๐ŸŒPublic | +| ---------- | --------- | +| 1 | 1 | + +#### Capabilities + +| Solidity Versions observed | ๐Ÿงช Experimental Features | ๐Ÿ’ฐ Can Receive Funds | ๐Ÿ–ฅ Uses Assembly | ๐Ÿ’ฃ Has Destroyable Contracts | +| -------------------------- | ------------------------ | -------------------- | ---------------- | ---------------------------- | +| `^0.8.19` | | **** | **** | **** | + +| ๐Ÿ“ค Transfers ETH | โšก Low-Level Calls | ๐Ÿ‘ฅ DelegateCall | ๐Ÿงฎ Uses Hash Functions | ๐Ÿ”– ECRecover | ๐ŸŒ€ New/Create/Create2 | +| ---------------- | ----------------- | --------------- | ---------------------- | ------------ | --------------------- | +| **** | **** | **** | **** | **** | **** | + +| โ™ป๏ธ TryCatch | ฮฃ Unchecked | +| ---------- | ----------- | +| **** | **** | + +#### Dependencies / External Imports + +| Dependency / Import Path | Count | +| ------------------------ | ------ | +| @openzeppelin-contracts/contracts/proxy/utils/Initializable.sol | 1 | +| hats-protocol/Interfaces/IHats.sol | 2 | +| hats-protocol/Interfaces/IHatsEligibility.sol | 1 | +| solady/utils/Clone.sol | 1 | + +#### Totals + +##### Summary + +
+ +
+ +##### AST Node Statistics + +###### Function Calls + +
+ +
+ +###### Assembly Calls + +
+ +
+ +###### AST Total + +
+ +
+ +##### Inheritance Graph + +[โž•] + + +##### CallGraph + +[โž•] + + +###### Contract Summary + +[โž•] + +____ + +Thinking about smart contract security? We can provide training, ongoing advice, and smart contract auditing. [Contact us](https://consensys.io/diligence/contact/). + + + diff --git a/audit-files/commit-9d650fc/report.md b/audit-files/commit-9d650fc/report.md new file mode 100644 index 0000000..d380334 --- /dev/null +++ b/audit-files/commit-9d650fc/report.md @@ -0,0 +1,157 @@ +--- +title: Hats Module Report +author: Jacob Homanics +date: May 27, 2024 +header-includes: + - \usepackage{titling} + - \usepackage{graphicx} +--- + +\begin{titlepage} +\centering +\begin{figure}[h] +\centering +\includegraphics[width=0.5\textwidth]{logo.pdf} +\end{figure} +\vspace{2cm} +{\Huge\bfseries Hats Eligibility Module Report\par} +\vspace{1cm} +{\Large Version 1.0\par} +\vspace{2cm} +{\Large\itshape Jacob Homanics\par} +\vfill +{\large \today\par} +\end{titlepage} + +\maketitle + + + +Prepared by: [Jacob Homanics](https://twitter.com/homanics) + +# Table of Contents + +- [Table of Contents](#table-of-contents) +- [Protocol Summary](#protocol-summary) +- [Disclaimer](#disclaimer) +- [Risk Classification](#risk-classification) +- [Audit Details](#audit-details) + - [Scope](#scope) + - [Roles](#roles) +- [Executive Summary](#executive-summary) + - [Issues found](#issues-found) +- [Findings](#findings) +- [Informational](#informational) + +# Protocol Summary + +The Hats Modules are an extension of the core Hats Protocol to allow for eligiblity modules that unlock capabilities for the users. These are pretty abstract and allow for an unlimited number of use cases. + +# Disclaimer + +Jacob Homanics makes all efforts to find as many vulnerabilities in the code in the given time period, but holds no responsibilities for the findings provided in this document. A security audit by Jacob Homanics is not an endorsement of the underlying business or product. The audit was time-boxed and the review of the code was solely on the security aspects of the Solidity implementation of the contracts. + +# Risk Classification + +| | | Impact | | | +| ---------- | ------------- | ------ | ------ | ---- | +| | | High | Medium | Low | +| | High | H | H/M | M | +| Likelihood | Medium | H/M | M | M/L | +| | Low | M | M/L | L | +| | Informational | None | None | None | +| | Gas | None | None | None | + +We use the [CodeHawks](https://docs.codehawks.com/hawks-auditors/how-to-evaluate-a-finding-severity) severity matrix to determine severity. See the documentation for more details. + +# Audit Details + +**The findings in this document correspond with the following commit hash:** +Commit Hash: + +``` +9d650fc +``` + +## Scope + +``` +HatsModule.sol +IHatsModule.sol +HatsEligibilityModule.sol +``` + +## Roles + +N/A + +# Executive Summary + +There were only informational vulnerabilities that focused around making the protocol easier to use/understand. This is to be expected as Hats Modules are meant to be used as a template for others to implement custom functionality for. + +The tools used were VSCode, Slither, and Aderyn. + +## Issues found + +| Severity | Number of issues found | +| ------------- | ---------------------- | +| High | 0 | +| Medium | 0 | +| Low | 0 | +| Informational | 5 | +| Gas | 0 | +| Total | 5 | + +# Findings + +## Informational + +### [I-1] HatsModule::IMPLEMENTATION function does not follow the mixedCase naming convention, resulting in potential confusion from code reviewers + +**Description:** All caps naming convention is reserved for constant variables. Although `HatsModule::IMPLEMENTATION` returns an immutable constant value, it is still a function. Thus it should follow the mixedCase naming convention. + +**Impact:** Reduces the understanding and potential interactibility of the protocol, and muddies up automated tool's results.. + +**Proof of Concept:** Patrick Collins, a leader security smart contract auditor and educator follows the mixedCase naming convention. Alongside automated tools like Slither and Aderyn to report instances of functions not being correctly in mixedCase. Newcomers and the majority of developers, auditors, and researchers will follow these conventions. Alongside muddying up the information that is returned from the automated tools. + +**Recommended Mitigation:** Rename `HatsModule::IMPLEMENTATION` to `HatsModule::getImplementation` to satisfy the requirement of functions being in mixedCase. + +### [I-2] HatsModule::HATS function does not follow the mixedCase naming convention, resulting in potential confusion from code reviewers + +**Description:** All caps naming convention is reserved for constant variables. Although `HatsModule::HATS` returns an immutable constant value, it is still a function. Thus it should follow the mixedCase naming convention. + +**Impact:** Reduces the understanding and potential interactibility of the protocol, and muddies up automated tool's results.. + +**Proof of Concept:** Patrick Collins, a leader security smart contract auditor and educator follows the mixedCase naming convention. Alongside automated tools like Slither and Aderyn to report instances of functions not being correctly in mixedCase. Newcomers and the majority of developers, auditors, and researchers will follow these conventions. Alongside muddying up the information that is returned from the automated tools. + +**Recommended Mitigation:** Rename `HatsModule::HATS` to `HatsModule::getHats` to satisfy the requirement of functions being in mixedCase. + +### [I-3] HatsModule::setUp(bytes)._initData variable does not follow the mixedCase naming convention, resulting in potential confusion from code reviewers + +**Description:** Underscores should not be used in to start variable names. + +**Impact:** Reduces the understanding and potential interactibility of the protocol, and muddies up automated tool's results. + +**Proof of Concept:** Patrick Collins, a leader security smart contract auditor and educator follows the mixedCase naming convention. Alongside automated tools like Slither and Aderyn to report instances of functions not being correctly in mixedCase. Newcomers and the majority of developers, auditors, and researchers will follow these conventions. Alongside muddying up the information that is returned from the automated tools. + +**Recommended Mitigation:** Rename `HatsModule::setUp(bytes)._initData` to `HatsModule::setUp(bytes).initData` to satisfy the requirement of functions being in mixedCase. + +### [I-4] IHatsModule::IMPLEMENTATION function does not follow the mixedCase naming convention, resulting in potential confusion from code reviewers + +**Description:** All caps naming convention is reserved for constant variables. Although `IHatsModule::IMPLEMENTATION` returns an immutable constant value, it is still a function. Thus it should follow the mixedCase naming convention. + +**Impact:** Reduces the understanding and potential interactibility of the protocol, and muddies up automated tool's results.. + +**Proof of Concept:** Patrick Collins, a leader security smart contract auditor and educator follows the mixedCase naming convention. Alongside automated tools like Slither and Aderyn to report instances of functions not being correctly in mixedCase. Newcomers and the majority of developers, auditors, and researchers will follow these conventions. Alongside muddying up the information that is returned from the automated tools. + +**Recommended Mitigation:** Rename `IHatsModule::IMPLEMENTATION` to `IHatsModule::getImplementation` to satisfy the requirement of functions being in mixedCase. + +### [I-5] IHatsModule::HATS function does not follow the mixedCase naming convention, resulting in potential confusion from code reviewers + +**Description:** All caps naming convention is reserved for constant variables. Although `IHatsModule::HATS` returns an immutable constant value, it is still a function. Thus it should follow the mixedCase naming convention. + +**Impact:** Reduces the understanding and potential interactibility of the protocol, and muddies up automated tool's results.. + +**Proof of Concept:** Patrick Collins, a leader security smart contract auditor and educator follows the mixedCase naming convention. Alongside automated tools like Slither and Aderyn to report instances of functions not being correctly in mixedCase. Newcomers and the majority of developers, auditors, and researchers will follow these conventions. Alongside muddying up the information that is returned from the automated tools. + +**Recommended Mitigation:** Rename `IHatsModule::HATS` to `IHatsModule::getHats` to satisfy the requirement of functions being in mixedCase. diff --git a/audit-files/commit-9d650fc/report.pdf b/audit-files/commit-9d650fc/report.pdf new file mode 100644 index 0000000..ad462db Binary files /dev/null and b/audit-files/commit-9d650fc/report.pdf differ diff --git a/audit-files/commit-9d650fc/slither-report-5-27-2024-2:01am.md b/audit-files/commit-9d650fc/slither-report-5-27-2024-2:01am.md new file mode 100644 index 0000000..5288f3c --- /dev/null +++ b/audit-files/commit-9d650fc/slither-report-5-27-2024-2:01am.md @@ -0,0 +1,799 @@ +Summary + - [unprotected-upgrade](#unprotected-upgrade) (1 results) (High) + - [uninitialized-local](#uninitialized-local) (1 results) (Medium) + - [unused-return](#unused-return) (2 results) (Medium) + - [timestamp](#timestamp) (3 results) (Low) + - [assembly](#assembly) (52 results) (Informational) + - [pragma](#pragma) (1 results) (Informational) + - [dead-code](#dead-code) (1 results) (Informational) + - [solc-version](#solc-version) (8 results) (Informational) + - [low-level-calls](#low-level-calls) (8 results) (Informational) + - [naming-convention](#naming-convention) (20 results) (Informational) +## unprotected-upgrade +Impact: High +Confidence: High + - [ ] ID-0 +[GitcoinPassportDecoder](contracts/GitcoinPassportDecoder.sol#L17-L468) is an upgradeable contract that does not protect its initialize functions: [GitcoinPassportDecoder.initialize()](contracts/GitcoinPassportDecoder.sol#L86-L91). Anyone can delete the contract with: [UUPSUpgradeable.upgradeToAndCall(address,bytes)](lib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol#L86-L89) +contracts/GitcoinPassportDecoder.sol#L17-L468 + + +## uninitialized-local +Impact: Medium +Confidence: Medium + - [ ] ID-1 +[GitcoinPassportDecoder.getPassport(address).credential](contracts/GitcoinPassportDecoder.sol#L339) is a local variable never initialized + +contracts/GitcoinPassportDecoder.sol#L339 + + +## unused-return +Impact: Medium +Confidence: Medium + - [ ] ID-2 +[ERC1967Utils.upgradeToAndCall(address,bytes)](lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol#L83-L92) ignores return value by [Address.functionDelegateCall(newImplementation,data)](lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol#L88) + +lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol#L83-L92 + + + - [ ] ID-3 +[ERC1967Utils.upgradeBeaconToAndCall(address,bytes)](lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol#L173-L182) ignores return value by [Address.functionDelegateCall(IBeacon(newBeacon).implementation(),data)](lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol#L178) + +lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol#L173-L182 + + +## timestamp +Impact: Low +Confidence: Medium + - [ ] ID-4 +[GitcoinPassportDecoder.getPassport(address)](contracts/GitcoinPassportDecoder.sol#L253-L367) uses timestamp for comparisons + Dangerous comparisons: + - [attestation.expirationTime > 0 && attestation.expirationTime <= block.timestamp](contracts/GitcoinPassportDecoder.sol#L272-L273) + +contracts/GitcoinPassportDecoder.sol#L253-L367 + + + - [ ] ID-5 +[GitcoinPassportDecoder._isCachedScoreExpired(IGitcoinResolver.CachedScore)](contracts/GitcoinPassportDecoder.sol#L392-L400) uses timestamp for comparisons + Dangerous comparisons: + - [block.timestamp > score.expirationTime](contracts/GitcoinPassportDecoder.sol#L397) + - [(block.timestamp > score.time + maxScoreAge)](contracts/GitcoinPassportDecoder.sol#L399) + +contracts/GitcoinPassportDecoder.sol#L392-L400 + + + - [ ] ID-6 +[GitcoinPassportDecoder._isScoreAttestationExpired(Attestation)](contracts/GitcoinPassportDecoder.sol#L376-L384) uses timestamp for comparisons + Dangerous comparisons: + - [block.timestamp > attestation.expirationTime](contracts/GitcoinPassportDecoder.sol#L380) + - [block.timestamp > attestation.time + maxScoreAge](contracts/GitcoinPassportDecoder.sol#L383) + +contracts/GitcoinPassportDecoder.sol#L376-L384 + + +## assembly +Impact: Informational +Confidence: High + - [ ] ID-7 +[Clone._getArgUint248(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L102-L108) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L105-L107) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L102-L108 + + + - [ ] ID-8 +[Clone._getArgUint176(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L183-L189) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L186-L188) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L183-L189 + + + - [ ] ID-9 +[Clone._getArgUint216(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L138-L144) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L141-L143) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L138-L144 + + + - [ ] ID-10 +[Clone._getArgUint8(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L372-L378) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L375-L377) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L372-L378 + + + - [ ] ID-11 +[Clone._getArgUint112(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L255-L261) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L258-L260) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L255-L261 + + + - [ ] ID-12 +[Clone._getArgUint32(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L345-L351) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L348-L350) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L345-L351 + + + - [ ] ID-13 +[StorageSlot.getBytesSlot(bytes)](lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L129-L134) uses assembly + - [INLINE ASM](lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L131-L133) + +lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L129-L134 + + + - [ ] ID-14 +[Clone._getArgBytes(uint256,uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L25-L40) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L32-L39) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L25-L40 + + + - [ ] ID-15 +[Clone._getArgBytes32(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L84-L90) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L87-L89) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L84-L90 + + + - [ ] ID-16 +[Clone._getArgUint160(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L201-L207) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L204-L206) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L201-L207 + + + - [ ] ID-17 +[Address._revert(bytes,string)](lib/hats-module/lib/openzeppelin-contracts/contracts/utils/Address.sol#L231-L243) uses assembly + - [INLINE ASM](lib/hats-module/lib/openzeppelin-contracts/contracts/utils/Address.sol#L236-L239) + +lib/hats-module/lib/openzeppelin-contracts/contracts/utils/Address.sol#L231-L243 + + + - [ ] ID-18 +[Clone._getArgBytes32Array(uint256,uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L68-L81) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L75-L80) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L68-L81 + + + - [ ] ID-19 +[Clone._getArgUint168(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L192-L198) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L195-L197) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L192-L198 + + + - [ ] ID-20 +[Clone._getArgUint144(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L219-L225) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L222-L224) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L219-L225 + + + - [ ] ID-21 +[Clone._getArgUint88(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L282-L288) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L285-L287) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L282-L288 + + + - [ ] ID-22 +[Clone._getArgUint192(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L165-L171) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L168-L170) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L165-L171 + + + - [ ] ID-23 +[StorageSlot.getStringSlot(bytes32)](lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L99-L104) uses assembly + - [INLINE ASM](lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L101-L103) + +lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L99-L104 + + + - [ ] ID-24 +[OwnableUpgradeable._getOwnableStorage()](lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol#L30-L34) uses assembly + - [INLINE ASM](lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol#L31-L33) + +lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol#L30-L34 + + + - [ ] ID-25 +[StorageSlot.getBooleanSlot(bytes32)](lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L69-L74) uses assembly + - [INLINE ASM](lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L71-L73) + +lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L69-L74 + + + - [ ] ID-26 +[Clone._getArgAddress(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L43-L49) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L46-L48) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L43-L49 + + + - [ ] ID-27 +[Clone._getArgUint64(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L309-L315) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L312-L314) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L309-L315 + + + - [ ] ID-28 +[Clone._getArgUint200(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L156-L162) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L159-L161) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L156-L162 + + + - [ ] ID-29 +[Clone._getArgUint96(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L273-L279) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L276-L278) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L273-L279 + + + - [ ] ID-30 +[Clone._getArgUint128(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L237-L243) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L240-L242) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L237-L243 + + + - [ ] ID-31 +[Clone._getArgUint232(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L120-L126) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L123-L125) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L120-L126 + + + - [ ] ID-32 +[Clone._getArgUint56(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L318-L324) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L321-L323) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L318-L324 + + + - [ ] ID-33 +[StorageSlot.getStringSlot(string)](lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L109-L114) uses assembly + - [INLINE ASM](lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L111-L113) + +lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L109-L114 + + + - [ ] ID-34 +[Clone._getArgUint184(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L174-L180) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L177-L179) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L174-L180 + + + - [ ] ID-35 +[Clone._getArgUint40(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L336-L342) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L339-L341) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L336-L342 + + + - [ ] ID-36 +[PausableUpgradeable._getPausableStorage()](lib/openzeppelin-contracts-upgradeable/contracts/utils/PausableUpgradeable.sol#L27-L31) uses assembly + - [INLINE ASM](lib/openzeppelin-contracts-upgradeable/contracts/utils/PausableUpgradeable.sol#L28-L30) + +lib/openzeppelin-contracts-upgradeable/contracts/utils/PausableUpgradeable.sol#L27-L31 + + + - [ ] ID-37 +[Clone._getArgUint208(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L147-L153) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L150-L152) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L147-L153 + + + - [ ] ID-38 +[Clone._getArgUint48(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L327-L333) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L330-L332) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L327-L333 + + + - [ ] ID-39 +[Initializable._getInitializableStorage()](lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol#L223-L227) uses assembly + - [INLINE ASM](lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol#L224-L226) + +lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol#L223-L227 + + + - [ ] ID-40 +[Clone._getArgUint256Array(uint256,uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L52-L65) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L59-L64) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L52-L65 + + + - [ ] ID-41 +[Clone._getArgUint72(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L300-L306) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L303-L305) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L300-L306 + + + - [ ] ID-42 +[Clone._getArgUint16(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L363-L369) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L366-L368) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L363-L369 + + + - [ ] ID-43 +[Clone._getArgUint152(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L210-L216) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L213-L215) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L210-L216 + + + - [ ] ID-44 +[Address._revert(bytes)](lib/openzeppelin-contracts/contracts/utils/Address.sol#L146-L158) uses assembly + - [INLINE ASM](lib/openzeppelin-contracts/contracts/utils/Address.sol#L151-L154) + +lib/openzeppelin-contracts/contracts/utils/Address.sol#L146-L158 + + + - [ ] ID-45 +[Clone._getArgBytes()](lib/hats-module/lib/solady/src/utils/Clone.sol#L10-L22) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L13-L21) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L10-L22 + + + - [ ] ID-46 +[StorageSlot.getUint256Slot(bytes32)](lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L89-L94) uses assembly + - [INLINE ASM](lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L91-L93) + +lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L89-L94 + + + - [ ] ID-47 +[Clone._getArgUint80(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L291-L297) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L294-L296) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L291-L297 + + + - [ ] ID-48 +[StorageSlot.getBytesSlot(bytes32)](lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L119-L124) uses assembly + - [INLINE ASM](lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L121-L123) + +lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L119-L124 + + + - [ ] ID-49 +[Clone._getArgUint256(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L93-L99) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L96-L98) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L93-L99 + + + - [ ] ID-50 +[Clone._getImmutableArgsOffset()](lib/hats-module/lib/solady/src/utils/Clone.sol#L381-L386) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L383-L385) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L381-L386 + + + - [ ] ID-51 +[Clone._getArgUint136(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L228-L234) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L231-L233) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L228-L234 + + + - [ ] ID-52 +[Clone._getArgUint224(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L129-L135) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L132-L134) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L129-L135 + + + - [ ] ID-53 +[StorageSlot.getAddressSlot(bytes32)](lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L59-L64) uses assembly + - [INLINE ASM](lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L61-L63) + +lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L59-L64 + + + - [ ] ID-54 +[Clone._getArgUint24(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L354-L360) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L357-L359) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L354-L360 + + + - [ ] ID-55 +[StorageSlot.getBytes32Slot(bytes32)](lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L79-L84) uses assembly + - [INLINE ASM](lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L81-L83) + +lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#L79-L84 + + + - [ ] ID-56 +[Clone._getArgUint240(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L111-L117) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L114-L116) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L111-L117 + + + - [ ] ID-57 +[Clone._getArgUint120(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L246-L252) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L249-L251) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L246-L252 + + + - [ ] ID-58 +[Clone._getArgUint104(uint256)](lib/hats-module/lib/solady/src/utils/Clone.sol#L264-L270) uses assembly + - [INLINE ASM](lib/hats-module/lib/solady/src/utils/Clone.sol#L267-L269) + +lib/hats-module/lib/solady/src/utils/Clone.sol#L264-L270 + + +## pragma +Impact: Informational +Confidence: High + - [ ] ID-59 +8 different versions of Solidity are used: + - Version constraint ^0.8.9 is used by: + - contracts/GitcoinPassportDecoder.sol#2 + - lib/eas-proxy/contracts/IGitcoinPassportDecoder.sol#2 + - lib/eas-proxy/contracts/IGitcoinResolver.sol#2 + - Version constraint ^0.8.19 is used by: + - contracts/GitcoinPassportEligibility.sol#2 + - contracts/HatsEligibilityModule.sol#2 + - contracts/HatsModule.sol#2 + - contracts/IHatsModule.sol#2 + - lib/hats-module/src/HatsEligibilityModule.sol#2 + - lib/hats-module/src/HatsModule.sol#2 + - lib/hats-module/src/interfaces/IHatsModule.sol#2 + - Version constraint ^0.8.0 is used by: + - lib/eas-contracts/contracts/Common.sol#3 + - lib/eas-contracts/contracts/IEAS.sol#3 + - lib/eas-contracts/contracts/ISchemaRegistry.sol#3 + - lib/eas-contracts/contracts/ISemver.sol#3 + - lib/eas-contracts/contracts/resolver/ISchemaResolver.sol#3 + - Version constraint >=0.8.13 is used by: + - lib/hats-module/lib/hats-protocol/src/Interfaces/HatsErrors.sol#17 + - lib/hats-module/lib/hats-protocol/src/Interfaces/HatsEvents.sol#17 + - lib/hats-module/lib/hats-protocol/src/Interfaces/IHats.sol#17 + - lib/hats-module/lib/hats-protocol/src/Interfaces/IHatsEligibility.sol#17 + - lib/hats-module/lib/hats-protocol/src/Interfaces/IHatsIdUtilities.sol#17 + - Version constraint ^0.8.2 is used by: + - lib/hats-module/lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol#4 + - Version constraint ^0.8.1 is used by: + - lib/hats-module/lib/openzeppelin-contracts/contracts/utils/Address.sol#4 + - Version constraint ^0.8.4 is used by: + - lib/hats-module/lib/solady/src/utils/Clone.sol#2 + - Version constraint ^0.8.20 is used by: + - lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol#4 + - lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol#4 + - lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol#4 + - lib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol#4 + - lib/openzeppelin-contracts/contracts/utils/Address.sol#4 + - lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#5 + - lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol#4 + - lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol#4 + - lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol#4 + - lib/openzeppelin-contracts-upgradeable/contracts/utils/PausableUpgradeable.sol#4 + +## dead-code +Impact: Informational +Confidence: Medium + - [ ] ID-60 +[uncheckedInc(uint256)](lib/eas-contracts/contracts/Common.sol#L40-L44) is never used and should be removed + +lib/eas-contracts/contracts/Common.sol#L40-L44 + + +## solc-version +Impact: Informational +Confidence: High + - [ ] ID-61 +Version constraint ^0.8.9 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html) + - VerbatimInvalidDeduplication + - FullInlinerNonExpressionSplitArgumentEvaluationOrder + - MissingSideEffectsOnSelectorAccess + - AbiReencodingHeadOverflowWithStaticArrayCleanup + - DirtyBytesArrayToStorage + - DataLocationChangeInInternalOverride + - NestedCalldataArrayAbiReencodingSizeValidation. + It is used by: + - contracts/GitcoinPassportDecoder.sol#2 + - lib/eas-proxy/contracts/IGitcoinPassportDecoder.sol#2 + - lib/eas-proxy/contracts/IGitcoinResolver.sol#2 + + - [ ] ID-62 +Version constraint ^0.8.1 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html) + - FullInlinerNonExpressionSplitArgumentEvaluationOrder + - MissingSideEffectsOnSelectorAccess + - AbiReencodingHeadOverflowWithStaticArrayCleanup + - DirtyBytesArrayToStorage + - DataLocationChangeInInternalOverride + - NestedCalldataArrayAbiReencodingSizeValidation + - SignedImmutables + - ABIDecodeTwoDimensionalArrayMemory + - KeccakCaching. + It is used by: + - lib/hats-module/lib/openzeppelin-contracts/contracts/utils/Address.sol#4 + + - [ ] ID-63 +Version constraint ^0.8.20 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html) + - VerbatimInvalidDeduplication + - FullInlinerNonExpressionSplitArgumentEvaluationOrder + - MissingSideEffectsOnSelectorAccess. + It is used by: + - lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol#4 + - lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol#4 + - lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol#4 + - lib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol#4 + - lib/openzeppelin-contracts/contracts/utils/Address.sol#4 + - lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol#5 + - lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol#4 + - lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol#4 + - lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol#4 + - lib/openzeppelin-contracts-upgradeable/contracts/utils/PausableUpgradeable.sol#4 + + - [ ] ID-64 +Version constraint ^0.8.0 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html) + - FullInlinerNonExpressionSplitArgumentEvaluationOrder + - MissingSideEffectsOnSelectorAccess + - AbiReencodingHeadOverflowWithStaticArrayCleanup + - DirtyBytesArrayToStorage + - DataLocationChangeInInternalOverride + - NestedCalldataArrayAbiReencodingSizeValidation + - SignedImmutables + - ABIDecodeTwoDimensionalArrayMemory + - KeccakCaching. + It is used by: + - lib/eas-contracts/contracts/Common.sol#3 + - lib/eas-contracts/contracts/IEAS.sol#3 + - lib/eas-contracts/contracts/ISchemaRegistry.sol#3 + - lib/eas-contracts/contracts/ISemver.sol#3 + - lib/eas-contracts/contracts/resolver/ISchemaResolver.sol#3 + + - [ ] ID-65 +Version constraint ^0.8.19 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html) + - VerbatimInvalidDeduplication + - FullInlinerNonExpressionSplitArgumentEvaluationOrder + - MissingSideEffectsOnSelectorAccess. + It is used by: + - contracts/GitcoinPassportEligibility.sol#2 + - contracts/HatsEligibilityModule.sol#2 + - contracts/HatsModule.sol#2 + - contracts/IHatsModule.sol#2 + - lib/hats-module/src/HatsEligibilityModule.sol#2 + - lib/hats-module/src/HatsModule.sol#2 + - lib/hats-module/src/interfaces/IHatsModule.sol#2 + + - [ ] ID-66 +Version constraint ^0.8.4 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html) + - FullInlinerNonExpressionSplitArgumentEvaluationOrder + - MissingSideEffectsOnSelectorAccess + - AbiReencodingHeadOverflowWithStaticArrayCleanup + - DirtyBytesArrayToStorage + - DataLocationChangeInInternalOverride + - NestedCalldataArrayAbiReencodingSizeValidation + - SignedImmutables. + It is used by: + - lib/hats-module/lib/solady/src/utils/Clone.sol#2 + + - [ ] ID-67 +Version constraint >=0.8.13 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html) + - VerbatimInvalidDeduplication + - FullInlinerNonExpressionSplitArgumentEvaluationOrder + - MissingSideEffectsOnSelectorAccess + - StorageWriteRemovalBeforeConditionalTermination + - AbiReencodingHeadOverflowWithStaticArrayCleanup + - DirtyBytesArrayToStorage + - InlineAssemblyMemorySideEffects + - DataLocationChangeInInternalOverride + - NestedCalldataArrayAbiReencodingSizeValidation. + It is used by: + - lib/hats-module/lib/hats-protocol/src/Interfaces/HatsErrors.sol#17 + - lib/hats-module/lib/hats-protocol/src/Interfaces/HatsEvents.sol#17 + - lib/hats-module/lib/hats-protocol/src/Interfaces/IHats.sol#17 + - lib/hats-module/lib/hats-protocol/src/Interfaces/IHatsEligibility.sol#17 + - lib/hats-module/lib/hats-protocol/src/Interfaces/IHatsIdUtilities.sol#17 + + - [ ] ID-68 +Version constraint ^0.8.2 contains known severe issues (https://solidity.readthedocs.io/en/latest/bugs.html) + - FullInlinerNonExpressionSplitArgumentEvaluationOrder + - MissingSideEffectsOnSelectorAccess + - AbiReencodingHeadOverflowWithStaticArrayCleanup + - DirtyBytesArrayToStorage + - DataLocationChangeInInternalOverride + - NestedCalldataArrayAbiReencodingSizeValidation + - SignedImmutables + - ABIDecodeTwoDimensionalArrayMemory + - KeccakCaching. + It is used by: + - lib/hats-module/lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol#4 + +## low-level-calls +Impact: Informational +Confidence: High + - [ ] ID-69 +Low level call in [Address.functionStaticCall(address,bytes,string)](lib/hats-module/lib/openzeppelin-contracts/contracts/utils/Address.sol#L155-L162): + - [(success,returndata) = target.staticcall(data)](lib/hats-module/lib/openzeppelin-contracts/contracts/utils/Address.sol#L160) + +lib/hats-module/lib/openzeppelin-contracts/contracts/utils/Address.sol#L155-L162 + + + - [ ] ID-70 +Low level call in [Address.functionDelegateCall(address,bytes,string)](lib/hats-module/lib/openzeppelin-contracts/contracts/utils/Address.sol#L180-L187): + - [(success,returndata) = target.delegatecall(data)](lib/hats-module/lib/openzeppelin-contracts/contracts/utils/Address.sol#L185) + +lib/hats-module/lib/openzeppelin-contracts/contracts/utils/Address.sol#L180-L187 + + + - [ ] ID-71 +Low level call in [Address.sendValue(address,uint256)](lib/hats-module/lib/openzeppelin-contracts/contracts/utils/Address.sol#L64-L69): + - [(success,None) = recipient.call{value: amount}()](lib/hats-module/lib/openzeppelin-contracts/contracts/utils/Address.sol#L67) + +lib/hats-module/lib/openzeppelin-contracts/contracts/utils/Address.sol#L64-L69 + + + - [ ] ID-72 +Low level call in [Address.functionCallWithValue(address,bytes,uint256,string)](lib/hats-module/lib/openzeppelin-contracts/contracts/utils/Address.sol#L128-L137): + - [(success,returndata) = target.call{value: value}(data)](lib/hats-module/lib/openzeppelin-contracts/contracts/utils/Address.sol#L135) + +lib/hats-module/lib/openzeppelin-contracts/contracts/utils/Address.sol#L128-L137 + + + - [ ] ID-73 +Low level call in [Address.functionStaticCall(address,bytes)](lib/openzeppelin-contracts/contracts/utils/Address.sol#L95-L98): + - [(success,returndata) = target.staticcall(data)](lib/openzeppelin-contracts/contracts/utils/Address.sol#L96) + +lib/openzeppelin-contracts/contracts/utils/Address.sol#L95-L98 + + + - [ ] ID-74 +Low level call in [Address.functionDelegateCall(address,bytes)](lib/openzeppelin-contracts/contracts/utils/Address.sol#L104-L107): + - [(success,returndata) = target.delegatecall(data)](lib/openzeppelin-contracts/contracts/utils/Address.sol#L105) + +lib/openzeppelin-contracts/contracts/utils/Address.sol#L104-L107 + + + - [ ] ID-75 +Low level call in [Address.sendValue(address,uint256)](lib/openzeppelin-contracts/contracts/utils/Address.sol#L41-L50): + - [(success,None) = recipient.call{value: amount}()](lib/openzeppelin-contracts/contracts/utils/Address.sol#L46) + +lib/openzeppelin-contracts/contracts/utils/Address.sol#L41-L50 + + + - [ ] ID-76 +Low level call in [Address.functionCallWithValue(address,bytes,uint256)](lib/openzeppelin-contracts/contracts/utils/Address.sol#L83-L89): + - [(success,returndata) = target.call{value: value}(data)](lib/openzeppelin-contracts/contracts/utils/Address.sol#L87) + +lib/openzeppelin-contracts/contracts/utils/Address.sol#L83-L89 + + +## naming-convention +Impact: Informational +Confidence: High + - [ ] ID-77 +Function [HatsModule.HATS()](contracts/HatsModule.sol#L43-L45) is not in mixedCase + +contracts/HatsModule.sol#L43-L45 + + + - [ ] ID-78 +Function [IHatsModule.HATS()](contracts/IHatsModule.sol#L8) is not in mixedCase + +contracts/IHatsModule.sol#L8 + + + - [ ] ID-79 +Constant [OwnableUpgradeable.OwnableStorageLocation](lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol#L28) is not in UPPER_CASE_WITH_UNDERSCORES + +lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol#L28 + + + - [ ] ID-80 +Parameter [GitcoinPassportDecoder.setThreshold(uint256)._threshold](contracts/GitcoinPassportDecoder.sol#L177) is not in mixedCase + +contracts/GitcoinPassportDecoder.sol#L177 + + + - [ ] ID-81 +Function [OwnableUpgradeable.__Ownable_init(address)](lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol#L51-L53) is not in mixedCase + +lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol#L51-L53 + + + - [ ] ID-82 +Parameter [GitcoinPassportDecoder.setScoreSchemaUID(bytes32)._schemaUID](contracts/GitcoinPassportDecoder.sol#L151) is not in mixedCase + +contracts/GitcoinPassportDecoder.sol#L151 + + + - [ ] ID-83 +Function [OwnableUpgradeable.__Ownable_init_unchained(address)](lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol#L55-L60) is not in mixedCase + +lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol#L55-L60 + + + - [ ] ID-84 +Function [HatsModule.IMPLEMENTATION()](contracts/HatsModule.sol#L38-L40) is not in mixedCase + +contracts/HatsModule.sol#L38-L40 + + + - [ ] ID-85 +Function [ContextUpgradeable.__Context_init_unchained()](lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol#L21-L22) is not in mixedCase + +lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol#L21-L22 + + + - [ ] ID-86 +Parameter [GitcoinPassportDecoder.setGitcoinResolver(address)._gitcoinResolver](contracts/GitcoinPassportDecoder.sol#L127) is not in mixedCase + +contracts/GitcoinPassportDecoder.sol#L127 + + + - [ ] ID-87 +Parameter [HatsModule.setUp(bytes)._initData](contracts/HatsModule.sol#L65) is not in mixedCase + +contracts/HatsModule.sol#L65 + + + - [ ] ID-88 +Parameter [GitcoinPassportDecoder.setEASAddress(address)._easContractAddress](contracts/GitcoinPassportDecoder.sol#L115) is not in mixedCase + +contracts/GitcoinPassportDecoder.sol#L115 + + + - [ ] ID-89 +Variable [UUPSUpgradeable.__self](lib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol#L21) is not in mixedCase + +lib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol#L21 + + + - [ ] ID-90 +Function [IHatsModule.IMPLEMENTATION()](contracts/IHatsModule.sol#L11) is not in mixedCase + +contracts/IHatsModule.sol#L11 + + + - [ ] ID-91 +Parameter [GitcoinPassportDecoder.setMaxScoreAge(uint64)._maxScoreAge](contracts/GitcoinPassportDecoder.sol#L163) is not in mixedCase + +contracts/GitcoinPassportDecoder.sol#L163 + + + - [ ] ID-92 +Function [PausableUpgradeable.__Pausable_init()](lib/openzeppelin-contracts-upgradeable/contracts/utils/PausableUpgradeable.sol#L56-L58) is not in mixedCase + +lib/openzeppelin-contracts-upgradeable/contracts/utils/PausableUpgradeable.sol#L56-L58 + + + - [ ] ID-93 +Function [ContextUpgradeable.__Context_init()](lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol#L18-L19) is not in mixedCase + +lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol#L18-L19 + + + - [ ] ID-94 +Constant [PausableUpgradeable.PausableStorageLocation](lib/openzeppelin-contracts-upgradeable/contracts/utils/PausableUpgradeable.sol#L25) is not in UPPER_CASE_WITH_UNDERSCORES + +lib/openzeppelin-contracts-upgradeable/contracts/utils/PausableUpgradeable.sol#L25 + + + - [ ] ID-95 +Parameter [GitcoinPassportDecoder.setPassportSchemaUID(bytes32)._schemaUID](contracts/GitcoinPassportDecoder.sol#L139) is not in mixedCase + +contracts/GitcoinPassportDecoder.sol#L139 + + + - [ ] ID-96 +Function [PausableUpgradeable.__Pausable_init_unchained()](lib/openzeppelin-contracts-upgradeable/contracts/utils/PausableUpgradeable.sol#L60-L63) is not in mixedCase + +lib/openzeppelin-contracts-upgradeable/contracts/utils/PausableUpgradeable.sol#L60-L63 \ No newline at end of file