Skip to content

New Release#554

Merged
emmanuelm41 merged 7 commits into
mainfrom
dev
May 19, 2026
Merged

New Release#554
emmanuelm41 merged 7 commits into
mainfrom
dev

Conversation

@emmanuelm41

@emmanuelm41 emmanuelm41 commented May 19, 2026

Copy link
Copy Markdown
Member

Summary

Release-cut from dev to main for the v1.36.0 / NV28 (FireHorse) cycle. 7 commits on dev not yet on main:

Core release work

# Title
#545 Support lotus v1.36.0-rc1 + NV28 (FireHorse)
#546 fix: bump rosetta-filecoin-lib to v1.3600.0-rc1 (NV28 actor CIDs)
#553 feat: lotus v1.36.0 stable + promote V28 to LatestMainnetVersion

Dependency bumps swept in

# Bump
#547 go-resty/resty/v2 2.16.5 → 2.17.2
#548 klauspost/compress 1.18.4 → 1.18.6
#549 zondax/golem 0.29.0 → 0.30.0
#550 spf13/cobra 1.10.1 → 1.10.2

(Other dependabot PRs not included: #544 otel and #552 ipld-prime target main directly with separate lifecycle.)

What lands

  • Lotus v1.34.1 → v1.36.0 (skipping v1.35; rc1 cycle landed on dev along the way)
  • rosetta-filecoin-lib v1.3401.0 → v1.3600.0 (matching lockstep tag for NV28 actor CIDs)
  • NV28 (FireHorse) support across all 16 actors — three new FRC-42 miner methods (GenerateSectorLocationExported, ValidateSectorStatusExported, GetNominalSectorExpirationExported), all properly wired per the project's per-version dispatch convention, primitive-CBOR wrappers where needed
  • LatestMainnetVersion: V27 → V28 — mainnet upgrade epoch 6052800 / 2026-05-27T14:00:00Z confirmed
  • LatestCalibrationVersion: V27 → V28 — calibration activated at epoch 3694534 (already live)
  • bytedance/sonic v1.14.1 → v1.15.1 — Go 1.25 compat (superseded dependabot chore(deps): bump github.com/bytedance/sonic from 1.14.1 to 1.15.1 #551)
  • V28 calibration regression fixture at height 3727000 — real v18 builtin-actor traffic post-activation
  • 4 minor dependency bumps (resty, compress, golem, cobra) listed above

StateCompute / execution-trace surface audit (skill Step 0.6)

Verified clean for v1.34.1 → v1.36.0:

  • api.ComputeStateOutput, types.ExecutionTrace, types.MessageReceipt, types.ActorEvent, ethtypes.EthLog, ethtypes.EthFilterSpecno shape changes, existing S3 cache artifacts (traces_<H>.json.s2, tipset_<H>.json.s2, ethlog_<H>.json.s2, nativelog_<H>.json.s2) remain parseable
  • EthGetMessageCidByTransactionHash — signature unchanged
  • Additive changes only: new FinalityStatus type, new UpgradeFireHorseHeight field on ForkUpgradeParams, new EthSyncingResult.UnmarshalJSON method, new nil-Ticket validation in NewTipSet

No parser/v2/types/compute_state_v36.go migration needed; existing compute_state_v23.go covers the new lotus version.

CI state

All checks pass except tests, which fails in TestParser_ParseTransactions/parser_with_traces_from_v1_and_the_corner_case_of_duplicated_fees_with_level_0 with:

panic: Rosetta lib should not be nil

This is the documented bridge-period symptom: the test case bootstraps rosetta-lib against a mainnet endpoint, and mainnet returns unsupported network version 28 because it hasn't activated yet (epoch 6052800, in ~8 days). The rosetta-lib loader treats per-version errors as a hard load failure, so the lib is nil. NOT a parser-side bug — the durable fix lives in rosetta-lib (loadActorCids should skip-and-warn on per-NV errors). Resolves naturally on 2026-05-27 when mainnet activates V28.

After merge

Tag v4.3600.0 + GH release.

emmanuelm41 and others added 7 commits May 5, 2026 13:09
* feat: add NV28 support for all actors

- Update go-state-types to v0.18.0-dev, lotus to v1.35.0, go-f3 to v0.8.12
- Add V28 version mapping with placeholder heights (UpgradeXxHeight)
- Add v18 builtin-actors imports and method/param entries for all 16 actors
- Add v1.35 to supported node versions
- Regenerate mocks for updated lotus API
- Update CI to Go 1.24.7
- Update version tests for V28 calibration support

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: handle SectorDeals params breaking change

* fix: prevent adding of extra field to params

* fix: use custom struct for v21

* fix: use custom struct for v21

* feat: lotus v1.36.0-rc1 + NV28 (FireHorse) calibnet height

Bumps lotus to v1.36.0-rc1 on top of the NV28 actor work cherry-picked
from #543. Resolves the placeholders left in #543:

- lotus v1.35.0 -> v1.36.0-rc1
- go-state-types v0.18.0-dev -> v0.18.0 (released)
- Go directive 1.24.7 -> 1.25.7 (transitive requirement)
- V28 calibration height: 999999999999999 placeholder -> 3694534
  (real FireHorse activation epoch on calibnet, sourced from
  lotus@v1.36.0-rc1 build/buildconstants/params_calibnet.go)
- V28 mainnet: buildconstants.UpgradeXxHeight (which doesn't exist)
  -> buildconstants.UpgradeFireHorseHeight (real constant; mainnet
  height itself is still TBD and remains a placeholder upstream)
- V28 comment: 'Xx' -> 'FireHorse'
- parser/v2/parser.go: NodeVersionsSupported += 'v1.36'

Build clean, vet clean, non-Redis tests pass locally. CI will exercise
Redis-backed tests via the REDIS_addr secret.

* feat(miner): handle 3 new v18 FRC-42 methods (NV28 / FireHorse)

builtin-actors v18.0.0 added three exported sector-status methods that
PR #543's actor-by-actor scan missed:

- GenerateSectorLocation(SectorNumber) -> (SectorStatusCode, AuxData)
- ValidateSectorStatus(SectorNumber, Status, AuxData) -> bool
- GetNominalSectorExpiration(SectorNumber) -> ChainEpoch

These are FRC-42 dispatched (deterministic method-hash), so they must be
registered in the miner customMethods() map. Without them, V28+ traces
calling these methods would be parsed as 'unknown method'.

Source: actors/miner/src/lib.rs in builtin-actors v18.0.0:
  GenerateSectorLocationExported = frc42_dispatch::method_hash!(...)
  ValidateSectorStatusExported = frc42_dispatch::method_hash!(...)
  GetNominalSectorExpirationExported = frc42_dispatch::method_hash!(...)

Implementation matches the existing per-version dispatch pattern used
by other V_N-introduced methods (e.g. ProveCommitSectors3, V22+):
- params + return maps in actors/v2/miner/params.go (V28-only entry)
- handler resolves via tools.VersionFromHeight(network, height)
- per-version dispatch lets future v19+ variants drop in cleanly

GenerateSectorLocation/ValidateSectorStatus types come from
go-state-types/builtin/v18/miner directly. GetNominalSectorExpiration
takes bare *abi.SectorNumber and returns abi.ChainEpoch (primitives,
not structs); locally-defined wrappers in actors/v2/miner/types/
provide the UnmarshalCBOR surface required by parseGeneric (same
pattern as existing GetSectorSizeReturn, MaxTerminationFee*, etc.).

* ci: bump go to 1.25.7

go.mod was bumped from 1.24.7 -> 1.25.7 by 'go get lotus@v1.36.0-rc1'
in commit cc5a367. CI workflow uses GOTOOLCHAIN=local so the runner
must already have the required Go version installed; container image
pin needs to match too.

* fix(miner): wire new methods through Parse() + TransactionTypes()

The TestABIMethodNumberToMethodName test (actors/v2/actors_test.go:137)
caught two gaps in the prior commit:

1. The 3 new v18 methods (GenerateSectorLocation, ValidateSectorStatus,
   GetNominalSectorExpiration) were registered in customMethods() but
   missing from miner.Parse() switch and miner.TransactionTypes() map.
   Both are required for the actor's full method-resolution surface.

2. Pre-existing bug surfaced: GetBeneficiaryExported has been the
   FRC-42 dispatch name for the GetBeneficiary method since v16
   builtin-actors, but only MethodGetBeneficiary was registered. The
   test was implicitly relying on dispatch never showing the *Exported
   variant — which it always did. Added MethodGetBeneficiaryExported
   constant + Parse() case + TransactionTypes() entry.

Three places to touch when adding/renaming a miner method:
  a. parser/constants.go            — string constant
  b. actors/v2/miner/miner.go       — handler + customMethods (FRC-42)
                                      OR per-version 'methods' map
  c. actors/v2/miner/parse.go       — Parse() switch + TransactionTypes()
The TestABIMethodNumberToMethodName test enforces (c) is in sync with
the methods registered via (b).

* fix(miner): drop V28-only methods from customMethods + ci: golangci-lint v2

Two CI follow-ups after the prior commit:

1. customMethods() registers methods cross-version (V0..V28). Putting
   the v18-only FRC-42 methods (GenerateSectorLocation, etc.) there
   exposed them at V0-V27 too, where our per-version dispatch returns
   ErrUnsupportedHeight, breaking TestVersionCoverage. Removed them —
   they're already in miner18.Methods so V28 picks them up natively.
   Updated Rule C in fil-parser-upgrade skill to match.

   Note: GetBeneficiary / GetBeneficiaryExported still need to be in
   customMethods because v17 and earlier registered the FRC-42 hash
   under name 'GetBeneficiary' (some version maps), and the constant
   was missing entirely until the prior commit. This case is genuinely
   cross-version and stays.

2. golangci-lint v1.64.8 was the last v1.x release and was built with
   Go 1.24, so it errors out on Go 1.25 code:
     can't load config: the Go language version (go1.24) used to build
     golangci-lint is lower than the targeted Go version (1.25.7)
   Bumped Makefile to v2.12.1. v2 changed several things:
     - gofmt is now a formatter, not a linter (can't be -E'd)
     - default linter set widened to include errcheck/govet/staticcheck
     - exclusion via flags removed; config file required
   Added .golangci.yml that restores v1.64.8 behavior (gosec + gocritic
   only, --default=none equivalent) with documented TODOs for the
   ~70 pre-existing issues v2 surfaces (50 goconst cosmetic,
   ~10 staticcheck QF1008, gosec G115/G304 in legacy code).

Verified locally: go test ./... -short, golangci-lint run, both clean
on the modified packages.

* ci: install golangci-lint v2 via 'go install' instead of install.sh

The upstream install.sh script's sha256 checksum verification fails on
v2.12.1 — both local and CI runs hit:
  err hash_sha256_verify checksum for '...golangci-lint-2.12.1-...tar.gz'
  did not verify <expected> vs <actual>

go install builds from source and avoids the checksum mismatch entirely.
Slightly slower in CI but reliable.

---------

Co-authored-by: Eric Mokaya <emagembe@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v4.3600.0-rc1 (NV28 / FireHorse) shipped with rosetta-filecoin-lib
pinned at v1.3401.0, which has LatestVersion = network.Version27. Its
actor CID loader iterates V0..LatestVersion, so V28 actor code CIDs
were never queried from the node. This produced "invalid actor code
CID" errors on calibration once NV28 activated:

  helper/helpers.go:212 - could not get actor cid and name from address
  fil_parser_helper_actor_name_error{code=3844450837} (InvokeContract)
  fil_parser_parser_parse_tx_metadata_error{txType="Constructor"}

rosetta-filecoin-lib v1.3600.0-rc1 (already published) raises
LatestVersion to network.Version28 and pins lotus v1.36.0-rc1. Bumping
the dep fills the registry gap.

go.uber.org/zap also moved 1.27.1 -> 1.28.0 transitively.
* feat: lotus v1.36.0 stable + promote V28 (FireHorse) to LatestMainnetVersion

Promotes the rc1-cycle work (lotus v1.36.0-rc1, V28 plumbing across all
actors, rosetta-lib v1.3600.0-rc1) to stable, and flips
LatestMainnetVersion from V27 to V28 now that the mainnet upgrade epoch
is confirmed at 6052800 (2026-05-27T14:00:00Z).

Changes:
- go.mod / go.sum:
  - github.com/filecoin-project/lotus v1.36.0-rc1 -> v1.36.0
  - github.com/zondax/rosetta-filecoin-lib v1.3600.0-rc1 -> v1.3600.0
  - github.com/bytedance/sonic v1.14.1 -> v1.15.1 (Go 1.25 compat —
    sonic v1.14.1 fails to build under Go 1.25.x with
    `undefined: GoMapIterator`; supersedes dependabot PR #551)
- tools/version_mapping.go:
  - LatestMainnetVersion: V27 -> V28
  - V28 comment: "mainnet: <TBD>" -> "mainnet: 6052800"
- tools/tools_test.go: extend mainnet expectations to include V28 in
  TestGetSupportedVersions, TestVersionIterator ("V1 on mainnet"), and
  TestVersionsAfter (V17..V24 cases).

## What was NOT changed

- V28 entry, supportedVersions list, LatestCalibrationVersion, and all
  16 per-actor V28 wiring already landed in PR #545 + #546 on dev.
- NodeVersionsSupported in parser/v2/parser.go already includes "v1.36".
- No mock regeneration needed — lotus rc1 -> stable diff is 4 commits
  with NO FullNode interface change (verified upstream).
- No CI workflow change — Go directive 1.25.7 unchanged.

## Known bridge-period symptom (not introduced here)

TestParser_ParseTransactions panics with:

  error loading actor cids for version 28: unsupported network version 28
  panic: Rosetta lib should not be nil

This is the structural bridge-period symptom documented in the
fil-parser-upgrade skill (Step 1.1). Once LatestVersion is raised to
V28, the rosetta-lib loader queries StateActorCodeCIDs(V28) against the
upstream node fil-parser talks to. **Mainnet nodes won't return that
CID set until the activation epoch (6052800) passes on 2026-05-27.**
Calibration nodes should already return it.

The lib's loader currently fails the whole load on per-version errors;
the resilient fix is in rosetta-filecoin-lib (skip-and-warn on per-NV
`unsupported network version`). Don't paper over it in fil-parser.

If the test endpoint is configurable, point it at a calibration node
that has reached V28 (calibration height 3694534) until the rosetta-lib
loader is hardened or mainnet activates.

* test: add V28 (FireHorse) calibration regression fixture at height 3727000

Captures live V28 calibration chain data at height 3727000 (~33k blocks
past NV28 activation epoch 3694534) and wires it into the existing
TestParser_ParseEvents_FVM_FromTraceFile table.

The fixture exercises real v18 builtin-actor traffic post-NV28
activation, giving us a regression canary for any future v18 actor
schema changes — same canary role the earlier 3897964 / 3573066 fixtures
play for their respective NVs.

Counts (verified locally with Redis up):
  totalTraces:       35
  totalNativeEvents: 0
  totalEVMEvents:    35  (all 35 events are EVM contract logs; no FVM
                          native events in this tipset)

Fixtures captured via `cmd/tracedl get --height 3727000 --type {traces,
tipset,ethlog,nativelog}` against `node-fil-calibration-stable.zondax.ch`
running `1.36.0+calibnet`. Sizes: traces 413 KiB, others <5 KiB each.

Test uses `calibNextNodeUrl` for the rosetta-lib bootstrap so it gets
the V28 actor CIDs from a V28-active calibration node (avoids the
mainnet bridge-period `unsupported network version 28` panic
documented in #553's PR description).
…547)

Bumps [github.com/go-resty/resty/v2](https://github.com/go-resty/resty) from 2.16.5 to 2.17.2.
- [Release notes](https://github.com/go-resty/resty/releases)
- [Commits](go-resty/resty@v2.16.5...v2.17.2)

---
updated-dependencies:
- dependency-name: github.com/go-resty/resty/v2
  dependency-version: 2.17.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…#548)

Bumps [github.com/klauspost/compress](https://github.com/klauspost/compress) from 1.18.4 to 1.18.6.
- [Release notes](https://github.com/klauspost/compress/releases)
- [Commits](klauspost/compress@v1.18.4...v1.18.6)

---
updated-dependencies:
- dependency-name: github.com/klauspost/compress
  dependency-version: 1.18.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [github.com/zondax/golem](https://github.com/zondax/golem) from 0.29.0 to 0.30.0.
- [Release notes](https://github.com/zondax/golem/releases)
- [Commits](Zondax/golem@v0.29.0...v0.30.0)

---
updated-dependencies:
- dependency-name: github.com/zondax/golem
  dependency-version: 0.30.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [github.com/spf13/cobra](https://github.com/spf13/cobra) from 1.10.1 to 1.10.2.
- [Release notes](https://github.com/spf13/cobra/releases)
- [Commits](spf13/cobra@v1.10.1...v1.10.2)

---
updated-dependencies:
- dependency-name: github.com/spf13/cobra
  dependency-version: 1.10.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
@emmanuelm41
emmanuelm41 merged commit 2953693 into main May 19, 2026
9 of 11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant