Skip to content

feat(base-time): expose the BaseTime predeploy read surface - #238

Merged
0x00101010 merged 1 commit into
mainfrom
feat/base-time
Oct 9, 2026
Merged

0x00101010 merged 1 commit into
mainfrom
feat/base-time

Conversation

@0x00101010

Copy link
Copy Markdown
Contributor

Summary

  • Add a read-only IBaseTime interface (timestampMillisPart, timestampMs, version) for the BaseTime predeploy that Denim installs at 0x4200000000000000000000000000000000000030.
  • Add StdPredeploys with a typed BASE_TIME handle. Predeploys are EVM bytecode rather than native precompiles, so they get their own library instead of extending StdPrecompiles.
  • Leave out the depositor-only setter and its errors: only the protocol's tx[1] deposit can call it.
  • Add MockBaseTime with uint16 timestampMillisPart at slot 0, matching the real predeploy's sequential layout (a deliberate deviation from the ERC-7201 mock convention). BaseTest etches it only when the address has no code, so runs against a node with the real predeploy keep the real bytecode.
  • Unit tests for each function, selector pins, slot-0 layout tests, reference docs, and a Denim changelog entry plus CHANGELOG.md summary/compatibility update.

Companion change in base/contracts (NatSpec/tests only, bytecode unchanged): base/contracts#449.

Test plan

  • forge build, forge test -v (804 passed, 4 skipped)
  • forge fmt --check
  • python3 script/check-coverage.py
  • cast sig matches the pinned selectors (0x7b2fea99, 0x5745a677, 0x54fd4d50)
  • Live mode (make fork-tests) against a node with BaseTime installed

Denim installs the BaseTime predeploy at 0x4200...0030, which exposes the
millisecond component of the current block timestamp. Add a read-only
IBaseTime interface (timestampMillisPart, timestampMs, version) and a new
StdPredeploys library with a typed BASE_TIME handle. Predeploys are EVM
bytecode rather than native precompiles, so they get their own library
instead of extending StdPrecompiles.

The depositor-only setter and its errors are left out: only the protocol's
tx[1] deposit can call it, so integrators would only ever see it revert.

MockBaseTime stores its uint16 at slot 0, deliberately deviating from the
ERC-7201 mock convention: storage parity with the real contract is the
invariant, and the real predeploy uses the compiler's sequential layout.
BaseTest etches the mock only when the address has no code, independent
of the precompile live/reference probe, so live runs keep real bytecode.

Adds unit tests for each function, selector pins, slot-0 layout tests,
reference docs, and a Denim changelog entry.

Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-01a11ca1-0972-76cc-9a30-05db0799da5a
@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown

Interface Coverage

✅ All interface functions have test coverage.

@github-actions

github-actions Bot commented Oct 8, 2026

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.68% 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%
🟢 MockBaseTime.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.14% 97.51% 98.21% 97.07%

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

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown

⚠️ Fork tests: 80 failed, 754 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_batchMint_revert_tokenRecipient(address,uint256,uint256): next call did not revert as expected; counterexample: calldata=0x0e04a6a6000000000000000000000000bece819eab7d26fea40f65c275100ec79c804d7c00000000000000000000000000000007bf6e29a46f490091686f34c7d43bf39c0000000000000000000000000000000000000000000000000000008fe7b05506 args=[0xbEce819eab7D26feA40f65C275100EC79C804d7C, 2636431112902580499422530855091960542108 [2.636e39], 618067416326 [6.18e11]]
  • test_invertedPolicyId_success_negatesAuthorization(address): custom error 0x6b468933; counterexample: calldata=0x4268079e0000000000000000000000002fb9f01d633b1224f9711c899048ddd57e0899b5 args=[0x2FB9f01D633B1224f9711c899048DDD57E0899b5]
  • test_invertedPolicyId_success_togglesAndRoundTrips(uint64): custom error 0x6b468933; counterexample: calldata=0x123f60c0000000000000000000000000000000000000000000000000ffffffffffffffff args=[18446744073709551615 [1.844e19]]
  • test_isAuthorized_success_intersectAllowAndNotX(address): PolicyNotFound(); counterexample: calldata=0x55848b8e000000000000000000000000b20f000000000000000000000000000000000000 args=[0xB20f000000000000000000000000000000000000]
  • test_isAuthorized_success_invertAllowlistNonMemberAuthorized(address): assertion failed; counterexample: calldata=0xb07c21cd0000000000000000000000004200000000000000000000000000000000000030 args=[0x4200000000000000000000000000000000000030]
  • test_isAuthorized_success_invertAlwaysBlockAuthorizes(address): assertion failed; counterexample: calldata=0xca9d71610000000000000000000000004e9826e460b4223ad7dbb8a9cade35a01e6ebf69 args=[0x4E9826E460b4223aD7DBb8A9cADe35a01E6EbF69]
  • test_isAuthorized_success_invertBlocklistMemberAuthorized(address): assertion failed; counterexample: calldata=0x07261779000000000000000000000000f7eb5287be9f93c8e06e1c34ce3e0bf2f17be6a0 args=[0xf7eB5287BE9F93C8e06e1C34ce3E0BF2F17bE6A0]
  • test_mintWithMemo_revert_tokenRecipient(uint256,bytes32): next call did not revert as expected; counterexample: calldata=0x4ca8134a00000000000000000000000000000000000000000000000000000000000002b900000000000000000000000000000000000000000000000000000000c2e5347e args=[697, 0x00000000000000000000000000000000000000000000000000000000c2e5347e]
  • test_mint_revertOrder_tokenRecipient_beats_cap(uint256): Error != expected error: SupplyCapExceeded(0, 3) != InvalidReceiver(0xB2000000000000000000009E871a2184B5aFaCCf); counterexample: calldata=0xc475cac10000000000000000000000000000000000000000000000000000000000000003 args=[3]
  • test_mint_revertOrder_tokenRecipient_beats_policy(uint256): Error != expected error: PolicyForbids(0xa0d5ae037e66a09119acf080a1d807abb9b6d03b6b9130eb19f7c1e6bdb8ffc8, 72057594037927937 [7.205e16]) != InvalidReceiver(0xB2000000000000000000009E871a2184B5aFaCCf); counterexample: calldata=0x6ea980310000000000000000000000000000000000000000000000000000000000000843 args=[2115]
  • test_mint_revert_tokenRecipient(uint256): next call did not revert as expected; counterexample: calldata=0x03224e1a0000000000000000000000000000000000000000000000000000000000000050 args=[80]
  • test_policyAdmin_success_invertResolvesBaseAdmin(address): assertion failed: 0x0000000000000000000000000000000000000000 != 0x62Be274737442DB527Ac376D40Dfa14C4165FEf1; counterexample: calldata=0xee7ff5a600000000000000000000000062be274737442db527ac376d40dfa14c4165fef1 args=[0x62Be274737442DB527Ac376D40Dfa14C4165FEf1]
  • test_policyExists_success_invertMirrorsBase(uint56): assertion failed; counterexample: calldata=0xf4aec5dc000000000000000000000000000000000000000000000000000000000000090c args=[2316]
  • test_seizeWithMemo_revertOrder_tokenRecipient_beats_blocked(address): Error != expected error: AccountNotSeizable(0x9ce7a65a42e9509A414c6F0d83A0a1a682d7981c) != InvalidReceiver(0xB2000000000000000000009E871a2184B5aFaCCf); counterexample: calldata=0x4ce156d20000000000000000000000009ce7a65a42e9509a414c6f0d83a0a1a682d7981c args=[0x9ce7a65a42e9509A414c6F0d83A0a1a682d7981c]
  • test_seizeWithMemo_revert_tokenRecipient(address,uint256): Error != expected error: InsufficientBalance(0x36bC938f6dCE02754072725160Dc5Cf370536b08, 0, 289584691633352938105393163682 [2.895e29]) != InvalidReceiver(0xB2000000000000000000009E871a2184B5aFaCCf); counterexample: calldata=0x220d05f300000000000000000000000036bc938f6dce02754072725160dc5cf370536b080000000000000000000000000000000000000003a7b2d7b55f0df5803fccada2 args=[0x36bC938f6dCE02754072725160Dc5Cf370536b08, 289584691633352938105393163682 [2.895e29]]
  • test_transferFromWithMemo_revert_tokenRecipient(address,address,uint256,bytes32): Error != expected error: InsufficientAllowance(0xe8Eb86028250cF3eb6e43C16Ed6Fc119876F425a, 0, 2435030899731640372581468818347648925135198207257332933296 [2.435e57]) != InvalidReceiver(0xB2000000000000000000009E871a2184B5aFaCCf); counterexample: calldata=0xac063dd0000000000000000000000000e8eb86028250cf3eb6e43c16ed6fc119876f425a0000000000000000000000003ea40e9638cddb68653788ee5fc597f080d196360000000000000000634ee8a8232d9bd16be976764519bdba13d62b4c7b17e2b09b1e1ed6f49ae98abcd08c276a4a50ce368694f86961f94e6fbd17c69c85d9ce args=[0xe8Eb86028250cF3eb6e43C16Ed6Fc119876F425a, 0x3eA40e9638CDDb68653788EE5fc597F080d19636, 2435030899731640372581468818347648925135198207257332933296 [2.435e57], 0x9b1e1ed6f49ae98abcd08c276a4a50ce368694f86961f94e6fbd17c69c85d9ce]
  • test_transferFrom_revertOrder_tokenRecipient_beats_allowance(address,address,uint256): Error != expected error: InsufficientAllowance(0xA6b30F73b74C4AAde74898bc7bab1fEBdd6942d2, 0, 207142886660195 [2.071e14]) != InvalidReceiver(0xB2000000000000000000009E871a2184B5aFaCCf); counterexample: calldata=0x98d9a95e000000000000000000000000a6b30f73b74c4aade74898bc7bab1febdd6942d2000000000000000000000000fc9395132dd0923763cee39989911ead98ad677a0000000000000000000000000000000000000000000000000000bc65362d5863 args=[0xA6b30F73b74C4AAde74898bc7bab1fEBdd6942d2, 0xFc9395132Dd0923763CEe39989911eAD98aD677A, 207142886660195 [2.071e14]]
  • test_transferFrom_revertOrder_tokenRecipient_beats_executorPolicy(address,address,uint256): Error != expected error: InsufficientAllowance(0xD0DCf5836C49Fd83328ee3252cDfa8F79A3FEaf6, 0, 275459682683497673741379355969651264574 [2.754e38]) != InvalidReceiver(0xB2000000000000000000009E871a2184B5aFaCCf); counterexample: calldata=0x0fbad031000000000000000000000000d0dcf5836c49fd83328ee3252cdfa8f79a3feaf6000000000000000000000000b0de2183e00adfe8d67b50e75216a0d20bc56c47000000000000000000000000006ca942cf3b9aea23363c6406145071662422fc args=[0xD0DCf5836C49Fd83328ee3252cDfa8F79A3FEaf6, 0xb0de2183E00adFE8d67b50e75216a0D20bc56c47, 2423225191859674246405399336565397528892416764 [2.423e45]]
  • test_transferFrom_revert_selfCaller_executorPolicyForbids(address,address,uint256): next call did not revert as expected; counterexample: calldata=0x641b204b00000000000000000000000099272bad2212cc06a94ceaa7b235dfd5dd6444b300000000000000000000000083fd408d5c4f8d0f87e40923ec721c5f97df8612000000000000000000000000000043e7a5cd7d39b85d5ea3b9c0287b346e4000 args=[0x99272bAd2212Cc06a94CeaA7B235dFD5Dd6444B3, 0x83fd408d5c4F8d0f87e40923eC721c5F97df8612, 5915348773766708084981136653208881067868160 [5.915e42]]
  • test_transferFrom_revert_tokenRecipient(address,address,uint256): Error != expected error: InsufficientAllowance(0xEb8522Ac26941b450101CCE5b50d02078D3fd14f, 0, 593032651844295046371945173077556530018004404550867895677466541299853319 [5.93e71]) != InvalidReceiver(0xB2000000000000000000009E871a2184B5aFaCCf); counterexample: calldata=0xb9f54792000000000000000000000000eb8522ac26941b450101cce5b50d02078d3fd14f000000000000000000000000b161d8fad6206eb2fcf0b7c5cdea61d94cc57fc9000055eccdb895c16b6419f81c289e01fc3295bb9c7ccaff400fc19511dfe807 args=[0xEb8522Ac26941b450101CCE5b50d02078D3fd14f, 0xB161D8FaD6206eB2fcF0b7c5CdeA61d94cc57FC9, 593032651844295046371945173077556530018004404550867895677466541299853319 [5.93e71]]
  • test_transferWithMemo_revertOrder(address,address,uint256,bytes32): Error != expected error: PolicyForbids(0xb81736c875ab819dd97f59f2a6542cfb731ad52b4ae15a6f24df2fb02b0327f5, 72057594037927937 [7.205e16]) != PolicyForbids(0x10be5173aff2a44e748bd9acd8b19fe34689581398a9db7ba2fb671e786ff7d8, 72057594037927937 [7.205e16]); counterexample: calldata=0xf5e311250000000000000000000000000000000000000000000000000000000000000f1e000000000000000000000000000000000000000000000000000000002f2ff15d000000000000000000000000000000000000000000000000000000000000253400000000000000000000000000000000000000000000000000000000000030f2 args=[0x0000000000000000000000000000000000000F1E, 0x000000000000000000000000000000002f2FF15d, 9524, 0x00000000000000000000000000000000000000000000000000000000000030f2]
  • test_transferWithMemo_revert_executorPolicyForbids(address,address,uint256,bytes32): Error != expected error: InsufficientBalance(0x00000000000000000000000000000000000027bb, 0, 1645) != PolicyForbids(0x10be5173aff2a44e748bd9acd8b19fe34689581398a9db7ba2fb671e786ff7d8, 72057594037927937 [7.205e16]); counterexample: calldata=0xa3802c1700000000000000000000000000000000000000000000000000000000000027bb0000000000000000000000004200000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000066d0000000000000000000000000000000000000000000000000000000000002be6 args=[0x00000000000000000000000000000000000027bb, 0x4200000000000000000000000000000000000030, 1645, 0x0000000000000000000000000000000000000000000000000000000000002be6]
  • test_transferWithMemo_revert_tokenRecipient(address,uint256,bytes32): Error != expected error: InsufficientBalance(0x1266805c24Dcd4664Ca7ab7Dc504E45E086C6a8F, 0, 1420929676309505573256505466020090924425840980688 [1.42e48]) != InvalidReceiver(0xB2000000000000000000009E871a2184B5aFaCCf); counterexample: calldata=0xe48d51550000000000000000000000001266805c24dcd4664ca7ab7dc504e45e086c6a8f000000000000000000000000f8e4b0ba8b3de93bef5c4432042a8586c3b872d038ae5d48446191d930fc84354983acbf6ad605c7b601c3369a769f2182b14b61 args=[0x1266805c24Dcd4664Ca7ab7Dc504E45E086C6a8F, 1420929676309505573256505466020090924425840980688 [1.42e48], 0x38ae5d48446191d930fc84354983acbf6ad605c7b601c3369a769f2182b14b61]
  • test_transfer_revertOrder_executorPolicy_beats_balance(address,address,uint256): Error != expected error: InsufficientBalance(0xCB00000000000000000000000000000000000000, 0, 16) != PolicyForbids(0x10be5173aff2a44e748bd9acd8b19fe34689581398a9db7ba2fb671e786ff7d8, 72057594037927937 [7.205e16]); counterexample: calldata=0x76b31f6e000000000000000000000000cb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c5e0000000000000000000000000000000000000000000000000000000000000010 args=[0xCB00000000000000000000000000000000000000, 0x0000000000000000000000000000000000000C5e, 16]
  • test_transfer_revertOrder_executorPolicy_beats_receiverPolicy(address,address,uint256): Error != expected error: PolicyForbids(0x8a4b3fa2d8b921852bc0089c6ef0958aa6961897be36fd731330fe2cd23f8363, 72057594037927937 [7.205e16]) != PolicyForbids(0x10be5173aff2a44e748bd9acd8b19fe34689581398a9db7ba2fb671e786ff7d8, 72057594037927937 [7.205e16]); counterexample: calldata=0x67f822c5000000000000000000000000498e9e77c331e16c00838df8bb31ae7147d31df500000000000000000000000071926d2253428b2e68d97b8a2a3625a3173e591900000000001f14546558c6bdbc5a6943834873098eb866859a7d6faee81c266b args=[0x498e9E77c331e16C00838df8Bb31ae7147d31Df5, 0x71926d2253428B2e68D97B8A2a3625A3173E5919, 12785328841686176521543782535003043730416425812976110824022877803 [1.278e64]]
  • test_transfer_revertOrder_executorPolicy_beats_senderPolicy(address,address,uint256): Error != expected error: PolicyForbids(0xb81736c875ab819dd97f59f2a6542cfb731ad52b4ae15a6f24df2fb02b0327f5, 72057594037927937 [7.205e16]) != PolicyForbids(0x10be5173aff2a44e748bd9acd8b19fe34689581398a9db7ba2fb671e786ff7d8, 72057594037927937 [7.205e16]); counterexample: calldata=0xe9945cbb0000000000000000000000009dacb97b429dc92febeeb5fbe1e6815414ec4f8b0000000000000000000000008e560655012267e83cd1a8d3215e3d9fa5c008560000000000000000003fd56ae1778a47b3445d7789f0602ec785c7ebf19321bc args=[0x9dACB97B429Dc92fEBEeb5fbE1e6815414Ec4F8b, 0x8E560655012267E83CD1A8D3215E3D9Fa5C00856, 6114050159802131937601586110338057877382546200858927548 [6.114e54]]
  • test_transfer_revertOrder_tokenRecipient_beats_balance(address,uint256): Error != expected error: InsufficientBalance(0xCB00000000000000000000000000000000000000, 0, 8692) != InvalidReceiver(0xB2000000000000000000009E871a2184B5aFaCCf); counterexample: calldata=0x71022c5e000000000000000000000000cb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021f4 args=[0xCB00000000000000000000000000000000000000, 8692]
  • test_transfer_revertOrder_tokenRecipient_beats_executorPolicy(address,uint256): Error != expected error: InsufficientBalance(0x1B1460f56F1a681322F80Ca3Fbd258c23fB91559, 0, 304850845817246448 [3.048e17]) != InvalidReceiver(0xB2000000000000000000009E871a2184B5aFaCCf); counterexample: calldata=0x5de2a22f0000000000000000000000001b1460f56f1a681322f80ca3fbd258c23fb91559000000000000000000000000000000000000000000000000043b0c3aa66a12f0 args=[0x1B1460f56F1a681322F80Ca3Fbd258c23fB91559, 304850845817246448 [3.048e17]]
  • test_transfer_revertOrder_tokenRecipient_beats_receiverPolicy(address,uint256): Error != expected error: PolicyForbids(0x8a4b3fa2d8b921852bc0089c6ef0958aa6961897be36fd731330fe2cd23f8363, 72057594037927937 [7.205e16]) != InvalidReceiver(0xB2000000000000000000009E871a2184B5aFaCCf); counterexample: calldata=0x85d001e4000000000000000000000000a41d093cfb4a259c9aee66500c504008a71dadf2000000000000000000000000000000000000000000008a7389e05705c34f873a args=[0xA41d093Cfb4a259c9AeE66500C504008A71daDf2, 653817885240947880462138 [6.538e23]]
  • test_transfer_revertOrder_tokenRecipient_beats_senderPolicy(address,uint256): Error != expected error: PolicyForbids(0xb81736c875ab819dd97f59f2a6542cfb731ad52b4ae15a6f24df2fb02b0327f5, 72057594037927937 [7.205e16]) != InvalidReceiver(0xB2000000000000000000009E871a2184B5aFaCCf); counterexample: calldata=0x82b0eb1a0000000000000000000000002c10c048fd9e417ec46fd5782917a3ce2277c11b00000000000a9dd6241d49a189a63339ffdf7af370e09be6839275f367c2148b args=[0x2C10C048Fd9E417EC46fD5782917A3ce2277C11B, 4367394851545677665102549791728165505828608863603306753511527563 [4.367e63]]
  • test_transfer_revertOrder_tokenRecipient_beats_zeroSender(uint256): Error != expected error: InvalidSender(0x0000000000000000000000000000000000000000) != InvalidReceiver(0xB2000000000000000000009E871a2184B5aFaCCf); counterexample: calldata=0x842ce61400000000000000000001826ff341c27c223f4e599d62fab8745b1e8dad9aa3a6 args=[144583361227482005093346193258009903497071553498751910 [1.445e53]]
  • test_transfer_revert_executorPolicyForbids(address,address,uint256): Error != expected error: InsufficientBalance(0xf5Cf8C2277dB0F21452Ca16fbE49ec67CdBf2367, 0, 34894001687642124561730185485687650736423397467700987967524994 [3.489e61]) != PolicyForbids(0x10be5173aff2a44e748bd9acd8b19fe34689581398a9db7ba2fb671e786ff7d8, 72057594037927937 [7.205e16]); counterexample: calldata=0xe8de369d000000000000000000000000f5cf8c2277db0f21452ca16fbe49ec67cdbf23670000000000000000000000000512556f3abaab52c35ddfcc5e003f42feed416100000000000015b6ef6830a09c8b3bb178ec32c42a1a9249d7008917315b5082 args=[0xf5Cf8C2277dB0F21452Ca16fbE49ec67CdBf2367, 0x0512556F3AbaAB52C35ddFCC5E003F42feeD4161, 34894001687642124561730185485687650736423397467700987967524994 [3.489e61]]
  • test_transfer_revert_externalExecutorPolicyDenies(address,address,uint256): Error != expected error: InsufficientBalance(0x43A234Dc4F3cE3C7B4de5d3E8671D5cfDCDCd6F5, 0, 1171479063394382558238245743 [1.171e27]) != PolicyForbids(0x10be5173aff2a44e748bd9acd8b19fe34689581398a9db7ba2fb671e786ff7d8, 72057594037927938 [7.205e16]); counterexample: calldata=0x66ef867100000000000000000000000043a234dc4f3ce3c7b4de5d3e8671d5cfdcdcd6f50000000000000000000000006a5105f7e1dd45a7132bab235c122c798c0e122b000000000000000000000000000000000000000003c9065747159f421362836f args=[0x43A234Dc4F3cE3C7B4de5d3E8671D5cfDCDCd6F5, 0x6A5105F7e1DD45A7132BAB235c122c798C0e122B, 1171479063394382558238245743 [1.171e27]]
  • test_transfer_revert_tokenRecipient(address,uint256): Error != expected error: InsufficientBalance(0x28BfAbac49fADD3e729AcD77bd41a997116C10DD, 0, 310455000731352552491122675735 [3.104e29]) != InvalidReceiver(0xB2000000000000000000009E871a2184B5aFaCCf); counterexample: calldata=0x0221ddf600000000000000000000000028bfabac49fadd3e729acd77bd41a997116c10dd0000000000000000000000000000000000000003eb225b909897bbb87f97d017 args=[0x28BfAbac49fADD3e729AcD77bd41a997116C10DD, 310455000731352552491122675735 [3.104e29]]
    [FAIL: Error != expected error: InvalidSender(0x0000000000000000000000000000000000000000) != InvalidReceiver(0xB2000000000000000000009E871a2184B5aFaCCf)] test_seizeWithMemo_revertOrder_tokenRecipient_beats_zeroSender() (gas: 47044)
    [FAIL: Error != expected error: PolicyNotFound() != InvalidChildPolicy(9367487224930631684 [9.367e18])] test_createCompositePolicy_revert_invertedCompositeChild() (gas: 234691)
    [FAIL: PolicyNotFound()] test_compositePolicyChildIds_success_invertedCompositeIdReturnsSameSet() (gas: 130091)
    [FAIL: PolicyNotFound()] test_compositePolicyChildIds_success_returnsChildrenVerbatim() (gas: 130113)
    [FAIL: PolicyNotFound()] test_compositePolicyChildIds_success_returnsInvertedChildVerbatimAfterUpdate() (gas: 234463)
    [FAIL: PolicyNotFound()] test_createCompositePolicy_success_invertedSimpleChild() (gas: 130101)

@0x00101010
0x00101010 marked this pull request as ready for review October 8, 2026 22:49
@0x00101010
0x00101010 merged commit 740ee5d into main Oct 9, 2026
10 checks passed
@0x00101010
0x00101010 deleted the feat/base-time branch October 9, 2026 15:17
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