@@ -92,6 +92,7 @@ contract Pack is
9292 string memory _name ,
9393 string memory _symbol ,
9494 string memory _contractURI ,
95+ address [] memory _trustedForwarders ,
9596 address _royaltyRecipient ,
9697 uint256 _royaltyBps
9798 ) external initializer {
@@ -101,8 +102,17 @@ contract Pack is
101102 // Initialize inherited contracts, most base-like -> most derived.
102103 __ReentrancyGuard_init ();
103104
104- address [] memory forwarders = new address [](1 );
105- forwarders[0 ] = forwarder;
105+ /** note: The immutable state-variable `forwarder` is an EOA-only forwarder,
106+ * which guards against automated attacks.
107+ *
108+ * Use other forwarders only if there's a strong reason to bypass this check.
109+ */
110+ address [] memory forwarders = new address [](_trustedForwarders.length + 1 );
111+ uint256 i;
112+ for (; i < _trustedForwarders.length ; i++ ) {
113+ forwarders[i] = _trustedForwarders[i];
114+ }
115+ forwarders[i] = forwarder;
106116 __ERC2771Context_init (forwarders);
107117 __ERC1155_init (_contractURI);
108118
@@ -111,7 +121,6 @@ contract Pack is
111121
112122 _setupContractURI (_contractURI);
113123 _setupOwner (_defaultAdmin);
114-
115124 _setupRole (DEFAULT_ADMIN_ROLE, _defaultAdmin);
116125
117126 _setupRole (_transferRole, _defaultAdmin);
@@ -192,8 +201,7 @@ contract Pack is
192201 uint128 _amountDistributedPerOpen ,
193202 address _recipient
194203 ) external payable onlyRoleWithSwitch (minterRole) nonReentrant returns (uint256 packId , uint256 packTotalSupply ) {
195- require (_contents.length > 0 , "!Contents " );
196- require (_contents.length == _numOfRewardUnits.length , "!Rewards " );
204+ require (_contents.length > 0 && _contents.length == _numOfRewardUnits.length , "!Len " );
197205
198206 if (! hasRole (assetRole, address (0 ))) {
199207 for (uint256 i = 0 ; i < _contents.length ; i += 1 ) {
@@ -236,9 +244,8 @@ contract Pack is
236244 returns (uint256 packTotalSupply , uint256 newSupplyAdded )
237245 {
238246 require (canUpdatePack[_packId], "!Allowed " );
239- require (_contents.length > 0 , "!Contents " );
240- require (_contents.length == _numOfRewardUnits.length , "!Rewards " );
241- require (balanceOf (_recipient, _packId) != 0 , "!Recipient " );
247+ require (_contents.length > 0 && _contents.length == _numOfRewardUnits.length , "!Len " );
248+ require (balanceOf (_recipient, _packId) != 0 , "!Bal " );
242249
243250 if (! hasRole (assetRole, address (0 ))) {
244251 for (uint256 i = 0 ; i < _contents.length ; i += 1 ) {
@@ -261,7 +268,7 @@ contract Pack is
261268 address opener = _msgSender ();
262269
263270 require (isTrustedForwarder (msg .sender ) || opener == tx .origin , "!EOA " );
264- require (balanceOf (opener, _packId) >= _amountToOpen, "!Balance " );
271+ require (balanceOf (opener, _packId) >= _amountToOpen, "!Bal " );
265272
266273 PackInfo memory pack = packInfo[_packId];
267274 require (pack.openStartTimestamp <= block .timestamp , "cant open " );
@@ -290,15 +297,15 @@ contract Pack is
290297
291298 for (uint256 i = 0 ; i < _contents.length ; i += 1 ) {
292299 require (_contents[i].totalAmount != 0 , "0 amt " );
293- require (_contents[i].totalAmount % _numOfRewardUnits[i] == 0 , "!Rewards " );
294- require (_contents[i].tokenType != TokenType.ERC721 || _contents[i].totalAmount == 1 , "!Rewards " );
300+ require (_contents[i].totalAmount % _numOfRewardUnits[i] == 0 , "!R " );
301+ require (_contents[i].tokenType != TokenType.ERC721 || _contents[i].totalAmount == 1 , "!R " );
295302
296303 sumOfRewardUnits += _numOfRewardUnits[i];
297304
298305 packInfo[packId].perUnitAmounts.push (_contents[i].totalAmount / _numOfRewardUnits[i]);
299306 }
300307
301- require (sumOfRewardUnits % amountPerOpen == 0 , "!Amounts " );
308+ require (sumOfRewardUnits % amountPerOpen == 0 , "!Amt " );
302309 supplyToMint = sumOfRewardUnits / amountPerOpen;
303310
304311 if (isUpdate) {
0 commit comments