Skip to content

fix(smoke): update AbiDecodeFailed shape and drop stale burnBlocked ABI fragment - #226

Merged
rayyan224 merged 1 commit into
mainfrom
fix/smoke-abi-decode-and-burnblocked
Sep 17, 2026
Merged

rayyan224 merged 1 commit into
mainfrom
fix/smoke-abi-decode-and-burnblocked

Conversation

@rayyan224

Copy link
Copy Markdown
Collaborator

Summary

Test plan

  • PYTHONPATH=script python -m smoke factory -k — passes, AbiDecodeFailed check holds
  • PYTHONPATH=script python -m smoke invariants -k — passes, AbiDecodeFailed check holds
  • PYTHONPATH=script python -m smoke stablecoin -k — passes, burnBlocked seize path works
  • make smoke KEEP_GOING=1 (full suite) — 7 passed, 0 failed, 0 skipped

…BI fragment

AbiDecodeFailed reverts now carry a bare function selector with no message,
so the harness's length check and docs were tightened to match. Separately,
PR #193 restored burnBlocked to the IB20 interface after #186 removed it, so
the stablecoin journey's hand-built ABI fragment for it now collides with
the real entry under a stricter web3.py ABI validator; call it directly
through the normal token binding instead.

Co-Authored-By: Claude <noreply@anthropic.com>
@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 97.70% 98.00% 100.00% 95.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% 99.67% 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.58% 97.78% 100.00%
🟢 MockPolicyRegistryStorage.sol 100.00% 100.00% 100.00% 100.00%
Total 97.11% 97.47% 98.15% 97.03%

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

# interface, so it is absent from STABLECOIN_ABI. The selector still dispatches on the precompile
# (retained for back-compat), so bind it via an explicit fragment to keep exercising the legacy
# burn-based freeze-and-seize path. The transfer-based seize surface is covered by the `seize` journey.
_BURN_BLOCKED_FRAGMENT = {

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

This broke the web3.py abi fragment since burnblocked was already added in

@github-actions

Copy link
Copy Markdown

⚠️ Fork tests: 42 failed, 736 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_invertedPolicyId_success_negatesAuthorization(address): custom error 0x6b468933; counterexample: calldata=0x4268079e0000000000000000000000008453000000000000000000000000000000000002 args=[0x8453000000000000000000000000000000000002]
  • test_invertedPolicyId_success_togglesAndRoundTrips(uint64): custom error 0x6b468933; counterexample: calldata=0x123f60c000000000000000000000000000000000000000000000000000000000a60bf13c args=[2785800508 [2.785e9]]
  • test_isAuthorized_success_intersectAllowAndNotX(address): PolicyNotFound(); counterexample: calldata=0x55848b8e00000000000000000000000000000000000000000000000000000000000022ab args=[0x00000000000000000000000000000000000022aB]
  • test_isAuthorized_success_invertAllowlistNonMemberAuthorized(address): assertion failed; counterexample: calldata=0xb07c21cd000000000000000000000000d5b738db96019e26db4da007dee2da97fe103a05 args=[0xD5b738DB96019E26dB4DA007dEE2DA97FE103A05]
  • test_isAuthorized_success_invertAlwaysBlockAuthorizes(address): assertion failed; counterexample: calldata=0xca9d7161000000000000000000000000cb00000000000000000000000000000000000000 args=[0xCB00000000000000000000000000000000000000]
  • test_isAuthorized_success_invertBlocklistMemberAuthorized(address): assertion failed; counterexample: calldata=0x072617790000000000000000000000008453000000000000000000000000000000000002 args=[0x8453000000000000000000000000000000000002]
  • test_policyAdmin_success_invertResolvesBaseAdmin(address): assertion failed: 0x0000000000000000000000000000000000000000 != 0xCbC009Ae8B9755C3C9a7Cb3F5aE641e815cceF42; counterexample: calldata=0xee7ff5a6000000000000000000000000cbc009ae8b9755c3c9a7cb3f5ae641e815ccef42 args=[0xCbC009Ae8B9755C3C9a7Cb3F5aE641e815cceF42]
  • test_policyExists_success_invertMirrorsBase(uint56): assertion failed; counterexample: calldata=0xf4aec5dc0000000000000000000000000000000000000000000000000000000000000c97 args=[3223]
  • test_transferFrom_revert_selfCaller_executorPolicyForbids(address,address,uint256): next call did not revert as expected; counterexample: calldata=0x641b204b00000000000000000000000058a738c3eed8c1c9c1ad719c0ce1d84f2d1b22020000000000000000000000002b9ef39c09de5e488badf870ccab1ca51a8c01dd000000000000000000000000000000000000000000002bcd6db61613f46c2d6a args=[0x58A738c3EED8c1c9c1ad719C0CE1D84F2D1B2202, 0x2B9eF39C09DE5e488BAdF870CCAB1ca51a8c01dD, 206851246828976058674538 [2.068e23]]
  • test_transferWithMemo_revertOrder(address,address,uint256,bytes32): Error != expected error: PolicyForbids(0xb81736c875ab819dd97f59f2a6542cfb731ad52b4ae15a6f24df2fb02b0327f5, 72057594037927937 [7.205e16]) != PolicyForbids(0x10be5173aff2a44e748bd9acd8b19fe34689581398a9db7ba2fb671e786ff7d8, 72057594037927937 [7.205e16]); counterexample: calldata=0xf5e31125000000000000000000000000bab5851996faff2ea460f104fc773ad5c31ab4580000000000000000000000008cf11d3c8825267a55577a055d4b150be13d819800d4f001b616e79e30d653eaa7aa1b6e9316f18e3c822e79b7a4f8a8fd13c913e773eaad4d701f30fc15069686a8d757f3d751fca09b43db7f373b8b6658d2e4 args=[0xBAb5851996fAff2Ea460f104fc773aD5C31AB458, 0x8cf11D3C8825267A55577a055D4b150bE13d8198, 376228042992453434741740936513056570939659141566031543740039122561747110163 [3.762e74], 0xe773eaad4d701f30fc15069686a8d757f3d751fca09b43db7f373b8b6658d2e4]
  • test_transferWithMemo_revert_executorPolicyForbids(address,address,uint256,bytes32): Error != expected error: InsufficientBalance(0x3f835aa2123853f78CE3651C8AE50B0B001a08A4, 0, 5682226893215212852773436785154170067758193486994244852842171770445573585595 [5.682e75]) != PolicyForbids(0x10be5173aff2a44e748bd9acd8b19fe34689581398a9db7ba2fb671e786ff7d8, 72057594037927937 [7.205e16]); counterexample: calldata=0xa3802c170000000000000000000000003f835aa2123853f78ce3651c8ae50b0b001a08a400000000000000000000000016dbc09f040c3187d6f1a1eabc6e97c651ab9bd60c9006c56b4da3fad98a791fb7493f33fa4b819447af35e6c2c552d6a6bafabb05aacf8886141c6a0ac13797ac0f36faca19aba3353cdc069e5838b68bd03a8b args=[0x3f835aa2123853f78CE3651C8AE50B0B001a08A4, 0x16DbC09f040c3187d6f1a1EAbc6e97C651ab9Bd6, 5682226893215212852773436785154170067758193486994244852842171770445573585595 [5.682e75], 0x05aacf8886141c6a0ac13797ac0f36faca19aba3353cdc069e5838b68bd03a8b]
  • test_transfer_revertOrder_executorPolicy_beats_balance(address,address,uint256): Error != expected error: InsufficientBalance(0xE999c9166E5aE9D3f045E22C10f50a1999794FA0, 0, 1357181659389650024807886759647765218 [1.357e36]) != PolicyForbids(0x10be5173aff2a44e748bd9acd8b19fe34689581398a9db7ba2fb671e786ff7d8, 72057594037927937 [7.205e16]); counterexample: calldata=0x76b31f6e000000000000000000000000e999c9166e5ae9d3f045e22c10f50a1999794fa00000000000000000000000004ef4161e7eb4f7ef9adfa6e299edab1b47c8b4270000000000000000000000000000000001056238d687aa4f3aedd679502be2e2 args=[0xE999c9166E5aE9D3f045E22C10f50a1999794FA0, 0x4EF4161e7Eb4F7ef9AdFA6e299edAB1b47C8b427, 1357181659389650024807886759647765218 [1.357e36]]
  • test_transfer_revertOrder_executorPolicy_beats_receiverPolicy(address,address,uint256): Error != expected error: PolicyForbids(0x8a4b3fa2d8b921852bc0089c6ef0958aa6961897be36fd731330fe2cd23f8363, 72057594037927937 [7.205e16]) != PolicyForbids(0x10be5173aff2a44e748bd9acd8b19fe34689581398a9db7ba2fb671e786ff7d8, 72057594037927937 [7.205e16]); counterexample: calldata=0x67f822c5000000000000000000000000c4e5385ffcbc01a2bfb518a39cb98b04edd7f47a000000000000000000000000088cf9a93f689c9084e7057212b3785c567ae98d000000000000000000000000000000000000000000000000000000002ebb9107 args=[0xc4E5385fFCBC01A2bFB518A39cb98b04eDD7F47A, 0x088Cf9a93F689c9084E7057212b3785c567ae98d, 784044295 [7.84e8]]
  • test_transfer_revertOrder_executorPolicy_beats_senderPolicy(address,address,uint256): Error != expected error: PolicyForbids(0xb81736c875ab819dd97f59f2a6542cfb731ad52b4ae15a6f24df2fb02b0327f5, 72057594037927937 [7.205e16]) != PolicyForbids(0x10be5173aff2a44e748bd9acd8b19fe34689581398a9db7ba2fb671e786ff7d8, 72057594037927937 [7.205e16]); counterexample: calldata=0xe9945cbb000000000000000000000000f97fdfe5a2123817958877fc3528c8e7c6e9ecdf000000000000000000000000819a62bb3312e90e0f34818b2845147fc40d70c3000000000000000000000e70d30f977d7ff5b5bae59273ce074a05997a816cbc args=[0xf97FDfE5a2123817958877Fc3528c8e7C6e9ecDf, 0x819A62BB3312E90e0F34818B2845147Fc40d70C3, 5402914996335499553094812660641026893879621370080444 [5.402e51]]
  • test_transfer_revert_executorPolicyForbids(address,address,uint256): Error != expected error: InsufficientBalance(0x8aA1FF91941578F1975f0FE7F957691A4fF5064a, 0, 815980277644 [8.159e11]) != PolicyForbids(0x10be5173aff2a44e748bd9acd8b19fe34689581398a9db7ba2fb671e786ff7d8, 72057594037927937 [7.205e16]); counterexample: calldata=0xe8de369d0000000000000000000000008aa1ff91941578f1975f0fe7f957691a4ff5064a0000000000000000000000004cc506329a751ae4518165ce0846938e0b6bc2a5000000000000000000000000000000000000000000000000000000bdfc36ef8c args=[0x8aA1FF91941578F1975f0FE7F957691A4fF5064a, 0x4Cc506329a751AE4518165CE0846938e0b6bc2a5, 815980277644 [8.159e11]]
  • test_transfer_revert_externalExecutorPolicyDenies(address,address,uint256): Error != expected error: InsufficientBalance(0xD8E72eA2889FAcd9B72e0B04C3BC9CD4761E2238, 0, 1) != PolicyForbids(0x10be5173aff2a44e748bd9acd8b19fe34689581398a9db7ba2fb671e786ff7d8, 72057594037927938 [7.205e16]); counterexample: calldata=0x66ef8671000000000000000000000000d8e72ea2889facd9b72e0b04c3bc9cd4761e2238000000000000000000000000ec423397ade36afedd6dc8fb44b637fbe70f13ff0000000000000000000000000000000000000000000000000000000000000001 args=[0xD8E72eA2889FAcd9B72e0B04C3BC9CD4761E2238, 0xec423397Ade36afEdD6Dc8fB44B637fbE70F13Ff, 1]
    [FAIL: Error != expected error: PolicyNotFound() != InvalidChildPolicy(9367487224930631684 [9.367e18])] test_createCompositePolicy_revert_invertedCompositeChild() (gas: 234691)
    [FAIL: PolicyNotFound()] test_compositePolicyChildIds_success_invertedCompositeIdReturnsSameSet() (gas: 130069)
    [FAIL: PolicyNotFound()] test_compositePolicyChildIds_success_returnsChildrenVerbatim() (gas: 130113)
    [FAIL: PolicyNotFound()] test_compositePolicyChildIds_success_returnsInvertedChildVerbatimAfterUpdate() (gas: 234463)
    [FAIL: PolicyNotFound()] test_createCompositePolicy_success_invertedSimpleChild() (gas: 130123)

@rayyan224
rayyan224 merged commit f39eea1 into main Sep 17, 2026
10 checks passed
@rayyan224
rayyan224 deleted the fix/smoke-abi-decode-and-burnblocked branch September 17, 2026 14:36
rayyan224 added a commit that referenced this pull request Sep 17, 2026
…BI fragment (#226)

AbiDecodeFailed reverts now carry a bare function selector with no message,
so the harness's length check and docs were tightened to match. Separately,
PR #193 restored burnBlocked to the IB20 interface after #186 removed it, so
the stablecoin journey's hand-built ABI fragment for it now collides with
the real entry under a stricter web3.py ABI validator; call it directly
through the normal token binding instead.

Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit f39eea1)
rayyan224 added a commit that referenced this pull request Sep 17, 2026
…BI fragment (#226) (#227)

AbiDecodeFailed reverts now carry a bare function selector with no message,
so the harness's length check and docs were tightened to match. Separately,
PR #193 restored burnBlocked to the IB20 interface after #186 removed it, so
the stablecoin journey's hand-built ABI fragment for it now collides with
the real entry under a stricter web3.py ABI validator; call it directly
through the normal token binding instead.


(cherry picked from commit f39eea1)

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants