# Incorrect checking about order.seed in genius-actions/SolverBase.ts#L59-L62

SolverBase.ts compared a full keccak256 hash against a seed that also encodes a nonce, so every fillOrder with an arbitraryCall reverted, blocking valid orders.

- Payout: Contest reward
- Severity: high
- Program: Genius
- Credited: davidjohn
- Disclosed: 2025-09-04
- Write-up quality: 6/10
- Original: https://cdn.cantina.xyz/reports/cantina_competition_genius_jul2025.pdf#3.1.3
- Library page: https://bugbountylibrary.com/r/cantina%3Agenius_jul2025%3A3.1.3
- Tags: domain:web3 impact:dos kind:contest platform:cantina sev:high tech:solidity technique:source-review vuln:business-logic vuln:dos

**Target:** SolverBase.ts order validation in genius-actions
**Root cause:** calldataToSeedSync returns keccak256(callTarget|callData) but the actual order.seed is bytes16(keccak256(callTarget|callData)) | bytes16(nonce); comparing the full 32 bytes never matches.
**Steps:**
1. Read SolverBase.ts#L59-L62: `GeniusEvmVault.calldataToSeedSync(arbitraryCall.to, arbitraryCall.data) !== order.seed` throws 'Seed does not match'
2. Read genius-evm-vault.ts#L289-L296: calldataToSeedSync hashes callTarget|callData into full bytes32
3. Compare with GeniusVault.t.sol#L795-L818: valid seed = `bytes16(keccak256(callTarget|callData)) | bytes16(nonce)`
4. Submit any fillOrder containing an arbitraryCall with a correctly formed seed; the check reverts
**How found:** Cross-referenced the TS seed comparison against the Solidity seed construction and the test fixture, noticing the nonce half of the seed was omitted in the JS check.
**Insight:** When a client re-implements an on-chain hash/seed check, diff the exact byte layout (truncation, packed nonce suffix) against the contract and its test vectors rather than assuming a plain keccak.
