Nex Labs Cross Chain security record

Arbitrumnexlabs.io

As of 30 Oct 2026, Nex Labs Cross Chain has 3 audit reports by 1 security firm on Trustblock; the latest is by QuillAudits, dated 15 Jan 2025. Those reports list no open critical findings.

Critical findings
No open critical findings
Across 3 reports.
Open the latest report
Your label, live
Get the label for your site

Record last updated . It holds audits and findings, contracts and incidents up to Oct 2026. Trustblock does not review code.

Audits3

Newest first

AuditSecurity firmDateScopeCritical findingsReport
Nex Labs Stock IndexSecurity firm: QuillAuditsDate: Scope: Files named in the reportNo open critical findingsOpen · quillaudits.com
Nex Labs DeFi IndicesSecurity firm: QuillAuditsDate: Scope: Files named in the reportNo open critical findingsOpen · quillaudits.com
Nex Labs Cross ChainSecurity firm: QuillAuditsDate: Scope: Files named in the reportNo open critical findingsOpen · quillaudits.com

Findings43

Statuses are the security firm’s own, from each report.

SeverityOpenAcknowledgedFixed
Critical000
High004
Medium1016
Low1021
High_swapFee/poolFee variable does not apply for uniswapV2Nex Labs DeFi Indices · QuillAudits · 15 Jan 2025Fixed

IndexFactory::swap takes in a _swapFee parameter which calls SwapHelpers::swap as poolFee. Now poolFee is checked to be greater than 0 to run the swapVersion3 code block and if it is 0 it will run the swapTokensv2 (else block) instead because as per the NATSPEC comment on the swap function, 2 or 3 is expected to signify v2 or v3 respectively. Only the if block will run in any scenario because poolFee is set to 2 or 3 which is always greater than 0

Open the report
HighExcess tokens will be lost to CCIP due to high gas limit setNex Labs Cross Chain · QuillAudits · 15 Jan 2025Fixed

The gasLimit specifies the maximum amount of gas CCIP can consume to execute ccipReceive() on the contract located on the destination blockchain. It is the main factor in determining the fee to send a message. Unspent gas is not refunded.

Open the report
HighIncorrect BPS fee calculation in redemption leads to 30% fee Instead of 0.3%Nex Labs Cross Chain · QuillAudits · 15 Jan 2025Fixed

The IndexFactory contract implements a fee system for token redemptions using basis points (BPS). The fee calculation is performed in the _handleReceivedRedemption() function when processing cross-chain redemption requests. However, there is a critical error in how the swap fee is handled. In the contract, the fee rate is documented and used elsewhere as: uint8 public feeRate; // 10/10000 = 0.1% However, in _handleReceivedRedemption(), the swap fee is hardcoded to 3000 This leads to a fee of 3000 basis points (30%) being charged instead of the expected 0.3% (30 basis points), representing a 100x increase in the fee rate compared to what users would expect based on the documentation and other parts of the contract.

Open the report
HighSwapHelpers::swap() always uses UniswapV3 because of incorrectly checked _swapFee parameterNex Labs Cross Chain · QuillAudits · 15 Jan 2025Fixed

The swap() function in IndexFactory.sol is intended to support both Uniswap V3 and V2 swaps based on the _swapFee parameter. However, due to input validation requirements in multiple functions, the code always executes the V3 swap path, making the V2 swap functionality unreachable. The issue stems from several functions requiring _swapFee > 0 in their validation:<br>1. issuanceIndexTokens() requires _tokenInSwapFee > 0<br>2. redemption() requires _tokenOutSwapFee > 0<br>3. _handleReceivedRedemption() hardcodes fee as 3000<br>These requirements force the swap() function to always take the V3 path since the SwapHelpers.swap() implementation using logic in the image This means the V2 fallback path is never taken, potentially leading to failed swaps if:<br>1. The token pair doesn't exist on Uniswap V3<br>2. The V3 pool has insufficient liquidity<br>3. The specified fee tier doesn't exist for the pair<br>

Open the report
MediumIndexFactoryStorage truncates uint256 to uint128 in getAmountOut() leading to potential value lossNex Labs Cross Chain · QuillAudits · 15 Jan 2025Fixed

getAmountOut() accepts a uint256 parameter amountIn but silently truncates it to uint128 when calling estimateAmountOut(), which could lead to incorrect calculations for large token amounts. In IndexFactoryStorage.sol, the getAmountOut() function is used to calculate expected output amounts for token swaps and is a critical component for determining portfolio balances. This truncation could lead to incorrect calculations if the input amount exceeds type(uint128).max, particularly when calculating large portfolio balances through getPortfolioBalance().

Open the report
MediumMissing ‘disableInitializers` in Proxy Upgradable Contract ConstructorsNex Labs Stock Index · QuillAudits · 15 Jan 2025Fixed

The failure to disable initializers at the constructor level of the proxy upgradeable contract raises concern as it is susceptible to exploit. This oversight presents the potential of attackers initializing the implementation contract itself.

Open the report
MediumMissing ‘disableInitializers` in Proxy Upgradable Contract ConstructorsNex Labs DeFi Indices · QuillAudits · 15 Jan 2025Fixed

The failure to disable initializers at the constructor level of the proxy upgradeable contract raises<br>concern as it is susceptible to exploit. This oversight presents the potential of attackers initializing<br>the implementation contract itself.

Open the report
MediumMissing ‘disableInitializers` in Proxy Upgradable Contract ConstructorsNex Labs Cross Chain · QuillAudits · 15 Jan 2025Fixed

The failure to disable initializers at the constructor level of the proxy upgradeable contract raises concern as it is susceptible to exploit. This oversight presents the potential of attackers initializing the implementation contract itself.

Open the report
MediumMissing whenNotPaused Modifier on critical entry pointsNex Labs DeFi Indices · QuillAudits · 15 Jan 2025Fixed

These contracts implement the pausable functionality that prevents users from calling important en try points in time of emergency. In the IndexFactory, the internal functions (_pause and _unpause) of the Pausable contract were appropriately invoked and the external functions had onlyOwner modifier. However, the implementation is incomplete as the “whenNotPaused” modifier was not attached to any critical functions. This implies that in time of emergency when the admin calls the pause function, the activity of the contract does not exactly pause. Users will proceed with their activity

Open the report
MediumMissing whenNotPaused Modifier on critical entry pointsNex Labs Cross Chain · QuillAudits · 15 Jan 2025Fixed

These contracts implement the pausable functionality that prevents users from calling important en try points in time of emergency. In the IndexFactory, the internal functions (_pause and _unpause) of the Pausable contract were appropriately invoked and the external functions had onlyOwner modifier. However, the implementation is incomplete as the “whenNotPaused” modifier was not attached to any critical functions. This implies that in time of emergency when the admin calls the pause function, the activity of the contract does not exactly pause. Users will proceed with their activity

Open the report
Show 10 more
MediumOwner can mint tokens above the supply ceiling as this check does not exist in mintToFeeReceiver()Nex Labs Stock Index · QuillAudits · 15 Jan 2025Fixed

The mint function of the IndexToken contract has 5 require statements to check for address validity and the supply cap being less or equal to the supplyCeiling, however mintToFeeReceiver() function does not have a similar check for token supply minted. This would make the owner able to mint new tokens above the supplyCeiling set and also cause a DOS the next time an address with MINTER role calls mint() because totalSupply() + amount would already have exceeded the supplyCeiling. require(totalSupply() + amount <= supplyCeiling, "will exceed supply ceiling"); If the owner address gets hijacked at any point, the compromised account would be able to mint new tokens without any restrictions leading to economic loss for legitimate users of the protocol

Open the report
MediumOwner can mint tokens above the supply ceiling as this check does not exist in mintToFeeReceiver()Nex Labs DeFi Indices · QuillAudits · 15 Jan 2025Fixed

The mint function of the IndexToken contract has 5 require statements to check for address validity and the supply cap being less or equal to the supplyCeiling, however mintToFeeReceiver() function does not have a similar check for token supply minted. This would make the owner able to mint new tokens above the supplyCeiling set and also cause a DOS the next time an address with MINTER role calls mint() because totalSupply() + amount would already have exceeded the supplyCeiling. If the owner address gets hijacked at any point, the compromised account would be able to mint new tokens without any restrictions leading to economic loss for legitimate users of the protocol.

Open the report
MediumSandwich attack possibilityNex Labs DeFi Indices · QuillAudits · 15 Jan 2025Fixed

It was noticed that the minAmountOut is set to zero during interactions with the AMM router (Uniswap) for swaps. These parameters are intended to protect against slippage; setting them to zero exposes transactions to slippage, potentially resulting in receiving or adding smaller amounts than intended.

Open the report
MediumSandwich attack possibilityNex Labs Cross Chain · QuillAudits · 15 Jan 2025Fixed

It was noticed that the minAmountOut is set to zero during interactions with the AMM router (Uniswap) for swaps. These parameters are intended to protect against slippage; setting them to zero exposes transactions to slippage, potentially resulting in receiving or adding smaller amounts than intended.

Open the report
MediumswapV2 will always revert for ordinary tokens that have no fee-on-transferNex Labs DeFi Indices · QuillAudits · 15 Jan 2025Fixed

Identical to swapExactTokensForTokens, but succeeds for tokens that take a fee on transfer - <a href="https://docs.uniswap.org/contracts/v2/reference/smart-contracts/router-02#swapexacttokens" target="_blank">https://docs.uniswap.org/contracts/v2/reference/smart-contracts/router-02#swapexacttokens</a> fortokenssupportingfeeontransfertokens

Open the report
MediumswapV2 will always revert for ordinary tokens that have no fee-on-transfer.Nex Labs Cross Chain · QuillAudits · 15 Jan 2025Fixed

Identical to swapExactTokensForTokens, but succeeds for tokens that take a fee on transfer <a href="https://docs.uniswap.org/contracts/v2/reference/smart-contracts/router-02#swapexacttokensfor" target="_blank">https://docs.uniswap.org/contracts/v2/reference/smart-contracts/router-02#swapexacttokensfor</a> tokenssupportingfeeontransfertokens

Open the report
MediumValidate that incoming Chainlink price data is not staleNex Labs Stock Index · QuillAudits · 15 Jan 2025Fixed

The Index smart contract integrates Chainlink oracle for price derivation. However, when it fetches the price of a token, it fails to check that the price value is not stale as it is possible for an attacker to manipulate this.

Open the report
MediumValidate that incoming Chainlink price data is not staleNex Labs DeFi Indices · QuillAudits · 15 Jan 2025Fixed

The Index smart contract integrates Chainlink oracle for price derivation. However, when it fetches the price of a token, it fails to check that the price value is not stale as it is possible for an attacker to manipulate this

Open the report
MediumValidate that incoming Chainlink price data is not staleNex Labs Cross Chain · QuillAudits · 15 Jan 2025Fixed

The Index smart contract integrates Chainlink oracle for price derivation. However, when it fetches the price of a token, it fails to check that the price value is not stale as it is possible for an attacker to manipulate this.

Open the report
Mediumwner can mint tokens above the supply ceiling as this check does not exist in mintToFeeReceiver()Nex Labs Cross Chain · QuillAudits · 15 Jan 2025Fixed

The mint function of the IndexToken contract has 5 require statements to check for address validity and the supply cap being less or equal to the supplyCeiling, however mintToFeeReceiver() function does not have a similar check for token supply minted. This would make the owner able to mint new tokens above the supplyCeiling set and also cause a DOS the next time an address with MINTER role calls mint() because totalSupply() + amount would already have exceeded the supplyCeiling. require(totalSupply() + amount <= supplyCeiling, "will exceed supply ceiling"); If the owner address gets hijacked at any point, the compromised account would be able to mint new tokens without any restrictions leading to economic loss for legitimate users of the protocol.

Open the report
Show 10 more
LowArray length mismatch in setWrappedDShareAd dresses() and setPriceFeedAddress() can cause is suesNex Labs Stock Index · QuillAudits · 15 Jan 2025Fixed

In contract IndexFactoryStorage you can see that there are 2 functions, setWrappedDShareAd dresses() and setPriceFeedAddresses(). In both they are checking dShares array with wrapped DShares and priceFeedAddress array. Even though they are called by the owner and the owner is trusted and won’t make a mistake still, say the owner called setWappedDShareAddresses with 10 addresses in both arrays and in setPriceFeedAddresses you just called with 9. And for the last one if while buying/selling if the price feed is not available then it might fail/revert until they are set correctly again. Also there are chances of messing the order of the priceFeed or wrappedDshares.

Open the report
LowCrosschain fee parameter is unused in issuance and redemption functionsNex Labs Cross Chain · QuillAudits · 15 Jan 2025Fixed

The _crossChainFee parameter in issuanceIndexTokens() and redemption() functions is accepted but never used in the actual fee calculations or token transfers, making it a redundant parameter that could mislead users and integrators. Although it doesn't affect the security or functionality of the contract, it creates confusion for users who may expect cross-chain fees to be charged when they are not. This could lead to integration issues or user confusion.

Open the report
LowExcess ETH will be stuckNex Labs Cross Chain · QuillAudits · 15 Jan 2025Fixed

Users are allowed to pass in any amount of ETH via msg.value which could be much greater than the needed input amount, and when this happens there would be no way to process a refund

Open the report
LowExcess ETH will be stuck in the IndexFactoryNex Labs DeFi Indices · QuillAudits · 15 Jan 2025Fixed

Users are allowed to pass in any amount of ETH via msg.value which could be much greater than the needed input amount, and when this happens there would be no way to process a refund.

Open the report
LowInitialize does not invoke the ReentrancyGuard_init()Nex Labs Stock Index · QuillAudits · 15 Jan 2025Fixed

It is expected that initialize functions get invoked before normal contract interactions begin to ensure the contract state is as expected. The initialize functions in the contracts listed above do not call ReentrancyGuard’s init function and could lead to potential inconsistencies in state if the codeblock contains instructions to set up the contract state.

Open the report
LowMinting tokens to the feeReceiver becomes very ex pensive if not done frequentlyNex Labs Stock Index · QuillAudits · 15 Jan 2025Fixed

The current arithmetic implementation for minting tokens to the fee receiver is heavily gas intensive because it performs the arithmetic for compounding with a loop. This would become considerably expensive when the number of days grows to a large number. With current tests, it costs ~500k gas units to call this function when 300 days have passed from the initial feeTimestamp value. Conversely, using a logarithmic approximation for compounding is just as precise with ~80% gas savings

Open the report
LowMinting tokens to the feeReceiver becomes very ex pensive if not done frequentlyNex Labs DeFi Indices · QuillAudits · 15 Jan 2025Fixed

The current arithmetic implementation for minting tokens to the fee receiver is heavily gas intensive because it performs the arithmetic for compounding with a loop. This would become considerably expensive when the number of days grows to a large number. With current tests, it costs ~500k gas units to call this function when 300 days have passed from the initial feeTimestamp value. Conversely, using a logarithmic approximation for compounding is just as precise with ~80% gas savings

Open the report
LowMinting tokens to the feeReceiver becomes very expensive if not done frequentlyNex Labs Cross Chain · QuillAudits · 15 Jan 2025Fixed

The current arithmetic implementation for minting tokens to the fee receiver is heavily gas intensive because it performs the arithmetic for compounding with a loop. This would become considerably expensive when the number of days grows to a large number. With current tests, it costs ~500k gas units to call this function when 300 days have passed from the initial feeTimestamp value. Conversely, using a logarithmic approximation for compounding is just as precise with ~80% gas savings

Open the report
LowOwner is allowed to mint tokens to the feeReceiver even when the contract is pausedNex Labs Stock Index · QuillAudits · 15 Jan 2025Fixed

The functionality of the pausable contract does not apply to the mintToFeeReceiver function and allows for the owner to continue token minting to the fee receiver while the contract is paused.

Open the report
LowOwner is allowed to mint tokens to the feeReceiver even when the contract is pausedNex Labs DeFi Indices · QuillAudits · 15 Jan 2025Fixed

The functionality of the pausable contract does not apply to the mintToFeeReceiver function and allows for the owner to continue token minting to the fee receiver while the contract is paused.

Open the report
Show 10 more
Lowreceive() function causes inconsistency across multiple contractsNex Labs DeFi Indices · QuillAudits · 15 Jan 2025Fixed

The in-line documentation of the IndexFactory states that users would not be able to pass in external funds via the receive() function but the code implementation in receive() allows for ETH to be sent into the contract without interacting with a payable function. Whereas, the IndexFactoryBalancer contract cannot receive ether which renders the withdraw func tion useless as no other function is marked payable to allow ETH deposits. The withdraw function cannot be called since no ether enters the contract.

Open the report
Lowreceive() function causes inconsistency across multiple contractsNex Labs Cross Chain · QuillAudits · 15 Jan 2025Fixed

The in-line documentation of the IndexFactory states that users would not be able to pass in external funds via the receive() function but the code implementation in receive() allows for ETH to be sent into the contract without interacting with a payable function. Whereas, the IndexFactoryBalancer contract cannot receive ether which renders the withdraw func tion useless as no other function is marked payable to allow ETH deposits. The withdraw function cannot be called since no ether enters the contract.

Open the report
LowRemove commented lines of codeNex Labs Stock Index · QuillAudits · 15 Jan 2025Fixed

There are a couple of commented lines of code across all contracts. Some were imports which were commented out, some were functions

Open the report
LowsetFeeRate requires more time than 12 hours to reset fee rateNex Labs Stock Index · QuillAudits · 15 Jan 2025Fixed

The setFeeRate is conditioned to be called after 12 hours from the last time of update. After 12 hours and 59 minutes, it’s impossible to reset the fee rate until 13 hours.

Open the report
LowsetFeeRate requires more time than 12 hours to reset fee rateNex Labs DeFi Indices · QuillAudits · 15 Jan 2025Fixed

The setFeeRate is conditioned to be called after 12 hours from the last time of update. After 12 hours<br>and 59 minutes, it’s impossible to reset the fee rate until 13 hours.

Open the report
LowsetFeeRate requires more time than 12 hours to reset fee rateNex Labs Cross Chain · QuillAudits · 15 Jan 2025Fixed

The setFeeRate is conditioned to be called after 12 hours from the last time of update. After 12 hours and 59 minutes, it’s impossible to reset the fee rate until 13 hours.

Open the report
LowUnused state variables and functionsNex Labs DeFi Indices · QuillAudits · 15 Jan 2025Fixed

There are mock functions that appear to be used only for testing functionality within the contract because they fill storage variables with dummy data, and can be used as view/pure functions that do not directly affect any other functions

Open the report
LowUnused state variables and functionsNex Labs Cross Chain · QuillAudits · 15 Jan 2025Fixed

In the codebase, Some Variables,functions and Imports are not used<br>

Open the report
LowUse safeTransferLib for safety transfer of tokensNex Labs Stock Index · QuillAudits · 15 Jan 2025Fixed

With the use of safeTransferLib, there is assurance of safety transfer of tokens.<br>

Open the report
LowUse safeTransferLib for safety transfer of tokensNex Labs DeFi Indices · QuillAudits · 15 Jan 2025Fixed

With the use of safeTransferLib, there is assurance of safety of transfer of tokens.

Open the report
Show 1 more
LowUse the DRY principle to minimize the repetition of codeNex Labs Stock Index · QuillAudits · 15 Jan 2025Fixed

There’s a function called calculateFees where it gets the flat fee and percentage fee rate and then accumulates the overall fees. Similar implementation is present in the requestBuyOrder and requestBuyOrderFromCurrentBalance. Rather than replicating these logics in both functions, call the calculateFees in its place to avoid code repetition.

Open the report

Contracts

No deployed address is recorded for these audits.

The reports name a repository or files. Open a report to see its scope.

The repositories and files the reports name

Show this on your site

Is this your project? Show this record on your own website. The label states what the record holds, links to this page and updates by itself. It is free and needs no sign-in.

Content

Facts

Automatic: the three strongest facts of this project’s own record (its last audit and two more), highlighted. They update with the record. Picking a fact turns Automatic off.

Fixed as
Language

Style

Layout
Theme
Accent
Corners

Format

Size
Date
Embed as
HTML
<head>
<script src="https://widget.trustblock.run/project-widget.min.js" defer></script>
</head>
<body>
<div
data-tb-project-widget
data-tb-project-slug="nex-labs-cross-chain"
></div>
</body>

Paste the code where the label should appear. It uses no API credit and updates by itself.

Something wrong on this page? A missing report, a wrong date, a finding that was fixed since. Tell us and we check it against its source.

Tell us