@@ -33,15 +33,15 @@ abstract contract MultiCallContext is Context {
33
33
return super ._isForwarded () || super ._msgSender () == address (_MULTICALL);
34
34
}
35
35
36
- function _msgData () internal view override virtual returns (bytes calldata r ) {
36
+ function _msgData () internal view virtual override returns (bytes calldata r ) {
37
37
address sender = super ._msgSender ();
38
+ r = super ._msgData ();
38
39
assembly ("memory-safe" ) {
39
- r.offset := 0x00
40
40
r.length :=
41
41
xor (
42
- calldatasize () ,
42
+ r. length ,
43
43
mul (
44
- xor (calldatasize () , sub (calldatasize () , 0x14 )),
44
+ xor (r. length , sub (r. length , 0x14 )),
45
45
eq (_MULTICALL_ADDRESS, and (0xffffffffffffffffffffffffffffffffffffffff , sender))
46
46
)
47
47
)
@@ -50,14 +50,18 @@ abstract contract MultiCallContext is Context {
50
50
51
51
function _msgSender () internal view virtual override returns (address sender ) {
52
52
sender = super ._msgSender ();
53
+ bytes calldata data = super ._msgData ();
53
54
assembly ("memory-safe" ) {
54
55
sender := and (0xffffffffffffffffffffffffffffffffffffffff , sender)
55
56
// ERC-2771. The trusted forwarder (`_MULTICALL`) has appended the appropriate
56
57
// msg.sender to the msg data
57
58
sender :=
58
59
xor (
59
60
sender,
60
- mul (xor (sender, shr (0x60 , calldataload (sub (calldatasize (), 0x14 )))), eq (_MULTICALL_ADDRESS, sender))
61
+ mul (
62
+ xor (sender, shr (0x60 , calldataload (add (data.offset, sub (data.length , 0x14 ))))),
63
+ eq (_MULTICALL_ADDRESS, sender)
64
+ )
61
65
)
62
66
}
63
67
}
0 commit comments