Peppe Info

The PepeMultiverse ecosystem was created to break down barriers between isolated cryptocurrency communities. By leveraging Wormhole and Portal Bridge technology, users enjoy a seamless and secure experience. This functionality not only expands the reach of Pepe culture but also enhances overall liquidity and utility.

Peppe Logo

TrustNet Score

The TrustNet Score evaluates crypto projects based on audit results, security, KYC verification, and social media presence. This score offers a quick, transparent view of a project's credibility, helping users make informed decisions in the Web3 space.

1.41
Poor Excellent

Real-Time Threat Detection

Real-time threat detection, powered by Cyvers.io, is currently not activated for this project.

This advanced feature provides continuous monitoring and instant alerts to safeguard your assets from potential security threats. Real-time detection enhances your project's security by proactively identifying and mitigating risks. For more information, click here.

Security Assessments

Select the audit
"Static Analysis Dynamic Analysis Symbolic Execution SWC Check Manual Review"
Contract address
0x8A0c...0dEf
Network
Ethereum - Mainnet
License N/A
Compiler N/A
Type N/A
Language Solidity
Onboard date 2025/04/18
Revision date 2025/04/18

Summary and Final Words

No crucial issues found

The contract does not contain issues of high or medium criticality. This means that no known vulnerabilities were found in the source code.

Contract owner cannot mint

It is not possible to mint new tokens.

Contract owner cannot blacklist addresses.

It is not possible to lock user funds by blacklisting addresses.

Contract owner cannot set high fees

The fees, if applicable, can be a maximum of 25% or lower. The contract can therefore not be locked. Please take a look in the comment section for more details.

Token transfer can be locked

Owner can lock user funds with owner functions.

Token cannot be burned

There is no burning within the contract without any allowances

Ownership is not renounced

The owner retains significant control, which could potentially be used to modify key contract parameters.

Contract is not upgradeable

The contract does not use proxy patterns or other mechanisms to allow future upgrades. Its behavior is locked in its current state.

Scope of Work

This audit encompasses the evaluation of the files listed below, each verified with a SHA-1 Hash. The team referenced above has provided the necessary files for assessment.

The auditing process consists of the following systematic steps:

  1. Specification Review: Analyze the provided specifications, source code, and instructions to fully understand the smart contract's size, scope, and functionality.
  2. Manual Code Examination: Conduct a thorough line-by-line review of the source code to identify potential vulnerabilities and areas for improvement.
  3. Specification Alignment: Ensure that the code accurately implements the provided specifications and intended functionalities.
  4. Test Coverage Assessment: Evaluate the extent and effectiveness of test cases in covering the codebase, identifying any gaps in testing.
  5. Symbolic Execution: Analyze the smart contract to determine how various inputs affect execution paths, identifying potential edge cases and vulnerabilities.
  6. Best Practices Evaluation: Assess the smart contracts against established industry and academic best practices to enhance efficiency, maintainability, and security.
  7. Actionable Recommendations: Provide detailed, specific, and actionable steps to secure and optimize the smart contracts.

A file with a different Hash has been intentionally or otherwise modified after the security review. A different Hash may indicate a changed condition or potential vulnerability that was not within the scope of this review.

Final Words

The following provides a concise summary of the audit report, accompanied by insightful comments from the auditor. This overview captures the key findings and observations, offering valuable context and clarity.


Ownership Privileges
  • The owner can update the staking contract address to any arbitrary address, including zero address.
  • The owner can enable or disable token claiming at any time without restrictions or notice.
  • The owner can handle token purchases without validation, potentially attributing tokens to addresses that haven't paid.
  • The owner can withdraw any tokens from the contract after the sale ends, including tokens needed for user claims.
  • The owner can modify the sale start and end dates arbitrarily, even after the sale has begun.
  • The owner can change the ERC20 token address even after sales have occurred, potentially rendering users' purchases worthless.

Note - This Audit report consists of a security analysis of the Peppe presale smart contract. This analysis did not include functional testing (or unit testing) of the contract’s logic. Moreover, we only audited the mentioned contract for the Peppe team. Other contracts associated with the project were not audited by our team. We recommend investors do their own research before investing.

Files and details

Functions
public

/

State variables
public

/

Total lines
of code

/

Capabilities
Hover on items

/

Functions
public

/

State variables
public

/

Total lines
of code

/

Capabilities
Hover on items

/

Functions
public

/

State variables
public

/

Total lines
of code

/

Capabilities
Hover on items

/

Functions
public

/

State variables
public

/

Total lines
of code

/

Capabilities
Hover on items

/

Findings and Audit result

high Issues | 1 findings

Acknowledged

#1 high Issue
Unrestricted Claim Control by Owner
Presale.sol
L42-45
Description

The setClaimable function in presale introduces a centralization risk as it grants the owner unlimited authority to enable or disable token claiming without restrictions or constraints. This unilateral control allows the owner to arbitrarily revoke users' ability to claim their purchased tokens, potentially leading to permanent fund loss. If the owner acts maliciously or their account is compromised, they could permanently disable claiming, create selective claiming windows, or manipulate the market through strategic enabling/disabling of claims. To mitigate this risk, implement automatic claim enabling after the sale ends, add time-locks to claiming status changes, establish irrevocable claiming conditions triggered by sale milestones, require multi-signature governance for claim status modifications, or enforce a deadline after which claiming must remain permanently enabled. These safeguards distribute control and ensure users have guaranteed access to their purchased tokens.

medium Issues | 6 findings

Acknowledged

#1 medium Issue
Missing 'isContract' check.
Presale.sol
L37-39
L98-100
Description

The contract lacks a validation check to ensure that specific parameters are contract addresses. Without this check, there is a risk that non-contract addresses (such as externally owned accounts, or EOAs) could be mistakenly set for parameters intended to reference other contracts. This could lead to failures in executing critical interactions within the contract, as EOAs do not support contract-specific functions. To mitigate this, Implement a validation check to ensure that parameters designated as contract addresses are verified as such. This can be done using Solidity’s Address library function isContract, which checks if an address has associated contract code.

Acknowledged

#2 medium Issue
Insufficient Staking Manager Validation
Presale.sol
L47-67
Description

The handleTokenPurchase function contains a vulnerability where it attempts to interact with the staking manager contract without verifying its initialization status. When processing staked purchases (stake = true), the function blindly calls stakingManager.depositByPresale(buyer, amount) without checking if the stakingManager address has been set. Since the staking manager is initialized separately via the setStakingManager function and not in the constructor, transactions will revert if the owner forgets to set this address before processing staked purchases. This creates a potential denial of service condition and wastes gas on failed transactions. To mitigate this, Implement explicit validation by adding a check: require(address(stakingManager) != address(0), "Staking manager not set") at the beginning of the if(stake) block. For enhanced security, also verify the address points to actual contract code with require(address(stakingManager).code.length > 0, "Invalid staking manager").

Acknowledged

#3 medium Issue
No Logical Validation of Sale Dates
Presale.sol
L89-96
Description

The setSaleDate function contains a logical flaw by failing to validate that the start date precedes the end date, allowing the owner to create an invalid timeline where endSaleDate < startSaleDate. This inverted relationship breaks core contract functionality by creating a logical impossibility: the sale would never activate since the end condition would be reached before the start condition. This could permanently lock funds in the contract, as token withdrawals require block.timestamp > endSaleDate. Additionally, users would receive contradictory information about sale timing. This vulnerability could be exploited maliciously to prevent token withdrawals indefinitely while maintaining technical contract compliance. To mitigate this issue, implement validation logic that ensures proper chronological order with a simple check: require(startSaleDate < _endSaleDate, "End date must be after start date"). For additional security, add validation against setting dates too far in the past or future to prevent unreasonable sale periods.

Acknowledged

#4 medium Issue
Owner Can Change Sale Dates Mid-Sale
Presale.sol
L89-96
Description

The setSaleDate function allows the contract owner to modify both the start and end dates of the presale at any time, including during an active sale. This unrestricted ability creates significant centralization risk and undermines the trustless nature of the contract. The owner could unexpectedly extend the sale to prevent users from withdrawing tokens, suddenly end a sale that was promised to run longer, or continually adjust dates to manipulate market dynamics. Users who participated based on the originally advertised timeline could find themselves locked in a sale with drastically altered terms, with no recourse or protection against these arbitrary changes. Implement restrictions that prevent date modifications once the sale has started or add time locks for changes.

Acknowledged

#5 medium Issue
Owner Can Change Token Address Mid-Sale
Presale.sol
L98-100
Description

The setToken function contains a vulnerability allowing the owner to change the presale token address at any time, even after users have purchased tokens. This unrestricted ability enables a potential "bait-and-switch" attack where the owner could advertise a valuable token, collect funds, then replace it with a worthless token before users can claim. The function lacks any protective measures: no restrictions based on sale progress, no validation of the new token, no event emission for transparency, and no time locks or multi-signature requirements for such a high-risk operation. This represents an extreme centralization risk that undermines the entire presale's trustworthiness. To mitigate this vulnerability, implement strict safeguards: prevent token changes after sales have begun (require(totalTokensSold == 0)), add zero-address validation, emit events for transparency, and consider implementing a one-time setup mechanism that permanently locks the token address after initial configuration or requires multi-signature approval for changes.

Acknowledged

#6 medium Issue
Missing Buy Functionality in Presale Contract.
Presale.sol
L11-118
Description

The Presale contract lacks a critical direct buy functionality, forcing token purchases through the owner-controlled handleTokenPurchase function. This design severely violates blockchain's trustless principles by requiring users to complete payments off-chain and trust the owner to manually allocate tokens correctly. This extreme centralization creates significant risks: no on-chain payment verification, no transparent price mechanism, potential for selective allocation, and increased disputes from manual processing. Without direct purchase capability, users must rely entirely on the owner's honesty when attributing token purchases, contradicting the fundamental purpose of smart contracts and creating opportunities for manipulation or favoritism. To mitigate this issue, implement a standard public buy function that accepts ETH or stablecoin payments directly from users, automatically calculates token amounts based on predefined rates, records purchases transparently on-chain, and handles the token allocation without owner intervention. Additional improvements should include rate configuration, purchase limits, and optional whitelist functionality.

low Issues | 3 findings

Acknowledged

#1 low Issue
Missing events arithmetic
Presale.sol
L37-39
L69-75
L98-100
Description

It is recommended to emit all the critical parameter changes.

Acknowledged

#2 low Issue
Missing Buyer Address Validation
Presale.sol
L47-67
Description

The function accepts any address as the buyer parameter without verifying it's not the zero address. Setting the buyer to address(0) could lead to tokens being permanently locked or cause accounting issues. It is recommended to check that the address cannot be set to zero address.

Acknowledged

#3 low Issue
No Token Balance Verification
Presale.sol
L47-67
Description

The function increases totalTokensSold without verifying the contract has sufficient tokens. This could lead to a situation where totalTokensSold > token.balanceOf(address(this)), making some purchases unredeemable.

informational Issues | 1 findings

Acknowledged

#1 informational Issue
Function that are not used (Dead code).
Context.sol
L21-23
L25-27
Description

Remove unused code.