Skip to content

Add assertApproxEqRel cheatcode (uint256 and int256)#1067

Open
gustavo-grieco wants to merge 1 commit into
mainfrom
dev-assertApproxEqRel
Open

Add assertApproxEqRel cheatcode (uint256 and int256)#1067
gustavo-grieco wants to merge 1 commit into
mainfrom
dev-assertApproxEqRel

Conversation

@gustavo-grieco
Copy link
Copy Markdown
Collaborator

Implement foundry's assertApproxEqRel as a native hevm cheatcode, mirroring the existing assertApproxEqAbs. The relative percent delta is computed as |a - b| * 1e18 / b (denominator is the second/reference argument; 1e18 == 100%), and the assertion passes when percentDelta <= maxPercentDelta.

Matches foundry's native cheatcode semantics:

  • int256 delta accounts for signs (same sign: ||a|-|b||, opposite: |a|+|b|), denominator is |b|
  • b == 0 && a == 0 -> pass; b == 0 && a != 0 -> fail with "real delta: undefined"
  • concrete path computes in arbitrary-precision Integer to avoid the intermediate overflow foundry sidesteps with U512
  • best-effort symbolic path

Adds pass/fail test contracts and FoundryTests entries.

Description

Checklist

  • tested locally
  • added automated tests
  • updated the docs
  • updated the changelog

Implement foundry's assertApproxEqRel as a native hevm cheatcode, mirroring
the existing assertApproxEqAbs. The relative percent delta is computed as
|a - b| * 1e18 / b (denominator is the second/reference argument; 1e18 == 100%),
and the assertion passes when percentDelta <= maxPercentDelta.

Matches foundry's native cheatcode semantics:
- int256 delta accounts for signs (same sign: ||a|-|b||, opposite: |a|+|b|),
  denominator is |b|
- b == 0 && a == 0 -> pass; b == 0 && a != 0 -> fail with "real delta: undefined"
- concrete path computes in arbitrary-precision Integer to avoid the
  intermediate overflow foundry sidesteps with U512
- best-effort symbolic path

Adds pass/fail test contracts and FoundryTests entries.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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