Finsteco Info

Finsteco is a utility token at the heart of the entire FinSystems ecosystem, powering every product we offer. From trading to premium features, FNST will be used as the primary payment method across all FinSystems solutions. We are creating a natural demand for FNST as millions of users will rely on it to access exclusive tools, services, and lower fees. Token holders will benefit from reduced trading fees, priority access to premium features, and advanced analytics tools. By staking FNST, users unlock additional rewards, including bonuses and exclusive platform upgrades. Holders also gain governance rights, allowing them to participate in important decisions that shape the future of the platform.

Finsteco 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

Select the audit
"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/10/23
Revision date 2025/10/24

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 upgradeable

The contract uses a proxy pattern or similar mechanism, enabling future upgrades. This can introduce risks if the upgrade mechanism is not securely managed.

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 create new vesting packages, including single or multiple packages at once.
  • The owner can set or update the Merkle root for a package to manage whitelists.
  • The owner can create individual vesting schedules for beneficiaries.
  • The owner can revoke a revocable vesting schedule. 
  • The owner can withdraw non-vested tokens from the contract.
  • The owner can pause and unpause the contract's core functionalities, like releasing tokens.
  • The owner can perform batch initialization of pre-defined packages.

Note - This Audit report consists of a security analysis of the TokenVesting 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 Finsteco 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

high Issues | 2 findings

Resolved

#1 high Issue
Centralized Pause Control Creates Systemic Risk of Indefinite Asset Freeze
TokenVesting.sol
L1484-1486
Description

he contract's pausing mechanism introduces a critical centralization risk by granting the owner the unilateral and unchecked power to halt all token distributions. All five user-facing claim and release functions are protected by a whenNotPaused modifier, while the pause() function itself is restricted to onlyOwner. This combination creates a "kill switch" that allows a single entity to freeze all beneficiary assets indefinitely, which fundamentally undermines the trustless nature of the vesting schedule.

Resolved

#2 high Issue
Double-Counting Bug Locks Out Legitimate Users from Vesting Allocations
TokenVesting.sol
L517-583
Description

A logic error exists within the _ensureScheduleClaimed function that causes the contract to double-count every initial claim against a package's maxAllocation. The _packageTotalClaimed tracking variable is incorrectly incremented once inside the maxAllocation check and then a second time after the vesting schedule is created. This flawed accounting makes the contract believe the package's allocation limit has been reached far earlier than it actually has. As a direct result, legitimate, whitelisted users who attempt to claim their allocation after the internal counter has been erroneously inflated will have their transactions reverted, permanently locking them out of their funds.

medium Issues | 7 findings

Resolved

#1 medium Issue
Unrestricted Merkle Root Updates Create Centralization and Trust Risk
TokenVesting.sol
L397-413
Description

The setPackageMerkleRoot function presents a significant security and trust issue by allowing the contract owner to overwrite the Merkle root for a vesting package at any time. This capability introduces a centralization risk where a malicious or compromised owner could replace a legitimate list of beneficiaries with a new one, effectively revoking access to funds for users who have not yet claimed. This undermines the core principle of immutability in smart contracts and breaks user trust.

Resolved

#2 medium Issue
Permanent Grant Loss Due to State Overwriting on Repeat Schedule Creation
TokenVesting.sol
L423-444
Description

The createVestingSchedule function contains a flaw where creating a second vesting schedule for the same user within the same package permanently overwrites the reference to the first grant in the _packageScheduleId mapping. This action orphans the original schedule, making it inaccessible through any package-based claiming functions and resulting in an irreversible loss of the initial allocation for the beneficiary. This issue is not caused by malicious intent but by a common operational scenario, such as issuing a bonus or a second grant over time.

Resolved

#3 medium Issue
Owner Can Force-Claim on Behalf of Users, Triggering Unwanted Events
TokenVesting.sol
L646-702
L711-767
Description

The function explicitly allows the owner to initiate a claim for any user without their consent. This is a dangerous privilege that can be used to harm a user by forcing a financial event upon them (e.g., triggering a taxable event in an undesirable fiscal year). It fundamentally revokes a user's autonomy over their own assets and financial decisions. The if (msg.sender != claimant) block contains a require(msg.sender == owner()), which is an explicit backdoor granting the owner the ability to act on behalf of any beneficiary.

Resolved

#4 medium Issue
Incorrect Logic Locks Vested Funds After Initial TGE Claim
TokenVesting.sol
L646-702
Description

The claimTGE function contains a critical flaw that permanently locks all linearly vested funds after the initial TGE has been withdrawn. The function's internal logic correctly releases both TGE and vested tokens, but it concludes with a flawed check, require(tgeAmount > 0), that only allows the transaction to succeed if a TGE portion was released. For example, a user who successfully claims their TGE will find all subsequent attempts to claim their monthly vested tokens fail because the tgeAmount will now correctly be zero, causing the check to revert the entire valid transaction and preventing them from accessing their funds.

Resolved

#5 medium Issue
Incorrect TGE Check Permanently Blocks Claims for Vested Funds
TokenVesting.sol
L646-702
Description

The function contains a logic flaw where the check require(tgePreview > 0) incorrectly acts as a gatekeeper, permanently blocking entire classes of users from claiming their vested funds. This creates a Denial of Service for two groups: users with small allocations whose TGE portion rounds to zero, and, more significantly, any user in a package with a 0% TGE. For example, a pre-sale investor with millions of vested tokens would be blocked from using this function because their tgePreview is zero, unfairly preventing them from accessing their rightful allocation due to the faulty prerequisite.

Resolved

#6 medium Issue
Double-Accounting Flaw Allows Owner to Steal Locked Funds
TokenVesting.sol
L773-833
Description

The revoke function contains a catastrophic accounting vulnerability that allows the owner to steal funds locked for other beneficiaries. The function incorrectly subtracts funds from the contract's total liabilities (vestingSchedulesTotalAmount) twice: first, the external release call subtracts the vested amount, and then the revoke function itself subtracts the remaining unreleased portion. This flawed double-subtraction artificially deflates the contract's perceived debt, making locked funds appear as a withdrawable surplus for the owner and enabling them to drain the contract, leading to insolvency.

Resolved

#7 medium Issue
Missing Non-Reentrant Guard Creates Reentrancy Vulnerability
TokenVesting.sol
L876-889
Description

The releaseAllMySchedules function lacks a nonReentrant guard, creating a significant reentrancy vulnerability. The function iterates through a user's vesting schedules and calls releaseAll, which performs an external token transfer, inside the loop. This design allows a malicious contract to call back into the vesting contract after receiving tokens but before the loop has finished executing for all schedules. This re-entry could allow an attacker to manipulate state mid-operation or bypass security checks, potentially leading to exploits like draining more funds than are rightfully available.

low Issues | 2 findings

Resolved

#1 low Issue
Missing VestingClaimed Event on Manual Schedule Creation
TokenVesting.sol
L423-444
Description

The createVestingSchedule function fails to emit the VestingClaimed event after assigning a beneficiary to a package, creating an inconsistent and misleading event log. While the user-driven claim functions emit this event, its absence here means manual, administrative claims are not transparently recorded, hindering off-chain monitoring and auditing.

Resolved

#2 low Issue
Fragile Input Validation Creates Denial of Service on Subsequent Claims
TokenVesting.sol
L646-702
L711-767
Description

The function's input validation is overly strict, creating a fragile interface that can permanently lock users out of their funds. The contract improperly requires the beneficiary to re-submit their exact, original allocation amount from the Merkle proof on every subsequent claim, even though this amount is only necessary for validation the very first time. For example, a user who successfully claims their TGE by providing their proof and an amount of 1,000,000 will be blocked from claiming their vested tokens a month later if they have lost their original proof data and enter amount: 1, as the transaction will revert. This creates a Denial of Service for users who cannot reproduce this now-obsolete data.

optimization Issues | 1 findings

Resolved

#1 optimization Issue
Public function that could be declared external (external-function)
TokenVesting.sol
L387
L853
L876
L1094
Description

Use the `external` attribute for functions never called from the contract.

informational Issues | 2 findings

Resolved

#1 informational Issue
Floating pragma solidity version.
TokenVesting.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.

Resolved

#2 informational Issue
Missing zero check for amount
TokenVesting.sol
L1498-1540
Description

It is recommmended to check that the amount must be greater than zero.