PandaPump Info
PandaPump is a meme coin project built with purpose that blends fun with functionality across a dynamic crypto ecosystem. Built on the Base network, our mission is to foster a vibrant, engaged community centered around $PPUMP. Our ecosystem includes: • A meme token ($PPUMP) at the heart of our brand • A participation platform designed to provide long term engagement • A dual utility based NFT collection To ensure the safety and transparency of our ecosystem, we’ve partnered with SolidProof to audit our smart contracts. This audit reflects our commitment to responsible development and community trust. PandaPump is where creativity meets transparency and trust — and we’re just getting started.
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.
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
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.
Contract cannot be locked
Owner cannot lock any user funds.
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:
- Specification Review: Analyze the provided specifications, source code, and instructions to fully understand the smart contract's size, scope, and functionality.
- Manual Code Examination: Conduct a thorough line-by-line review of the source code to identify potential vulnerabilities and areas for improvement.
- Specification Alignment: Ensure that the code accurately implements the provided specifications and intended functionalities.
- Test Coverage Assessment: Evaluate the extent and effectiveness of test cases in covering the codebase, identifying any gaps in testing.
- Symbolic Execution: Analyze the smart contract to determine how various inputs affect execution paths, identifying potential edge cases and vulnerabilities.
- Best Practices Evaluation: Assess the smart contracts against established industry and academic best practices to enhance efficiency, maintainability, and security.
- 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 add the new staking pool to the contract.
- The owner can update the allocation point in the pool.
- The owner can deposit the rewards in the contract.
- The owner can mass update pools.
- The owner can update the burn on claim percentage value to not more than 20%.
- The owner can withdraw the reward tokens from the contract.
- The owner can update the boost NFT address.
- The owner can recover the reward tokens.
Note - This Audit report consists of a security analysis of the PandaPump staking smart contract. This analysis did not include functional testing (or unit testing) of the contract’s logic. Moreover, we only audited one token contract for the PandaPump 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
Findings and Audit result
medium Issues | 7 findings
Resolved
#1 medium Issue
Missing 'isContract' check.
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.
Resolved
#2 medium Issue
Missing allowance check.
The depositNFT function does not check if the user has approved the contract to transfer their NFT before calling transferFrom. If the user hasn’t approved the contract, the transaction fails, wasting gas. This leads to poor user experience and unnecessary failed transactions. The issue can be mitigated by adding a check that the allowance is already present before the transfer in the contract.
Resolved
#3 medium Issue
Missing Non-reentrant check.
The functions withdrawNFT(), deposit(), and requestWithdraw() are vulnerable to reentrancy attacks because they call _claimRewards(), which executes an external ERC-20 token transfer before updating critical state variables. This allows a malicious contract to reenter the function before state updates, potentially claiming multiple rewards or withdrawing more tokens/NFTs than allowed. The vulnerability arises because _claimRewards() uses safeRewardTransfer(), which calls transfer() on an ERC-20 token, enabling an attacker to reenter the contract and manipulate balances before updates are finalized. To mitigate this, Use nonReentrant modifier in withdrawNFT(), deposit(), and requestWithdraw(). Move state updates before _claimRewards() to ensure balances are updated before external calls. Ensure all reward distributions occur after internal state modifications to prevent reentrancy exploits.
Resolved
#4 medium Issue
Missing access control.
The massUpdatePools() function lacks access control, allowing anyone to call it, leading to unnecessary gas costs, spam attacks, and blockchain congestion. A malicious user could repeatedly trigger it, consuming excessive gas and disrupting contract operations. To mitigate this, restrict access to the contract owner (onlyOwner), implement a cooldown timer to prevent frequent calls, and use batch processing to update pools in smaller chunks, avoiding block gas limit issues.
Resolved
#5 medium Issue
The owner can drain reward tokens.
The recoverRewardTokens() function poses a centralization risk as the owner can withdraw all reward tokens, potentially draining the contract and leaving stakers with no rewards. This could render staking useless and harm user trust. To mitigate this, restrict withdrawals to only excess tokens by ensuring enough tokens remain for pending rewards. Additionally, implementing a governance vote, multisig approval, or time-locking withdrawals until rewards are fully distributed can enhance security.
Resolved
#6 medium Issue
The owner can lock rewards.
The setRewardPerBlock() function allows the owner to set rewards per block to any value, excluding zero, effectively locking all rewards and preventing stakers from earning. This creates a centralization risk, where the owner can stop reward distribution arbitrarily, making staking ineffective. To mitigate this, implement a minimum reward threshold to prevent setting it to zero or an unreasonably low value. Additionally, requiring a governance vote or timelock mechanism before adjusting rewards can prevent sudden unfair changes. These safeguards ensure consistent rewards for stakers and prevent malicious or accidental reward halts.
Resolved
#7 medium Issue
The owner can update reward token.
The setRewardToken() function allows the owner to arbitrarily change the reward token, posing a centralization risk. The owner could replace it with a worthless or illiquid token, preventing users from claiming meaningful rewards. Additionally, switching to a scam or fake token could devalue rewards, harming stakers. To mitigate this, implement a timelock delay, require governance or multisig approval, and restrict changes to whitelisted tokens. These measures prevent sudden or malicious token swaps, ensuring stakers receive fair and valuable rewards, maintaining trust and stability in the staking system.
low Issues | 4 findings
Acknowledged
#1 low Issue
Old compiler version
Adding the latest constant version of solidity is recommended, as this prevents the unintentional deployment of a contract with an outdated compiler that contains unresolved bugs.
Acknowledged
#2 low Issue
Missing failed check
The add function fails silently when attempting to add more than two pools, causing confusion without an error message. This arbitrary limitation restricts future scalability. The issue is low severity as it doesn’t impact security or funds but can be medium severity if expansion is required. To mitigate this, replace the silent failure with a require statement. This ensures clear feedback to the owner, preventing unexpected behavior.
Acknowledged
#3 low Issue
Missing Pool ID Validation.
The function assumes that _pid (pool ID) is always valid, but no validation is done to check if _pid exists. If _pid is invalid (i.e., greater than poolInfo.length - 1), it will cause an out-of-bounds error, leading to contract failure. If _pid is invalid, trying to access poolInfo[_pid] throws an error. It is recommended to add the validation check in the contract.
Resolved
#4 low Issue
Missing events arithmetic
Emit all the critical parameter changes.