Skip to content

soldeer migration - #195

Merged
thedavidmeister merged 9 commits into
mainfrom
2026-05-10-soldeer
May 10, 2026
Merged

soldeer migration#195
thedavidmeister merged 9 commits into
mainfrom
2026-05-10-soldeer

Conversation

@thedavidmeister

@thedavidmeisterthedavidmeister commented May 9, 2026

Copy link
Copy Markdown
Contributor

Final leaf in the topo-sort migration. Closes#194.

Dependencies migrated

  • forge-std → forge-std-1.16.1
  • openzeppelin-contracts → @openzeppelin-contracts-5.6.1 (was on commit fcbae539 = "Release v5.5.0"; bumped one patch level to 5.6.1 for stack consistency — rain.math.fixedpoint and rain.string cascade-bumped to 5.6.1 as well)
  • rain.solmem → rain-solmem-0.1.3
  • rain.string → rain-string-0.2.0
  • rain.datacontract → rain-datacontract-0.1.0
  • rain.deploy → rain-deploy-0.1.2
  • rain.sol.codegen → rain-sol-codegen-0.1.0

rain.math.fixedpoint was a phantom submodule — no source file in this repo imports anything from it — so it is dropped along with .gitmodules and lib/.

Source changes

77 .sol files had imports rewritten to soldeer paths. One non-trivial source change: LibFormatDecimalFloat.sol previously called Strings.toStringSigned. In OZ 4.9 the experimental toStringSigned name was removed and the signed variant became Strings.toString(int256). The old submodule pin (5.5.0 SHA fcbae539) had both names available; renaming to the stable name lets us use any modern OZ version.

CI

  • drop submodules: recursive from actions/checkout@v4
  • drop nix develop -c rainix-sol-prelude (deprecated in rainix)
  • add nix develop -c forge soldeer install before each task
  • workflows updated: rainix.yaml, manual-sol-artifacts.yaml, git-clean.yaml, npm-package-release.yaml

Bytecode reproducibility

keccak256(type(DecimalFloat).creationCode) is byte-identical before and after migration:

pre (main, submodules): 0x16927026a751beaebe8b29f3295febca4b2aeb69f1b86dfcaba4fe5a34fbe1d1
post (this branch, soldeer): 0x16927026a751beaebe8b29f3295febca4b2aeb69f1b86dfcaba4fe5a34fbe1d1

Zoltu deterministic deploy address invariant preserved.

Test plan

  • keccak match pre/post
  • forge build clean
  • CI green (sol + rs matrix)
  • manual-sol-artifacts workflow exercised against this branch before merge

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Chores
    • Replaced many git submodules with Soldeer-managed packages; added Soldeer ignore rules and a dependencies ignore entry
    • Pinned dependency versions, added remappings for consistent imports, and updated build/test config and foundry settings
    • Updated CI workflows to install dependencies via Soldeer and simplified repository checkout behavior
  • New Features
    • Added a reusable CI workflow to run Solidity tooling on push

Review Change Stack

Final leaf in the topo-sort. Closes#194.
Dependencies migrated:
- forge-std → forge-std-1.16.1
- openzeppelin-contracts → @openzeppelin-contracts-5.6.1
(SHA fcbae539 of the previous submodule pin == "Release v5.5.0";
bumped to 5.6.1 patch for consistency across the dep stack —
rainlanguage/rain.math.fixedpoint and rainlanguage/rain.string also
bumped to 5.6.1 in cascading PRs to align the entire stack on a
single OZ version)
- rain.solmem → rain-solmem-0.1.3
- rain.string → rain-string-0.2.0
- rain.datacontract → rain-datacontract-0.1.0
- rain.deploy → rain-deploy-0.1.2
- rain.sol.codegen → rain-sol-codegen-0.1.0
`rain.math.fixedpoint` was a phantom submodule — no source file in this
repo imports anything from it — so it is dropped along with .gitmodules
and lib/.
77 .sol files had imports rewritten to soldeer paths. Source-side
changes:
- LibFormatDecimalFloat.sol: `Strings.toStringSigned` → `Strings.toString`.
In OZ 4.9 the experimental `toStringSigned` name was removed and the
signed variant became `Strings.toString(int256)`. The old submodule
pin (5.5.0 SHA fcbae539) had both names available; renaming to the
stable name lets us use any modern OZ version.
CI: drop submodules:recursive, drop sol-prelude, add `forge soldeer
install` before each task. Workflows updated: rainix.yaml,
manual-sol-artifacts.yaml, git-clean.yaml, npm-package-release.yaml.
Bytecode reproducibility check: keccak256(type(DecimalFloat).creationCode)
is **byte-identical** before and after migration:
pre (main, submodules): 0x16927026a751beaebe8b29f3295febca4b2aeb69f1b86dfcaba4fe5a34fbe1d1
post (this branch, soldeer): 0x16927026a751beaebe8b29f3295febca4b2aeb69f1b86dfcaba4fe5a34fbe1d1
Zoltu deterministic deploy address invariant preserved.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@thedavidmeisterthedavidmeister self-assigned this May 9, 2026
@coderabbitai

coderabbitaiBot commented May 9, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

Pull request was closed or merged during review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 94ab76a7-b344-4ec1-af89-c2670c17db14

📥 Commits

Reviewing files that changed from the base of the PR and between 84422f0 and 756a2d1.

📒 Files selected for processing (1)
  • .github/workflows/manual-sol-artifacts.yaml

Walkthrough

This pull request migrates the repository from Git submodules to Soldeer: it removes .gitmodules entries, adds versioned dependency configuration and remappings, updates CI to run forge soldeer install, and repins imports across build scripts, source, and tests.

Changes

Soldeer Dependency Management Migration

Layer / File(s)Summary
Dependency Configuration
.gitmodules, foundry.toml, remappings.txt, .gitignore, .soldeerignore, REUSE.toml
Remove git submodule entries; change Foundry libs to dependencies; add [dependencies] and [soldeer] config; create remappings.txt and .soldeerignore; update REUSE paths.
Submodule Pointer Updates
lib/forge-std, lib/rain.datacontract, lib/rain.deploy, lib/rain.math.fixedpoint, lib/rain.sol.codegen, lib/rain.string
Update or remove recorded git submodule commit pointers as part of transitioning dependencies to Soldeer-managed packages.
CI Workflow Integration
.github/workflows/git-clean.yaml, .github/workflows/manual-sol-artifacts.yaml, .github/workflows/npm-package-release.yaml, .github/workflows/rainix.yaml, .github/workflows/rainix-sol.yaml
Drop submodules: recursive from checkout steps; add nix develop -c forge soldeer install steps; add rainix-sol reusable workflow; preserve release gating logic while adjusting build steps.
Build Script Imports
script/BuildPointers.sol, script/Deploy.sol
Update Solidity imports to reference version-pinned packages (forge-std-1.16.1, rain-sol-codegen-0.1.0, rain-datacontract-0.1.0, rain-deploy-0.1.2).
Source Code Library Imports
src/lib/format/LibFormatDecimalFloat.sol, src/lib/parse/LibParseDecimalFloat.sol
Retarget OpenZeppelin and rain-string imports to versioned package paths (e.g., @openzeppelin-contracts-5.6.1, rain-string-0.2.0).
Test Infrastructure
test/abstract/LogTest.sol, test/src/lib/deploy/LibDecimalFloatDeploy.t.sol, test/src/lib/deploy/LibDecimalFloatDeployProd.t.sol
Update test base imports and deploy test fork configuration to use versioned packages and ARBITRUM_RPC_URL where applicable.
Concrete & Library Test Imports
many test/concrete/*, test/src/concrete/*, test/src/lib/* files
Bulk update numerous test files to import forge-std-1.16.1/src/Test.sol and other versioned package paths (homogeneous refactor across tests).
Implementation & Specialized Tests
test/src/lib/implementation/*, test/src/lib/format/*, test/src/lib/parse/*, test/src/lib/table/*
Update implementation, format, parse, table, and deploy-related tests to use pinned package imports and updated RPC/fork env vars.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

Possibly related PRs

Suggested reviewers

  • hardyjosh
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check nameStatusExplanationResolution
Title check❓ InconclusiveThe title 'soldeer migration' is generic and vague, lacking specificity about the scope and main change despite a comprehensive, multi-file dependency system overhaul.Clarify the title to describe the primary change more specifically, such as 'Migrate dependency management from git submodules to soldeer' or 'Replace git submodules with soldeer for dependency management'.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check✅ PassedThe PR fully implements the core objectives from issue #194: removes git submodules and .gitmodules, adopts soldeer with versioned dependencies in foundry.toml, updates 77 import paths across source and test files, adds 'forge soldeer install' to CI workflows, removes recursive submodule checkout, preserves bytecode reproducibility, and migrates all specified dependencies to published semver versions.
Out of Scope Changes check✅ PassedAll changes are directly scoped to the soldeer migration objectives: dependency management updates, import path rewrites, CI workflow adjustments, and one functional fix (Strings API update). No unrelated changes detected.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 2026-05-10-soldeer

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

thedavidmeisterand others added 8 commits May 10, 2026 01:25
…s the experimental name)
Stale out/ artifacts hid the compile error in the previous push. OZ
5.6.1 has Strings.toString(uint256) and Strings.toStringSigned(int256)
- the int256 overload of toString was never added on this branch, so
the rename was wrong.
Verified: keccak256(type(DecimalFloat).creationCode) still matches main
pre-migration: 0x16927026a751beaebe8b29f3295febca4b2aeb69f1b86dfcaba4fe5a34fbe1d1.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…atrix on default
Sol tasks now run through rainix-sol.yaml composite which dispatches
static/legal/test on sol-shell. Rust + wasm tasks stay on the matrix
workflow with the heavy default shell.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Left over from a sed -i.bak version-bump iteration during the
soldeer migration.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The rainix-sol-test reusable workflow exposes ARBITRUM_RPC_URL but not
CI_FORK_ETH_RPC_URL. The Zoltu factory is at the same address on every
supported chain, so the deployment-address invariant is testable on
any of them. Pinned to a recent Arbitrum block (~head minus 1.25M).
Also updates foundry.toml [rpc_endpoints] to read the rainix-standard
*_RPC_URL names instead of the bespoke CI_DEPLOY_*_RPC_URL ones, so
testProdDeployment* fork tests work under the reusable.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…cts via alloy::sol!)
Removing rainix-sol-prelude lost the implicit forge-build step that
populated out/*.json. The rust crates use alloy::sol!
include_path which canonicalises out/<name>.sol/<name>.json at compile
time and fails if the artifact is missing.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…in setUp
Forking just to materialize the Zoltu factory was always overkill.
LibRainDeploy.etchZoltuFactory uses vm.etch to put the factory
bytecode at its deterministic address — no RPC, no flake risk, and
no 'address already has code' collision when the prod deploy is
already at the target slot on the chosen chain.
Removes the FORK_BLOCK_NUMBER bump churn entirely.
Verified: 4/4 deploy tests pass locally.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…K secrets set
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ndpoints]
foundry.toml [rpc_endpoints] now reads ARBITRUM_RPC_URL etc. (the
rainix-standard names), but this workflow was still exporting the old
CI_DEPLOY_*_RPC_URL names. Foundry would have read empty strings on
manual deploy.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@thedavidmeister
thedavidmeister merged commit e8ae8ae into mainMay 10, 2026
8 of 9 checks passed
@github-actions

Copy link
Copy Markdown

@coderabbitai assess this PR size classification for the totality of the PR with the following criterias and report it in your comment:

S/M/L PR Classification Guidelines:

This guide helps classify merged pull requests by effort and complexity rather than just line count. The goal is to assess the difficulty and scope of changes after they have been completed.

Small (S)

Characteristics:

  • Simple bug fixes, typos, or minor refactoring
  • Single-purpose changes affecting 1-2 files
  • Documentation updates
  • Configuration tweaks
  • Changes that require minimal context to review

Review Effort: Would have taken 5-10 minutes

Examples:

  • Fix typo in variable name
  • Update README with new instructions
  • Adjust configuration values
  • Simple one-line bug fixes
  • Import statement cleanup

Medium (M)

Characteristics:

  • Feature additions or enhancements
  • Refactoring that touches multiple files but maintains existing behavior
  • Breaking changes with backward compatibility
  • Changes requiring some domain knowledge to review

Review Effort: Would have taken 15-30 minutes

Examples:

  • Add new feature or component
  • Refactor common utility functions
  • Update dependencies with minor breaking changes
  • Add new component with tests
  • Performance optimizations
  • More complex bug fixes

Large (L)

Characteristics:

  • Major feature implementations
  • Breaking changes or API redesigns
  • Complex refactoring across multiple modules
  • New architectural patterns or significant design changes
  • Changes requiring deep context and multiple review rounds

Review Effort: Would have taken 45+ minutes

Examples:

  • Complete new feature with frontend/backend changes
  • Protocol upgrades or breaking changes
  • Major architectural refactoring
  • Framework or technology upgrades

Additional Factors to Consider

When deciding between sizes, also consider:

  • Test coverage impact: More comprehensive test changes lean toward larger classification
  • Risk level: Changes to critical systems bump up a size category
  • Team familiarity: Novel patterns or technologies increase complexity

Notes:

  • the assessment must be for the totality of the PR, that means comparing the base branch to the last commit of the PR
  • the assessment output must be exactly one of: S, M or L (single-line comment) in format of: SIZE={S/M/L}
  • do not include any additional text, only the size classification
  • your assessment comment must not include tips or additional sections
  • do NOT tag me or anyone else on your comment

@coderabbitai

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

SIZE=L

Sign up for freeto 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.

Migrate dependency management from git submodules to soldeer

1 participant

@thedavidmeister