Skip to content

Conversation

@Khrafts
Copy link
Member

@Khrafts Khrafts commented Feb 6, 2026

Base changes to consolidate shared script utilities across other repos.

   - DeployUtils: shared _SWAP_FACILITY constant
   - ChainsBase: shared ETHEREUM/ETHEREUM_SEPOLIA chain IDs and isHub()
   - TimelockBatchBase: timelock batch transaction utility

   Consolidates duplicated script constants and utilities from m-portal,
   m-portal-lite, and evm-m-extensions.
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR consolidates shared script utilities to be reused across multiple M0 protocol repositories. It introduces base contracts and libraries for common deployment, timelock batching, and chain identification functionality, along with dependency updates.

Changes:

  • Adds three new utility contracts: TimelockBatchBase for timelock batch operations, DeployUtils for shared deployment constants, and ChainsBase for EVM chain ID management
  • Updates submodule dependencies for forge-std, safe-utils, and adds new openzeppelin-contracts submodule

Reviewed changes

Copilot reviewed 7 out of 10 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
script/TimelockBatchBase.sol Implements base contract for building and simulating timelock batch operations
script/DeployUtils.sol Defines shared deployment constant for swap facility address
script/ChainsBase.sol Provides library with common chain IDs and hub chain identification
lib/safe-utils Updates safe-utils submodule to newer commit
lib/openzeppelin-contracts Adds openzeppelin-contracts as new submodule dependency
lib/forge-std Updates forge-std submodule to newer commit
.gitmodules Registers openzeppelin-contracts submodule configuration

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +42 to +43
(bool success, ) = _timelockTargets[i].call{ value: _timelockValues[i] }(_timelockPayloads[i]);
require(success, "Simulation failed");
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

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

The error message 'Simulation failed' is too generic and doesn't provide information about which call failed or why. Consider including the target address and index in the error message to aid debugging.

Copilot uses AI. Check for mistakes.
Comment on lines +42 to +43
(bool success, ) = _timelockTargets[i].call{ value: _timelockValues[i] }(_timelockPayloads[i]);
require(success, "Simulation failed");
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

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

The low-level call does not capture or handle the return data when the call fails. Consider capturing the return data to provide more context about failures, especially since this is a simulation function meant for testing.

Suggested change
(bool success, ) = _timelockTargets[i].call{ value: _timelockValues[i] }(_timelockPayloads[i]);
require(success, "Simulation failed");
(bool success, bytes memory returndata) =
_timelockTargets[i].call{ value: _timelockValues[i] }(_timelockPayloads[i]);
if (!success) {
if (returndata.length > 0) {
// Bubble up revert reason from the called contract
assembly {
revert(add(returndata, 32), mload(returndata))
}
} else {
revert("Simulation failed");
}
}

Copilot uses AI. Check for mistakes.
   CI workflows set FOUNDRY_PROFILE=ci but the profile was not defined,
   causing build and coverage jobs to fail.
   Foundry's auto-discovered remapping pointed to the safe-smart-account
   repo root, but sources live under contracts/. This caused CI build
   failures for safe-utils imports
@github-actions
Copy link

github-actions bot commented Feb 6, 2026

Changes to gas cost

Generated at commit: a313f0215f08ce4eec0c5dd3fbdfda3455fb3b8a, compared to commit: e54273e79cbd8a38b2d2b41ca4123f4e671fcc07

🧾 Summary (20% most significant diffs)

Contract Method Avg (+/-) %
ContractHelperHarness getContractFrom -1,365 ✅ -64.51%
ERC20ExtendedHarness getCancelAuthorizationDigest
getPermitDigest
getReceiveWithAuthorizationDigest
getTransferWithAuthorizationDigest
-1,162 ✅
-1,868 ✅
-2,043 ✅
-2,043 ✅
-52.63%
-60.87%
-60.27%
-60.27%
AccountWithFunctionReturningTrue isValidSignature -703 ✅ -55.44%
AccountWithEmptyFunction isValidSignature -678 ✅ -53.81%
AccountWithValidFunction isValidSignature -685 ✅ -53.77%
ERC712ExtendedHarness getDigest -751 ✅ -53.76%
Bytes32StringHarness toBytes32 -970 ✅ -53.38%
AccountWithFunctionReturningInvalidData isValidSignature -676 ✅ -53.06%
AccountWithRevertingFunction isValidSignature -565 ✅ -52.90%
AccountWithFunctionReturningNothing isValidSignature -565 ✅ -52.51%
ERC1271MaliciousWalletMock isValidSignature -550 ✅ -50.18%
SignatureCheckerHarness decodeECDSASignature -732 ✅ -49.49%
UIntMathHarness bound112
max40
min40
-287 ✅
-326 ✅
-326 ✅
-35.17%
-34.83%
-34.79%
ContinuousIndexingMathHarness exponent
getContinuousIndex
multiplyIndicesDown
-356 ✅
-432 ✅
-376 ✅
-37.95%
-38.40%
-40.69%
IndexingMathHarness multiply112By128Down
multiply112By128Up
-321 ✅
-344 ✅
-35.59%
-39.27%

Full diff report 👇
Contract Deployment Cost (+/-) Method Min (+/-) % Avg (+/-) % Median (+/-) % Max (+/-) % # Calls (+/-)
ContractHelperHarness 221,136 (-209,608) getContractFrom 697 (-1,213) -63.51% 751 (-1,365) -64.51% 768 (-1,377) -64.20% 781 (-1,411) -64.37% 269 (0)
ERC20ExtendedHarness 1,666,730 (-1,158,616) CANCEL_AUTHORIZATION_TYPEHASH
RECEIVE_WITH_AUTHORIZATION_TYPEHASH
TRANSFER_WITH_AUTHORIZATION_TYPEHASH
allowance
approve
authorizationState
balanceOf
burn
cancelAuthorization(address,bytes32,bytes)
cancelAuthorization(address,bytes32,bytes32,bytes32)
cancelAuthorization(address,bytes32,uint8,bytes32,bytes32)
decimals
eip712Domain
getCancelAuthorizationDigest
getPermitDigest
getReceiveWithAuthorizationDigest
getTransferWithAuthorizationDigest
mint
name
nonces
permit
receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,bytes)
receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,bytes32,bytes32)
receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)
setAuthorizationState
symbol
totalSupply
transfer
transferFrom
transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,bytes)
transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,bytes32,bytes32)
transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)
305 (-136)
283 (-136)
261 (-136)
2,734 (-392)
24,253 (-2,599)
2,709 (-450)
2,561 (-286)
24,120 (-402)
52,551 (-1,952)
51,745 (-1,851)
30,164 (-2,082)
337 (-128)
7,665 (-2,539)
1,046 (-1,162)
1,201 (-1,868)
1,347 (-2,043)
1,347 (-2,043)
28,461 (-599)
7,024 (-1,757)
2,586 (-282)
23,856 (-1,139)
60,794 (-3,126)
59,939 (-3,025)
29,135 (-2,874)
22,524 (-456)
4,053 (-1,037)
2,385 (-131)
24,121 (-402)
24,606 (-779)
60,642 (-3,132)
59,919 (-3,031)
29,038 (-2,880)
-30.84%
-32.46%
-34.26%
-12.54%
-9.68%
-14.25%
-10.05%
-1.64%
-3.58%
-3.45%
-6.46%
-27.53%
-24.88%
-52.63%
-60.87%
-60.27%
-60.27%
-2.06%
-20.01%
-9.83%
-4.56%
-4.89%
-4.80%
-8.98%
-1.98%
-20.37%
-5.21%
-1.64%
-3.07%
-4.91%
-4.81%
-9.02%
305 (-136)
283 (-136)
261 (-136)
2,734 (-392)
43,199 (-3,436)
2,709 (-450)
2,561 (-286)
29,348 (-32)
52,551 (-1,952)
51,745 (-1,851)
41,037 (-1,999)
337 (-128)
7,665 (-2,539)
1,046 (-1,162)
1,201 (-1,868)
1,347 (-2,043)
1,347 (-2,043)
48,117 (-17,033)
7,024 (-1,757)
2,586 (-282)
60,272 (-2,392)
78,720 (-3,199)
77,865 (-3,098)
75,580 (-3,131)
40,053 (-456)
4,053 (-1,037)
2,385 (-131)
33,299 (+1,834)
33,161 (-912)
78,560 (-3,204)
77,837 (-3,103)
75,616 (-3,137)
-30.84%
-32.46%
-34.26%
-12.54%
-7.37%
-14.25%
-10.05%
-0.11%
-3.58%
-3.45%
-4.64%
-27.53%
-24.88%
-52.63%
-60.87%
-60.27%
-60.27%
-26.14%
-20.01%
-9.83%
-3.82%
-3.91%
-3.83%
-3.98%
-1.13%
-20.37%
-5.21%
+5.83%
-2.68%
-3.92%
-3.83%
-3.98%
305 (-136)
283 (-136)
261 (-136)
2,734 (-392)
46,237 (-623)
2,709 (-450)
2,561 (-286)
28,711 (-599)
52,551 (-1,952)
51,745 (-1,851)
41,037 (-1,999)
337 (-128)
7,665 (-2,539)
1,046 (-1,162)
1,201 (-1,868)
1,347 (-2,043)
1,347 (-2,043)
51,413 (-17,699)
7,024 (-1,757)
2,586 (-282)
74,925 (-2,648)
78,990 (-3,126)
78,135 (-3,025)
78,348 (-3,082)
44,436 (-456)
4,053 (-1,037)
2,385 (-131)
28,871 (-718)
31,885 (-700)
78,830 (-3,124)
78,107 (-3,023)
78,210 (-3,076)
-30.84%
-32.46%
-34.26%
-12.54%
-1.33%
-14.25%
-10.05%
-2.04%
-3.58%
-3.45%
-4.64%
-27.53%
-24.88%
-52.63%
-60.87%
-60.27%
-60.27%
-25.61%
-20.01%
-9.83%
-3.41%
-3.81%
-3.73%
-3.78%
-1.02%
-20.37%
-5.21%
-2.43%
-2.15%
-3.81%
-3.73%
-3.78%
305 (-136)
283 (-136)
261 (-136)
2,734 (-392)
46,537 (-611)
2,709 (-450)
2,561 (-286)
34,695 (-575)
52,551 (-1,952)
51,745 (-1,851)
51,911 (-1,915)
337 (-128)
7,665 (-2,539)
1,046 (-1,162)
1,201 (-1,868)
1,347 (-2,043)
1,347 (-2,043)
68,873 (-599)
7,024 (-1,757)
2,586 (-282)
75,845 (-2,694)
79,374 (-3,126)
78,519 (-3,025)
78,740 (-3,074)
44,436 (-456)
4,053 (-1,037)
2,385 (-131)
51,955 (+4,082)
54,671 (+810)
79,202 (-3,132)
78,479 (-3,031)
78,590 (-3,080)
-30.84%
-32.46%
-34.26%
-12.54%
-1.30%
-14.25%
-10.05%
-1.63%
-3.58%
-3.45%
-3.56%
-27.53%
-24.88%
-52.63%
-60.87%
-60.27%
-60.27%
-0.86%
-20.01%
-9.83%
-3.43%
-3.79%
-3.71%
-3.76%
-1.02%
-20.37%
-5.21%
+8.53%
+1.50%
-3.80%
-3.72%
-3.77%
1 (0)
1 (0)
1 (0)
26,293 (+22,968)
14,325 (+12,051)
3,094 (0)
65,528 (+57,547)
13,453 (+11,609)
1 (0)
1 (0)
2 (0)
1 (0)
1 (0)
4 (0)
1,285 (0)
780 (0)
779 (0)
16,360 (+11,479)
1 (0)
257 (0)
1,542 (0)
257 (0)
257 (0)
271 (0)
5 (0)
1 (0)
1,030 (0)
13,346 (+11,583)
13,461 (+11,385)
257 (0)
257 (0)
270 (0)
AccountWithFunctionReturningTrue 128,971 (-71,572) isValidSignature 565 (-703) -55.44% 565 (-703) -55.44% 565 (-703) -55.44% 565 (-703) -55.44% 2 (0)
AccountWithEmptyFunction 130,707 (-75,557) isValidSignature 582 (-678) -53.81% 582 (-678) -53.81% 582 (-678) -53.81% 582 (-678) -53.81% 2 (0)
AccountWithValidFunction 132,243 (-76,181) isValidSignature 589 (-685) -53.77% 589 (-685) -53.77% 589 (-685) -53.77% 589 (-685) -53.77% 2 (0)
ERC712ExtendedHarness 788,320 (-558,639) DOMAIN_SEPARATOR
eip712Domain
getDigest
getDomainSeparator
getSignerAndRevertIfInvalidSignature
revertIfExpired
revertIfInvalidSignature(address,bytes32,bytes)
revertIfInvalidSignature(address,bytes32,bytes32,bytes32)
revertIfInvalidSignature(address,bytes32,uint8,bytes32,bytes32)
244 (-134)
5,904 (-2,139)
646 (-751)
5,497 (-1,803)
819 (-681)
320 (-180)
4,668 (-1,157)
984 (-745)
1,050 (-809)
-35.45%
-26.59%
-53.76%
-24.70%
-45.40%
-36.00%
-19.86%
-43.09%
-43.52%
1,995 (-694)
5,904 (-2,139)
646 (-751)
5,497 (-1,803)
2,521 (-869)
342 (-249)
9,062 (-2,094)
3,911 (-1,033)
3,393 (-1,035)
-25.81%
-26.59%
-53.76%
-24.70%
-25.63%
-42.13%
-18.77%
-20.89%
-23.37%
244 (-134)
5,904 (-2,139)
646 (-751)
5,497 (-1,803)
2,542 (-841)
320 (-180)
8,230 (-2,125)
4,478 (-1,071)
4,391 (-1,093)
-35.45%
-26.59%
-53.76%
-24.70%
-24.86%
-36.00%
-20.52%
-19.30%
-19.93%
5,497 (-1,815)
5,904 (-2,139)
646 (-751)
5,497 (-1,803)
4,181 (-1,115)
386 (-389)
14,970 (-3,049)
4,626 (-1,132)
4,672 (-1,196)
-24.82%
-26.59%
-53.76%
-24.70%
-21.05%
-50.19%
-16.92%
-19.66%
-20.38%
6 (0)
1 (0)
1 (0)
4 (0)
4 (0)
3 (0)
12 (0)
6 (0)
6 (0)
Bytes32StringHarness 238,480 (-167,326) toBytes32
toString
822 (-943)
698 (-443)
-53.43%
-38.83%
847 (-970)
7,782 (-2,268)
-53.38%
-22.57%
856 (-990)
9,156 (-3,119)
-53.63%
-25.41%
858 (-988)
11,261 (-3,004)
-53.52%
-21.06%
292 (0)
292 (0)
AccountWithFunctionReturningInvalidData 132,459 (-75,965) isValidSignature 598 (-676) -53.06% 598 (-676) -53.06% 598 (-676) -53.06% 598 (-676) -53.06% 2 (0)
AccountWithRevertingFunction 129,187 (-76,427) isValidSignature 503 (-565) -52.90% 503 (-565) -52.90% 503 (-565) -52.90% 503 (-565) -52.90% 2 (0)
AccountWithFunctionReturningNothing 124,183 (-59,464) isValidSignature 511 (-565) -52.51% 511 (-565) -52.51% 511 (-565) -52.51% 511 (-565) -52.51% 2 (0)
ERC1271MaliciousWalletMock 132,447 (-81,193) isValidSignature 546 (-550) -50.18% 546 (-550) -50.18% 546 (-550) -50.18% 546 (-550) -50.18% 2 (0)
SignatureCheckerHarness 618,084 (-367,490) decodeECDSASignature
isValidECDSASignature(address,bytes32,bytes)
isValidECDSASignature(address,bytes32,bytes32,bytes32)
isValidERC1271Signature
isValidSignature
recoverECDSASigner(bytes32,bytes)
recoverECDSASigner(bytes32,bytes32,bytes32)
recoverECDSASigner(bytes32,uint8,bytes32,bytes32)
validateECDSASignature(address,bytes32,bytes)
validateECDSASignature(address,bytes32,bytes32,bytes32)
validateECDSASignature(address,bytes32,uint8,bytes32,bytes32)
validateRecoveredSigner
747 (-732)
1,349 (-887)
938 (-796)
4,007 (-1,248)
4,436 (-1,307)
1,147 (-824)
805 (-719)
742 (-800)
1,230 (-870)
861 (-780)
970 (-844)
707 (-373)
-49.49%
-39.67%
-45.91%
-23.75%
-22.76%
-41.81%
-47.18%
-51.88%
-41.43%
-47.53%
-46.53%
-34.54%
747 (-732)
4,844 (-1,221)
4,446 (-1,131)
4,467 (-1,751)
4,965 (-1,237)
4,548 (-1,177)
4,219 (-1,073)
4,143 (-1,153)
4,725 (-1,204)
4,375 (-1,116)
2,735 (-1,015)
715 (-370)
-49.49%
-20.13%
-20.28%
-28.16%
-19.95%
-20.56%
-20.28%
-21.77%
-20.31%
-20.32%
-27.07%
-34.10%
747 (-732)
4,861 (-1,243)
4,450 (-1,152)
4,518 (-1,813)
4,952 (-1,218)
4,565 (-1,199)
4,223 (-1,094)
4,160 (-1,175)
4,742 (-1,226)
4,373 (-1,136)
2,719 (-1,025)
715 (-370)
-49.49%
-20.36%
-20.56%
-28.64%
-19.74%
-20.80%
-20.58%
-22.02%
-20.54%
-20.62%
-27.38%
-34.10%
747 (-732)
4,897 (-1,218)
4,486 (-1,127)
4,797 (-2,087)
8,729 (-1,719)
4,585 (-1,179)
4,243 (-1,074)
4,180 (-1,155)
4,778 (-1,201)
4,409 (-1,111)
4,518 (-1,175)
723 (-368)
-49.49%
-19.92%
-20.08%
-30.32%
-16.45%
-20.45%
-20.20%
-21.65%
-20.09%
-20.13%
-20.64%
-33.73%
257 (0)
262 (0)
262 (0)
9 (0)
532 (0)
260 (0)
259 (0)
260 (0)
262 (0)
518 (0)
6 (0)
2 (0)
UIntMathHarness 509,915 (-405,302) bound112
bound128
bound240
bound32
max128
max240
max32
max40
min112
min240
min256
min32
min40
safe112
safe128
safe16
safe240
safe32
safe40
safe48
529 (-287)
475 (-298)
486 (-287)
440 (-311)
697 (-278)
687 (-267)
628 (-327)
604 (-327)
621 (-267)
710 (-267)
492 (-454)
627 (-327)
605 (-327)
366 (-168)
344 (-168)
376 (-180)
387 (-168)
352 (-180)
330 (-180)
419 (-180)
-35.17%
-38.55%
-37.13%
-41.41%
-28.51%
-27.99%
-34.24%
-35.12%
-30.07%
-27.33%
-47.99%
-34.28%
-35.09%
-31.46%
-32.81%
-32.37%
-30.27%
-33.83%
-35.29%
-30.05%
529 (-287)
475 (-298)
486 (-287)
440 (-311)
703 (-277)
693 (-266)
634 (-326)
610 (-326)
627 (-266)
716 (-266)
498 (-453)
633 (-326)
611 (-326)
396 (-230)
369 (-235)
400 (-248)
417 (-230)
376 (-248)
354 (-248)
443 (-248)
-35.17%
-38.55%
-37.13%
-41.41%
-28.27%
-27.74%
-33.96%
-34.83%
-29.79%
-27.09%
-47.63%
-33.99%
-34.79%
-36.74%
-38.91%
-38.27%
-35.55%
-39.74%
-41.20%
-35.89%
529 (-287)
475 (-298)
486 (-287)
440 (-311)
703 (-277)
693 (-266)
634 (-326)
610 (-326)
627 (-266)
716 (-266)
498 (-453)
633 (-326)
611 (-326)
396 (-230)
369 (-235)
400 (-248)
417 (-230)
376 (-248)
354 (-248)
443 (-248)
-35.17%
-38.55%
-37.13%
-41.41%
-28.27%
-27.74%
-33.96%
-34.83%
-29.79%
-27.09%
-47.63%
-33.99%
-34.79%
-36.74%
-38.91%
-38.27%
-35.55%
-39.74%
-41.20%
-35.89%
529 (-287)
475 (-298)
486 (-287)
440 (-311)
710 (-275)
700 (-264)
641 (-324)
617 (-324)
634 (-264)
723 (-264)
505 (-451)
640 (-324)
618 (-324)
427 (-292)
394 (-303)
425 (-316)
448 (-292)
401 (-316)
379 (-316)
468 (-316)
-35.17%
-38.55%
-37.13%
-41.41%
-27.92%
-27.39%
-33.58%
-34.43%
-29.40%
-26.75%
-47.18%
-33.61%
-34.39%
-40.61%
-43.47%
-42.65%
-39.46%
-44.07%
-45.47%
-40.31%
1 (0)
1 (0)
1 (0)
1 (0)
2 (0)
2 (0)
2 (0)
2 (0)
2 (0)
2 (0)
2 (0)
2 (0)
2 (0)
2 (0)
2 (0)
2 (0)
2 (0)
2 (0)
2 (0)
2 (0)
ERC712ExtendedUpgradeableHarness 980,046 (-690,460) DOMAIN_SEPARATOR
eip712Domain
getDigest
getDomainSeparator
getSignerAndRevertIfInvalidSignature
initialize
revertIfExpired
revertIfInvalidSignature(address,bytes32,bytes)
revertIfInvalidSignature(address,bytes32,bytes32,bytes32)
revertIfInvalidSignature(address,bytes32,uint8,bytes32,bytes32)
4,497 (-139)
3,923 (-902)
4,899 (-756)
2,946 (-755)
797 (-681)
92,371 (-2,118)
320 (-180)
4,689 (-1,114)
984 (-745)
1,050 (-809)
-3.00%
-18.69%
-13.37%
-20.40%
-46.08%
-2.24%
-36.00%
-19.20%
-43.09%
-43.52%
4,705 (-348)
3,923 (-902)
4,899 (-756)
2,946 (-755)
2,499 (-869)
92,371 (-2,118)
342 (-249)
9,083 (-2,051)
3,911 (-1,033)
3,393 (-1,035)
-6.89%
-18.69%
-13.37%
-20.40%
-25.80%
-2.24%
-42.13%
-18.42%
-20.89%
-23.37%
4,497 (-139)
3,923 (-902)
4,899 (-756)
2,946 (-755)
2,520 (-841)
92,371 (-2,118)
320 (-180)
8,251 (-2,082)
4,478 (-1,071)
4,391 (-1,093)
-3.00%
-18.69%
-13.37%
-20.40%
-25.02%
-2.24%
-36.00%
-20.15%
-19.30%
-19.93%
5,123 (-764)
3,923 (-902)
4,899 (-756)
2,946 (-755)
4,159 (-1,115)
92,371 (-2,118)
386 (-389)
14,991 (-3,006)
4,626 (-1,132)
4,672 (-1,196)
-12.98%
-18.69%
-13.37%
-20.40%
-21.14%
-2.24%
-50.19%
-16.70%
-19.66%
-20.38%
6 (0)
1 (0)
1 (0)
4 (0)
4 (0)
17 (0)
3 (0)
12 (0)
6 (0)
6 (0)
ContinuousIndexingMathHarness 273,465 (-184,564) convertFromBasisPoints
convertToBasisPoints
exponent
getContinuousIndex
multiplyIndicesDown
431 (-267)
530 (-256)
582 (-356)
693 (-432)
548 (-376)
-38.25%
-32.57%
-37.95%
-38.40%
-40.69%
431 (-267)
530 (-256)
582 (-356)
693 (-432)
548 (-376)
-38.25%
-32.57%
-37.95%
-38.40%
-40.69%
431 (-267)
530 (-256)
582 (-356)
693 (-432)
548 (-376)
-38.25%
-32.57%
-37.95%
-38.40%
-40.69%
431 (-267)
530 (-256)
582 (-356)
693 (-432)
548 (-376)
-38.25%
-32.57%
-37.95%
-38.40%
-40.69%
110,962 (0)
4 (0)
27 (0)
110,976 (0)
110,960 (0)
IndexingMathHarness 218,116 (-157,891) divide240By128Down
divide240By128Up
multiply112By128Down
multiply112By128Up
728 (-299)
698 (-303)
581 (-321)
532 (-344)
-29.11%
-30.27%
-35.59%
-39.27%
728 (-299)
698 (-303)
581 (-321)
532 (-344)
-29.11%
-30.27%
-35.59%
-39.27%
728 (-299)
698 (-303)
581 (-321)
532 (-344)
-29.11%
-30.27%
-35.59%
-39.27%
728 (-299)
698 (-303)
581 (-321)
532 (-344)
-29.11%
-30.27%
-35.59%
-39.27%
24 (0)
24 (0)
26 (0)
26 (0)
ERC20ExtendedUpgradeableHarness 1,964,420 (-1,342,097) CANCEL_AUTHORIZATION_TYPEHASH
RECEIVE_WITH_AUTHORIZATION_TYPEHASH
TRANSFER_WITH_AUTHORIZATION_TYPEHASH
allowance
approve
authorizationState
balanceOf
burn
cancelAuthorization(address,bytes32,bytes)
cancelAuthorization(address,bytes32,bytes32,bytes32)
cancelAuthorization(address,bytes32,uint8,bytes32,bytes32)
decimals
eip712Domain
getCancelAuthorizationDigest
getPermitDigest
getReceiveWithAuthorizationDigest
getTransferWithAuthorizationDigest
initialize
mint
name
nonces
permit
receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,bytes)
receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,bytes32,bytes32)
receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)
setAuthorizationState
symbol
totalSupply
transfer
transferFrom
transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,bytes)
transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,bytes32,bytes32)
transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)
327 (-136)
305 (-136)
283 (-136)
2,799 (-420)
4,725 (-623)
2,777 (-467)
2,586 (-282)
2,789 (-387)
33,816 (-1,974)
33,526 (-1,887)
11,690 (-2,105)
2,334 (-225)
3,967 (-902)
5,232 (-1,167)
5,476 (-1,873)
5,622 (-2,048)
5,622 (-2,048)
118,471 (-3,102)
7,154 (-596)
3,215 (-201)
2,623 (-334)
862 (-1,127)
41,138 (-3,162)
40,798 (-3,075)
9,766 (-2,905)
5,666 (-463)
3,247 (-190)
2,407 (-131)
2,790 (-387)
2,936 (-784)
41,087 (-3,148)
40,770 (-3,061)
9,689 (-2,885)
-29.37%
-30.84%
-32.46%
-13.05%
-11.65%
-14.40%
-9.83%
-12.19%
-5.52%
-5.33%
-15.26%
-8.79%
-18.53%
-18.24%
-25.49%
-26.70%
-26.70%
-2.55%
-7.69%
-5.88%
-11.30%
-56.66%
-7.14%
-7.01%
-22.93%
-7.55%
-5.53%
-5.16%
-12.18%
-21.08%
-7.12%
-6.98%
-22.94%
327 (-136)
305 (-136)
283 (-136)
2,799 (-420)
24,508 (-662)
2,777 (-467)
2,586 (-282)
7,704 (-525)
33,816 (-1,974)
33,526 (-1,887)
22,576 (-2,028)
2,334 (-225)
3,967 (-902)
5,232 (-1,167)
5,476 (-1,873)
5,622 (-2,048)
5,622 (-2,048)
127,381 (-3,102)
46,566 (-696)
3,215 (-201)
2,623 (-334)
40,433 (-2,489)
63,494 (-3,231)
63,154 (-3,144)
60,465 (-3,176)
19,346 (-463)
3,247 (-190)
2,407 (-131)
16,414 (-550)
15,275 (-874)
63,444 (-3,236)
63,127 (-3,149)
60,519 (-3,181)
-29.37%
-30.84%
-32.46%
-13.05%
-2.63%
-14.40%
-9.83%
-6.38%
-5.52%
-5.33%
-8.24%
-8.79%
-18.53%
-18.24%
-25.49%
-26.70%
-26.70%
-2.38%
-1.47%
-5.88%
-11.30%
-5.80%
-4.84%
-4.74%
-4.99%
-2.34%
-5.53%
-5.16%
-3.24%
-5.41%
-4.85%
-4.75%
-4.99%
327 (-136)
305 (-136)
283 (-136)
2,799 (-420)
24,625 (-623)
2,777 (-467)
2,586 (-282)
7,176 (-596)
33,816 (-1,974)
33,526 (-1,887)
22,576 (-2,028)
2,334 (-225)
3,967 (-902)
5,232 (-1,167)
5,476 (-1,873)
5,622 (-2,048)
5,622 (-2,048)
118,471 (-3,102)
46,954 (-596)
3,215 (-201)
2,623 (-334)
55,898 (-2,646)
63,838 (-3,162)
63,498 (-3,075)
63,557 (-3,124)
22,766 (-463)
3,247 (-190)
2,407 (-131)
16,414 (-550)
8,262 (-614)
63,807 (-3,148)
63,490 (-3,061)
63,439 (-3,100)
-29.37%
-30.84%
-32.46%
-13.05%
-2.47%
-14.40%
-9.83%
-7.67%
-5.52%
-5.33%
-8.24%
-8.79%
-18.53%
-18.24%
-25.49%
-26.70%
-26.70%
-2.55%
-1.25%
-5.88%
-11.30%
-4.52%
-4.72%
-4.62%
-4.68%
-1.99%
-5.53%
-5.16%
-3.24%
-6.92%
-4.70%
-4.60%
-4.66%
327 (-136)
305 (-136)
283 (-136)
2,799 (-420)
24,625 (-623)
2,777 (-467)
2,586 (-282)
12,776 (-596)
33,816 (-1,974)
33,526 (-1,887)
33,463 (-1,951)
2,334 (-225)
3,967 (-902)
5,232 (-1,167)
5,476 (-1,873)
5,622 (-2,048)
5,622 (-2,048)
138,371 (-3,102)
46,954 (-596)
3,215 (-201)
2,623 (-334)
56,167 (-2,747)
63,858 (-3,142)
63,518 (-3,055)
63,577 (-3,104)
22,766 (-463)
3,247 (-190)
2,407 (-131)
30,039 (-712)
35,516 (-940)
63,807 (-3,148)
63,490 (-3,061)
63,439 (-3,110)
-29.37%
-30.84%
-32.46%
-13.05%
-2.47%
-14.40%
-9.83%
-4.46%
-5.52%
-5.33%
-5.51%
-8.79%
-18.53%
-18.24%
-25.49%
-26.70%
-26.70%
-2.19%
-1.25%
-5.88%
-11.30%
-4.66%
-4.69%
-4.59%
-4.65%
-1.99%
-5.53%
-5.16%
-2.32%
-2.58%
-4.70%
-4.60%
-4.67%
1 (0)
1 (0)
1 (0)
772 (0)
1,029 (0)
3,094 (0)
1,544 (0)
513 (0)
1 (0)
1 (0)
2 (0)
1 (0)
1 (0)
4 (0)
1,285 (0)
780 (0)
779 (0)
67 (0)
3,598 (0)
1 (0)
257 (0)
1,542 (0)
257 (0)
257 (0)
271 (0)
5 (0)
1 (0)
1,029 (0)
514 (0)
772 (0)
257 (0)
257 (0)
270 (0)
ERC20ExtendedHandler 766,618 (-603,694) approve
burn
mint
sum
transfer
transferFrom
29,595 (-3,298)
43,942 (-4,349)
381 (-298)
2,326 (-143)
477 (-303)
488 (-398)
-10.03%
-9.01%
-43.89%
-5.79%
-38.85%
-44.92%
48,231 (-4,272)
45,632 (-4,891)
52,991 (-21,866)
2,326 (-143)
65,877 (+2,277)
62,532 (-1,197)
-8.14%
-9.68%
-29.21%
-5.79%
+3.58%
-1.88%
51,567 (-1,298)
44,691 (-5,928)
62,087 (-7,164)
2,326 (-143)
60,908 (-2,888)
61,141 (-3,103)
-2.46%
-11.71%
-10.34%
-5.79%
-4.53%
-4.83%
51,879 (-1,310)
53,627 (+2,812)
96,839 (-6,852)
2,326 (-143)
131,424 (+67,432)
133,635 (+69,183)
-2.46%
+5.53%
-6.61%
-5.79%
+105.38%
+107.34%
13,018 (+11,773)
12,940 (+11,609)
12,763 (+11,476)
1 (0)
12,835 (+11,584)
12,694 (+11,383)
ERC1271WalletMock 242,933 (-150,447) isValidSignature 3,040 (-773) -20.27% 5,105 (-984) -16.16% 6,451 (-1,128) -14.88% 6,461 (-1,128) -14.86% 10 (0)
FeeOnTransferERC20 429,064 (-349,454) approve
balanceOf
mint
setFeeBps
44,715 (-432)
538 (-286)
49,350 (-512)
43,558 (-205)
-0.96%
-34.71%
-1.03%
-0.47%
44,715 (-432)
1,538 (-286)
57,906 (-512)
43,558 (-205)
-0.96%
-15.68%
-0.88%
-0.47%
44,715 (-432)
1,538 (-286)
57,906 (-512)
43,558 (-205)
-0.96%
-15.68%
-0.88%
-0.47%
44,715 (-432)
2,538 (-286)
66,462 (-512)
43,558 (-205)
-0.96%
-10.13%
-0.76%
-0.47%
256 (0)
1,024 (0)
1,024 (0)
512 (0)
Proxy 104,317 (-3,172) allowance
approve
balanceOf
burn
decimals
eip712Domain
fallback
getPermitDigest
initialize
mint
name
nonces
permit
symbol
totalSupply
transfer
transferFrom
7,592 (-429)
30,862 (-848)
7,376 (-291)
28,942 (-396)
7,121 (-234)
8,814 (-911)
5,107 (-108)
10,287 (-1,882)
145,587 (-23,083)
33,504 (-605)
8,008 (-210)
7,413 (-343)
28,696 (-1,160)
8,040 (-199)
7,194 (-140)
28,943 (-396)
29,469 (-793)
-5.35%
-2.67%
-3.80%
-1.35%
-3.18%
-9.37%
-2.07%
-15.47%
-13.69%
-1.77%
-2.56%
-4.42%
-3.89%
-2.42%
-1.91%
-1.35%
-2.62%
7,592 (-429)
51,036 (-652)
7,376 (-291)
34,127 (-482)
7,121 (-234)
8,814 (-911)
40,651 (+1,666)
10,287 (-1,882)
154,529 (-14,141)
73,056 (-819)
8,008 (-210)
7,413 (-343)
68,693 (-2,442)
8,040 (-199)
7,194 (-140)
40,550 (-505)
40,599 (-811)
-5.35%
-1.26%
-3.80%
-1.39%
-3.18%
-9.37%
+4.27%
-15.47%
-8.38%
-1.11%
-2.56%
-4.42%
-3.43%
-2.42%
-1.91%
-1.23%
-1.96%
7,592 (-429)
51,134 (-620)
7,376 (-291)
31,138 (-494)
7,121 (-234)
8,814 (-911)
9,615 (-2,881)
10,287 (-1,882)
145,587 (-23,083)
73,400 (-605)
8,008 (-210)
7,413 (-343)
84,058 (-2,719)
8,040 (-199)
7,194 (-140)
40,459 (-559)
35,293 (-503)
-5.35%
-1.20%
-3.80%
-1.56%
-3.18%
-9.37%
-23.06%
-15.47%
-13.69%
-0.82%
-2.56%
-4.42%
-3.13%
-2.42%
-1.91%
-1.36%
-1.41%
7,592 (-429)
51,362 (-632)
7,376 (-291)
39,510 (-581)
7,121 (-234)
8,814 (-911)
118,807 (-29,891)
10,287 (-1,882)
165,559 (-3,111)
73,688 (-605)
8,008 (-210)
7,413 (-343)
84,967 (-2,756)
8,040 (-199)
7,194 (-140)
51,976 (-721)
57,827 (-925)
-5.35%
-1.22%
-3.80%
-1.45%
-3.18%
-9.37%
-20.10%
-15.47%
-1.84%
-0.81%
-2.56%
-4.42%
-3.14%
-2.42%
-1.91%
-1.37%
-1.57%
772 (0)
1,029 (0)
1,544 (0)
513 (0)
1 (0)
1 (0)
60 (-7,817)
1,285 (0)
67 (+37)
3,598 (+1,542)
1 (0)
257 (0)
1,542 (0)
1 (0)
1,029 (0)
514 (0)
772 (0)
NoReturnsERC20 353,506 (-280,395) allowance
approve
balanceOf
mint
2,778 (-392)
44,638 (-311)
2,538 (-286)
49,350 (-512)
-12.37%
-0.69%
-10.13%
-1.03%
2,778 (-392)
44,638 (-311)
2,538 (-286)
57,906 (-512)
-12.37%
-0.69%
-10.13%
-0.88%
2,778 (-392)
44,638 (-311)
2,538 (-286)
57,906 (-512)
-12.37%
-0.69%
-10.13%
-0.88%
2,778 (-392)
44,638 (-311)
2,538 (-286)
66,462 (-512)
-12.37%
-0.69%
-10.13%
-0.76%
256 (0)
512 (0)
1,024 (0)
3,072 (0)
StandardERC20 359,826 (-302,668) allowance
approve
balanceOf
mint
2,778 (-392)
44,715 (-432)
538 (-286)
49,350 (-512)
-12.37%
-0.96%
-34.71%
-1.03%
2,778 (-392)
44,715 (-432)
2,204 (-286)
57,906 (-512)
-12.37%
-0.96%
-11.49%
-0.88%
2,778 (-392)
44,715 (-432)
2,538 (-286)
57,906 (-512)
-12.37%
-0.96%
-10.13%
-0.88%
2,778 (-392)
44,715 (-432)
2,538 (-286)
66,462 (-512)
-12.37%
-0.96%
-10.13%
-0.76%
256 (0)
768 (0)
3,072 (0)
4,096 (0)
TransferHelperHarness 472,626 (-328,696) safeApprove
safeTransfer
safeTransferExact
safeTransferExactFrom
safeTransferFrom
25,909 (-1,553)
28,406 (-1,441)
32,918 (-3,010)
36,230 (-3,503)
34,039 (-1,936)
-5.66%
-4.83%
-8.38%
-8.82%
-5.38%
37,099 (-1,500)
40,985 (-1,517)
68,192 (-3,364)
74,289 (-3,846)
47,130 (-2,000)
-3.89%
-3.57%
-4.70%
-4.92%
-4.07%
27,192 (-1,492)
29,679 (-1,461)
68,274 (-3,366)
74,383 (-3,847)
34,839 (-1,944)
-5.20%
-4.69%
-4.70%
-4.92%
-5.29%
48,875 (-1,467)
53,780 (-1,697)
80,919 (-3,721)
87,024 (-4,192)
59,931 (-2,190)
-2.91%
-3.06%
-4.40%
-4.60%
-3.53%
1,024 (0)
1,024 (0)
512 (0)
512 (0)
1,024 (0)
VoidDeployer 112,035 (-16,000) deploy 65,848 (-158) -0.24% 65,848 (-158) -0.24% 65,848 (-158) -0.24% 65,848 (-158) -0.24% 269 (0)
AccountWithFallback 68,573 (+12)

@github-actions
Copy link

github-actions bot commented Feb 6, 2026

LCOV of commit 0bccf7b during Forge Coverage #157

Summary coverage rate:
  lines......: 93.7% (433 of 462 lines)
  functions..: 93.4% (141 of 151 functions)
  branches...: no data found

Files changed coverage rate: n/a

Copy link

@JPMora89 JPMora89 left a comment

Choose a reason for hiding this comment

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

LGTM, error message suggested by copilot not relevant as we would have other layers give us necessary info.

@Khrafts Khrafts merged commit 4a40500 into main Feb 10, 2026
2 checks passed
@Khrafts Khrafts deleted the feat/shared-script-utilities branch February 10, 2026 21:07
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