Fair launch Info

Fairlaunch.gg was built to solve this. It is a fully transparent, bot-resistant, and provably fair launch protocol for Solana projects, powered by Verifiable Randomness, AI-driven anti-bot detection, and open, on-chain allocation mechanics. By removing the advantage of speed, wealth, or insider connections, Fairlaunch.gg ensures every participant — from first-time traders to seasoned investors — has an equal mathematical chance at token allocation.

Fair launch 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.

71.57
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 Rust
Onboard date 2025/08/19
Revision date 2025/08/20

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 has the sole authority to initiate a new token launch and define all of its parameters.
  • The owner is the only one who can withdraw the pre-defined allocation of tokens reserved for themselves or their team.
  • The owner can submit the first buy order for a "meme coin" type launch before the public sale window officially opens.

Note - This audit report consists of a security analysis of the locker contract. This analysis did not include functional testing (or unit testing) of the token’s logic. Furthermore, we only audited the mentioned contract associated with this project. Other contracts related to this project were not audited by our team. We recommend investors conduct their own research before engaging with the token.

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

/

Functions
public

/

State variables
public

/

Total lines
of code

/

Capabilities
Hover on items

/

Findings and Audit result

high Issues | 2 findings

Resolved

#1 high Issue
Centralization Risk via Hardcoded Admin Key
instructions.rs
L42-44
L46-50
L64-66
L68-70
Description

The contract's most functions are gated by a signature check against a single, hardcoded ADMIN public key. This includes actions that should be permissionless for users, such as buying and selling tokens after the launch or claiming their purchased tokens. This design makes the entire protocol custodial, as users are unable to manage their own assets without the direct, active involvement of the admin for every transaction. For example, if a user wishes to sell their tokens using the sell function, the transaction will fail unless it is also signed by the admin. This introduces a single point of failure and gives the admin unchecked power to censor users, halt all trading, or manipulate the market.

Resolved

#2 high Issue
Logic Flaw in sell Function Can Corrupt Bonding Curve State
instructions.rs
L46-50
Description

A critical logic flaw exists in the sell function within instructions.rs. The code is designed to handle cases where a user attempts to sell more tokens than are currently accounted for in the bonding curve's supply (current_buy_supply). However, instead of rejecting this invalid transaction, the contract's logic incorrectly inflates its own internal supply to match the user's oversized input. This action corrupts the bonding curve's state, causing all subsequent financial calculations within the same transaction to be based on this false, inflated supply. For example, if the contract holds 1,000 tokens in its supply but an attacker calls the sell function with an input of 5,000 tokens, the contract will wrongly update its internal supply to 5,000. It will then calculate the attacker's SOL refund based on this corrupted state, resulting in a massively inflated payout that could drain almost all of the contract's SOL liquidity in a single transaction.

medium Issues | 2 findings

Acknowledged

#1 medium Issue
Unsafe Floating-Point Arithmetic for Financial Calculations
utils.rs
L7-10
L18-23
L32-48
L49-61
Description

The contract uses standard f64 floating-point numbers for all of its core financial logic, including the bonding curve calculations that determine token prices and amounts. Floating-point arithmetic is inherently imprecise and non-deterministic, making it fundamentally unsafe for use on a blockchain. Different validators running the same code could arrive at slightly different results due to minor variations in floating-point hardware or software, which could lead to a consensus failure. For example, the linear_bonding_buy_with_amount_in function might calculate that 1 SOL buys 100.000000001 tokens on one validator but 100.000000002 on another, breaking the network's state consistency and potentially leading to financial exploits or losses.

Resolved

#2 medium Issue
Unused Pubkey in Claim Data Implies Missing Validation
instructions.rs
L608-730
Description

A significant safety check is missing in the claim_buy_orders function. This function accepts a data payload from the admin, which is used to determine how many tokens a buyer receives. A helper function, decodeData, is designed to parse this payload by extracting a public key from the first 32 bytes and a number from the last 8 bytes. The vulnerability is that the extracted public key is immediately discarded and never validated. This public key is clearly intended to link the off-chain payload to the specific on-chain buyer it's meant for. Because this check is missing, the contract is vulnerable to operational errors. For instance, consider a situation where the administrative process generates a data payload for a specific user's claim. If that payload is accidentally submitted in a transaction that contains the on-chain accounts for a different user, the contract will fail to detect this mismatch. It will proceed to transfer the token amount from the first user's data into the second user's account, leading to an incorrect distribution of funds that the contract should have prevented.

low Issues | 4 findings

Resolved

#1 low Issue
Unused sol_to_usd Parameter in Multiple Functions
instructions.rs
L298
L353
L458
L566
L614
L732
Description

Multiple functions, including buy, sell, cancel_buy, claim_allocations, claim_buy_orders, and graduate_token, require the caller to provide a sol_to_usd: u64 parameter. However, within the logic of these functions, this parameter is never used. The code does not read, check, or perform any calculations with this value. This represents dead code and a misleading contract interface (ABI), as clients and users are forced to provide a value that has no effect on the program's execution.

Resolved

#2 low Issue
Centralized and Predictable "Randomness" Seed
utils.rs
L67-106
Description

The function calculateUserVrfIndex uses a pseudo-random number generator to assign an index to each buyer. However, the initial seed for this generator, the randomness array, is a parameter provided directly by the launch creator in the create_launch function. Because the number generation algorithm is deterministic, a sophisticated creator could simulate the index assignment process off-chain. By testing numerous potential seeds, they could identify and select a seed that predictably grants them or other specific wallets a preferential index in the final distribution. While this does not create a direct risk of theft of user funds, it does weaken the guarantee of a truly unpredictable and fair ordering process, which could be perceived as a trust issue by participants.

Resolved

#3 low Issue
Redundant On-Chain Calculations
instructions.rs
L61
Description

The slope of the bonding curve, a key variable for all pricing, is recalculated from scratch inside every function that interacts with the curve: initiate_buy, cancel_buy, buy, sell, and graduate_token. The calculation always uses the same inputs (launch_data.buy_supply and constants) and will always produce the same result for a given launch. Performing this complex floating-point calculation repeatedly in multiple transactions is computationally inefficient and wastes gas fees for every user who interacts with the contract.

Resolved

#4 low Issue
Disabled Market Stability Feature (WAIT_PERIOD)
storage.rs
L12
Description

The contract includes logic for a WAIT_PERIOD, a safety feature intended to create a cooling-off period after a token sale ends and before open trading begins. This feature is crucial for market stability, as it prevents instant price volatility from immediate selling. However, the WAIT_PERIOD constant in storage.rs is hardcoded to 0, which completely disables this feature. The code in the buy and sell functions contains a check to enforce this delay, but since the period is set to zero, it has no effect. For example, if a token sale ends at timestamp 1700000000, the check require!(now >= 1700000000 + 0, ...) allows open trading to start immediately at that same second, rather than enforcing a delay. The commented-out code //60 * 10; suggests the original intent was a 10-minute wait, but the current implementation fails to provide this expected market protection.