Skip to content

fix: N-02 exact powers of 10 for log10#344

Merged
immrsd merged 4 commits into
release-v1.2from
fp-diff-audit-fix-N-02
Jun 2, 2026
Merged

fix: N-02 exact powers of 10 for log10#344
immrsd merged 4 commits into
release-v1.2from
fp-diff-audit-fix-N-02

Conversation

@immrsd

@immrsd immrsd commented Jun 1, 2026

Copy link
Copy Markdown
Collaborator

Fixes N-02

Summary by CodeRabbit

  • Bug Fixes

    • Improved log10 precision for integer powers of ten in fixed-point math, now returning exact results for these inputs.
  • Documentation

    • Clarified log10 abort and rounding conditions, and documented the exactness guarantee for powers of ten calculations.
  • Tests

    • Updated test cases to verify exact log10 results for powers of ten across supported fixed-point types.

@immrsd immrsd self-assigned this Jun 1, 2026
@coderabbitai

coderabbitai Bot commented Jun 1, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: f3707690-03d5-45c1-82b7-900f66bd3310

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Walkthrough

The PR enhances log10 computation for fixed-point types UD30x9 and SD29x9 to return exact results when inputs are integer powers of ten, adds a utility import for UD30x9, updates corresponding test expectations from approximate-within-1-ULP to exact, and clarifies the documentation to reflect the new guarantee.

Changes

Fixed-point log10 exactness for powers of ten

Layer / File(s) Summary
UD30x9 log10 fast-path for powers of ten
math/fixed_point/sources/ud30x9/ud30x9_base.move, math/fixed_point/tests/ud30x9_tests/log10_tests.move
New import of openzeppelin_math::u128 enables exact log10 computation for powers of ten. The log10 implementation branches on u128::is_power_of_ten, applies u128::log10 with scale adjustment, and returns immediately for exact results; non-powers-of-ten fall back to log2-based computation. Test renamed to log10_of_powers_of_ten_is_exact() and assertions updated to expect k * SCALE instead of k * SCALE - 1.
SD29x9 log10 fast-path for powers of ten
math/fixed_point/sources/sd29x9/sd29x9_base.move, math/fixed_point/tests/sd29x9_tests/log10_tests.move
New fast-path detects when the decomposed magnitude is an integer power of ten (including sub-unit 10^-k), uses u256::is_power_of_ten and u256::log10 to compute the exponent exactly, adjusts by the fixed-point scale, and returns; other inputs continue with log2-based fallback. Tests renamed to log10_of_positive_powers_of_ten_is_exact() and log10_of_negative_powers_of_ten_is_exact(), with expected values simplified to ±k * SCALE (removed prior 1-ULP adjustments). Boundary test for pos(1) adjusted to expect exactly -9 * SCALE.
Documentation update
math/fixed_point/README.md
Clarified log10 behavioral notes to explicitly guarantee exactness on integer powers of ten (including sub-unit powers for SD29x9), replacing the prior general statement about round-down rounding causing up-to-1-ULP deviation at certain identity points.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

  • OpenZeppelin/contracts-sui#323: Main PR's new fast-paths rely on u128::is_power_of_ten and u256::is_power_of_ten, which are refactored in this PR to compute via log10_floor + pow instead of lookup tables.
  • OpenZeppelin/contracts-sui#320: Main PR's changes modify existing log10 implementations in sd29x9_base.move and ud30x9_base.move, building on the log10 functions introduced in PR #320.

Suggested reviewers

  • ericnordelo
  • 0xNeshi

Poem

🐰 Ten to the power—exact and true!
log10's fast-path cuts through,
Powers of ten, no rounding blur,
Scale adjusts with perfect fur,
Fixed-point math, now crystal-clear!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description provides only a reference to the audit issue without including required PR checklist items (Tests, Documentation, Changelog) or detailed context about the changes. Add the PR checklist section with status indicators and provide context explaining what was changed and why the fix addresses the N-02 issue.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title precisely references the audit issue N-02 and describes the main change: fixing log10 to return exact values at integer powers of ten.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ 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 fp-diff-audit-fix-N-02

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

@immrsd

immrsd commented Jun 1, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 1, 2026

Copy link
Copy Markdown
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@ericnordelo ericnordelo left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM!

@codecov

codecov Bot commented Jun 1, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 95.91%. Comparing base (9dbcdec) to head (259213f).

Additional details and impacted files
@@               Coverage Diff                @@
##           release-v1.2     #344      +/-   ##
================================================
+ Coverage         95.89%   95.91%   +0.01%     
================================================
  Files                22       22              
  Lines              2215     2225      +10     
  Branches            603      605       +2     
================================================
+ Hits               2124     2134      +10     
  Misses               67       67              
  Partials             24       24              
Flag Coverage Δ
contracts/access 65.40% <ø> (ø)
math/core 86.12% <ø> (ø)
math/fixed_point 59.00% <100.00%> (+3.34%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@0xNeshi 0xNeshi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Nice

Comment thread math/fixed_point/sources/sd29x9/sd29x9_base.move Outdated
@immrsd immrsd merged commit 55510ab into release-v1.2 Jun 2, 2026
13 checks passed
@immrsd immrsd deleted the fp-diff-audit-fix-N-02 branch June 2, 2026 13:53
@coderabbitai coderabbitai Bot mentioned this pull request Jun 3, 2026
ericnordelo added a commit that referenced this pull request Jun 4, 2026
* feat: add assertion (#335)

* feat: update comments (#336)

* [N-03] Access Control Audit (#337)

* feat: update comments

* feat: apply updates

* feat: update bag references

* feat: rename param

* feat: apply review updates

* feat: rollback renmae

* [N-05] Access Control Audit (#338)

* feat: update delay logic

* feat: improve doc comments

* feat: improve events

* feat: apply review updates

* [N-01] Access Control Audit (#339)

* feat: update delay logic

* feat: improve doc comments

* feat: improve events

* feat: apply review update

* feat: apply review updates

* Fix N-04 (Code and Documentation Improvements) (#332)

* Fix N-03 (introduce ELogResultUnrepresentable for UD30x9 log functions) (#341)

* fix: `N-02` exact powers of 10 for `log10` (#344)

* Fix N-02 (exact powers of 10 for log10)

* Apply minor suggestion

* fix: `N-01` raw_log2 precision comment (#333)

* Fix N-01 (Internal Precision Comment Overstates raw_log2 Error Bound)

* Fix raw_log2 precision wording

* feat: add reports (#351)

* feat: update changelog

* feat: update changelog (#353)

* feat: update comments

* feat: update published information

---------

Co-authored-by: immrsd <103599616+immrsd@users.noreply.github.com>
0xNeshi added a commit that referenced this pull request Jun 16, 2026
* feat: add assertion (#335)

* feat: update comments (#336)

* [N-03] Access Control Audit (#337)

* feat: update comments

* feat: apply updates

* feat: update bag references

* feat: rename param

* feat: apply review updates

* feat: rollback renmae

* [N-05] Access Control Audit (#338)

* feat: update delay logic

* feat: improve doc comments

* feat: improve events

* feat: apply review updates

* [N-01] Access Control Audit (#339)

* feat: update delay logic

* feat: improve doc comments

* feat: improve events

* feat: apply review update

* feat: apply review updates

* Fix N-04 (Code and Documentation Improvements) (#332)

* Fix N-03 (introduce ELogResultUnrepresentable for UD30x9 log functions) (#341)

* fix: `N-02` exact powers of 10 for `log10` (#344)

* Fix N-02 (exact powers of 10 for log10)

* Apply minor suggestion

* fix: `N-01` raw_log2 precision comment (#333)

* Fix N-01 (Internal Precision Comment Overstates raw_log2 Error Bound)

* Fix raw_log2 precision wording

* feat: add reports (#351)

* feat: update changelog (#353)

* feat: update published information (#355)

* feat: Implement Rate Limiter module (#315)

* feat: add rate limiter implementation

* docs: document invariants

* fix: enforce missing invariants

* test: add more tests

* feat: cooldown supports capacity/used

* ref: assume monotonic Clock

* fix: new_bucket accepts initial tokens (remove new_bucket_with_tokens)

* ref: track cooldown_end instead of last_used

* fix: cooldown used increases by 1 on consume

* ref: use 'available' design instead of 'used'

* ref: inline roll_window

* test: add cooldown_reconfigure_rearms_when_drained_and_deadline_elapsed

* docs: mention operator's responsibility for cooldown_ms

* ref: rename q to steps_to_full in bucket_accrue

* docs: update invariants

* fix: remove capacity + refill_amount assertion in assert_bucket_config

* docs: add missing / update docs

* feat: add variety of errors

* docs: add missing / update docs

* test: remove invariant class mentions

* ref: apply Code Quality Checklist (openzeppelin_utils)

* test: replace cleanup with 'abort EUnreachable' in expected-failure tests

* test: use abort 0 instead of error

* feat: remove 'Ms' suffix from Error names

* docs: error docs don't reference internal variables

* docs: rephrase rate_limiter error messages without internal field names

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

* docs: update README

* docs: update README

* docs: align invariants.md to be sharing-ready

* docs: improve wording & clarity for invariants.md

* feat: cooldown now decrements available by amount

* test: change abort 0 to 100 (avoids confusing with ERateLimited)

* test: change all destructor patterns into abortions

* docs: invariant rewording

* docs: update format for invariants.md

* docs: update format for invariants.md and add missing invariants

* docs: align invariants format

* docs: update outdated invariant references

* docs: remove rate limiter temp. artifacts

* chore: simplify changelog

* ref: convert assert macros into funs

* docs: document private funs

* test(fix): add proper teardown in happy tests

* ci: add contracts/utils to CI test job dir matrix

* test: add regression tests for bucket_accrue

* fix: bucket_accrue double spend bug

* docs: add empty line before enum variant docs

Co-authored-by: Daniel Bigos <daniel.bigos96@gmail.com>

* Revert "docs: add empty line before enum variant docs"

This reverts commit 21a9076.

* feat: inline config validation assertions

* docs: add more info on rate limiter types in README

* docs: add clarifying comments for apparent overflow suspects

* docs: mention library being access control-agnostic

* docs: reword library to module

* feat: add initial_available to all limiter types

* ref: put capacity as first cooldown type field

* ref: use spread op instead of ignoring cooldown_ms field

* docs: show identical API for all types in README

* docs: for fixed window update wording that it resets to full capacity

* fix: reconfigure sets last_refill to now + forbid 0 initial available for cooldown

* docs: remove post-core artifact

* test: add bucket_reconfigure_to_faster_rate_discards_old_subinterval

* docs: add SAFETY before overflow-related comments

* test: verify available always returns up-to-date accrual state

* test: add missing zero-config reconfigure tests

* test: add try_consume_with_zero_amount for all limiter types

* test: add try_consume_of_available_aborts_when_drained

* docs: note that try_consume(0) aborts after available() == 0

* docs: note RateLimiter enum is not upgrade-compatible

Adding variants or fields to a deployed public enum would break BCS
deserialization for integrator objects that already stored the prior
shape. Document this constraint at the module level.

* test: add edge case test cases

* docs: remove llm artifacts

* ref: reorder fileds in new_cooldown

* test: remove Pub.local.toml

* ref: in reconfigure_fixed_window move let now into match

* ref: in reconfigure_bucket move let now into match

* docs: remove mention of reconfigure_cooldown clamping available to 0

* fix: align cooldown clamp behavior on reconfigure

* fix: try_consume updates state only on success

* docs: align

* ref: fixedwindow now shares bucket's internal logic

* ref: update capacity prior to accrual on reconfigure_bucket

* docs: add comment

* Revert "docs: add comment"

This reverts commit ecb0145.

* Revert "ref: update capacity prior to accrual on reconfigure_bucket"

This reverts commit b545b6d.

* ref: Rate Limiter: Reconfiguration via Rich `new_*` Functions (#326)

* impl

* simplify further

* fix: expose last_refill_ms for bucket

* tests: add missing

* docs: update utils README

* docs: fix new_cooldown accepted combos

* feat: project bucket-shaped anchor getters

`last_refill_ms` and `window_start_ms` now take `&Clock` and return the
anchor advanced by every whole interval elapsed since the last commit,
so the snapshot `(anchor, available(clock))` is internally coherent.
`cooldown_end_ms` stays a plain getter — a cooldown deadline does not
evolve with time.

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

* fix: error numbering

* fix: error messages no longer reference private fields

* docs: move EBucketAnchorInFuture comment next to the error

* add spec

* update spec

* tests: add missing invariant tests

* feat: add is_type discriminator getters

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Eric Nordelo <eric.nordelo39@gmail.com>
Co-authored-by: Daniel Bigos <daniel.bigos96@gmail.com>

* tests: fix formatting in rate limiter tests (#334)

* feat: [N-01]: try_consume now returns false on amount = 0 (#342)

* feat: try_consume returns false on amount = 0

* test: update

* docs: update readme

* docs: [N-02]: warn against preserving bucket anchor across a rate change (#350)

* docs: warn against preserving bucket anchor across a rate change

Accrual applies the current rate over the entire span since the anchor,
so carrying an old last_refill_ms anchor while changing refill_amount or
refill_interval_ms re-prices elapsed time at the new rate and mints
tokens instantly. Document this constraint in the new_bucket parameter
doc and the module-level Reconfiguration section.

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

* docs: update readme

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs: clarify rate limiter error, available summary, and window seeding (#347)

- EWrongVariant: describe variant-typed getter mismatch instead of the
  removed in-place reconfigure API
- available: correct "available capacity" to available units (headroom)
  and list all three projections (accrual, window reset, cooldown release)
- new_fixed_window: flag that a backdated anchor discards the seeded
  initial_available once a full window has elapsed

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs: document deliberate absence of events in rate limiter (#348)

Add an Observability section to the rate_limiter module doc block
explaining that the module emits no events by design (the limiter has
no stable identity of its own) and that emitting events for rate-limit
hits, cooldown arming, and reconfiguration is the integrator's
responsibility at their own entry functions.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: abort with ECooldownDeadlineOverflow on cooldown deadline overflow (#349)

* ref: [N-03]: reorder declaration fields for buckets (#343)

* ref: reorder declaration fields for buckets

* align field ordering

* feat: add median implementation  (#362)

* feat: add median implementation (#135)

* add separate quick_sort implementations for each type

* remove duplicated qsort implementations

* add in-place qsort implementation

* add partition function

* rewrite qsort without recursion

* convert quick_sort to macro

* add comprehensive test cases for qsort

* update qsort documentation

* add review fixes

* remove --trace flag from testing pipeline

* Revert "remove --trace flag from testing pipeline"

This reverts commit 9bf7065.

* split macro module

* inline partition macro

* add median implementation

* add more edge case test cases

* fix fmt

* remove quick_sort duplicate

* feat: add median

* docs: update PR

* Route median through u256 workhorse fun (#325)

* fix: fmt

* fix: apply CR comments

* test: add missing test

* fix: macro

* feat: use quickselect

* feat: improve CHANGELOG

* feat: apply review updates

* feat: update comment

---------

Co-authored-by: Daniel Bigos <daniel.bigos@openzeppelin.com>
Co-authored-by: Daniel Bigos <daniel.bigos@icloud.com>
Co-authored-by: immrsd <103599616+immrsd@users.noreply.github.com>
Co-authored-by: Eric Nordelo <eric.nordelo39@gmail.com>

* docs: add ! to macros and update import format

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* chore: update median PR in changelog

* chore: add ! to median macro mention

* docs: add missing ; after rounding imports in examples

---------

Co-authored-by: Alisander Qoshqosh <37006439+qalisander@users.noreply.github.com>
Co-authored-by: Daniel Bigos <daniel.bigos@openzeppelin.com>
Co-authored-by: Daniel Bigos <daniel.bigos@icloud.com>
Co-authored-by: immrsd <103599616+immrsd@users.noreply.github.com>
Co-authored-by: Eric Nordelo <eric.nordelo39@gmail.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* [N-01] Core Math Audit (#357)

* feat: Implement Rate Limiter module (#315)

* feat: add rate limiter implementation

* docs: document invariants

* fix: enforce missing invariants

* test: add more tests

* feat: cooldown supports capacity/used

* ref: assume monotonic Clock

* fix: new_bucket accepts initial tokens (remove new_bucket_with_tokens)

* ref: track cooldown_end instead of last_used

* fix: cooldown used increases by 1 on consume

* ref: use 'available' design instead of 'used'

* ref: inline roll_window

* test: add cooldown_reconfigure_rearms_when_drained_and_deadline_elapsed

* docs: mention operator's responsibility for cooldown_ms

* ref: rename q to steps_to_full in bucket_accrue

* docs: update invariants

* fix: remove capacity + refill_amount assertion in assert_bucket_config

* docs: add missing / update docs

* feat: add variety of errors

* docs: add missing / update docs

* test: remove invariant class mentions

* ref: apply Code Quality Checklist (openzeppelin_utils)

* test: replace cleanup with 'abort EUnreachable' in expected-failure tests

* test: use abort 0 instead of error

* feat: remove 'Ms' suffix from Error names

* docs: error docs don't reference internal variables

* docs: rephrase rate_limiter error messages without internal field names

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

* docs: update README

* docs: update README

* docs: align invariants.md to be sharing-ready

* docs: improve wording & clarity for invariants.md

* feat: cooldown now decrements available by amount

* test: change abort 0 to 100 (avoids confusing with ERateLimited)

* test: change all destructor patterns into abortions

* docs: invariant rewording

* docs: update format for invariants.md

* docs: update format for invariants.md and add missing invariants

* docs: align invariants format

* docs: update outdated invariant references

* docs: remove rate limiter temp. artifacts

* chore: simplify changelog

* ref: convert assert macros into funs

* docs: document private funs

* test(fix): add proper teardown in happy tests

* ci: add contracts/utils to CI test job dir matrix

* test: add regression tests for bucket_accrue

* fix: bucket_accrue double spend bug

* docs: add empty line before enum variant docs

Co-authored-by: Daniel Bigos <daniel.bigos96@gmail.com>

* Revert "docs: add empty line before enum variant docs"

This reverts commit 21a9076.

* feat: inline config validation assertions

* docs: add more info on rate limiter types in README

* docs: add clarifying comments for apparent overflow suspects

* docs: mention library being access control-agnostic

* docs: reword library to module

* feat: add initial_available to all limiter types

* ref: put capacity as first cooldown type field

* ref: use spread op instead of ignoring cooldown_ms field

* docs: show identical API for all types in README

* docs: for fixed window update wording that it resets to full capacity

* fix: reconfigure sets last_refill to now + forbid 0 initial available for cooldown

* docs: remove post-core artifact

* test: add bucket_reconfigure_to_faster_rate_discards_old_subinterval

* docs: add SAFETY before overflow-related comments

* test: verify available always returns up-to-date accrual state

* test: add missing zero-config reconfigure tests

* test: add try_consume_with_zero_amount for all limiter types

* test: add try_consume_of_available_aborts_when_drained

* docs: note that try_consume(0) aborts after available() == 0

* docs: note RateLimiter enum is not upgrade-compatible

Adding variants or fields to a deployed public enum would break BCS
deserialization for integrator objects that already stored the prior
shape. Document this constraint at the module level.

* test: add edge case test cases

* docs: remove llm artifacts

* ref: reorder fileds in new_cooldown

* test: remove Pub.local.toml

* ref: in reconfigure_fixed_window move let now into match

* ref: in reconfigure_bucket move let now into match

* docs: remove mention of reconfigure_cooldown clamping available to 0

* fix: align cooldown clamp behavior on reconfigure

* fix: try_consume updates state only on success

* docs: align

* ref: fixedwindow now shares bucket's internal logic

* ref: update capacity prior to accrual on reconfigure_bucket

* docs: add comment

* Revert "docs: add comment"

This reverts commit ecb0145.

* Revert "ref: update capacity prior to accrual on reconfigure_bucket"

This reverts commit b545b6d.

* ref: Rate Limiter: Reconfiguration via Rich `new_*` Functions (#326)

* impl

* simplify further

* fix: expose last_refill_ms for bucket

* tests: add missing

* docs: update utils README

* docs: fix new_cooldown accepted combos

* feat: project bucket-shaped anchor getters

`last_refill_ms` and `window_start_ms` now take `&Clock` and return the
anchor advanced by every whole interval elapsed since the last commit,
so the snapshot `(anchor, available(clock))` is internally coherent.
`cooldown_end_ms` stays a plain getter — a cooldown deadline does not
evolve with time.

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

* fix: error numbering

* fix: error messages no longer reference private fields

* docs: move EBucketAnchorInFuture comment next to the error

* add spec

* update spec

* tests: add missing invariant tests

* feat: add is_type discriminator getters

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Eric Nordelo <eric.nordelo39@gmail.com>
Co-authored-by: Daniel Bigos <daniel.bigos96@gmail.com>

* tests: fix formatting in rate limiter tests (#334)

* feat: add median implementation (#135)

* add separate quick_sort implementations for each type

* remove duplicated qsort implementations

* add in-place qsort implementation

* add partition function

* rewrite qsort without recursion

* convert quick_sort to macro

* add comprehensive test cases for qsort

* update qsort documentation

* add review fixes

* remove --trace flag from testing pipeline

* Revert "remove --trace flag from testing pipeline"

This reverts commit 9bf7065.

* split macro module

* inline partition macro

* add median implementation

* add more edge case test cases

* fix fmt

* remove quick_sort duplicate

* feat: add median

* docs: update PR

* Route median through u256 workhorse fun (#325)

* fix: fmt

* fix: apply CR comments

* test: add missing test

* fix: macro

* feat: use quickselect

* feat: improve CHANGELOG

* feat: apply review updates

* feat: update comment

---------

Co-authored-by: Daniel Bigos <daniel.bigos@openzeppelin.com>
Co-authored-by: Daniel Bigos <daniel.bigos@icloud.com>
Co-authored-by: immrsd <103599616+immrsd@users.noreply.github.com>
Co-authored-by: Eric Nordelo <eric.nordelo39@gmail.com>

* feat: update check

* feat: update version

---------

Co-authored-by: Nenad <nenad.misic@openzeppelin.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Daniel Bigos <daniel.bigos96@gmail.com>
Co-authored-by: Alisander Qoshqosh <37006439+qalisander@users.noreply.github.com>
Co-authored-by: Daniel Bigos <daniel.bigos@openzeppelin.com>
Co-authored-by: Daniel Bigos <daniel.bigos@icloud.com>
Co-authored-by: immrsd <103599616+immrsd@users.noreply.github.com>

* [N-02] Core Math Audit (#359)

* feat: Implement Rate Limiter module (#315)

* feat: add rate limiter implementation

* docs: document invariants

* fix: enforce missing invariants

* test: add more tests

* feat: cooldown supports capacity/used

* ref: assume monotonic Clock

* fix: new_bucket accepts initial tokens (remove new_bucket_with_tokens)

* ref: track cooldown_end instead of last_used

* fix: cooldown used increases by 1 on consume

* ref: use 'available' design instead of 'used'

* ref: inline roll_window

* test: add cooldown_reconfigure_rearms_when_drained_and_deadline_elapsed

* docs: mention operator's responsibility for cooldown_ms

* ref: rename q to steps_to_full in bucket_accrue

* docs: update invariants

* fix: remove capacity + refill_amount assertion in assert_bucket_config

* docs: add missing / update docs

* feat: add variety of errors

* docs: add missing / update docs

* test: remove invariant class mentions

* ref: apply Code Quality Checklist (openzeppelin_utils)

* test: replace cleanup with 'abort EUnreachable' in expected-failure tests

* test: use abort 0 instead of error

* feat: remove 'Ms' suffix from Error names

* docs: error docs don't reference internal variables

* docs: rephrase rate_limiter error messages without internal field names

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

* docs: update README

* docs: update README

* docs: align invariants.md to be sharing-ready

* docs: improve wording & clarity for invariants.md

* feat: cooldown now decrements available by amount

* test: change abort 0 to 100 (avoids confusing with ERateLimited)

* test: change all destructor patterns into abortions

* docs: invariant rewording

* docs: update format for invariants.md

* docs: update format for invariants.md and add missing invariants

* docs: align invariants format

* docs: update outdated invariant references

* docs: remove rate limiter temp. artifacts

* chore: simplify changelog

* ref: convert assert macros into funs

* docs: document private funs

* test(fix): add proper teardown in happy tests

* ci: add contracts/utils to CI test job dir matrix

* test: add regression tests for bucket_accrue

* fix: bucket_accrue double spend bug

* docs: add empty line before enum variant docs

Co-authored-by: Daniel Bigos <daniel.bigos96@gmail.com>

* Revert "docs: add empty line before enum variant docs"

This reverts commit 21a9076.

* feat: inline config validation assertions

* docs: add more info on rate limiter types in README

* docs: add clarifying comments for apparent overflow suspects

* docs: mention library being access control-agnostic

* docs: reword library to module

* feat: add initial_available to all limiter types

* ref: put capacity as first cooldown type field

* ref: use spread op instead of ignoring cooldown_ms field

* docs: show identical API for all types in README

* docs: for fixed window update wording that it resets to full capacity

* fix: reconfigure sets last_refill to now + forbid 0 initial available for cooldown

* docs: remove post-core artifact

* test: add bucket_reconfigure_to_faster_rate_discards_old_subinterval

* docs: add SAFETY before overflow-related comments

* test: verify available always returns up-to-date accrual state

* test: add missing zero-config reconfigure tests

* test: add try_consume_with_zero_amount for all limiter types

* test: add try_consume_of_available_aborts_when_drained

* docs: note that try_consume(0) aborts after available() == 0

* docs: note RateLimiter enum is not upgrade-compatible

Adding variants or fields to a deployed public enum would break BCS
deserialization for integrator objects that already stored the prior
shape. Document this constraint at the module level.

* test: add edge case test cases

* docs: remove llm artifacts

* ref: reorder fileds in new_cooldown

* test: remove Pub.local.toml

* ref: in reconfigure_fixed_window move let now into match

* ref: in reconfigure_bucket move let now into match

* docs: remove mention of reconfigure_cooldown clamping available to 0

* fix: align cooldown clamp behavior on reconfigure

* fix: try_consume updates state only on success

* docs: align

* ref: fixedwindow now shares bucket's internal logic

* ref: update capacity prior to accrual on reconfigure_bucket

* docs: add comment

* Revert "docs: add comment"

This reverts commit ecb0145.

* Revert "ref: update capacity prior to accrual on reconfigure_bucket"

This reverts commit b545b6d.

* ref: Rate Limiter: Reconfiguration via Rich `new_*` Functions (#326)

* impl

* simplify further

* fix: expose last_refill_ms for bucket

* tests: add missing

* docs: update utils README

* docs: fix new_cooldown accepted combos

* feat: project bucket-shaped anchor getters

`last_refill_ms` and `window_start_ms` now take `&Clock` and return the
anchor advanced by every whole interval elapsed since the last commit,
so the snapshot `(anchor, available(clock))` is internally coherent.
`cooldown_end_ms` stays a plain getter — a cooldown deadline does not
evolve with time.

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

* fix: error numbering

* fix: error messages no longer reference private fields

* docs: move EBucketAnchorInFuture comment next to the error

* add spec

* update spec

* tests: add missing invariant tests

* feat: add is_type discriminator getters

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Eric Nordelo <eric.nordelo39@gmail.com>
Co-authored-by: Daniel Bigos <daniel.bigos96@gmail.com>

* tests: fix formatting in rate limiter tests (#334)

* feat: add median implementation (#135)

* add separate quick_sort implementations for each type

* remove duplicated qsort implementations

* add in-place qsort implementation

* add partition function

* rewrite qsort without recursion

* convert quick_sort to macro

* add comprehensive test cases for qsort

* update qsort documentation

* add review fixes

* remove --trace flag from testing pipeline

* Revert "remove --trace flag from testing pipeline"

This reverts commit 9bf7065.

* split macro module

* inline partition macro

* add median implementation

* add more edge case test cases

* fix fmt

* remove quick_sort duplicate

* feat: add median

* docs: update PR

* Route median through u256 workhorse fun (#325)

* fix: fmt

* fix: apply CR comments

* test: add missing test

* fix: macro

* feat: use quickselect

* feat: improve CHANGELOG

* feat: apply review updates

* feat: update comment

---------

Co-authored-by: Daniel Bigos <daniel.bigos@openzeppelin.com>
Co-authored-by: Daniel Bigos <daniel.bigos@icloud.com>
Co-authored-by: immrsd <103599616+immrsd@users.noreply.github.com>
Co-authored-by: Eric Nordelo <eric.nordelo39@gmail.com>

* feat: update check

* feat: update version

* feat: bump version

* feat: apply improvements

---------

Co-authored-by: Nenad <nenad.misic@openzeppelin.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Daniel Bigos <daniel.bigos96@gmail.com>
Co-authored-by: Alisander Qoshqosh <37006439+qalisander@users.noreply.github.com>
Co-authored-by: Daniel Bigos <daniel.bigos@openzeppelin.com>
Co-authored-by: Daniel Bigos <daniel.bigos@icloud.com>
Co-authored-by: immrsd <103599616+immrsd@users.noreply.github.com>

* [N-03] Math Core Audit (#360)

* feat: Implement Rate Limiter module (#315)

* feat: add rate limiter implementation

* docs: document invariants

* fix: enforce missing invariants

* test: add more tests

* feat: cooldown supports capacity/used

* ref: assume monotonic Clock

* fix: new_bucket accepts initial tokens (remove new_bucket_with_tokens)

* ref: track cooldown_end instead of last_used

* fix: cooldown used increases by 1 on consume

* ref: use 'available' design instead of 'used'

* ref: inline roll_window

* test: add cooldown_reconfigure_rearms_when_drained_and_deadline_elapsed

* docs: mention operator's responsibility for cooldown_ms

* ref: rename q to steps_to_full in bucket_accrue

* docs: update invariants

* fix: remove capacity + refill_amount assertion in assert_bucket_config

* docs: add missing / update docs

* feat: add variety of errors

* docs: add missing / update docs

* test: remove invariant class mentions

* ref: apply Code Quality Checklist (openzeppelin_utils)

* test: replace cleanup with 'abort EUnreachable' in expected-failure tests

* test: use abort 0 instead of error

* feat: remove 'Ms' suffix from Error names

* docs: error docs don't reference internal variables

* docs: rephrase rate_limiter error messages without internal field names

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

* docs: update README

* docs: update README

* docs: align invariants.md to be sharing-ready

* docs: improve wording & clarity for invariants.md

* feat: cooldown now decrements available by amount

* test: change abort 0 to 100 (avoids confusing with ERateLimited)

* test: change all destructor patterns into abortions

* docs: invariant rewording

* docs: update format for invariants.md

* docs: update format for invariants.md and add missing invariants

* docs: align invariants format

* docs: update outdated invariant references

* docs: remove rate limiter temp. artifacts

* chore: simplify changelog

* ref: convert assert macros into funs

* docs: document private funs

* test(fix): add proper teardown in happy tests

* ci: add contracts/utils to CI test job dir matrix

* test: add regression tests for bucket_accrue

* fix: bucket_accrue double spend bug

* docs: add empty line before enum variant docs

Co-authored-by: Daniel Bigos <daniel.bigos96@gmail.com>

* Revert "docs: add empty line before enum variant docs"

This reverts commit 21a9076.

* feat: inline config validation assertions

* docs: add more info on rate limiter types in README

* docs: add clarifying comments for apparent overflow suspects

* docs: mention library being access control-agnostic

* docs: reword library to module

* feat: add initial_available to all limiter types

* ref: put capacity as first cooldown type field

* ref: use spread op instead of ignoring cooldown_ms field

* docs: show identical API for all types in README

* docs: for fixed window update wording that it resets to full capacity

* fix: reconfigure sets last_refill to now + forbid 0 initial available for cooldown

* docs: remove post-core artifact

* test: add bucket_reconfigure_to_faster_rate_discards_old_subinterval

* docs: add SAFETY before overflow-related comments

* test: verify available always returns up-to-date accrual state

* test: add missing zero-config reconfigure tests

* test: add try_consume_with_zero_amount for all limiter types

* test: add try_consume_of_available_aborts_when_drained

* docs: note that try_consume(0) aborts after available() == 0

* docs: note RateLimiter enum is not upgrade-compatible

Adding variants or fields to a deployed public enum would break BCS
deserialization for integrator objects that already stored the prior
shape. Document this constraint at the module level.

* test: add edge case test cases

* docs: remove llm artifacts

* ref: reorder fileds in new_cooldown

* test: remove Pub.local.toml

* ref: in reconfigure_fixed_window move let now into match

* ref: in reconfigure_bucket move let now into match

* docs: remove mention of reconfigure_cooldown clamping available to 0

* fix: align cooldown clamp behavior on reconfigure

* fix: try_consume updates state only on success

* docs: align

* ref: fixedwindow now shares bucket's internal logic

* ref: update capacity prior to accrual on reconfigure_bucket

* docs: add comment

* Revert "docs: add comment"

This reverts commit ecb0145.

* Revert "ref: update capacity prior to accrual on reconfigure_bucket"

This reverts commit b545b6d.

* ref: Rate Limiter: Reconfiguration via Rich `new_*` Functions (#326)

* impl

* simplify further

* fix: expose last_refill_ms for bucket

* tests: add missing

* docs: update utils README

* docs: fix new_cooldown accepted combos

* feat: project bucket-shaped anchor getters

`last_refill_ms` and `window_start_ms` now take `&Clock` and return the
anchor advanced by every whole interval elapsed since the last commit,
so the snapshot `(anchor, available(clock))` is internally coherent.
`cooldown_end_ms` stays a plain getter — a cooldown deadline does not
evolve with time.

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

* fix: error numbering

* fix: error messages no longer reference private fields

* docs: move EBucketAnchorInFuture comment next to the error

* add spec

* update spec

* tests: add missing invariant tests

* feat: add is_type discriminator getters

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Eric Nordelo <eric.nordelo39@gmail.com>
Co-authored-by: Daniel Bigos <daniel.bigos96@gmail.com>

* tests: fix formatting in rate limiter tests (#334)

* feat: add median implementation (#135)

* add separate quick_sort implementations for each type

* remove duplicated qsort implementations

* add in-place qsort implementation

* add partition function

* rewrite qsort without recursion

* convert quick_sort to macro

* add comprehensive test cases for qsort

* update qsort documentation

* add review fixes

* remove --trace flag from testing pipeline

* Revert "remove --trace flag from testing pipeline"

This reverts commit 9bf7065.

* split macro module

* inline partition macro

* add median implementation

* add more edge case test cases

* fix fmt

* remove quick_sort duplicate

* feat: add median

* docs: update PR

* Route median through u256 workhorse fun (#325)

* fix: fmt

* fix: apply CR comments

* test: add missing test

* fix: macro

* feat: use quickselect

* feat: improve CHANGELOG

* feat: apply review updates

* feat: update comment

---------

Co-authored-by: Daniel Bigos <daniel.bigos@openzeppelin.com>
Co-authored-by: Daniel Bigos <daniel.bigos@icloud.com>
Co-authored-by: immrsd <103599616+immrsd@users.noreply.github.com>
Co-authored-by: Eric Nordelo <eric.nordelo39@gmail.com>

* feat: update check

* feat: update version

* feat: bump version

* feat: apply improvements

* feat: improvements

---------

Co-authored-by: Nenad <nenad.misic@openzeppelin.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Daniel Bigos <daniel.bigos96@gmail.com>
Co-authored-by: Alisander Qoshqosh <37006439+qalisander@users.noreply.github.com>
Co-authored-by: Daniel Bigos <daniel.bigos@openzeppelin.com>
Co-authored-by: Daniel Bigos <daniel.bigos@icloud.com>
Co-authored-by: immrsd <103599616+immrsd@users.noreply.github.com>

* docs: add Rate limiter examples (#361)

* docs: merge faucet examples into one

* docs: add staking_vault example

* docs: add base mage_duel example

* docs: update mage_duel example

* docs: delete metadata_cap in rare_coin

* docs: apply move-quality skill

* docs: fix mage_duel wrong duel assertion

* docs: fix typo in utils/README

* docs: remove ENotOpponent error from mage_duel

* docs: move example tests to separate modules

* docs: increase test coverage

* docs: remove traces

* docs: add missing test docs for examples

* docs: fmt

* docs: make unaudited examples warnings visible at top of sections

* docs: use full gh URLs to examples

* docs: change title 'rate_limiter at a Glance' to 'Rate Limiter at a Glance'

* docs: remove operator notes

* Update contracts/utils/README.md

Co-authored-by: Eric Nordelo <eric.nordelo39@gmail.com>

* docs: add exapmles ref in contracts/README

* docs: fix mage_duel module docs

* docs: remove mention of "compiling" examples

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* docs: remove mentions of "compiling" when mentioning examples

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* test: add test_only attribute to example test modules

* test: take shared faucet in the test tx where it's actually needed

* test: Add missing comment dots + remove redundant imports

* docs: use release-v1.3 as the branch to point example URLs

---------

Co-authored-by: Eric Nordelo <eric.nordelo39@gmail.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* chore: add rate limiter audit report (#364)

* [N-04] Core Math Audit (#363)

* feat: Implement Rate Limiter module (#315)

* feat: add rate limiter implementation

* docs: document invariants

* fix: enforce missing invariants

* test: add more tests

* feat: cooldown supports capacity/used

* ref: assume monotonic Clock

* fix: new_bucket accepts initial tokens (remove new_bucket_with_tokens)

* ref: track cooldown_end instead of last_used

* fix: cooldown used increases by 1 on consume

* ref: use 'available' design instead of 'used'

* ref: inline roll_window

* test: add cooldown_reconfigure_rearms_when_drained_and_deadline_elapsed

* docs: mention operator's responsibility for cooldown_ms

* ref: rename q to steps_to_full in bucket_accrue

* docs: update invariants

* fix: remove capacity + refill_amount assertion in assert_bucket_config

* docs: add missing / update docs

* feat: add variety of errors

* docs: add missing / update docs

* test: remove invariant class mentions

* ref: apply Code Quality Checklist (openzeppelin_utils)

* test: replace cleanup with 'abort EUnreachable' in expected-failure tests

* test: use abort 0 instead of error

* feat: remove 'Ms' suffix from Error names

* docs: error docs don't reference internal variables

* docs: rephrase rate_limiter error messages without internal field names

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

* docs: update README

* docs: update README

* docs: align invariants.md to be sharing-ready

* docs: improve wording & clarity for invariants.md

* feat: cooldown now decrements available by amount

* test: change abort 0 to 100 (avoids confusing with ERateLimited)

* test: change all destructor patterns into abortions

* docs: invariant rewording

* docs: update format for invariants.md

* docs: update format for invariants.md and add missing invariants

* docs: align invariants format

* docs: update outdated invariant references

* docs: remove rate limiter temp. artifacts

* chore: simplify changelog

* ref: convert assert macros into funs

* docs: document private funs

* test(fix): add proper teardown in happy tests

* ci: add contracts/utils to CI test job dir matrix

* test: add regression tests for bucket_accrue

* fix: bucket_accrue double spend bug

* docs: add empty line before enum variant docs

Co-authored-by: Daniel Bigos <daniel.bigos96@gmail.com>

* Revert "docs: add empty line before enum variant docs"

This reverts commit 21a9076.

* feat: inline config validation assertions

* docs: add more info on rate limiter types in README

* docs: add clarifying comments for apparent overflow suspects

* docs: mention library being access control-agnostic

* docs: reword library to module

* feat: add initial_available to all limiter types

* ref: put capacity as first cooldown type field

* ref: use spread op instead of ignoring cooldown_ms field

* docs: show identical API for all types in README

* docs: for fixed window update wording that it resets to full capacity

* fix: reconfigure sets last_refill to now + forbid 0 initial available for cooldown

* docs: remove post-core artifact

* test: add bucket_reconfigure_to_faster_rate_discards_old_subinterval

* docs: add SAFETY before overflow-related comments

* test: verify available always returns up-to-date accrual state

* test: add missing zero-config reconfigure tests

* test: add try_consume_with_zero_amount for all limiter types

* test: add try_consume_of_available_aborts_when_drained

* docs: note that try_consume(0) aborts after available() == 0

* docs: note RateLimiter enum is not upgrade-compatible

Adding variants or fields to a deployed public enum would break BCS
deserialization for integrator objects that already stored the prior
shape. Document this constraint at the module level.

* test: add edge case test cases

* docs: remove llm artifacts

* ref: reorder fileds in new_cooldown

* test: remove Pub.local.toml

* ref: in reconfigure_fixed_window move let now into match

* ref: in reconfigure_bucket move let now into match

* docs: remove mention of reconfigure_cooldown clamping available to 0

* fix: align cooldown clamp behavior on reconfigure

* fix: try_consume updates state only on success

* docs: align

* ref: fixedwindow now shares bucket's internal logic

* ref: update capacity prior to accrual on reconfigure_bucket

* docs: add comment

* Revert "docs: add comment"

This reverts commit ecb0145.

* Revert "ref: update capacity prior to accrual on reconfigure_bucket"

This reverts commit b545b6d.

* ref: Rate Limiter: Reconfiguration via Rich `new_*` Functions (#326)

* impl

* simplify further

* fix: expose last_refill_ms for bucket

* tests: add missing

* docs: update utils README

* docs: fix new_cooldown accepted combos

* feat: project bucket-shaped anchor getters

`last_refill_ms` and `window_start_ms` now take `&Clock` and return the
anchor advanced by every whole interval elapsed since the last commit,
so the snapshot `(anchor, available(clock))` is internally coherent.
`cooldown_end_ms` stays a plain getter — a cooldown deadline does not
evolve with time.

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

* fix: error numbering

* fix: error messages no longer reference private fields

* docs: move EBucketAnchorInFuture comment next to the error

* add spec

* update spec

* tests: add missing invariant tests

* feat: add is_type discriminator getters

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Eric Nordelo <eric.nordelo39@gmail.com>
Co-authored-by: Daniel Bigos <daniel.bigos96@gmail.com>

* tests: fix formatting in rate limiter tests (#334)

* feat: add median implementation (#135)

* add separate quick_sort implementations for each type

* remove duplicated qsort implementations

* add in-place qsort implementation

* add partition function

* rewrite qsort without recursion

* convert quick_sort to macro

* add comprehensive test cases for qsort

* update qsort documentation

* add review fixes

* remove --trace flag from testing pipeline

* Revert "remove --trace flag from testing pipeline"

This reverts commit 9bf7065.

* split macro module

* inline partition macro

* add median implementation

* add more edge case test cases

* fix fmt

* remove quick_sort duplicate

* feat: add median

* docs: update PR

* Route median through u256 workhorse fun (#325)

* fix: fmt

* fix: apply CR comments

* test: add missing test

* fix: macro

* feat: use quickselect

* feat: improve CHANGELOG

* feat: apply review updates

* feat: update comment

---------

Co-authored-by: Daniel Bigos <daniel.bigos@openzeppelin.com>
Co-authored-by: Daniel Bigos <daniel.bigos@icloud.com>
Co-authored-by: immrsd <103599616+immrsd@users.noreply.github.com>
Co-authored-by: Eric Nordelo <eric.nordelo39@gmail.com>

* feat: update check

* feat: update version

* feat: bump version

* feat: apply improvements

* feat: improvements

* feat: improve median impl

* docs: math/core doc-quality pass + median wrapper docs and u128 tests (#365)

Post-review follow-ups on the N-04 median work plus a doc-quality sweep of
math/core (move-quality checklist):

- vector: document #### Parameters / #### Returns on the median_u8..median_u256
  wrappers (previously only #### Aborts).
- median tests: add median_u128_even_length_rounding_modes and extend
  median_u128_basics with the 0 & MAX overflow boundary (BTT gap fill).
- macros: add /// docs to EDivideByZero/EZeroModulus and the TEN_POW_* consts;
  fix spurious-bullet continuations in several #### Returns/#### Aborts blocks;
  add #### Generics to inv_mod/mul_mod, #### Aborts to mul_mod/mul_div_inner/
  inv_mod_extended_impl, and name EZeroModulus in inv_mod's #### Aborts.
- u512: add /// docs to the four error constants, HALF_BITS/HALF_MASK, and the
  hi/lo struct fields.
- decimal_scaling: tag example fences as ```move, promote the "Truncation
  Behavior" header to ####, and convert scale_amount's #### Examples to a
  fenced move block.
- decimal_scaling tests: rename "Test Helpers" section to "Test-Only Helpers".

All 753 tests pass with --lint --warnings-are-errors; prettier clean.

---------

Co-authored-by: Nenad <nenad.misic@openzeppelin.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Daniel Bigos <daniel.bigos96@gmail.com>
Co-authored-by: Alisander Qoshqosh <37006439+qalisander@users.noreply.github.com>
Co-authored-by: Daniel Bigos <daniel.bigos@openzeppelin.com>
Co-authored-by: Daniel Bigos <daniel.bigos@icloud.com>
Co-authored-by: immrsd <103599616+immrsd@users.noreply.github.com>

* feat: add Published info (#369)

* feat: add Published info (#371)

* chore: Add core math diff audit report (#372)

* chore: add core math diff audit report

* chore: update name and commit range

* chore: update changelog for release v1.3 (#373)

* docs: update docs' URLs (#387)

* docs: use relative paths for example links in README

* docs: link to specific examples in rate_limiter mod docs

* docs: change tree to block in gh urls

* remove .skills

---------

Co-authored-by: Eric Nordelo <eric.nordelo39@gmail.com>
Co-authored-by: immrsd <103599616+immrsd@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Daniel Bigos <daniel.bigos96@gmail.com>
Co-authored-by: Alisander Qoshqosh <37006439+qalisander@users.noreply.github.com>
Co-authored-by: Daniel Bigos <daniel.bigos@openzeppelin.com>
Co-authored-by: Daniel Bigos <daniel.bigos@icloud.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.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.

3 participants