@@ -433,8 +433,10 @@ abstract contract MultisigScript is Script {
433433 {
434434 IMulticall3.Call3[] memory calls = _simulateForSignerCalls (_safes, _datas, _value);
435435
436+ bytes32 firstCallDataHash = _getTransactionHash (_safes[0 ], _datas[0 ], _value);
437+
436438 // Now define the state overrides for the simulation.
437- Simulation.StateOverride[] memory overrides = _overrides (_safes);
439+ Simulation.StateOverride[] memory overrides = _overrides (_safes, firstCallDataHash );
438440
439441 bytes memory txData = abi.encodeCall (IMulticall3.aggregate3, (calls));
440442 console.log ("---\nSimulation link: " );
@@ -451,13 +453,12 @@ abstract contract MultisigScript is Script {
451453
452454 function _simulateForSignerCalls (address [] memory _safes , bytes [] memory _datas , uint256 _value )
453455 private
454- pure
456+ view
455457 returns (IMulticall3.Call3[] memory )
456458 {
457459 IMulticall3.Call3[] memory calls = new IMulticall3.Call3 [](_safes.length );
458460 for (uint256 i; i < _safes.length ; i++ ) {
459- address signer = i == 0 ? MULTICALL3_ADDRESS : _safes[i - 1 ];
460- // uint256 value = i == _safes.length - 1 ? _value : 0;
461+ address signer = i == 0 ? msg .sender : _safes[i - 1 ];
461462
462463 calls[i] = IMulticall3.Call3 ({
463464 target: _safes[i],
@@ -471,35 +472,31 @@ abstract contract MultisigScript is Script {
471472 return calls;
472473 }
473474
474- function _overrides (address [] memory _safes ) internal view returns (Simulation.StateOverride[] memory ) {
475- Simulation.StateOverride[] memory simOverrides = _simulationOverrides ();
476- Simulation.StateOverride[] memory overrides =
477- new Simulation.StateOverride [](_safes.length + simOverrides.length );
478- for (uint256 i = 0 ; i < _safes.length ; i++ ) {
479- address owner = i == 0 ? MULTICALL3_ADDRESS : address (0 );
480- overrides[i] = _safeOverrides (_safes[i], owner);
481- }
482- for (uint256 i = 0 ; i < simOverrides.length ; i++ ) {
483- overrides[i + _safes.length ] = simOverrides[i];
484- }
485- return overrides;
486- }
487-
488475 // The state change simulation can set the threshold, owner address and/or nonce.
489476 // This allows simulation of the final transaction by overriding the threshold to 1.
490477 // State changes reflected in the simulation as a result of these overrides will
491478 // not be reflected in the prod execution.
492- function _safeOverrides (address _safe , address _owner )
479+ function _overrides (address [] memory _safes , bytes32 firstCallDataHash )
493480 internal
494481 view
495- virtual
496- returns (Simulation.StateOverride memory )
482+ returns (Simulation.StateOverride[] memory )
497483 {
498- uint256 _nonce = _getNonce (_safe);
499- if (_owner == address (0 )) {
500- return Simulation.overrideSafeThresholdAndNonce (_safe, _nonce);
484+ Simulation.StateOverride[] memory simOverrides = _simulationOverrides ();
485+ Simulation.StateOverride[] memory overrides =
486+ new Simulation.StateOverride [](_safes.length + simOverrides.length );
487+
488+ uint256 nonce = _getNonce (_safes[0 ]);
489+ overrides[0 ] = Simulation.overrideSafeThresholdApprovalAndNonce (_safes[0 ], nonce, msg .sender , firstCallDataHash);
490+
491+ for (uint256 i = 1 ; i < _safes.length ; i++ ) {
492+ overrides[i] = Simulation.overrideSafeThresholdAndNonce (_safes[i], _getNonce (_safes[i]));
501493 }
502- return Simulation.overrideSafeThresholdOwnerAndNonce (_safe, _owner, _nonce);
494+
495+ for (uint256 i = 0 ; i < simOverrides.length ; i++ ) {
496+ overrides[i + _safes.length ] = simOverrides[i];
497+ }
498+
499+ return overrides;
503500 }
504501
505502 // Get the nonce to use for the given safe, for signing and simulations.
0 commit comments