Early rate$2,400 of senior audit time for $500. Early members keep the rate as it climbs.$2,400 of senior audit time for $500See how
F-2026-0021·permissionless-state-overwrite

feeCollector silently overwritten by arbitrary user

Fixedbridgecross-chainkey-registrygithub.com/pdxwebdev/yadakeyeventwallet
TL;DR

rotateToPublicKey is permissionless and resets feeCollector to the owner's pre-committed address on every call, so any user can unwind a previous setFeeCollector configuration without gaining funds.

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

Description

rotateToPublicKey (line 755): Sets feeCollector = latest.prerotatedKeyHash before calling transferOwnership. This function is permissionless, anyone can call it with the owner's public key (readable from on-chain events). However, the rotation always goes to the owner's pre-committed prerotatedKeyHash, so no unauthorized party gains control.

If the owner uses setFeeCollector to route fees to a separate cold wallet or multisig, any subsequent key rotation (or an arbitrary user calling rotateToPublicKey) resets feeCollector to the new owner address.

03Section · Recommendation

Recommendation

  • Restrict rotateToPublicKey with onlyOwner modifier.
  • Or make feeCollector to be controlled only by setFeeCollector.

Also adding require(exists, "Key log not initialized") would make an explicit revert rather than depending on downstream revert in transferOwnership(latest.prerotatedKeyHash);.

04Section · Resolution

Resolution

YadaCoin, Confirmed.

Zealynx, Fixed.

Status
Fixed
F-2026-0021