PANDA COIN Info

The Crypto Intelligence Platform TRACK WHALES. TRUST THE AI. JOIN THE PANDA ARMY.

PANDA COIN 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.

78.91
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

"Static Analysis Dynamic Analysis Symbolic Execution SWC Check Manual Review"
Contract address
0x95f9...0d09
Network
Ethereum - Mainnet
License N/A
Compiler N/A
Type N/A
Language Solidity
Onboard date 2026/09/03
Revision date 2026/09/03

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:

  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.


Smart Contract Analysis Statement

Contract Analysis

The Panda Ai contract implements an ERC20 token with a fixed supply of 111,111,111 tokens, permissionless burning, signature-based approvals, and a one-way trading switch that kept transfers closed until the owner opened the market. The entire custom logic amounts to roughly seventy lines built on top of a current, unmodified release of a widely used contract library. There is no minting function after deployment, no fee logic, no blacklist, no pause, no rebase, no reflection and no price oracle. We recompiled the published source and compared it byte for byte against the code actually running on-chain: it matches, with the only differences being the compiler-generated signature values written in at deployment. Reviewing the deployed code at the instruction level, the contract makes no external calls of any kind, which removes the entire reentrancy class by construction rather than defending against it. The single restriction it does implement, the trading switch, has already been turned on, and because it is guarded so it can only ever be flipped once and no other code path touches it, the market cannot be closed again by anyone.

Our review found no critical and no high severity issues, and nothing of any severity that can be exploited against the contract as it stands today. Because the code is immutable and both of its one-time administrative switches have already been used, we rated every finding twice: once against the live contract, and once against the same source treated as a template that could be deployed again. Against the live contract, the only defect of any substance that remains reachable is that tokens accidentally sent to the contract's own address cannot be recovered, which is a hazard common to most tokens. Against the source as a template, two medium severity issues stand out, both stemming from the same design decision - transferability depended on a single administrative action with no fallback, and in the worst case that could have left every holder permanently frozen.

The on-chain record shows how narrow the real exposure was. The market was closed for fifty-three minutes and thirty-six seconds after deployment, and all four transactions in that window came from the owner, who was exempt from the restriction in any case. No third party ever held or moved a token while the market was closed, so none of the conditions we describe was ever experienced by a holder. We verified our conclusions four independent ways: line-by-line manual review, static analysis, symbolic proofs covering all possible inputs, and roughly 780,000 randomised call sequences. No test, no proof and no fuzzing run found a way to bypass the trading restriction, inflate the supply, or move tokens without authorisation.

Ownership Privileges

The ownership of the contract has been retained by the deployer, which is an ordinary wallet rather than a multi-signature setup, and there is no timelock on any privileged action. The important nuance is that both privileged functions are single-use and both have already been used, so the role today carries almost no power. The owner retains full privileges including:

  • Transferring ownership to another address in a single step, with no acceptance required from the recipient
  • Renouncing ownership permanently, which is now safe to do because the trading switch is already latched open
  • Holding and moving the roughly twenty-eight percent of total supply that sits in the deployer wallet as an ordinary, unlocked balance
  • Historically, deciding when the market opened and which single address received a permanent exemption from the trading restriction - both of these decisions have now been made and neither can be revisited
  • The owner cannot mint new tokens. No mint function exists in the contract or in its deployed code, and total supply is fixed permanently at 111,111,111
  • The owner cannot freeze, blacklist, seize or claw back any holder's tokens, and cannot move them without a standard allowance
  • The owner cannot impose a fee, a tax, a maximum transaction size or a maximum wallet size, because no such mechanism exists anywhere in the contract
  • The owner cannot pause the contract, upgrade it, or replace its code - it is not a proxy, and the code at this address is permanent

Security Features

The contract implements several positive security features:

  • No external calls anywhere in the executable code, so classic, cross-function, cross-contract and read-only reentrancy are all impossible by construction rather than merely guarded against
  • Fixed supply with no mint path, confirmed three separate ways - the absence of any mint entry point, a symbolic proof that supply can never grow, and reconstruction of every balance from the complete on-chain transfer history summing to exactly the stated total
  • The trading switch is one-way, so once the market opened it can never be closed again, which removes the most damaging variant of this pattern
  • The exempt sale address can only be written once, so it cannot be redirected to a different address later
  • No loops and no unchecked arithmetic in the custom code, so there is no unbounded iteration, no gas-griefing surface and no overflow risk
  • Ether cannot be accidentally stranded, because the contract deliberately has no way to receive it
  • Full conformance with both the token standard and the signature-approval standard in the contract's present state, including correct handling of nonces, expiry deadlines and chain binding, so approvals cannot be replayed across chains or reused. One deviation applied only while the market was closed, when transfers of a zero amount were rejected rather than allowed through as the standard requires. That behaviour ended when trading opened, and the contract now handles zero-value transfers correctly on both transfer paths

Points for Holders to Consider

The residual risks we would highlight are not code defects. Supply is concentrated - the ten largest addresses hold roughly eighty-one percent of the total, and the deployer alone holds close to twenty-eight percent, none of it in a vesting or lock contract. At the time of review there was no automated market maker pool for this token against wrapped Ether at any standard fee tier, so despite trading being enabled at the contract level there was no on-chain venue to trade on. We would encourage the team to move the concentrated allocations into a vesting arrangement and publish the schedule, and to move ownership to a multi-signature wallet or renounce it outright, which is now safe to do. These steps would do more for holder confidence than any code change we have recommended.

Note - This Audit report consists of a security analysis of the Panda Ai smart contract. This analysis did not include economic analysis of the contract's tokenomics. Moreover, we only audited the main contract for the Panda Ai team. Other contracts associated with the project were not audited by our team, including the separate presale contract that holds the transfer exemption. We recommend investors do their own research before investing.

Files and details

Findings and Audit result

low Issues | 1 findings

Pending

#1 low Issue
Tokens sent to the contract address are lost forever
Main2_V2.sol
L1-70
Description

There is no rescue, sweep or withdrawal function anywhere in the contract. Any tokens sent to its own address, including the token itself, are locked permanently with no way for anyone to retrieve them. This is a common accidental loss channel because users regularly paste a token's contract address into a transfer field by mistake. The balance currently held by the contract is zero.

optimization Issues | 4 findings

Pending

#1 optimization Issue
Trading check does not short-circuit on the common path
Main2_V2.sol
L55-63
Description

The trading rule helper works out both of its conditions in full before it decides anything, which means every single transfer reads the owner twice and the sale contract once from storage, and only then reads the trading flag. Now that trading is permanently open, all of that work is wasted on every transfer forever - the only value that can change the outcome is the trading flag, and it always says yes. Reading that flag first and returning immediately reduces the steady-state cost to a single storage read.

Pending

#2 optimization Issue
Revert messages used instead of custom errors
Main2_V2.sol
L37
L60
L66
L67
Description

All four requirement checks in the contract use string messages. Each string has to be stored in the deployed bytecode and encoded at revert time. Measured against a reworked version that applies this change alongside the other recommendations, the deployed size dropped by 96 bytes.

Pending

#3 optimization Issue
Owner is read from storage twice in the same check
Main2_V2.sol
L56
Description

The owner comparison calls the owner getter twice in a single expression, which issues two separate storage reads against the same slot. Even when the slot is already warm this wastes gas on every transfer that reaches the comparison.

Pending

#4 optimization Issue
Redundant storage write during deployment
Main2_V2.sol
L32
Description

The constructor writes false into the trading flag, but that slot already holds false by default. The write costs deployment gas and achieves nothing, and it touches a slot the ownership setup has just written to.

informational Issues | 21 findings

Pending

#1 informational Issue
Renouncing ownership before trading is enabled freezes every balance permanently
Main2_V2.sol
L36-40
L55-63
Description

Transfers are only allowed when trading is enabled, when the owner is the sender or the recipient, or when the sender is the sale contract. Renouncing ownership sets the owner to the zero address, and the zero address is rejected by the underlying ERC20 logic as both sender and receiver. Renouncing therefore does not just remove the administrator, it also quietly kills two of the four exempt paths. If the owner had renounced while trading was still disabled, enableTrading would have become permanently unreachable and every holder except the sale contract would have been frozen forever with no way to recover and no administrator left to intervene. The only remaining action would have been to burn. This scenario is no longer reachable on the deployed contract because trading was enabled first, but the defect sits in immutable code and would be inherited by any redeployment or fork. On the deployed contract the trading latch has already been opened, and because the only function that writes it refuses to run a second time, it can never be closed again by anyone. The freeze described here is therefore unreachable and the issue is recorded as informational. It would rate as medium for anyone redeploying this source, since a fresh deployment starts with trading disabled and the window reopens.

Pending

#2 informational Issue
Transferability depends on an open-ended discretionary owner switch
Main2_V2.sol
L19
L36-40
L55-63
Description

Until the owner calls enableTrading, nobody other than the owner and the sale contract can move tokens. There is no deadline, no automatic release and no external trigger, so the decision to make the token tradable rested entirely and indefinitely with one private key. This is the structural pattern behind a presale honeypot - buyers can acquire tokens through the sale contract but cannot resell them until the owner permits it. Two design choices limit the damage and deserve credit. The switch is one-way, guarded so it can only ever be flipped once, meaning the market can never be closed again after opening. And the exemption only grants permission to transfer, never authority to spend somebody else's balance. On the live contract the switch has been flipped and the capability is permanently spent. On the deployed contract the switch has already been used in the permissive direction and cannot be reversed, so transferability no longer rests on anyone's discretion. Recorded as informational on that basis. It would rate as medium for anyone redeploying this source.

Pending

#3 informational Issue
Sale contract address is written without emitting an event
Main2_V2.sol
L65-69
Description

setSaleContract writes a permanent and security-relevant storage slot, namely the one address that receives a lifetime exemption from the trading restriction, and emits nothing at all. Off-chain monitoring, indexers and explorers have no event to subscribe to, so detecting the change requires either polling the getter or decoding raw transaction input. There is no direct risk to funds, but it weakens the audit trail for a privileged action that can never be undone. The write has already happened and can never happen again, so the missing event is a historical gap in observability rather than a live one, and it is recorded as informational. It would rate as low for anyone redeploying this source.

Pending

#4 informational Issue
Ownership transfer completes in a single step
Main2_V2.sol
L15
Description

The contract inherits the single-step Ownable rather than Ownable2Step, so transferOwnership hands over control immediately with no acceptance step from the recipient. A mistyped address, or an address whose key the recipient does not actually control, results in permanent loss of administrative control with no way back. The practical impact here is small because both privileged functions have already been used up and cannot be called again, so losing ownership today would cost nothing of substance. It remains a deviation from current best practice. On the deployed contract the owner role no longer carries any power over token mechanics, because both privileged functions are spent, so even a botched handover would cost nothing. Recorded as informational. It would rate as low for anyone redeploying this source, where the same role still decides whether the token can trade at all.

Pending

#5 informational Issue
Sale contract slot accepts a plain wallet and can never be corrected
Main2_V2.sol
L65-69
Description

setSaleContract only checks that the argument is not the zero address and that the slot has not already been written. It does not check that the target actually has code, so a plain wallet can be given a permanent exemption from the trading restriction, which is not what the variable name suggests. The write-once guard is a deliberate and genuinely useful design choice because it stops an owner redirecting the exemption later, but the trade-off is that a wrong value can never be fixed. On the live contract the value is correct and points at the verified presale contract, and trading is open anyway, so there is no practical exposure today. The slot has already been written, and checking the stored address on-chain confirms it holds a genuine contract rather than a plain wallet, so the risk did not materialise. The exemption is in any case meaningless now that trading is open to everyone. Recorded as informational. It would rate as low for anyone redeploying this source.

Pending

#6 informational Issue
Administrative control sits with a single ordinary wallet
Main2_V2.sol
L15
L30
Description

Ownership was assigned to the deployer at construction, and checking that address on-chain confirms it has no contract code, so it is an ordinary wallet rather than a multi-signature setup. There is no timelock on any privileged function either. What keeps the impact low is that both privileged functions are single-use and both have already been used - enabling trading now reverts, and setting the sale contract now reverts. The only remaining owner capabilities are transferring or renouncing ownership, neither of which affects any balance. Both privileged functions are spent, so the role is effectively empty on the deployed contract and a compromise of the key would not let anyone freeze, mint, seize, blacklist or tax a single token. Recorded as informational on that basis. It would rate as low for anyone redeploying this source, where the same key would control launch.

Pending

#7 informational Issue
Sale contract exemption only works in one direction
Main2_V2.sol
L57
Description

The exemption is written so that only the sale contract as sender is allowed through. Tokens can leave the sale contract while trading is disabled, but they can never be sent into it. Any workflow that needs a buyer to hand tokens back - a refund, a buyback, a cancelled allocation, a swap into a different tranche - is impossible before trading opens unless the recipient happens to be the owner. This is a functional limitation rather than a security hole, and it is not currently relevant because trading is open. Now that trading is open to everyone, the direction of the exemption no longer makes any difference, so this is recorded as informational. It would rate as low for anyone redeploying this source, where the restriction is live right up until launch.

Pending

#8 informational Issue
Trading restriction is applied to the public functions instead of the internal choke point
Main2_V2.sol
L44-53
Description

The restriction is enforced by overriding the public transfer and transferFrom functions, rather than by using the single internal hook that the underlying library routes every balance change through. For the contract exactly as deployed the coverage happens to be complete, and extensive fuzzing and symbolic analysis confirm there is no way around it today. The concern is that this completeness is incidental rather than structural. We demonstrated this by adding a perfectly ordinary batch-transfer helper to a subclass: the documented transfer path stayed correctly blocked while the new helper moved the same tokens freely, with no compiler warning and no failing test. The same helper added on top of the internal-hook design remained fully protected. The deployed contract is immutable and cannot be extended, so no new function can ever be added that would slip past the check, and the gap stays theoretical. Recorded as informational. It would rate as low for anyone redeploying this source, where the next feature someone adds is exactly what would bypass it.

Pending

#9 informational Issue
Owner exemption is wider than the distribution use case requires
Main2_V2.sol
L56
Description

The owner exemption applies when either side of a transfer is the owner. The outbound leg is what pre-launch distribution needs. The inbound leg grants something different - while the market is frozen, any holder, and any third party holding an allowance, can push tokens to the owner. This does not let anyone bypass the lock for their own benefit since the tokens end up with the owner, but it does mean the freeze is not uniform, and it creates a path where a holder could be talked into a transfer that looks like the only permitted action available. Not currently relevant because trading is open. With trading open the exemption no longer grants anything that is not already available to everyone, so this is recorded as informational. It would rate as low for anyone redeploying this source.

Pending

#10 informational Issue
MAX_SUPPLY is not an enforced ceiling
Main2_V2.sol
L16
Description

The constant is read exactly once, in the constructor, to size the initial mint, and is never compared against the actual supply afterwards. Because there is no mint function the supply can never exceed it, so the missing check is not a vulnerability. The name nonetheless promises a ceiling the code does not enforce, and burning drives the real supply permanently below it, so the two values diverge as soon as anyone burns.

Pending

#11 informational Issue
No documentation comments anywhere in the contract
Main2_V2.sol
L1-70
Description

Not a single function, parameter, return value, event or state variable carries documentation comments. The trading restriction in particular encodes business rules that are not self-evident - why the owner is exempt on both sides, why the sale contract is exempt only when sending, why burning is deliberately left unrestricted - and none of it is recorded. Explorers and wallets that display developer and user documentation have nothing to show.

Pending

#12 informational Issue
Constructor writes a value that is already the default
Main2_V2.sol
L32
Description

The constructor explicitly sets the trading flag to false, but a boolean already starts as false, so the assignment is a no-op that only costs deployment gas. It is harmless and arguably self-documenting, but unnecessary.

Pending

#13 informational Issue
Trading event indexes a boolean and carries an empty payload
Main2_V2.sol
L22
L39
Description

The trading status event marks its boolean argument as indexed, which puts the value into a log topic rather than into the event data. The result is an event with an empty body, so any consumer that decodes non-indexed arguments receives nothing at all. We confirmed this by recording the log and observing two topics and zero data bytes. The event is also only ever emitted with the value true, since trading can only be switched on.

Pending

#14 informational Issue
Compiler version is not pinned
Main2_V2.sol
L2
Description

The source declares a floating compiler range starting at 0.8.20 while the deployment actually used 0.8.34. A floating range means the same source can compile to different bytecode depending on which compiler picks it up, which weakens reproducibility. It also nominally admits compiler versions carrying a few known issues, though none of those affect the version actually used or the constructs present in this contract.

Pending

#15 informational Issue
Naming and formatting deviations
Main2_V2.sol
L41-43
L61-62
L65-69
Description

The sale contract setter takes a parameter with a leading underscore, a prefix the style guide reserves for private and internal members. That same function is indented inconsistently, with its declaration offset by three spaces, its body at the wrong level and its closing brace at column zero. There are also stray blank lines in two places.

Pending

#16 informational Issue
Burning is not covered by the trading restriction
Main2_V2.sol
L55-63
Description

The burn functions reach the internal burn logic without passing through the trading rule check, so any holder can destroy their own tokens even while the market is frozen. Burning with an allowance behaves the same way and correctly consumes the allowance first. This is an undocumented asymmetry rather than a defect.

Pending

#17 informational Issue
Standard approval race condition
Main2_V2.sol
L1-70
Description

Approving overwrites the previous allowance without a compare-and-set, so a spender watching pending transactions can front-run a reduction, spend the old allowance and then spend the new one as well. We reproduced this and showed a spender extracting 150 tokens across a sequence that only ever authorised 100 and then 50. This is inherent to the token standard rather than a flaw in this contract, and the newer library version no longer ships the incremental allowance helpers that used to mitigate it.

Pending

#18 informational Issue
Signature-based approvals can be front-run to grief the signer
Main2_V2.sol
L1-70
Description

Anyone who sees a signed approval in the pending transaction pool can submit it first. The nonce is consumed, the allowance is set correctly, and the signer's own transaction then reverts. No funds are at risk and the intended allowance is granted either way, but the signer pays for a failed transaction, and any contract bundling the approval with a follow-up call in the same transaction fails as a whole. This is inherent to the signature-approval standard.

Pending

#19 informational Issue
Supply is highly concentrated with no vesting or lock
Main2_V2.sol
L33
Description

The entire supply was minted to the deployer at construction and distributed manually from there. Reconstructing every balance from the complete transfer history shows the owner still holds just under twenty-eight percent, the top five addresses hold roughly fifty-seven percent and the top ten hold roughly eighty-one percent, spread across about three thousand six hundred holders. There is no vesting contract, no lock contract and no distribution schedule anywhere in the token, so every one of those balances is immediately transferable. At the time of review no automated market maker pool existed for this token against wrapped Ether at any standard fee tier, so there is currently no on-chain venue where those balances could be sold. This is a market and governance consideration rather than a contract defect.

Pending

#20 informational Issue
Header comment is stale and contains personal contact details
Main2_V2.sol
L10-13
Description

The file header describes the contract as a token sale at a version number that does not correspond to anything else in the codebase, and it embeds a personal email address. Because the source is verified on the block explorer and the contract is immutable, that address is published permanently and cannot be removed.

Pending

#21 informational Issue
Zero-value transfers are rejected while trading is disabled, contrary to the token standard
Main2_V2.sol
L44-63
Description

The token standard is explicit that a transfer of zero must be treated like any other transfer and must still emit a transfer event. This contract evaluates the trading restriction before it ever looks at the amount, so while trading is disabled a zero-value transfer between two ordinary addresses is rejected outright rather than succeeding quietly. The library the token is built on handles zero amounts correctly, so the deviation is introduced entirely by the added restriction. It is a compatibility problem rather than a safety one, since no funds can move or be lost either way. On the deployed contract trading is already open and both transfer paths now handle zero amounts exactly as the standard requires, so this is recorded as informational. It would rate as low for anyone redeploying this source.