@@ -50,7 +50,7 @@ abstract contract ERC1155BaseInternal is IERC1155Internal {
50
50
require (account != address (0 ), 'ERC1155: mint to the zero address ' );
51
51
52
52
_beforeTokenTransfer (
53
- msg . sender ,
53
+ _msgSender () ,
54
54
address (0 ),
55
55
account,
56
56
_asSingletonArray (id),
@@ -60,7 +60,7 @@ abstract contract ERC1155BaseInternal is IERC1155Internal {
60
60
61
61
ERC1155BaseStorage .layout ().balances[id][account] += amount;
62
62
63
- emit TransferSingle (msg . sender , address (0 ), account, id, amount);
63
+ emit TransferSingle (_msgSender () , address (0 ), account, id, amount);
64
64
}
65
65
66
66
/**
@@ -79,7 +79,7 @@ abstract contract ERC1155BaseInternal is IERC1155Internal {
79
79
_mint (account, id, amount, data);
80
80
81
81
_doSafeTransferAcceptanceCheck (
82
- msg . sender ,
82
+ _msgSender () ,
83
83
address (0 ),
84
84
account,
85
85
id,
@@ -109,7 +109,7 @@ abstract contract ERC1155BaseInternal is IERC1155Internal {
109
109
);
110
110
111
111
_beforeTokenTransfer (
112
- msg . sender ,
112
+ _msgSender () ,
113
113
address (0 ),
114
114
account,
115
115
ids,
@@ -127,7 +127,7 @@ abstract contract ERC1155BaseInternal is IERC1155Internal {
127
127
}
128
128
}
129
129
130
- emit TransferBatch (msg . sender , address (0 ), account, ids, amounts);
130
+ emit TransferBatch (_msgSender () , address (0 ), account, ids, amounts);
131
131
}
132
132
133
133
/**
@@ -146,7 +146,7 @@ abstract contract ERC1155BaseInternal is IERC1155Internal {
146
146
_mintBatch (account, ids, amounts, data);
147
147
148
148
_doSafeBatchTransferAcceptanceCheck (
149
- msg . sender ,
149
+ _msgSender () ,
150
150
address (0 ),
151
151
account,
152
152
ids,
@@ -169,7 +169,7 @@ abstract contract ERC1155BaseInternal is IERC1155Internal {
169
169
require (account != address (0 ), 'ERC1155: burn from the zero address ' );
170
170
171
171
_beforeTokenTransfer (
172
- msg . sender ,
172
+ _msgSender () ,
173
173
account,
174
174
address (0 ),
175
175
_asSingletonArray (id),
@@ -189,7 +189,7 @@ abstract contract ERC1155BaseInternal is IERC1155Internal {
189
189
balances[account] -= amount;
190
190
}
191
191
192
- emit TransferSingle (msg . sender , account, address (0 ), id, amount);
192
+ emit TransferSingle (_msgSender () , account, address (0 ), id, amount);
193
193
}
194
194
195
195
/**
@@ -209,7 +209,14 @@ abstract contract ERC1155BaseInternal is IERC1155Internal {
209
209
'ERC1155: ids and amounts length mismatch '
210
210
);
211
211
212
- _beforeTokenTransfer (msg .sender , account, address (0 ), ids, amounts, '' );
212
+ _beforeTokenTransfer (
213
+ _msgSender (),
214
+ account,
215
+ address (0 ),
216
+ ids,
217
+ amounts,
218
+ ''
219
+ );
213
220
214
221
mapping (uint256 => mapping (address => uint256 ))
215
222
storage balances = ERC1155BaseStorage .layout ().balances;
@@ -225,7 +232,7 @@ abstract contract ERC1155BaseInternal is IERC1155Internal {
225
232
}
226
233
}
227
234
228
- emit TransferBatch (msg . sender , account, address (0 ), ids, amounts);
235
+ emit TransferBatch (_msgSender () , account, address (0 ), ids, amounts);
229
236
}
230
237
231
238
/**
@@ -504,4 +511,24 @@ abstract contract ERC1155BaseInternal is IERC1155Internal {
504
511
uint256 [] memory amounts ,
505
512
bytes memory data
506
513
) internal virtual {}
514
+
515
+ /*
516
+ * @notice Overrides the msgSender to enable delegation message signing.
517
+ * @returns address - The account whose authority is being acted on.
518
+ */
519
+ function _msgSender () internal view virtual returns (address sender ) {
520
+ if (msg .sender == address (this )) {
521
+ bytes memory array = msg .data ;
522
+ uint256 index = msg .data .length ;
523
+ assembly {
524
+ sender := and (
525
+ mload (add (array, index)),
526
+ 0xffffffffffffffffffffffffffffffffffffffff
527
+ )
528
+ }
529
+ } else {
530
+ sender = msg .sender ;
531
+ }
532
+ return sender;
533
+ }
507
534
}
0 commit comments