59841 sc low the newly added level cannot have its boost price set because the updatelevelboostpriceperblock function is not exposed

Submitted on Nov 16th 2025 at 10:01:13 UTC by @shaflow1 for Audit Comp | Vechain | Stargate Hayabusaarrow-up-right

  • Report ID: #59841

  • 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

Description

Brief/Intro

In the StargateNFT contract, the LEVEL_OPERATOR_ROLE is allowed to call addLevel to add new levels. However, since the updateLevelBoostPricePerBlock function is not exposed, the newly added level cannot have its BoostPricePerBlock set. As a result, users can bypass the maturity period for free and start delegating immediately.

Vulnerability Details

The addLevel function is implemented as follows:

/// @inheritdoc IStargateNFT
function addLevel(
    DataTypes.LevelAndSupply memory _levelAndSupply
) public onlyRole(LEVEL_OPERATOR_ROLE) {
    Levels.addLevel(_getStargateNFTStorage(), _levelAndSupply);
}

LEVEL_OPERATOR_ROLE can call addLevel to add a new level. This function sets the level’s cap, level data, and circulating supply, but it does not set the boostPricePerBlock.

In the library, the updateLevelBoostPricePerBlock function used to update boostPricePerBlock is only called during the V3 contract initialization. After that, it cannot be invoked. As a result, no one is able to set the boostPricePerBlock for newly added levels.

Reference lines:

  • StargateNFT addLevel: https://github.com/immunefi-team/audit-comp-vechain-stargate-hayabusa/blob/e9c0bc9b0f24dc0c44de273181d9a99aaf2c31b0/packages/contracts/contracts/StargateNFT/StargateNFT.sol#L302

  • Levels library reference: https://github.com/immunefi-team/audit-comp-vechain-stargate-hayabusa/blob/e9c0bc9b0f24dc0c44de273181d9a99aaf2c31b0/packages/contracts/contracts/StargateNFT/libraries/Levels.sol#L180

Impact Details

circle-exclamation

Proof of Concept

chevron-rightTest PoC (click to expand)hashtag

To run the test, add the code to the end of describe("Add level", () => { in the file packages/contracts/test/unit/StargateNFT/Levels.test.ts.

The test verifies that the newly added level cannot have its boostPricePerBlock set, allowing users to skip the maturity period for free.

Was this helpful?