Skip to content

test(smoke): ERC-8056 scheduled-multiplier journey + advisory Vibenet workflow (BOP-473) - #182

Merged
robriks merged 4 commits into
mainfrom
bop-473-scheduled-multiplier-smoke
Jul 28, 2026
Merged

test(smoke): ERC-8056 scheduled-multiplier journey + advisory Vibenet workflow (BOP-473)#182
robriks merged 4 commits into
mainfrom
bop-473-scheduled-multiplier-smoke

Conversation

@robriks

@robriks robriks commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds live-network smoke coverage for the ERC-8056 "Scaled UI Amount" scheduled-multiplier surface (AssetV2 @ Cobalt, shipped in base/base #4120/#4121 and base-std #173) plus an advisory, manually-triggered CI workflow to run it against Vibenet. This is the smoke-test sibling of the merged fork tests (BOP-432); BOP-473.

The existing script/smoke/ harness is extended in place — no parallel system.

What's here

  • New multiplier journey (script/smoke/journeys/scheduled_multiplier.py), registered in __main__.py / Makefile (make smoke-multiplier). Exercises the full ERC-8056 surface:
    • setUIMultiplier scheduling + guards: InvalidMultiplier (0 / > uint128.max), EffectiveAtInPast, EffectiveAtTooFar, ScheduleOverlap.
    • cancelScheduledMultiplier clears a live pending (+ MultiplierUpdateCancelled, effectiveAt()==0), and NoScheduledMultiplier when none is live.
    • updateMultiplier V2 event semantics: emits UIMultiplierUpdated (+ MultiplierUpdateCancelled when clearing a live pending), not V1's MultiplierUpdated — asserted with a negative check.
    • Read aliases: uiMultiplier()==multiplier(), balanceOfUI==scaledBalanceOf, totalSupplyUI==toScaledBalance(totalSupply()).
    • ERC-165: advertises 0x01ffc9a7 + the three ERC-8056 ids (0xa60bf13d, 0x4bd27648, 0xd890fd71); an unadvertised id reads false.
  • Fork-gated, no runtime selector. The journey probes supportsInterface(0xa60bf13d) and cleanly SKIPS on a pre-Cobalt chain (recorded as skip, not fail) — mirroring the existing features_activated preflight skip. One journey stays correct on both a Beryl-Vibenet (V1, skips) and a Cobalt-Vibenet (V2, runs).
  • Fixes the step-7 gotcha in asset_lifecycle. Its flow-level event check asserted V1 MultiplierUpdated, which AssetV2 no longer emits (the current ABI doesn't even declare it) — so it would fail on Cobalt. The rebase-event assertion is now fork-aware (V1 MultiplierUpdated vs Cobalt UIMultiplierUpdated) via the same probe.
  • No time travel on a live chain. Scheduled state is asserted read-only (pending target / effectiveAt, current multiplier unchanged). Observing the lazy flip is opt-in via SMOKE_OBSERVE_FLIP=1 (bounded real-time poll; soft-skips on timeout so the advisory run stays green).
  • Harness additions (chain.py): a Skip signal (recorded as skip), supports_erc165 (treats an absent/reverting selector as "not advertised"), and per-receipt assert_log / assert_no_log.
  • Advisory workflow (.github/workflows/smoke-tests.yml): workflow_dispatch only — not PR/merge_group/schedule, because Vibenet is a live, per-hardfork chain and an automated run would flap. Inputs: journey, fork, base_std_ref (latest=main; pin a prior hardfork's ref — branch-per-fork), rpc_url (default https://rpc.vibes.base.org/). Exports RPC_URL from the input and DEPLOYER_PK/USER2_PK from repo secrets (SMOKE_DEPLOYER_PK/SMOKE_USER2_PK); reports pass / skip / fail + chain id / fork / base-std ref. Never gates merges.

Testing

forge fmt --check, forge build, and forge test (reference/unit) all green (689 passed). Python imports + ABI/error/interface-id references validated statically.

Ran the suite against a local anvil --base (Cobalt, BaseUpgrade::Cobalt) built from base-anvil-fork patched onto base/base @ the ERC-8056 merge, per the b20-fork-testing runbook:

Scenario Result
multiplier vs ERC-8056 Cobalt anvil ✅ green (all steps)
multiplier vs pre-ERC-8056 chain (Cobalt shell, V1 asset) ⏭️ skips cleanly (probe reverts → not applicable)
asset vs ERC-8056 Cobalt anvil ✅ green — takes the V2 branch (UIMultiplierUpdated, 14 events)
asset vs pre-ERC-8056 chain ✅ green — takes the V1 branch (MultiplierUpdated)
opt-in lazy flip, idle node ✅ green (soft-skip; clock doesn't advance without blocks)
opt-in lazy flip, --block-time 2 ✅ green — flip observed; uiMultiplier/newUIMultiplier mirror the matured value

Note: base-anvil-fork's current pinned base rev predates base/base #4120/#4121, so a stock anvil --base still installs the V1 asset (the journey correctly skips there). The green run above used an anvil patched onto base/base @ the ERC-8056 merge. Once base-anvil-fork bumps its base pin (BOP-427/428), a stock build will exercise the green path directly.

Test plan (reviewer)

  • Confirm workflow_dispatch-only trigger and that the job is advisory (non-gating).
  • Confirm SMOKE_DEPLOYER_PK / SMOKE_USER2_PK repo secrets exist before dispatching.
  • Dispatch Base Std Smoke Tests (Vibenet) with journey=multiplier, fork=cobalt once Vibenet is on Cobalt; expect pass (or a clean "skipped" if not yet).

Made with Cursor


Re-homed from a base/base-std branch (was previously a fork PR, whose read-only token 403'd on the Forge/Interface Coverage "post PR comment" steps — the actual build/test/coverage checks passed). Same commits: the ERC-8056 journey + advisory workflow, the lazy-flip fix, the "run the full suite / drop selectors" review change, and event-payload decoding aligned with #178.

robriks and others added 4 commits July 28, 2026 15:49
… workflow (BOP-473)

Adds live-network smoke coverage for the AssetV2 @ Cobalt scheduled-multiplier
surface (ERC-8056) and an advisory, manually-triggered CI workflow to run it.

- New `multiplier` journey: setUIMultiplier scheduling + guards (InvalidMultiplier,
  EffectiveAtInPast/TooFar, ScheduleOverlap), cancelScheduledMultiplier
  (+ NoScheduledMultiplier), the updateMultiplier V2 event semantics
  (UIMultiplierUpdated + MultiplierUpdateCancelled, not MultiplierUpdated), the
  read aliases (uiMultiplier/balanceOfUI/totalSupplyUI), and ERC-165 advertisement.
  Scheduled state is asserted read-only (no time travel on a live chain); the lazy
  flip is opt-in via SMOKE_OBSERVE_FLIP (bounded real-time poll, soft-skips).
- Fork-gated via supportsInterface(0xa60bf13d): cleanly SKIPS on a pre-Cobalt chain,
  mirroring the existing features-not-active preflight skip (no runtime fork selector).
- Fix asset_lifecycle step-7 rebase event assertion to be fork-aware (V1
  MultiplierUpdated vs Cobalt UIMultiplierUpdated) so it stays green on both forks.
- Harness: add a Skip signal (recorded as skip, not fail), supports_erc165, and
  per-receipt assert_log / assert_no_log helpers.
- Advisory workflow_dispatch-only smoke workflow (never gates merges; Vibenet is a
  live, per-hardfork chain). Reports pass/skip/fail + chain id / fork / base-std ref.

Co-authored-by: Cursor <cursoragent@cursor.com>
The tidy-up cancelScheduledMultiplier raced maturation: on a chain that only
advances its block clock when mining (e.g. anvil), the cancel tx mined a block
whose timestamp jumped past effectiveAt, so the pending had matured and cancel
reverted NoScheduledMultiplier — failing the (advisory) journey. The cleanup is
non-essential (throwaway token), so drop it; the soft-skip now just logs and the
journey stays green. Found while validating against a local ERC-8056 anvil.

Co-authored-by: Cursor <cursoragent@cursor.com>
…review)

Addresses review feedback (Stephan Ciliers): the smoke suite should run as a
whole rather than exposing per-suite granularity, and the Vibenet workflow should
always run the latest rather than offer fork/ref selection.

- Makefile: remove the six per-journey targets; `make smoke` / `make smoke-all`
  now run the full suite in one process (KEEP_GOING=1 for the audit summary). The
  raw `python -m smoke <journey>` CLI is kept as a documented debugging escape
  hatch (cheaper/faster than the whole suite on a live chain), so nothing is lost.
- Workflow: drop the `journey`, `fork`, and `base_std_ref` inputs (keep only
  `rpc_url`). It always runs `python -m smoke all -k` against the dispatched ref
  (latest = main; branch-per-fork for older forks) and reports per-journey
  passed/failed/skipped from the runner summary. No journey picker, no fork/ref
  selector — consistent with the repo's no-runtime-fork-selector model.
- Docs: README + CLI docstring updated to match (full-suite entrypoint, CLI for
  ad-hoc single-journey debugging, single rpc_url workflow input).

Co-authored-by: Cursor <cursoragent@cursor.com>
Mirrors the composite-policy smoke PR (#178): `assert_events_emitted` and the
per-receipt `assert_log` are presence-only — an event with the right name but a
wrong payload passes them. #178 added `composite_children_from` to decode the
specific receipt; do the same here.

- chain.py: add `event_args(receipt, contract, event_name)` to decode a single
  event from a specific receipt and return its args.
- scheduled_multiplier: assert the scheduled/cancelled values from the event
  payloads — setUIMultiplier's UIMultiplierUpdated (old, target, effectiveAt) and
  the MultiplierUpdateCancelled payloads on cancel and on the updateMultiplier
  failsafe — which a presence-only check cannot verify.

Validated green against a local ERC-8056 Cobalt anvil.

Co-authored-by: Cursor <cursoragent@cursor.com>
@linear

linear Bot commented Jul 28, 2026

Copy link
Copy Markdown

BOP-473

@github-actions

Copy link
Copy Markdown

Interface Coverage

✅ All interface functions have test coverage.

@github-actions

Copy link
Copy Markdown

📊 Forge Coverage (src/lib/)

🟡 ≥95% across all metrics — some metrics below 99%.

File Lines Stmts Branches Funcs
🔴 B20FactoryLib.sol 95.40% 96.00% 100.00% 90.00%
🔴 test/lib/ForceFeeder.sol 0.00% 0.00% 100.00% 0.00%
🔴 test/lib/PrecompileProbe.sol 0.00% 0.00% 0.00% 0.00%
🟢 MockActivationRegistry.sol 100.00% 100.00% 100.00% 100.00%
🟢 MockActivationRegistryStorage.sol 100.00% 100.00% 100.00% 100.00%
🟢 MockB20.sol 100.00% 100.00% 100.00% 100.00%
🟢 MockB20Asset.sol 100.00% 100.00% 100.00% 100.00%
🟡 MockB20Factory.sol 98.96% 99.10% 100.00% 100.00%
🟢 MockB20Stablecoin.sol 100.00% 100.00% 100.00% 100.00%
🟢 MockB20Storage.sol 100.00% 100.00% 100.00% 100.00%
🟢 MockPolicyRegistry.sol 100.00% 100.00% 100.00% 100.00%
🟢 MockPolicyRegistryStorage.sol 100.00% 100.00% 100.00% 100.00%
Total 96.72% 97.32% 98.67% 96.44%

Full report: download artifact. To browse locally: make coverage (runs forge coverage + genhtml + opens the HTML report).

@robriks robriks self-assigned this Jul 28, 2026
@github-actions

Copy link
Copy Markdown

⚠️ Fork tests: 84 failed, 663 passed

These failures indicate divergences where base/base needs to catch up to the base-std spec. This check is advisory and does not block merging.

Failing tests
  • test_burnBlockedWithMemo_revertOrder_blocked_beats_balance(address): Error != expected error: custom error 0x6f872692 != AccountNotBlocked(0xfB31241e5eA93B7F7e9C81d9deF8A4861328f28C); counterexample: calldata=0x2cf250e8000000000000000000000000fb31241e5ea93b7f7e9c81d9def8a4861328f28c args=[0xfB31241e5eA93B7F7e9C81d9deF8A4861328f28C]
  • test_burnBlockedWithMemo_revertOrder_pause_beats_blocked(address): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0x26d489860000000000000000000000002e52f6d4f683b31da8884935fe77318f20c611cc args=[0x2E52f6d4F683b31da8884935fE77318f20c611cc]
  • test_burnBlockedWithMemo_revertOrder_pause_beats_role(address,address): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0x53c0e66c0000000000000000000000009a5d12a3e782bfe78cfa6a651c0b0c757dbe08af000000000000000000000000ded138620f3b68d5db37b824140498f274f9266a args=[0x9A5d12a3E782BFE78cfA6A651c0b0c757DBe08AF, 0xdeD138620f3B68D5db37b824140498F274f9266a]
  • test_burnBlockedWithMemo_revertOrder_role_beats_blocked(address,address): Error != expected error: custom error 0x6f872692 != AccessControlUnauthorizedAccount(0x9a78ee444BBd1F1298AAc23Ccb67B1f469aF1745, 0x7408fdc0d31c7bcb349eab611f5d1168acd4303574993f8cdc98b1cd18c41cae); counterexample: calldata=0xbd3f8b6b0000000000000000000000009a78ee444bbd1f1298aac23ccb67b1f469af17450000000000000000000000006ac08a1d33bce39472ca7c6fc2ebd53806196ed9 args=[0x9a78ee444BBd1F1298AAc23Ccb67B1f469aF1745, 0x6AC08a1D33BCE39472Ca7c6fc2EBD53806196Ed9]
  • test_burnBlockedWithMemo_revert_accountNotBlocked(address,uint256): Error != expected error: custom error 0x6f872692 != AccountNotBlocked(0x0000000000000000000000000000000000002C1f); counterexample: calldata=0xf0e9ee6a0000000000000000000000000000000000000000000000000000000000002c1f00000000000000000000000000000000000000000000000000000000000011cf args=[0x0000000000000000000000000000000000002C1f, 4559]
  • test_burnBlockedWithMemo_revert_insufficientBalance(address,uint256): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0xeb275e77000000000000000000000000bbc37e41d63225937f78dd42aeedf6bf4baa899f0000000000000000000000000000000000000000000000003a4dcb169a9e6794 args=[0xBbC37e41D63225937f78Dd42AeEDf6bf4BAa899F, 4201237325350332308 [4.201e18]]
  • test_burnBlockedWithMemo_revert_unauthorized(address,address,uint256): Error != expected error: custom error 0x6f872692 != AccessControlUnauthorizedAccount(0xCB00000000000000000000000000000000000000, 0x7408fdc0d31c7bcb349eab611f5d1168acd4303574993f8cdc98b1cd18c41cae); counterexample: calldata=0xb8e4c85b000000000000000000000000cb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036400000000000000000000000000000000000000000000000000000000000001af args=[0xCB00000000000000000000000000000000000000, 0x0000000000000000000000000000000000000364, 431]
  • test_burnBlockedWithMemo_revert_whenSeizePaused(address,uint256): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0xfce2f39a00000000000000000000000043f5d23f05b6378bfb8146e1e9ba032ac4a1749c0000000000000000005b1d37fda2b2e37e7787584acf0c2b8f1450fc2d4fe737 args=[0x43f5D23F05B6378Bfb8146e1e9Ba032ac4A1749c, 8727000407423309844528204948221795793542303075783403319 [8.727e54]]
  • test_burnBlockedWithMemo_success_debitsAndDecreasesSupply(address,uint256): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0x189a0bed000000000000000000000000655e4ec50957eef8c4f33f3008118af3e96279af0000000000000000000000000000000000000000000013baf3595bd0113e7644 args=[0x655E4EC50957Eef8C4F33f3008118af3E96279aF, 93173592719806580028996 [9.317e22]]
  • test_burnBlockedWithMemo_success_emitsTransferBurnedBlockedAndMemo(address,uint256,bytes32): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0x25c74b370000000000000000000000000000000000000000000000000000000000000e020000000000000000000000000000000000000000000000000000000000000105000000000000000000000000000000000000000000000000000000002f2ff15d args=[0x0000000000000000000000000000000000000e02, 261, 0x000000000000000000000000000000000000000000000000000000002f2ff15d]
  • test_burnBlocked_revertOrder_pause_beats_balance(address,uint256): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0xca82fe43000000000000000000000000cb10bcf9e9dcea24199cb249efc91951822edf3b00000000000000000000000000000000000000000000000117ae39434fbbff33 args=[0xCb10bcf9e9DCea24199cB249EFC91951822edF3b, 20153108343792860979 [2.015e19]]
  • test_burnBlocked_revertOrder_pause_beats_blocked(address,uint256): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0x4c29bb13000000000000000000000000b4b519420718034f44a387ed7b20166dc72fe1f00000000000000000000000000000000000000000000000000000000000000003 args=[0xb4B519420718034f44A387ed7B20166DC72FE1f0, 3]
  • test_burnBlocked_revertOrder_pause_beats_role(address,address,uint256): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0x022471a500000000000000000000000031b6014b842c8d72ad3379b96abff22b8a7083c7000000000000000000000000819c8ec4a685725b8b94bd2ffedcdc552e14bfbc00000000000000000000032a64a3be616e92327a71ff3a96c100222f82c936a3 args=[0x31B6014b842c8d72ad3379B96Abff22B8a7083C7, 0x819C8eC4A685725B8B94Bd2FFedcdc552e14bFBC, 1184390876921069798993457276223584671167679163872931 [1.184e51]]
  • test_burnBlocked_revert_insufficientBalance(address,uint256): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0x15f3e92c00000000000000000000000000000000000000000000000000000000000008ac0000000000000000000000000000000000000000000000000000000037c7ec0b args=[0x00000000000000000000000000000000000008Ac, 935848971 [9.358e8]]
  • test_burnBlocked_revert_whenSeizePaused(address,uint256): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0xf55efb320000000000000000000000003ba2595db18fc5fb17b361be387ff3fd66f0bfda000000000000000000000000000000000000000000000000165fe402eef0e7b5 args=[0x3ba2595dB18FC5Fb17b361bE387ff3Fd66F0BfDa, 1612257892871759797 [1.612e18]]
  • test_burnBlocked_success_debitsTarget(address,uint256): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0x485c308e00000000000000000000000000000000000000000000000000000000000036c900000000000000000000000000000000000000000000000000000000d116fc21 args=[0x00000000000000000000000000000000000036C9, 3507944481 [3.507e9]]
  • test_burnBlocked_success_decreasesTotalSupply(address,uint256): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0x8bb754f20000000000000000000000000b89b88b484f9139aed221afb6932b6d2337ef63000000000000000000000000000000000000000000000000000000000000000a args=[0x0B89b88B484f9139aed221Afb6932B6d2337ef63, 10]
  • test_burnBlocked_success_emitsTransferAndBurnedBlocked(address,uint256): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0x89de84f8000000000000000000000000af90e11ac0ca0190e433a1139b9b142f2ded08170000000000000000000000000000000000000000000000000000000000000003 args=[0xaF90e11ac0Ca0190E433a1139b9B142F2dEd0817, 3]
  • test_policyId_success_reflectsUpdatePolicy(uint8,uint64): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0xa21d943e00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000001c9f72ed9b args=[3, 122934193563 [1.229e11]]
  • test_policyId_success_zeroByDefault(uint8): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0x11a5c8f4000000000000000000000000000000000000000000000000000000000000000d args=[13]
  • test_transferFromSeizableWithMemo_revertOrder_blocked_beats_balance(address,address): Error != expected error: custom error 0x5dd87dfc != AccountNotBlocked(0xaaa491531568822c6f584f4D8328EDbBC321ee0F); counterexample: calldata=0xa308af88000000000000000000000000aaa491531568822c6f584f4d8328edbbc321ee0f000000000000000000000000ebd1228db5c5678493bf8c84f733dfbffe7c8512 args=[0xaaa491531568822c6f584f4D8328EDbBC321ee0F, 0xeBd1228Db5c5678493BF8c84F733dFBfFe7C8512]
  • test_transferFromSeizableWithMemo_revertOrder_pause_beats_blocked(address,address): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0x99aeda8c0000000000000000000000000000000000000000000000000000000090c5013b000000000000000000000000cb00000000000000000000000000000000000000 args=[0x0000000000000000000000000000000090C5013b, 0xCB00000000000000000000000000000000000000]
  • test_transferFromSeizableWithMemo_revertOrder_pause_beats_role(address,address,address): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0xcc85f153000000000000000000000000c03ceb0cacea7d1f3bbd0888bc724cfc171e868d000000000000000000000000363ed4e8cfa6534d7e6efa60a20feb6a78a6be5b000000000000000000000000a0f507ea3b15ae7f96c323cdd665cbe7a7e8968d args=[0xc03ceB0CaCEa7d1f3BbD0888bc724cFC171e868d, 0x363Ed4E8cfa6534d7E6EFA60A20feb6A78A6Be5b, 0xa0F507eA3B15Ae7f96c323CDD665Cbe7A7E8968d]
  • test_transferFromSeizableWithMemo_revertOrder_role_beats_zeroActors(address,address): Error != expected error: custom error 0x5dd87dfc != AccessControlUnauthorizedAccount(0x6E9715fA09a3272059b9c75588191B36760D65C1, 0x466d0fa97b99b3315998c229880e8a3a6aa5f5586b46f762a35e210facb4ea63); counterexample: calldata=0x9797d0e20000000000000000000000006e9715fa09a3272059b9c75588191b36760d65c1000000000000000000000000c4630f5b73d496851ed15c7fffb071024a1f4686 args=[0x6E9715fA09a3272059b9c75588191B36760D65C1, 0xC4630f5B73d496851ed15c7fFFB071024a1f4686]
  • test_transferFromSeizableWithMemo_revertOrder_zeroActors_beats_blocked(address): Error != expected error: custom error 0x5dd87dfc != InvalidReceiver(0x0000000000000000000000000000000000000000); counterexample: calldata=0x289bd19b000000000000000000000000232b62cb7cc7c2da52e488fb1a10d93480f30e52 args=[0x232B62cB7cc7c2Da52E488fB1A10d93480f30E52]
  • test_transferFromSeizableWithMemo_revert_accountNotBlocked(address,address,uint256): Error != expected error: custom error 0x5dd87dfc != AccountNotBlocked(0x6762D3FF71f7e8B2BE3f5f9174254Af9DCAb7519); counterexample: calldata=0x608e309d0000000000000000000000006762d3ff71f7e8b2be3f5f9174254af9dcab751900000000000000000000000002959ff16b1d32fbb1ff05d6402ddb973b389438000000000000000006d1d2da26f1a06939ca43bfc6c510064a1a62f172d5bd57 args=[0x6762D3FF71f7e8B2BE3f5f9174254Af9DCAb7519, 0x02959ff16b1d32FBB1fF05D6402ddB973b389438, 167216684083395953748791625425155644629400757390747745623 [1.672e56]]
  • test_transferFromSeizableWithMemo_revert_insufficientBalance(address,address,uint256): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0x2c2ee054000000000000000000000000f7949c56db942d569730bd3c067a4f0267724006000000000000000000000000dcbd22fea454839a6970b783269aa6c20b848376000000000000000000000000000000000000000000000000000000001637ee65 args=[0xf7949c56db942D569730bd3c067a4F0267724006, 0xDCbd22FEa454839a6970B783269aa6C20B848376, 372764261 [3.727e8]]
  • test_transferFromSeizableWithMemo_revert_invalidReceiver(address,uint256): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0x42470206000000000000000000000000585be22ea39646058022cb1e80f373df04718e79010986e0da548a93069327a7d6f7059cb501544c1d727af49127f798d2310fb1 args=[0x585be22ea39646058022cb1E80f373Df04718E79, 469145368197653084424893181560463511196335577463924511371187900614005821361 [4.691e74]]
  • test_transferFromSeizableWithMemo_revert_unauthorized(address,address,address,uint256): Error != expected error: custom error 0x5dd87dfc != AccessControlUnauthorizedAccount(0x1413855abCd8a68D698bE01b8e15b1Ea00886f2C, 0x466d0fa97b99b3315998c229880e8a3a6aa5f5586b46f762a35e210facb4ea63); counterexample: calldata=0xf11809150000000000000000000000001413855abcd8a68d698be01b8e15b1ea00886f2c0000000000000000000000004ea1f9f85b3bc4ab4f8d47c020c654bc007cddc700000000000000000000000058d1f4e6d30ad703e0789035d09b66086de6f0650000000000000000000000000000000000000000000000000000000000000000 args=[0x1413855abCd8a68D698bE01b8e15b1Ea00886f2C, 0x4ea1f9F85B3BC4aB4F8D47C020c654Bc007CDDc7, 0x58d1f4E6d30ad703e0789035d09b66086De6F065, 0]
  • test_transferFromSeizableWithMemo_revert_whenSeizePaused(address,address,uint256): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0x420274fb0000000000000000000000000a75811f13fadd6683d5d4311d0e91dbe3c020e4000000000000000000000000de9d62179b8d26f448ffb06d8cc2eb219ccad4e6000000000000dddb56fcdd63486247037a8d1d15d4428a106368998cd32ae2a0 args=[0x0a75811F13FADD6683D5D4311D0e91dbe3c020e4, 0xde9d62179B8d26F448fFb06d8Cc2eb219Ccad4e6, 356510125994786552617595888228970103598024261136199530553467552 [3.565e62]]
  • test_transferFromSeizableWithMemo_success_emitsEvents(address,address,uint256,bytes32): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0x52d39738000000000000000000000000c4ff98986842899893af06d1b6b82061b57372f0000000000000000000000000c2aaeed1887d7c8df036df548f88e9b02befc55400000000000000000000000000000000000e48275c1b9ac5c3c83e3e78f1db6af870a716ffd93b3d616f7c98053e99ec6512585163646bc429f3b66450e0f503 args=[0xc4fF98986842899893AF06D1B6B82061B57372F0, 0xC2aaeED1887D7c8Df036DF548f88e9b02bEFc554, 74155607915281356626997326233328490 [7.415e34], 0xf870a716ffd93b3d616f7c98053e99ec6512585163646bc429f3b66450e0f503]
  • test_transferFromSeizableWithMemo_success_ignoresReceiverPolicy(address,address,uint256): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0xe5450ef300000000000000000000000031124b4b9cff39de6e52f9e0ae0bc6898a66b683000000000000000000000000039910b563890c2cfc123b7f60402f9c74ebc5f5000012a41953463864130ca8656bf4ccf116d978a1c5e95ad9bcac7cc1080cf6 args=[0x31124b4b9CfF39DE6E52F9E0aE0bc6898a66b683, 0x039910B563890c2CfC123b7f60402F9C74EbC5f5, 128655532559993766057594476593213701466127240245569410990951040188681462 [1.286e71]]
  • test_transferFromSeizableWithMemo_success_movesBalance(address,address,uint256): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0xdf16afc90000000000000000000000001949629d1830372b14f4d3fd6ea8a036ac495f7f0000000000000000000000008b39ec6171baffd0e4aa63d6528f5c73f26128ea000028a3fbae22a35b39f7a3763d1800cb82a8c3350be5a51ffdec36a71af6dc args=[0x1949629D1830372B14f4d3fd6ea8a036aC495f7F, 0x8b39ec6171bAFFd0E4AA63d6528f5c73f26128EA, 280490830198686455063594103840152003088592779734238525921464230166066908 [2.804e71]]
  • test_transferFromSeizableWithMemo_success_noAllowanceRequired(address,address,uint256): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0x16a6a880000000000000000000000000c6fd6ee6698f6f2a68862d2a5b748af82dce09920000000000000000000000008d327a1f288e049ee84baa07d0a500c27cc2eaf50000000000000000000000000000000000000000000000000000000000000001 args=[0xC6FD6Ee6698f6F2A68862d2A5B748Af82DCE0992, 0x8d327a1F288E049ee84BaA07d0a500C27cc2EAF5, 1]
  • test_updatePolicy_revert_policyNotFound(uint8,uint64): Error != expected error: UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25) != PolicyNotFound(72057594037928038 [7.205e16]); counterexample: calldata=0x74fd7f39000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000066f5 args=[3, 26357 [2.635e4]]
  • test_updatePolicy_success_builtinAllow(uint8): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0xde997e8b0000000000000000000000000000000000000000000000000000000000000021 args=[33]
  • test_updatePolicy_success_builtinReject(uint8): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0x56f5b9080000000000000000000000000000000000000000000000000000000000000003 args=[3]
  • test_updatePolicy_success_emitsPolicyUpdated(uint8,uint64): log != expected log; counterexample: calldata=0x59afa2fa000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000 args=[28, 0]
  • test_updatePolicy_success_writesSlot(uint8,uint64): UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25); counterexample: calldata=0x9746e8e10000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000ffffffffffffffff args=[128, 18446744073709551615 [1.844e19]]
    [FAIL: UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25)] test_b20Layout_success_populatedSnapshotMatchesAllSlots() (gas: 569463)
    [FAIL: UnsupportedPolicyType(0x3efcaab33335f8757bc9054f42ac0ae92950f9727a52ff4db8681fc9521c9e25)] test_seizePolicyIdsSlot_success_decodesSeizableLane() (gas: 12560)
    [FAIL: isPaused must still accept enum index 3 (SEIZE)] test_isPaused_revert_noFifthFeature() (gas: 9532)

@robriks
robriks merged commit 6519f99 into main Jul 28, 2026
13 of 16 checks passed
@robriks
robriks deleted the bop-473-scheduled-multiplier-smoke branch July 28, 2026 21:35
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.

2 participants