Describe the bug
StateManager::call_raw evaluates messages on tipset.parent_state() without running cron or migrations for epochs between the parent and target tipset. In cases with upgrade boundaries in that gap, RPC calls (StateCall / eth_call) can return incorrect results because the correct state requires fork logic that isn’t applied in the call path.
To reproduce
- Start Forest on a chain that includes an upgrade boundary.
- Pick a tipset where
parent_epoch < upgrade_epoch <= tipset_epoch.
- Run a call at that tipset (
Filecoin.StateCall or eth_call).
- Compare the result against full chain execution (or Lotus, which runs fork logic in
CallInternal).
Other information and links
#3733: https://github.com/filecoin-project/lotus/blob/0b0d7c96df590ab6ac2db3fb975a112a9a220199/chain/stmgr/call.go#L74C1-L267
Describe the bug
StateManager::call_rawevaluates messages ontipset.parent_state()without running cron or migrations for epochs between the parent and target tipset. In cases with upgrade boundaries in that gap, RPC calls (StateCall/eth_call) can return incorrect results because the correct state requires fork logic that isn’t applied in the call path.To reproduce
parent_epoch < upgrade_epoch <= tipset_epoch.Filecoin.StateCalloreth_call).CallInternal).Other information and links
#3733: https://github.com/filecoin-project/lotus/blob/0b0d7c96df590ab6ac2db3fb975a112a9a220199/chain/stmgr/call.go#L74C1-L267