Skip to content

ci: Add live validators#805

Open
wischli wants to merge 1 commit intomainfrom
tests_live-validators
Open

ci: Add live validators#805
wischli wants to merge 1 commit intomainfrom
tests_live-validators

Conversation

@wischli
Copy link
Copy Markdown
Contributor

@wischli wischli commented Mar 18, 2026

Merge strategy

This PR targets main for review purposes. Once approved, only the weekly-validation.yml CI workflow should be merged into main. The validator and investment flow test code should be pushed to the separate live-validators branch, which is pinned to the latest deployed version and runs on a weekly schedule. This keeps main free of fork test code that is tightly coupled to the currently deployed contracts. Which was an issue we discussed in the past.

Product requirements

  • Replace monolithic ForkTestLiveValidation.sol (1805 lines) with modular validator architecture: One validator per concern, indexer-driven, zero hardcoded addresses
  • Add investment flow fork tests exercising full deposit/redeem cycles on all live vaults across all networks (async, cross-chain async, sync deposit)
  • Detect VaultRegistry routing corruption from the unlinkVault bug (ref)

Design notes

  • Validators are independent BaseValidator subclasses, each querying the GraphQL indexer for its data. Adding a validator = one file + one array entry in LiveValidationForkTest.
  • InvestmentFlowExecutor handles local async, cross-chain async, and cross-chain sync deposit flows with shared redeem logic.
  • weekly-validation.yml on main checks out the live-validators branch on a Monday schedule via GCP-authed fork tests across 9 networks.

Notes

  • There are expected validation failures based on live misconfiguration (ref1, ref2)

@wischli wischli self-assigned this Mar 18, 2026
@wischli wischli marked this pull request as ready for review March 19, 2026 08:58
@wischli wischli requested review from lemunozm and onnovisser March 19, 2026 08:58
Copy link
Copy Markdown
Contributor

@lemunozm lemunozm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some NITs, but I need to tell you this refactor is awesome!! Much more legible and organized. Really awesome 🙌🏻

Comment thread test/integration/fork/validators/Validate_FileConfigurations.sol Outdated
Comment on lines +38 to +43
if (c.vaultRegistry != address(0)) {
_checkWard(c.vaultRegistry, c.messageDispatcher, "vaultRegistry <- messageDispatcher");
}
if (c.hubHandler != address(0)) {
_checkWard(c.hubHandler, c.messageDispatcher, "hubHandler <- messageDispatcher");
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In which case, vaultRegister or hubHandler will be 0? I think never can happen, and if happens, it should be an error. Same for other checks in this file

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You are right. Will remove the if != address(0) guards since _checkWard` already handles zero addresses gracefully. I would keep the guards for adapter checks though since these cannot be assumed to be deployed on all networks.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fine for those!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe for the adapters we could read the EnvConfig, and perform the exact check in each chain. Just an idea we don't need to implement now

Comment thread test/integration/fork/validators/Validate_AdapterConfigurations.sol Outdated
Comment thread test/integration/fork/InvestmentFlowForkTest.t.sol Outdated
Comment thread test/integration/fork/LiveValidationForkTest.t.sol Outdated
@wischli wischli added type:feature New functionality type:test Test additions or fixes, no contract changes scope:tooling Read-only scripts, dev helpers — no state mutation and removed 🧑‍💻 new feat type:feature New functionality labels Apr 8, 2026
lemunozm
lemunozm previously approved these changes Apr 9, 2026
Copy link
Copy Markdown
Contributor

@lemunozm lemunozm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All changes look good! Just seems the NETWORK env var is not accesible 🤔

@wischli
Copy link
Copy Markdown
Contributor Author

wischli commented Apr 13, 2026

All changes look good! Just seems the NETWORK env var is not accesible 🤔

Good catch! Should be fixed in 9ef021e

@wischli wischli requested a review from lemunozm April 13, 2026 15:25
lemunozm
lemunozm previously approved these changes Apr 13, 2026
Copy link
Copy Markdown
Contributor

@lemunozm lemunozm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Once approved, only the weekly-validation.yml CI workflow should be merged into main

Just one point. How do you want to merge this PR based on the above?

@wischli
Copy link
Copy Markdown
Contributor Author

wischli commented Apr 14, 2026

LGTM!

Once approved, only the weekly-validation.yml CI workflow should be merged into main

Just one point. How do you want to merge this PR based on the above?

Happy to discuss this in the sync beforehand. My idea was to reduce this PR just to the weekly-validation.yml which gets merged into main and push the remaining code to some branch. Right now, that branch would have to be named live-validations as declared in the YML but no strong opinion on the branch name in case you have a better recommendation that also fits with the env work.

@lemunozm
Copy link
Copy Markdown
Contributor

lemunozm commented Apr 14, 2026

Ok, fine to me! I would expect other actions there apart from validations (for example, the VerifyFactoryContracts script). So maybe we could just name it live, WDYT?

I'll move the factory verifier there once all of this gets merged

@wischli wischli force-pushed the tests_live-validators branch from f393e5f to fc7bf5d Compare April 14, 2026 14:14
@github-actions github-actions bot added scope:infra CI, GitHub Actions, foundry config type:chore CI, config, dependency bumps, repo hygiene labels Apr 14, 2026
@github-actions
Copy link
Copy Markdown

Auto-labeled: scope:infra, type:chore. Please verify and add type/version labels manually.

@github-actions
Copy link
Copy Markdown

Coverage after merging tests_live-validators into main will be

97.10%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
src/adapters
   AxelarAdapter.sol97.67%90%100%100%118
   ChainlinkAdapter.sol98.11%91.67%100%100%95
   LayerZeroAdapter.sol98.41%90%100%100%124
   RecoveryAdapter.sol100%100%100%100%
   WormholeAdapter.sol97.67%90%100%100%108
src/admin
   OpsGuardian.sol100%100%100%100%
   ProtocolGuardian.sol100%100%100%100%
   Root.sol100%100%100%100%
   TokenRecoverer.sol100%100%100%100%
src/core/hub
   Accounting.sol97.92%96%100%98.31%134, 137
   Holdings.sol97.71%88.89%100%100%118, 243, 82
   Hub.sol93.98%81.13%93.02%97.54%269, 287, 305, 339, 343, 374–375, 413, 498–499, 544, 549, 586, 601, 87
   HubHandler.sol98%90.91%100%100%71
   HubRegistry.sol92.39%76.67%100%100%118, 124, 130, 35, 46, 79, 99
   ShareClassManager.sol98.81%95.45%100%100%42
src/core/libraries
   PricingLib.sol100%100%100%100%
src/core/messaging
   GasService.sol96.55%100%87.50%96.20%106, 135, 145
   Gateway.sol100%100%100%100%
   MessageDispatcher.sol99.60%98.55%100%100%733
   MessageProcessor.sol82.42%60.26%100%99.01%101, 103, 109, 112, 114, 125, 130, 139, 142, 145, 157, 160, 163, 168, 178, 181, 190, 193, 196, 209, 220, 225, 228, 232, 83–84, 87–88, 91–92, 97, 99
   MultiAdapter.sol100%100%100%100%
src/core/messaging/libraries
   MessageLib.sol100%100%100%100%
src/core/spoke
   BalanceSheet.sol97.47%96.97%92.59%98.55%291, 348, 57
   PoolEscrow.sol100%100%100%100%
   ShareToken.sol92.41%60%94.44%98.04%100, 112, 144, 146, 32
   Spoke.sol97.46%89.71%100%100%132, 132–133, 133, 135, 92–93
   VaultRegistry.sol93.88%85.71%100%98.18%54, 60–62, 98–99
src/core/spoke/factories
   PoolEscrowFactory.sol100%100%100%100%
   TokenFactory.sol100%100%100%100%
src/core/utils
   BatchedMulticall.sol100%100%100%100%
   ContractUpdater.sol100%100%100%100%
src/deployment
   ActionBatchers.sol84.80%62.50%80%86.46%438, 440–441, 443, 443–444, 446, 448, 448–449, 453, 453–454, 456, 459, 459–460, 462, 465, 465–466, 469, 472, 472, 474, 476, 508–512, 517–518, 520–521, 523–524
src/hooks
   BaseTransferHook.sol100%100%100%100%
   FreelyTransferable.sol92.31%80%100%100%37
   FreezeOnly.sol100%100%100%100%
   FullRestrictions.sol95.24%88.89%100%100%47
   RedemptionRestrictions.sol85.71%50%100%100%37
src/hooks/libraries
   UpdateRestrictionMessageLib.sol90%50%100%100%40, 61, 82
src/managers/hub
   NAVManager.sol100%100%100%100%
   SimplePriceManager.sol100%100%100%100%
src/managers/spoke
   MerkleProofManager.sol97.01%87.50%100%100%103, 110
   OnOfframpManager.sol100%100%100%100%
   QueueManager.sol100%100%100%100%
src/managers/spoke/decoders
   BaseDecoder.sol100%100%100%100%
   CircleDecoder.sol83.33%100%100%75%22
   VaultDecoder.sol100%100%100%100%
src/misc
   Auth.sol100%100%100%100%
   ERC20.sol100%100%100%100%
   Escrow.sol56.25%33.33%100%66.67%17, 19, 23–24, 24, 24, 26
   Multicall.sol91.67%66.67%100%100%19
   Recoverable.sol100%100%100%100%
   ReentrancyProtection.sol90%75%100%100%24
src/misc/libraries
   ArrayLib.sol100%100%100%100%
   BitmapLib.sol100%100%100%100%
   BytesLib.sol90.27%56%100%100%109, 120, 131, 14, 142, 153, 16, 164, 175, 186, 87
   CastLib.sol95.24%66.67%100%100%10, 34
   EIP712Lib.sol100%100%100%100%
   ExcessivelySafeCallLib.sol100%100%100%100%
   MathLib.sol93.46%76.19%100%97.33%34–35, 44, 46, 48, 50, 52
   MerkleProofLib.sol100%100%100%100%
   SafeTransferLib.sol96.97%92.86%100%100%75
   SignatureLib.sol95.24%80%100%100%17
   StringLib.sol100%100%100%100%
   TransientArrayLib.sol100%100%100%100%
   TransientBytesLib.sol100%100%100%100%
   TransientStorageLib.sol100%100%100%100%
src/spell
   V2CleaningsSpell.sol0%0%0%0%100–103, 103–106, 111–112, 112–114, 114, 114–116, 116, 116–118, 118, 118–119, 121, 124, 126–127, 129, 133–137, 46–47, 47, 47–48, 50–53, 55, 55–56, 58, 61, 63, 63, 65, 65–66, 66–69, 71, 75, 75–76, 81, 81–82, 82–84, 86–87, 91–94, 96–97
src/utils
   RefundEscrow.sol100%100%100%100%
   RefundEscrowFactory.sol100%100%100%100%
   SubsidyManager.sol100%100%100%100%
src/valuations
   IdentityValuation.sol100%100%100%100%
   OracleValuation.sol100%100%100%100%
src/vaults
   AsyncRequestManager.sol96.85%86.36%100%99.64%195, 198, 201, 204, 215, 227, 295, 328, 455, 460, 505, 573, 580
   AsyncVault.sol96.25%83.33%95%98.15%146, 47
   BaseVaults.sol93.50%80.77%95.24%95.45%124, 137, 239, 309–310, 85–86, 86, 86–88
   BatchRequestManager.sol100%100%100%100%
   SyncDepositVault.sol100%100%100%100%
   SyncManager.sol98.58%92.59%100%100%67, 72
   VaultRouter.sol87.37%58.82%100%91.53%107, 107, 109–110, 110, 112, 149, 70, 73–74, 86–87
src/vaults/factories
   AsyncVaultFactory.sol93.75%50%100%100%32
   SyncDepositVaultFactory.sol95%50%100%100%40
src/vaults/libraries
   RequestCallbackMessageLib.sol89.58%50%100%100%104, 139, 38, 57, 77
   RequestMessageLib.sol89.74%50%100%100%37, 55, 72, 89

@wischli wischli requested a review from lemunozm April 14, 2026 15:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

scope:infra CI, GitHub Actions, foundry config scope:tooling Read-only scripts, dev helpers — no state mutation type:chore CI, config, dependency bumps, repo hygiene type:test Test additions or fixes, no contract changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants