F-2025-0011·signature-replay

Potential cross-chain and cross-contract replay attack on future deployments

Acknowledgednftstakingeip-712
TL;DR

The mint() signature payload omits address(this) and chainid, so signatures are theoretically replayable across other deployments or chains if the verifier and logic are mirrored.

Severity
INFO
Impact
LOW
Likelihood
LOW
Method
MManual review
CAT.
Complexity
MEDIUM
Exploitability
LOW
02Section · Description

Description

The current signature used in the mint() function is built as follows:

solidity
bytes32 structHash = keccak256(abi.encode(MINT_INFO_TYPEHASH, to_, value_, stakingPool_));
bytes32 hash = _hashTypedDataV4(structHash);
require(SignatureChecker.isValidSignatureNow($._verifier, hash, signature_), "Invalid signature");

This structure does not include the contract address (address(this)) nor the chainId in the signed data. As a result, signatures valid in one deployment or network could potentially be replayed in another, assuming the verifier and logic are replicated.

While the current risk is informational (the team has confirmed there are no plans for cross-chain or multi-instance deployments), it represents a potential vector for future replay attacks.

03Section · Recommendation

Recommendation

Include contract address and block.chainid in the signed data.

F-2025-0011

oog
zealynx

Smart Contract Security Digest

Monthly exploit breakdowns, audit checklists, and DeFi security research — straight to your inbox

© 2026 Zealynx