@@ -16,6 +16,7 @@ import {Currency} from "@uniswap/v4-core/src/types/Currency.sol";
1616import {SwapParams} from "@uniswap/v4-core/src/types/PoolOperation.sol " ;
1717import {IZoraV4CoinHook} from "../interfaces/IZoraV4CoinHook.sol " ;
1818import {IMsgSender} from "../interfaces/IMsgSender.sol " ;
19+ import {ITrustedMsgSenderProviderLookup} from "../interfaces/ITrustedMsgSenderProviderLookup.sol " ;
1920import {IHasSwapPath} from "../interfaces/ICoin.sol " ;
2021import {LpPosition} from "../types/LpPosition.sol " ;
2122import {V4Liquidity} from "../libs/V4Liquidity.sol " ;
@@ -60,9 +61,10 @@ contract ZoraV4CoinHook is
6061{
6162 using BalanceDeltaLibrary for BalanceDelta;
6263
63- /// @notice Mapping of trusted message senders - these are addresses that are trusted to provide a
64- /// an original msg.sender
65- mapping (address => bool ) internal trustedMessageSender;
64+ /// @dev DEPRECATED: This mapping is kept for storage compatibility. It doesn't matter that storage slots moved around
65+ /// between versions since the contracts are immutable, but in some tests we do etching to test if a new hook fixes some bugs, so we want to maintain the storage slot order.
66+ /// This slot previously held the mappings of trusted message senders.
67+ mapping (address => bool ) internal legacySlot0;
6668
6769 /// @notice Mapping of pool keys to coins.
6870 mapping (bytes32 => IZoraV4CoinHook.PoolCoin) internal poolCoins;
@@ -73,27 +75,34 @@ contract ZoraV4CoinHook is
7375 /// @notice The upgrade gate contract - used to verify allowed upgrade paths
7476 IHooksUpgradeGate internal immutable upgradeGate;
7577
78+ /// @notice The trusted message sender lookup contract - used to determine if an address is trusted
79+ ITrustedMsgSenderProviderLookup internal immutable trustedMsgSenderLookup;
80+
7681 /// @notice The constructor for the ZoraV4CoinHook.
7782 /// @param poolManager_ The Uniswap V4 pool manager
7883 /// @param coinVersionLookup_ The coin version lookup contract - used to determine if an address is a coin and what version it is.
79- /// @param trustedMessageSenders_ The addresses of the trusted message senders - these are addresses that are trusted to provide a
84+ /// @param trustedMsgSenderLookup_ The trusted message sender lookup contract - used to determine if an address is trusted
8085 /// @param upgradeGate_ The upgrade gate contract for managing hook upgrades
8186 constructor (
8287 IPoolManager poolManager_ ,
8388 IDeployedCoinVersionLookup coinVersionLookup_ ,
84- address [] memory trustedMessageSenders_ ,
89+ ITrustedMsgSenderProviderLookup trustedMsgSenderLookup_ ,
8590 IHooksUpgradeGate upgradeGate_
8691 ) BaseHook (poolManager_) {
8792 require (address (coinVersionLookup_) != address (0 ), CoinVersionLookupCannotBeZeroAddress ());
8893
8994 require (address (upgradeGate_) != address (0 ), UpgradeGateCannotBeZeroAddress ());
9095
96+ require (address (trustedMsgSenderLookup_) != address (0 ), TrustedMsgSenderLookupCannotBeZeroAddress ());
97+
9198 coinVersionLookup = coinVersionLookup_;
9299 upgradeGate = upgradeGate_;
100+ trustedMsgSenderLookup = trustedMsgSenderLookup_;
101+ }
93102
94- for ( uint256 i = 0 ; i < trustedMessageSenders_. length ; i ++ ) {
95- trustedMessageSender[trustedMessageSenders_[i]] = true ;
96- }
103+ /// @notice Returns the trusted message sender lookup contract
104+ function getTrustedMsgSenderLookup () external view returns (ITrustedMsgSenderProviderLookup) {
105+ return trustedMsgSenderLookup;
97106 }
98107
99108 /// @notice Returns the uniswap v4 hook settings / permissions.
@@ -120,7 +129,7 @@ contract ZoraV4CoinHook is
120129
121130 /// @inheritdoc IZoraV4CoinHook
122131 function isTrustedMessageSender (address sender ) external view returns (bool ) {
123- return trustedMessageSender[ sender] ;
132+ return trustedMsgSenderLookup. isTrustedMsgSenderProvider ( sender) ;
124133 }
125134
126135 /// @inheritdoc IZoraV4CoinHook
@@ -403,7 +412,12 @@ contract ZoraV4CoinHook is
403412 /// @return swapper The original message sender.
404413 /// @return senderIsTrusted Whether the sender is a trusted message sender.
405414 function _getOriginalMsgSender (address sender ) internal view returns (address swapper , bool senderIsTrusted ) {
406- senderIsTrusted = trustedMessageSender[sender];
415+ // Always trust the zero address (0x caller)
416+ if (sender == address (0 )) {
417+ senderIsTrusted = true ;
418+ } else {
419+ senderIsTrusted = trustedMsgSenderLookup.isTrustedMsgSenderProvider (sender);
420+ }
407421
408422 // If getter function reverts, we return a 0 address by default and continue execution.
409423 try IMsgSender (sender).msgSender () returns (address _swapper ) {
0 commit comments