60171 sc low levels added after deployment lack boost price initialization resulting in free boosting

Submitted on Nov 19th 2025 at 14:44:28 UTC by @aman for Audit Comp | Vechain | Stargate Hayabusaarrow-up-right

  • Report ID: #60171

  • Report Type: Smart Contract

  • Report severity: Low

  • Target: https://github.com/immunefi-team/audit-comp-vechain-stargate-hayabusa/tree/main/packages/contracts/contracts/StargateNFT/StargateNFT.sol

  • Impacts:

    • Theft of unclaimed royalties

Description

Brief/Intro

The addLevel function allows new levels to be added after deployment, but there is no accompanying function to set the boostPricesPerBlock for these newly added levels. As a result, users can benefit from boost features without paying any fee in VTHO tokens, bypassing the intended waiting period and staking directly on the validator for free.

Vulnerability Details

A new feature introduced in this version allows users to perform boosting, where they pay a token fee to bypass the maturity period and stake immediately to start earning rewards. Under normal operation, levels and their corresponding boost prices are set during initialization inside initializeV3 as follows:

/audit-comp-vechain-stargate-hayabusa/packages/contracts/contracts/StargateNFT/StargateNFT.sol:226
226:     function initializeV3(
227:         address stargate,
228:         uint8[] memory levelIds,
229:         uint256[] memory boostPricesPerBlock
230:     ) external onlyRole(UPGRADER_ROLE) reinitializer(3) {
....
239:         DataTypes.StargateNFTStorage storage $ = _getStargateNFTStorage();
240:         $.stargate = IStargate(stargate);
241:         for (uint256 i; i < levelIds.length; i++) {
242:             Levels.updateLevelBoostPricePerBlock($, levelIds[i], boostPricesPerBlock[i]);
243:         }
244:     }

Here at Line 242 the boostPricesPerBlock for each level is set.

However the levels can also be added after this flow via the addLevel function as follows:

StargateNFTContract::addLevel -> Levels::addLevel:

As shown above, boostPricePerBlock is never initialized for newly added levels. Consequently, any user can call the boost or stakeAndDelegate functions on levels created via the addLevel function without paying any fee. This allows them to bypass the intended maturity period and immediately stake VET on the validator.

Impact Details

The vulnerability lets users bypass the boost fee entirely, granting them free boosts. Although no protocol funds are lost because fees are burned, the fee mechanism becomes ineffective.

Proof of Concept

chevron-rightUnit test demonstrating the issue (Boost.test.ts)hashtag

Add the following unit test case to the file Boost.test.ts and run with command npx hardhat test.

Note: Also import time (and optionally mine) from @nomicfoundation/hardhat-network-helpers.

References

Add any relevant links to documentation or code.

Was this helpful?