Crisis Currency Info

The CCTOK — Crisis Currency Token is the world’s first digital crypto-crisis currency. By linking the Global Crisis Index (GCI) to the CCTOK, global crises can be transformed into economic profit. The CCTOK rises in price when global crises intensify. Holders of CCTOK want to speculate on an increase in global crises to generate financial profits.

Crisis Currency Logo

Team and KYC Verification

The team has securely submitted their personal information to SolidProof.io for verification.

In the event of any fraudulent activities, this information will be promptly reported to the relevant authorities to ensure accountability and compliance.

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.

100.00
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
N/A
Network N/A
License N/A
Compiler N/A
Type N/A
Language Solidity
Onboard date 2025/11/05
Revision date 2025/11/06

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.


Ownership Privileges
  • The owner can pause/unpause the buy and distribute functionality in the contract.
  • The owner can set the treasury price USD value to any arbitrary value, excluding zero.
  • The owner can set the fallbackETHprice to any arbitrary value.
  • The owner can change the start time of the Token generation event.
  • The owner can claim their vested tokens.
  • The owner can distribute ETH and USDT tokens from the contract to the marketing wallet and owners.
  • The owner can transfer tokens to the launchpad address.
  • The owners can transfer any amount of tokens to liquidity pools.

Note - This Audit report consists of a security analysis of the Crisis Currency Token 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 Crisis Currency 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

/

Findings and Audit result

medium Issues | 4 findings

Resolved

#1 medium Issue
Lack of Parameter Validation in Administrative Setter Functions
cctokSale.sol
L147-151
L153-156
L158-162
Description

The three administrative functions responsible for setting critical contract parameters lack comprehensive validation checks, exposing the protocol to multiple attack vectors and operational failures. The setTreasuryPrice() function only validates that the price is non-zero but fails to enforce reasonable bounds, allowing owners to set prices as low as 1 wei (essentially free tokens) or absurdly high values that make tokens unbuyable. More critically, it doesn't prevent the treasury price from being set below the presale price of $0.50, which would be fundamentally unfair to presale investors who purchased at a higher price with vesting restrictions. The setFallbackETHPrice() function has zero validation, allowing owners to set the fallback ETH price to zero, which would cause division-by-zero errors in token calculation functions and completely break the ETH purchase mechanism. Unrealistic fallback prices like $1 or $1,000,000 per ETH would result in grossly incorrect token amount calculations. The setTGEStart() function only checks that the timestamp is in the future but allows unlimited modifications before the TGE occurs and has no maximum time boundary, enabling owners to repeatedly delay the TGE date and manipulate vesting schedules. Since all vesting calculations depend on the TGE start time, owners could trap investor funds indefinitely by continuously pushing the date forward or setting it years into the future. These validation gaps represent serious centralization risks where malicious or compromised owners could manipulate token economics, cause contract failures, or rug pull investors.

Resolved

#2 medium Issue
Missing Duplicate Owner Validation
cctokSale.sol
L118-130
Description

The _initializeOwners() function at lines 118-130 lacks validation to prevent the same address from being added multiple times to the owners array. During deployment, if an address appears more than once in the _ownersList parameter, it will be added to the owners array multiple times without detection. While the isOwner mapping will only reflect true once, the array-based distribution logic in distributeETH() and distributeUSDT() iterates through the entire owners array and sends funds to each entry independently. This allows a duplicate owner to receive multiple payment shares during revenue distribution. For example, if Alice is added twice among three total entries, she receives two-thirds of the owner allocation instead of one-third, effectively stealing funds from other legitimate stakeholders. The issue persists throughout the contract's lifetime as the owners array is immutable after deployment.

Resolved

#3 medium Issue
Sale Lockout Period Between Presale Sellout and TGE
cctokSale.sol
L166-168
Description

The contract's sale phase logic creates an unintended lockout period when the presale sells out before the TGE date arrives. The isPresaleActive() function at line 167 requires both block.timestamp < TGEStart AND totalPresaleSold < PRESALE_SUPPLY to return true, while isTreasuryActive() at line 171 requires block.timestamp >= TGEStart. If the presale reaches its 2,000,000 token limit before the scheduled TGE date, both functions return false simultaneously, causing _checkSaleActive() to revert all purchase attempts. For example, if the presale sells out on January 15 but TGE is scheduled for January 31, there is a 16-day blackout period where buyers cannot purchase tokens despite 6,000,000 treasury tokens being available. The contract holds tokens ready for sale but the phase transition logic prevents any transactions, resulting in lost revenue, frustrated users, wasted marketing expenditure, and potential reputation damage as buyers encounter repeated transaction failures without understanding why.

Resolved

#4 medium Issue
Distribution Denial of Service Vulnerability
cctokSale.sol
L433-454
L456-476
Description

The distributeETH() and distributeUSDT() functions at lines 433-454 and 456-476 implement a push payment pattern where funds are sent directly to each owner and the marketing wallet within a loop. Both functions use require() statements to validate transfer success, creating a single point of failure where any recipient's inability to receive funds causes the entire transaction to revert. If any owner address is a contract without a receive() or fallback() function, or contains logic that intentionally or accidentally rejects transfers, all distribution attempts will fail permanently. This can occur through malicious intent (an attacker deploying a rejecting contract and getting added as an owner), accidental misconfiguration (using a multisig or contract address that doesn't accept direct transfers), or contract upgrades that change receiving behavior. Once triggered, there is no recovery mechanism - the contract provides no functions to remove problematic owners, skip failed transfers, or implement emergency withdrawals. All collected ETH and USDT remains trapped in the contract indefinitely, affecting not just the problematic recipient but all legitimate owners and the marketing wallet, despite their addresses functioning correctly. The vulnerability is particularly critical given the potential funds at stake: with a $7M token sale generating substantial ETH/USDT holdings, a single misconfigured address can cause total permanent loss of all revenue.

low Issues | 2 findings

Resolved

#1 low Issue
Missing Chainlink Oracle Staleness Check
cctokSale.sol
L174-185
Description

The function calls Chainlink's latestRoundData() which returns five values including an updatedAt timestamp indicating when the price was last updated, but the current implementation ignores this parameter. During periods of network congestion, oracle maintenance, or unexpected downtime, Chainlink price feeds may stop updating while still returning the last known price. Without validating the updatedAt timestamp against the current block.timestamp, the contract could unknowingly use price data that is hours or even days old. This creates a window where token purchase calculations use stale prices that don't reflect current market conditions. For example, if ETH's actual price dropped from $4000 to $3500 but the oracle hasn't updated, buyers would significantly overpay for tokens. While the contract includes a fallback price mechanism, it only activates when the oracle completely fails or returns invalid data, not when it returns stale but technically valid data.

Resolved

#2 low Issue
Unused State Variables
cctokSale.sol
L67
L68
Description

These mappings are declared as state variables but are never written to or read from within any function. While _recordBuy() updates presaleVesting[buyer].totalAmount and tracks totalPresaleSold/totalTreasurySold, the individual purchase mappings remain perpetually zero. This represents dead code that wastes approximately 40,000 gas during deployment and misleads users who query these values expecting accurate purchase history.

informational Issues | 3 findings

Resolved

#1 informational Issue
Floating pragma solidity version.
cctokSale.sol
L2
Description

Adding the 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 informational Issue
Inconsistent Dual Ownership Model
cctokSale.sol
L132-135
Description

The contract inherits from Ownable which designates the deployer (msg.sender) as THE owner with access to the onlyOwner modifier. Simultaneously, it implements a separate multi-owner system through the isOwner mapping and onlyOwners modifier. This creates two distinct permission tiers with no clear hierarchy or relationship. The inconsistency is evident in critical functions: transferToLaunchpad() (line 478) and transferToLiquidityPool() (line 491) use onlyOwner restricting access to the single deployer, while mergeLaunchpadIntoTreasury() (line 485), distributeETH() (line 433), and other revenue functions use onlyOwners allowing any owner from the multi-owner set. This dual system creates ambiguity about who controls what functionality, complicates permission auditing, and may lead to unexpected access restrictions or allowances.

Resolved

#3 informational Issue
Ambiguous Owner Token Allocation Design
cctokSale.sol
L125-128
Description

The constant OWNER_ALLOCATION is defined as 1,000,000 tokens at line 27, but its naming and lack of documentation create ambiguity about whether this represents the total allocation for all owners collectively or the per-owner allocation. In _initializeOwners() at lines 125-128, each owner receives OWNER_ALLOCATION (1,000,000 tokens) in their vesting structure, meaning the total owner allocation scales linearly with the number of owners - three owners would receive 3,000,000 tokens total, five owners would receive 5,000,000 tokens total. The constant name suggests a fixed total budget, but the implementation treats it as a per-owner amount. This discrepancy is not documented anywhere in the code, making it impossible for auditors or users to determine if this multiplicative behavior is intentional or represents a design flaw where the allocation should have been divided among all owners.