Skip to content

fix: reject composite policyType in createPolicy / createPolicyWithAccounts - #176

Merged
rayyan224 merged 2 commits into
mainfrom
fix/createpolicy-reject-composite-type
Jul 30, 2026
Merged

fix: reject composite policyType in createPolicy / createPolicyWithAccounts#176
rayyan224 merged 2 commits into
mainfrom
fix/createpolicy-reject-composite-type

Conversation

@rayyan224

Copy link
Copy Markdown
Collaborator

Summary

Addresses @robriks' review comment on #174 (#174 (comment)).

The IPolicyRegistry natspec states that createPolicy and createPolicyWithAccounts revert IncompatiblePolicyType when policyType is a composite gate, but MockPolicyRegistry never enforced it:

policyRegistry.createPolicy(admin, PolicyType.UNION);      // created a 0-child UNION instead of reverting
policyRegistry.createPolicy(admin, PolicyType.INTERSECT);  // isAuthorized(id, anyAddr) == true (vacuous AND)
policyRegistry.createPolicyWithAccounts(admin, PolicyType.UNION, accts); // did not revert

A 0-child composite is degenerate: isAuthorized folds an empty child set (UNION → false, INTERSECT → true), silently minting an always-deny / always-authorize policy.

Changes

  • MockPolicyRegistry: createPolicy and createPolicyWithAccounts now revert IncompatiblePolicyType for UNION/INTERSECT, matching the documented precedence — after the zero-admin check, and (for createPolicyWithAccounts) before the batch-size check. Factored the type test into a shared _isCompositeType(PolicyType) helper (reused by createCompositePolicy and _isComposite).
  • Tests: added test_createPolicy_revert_incompatiblePolicyType and test_createPolicyWithAccounts_revert_incompatiblePolicyType, and extended both *_revertOrder walks with the new step.

Composites remain creatable only through createCompositePolicy, which requires a UNION/INTERSECT gate and a [2, 4] child set.

Testing

forge test → 661 passed, 0 failed, 4 skipped. python3 script/check-coverage.py → all covered (exit 0). forge fmt --check clean.

…counts

The IPolicyRegistry natspec documents that createPolicy and
createPolicyWithAccounts revert IncompatiblePolicyType for composite gates
(UNION/INTERSECT), but the mock never enforced it — a caller could mint a
degenerate 0-child composite whose isAuthorized short-circuits. Add the guard
to both simple-policy constructors (after the zero-admin check, before the
batch-size check), factor out _isCompositeType, and cover it with revert +
revert-order tests.

Addresses #174 (comment)

Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Interface Coverage

✅ All interface functions have test coverage.

@github-actions

github-actions Bot commented Jul 24, 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% 99.54% 97.67% 100.00%
🟢 MockPolicyRegistryStorage.sol 100.00% 100.00% 100.00% 100.00%
Total 96.75% 97.25% 98.06% 96.48%

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

@github-actions

github-actions Bot commented Jul 24, 2026

Copy link
Copy Markdown

⚠️ Fork tests: 78 failed, 673 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(0x3028D66286dbb165440911666f5387b521a6Bb7A); counterexample: calldata=0x2cf250e80000000000000000000000003028d66286dbb165440911666f5387b521a6bb7a args=[0x3028D66286dbb165440911666f5387b521a6Bb7A]
  • test_burnBlockedWithMemo_revertOrder_pause_beats_blocked(address): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0x26d48986000000000000000000000000a2512abde81e0c9d2699f219fcfd754d93f7e62b args=[0xA2512abdE81E0c9d2699f219FcfD754D93f7e62B]
  • test_burnBlockedWithMemo_revertOrder_pause_beats_role(address,address): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0x53c0e66c0000000000000000000000000b42ce55c60f4b12697845a3766a163d922e520d000000000000000000000000c66c313273eb7b2706862fa2523486dfe4ddac52 args=[0x0B42ce55C60F4B12697845a3766a163D922e520D, 0xc66c313273EB7b2706862FA2523486DFE4DDAC52]
  • test_burnBlockedWithMemo_revertOrder_role_beats_blocked(address,address): Error != expected error: custom error 0x6f872692 != AccessControlUnauthorizedAccount(0xAF14f3ADDcd2a8C2F7589d778e988E0613AB8E6D, 0x7408fdc0d31c7bcb349eab611f5d1168acd4303574993f8cdc98b1cd18c41cae); counterexample: calldata=0xbd3f8b6b000000000000000000000000af14f3addcd2a8c2f7589d778e988e0613ab8e6d000000000000000000000000e8ccd8089b10cc85d409e43103074e75e4381c4c args=[0xAF14f3ADDcd2a8C2F7589d778e988E0613AB8E6D, 0xE8CCd8089B10Cc85D409e43103074e75E4381c4c]
  • test_burnBlockedWithMemo_revert_accountNotBlocked(address,uint256): Error != expected error: custom error 0x6f872692 != AccountNotBlocked(0x07651a06fd646D88585d86acC497545206B1331A); counterexample: calldata=0xf0e9ee6a00000000000000000000000007651a06fd646d88585d86acc497545206b1331a00000000000000000000000000000000000000001a041d058f0307a190479d3d args=[0x07651a06fd646D88585d86acC497545206B1331A, 8051583009800242654647655741 [8.051e27]]
  • test_burnBlockedWithMemo_revert_insufficientBalance(address,uint256): Error != expected error: custom error 0x6f872692 != InsufficientBalance(0xA5E3A80713506f496eF5016e088cD06582dE2DF4, 0, 24176275297134542553883750897473187380463673463292913338 [2.417e55]); counterexample: calldata=0xeb275e77000000000000000000000000a5e3a80713506f496ef5016e088cd06582de2df4000000000000000000fc697ed4deff23d1e6e6ab7a972295e0ec2391dfa966ba args=[0xA5E3A80713506f496eF5016e088cD06582dE2DF4, 24176275297134542553883750897473187380463673463292913338 [2.417e55]]
  • test_burnBlockedWithMemo_revert_unauthorized(address,address,uint256): Error != expected error: custom error 0x6f872692 != AccessControlUnauthorizedAccount(0x00000000000000000000000000000000000004cB, 0x7408fdc0d31c7bcb349eab611f5d1168acd4303574993f8cdc98b1cd18c41cae); counterexample: calldata=0xb8e4c85b00000000000000000000000000000000000000000000000000000000000004cb0000000000000000000000000000000000000000000000000000000000001068000000000000000000000000000000000000000000000000000000000000005f args=[0x00000000000000000000000000000000000004cB, 0x0000000000000000000000000000000000001068, 95]
  • test_burnBlockedWithMemo_revert_whenSeizePaused(address,uint256): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0xfce2f39a0000000000000000000000000779f31b0e40ecc923a8b6cac593e6315edb07c100000000000000000000000000000000000000000000000000000000050d4203 args=[0x0779f31B0e40ECC923a8B6cAC593E6315Edb07C1, 84754947 [8.475e7]]
  • test_burnBlockedWithMemo_success_debitsAndDecreasesSupply(address,uint256): custom error 0x6f872692; counterexample: calldata=0x189a0bed000000000000000000000000535cc817b84fdeb0a423ab67bae5a55cb8f43769000000000000000000000000000000000000000000004d78bf56b5c6578d3f9c args=[0x535Cc817b84fdeB0A423AB67bae5A55cB8F43769, 365849615876980546027420 [3.658e23]]
  • test_burnBlockedWithMemo_success_emitsTransferBurnedBlockedAndMemo(address,uint256,bytes32): log != expected log; counterexample: calldata=0x25c74b37000000000000000000000000dbeb84cf035209ae7349f8f91f79d5f36edc20e100000000000000000000000000000000000000000000000000000000000053e01000b9fbf509abecf30addbfd639af17c89d761ac46c892f96ed39edfe809d9d args=[0xDBEB84CF035209Ae7349f8f91F79d5F36EDc20E1, 21472 [2.147e4], 0x1000b9fbf509abecf30addbfd639af17c89d761ac46c892f96ed39edfe809d9d]
  • test_burnBlocked_revertOrder_pause_beats_balance(address,uint256): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0xca82fe430000000000000000000000002466dce1d6faf6d240f6101e3e100923321da83a000000000000000000000000004fc753648981bccd084d4dfdbaff9322ec71e7 args=[0x2466dcE1d6FAf6d240F6101E3E100923321DA83A, 1779122592657569592455213263136519607284429287 [1.779e45]]
  • test_burnBlocked_revertOrder_pause_beats_blocked(address,uint256): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0x4c29bb13000000000000000000000000af290c6df67c2288912163d782bce1274c519b3c0000000000000000000000000000000000000000000000000000000000000001 args=[0xaF290c6dF67C2288912163d782BCE1274c519B3c, 1]
  • test_burnBlocked_revertOrder_pause_beats_role(address,address,uint256): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0x022471a500000000000000000000000076cad83ad271b90e7fba09bfcdd6ae338076a41800000000000000000000000013492c4a441160b06740a2ab9b78afa8942824bd00000000000000000000000000000000000000001e558f2f1ba6cfb3ec0e0b85 args=[0x76CAd83AD271b90e7fbA09BFcDD6ae338076a418, 0x13492c4A441160B06740a2ab9b78AFA8942824bD, 9387985156704125622032403333 [9.387e27]]
  • test_burnBlocked_revert_insufficientBalance(address,uint256): Error != expected error: AccountNotBlocked(0xfE438787161FbF361382d788C6F13B75819ddB24) != InsufficientBalance(0xfE438787161FbF361382d788C6F13B75819ddB24, 0, 64); counterexample: calldata=0x15f3e92c000000000000000000000000fe438787161fbf361382d788c6f13b75819ddb240000000000000000000000000000000000000000000000000000000000000040 args=[0xfE438787161FbF361382d788C6F13B75819ddB24, 64]
  • test_burnBlocked_revert_whenSeizePaused(address,uint256): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0xf55efb3200000000000000000000000045c75fe1abe8ea61de21ea9755f8eab08c41b1c8000000000000000000056b325e8916581a48eff46574cfafd7ad0b0b37557749 args=[0x45C75fE1Abe8EA61De21eA9755F8EAB08c41B1C8, 519011924154505905835367504669248952721041990828259145 [5.19e53]]
  • test_burnBlocked_success_debitsTarget(address,uint256): AccountNotBlocked(0x264b3550019B5a8C0c8f905c2f7D89d09823FD40); counterexample: calldata=0x485c308e000000000000000000000000264b3550019b5a8c0c8f905c2f7d89d09823fd400000000000000000000000000000000000000000000000000000000000001c25 args=[0x264b3550019B5a8C0c8f905c2f7D89d09823FD40, 7205]
  • test_burnBlocked_success_decreasesTotalSupply(address,uint256): AccountNotBlocked(0xd5B2B5753713C246C74D93e8Ea78a8BFE87469A0); counterexample: calldata=0x8bb754f2000000000000000000000000d5b2b5753713c246c74d93e8ea78a8bfe87469a00000fc7443aa292beb02ab1a22a83c6e44e894e0fd9d8cf0ac3d3aed5115950b args=[0xd5B2B5753713C246C74D93e8Ea78a8BFE87469A0, 1742374559128257165760558122634202545991233696944826991036652449166628107 [1.742e72]]
  • test_burnBlocked_success_emitsTransferAndBurnedBlocked(address,uint256): log != expected log; counterexample: calldata=0x89de84f8000000000000000000000000851e477b683d8346e9db917d462970f9a9bab2a2000000000000000000000000e19f79a9e348671460f33c0c76d2182aa74e55d9 args=[0x851e477B683d8346E9DB917D462970f9A9baB2a2, 1288079340318358705780153569146731306465291556313 [1.288e48]]
  • test_compositePolicyChildIds_success_emptyForMalformedId(uint64): custom error 0x7c40df74; counterexample: calldata=0x1ae49a5d00000000000000000000000000000000000000000000000000000000000000ff args=[255]
  • test_compositePolicyChildIds_success_emptyForUncreated(uint64): custom error 0x7c40df74; counterexample: calldata=0x265416670000000000000000000000000000000000000000000000000000000000004066 args=[16486 [1.648e4]]
  • test_transferFromSeizableWithMemo_revertOrder_blocked_beats_balance(address,address): Error != expected error: custom error 0x5dd87dfc != AccountNotBlocked(0x576F4d785E2336f2ED3cdC94aF83FD2de49750e5); counterexample: calldata=0xa308af88000000000000000000000000576f4d785e2336f2ed3cdc94af83fd2de49750e5000000000000000000000000d70fd56a676c8d1635e2bb3c18f7babfd6f6156f args=[0x576F4d785E2336f2ED3cdC94aF83FD2de49750e5, 0xD70Fd56A676C8D1635E2bB3c18F7bAbfd6F6156f]
  • test_transferFromSeizableWithMemo_revertOrder_pause_beats_blocked(address,address): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0x99aeda8c000000000000000000000000166c5c442fc72deb05d6d563e8535e396c57d1440000000000000000000000000f8bb0cf49abe1518cc1a156f9e1b9fce65bf98a args=[0x166C5c442fc72Deb05D6d563e8535E396C57D144, 0x0F8bb0cF49abE1518cC1a156f9e1B9FcE65bF98a]
  • test_transferFromSeizableWithMemo_revertOrder_pause_beats_role(address,address,address): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0xcc85f153000000000000000000000000000000000000000000000000000000000000146b00000000000000000000000000000000000000000000000000000000000004d00000000000000000000000000000000000000000000000000000000000001684 args=[0x000000000000000000000000000000000000146b, 0x00000000000000000000000000000000000004D0, 0x0000000000000000000000000000000000001684]
  • test_transferFromSeizableWithMemo_revertOrder_role_beats_zeroActors(address,address): Error != expected error: custom error 0x5dd87dfc != AccessControlUnauthorizedAccount(0x0000000000000000000000000000000000003219, 0x466d0fa97b99b3315998c229880e8a3a6aa5f5586b46f762a35e210facb4ea63); counterexample: calldata=0x9797d0e200000000000000000000000000000000000000000000000000000000000032190000000000000000000000000000000000000000000000000000000000002dfc args=[0x0000000000000000000000000000000000003219, 0x0000000000000000000000000000000000002DfC]
  • test_transferFromSeizableWithMemo_revertOrder_zeroActors_beats_blocked(address): Error != expected error: custom error 0x5dd87dfc != InvalidReceiver(0x0000000000000000000000000000000000000000); counterexample: calldata=0x289bd19b000000000000000000000000fee07740b1098b4ca59809e01aed537f630de20f args=[0xFEE07740B1098B4CA59809E01AEd537f630De20f]
  • test_transferFromSeizableWithMemo_revert_accountNotBlocked(address,address,uint256): Error != expected error: custom error 0x5dd87dfc != AccountNotBlocked(0x0000000000000000000000000000000000002e25); counterexample: calldata=0x608e309d0000000000000000000000000000000000000000000000000000000000002e25000000000000000000000000000000000000000000000000000000000000372d0000000000000000000000000000000000000000000000000000000000003dfe args=[0x0000000000000000000000000000000000002e25, 0x000000000000000000000000000000000000372D, 15870 [1.587e4]]
  • test_transferFromSeizableWithMemo_revert_insufficientBalance(address,address,uint256): Error != expected error: custom error 0x5dd87dfc != InsufficientBalance(0xEBb3CEdA528150b5f2238221060E19ea2ccD5881, 0, 3); counterexample: calldata=0x2c2ee054000000000000000000000000ebb3ceda528150b5f2238221060e19ea2ccd5881000000000000000000000000da22bf96c11c541f48e0deaf338373da46d9aedc0000000000000000000000000000000000000000000000000000000000000003 args=[0xEBb3CEdA528150b5f2238221060E19ea2ccD5881, 0xdA22bf96C11c541F48e0DEAF338373DA46d9aEdc, 3]
  • test_transferFromSeizableWithMemo_revert_invalidReceiver(address,uint256): Error != expected error: custom error 0x5dd87dfc != InvalidReceiver(0x0000000000000000000000000000000000000000); counterexample: calldata=0x42470206000000000000000000000000bf45cc62359854fe854584bfb9037b739094e1330000000000000000000000000000000000000000000000000000000000000001 args=[0xBf45cC62359854Fe854584Bfb9037b739094e133, 1]
  • test_transferFromSeizableWithMemo_revert_unauthorized(address,address,address,uint256): Error != expected error: custom error 0x5dd87dfc != AccessControlUnauthorizedAccount(0x0000000000000000000000000000000016a6A881, 0x466d0fa97b99b3315998c229880e8a3a6aa5f5586b46f762a35e210facb4ea63); counterexample: calldata=0xf11809150000000000000000000000000000000000000000000000000000000016a6a8810000000000000000000000000000000000000000000000000000000000001191000000000000000000000000cb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c0c args=[0x0000000000000000000000000000000016a6A881, 0x0000000000000000000000000000000000001191, 0xCB00000000000000000000000000000000000000, 11276 [1.127e4]]
  • test_transferFromSeizableWithMemo_revert_whenSeizePaused(address,address,uint256): custom error 0xa290249c: type check failed for "(uint8[])" with data: 0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003; counterexample: calldata=0x420274fb000000000000000000000000a0c1f7571512bd77852299547877b6372fd57b01000000000000000000000000983c534f6f16dfa7f3d56fb246a1e3caff05841000000000000000000000000000000000000000c494741f032eb709a074793fe8 args=[0xa0c1f7571512bd77852299547877b6372fd57B01, 0x983c534F6f16Dfa7f3d56FB246A1e3cAFF058410, 15574664016096511906501514313704 [1.557e31]]
  • test_transferFromSeizableWithMemo_success_emitsEvents(address,address,uint256,bytes32): log != expected log; counterexample: calldata=0x52d39738000000000000000000000000cb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d40000000000000000000000000000000000000000000000000000000000000071c00000000000000000000000000000000000000000000000000000000000001c2 args=[0xCB00000000000000000000000000000000000000, 0x0000000000000000000000000000000000000d40, 1820, 0x00000000000000000000000000000000000000000000000000000000000001c2]
  • test_transferFromSeizableWithMemo_success_ignoresReceiverPolicy(address,address,uint256): custom error 0x5dd87dfc; counterexample: calldata=0xe5450ef30000000000000000000000000000000000000000000000000000000000000c8f000000000000000000000000000000000000000000000000fffffffffffffffe35827975a06ca0e9367ea3129b19441d45d0ca58e30b7693f09e73d0943d6200 args=[0x0000000000000000000000000000000000000C8f, 0x000000000000000000000000ffFFFfFfFFFFFffe, 24203109375850684125479958527447627702129936018301371311106264921787101700608 [2.42e76]]
  • test_transferFromSeizableWithMemo_success_movesBalance(address,address,uint256): custom error 0x5dd87dfc; counterexample: calldata=0xdf16afc900000000000000000000000045cde65a5cd3ed26cf78f370110f916344c8311d0000000000000000000000004f1e05e0420671ae9ce3961ebc510566c71b51d4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc args=[0x45Cde65a5cD3eD26CF78F370110F916344C8311D, 0x4F1E05e0420671AE9cE3961ebC510566c71B51D4, 115792089237316195423570985008687907853269984665640564039457584007913129639932 [1.157e77]]
  • test_transferFromSeizableWithMemo_success_noAllowanceRequired(address,address,uint256): custom error 0x5dd87dfc; counterexample: calldata=0x16a6a8800000000000000000000000004e14ece15217e0129e1a97a8bc96c63d3d22dd47000000000000000000000000ff4ff9f44d9ab0a1d5aaf63c978c96938c17de56000000000000000000000000000000000000000000000000000000004cfde32d args=[0x4E14ECe15217E0129E1A97A8Bc96C63D3d22dD47, 0xff4FF9F44D9ab0a1D5Aaf63c978C96938c17de56, 1291707181 [1.291e9]]
    [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 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.

thanks for getting this in!

@linear

linear Bot commented Jul 30, 2026

Copy link
Copy Markdown

BOP-483

@rayyan224
rayyan224 merged commit f6522c5 into main Jul 30, 2026
10 checks passed
@rayyan224
rayyan224 deleted the fix/createpolicy-reject-composite-type branch July 30, 2026 18:06
@rayyan224
rayyan224 restored the fix/createpolicy-reject-composite-type branch July 30, 2026 18:08
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