The Unipeg contract implements an ERC20 token with integrated NFT (Upeg) syncing logic. The audit identified a critical reentrancy/logic flaw in the token-NFT synchronization mechanism, a high-severity economic issue leading to potential decoupling of token and NFT balances, and medium-severity centralization risks. While access controls are generally well-defined, the complex interaction between ERC20 and Upeg transfers introduces significant security challenges.

On-chain security analysis — is it a scam or legit?
Is Unipeg Safe?
Not verified
This record has not gone through deep verification and is not being monitored. The score is a dated snapshot — the token’s risk can change at any time.Own this token? Put it under verification →The Unipeg contract implements an ERC20 token with integrated NFT (Upeg) syncing logic.
Read the full analysis- Liquidity not locked, but no owner/deployer address holds LP — market-depth risk, not rug risk
- LP top1 unlocked holder = 84.2%
- LP top3 unlocked holders = 100.0%
- 1 Critical finding(s) from audit
- 1 High finding(s) from audit
- 1 Medium finding(s) from audit
- 1 Low finding(s) from audit
Exact factors
- Liquidity not locked, but no owner/deployer address holds LP — market-depth risk, not rug risk
- LP top1 unlocked holder = 84.2% (independent LP — depth risk, pool = 88% of DEX liquidity)
- LP top3 unlocked holders = 100.0% (independent LP — depth risk, pool = 88% of DEX liquidity)
- 1 Critical finding(s) from audit
- 1 High finding(s) from audit
- 1 Medium finding(s) from audit
- 1 Low finding(s) from audit
Each factor is an on-chain fact recorded at the time of this analysis. The score is computed from them by a deterministic function, so the same contract returns the same score for anyone who runs the audit. How scores are computed
Security Checklist
as of audit · Sep 4Holders
as of audit · Sep 4, 2026- Contractstreasury, vesting, bridge, staking15.6%
- Walletsanonymous holders, free to sell4.0%
- Everyone elsethe rest of the supply80.3%
How holder types affect the score
Share held by contracts — treasury, vesting, bridge or staking — is discounted against share held by wallets when the score is computed: a contract cannot decide to sell the way an anonymous holder can, though it can still be drained or voted to sell. Effective concentration is the figure the risk score is actually calculated from.
Holder balances as recorded by the audit of Sep 4, 2026
Liquidity
as of audit · Sep 4- Uniswap v4ETHAnalysed$1.59M87.7%
- Uniswap v4ETH$140.1K7.7%
- Uniswap v4ETH$69.2K3.8%
- Uniswap v4USDT$7.5K0.4%
- Uniswap v3WETH$4.3K0.2%
- Uniswap v4ETH$1.9K0.1%
Show 2 more pairs
The risk score reads depth across every pair.
The LP tokens of the analysed pool are not locked or burned, so whoever holds them can withdraw that liquidity.
0xee67…3a670xf9fd…f90f0xc500…6aca0xe0dd…f3dfNo privileged address appears among these holders: the unlocked liquidity sits with independent providers, not with the deployer.
Security Findings
CriticalCritical Reentrancy/Logic Flaw in Upeg-ERC20 Sync
The Unipeg contract exhibits a critical circular dependency between ERC20 token transfers and Upeg NFT transfers. When an ERC20 transfer occurs, the _afterTokenTransfer hook calls _onTokenTransfer to synchronize Upegs. If _onTokenTransfer determines that Upegs need to be moved (e.g., in a user-to-user transfer), it calls _moveUpegs, which in turn calls _transferUpeg (from the inherited Upeg.sol contract). The _transferUpeg function, as an override, then triggers _afterUpegTransferred in Unipeg.sol. Crucially, _afterUpegTransferred then executes an internal ERC20 transfer via _transfer(from, to, UNIT_PER_UPEG). This creates a reentrant call to the ERC20 transfer mecha…C-01
Issue
The Unipeg contract exhibits a critical circular dependency between ERC20 token transfers and Upeg NFT transfers. When an ERC20 transfer occurs, the _afterTokenTransfer hook calls _onTokenTransfer to synchronize Upegs. If _onTokenTransfer determines that Upegs need to be moved (e.g., in a user-to-user transfer), it calls _moveUpegs, which in turn calls _transferUpeg (from the inherited Upeg.sol contract). The _transferUpeg function, as an override, then triggers _afterUpegTransferred in Unipeg.sol. Crucially, _afterUpegTransferred then executes an internal ERC20 transfer via _transfer(from, to, UNIT_PER_UPEG). This creates a reentrant call to the ERC20 transfer mecha…
Fix
Refactor the Upeg-ERC20 synchronization logic to break the circular dependency. The _afterUpegTransferred and _afterUpegsListTransferred functions should not trigger new ERC20 transfers if the Upeg transfer was initiated by an existing ERC20 transfer. Instead, these hooks should only handle the ERC20 side if the Upeg transfer was initiated independently (e.g., by a direct call to _transferUpeg not originating from _onTokenTransfer). Consider using a reentrancy guard or a flag to prevent…
Status
Unresolved
HighEconomic Decoupling of ERC20 and Upeg Balances
The logic in _onTokenTransfer for calculating from_remove_cnount can lead to a permanent decoupling of ERC20 token balances and Upeg NFT counts. The calculation `from_remove_cnount = from_count > from_max_allowed ? from_count - from_max_allowed : 0; means that if an account's actual Upeg count (from_count) is already less than the expected Upeg count derived from its ERC20 balance (balanceOf(from) / UNIT_PER_UPEG`), no Upegs will be removed or burned when ERC20 tokens are transferred out. This allows users to reduce their ERC20 balance without affecting their Upeg count, effectively 'hiding' Upegs or creating a state where the total number of Upegs in circulation is significantly le…H-01
Issue
The logic in _onTokenTransfer for calculating from_remove_cnount can lead to a permanent decoupling of ERC20 token balances and Upeg NFT counts. The calculation `from_remove_cnount = from_count > from_max_allowed ? from_count - from_max_allowed : 0; means that if an account's actual Upeg count (from_count) is already less than the expected Upeg count derived from its ERC20 balance (balanceOf(from) / UNIT_PER_UPEG`), no Upegs will be removed or burned when ERC20 tokens are transferred out. This allows users to reduce their ERC20 balance without affecting their Upeg count, effectively 'hiding' Upegs or creating a state where the total number of Upegs in circulation is significantly le…
Fix
Re-evaluate the synchronization logic to ensure a consistent 1:1 relationship between UNIT_PER_UPEG tokens and one Upeg NFT. Implement a mechanism to actively reconcile discrepancies where OwnerUpegsCount is less than balanceOf / UNIT_PER_UPEG. This might involve burning excess Upegs when tokens are transferred out, or preventing token transfers if they would lead to an invalid Upeg state. The goal should be to prevent a scenario where users can hold ERC20 tokens without the corresponding…
Status
Unresolved
MediumCentralization Risk with Owner and Hook Control
The contract's owner has significant control over critical system parameters. The owner can set the hook address via setHook(). This hook address is then the only entity authorized to call start(), which sets the crucial pool address and enables the token's core functionality (Upeg minting/burning). A compromised owner account or a malicious owner could set a malicious hook address, which could then set a malicious pool address, leading to potential manipulation of the Upeg minting/burning process, unauthorized token mints, or other forms of economic exploitation.M-01
Issue
The contract's owner has significant control over critical system parameters. The owner can set the hook address via setHook(). This hook address is then the only entity authorized to call start(), which sets the crucial pool address and enables the token's core functionality (Upeg minting/burning). A compromised owner account or a malicious owner could set a malicious hook address, which could then set a malicious pool address, leading to potential manipulation of the Upeg minting/burning process, unauthorized token mints, or other forms of economic exploitation.
Fix
While Ownable is a standard pattern, consider implementing a multi-signature wallet for the owner address to reduce the risk of a single point of failure. For highly critical functions like setHook, consider a time-locked or multi-step ownership transfer process to allow for community review or intervention. Clearly document the responsibilities and potential impact of the owner and hook roles.
Status
Unresolved
LowPrecision Loss in Upeg Count Calculations
The calculations for Upeg counts, such as amount / UNIT_PER_UPEG in _mintUpegs and balanceOf(addr) / UNIT_PER_UPEG for from_max_allowed and to_max_allowed, use integer division. This truncates any remainder, meaning that if an account holds, for example, 1.9 * UNIT_PER_UPEG tokens, it is only considered to own 1 Upeg. This results in a slight discrepancy where fractional Upeg equivalents are not accounted for, potentially leading to minor economic inefficiencies or user confusion regarding their exact Upeg entitlement based on their token balance.L-01
Issue
The calculations for Upeg counts, such as amount / UNIT_PER_UPEG in _mintUpegs and balanceOf(addr) / UNIT_PER_UPEG for from_max_allowed and to_max_allowed, use integer division. This truncates any remainder, meaning that if an account holds, for example, 1.9 * UNIT_PER_UPEG tokens, it is only considered to own 1 Upeg. This results in a slight discrepancy where fractional Upeg equivalents are not accounted for, potentially leading to minor economic inefficiencies or user confusion regarding their exact Upeg entitlement based on their token balance.
Fix
This is a design choice, but it should be clearly communicated to users. If a more precise representation is desired, consider alternative mechanisms for linking tokens and Upegs that can handle fractional amounts, or explicitly state that Upegs are only granted/counted in whole UNIT_PER_UPEG increments. Ensure that the implications of this precision loss are fully understood and accepted within the project's economic model.
Status
Unresolved
InfoUndisclosed Dependency on Upeg.sol Implementation
The Unipeg.sol contract heavily relies on the internal implementation details of the Upeg.sol contract, which was not provided for this audit. Functions like _mintUpeg, _burnUpeg, _transferUpeg, OwnerUpegsCount, and OwnerUpeg are critical for the core logic of Unipeg.sol. The security and correctness of the entire system are therefore directly dependent on the robustness, reentrancy-safety, and bug-free nature of the Upeg.sol contract. Any vulnerabilities or unexpected behaviors within Upeg.sol could directly compromise Unipeg.sol.I-01
Upeg.sol ImplementationIssue
The Unipeg.sol contract heavily relies on the internal implementation details of the Upeg.sol contract, which was not provided for this audit. Functions like _mintUpeg, _burnUpeg, _transferUpeg, OwnerUpegsCount, and OwnerUpeg are critical for the core logic of Unipeg.sol. The security and correctness of the entire system are therefore directly dependent on the robustness, reentrancy-safety, and bug-free nature of the Upeg.sol contract. Any vulnerabilities or unexpected behaviors within Upeg.sol could directly compromise Unipeg.sol.
Fix
Conduct a full audit of the Upeg.sol contract, paying close attention to its internal state management, transfer mechanisms, and any external interactions. Ensure that Upeg.sol adheres to best security practices, especially regarding reentrancy and access control, as its interactions with Unipeg.sol are highly sensitive. Provide the source code for Upeg.sol for a comprehensive security assessment.
Status
Unresolved
Analysis
AI Copilotas of audit · Sep 4The technical architecture (7.1) presents a complex dual-token system where ERC20 and NFT (Upeg) balances are intended to be synchronized. Code security (7.2) is significantly impacted by a critical reentrancy/logic flaw in the _afterTokenTransfer and _afterUpegTransferred hooks, creating a circular dependency that could lead to unexpected state or reentrancy. Access control (7.3) is generally robust, utilizing Solady's Ownable pattern, with critical functions like setHook and setImageParamsProvider restricted to the owner, and start restricted to the designated hook address.
The economic model (7.4) attempts to link ERC20 token holdings with Upeg NFT ownership, but a high-severity flaw in the syncing logic allows for a decoupling where actual Upeg counts can fall below expected token-derived counts, potentially impacting the token's value proposition. Governance (7.5) is centralized with a single owner controlling critical parameters like the hook address, which in turn controls the pool address, introducing a medium centralization risk. External dependencies (7.6) on the Upeg.sol contract are significant, and its internal implementation details are crucial for the overall security and correctness of the Unipeg system.
The Unipeg contract is not designed with an upgrade mechanism (7.7), meaning its logic is immutable once deployed. This eliminates upgrade-related risks but requires thorough pre-deployment auditing. There are no explicit operational (7.8) concerns beyond standard owner responsibilities.
It is critical to address the reentrancy/logic flaw in the ERC20-Upeg synchronization to prevent potential exploits and ensure consistent state.
The economic model's decoupling issue also requires immediate attention to maintain the integrity of the token-NFT link. Consider implementing a more robust and explicit state machine for managing the synchronization, possibly with reentrancy guards or clearer separation of concerns between the ERC20 and Upeg transfer hooks. Thoroughly review the Upeg.sol contract's implementation, especially its transfer hooks, to ensure it does not exacerbate or introduce new vulnerabilities in conjunction with Unipeg.sol.
Contract & Record
Free for any token on the record. It links to this page and always shows the current score and the date it was checked.
- Sep 4, 202626Low
- Jul 31, 202624Low
Score changes are recorded as dated snapshots — history is append-only and cannot be edited.
Would You Like a More Detailed Audit of Unipeg?
Our AI-powered scanner gives you a deeper, real-time smart contract analysis — free, with every scoring factor shown.
Get Detailed Audit Is this your token? Publish your own audit on this page