Skip to content

fix(b20-asset): bubble inner-call Panic from announce (BOP-477) - #185

Open
robriks wants to merge 2 commits into
mainfrom
bop-477-announce-system-errors
Open

fix(b20-asset): bubble inner-call Panic from announce (BOP-477)#185
robriks wants to merge 2 commits into
mainfrom
bop-477-announce-system-errors

Conversation

@robriks

@robriks robriks commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

Summary

Reconciles a base/base (Rust, authoritative) ↔ base-std (Solidity reference) divergence in IB20Asset.announce. When an inner call fails, the Rust precompile propagates system-level faults raw (Panic/OutOfGas/Fatal/SlotOverflow, via is_system_error()) and wraps only ordinary reverts as InternalCallFailed. The Solidity mock wrapped every inner failure — so e.g. announce([toScaledBalance(overflowing)]) reverts Panic(0x11) on-chain but InternalCallFailed in the reference.

Chosen direction (Rust is authoritative — OOG must halt to preserve EVM gas semantics, and a Panic is a VM-level fault): fix base-std to match Rust.

  • MockB20Asset.announce re-raises an inner Solidity Panic(uint256) (selector 0x4e487b71) unchanged via assembly { revert(add(ret, 0x20), mload(ret)) }; ordinary reverts still wrap as InternalCallFailed.
  • IB20Asset.announce natspec corrected: an inner Panic propagates raw; OOG halts the whole call; any other revert wraps as InternalCallFailed. InternalCallFailed error doc clarified.
  • Added fork conformance test test_announce_innerPanic_propagatesRaw — asserts the raw Panic(0x11) payload from the live precompile (no livePrecompiles skip).
  • Added a smoke probe (asset journey, step 14b) + reusable expect_raw_panic helper asserting the raw Panic(0x11) payload via eth_call.

Scope / limitation

  • Only the arithmetic-overflow Panic (0x11) is reachable as an inner call on both sides, so that's what the conformance/smoke assert.
  • OutOfGas/Fatal/SlotOverflow are native-precompile faults a Solidity delegatecall cannot faithfully reproduce (OOG follows the 63/64 rule and yields empty returndata) — not synthesized in the mock.
  • Enum (0x21) / array-OOB (0x32) have no reachable inner-call selector: strict ABI decoding rejects an out-of-range enum as AbiDecodeFailed (an ordinary revert) before any conversion guard, and nothing produces an array-OOB. (Note: a malformed-enum inner call surfaces a decode-time Panic(0x21) in Solidity vs AbiDecodeFailed in Rust — not part of the conformance matrix.)

Test plan

  • forge test --match-contract B20AssetAnnounceTest (reference / mocks) — 14 pass
  • Full test/unit/B20Asset/* reference suite — 100 pass; forge fmt --check clean
  • Fork conformance vs a live anvil --base (Cobalt) node: test/unit/B20Asset/announcement/* — 20 pass, incl. test_announce_innerPanic_propagatesRaw
  • Smoke asset journey vs the same live node — green, incl. the step-14b raw Panic(0x11) probe

Companion (base/base): a test-only self-pin extension asserting every Panic kind classifies as a system error.

Made with Cursor

…477)

The Rust precompile propagates system-level faults from an announce inner
call raw (Panic/OutOfGas/Fatal/SlotOverflow via is_system_error) and wraps
only ordinary reverts as InternalCallFailed. The Solidity reference wrapped
every inner failure, so e.g. an overflowing toScaledBalance reverted
Panic(0x11) on-chain but InternalCallFailed in the mock.

- MockB20Asset.announce now re-raises an inner Solidity Panic(uint256)
  (selector 0x4e487b71) unchanged; only ordinary reverts wrap as
  InternalCallFailed.
- IB20Asset.announce natspec corrected: Panic propagates raw; OOG halts;
  else InternalCallFailed.
- Fork conformance test test_announce_innerPanic_propagatesRaw asserts the
  raw Panic(0x11) payload from the live precompile (no livePrecompiles skip).
- Smoke asset journey probes the raw Panic(0x11) payload via eth_call.

Scope: only the arithmetic-overflow Panic (0x11) is reachable as an inner
call on both sides. OOG/Fatal/SlotOverflow are native-precompile faults a
Solidity delegatecall cannot reproduce (OOG follows the 63/64 rule, empty
returndata); enum (0x21) / array-OOB (0x32) have no reachable inner-call
selector (strict ABI decode rejects out-of-range enums as AbiDecodeFailed
before any conversion guard, and nothing produces an array-OOB).

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

linear Bot commented Jul 30, 2026

Copy link
Copy Markdown

BOP-477

@github-actions

Copy link
Copy Markdown

Interface Coverage

✅ All interface functions have test coverage.

@github-actions

github-actions Bot commented Jul 30, 2026

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.75% 97.35% 98.69% 96.46%

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

@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown

⚠️ Fork tests: 78 failed, 672 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(0x4412ca18312Ed9921757bADa29B45d1eF676F9be); counterexample: calldata=0x2cf250e80000000000000000000000004412ca18312ed9921757bada29b45d1ef676f9be args=[0x4412ca18312Ed9921757bADa29B45d1eF676F9be]
  • test_burnBlockedWithMemo_revertOrder_pause_beats_blocked(address): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0x26d48986000000000000000000000000000000000000000000000000000000000000420b args=[0x000000000000000000000000000000000000420b]
  • test_burnBlockedWithMemo_revertOrder_pause_beats_role(address,address): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0x53c0e66c000000000000000000000000000000000000000000000000000000000000103900000000000000000000000000000000000000000000000000000000389ed266 args=[0x0000000000000000000000000000000000001039, 0x00000000000000000000000000000000389Ed266]
  • test_burnBlockedWithMemo_revertOrder_role_beats_blocked(address,address): Error != expected error: custom error 0x6f872692 != AccessControlUnauthorizedAccount(0x518C7Ad990D1d7b2e3b6865f911B3c7E293c41dC, 0x7408fdc0d31c7bcb349eab611f5d1168acd4303574993f8cdc98b1cd18c41cae); counterexample: calldata=0xbd3f8b6b000000000000000000000000518c7ad990d1d7b2e3b6865f911b3c7e293c41dc0000000000000000000000002154854756739a6256dd44227deb80edbfa1e3d3 args=[0x518C7Ad990D1d7b2e3b6865f911B3c7E293c41dC, 0x2154854756739a6256dD44227dEB80eDBfa1E3d3]
  • test_burnBlockedWithMemo_revert_accountNotBlocked(address,uint256): Error != expected error: custom error 0x6f872692 != AccountNotBlocked(0x0000000000000000000000000000000000000CBD); counterexample: calldata=0xf0e9ee6a0000000000000000000000000000000000000000000000000000000000000cbd00000000000000000000000000000000000000000000000029a2241af62c0000 args=[0x0000000000000000000000000000000000000CBD, 3000000000000000000 [3e18]]
  • test_burnBlockedWithMemo_revert_insufficientBalance(address,uint256): Error != expected error: custom error 0x6f872692 != InsufficientBalance(0xA614ecd21bD0C653e48F363dc39a70669d310A44, 0, 158120858599111423958014709196434867553180601903599153 [1.581e53]); counterexample: calldata=0xeb275e77000000000000000000000000a614ecd21bd0c653e48f363dc39a70669d310a4400000000000000000001a69eae8aa51f006be106d4d144dcdbcd78803805ce31 args=[0xA614ecd21bD0C653e48F363dc39a70669d310A44, 158120858599111423958014709196434867553180601903599153 [1.581e53]]
  • test_burnBlockedWithMemo_revert_unauthorized(address,address,uint256): Error != expected error: custom error 0x6f872692 != AccessControlUnauthorizedAccount(0x12F0a5626655c3bD89cAB21E2D4Bc826A5d9eD6f, 0x7408fdc0d31c7bcb349eab611f5d1168acd4303574993f8cdc98b1cd18c41cae); counterexample: calldata=0xb8e4c85b00000000000000000000000012f0a5626655c3bd89cab21e2d4bc826a5d9ed6f00000000000000000000000068e38ff830a4fba6b6954dcd097571bf852306820000000000000000000000000000000000000000000000000000011112d32b2e args=[0x12F0a5626655c3bD89cAB21E2D4Bc826A5d9eD6f, 0x68e38ff830a4FBa6B6954dcD097571bF85230682, 1172841900846 [1.172e12]]
  • test_burnBlockedWithMemo_revert_whenSeizePaused(address,uint256): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0xfce2f39a0000000000000000000000009be41e498abc5c734bcd2239fcb81ced37196fac0000000000000000000000283a34bdcf05525960c639163f35538c3540403c2e args=[0x9Be41e498abC5C734bcD2239fcb81ceD37196fAC, 58792363131361787789400183467121828192325331860526 [5.879e49]]
  • test_burnBlockedWithMemo_success_debitsAndDecreasesSupply(address,uint256): custom error 0x6f872692; counterexample: calldata=0x189a0bed00000000000000000000000057dd2902b95b404a0aa3dbdaec6e820df76083c500000000000000000000000000000000000000000000000000001b134266eff8 args=[0x57Dd2902b95b404a0aa3dbDaeC6E820df76083C5, 29769532370936 [2.976e13]]
  • test_burnBlockedWithMemo_success_emitsTransferBurnedBlockedAndMemo(address,uint256,bytes32): log != expected log; counterexample: calldata=0x25c74b37000000000000000000000000a459e47ead3427061b436fc03548443fd9386965fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeff618092f005b74bf3dc1bb7fdee34aa6f7bd0ed888a56dea74d9a2124675944 args=[0xa459e47EAd3427061B436Fc03548443FD9386965, 115792089237316195423570985008687907853269984665640564039457584007913129639934 [1.157e77], 0xff618092f005b74bf3dc1bb7fdee34aa6f7bd0ed888a56dea74d9a2124675944]
  • test_burnBlocked_revertOrder_pause_beats_balance(address,uint256): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0xca82fe430000000000000000000000000b442974b53935d1edc7fd64eb21e047a839171c0000000000000000000000000000000000000000000000000000000000093a80 args=[0x0B442974b53935d1EDc7Fd64EB21e047A839171C, 604800 [6.048e5]]
  • test_burnBlocked_revertOrder_pause_beats_blocked(address,uint256): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0x4c29bb13000000000000000000000000d39d02a47f1deb138a0f9ccd785b43a6f355bb94000000000000000000000000000000000000000000000000000098d096bcbe88 args=[0xd39d02A47f1deB138a0F9CCD785B43A6F355bb94, 168021649571464 [1.68e14]]
  • test_burnBlocked_revertOrder_pause_beats_role(address,address,uint256): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0x022471a50000000000000000000000007a199d67fd6229cd60d5d460f4d495ab028f5043000000000000000000000000785dc7158d250ca2d3eab168122a6428468d02eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff args=[0x7a199D67FD6229cD60d5D460F4D495aB028F5043, 0x785DC7158d250Ca2d3EAb168122a6428468D02EE, 115792089237316195423570985008687907853269984665640564039457584007913129639935 [1.157e77]]
  • test_burnBlocked_revert_insufficientBalance(address,uint256): Error != expected error: AccountNotBlocked(0x38820A60accEbE9F35909dCB43Fa3393C79194d9) != InsufficientBalance(0x38820A60accEbE9F35909dCB43Fa3393C79194d9, 0, 118303229617087995730077795130582274046 [1.183e38]); counterexample: calldata=0x15f3e92c00000000000000000000000038820a60accebe9f35909dcb43fa3393c79194d90000000000000000000000000000000059005f8ce6a0557f1bd762ec0da48ffe args=[0x38820A60accEbE9F35909dCB43Fa3393C79194d9, 118303229617087995730077795130582274046 [1.183e38]]
  • test_burnBlocked_revert_whenSeizePaused(address,uint256): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0xf55efb320000000000000000000000004b4253a1b8b1e8cd8750977d7aae388bdf3571e60000000000000000000000000000000000000000000000000000000000000780 args=[0x4B4253A1B8b1e8Cd8750977d7Aae388BdF3571E6, 1920]
  • test_burnBlocked_success_debitsTarget(address,uint256): AccountNotBlocked(0xaFEfd7916C12E3894721266842a4A4dED8AC5DFD); counterexample: calldata=0x485c308e000000000000000000000000afefd7916c12e3894721266842a4a4ded8ac5dfd45bf7c25df32cf6decdd1405ee3afe8671ddc074d17cde37d389411f08c0e425 args=[0xaFEfd7916C12E3894721266842a4A4dED8AC5DFD, 31547911179188624094434987913992941562318854298263645404615487467454046725157 [3.154e76]]
  • test_burnBlocked_success_decreasesTotalSupply(address,uint256): AccountNotBlocked(0xE3B2B94FDB928e51C49FE378046F7F94Ff515D5D); counterexample: calldata=0x8bb754f2000000000000000000000000e3b2b94fdb928e51c49fe378046f7f94ff515d5d000000000000000000000000000000000000000021e2365e4b67384c22b33bf3 args=[0xE3B2B94FDB928e51C49FE378046F7F94Ff515D5D, 10486479306554684726037396467 [1.048e28]]
  • test_burnBlocked_success_emitsTransferAndBurnedBlocked(address,uint256): log != expected log; counterexample: calldata=0x89de84f80000000000000000000000003ae03e7cadfd5eb1852e1d714c1eaa04959193d10000000000000000000000000000000000000000000000000000000000046fa4 args=[0x3AE03e7cADfd5eB1852E1D714C1eAa04959193D1, 290724 [2.907e5]]
  • test_compositePolicyChildIds_success_emptyForMalformedId(uint64): custom error 0x7c40df74; counterexample: calldata=0x1ae49a5d000000000000000000000000000000000000000000000000000000000000091a args=[2330]
  • test_compositePolicyChildIds_success_emptyForUncreated(uint64): custom error 0x7c40df74; counterexample: calldata=0x2654166700000000000000000000000000000000000000000000000000000000000bc059 args=[770137 [7.701e5]]
  • test_transferFromSeizableWithMemo_revertOrder_blocked_beats_balance(address,address): Error != expected error: custom error 0x5dd87dfc != AccountNotBlocked(0x8Bca18EfeD82245CFE02C19F331A587DdCB48Beb); counterexample: calldata=0xa308af880000000000000000000000008bca18efed82245cfe02c19f331a587ddcb48beb0000000000000000000000001674a47d03b75e3b1406180a995e709638488a99 args=[0x8Bca18EfeD82245CFE02C19F331A587DdCB48Beb, 0x1674a47D03B75e3b1406180A995E709638488a99]
  • test_transferFromSeizableWithMemo_revertOrder_pause_beats_blocked(address,address): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0x99aeda8c0000000000000000000000000000000000000000000000000000000000001e210000000000000000000000000000000000000000000000000000000000003fef args=[0x0000000000000000000000000000000000001e21, 0x0000000000000000000000000000000000003FEf]
  • test_transferFromSeizableWithMemo_revertOrder_pause_beats_role(address,address,address): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0xcc85f1530000000000000000000000003fea8458e7c7cc1fc5fd01bf5a0fcc2c0cfd0cf000000000000000000000000080c756cc87241166ca3d6bb79c4f77d85575121c000000000000000000000000716fce0b119c1332e3832d975b280dd766b6ccd7 args=[0x3FEA8458e7c7CC1Fc5FD01Bf5a0FCc2C0CFd0Cf0, 0x80C756cc87241166cA3d6bb79c4F77D85575121c, 0x716FCE0b119c1332E3832D975b280dD766B6ccd7]
  • test_transferFromSeizableWithMemo_revertOrder_role_beats_zeroActors(address,address): Error != expected error: custom error 0x5dd87dfc != AccessControlUnauthorizedAccount(0xFe9d03E90Cea92769E2ad06638c70f772fE6d824, 0x466d0fa97b99b3315998c229880e8a3a6aa5f5586b46f762a35e210facb4ea63); counterexample: calldata=0x9797d0e2000000000000000000000000fe9d03e90cea92769e2ad06638c70f772fe6d824000000000000000000000000c9c0b1c6356b90bac90fd34981ccadd86b6eafe2 args=[0xFe9d03E90Cea92769E2ad06638c70f772fE6d824, 0xC9C0b1c6356b90bAc90Fd34981CcADd86b6eaFE2]
  • test_transferFromSeizableWithMemo_revertOrder_zeroActors_beats_blocked(address): Error != expected error: custom error 0x5dd87dfc != InvalidReceiver(0x0000000000000000000000000000000000000000); counterexample: calldata=0x289bd19b0000000000000000000000000575303273878b783c32d43e9a9caea22c42b9a0 args=[0x0575303273878B783C32d43e9a9cAEa22C42b9a0]
  • test_transferFromSeizableWithMemo_revert_accountNotBlocked(address,address,uint256): Error != expected error: custom error 0x5dd87dfc != AccountNotBlocked(0x0000000000000000000000000000000000002120); counterexample: calldata=0x608e309d0000000000000000000000000000000000000000000000000000000000002120000000000000000000000000cb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000 args=[0x0000000000000000000000000000000000002120, 0xCB00000000000000000000000000000000000000, 4096]
  • test_transferFromSeizableWithMemo_revert_insufficientBalance(address,address,uint256): Error != expected error: custom error 0x5dd87dfc != InsufficientBalance(0x66085607B7DeD8DfFBeAA465c8fe3B06b60F0ABb, 0, 115792089237316195423570985008687907853269984665640564039457584007913129639933 [1.157e77]); counterexample: calldata=0x2c2ee05400000000000000000000000066085607b7ded8dffbeaa465c8fe3b06b60f0abb0000000000000000000000008afb9e18975c38d8a3c2a0ee909ac4504f82f9b8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd args=[0x66085607B7DeD8DfFBeAA465c8fe3B06b60F0ABb, 0x8afB9e18975c38d8a3C2A0ee909aC4504F82F9B8, 115792089237316195423570985008687907853269984665640564039457584007913129639933 [1.157e77]]
  • test_transferFromSeizableWithMemo_revert_invalidReceiver(address,uint256): Error != expected error: custom error 0x5dd87dfc != InvalidReceiver(0x0000000000000000000000000000000000000000); counterexample: calldata=0x424702060000000000000000000000000000000000000000000000000000000000003a41c78b71fee795ddd74aff64ea9b2474194c938c3196430e10bb5f01ed48434000 args=[0x0000000000000000000000000000000000003A41, 90256635379626638402994590225948139774634157376374926850808936957150668996608 [9.025e76]]
  • test_transferFromSeizableWithMemo_revert_unauthorized(address,address,address,uint256): Error != expected error: custom error 0x5dd87dfc != AccessControlUnauthorizedAccount(0x41A8BC4141aca3F67C26f834cD73F772143f811C, 0x466d0fa97b99b3315998c229880e8a3a6aa5f5586b46f762a35e210facb4ea63); counterexample: calldata=0xf118091500000000000000000000000041a8bc4141aca3f67c26f834cd73f772143f811c0000000000000000000000006325529d31886405671f41d47c24140527b135cb000000000000000000000000bbdfe325ac2d8a111cbb6b348f47b41887eb1ba500000000000000000000000000000412d5d75d90d29970353a3113e07a9fc40a args=[0x41A8BC4141aca3F67C26f834cD73F772143f811C, 0x6325529D31886405671f41D47c24140527B135CB, 0xbBDFe325ac2d8A111Cbb6B348F47B41887eB1BA5, 354858470136282776886964200119603384271882 [3.548e41]]
  • test_transferFromSeizableWithMemo_revert_whenSeizePaused(address,address,uint256): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0x420274fb0000000000000000000000001941e6e5747789ac99469e6dec2c4b3fecde13a700000000000000000000000051534f3476c6b743f688076cbad39b71191544b2000000000000000000000050ed8b36a734070e1544f06c38a7eef3ef06fc6194 args=[0x1941e6e5747789ac99469e6deC2c4B3fecdE13A7, 0x51534f3476c6B743F688076CbAD39B71191544b2, 118276266363699831258502444364287386038400012018068 [1.182e50]]
  • test_transferFromSeizableWithMemo_success_emitsEvents(address,address,uint256,bytes32): log != expected log; counterexample: calldata=0x52d39738000000000000000000000000d93c27a57cadeb483ea2b946561658eef0e256ce000000000000000000000000b85fc70a82382a9998e4cf7fe6510742c60c2c03000000000000000000000000000000000000000000000000000000006373313f38ec6e720a4eabd30edae20610138f71443efedfc67c5be2fd70385d369db768 args=[0xd93C27A57Cadeb483EA2b946561658eeF0E256cE, 0xB85fC70a82382a9998E4cF7FE6510742c60C2c03, 1668493631 [1.668e9], 0x38ec6e720a4eabd30edae20610138f71443efedfc67c5be2fd70385d369db768]
  • test_transferFromSeizableWithMemo_success_ignoresReceiverPolicy(address,address,uint256): custom error 0x5dd87dfc; counterexample: calldata=0xe5450ef3000000000000000000000000734687e1ee04b9b14c7f9bac444f3bef23d03a1d000000000000000000000000d69bfad6dc410aedba6c6178ae34dde25b5d2d040000000000000000000000000000000000000000000000000000195cae353c6a args=[0x734687E1ee04B9b14C7f9BAC444F3BeF23d03A1D, 0xD69bfAd6dC410AEDba6c6178aE34DDE25B5D2D04, 27885850410090 [2.788e13]]
  • test_transferFromSeizableWithMemo_success_movesBalance(address,address,uint256): custom error 0x5dd87dfc; counterexample: calldata=0xdf16afc9000000000000000000000000cb53bf20032507363c7551189fae1331226f24b000000000000000000000000011dc82191d16958e4891ae72bac9476172cf4119000000000000000000000000000000000000000000000000019e2973cbc28ea7 args=[0xcb53bF20032507363C7551189FaE1331226f24B0, 0x11dC82191d16958e4891AE72BaC9476172CF4119, 116576217674714791 [1.165e17]]
  • test_transferFromSeizableWithMemo_success_noAllowanceRequired(address,address,uint256): custom error 0x5dd87dfc; counterexample: calldata=0x16a6a880000000000000000000000000f2218685da3691afdbae8b234d292bc17a4bb14f000000000000000000000000aad29123af76664dbc168e6b78af317dd6fa0d810000c6f83add563617ab393bbd83a24809c6d91b415d0b03599fd0a1007801da args=[0xf2218685DA3691AFDBAe8B234D292bC17A4Bb14f, 0xaAD29123aF76664dBc168E6B78Af317dD6FA0d81, 1373238042603564772552924107312552888332482074247451830672866117305237978 [1.373e72]]
    [FAIL: custom error 0x7c40df74] test_compositePolicyChildIds_success_emptyAfterFailedCreation() (gas: 133282)
    [FAIL: custom error 0x7c40df74] test_compositePolicyChildIds_success_returnsCreationSet() (gas: 231818)
    [FAIL: custom error 0x7c40df74] test_compositePolicyChildIds_success_tracksUpdateComposite() (gas: 259213)
    [FAIL: custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003] test_b20Layout_success_populatedSnapshotMatchesAllSlots() (gas: 682840)
    [FAIL: isPaused must still accept enum index 3 (SEIZE)] test_isPaused_revert_noFifthFeature() (gas: 9532)

@robriks robriks changed the title fix(b20-asset): bubble inner-call Panic from announce unchanged (BOP-477) fix(b20-asset): bubble inner-call Panic from announce (BOP-477) Jul 30, 2026
…anges

Keep the propagate-raw-vs-wrap rationale in the IB20Asset.announce natspec
(the spec) and make the mock comment, test @dev, smoke probe, and
expect_raw_panic docstring terse, dropping the repeated BOP-477 explanation
and extraneous detail (OOG 63/64 rule, enum/array-OOB reachability). No code
change.

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

@stephancill stephancill left a comment

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.

lgtm, would block on approval from @stevieraykatz

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