@rarible/external-contracts 3.11.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) hide show
  1. package/LICENSE.md +201 -0
  2. package/README.md +144 -0
  3. package/contracts/base/ERC1155Base.sol +282 -0
  4. package/contracts/base/ERC1155DelayedReveal.sol +117 -0
  5. package/contracts/base/ERC1155Drop.sol +368 -0
  6. package/contracts/base/ERC1155LazyMint.sol +286 -0
  7. package/contracts/base/ERC1155SignatureMint.sol +132 -0
  8. package/contracts/base/ERC20Base.sol +111 -0
  9. package/contracts/base/ERC20Drop.sol +157 -0
  10. package/contracts/base/ERC20DropVote.sol +135 -0
  11. package/contracts/base/ERC20SignatureMint.sol +100 -0
  12. package/contracts/base/ERC20SignatureMintVote.sol +107 -0
  13. package/contracts/base/ERC20Vote.sol +111 -0
  14. package/contracts/base/ERC721Base.sol +210 -0
  15. package/contracts/base/ERC721DelayedReveal.sol +118 -0
  16. package/contracts/base/ERC721Drop.sol +312 -0
  17. package/contracts/base/ERC721LazyMint.sol +219 -0
  18. package/contracts/base/ERC721Multiwrap.sol +262 -0
  19. package/contracts/base/ERC721SignatureMint.sol +120 -0
  20. package/contracts/base/Staking1155Base.sol +189 -0
  21. package/contracts/base/Staking20Base.sol +179 -0
  22. package/contracts/base/Staking721Base.sol +186 -0
  23. package/contracts/eip/ERC1155.sol +294 -0
  24. package/contracts/eip/ERC1271.sol +18 -0
  25. package/contracts/eip/ERC165.sol +29 -0
  26. package/contracts/eip/ERC721A.sol +580 -0
  27. package/contracts/eip/ERC721AUpgradeable.sol +625 -0
  28. package/contracts/eip/ERC721AVirtualApprove.sol +582 -0
  29. package/contracts/eip/ERC721AVirtualApproveUpgradeable.sol +598 -0
  30. package/contracts/eip/interface/IERC1155.sol +132 -0
  31. package/contracts/eip/interface/IERC1155Enumerable.sol +11 -0
  32. package/contracts/eip/interface/IERC1155Metadata.sol +15 -0
  33. package/contracts/eip/interface/IERC1155Receiver.sol +58 -0
  34. package/contracts/eip/interface/IERC1155Supply.sol +11 -0
  35. package/contracts/eip/interface/IERC165.sol +25 -0
  36. package/contracts/eip/interface/IERC20.sol +24 -0
  37. package/contracts/eip/interface/IERC20Metadata.sol +14 -0
  38. package/contracts/eip/interface/IERC20Permit.sol +60 -0
  39. package/contracts/eip/interface/IERC2981.sol +23 -0
  40. package/contracts/eip/interface/IERC4906.sol +17 -0
  41. package/contracts/eip/interface/IERC721.sol +128 -0
  42. package/contracts/eip/interface/IERC721A.sol +109 -0
  43. package/contracts/eip/interface/IERC721Enumerable.sol +24 -0
  44. package/contracts/eip/interface/IERC721Metadata.sol +20 -0
  45. package/contracts/eip/interface/IERC721Receiver.sol +27 -0
  46. package/contracts/eip/interface/IERC721Supply.sol +13 -0
  47. package/contracts/eip/queryable/ERC721AQueryable.sol +168 -0
  48. package/contracts/eip/queryable/ERC721AQueryableUpgradeable.sol +193 -0
  49. package/contracts/eip/queryable/ERC721AStorage.sol +57 -0
  50. package/contracts/eip/queryable/ERC721AUpgradeable.sol +1075 -0
  51. package/contracts/eip/queryable/ERC721A__Initializable.sol +75 -0
  52. package/contracts/eip/queryable/ERC721A__InitializableStorage.sol +29 -0
  53. package/contracts/eip/queryable/IERC721AQueryable.sol +69 -0
  54. package/contracts/eip/queryable/IERC721AQueryableUpgradeable.sol +69 -0
  55. package/contracts/eip/queryable/IERC721AUpgradeable.sol +269 -0
  56. package/contracts/extension/AppURI.sol +37 -0
  57. package/contracts/extension/BatchMintMetadata.sol +143 -0
  58. package/contracts/extension/BurnToClaim.sol +60 -0
  59. package/contracts/extension/ContractMetadata.sol +48 -0
  60. package/contracts/extension/DelayedReveal.sol +111 -0
  61. package/contracts/extension/Drop.sol +284 -0
  62. package/contracts/extension/Drop1155.sol +300 -0
  63. package/contracts/extension/DropSinglePhase.sol +237 -0
  64. package/contracts/extension/DropSinglePhase1155.sol +215 -0
  65. package/contracts/extension/Initializable.sol +136 -0
  66. package/contracts/extension/LazyMint.sol +56 -0
  67. package/contracts/extension/LazyMintWithTier.sol +112 -0
  68. package/contracts/extension/Multicall.sol +40 -0
  69. package/contracts/extension/NFTMetadata.sol +58 -0
  70. package/contracts/extension/OperatorFilterToggle.sol +22 -0
  71. package/contracts/extension/OperatorFilterer.sol +73 -0
  72. package/contracts/extension/OperatorFiltererUpgradeable.sol +69 -0
  73. package/contracts/extension/Ownable.sol +58 -0
  74. package/contracts/extension/Permissions.sol +159 -0
  75. package/contracts/extension/PermissionsEnumerable.sol +111 -0
  76. package/contracts/extension/PlatformFee.sol +117 -0
  77. package/contracts/extension/PrimarySale.sol +57 -0
  78. package/contracts/extension/Proxy.sol +84 -0
  79. package/contracts/extension/ProxyForUpgradeable.sol +32 -0
  80. package/contracts/extension/Royalty.sol +134 -0
  81. package/contracts/extension/SeaportEIP1271.sol +88 -0
  82. package/contracts/extension/SeaportOrderParser.sol +550 -0
  83. package/contracts/extension/SharedMetadata.sol +63 -0
  84. package/contracts/extension/SignatureAction.sol +67 -0
  85. package/contracts/extension/SignatureActionUpgradeable.sol +71 -0
  86. package/contracts/extension/SignatureMintERC1155.sol +78 -0
  87. package/contracts/extension/SignatureMintERC1155Upgradeable.sol +84 -0
  88. package/contracts/extension/SignatureMintERC20.sol +70 -0
  89. package/contracts/extension/SignatureMintERC20Upgradeable.sol +77 -0
  90. package/contracts/extension/SignatureMintERC721.sol +96 -0
  91. package/contracts/extension/SignatureMintERC721Upgradeable.sol +102 -0
  92. package/contracts/extension/SoulboundERC721A.sol +51 -0
  93. package/contracts/extension/Staking1155.sol +516 -0
  94. package/contracts/extension/Staking1155Upgradeable.sol +516 -0
  95. package/contracts/extension/Staking20.sol +376 -0
  96. package/contracts/extension/Staking20Upgradeable.sol +383 -0
  97. package/contracts/extension/Staking721.sol +362 -0
  98. package/contracts/extension/Staking721Upgradeable.sol +364 -0
  99. package/contracts/extension/TokenBundle.sol +130 -0
  100. package/contracts/extension/TokenStore.sol +97 -0
  101. package/contracts/extension/Upgradeable.sol +95 -0
  102. package/contracts/extension/interface/IAccountPermissions.sol +114 -0
  103. package/contracts/extension/interface/IAppURI.sol +24 -0
  104. package/contracts/extension/interface/IBurnToClaim.sol +43 -0
  105. package/contracts/extension/interface/IBurnableERC1155.sol +16 -0
  106. package/contracts/extension/interface/IBurnableERC20.sol +26 -0
  107. package/contracts/extension/interface/IBurnableERC721.sol +15 -0
  108. package/contracts/extension/interface/IClaimCondition.sol +48 -0
  109. package/contracts/extension/interface/IClaimConditionMultiPhase.sol +39 -0
  110. package/contracts/extension/interface/IClaimConditionsSinglePhase.sol +31 -0
  111. package/contracts/extension/interface/IClaimableERC1155.sol +39 -0
  112. package/contracts/extension/interface/IClaimableERC721.sol +37 -0
  113. package/contracts/extension/interface/IContractFactory.sol +20 -0
  114. package/contracts/extension/interface/IContractMetadata.sol +25 -0
  115. package/contracts/extension/interface/IDelayedReveal.sol +33 -0
  116. package/contracts/extension/interface/IDelayedRevealDeprecated.sol +38 -0
  117. package/contracts/extension/interface/IDrop.sol +72 -0
  118. package/contracts/extension/interface/IDrop1155.sol +75 -0
  119. package/contracts/extension/interface/IDropSinglePhase.sol +70 -0
  120. package/contracts/extension/interface/IDropSinglePhase1155.sol +74 -0
  121. package/contracts/extension/interface/IERC2771Context.sol +6 -0
  122. package/contracts/extension/interface/ILazyMint.sol +33 -0
  123. package/contracts/extension/interface/ILazyMintWithTier.sol +43 -0
  124. package/contracts/extension/interface/IMintableERC1155.sol +24 -0
  125. package/contracts/extension/interface/IMintableERC20.sol +20 -0
  126. package/contracts/extension/interface/IMintableERC721.sol +19 -0
  127. package/contracts/extension/interface/IMulticall.sol +16 -0
  128. package/contracts/extension/interface/INFTMetadata.sol +17 -0
  129. package/contracts/extension/interface/IOperatorFilterRegistry.sol +54 -0
  130. package/contracts/extension/interface/IOperatorFilterToggle.sol +12 -0
  131. package/contracts/extension/interface/IOwnable.sol +21 -0
  132. package/contracts/extension/interface/IPermissions.sol +88 -0
  133. package/contracts/extension/interface/IPermissionsEnumerable.sol +31 -0
  134. package/contracts/extension/interface/IPlatformFee.sol +33 -0
  135. package/contracts/extension/interface/IPrimarySale.sol +21 -0
  136. package/contracts/extension/interface/IRoyalty.sol +39 -0
  137. package/contracts/extension/interface/IRoyaltyEngineV1.sol +42 -0
  138. package/contracts/extension/interface/IRoyaltyPayments.sol +37 -0
  139. package/contracts/extension/interface/IRulesEngine.sol +58 -0
  140. package/contracts/extension/interface/ISharedMetadata.sol +30 -0
  141. package/contracts/extension/interface/ISharedMetadataBatch.sol +57 -0
  142. package/contracts/extension/interface/ISignatureAction.sol +44 -0
  143. package/contracts/extension/interface/ISignatureMintERC1155.sol +77 -0
  144. package/contracts/extension/interface/ISignatureMintERC20.sol +64 -0
  145. package/contracts/extension/interface/ISignatureMintERC721.sol +75 -0
  146. package/contracts/extension/interface/IStaking1155.sol +110 -0
  147. package/contracts/extension/interface/IStaking20.sol +97 -0
  148. package/contracts/extension/interface/IStaking721.sol +83 -0
  149. package/contracts/extension/interface/ITokenBundle.sol +52 -0
  150. package/contracts/extension/interface/plugin/IContext.sol +10 -0
  151. package/contracts/extension/interface/plugin/IPluginMap.sol +31 -0
  152. package/contracts/extension/interface/plugin/IRouter.sol +30 -0
  153. package/contracts/extension/plugin/ContractMetadataLogic.sol +52 -0
  154. package/contracts/extension/plugin/ContractMetadataStorage.sol +25 -0
  155. package/contracts/extension/plugin/ERC2771ContextConsumer.sol +34 -0
  156. package/contracts/extension/plugin/ERC2771ContextLogic.sol +43 -0
  157. package/contracts/extension/plugin/ERC2771ContextStorage.sol +22 -0
  158. package/contracts/extension/plugin/ERC2771ContextUpgradeableLogic.sol +47 -0
  159. package/contracts/extension/plugin/ERC2771ContextUpgradeableStorage.sol +20 -0
  160. package/contracts/extension/plugin/PermissionsEnumerableLogic.sol +101 -0
  161. package/contracts/extension/plugin/PermissionsEnumerableStorage.sol +41 -0
  162. package/contracts/extension/plugin/PermissionsLogic.sol +182 -0
  163. package/contracts/extension/plugin/PermissionsStorage.sol +28 -0
  164. package/contracts/extension/plugin/PlatformFeeLogic.sol +56 -0
  165. package/contracts/extension/plugin/PlatformFeeStorage.sol +28 -0
  166. package/contracts/extension/plugin/PluginMap.sol +81 -0
  167. package/contracts/extension/plugin/ReentrancyGuardLogic.sol +69 -0
  168. package/contracts/extension/plugin/ReentrancyGuardStorage.sol +22 -0
  169. package/contracts/extension/plugin/Router.sol +270 -0
  170. package/contracts/extension/plugin/RouterImmutable.sol +26 -0
  171. package/contracts/extension/plugin/RoyaltyPayments.sol +121 -0
  172. package/contracts/extension/upgradeable/AccountPermissions.sol +253 -0
  173. package/contracts/extension/upgradeable/BatchMintMetadata.sol +144 -0
  174. package/contracts/extension/upgradeable/BurnToClaim.sol +83 -0
  175. package/contracts/extension/upgradeable/ContractMetadata.sol +73 -0
  176. package/contracts/extension/upgradeable/DelayedReveal.sol +126 -0
  177. package/contracts/extension/upgradeable/Drop.sol +278 -0
  178. package/contracts/extension/upgradeable/ERC2771Context.sol +64 -0
  179. package/contracts/extension/upgradeable/ERC2771ContextConsumer.sol +32 -0
  180. package/contracts/extension/upgradeable/ERC2771ContextUpgradeable.sol +72 -0
  181. package/contracts/extension/upgradeable/Initializable.sol +110 -0
  182. package/contracts/extension/upgradeable/LazyMint.sol +77 -0
  183. package/contracts/extension/upgradeable/OperatorFilterToggle.sol +47 -0
  184. package/contracts/extension/upgradeable/OperatorFiltererUpgradeable.sol +58 -0
  185. package/contracts/extension/upgradeable/Ownable.sol +75 -0
  186. package/contracts/extension/upgradeable/Permissions.sol +197 -0
  187. package/contracts/extension/upgradeable/PermissionsEnumerable.sol +134 -0
  188. package/contracts/extension/upgradeable/PlatformFee.sol +131 -0
  189. package/contracts/extension/upgradeable/PrimarySale.sol +69 -0
  190. package/contracts/extension/upgradeable/ReentrancyGuard.sol +53 -0
  191. package/contracts/extension/upgradeable/Royalty.sol +144 -0
  192. package/contracts/extension/upgradeable/RoyaltyPayments.sol +121 -0
  193. package/contracts/extension/upgradeable/RulesEngine.sol +163 -0
  194. package/contracts/extension/upgradeable/SharedMetadataBatch.sol +98 -0
  195. package/contracts/extension/upgradeable/impl/ContractMetadataImpl.sol +34 -0
  196. package/contracts/extension/upgradeable/impl/MetaTx.sol +8 -0
  197. package/contracts/extension/upgradeable/impl/PermissionsEnumerableImpl.sol +28 -0
  198. package/contracts/extension/upgradeable/impl/PlatformFeeImpl.sol +34 -0
  199. package/contracts/extension/upgradeable/init/ContractMetadataInit.sol +17 -0
  200. package/contracts/extension/upgradeable/init/ERC2771ContextInit.sol +19 -0
  201. package/contracts/extension/upgradeable/init/ERC721AInit.sol +23 -0
  202. package/contracts/extension/upgradeable/init/ERC721AQueryableInit.sol +21 -0
  203. package/contracts/extension/upgradeable/init/OwnableInit.sol +18 -0
  204. package/contracts/extension/upgradeable/init/PermissionsEnumerableInit.sol +23 -0
  205. package/contracts/extension/upgradeable/init/PermissionsInit.sol +27 -0
  206. package/contracts/extension/upgradeable/init/PlatformFeeInit.sol +25 -0
  207. package/contracts/extension/upgradeable/init/PrimarySaleInit.sol +19 -0
  208. package/contracts/extension/upgradeable/init/ReentrancyGuardInit.sol +18 -0
  209. package/contracts/extension/upgradeable/init/RoyaltyInit.sol +22 -0
  210. package/contracts/external-deps/chainlink/LinkTokenInterface.sol +28 -0
  211. package/contracts/external-deps/chainlink/VRFV2WrapperConsumerBase.sol +83 -0
  212. package/contracts/external-deps/chainlink/VRFV2WrapperInterface.sol +35 -0
  213. package/contracts/external-deps/openzeppelin/ERC1155PresetUpgradeable.sol +160 -0
  214. package/contracts/external-deps/openzeppelin/cryptography/EIP712ChainlessDomain.sol +100 -0
  215. package/contracts/external-deps/openzeppelin/finance/PaymentSplitterUpgradeable.sol +231 -0
  216. package/contracts/external-deps/openzeppelin/governance/utils/IVotes.sol +54 -0
  217. package/contracts/external-deps/openzeppelin/metatx/ERC2771Context.sol +44 -0
  218. package/contracts/external-deps/openzeppelin/metatx/ERC2771ContextUpgradeable.sol +50 -0
  219. package/contracts/external-deps/openzeppelin/metatx/MinimalForwarderEOAOnly.sol +67 -0
  220. package/contracts/external-deps/openzeppelin/proxy/Clones.sol +88 -0
  221. package/contracts/external-deps/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol +32 -0
  222. package/contracts/external-deps/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol +173 -0
  223. package/contracts/external-deps/openzeppelin/proxy/IERC1822Proxiable.sol +20 -0
  224. package/contracts/external-deps/openzeppelin/proxy/Proxy.sol +86 -0
  225. package/contracts/external-deps/openzeppelin/proxy/beacon/IBeacon.sol +16 -0
  226. package/contracts/external-deps/openzeppelin/proxy/utils/Initializable.sol +138 -0
  227. package/contracts/external-deps/openzeppelin/security/ReentrancyGuard.sol +32 -0
  228. package/contracts/external-deps/openzeppelin/security/ReentrancyGuardUpgradeable.sol +44 -0
  229. package/contracts/external-deps/openzeppelin/token/ERC1155/IERC1155Receiver.sol +58 -0
  230. package/contracts/external-deps/openzeppelin/token/ERC1155/utils/ERC1155Holder.sol +36 -0
  231. package/contracts/external-deps/openzeppelin/token/ERC1155/utils/ERC1155Receiver.sol +19 -0
  232. package/contracts/external-deps/openzeppelin/token/ERC20/ERC20.sol +359 -0
  233. package/contracts/external-deps/openzeppelin/token/ERC20/extensions/ERC20Permit.sol +117 -0
  234. package/contracts/external-deps/openzeppelin/token/ERC20/extensions/ERC20Votes.sol +246 -0
  235. package/contracts/external-deps/openzeppelin/token/ERC20/utils/SafeERC20.sol +78 -0
  236. package/contracts/external-deps/openzeppelin/token/ERC721/IERC721Receiver.sol +27 -0
  237. package/contracts/external-deps/openzeppelin/token/ERC721/utils/ERC721Holder.sol +23 -0
  238. package/contracts/external-deps/openzeppelin/utils/Base64.sol +92 -0
  239. package/contracts/external-deps/openzeppelin/utils/Context.sol +24 -0
  240. package/contracts/external-deps/openzeppelin/utils/Counters.sol +43 -0
  241. package/contracts/external-deps/openzeppelin/utils/Create2.sol +58 -0
  242. package/contracts/external-deps/openzeppelin/utils/ERC1155/ERC1155Holder.sol +36 -0
  243. package/contracts/external-deps/openzeppelin/utils/ERC1155/ERC1155Receiver.sol +19 -0
  244. package/contracts/external-deps/openzeppelin/utils/ERC721/ERC721Holder.sol +23 -0
  245. package/contracts/external-deps/openzeppelin/utils/EnumerableSet.sol +367 -0
  246. package/contracts/external-deps/openzeppelin/utils/cryptography/ECDSA.sol +217 -0
  247. package/contracts/external-deps/openzeppelin/utils/cryptography/EIP712.sol +104 -0
  248. package/contracts/external-deps/openzeppelin/utils/math/Math.sol +43 -0
  249. package/contracts/external-deps/openzeppelin/utils/math/SafeCast.sol +241 -0
  250. package/contracts/external-deps/openzeppelin/utils/math/SafeMath.sol +215 -0
  251. package/contracts/external-deps/openzeppelin/utils/structs/EnumerableSet.sol +367 -0
  252. package/contracts/infra/ContractPublisher.sol +268 -0
  253. package/contracts/infra/TWFactory.sol +140 -0
  254. package/contracts/infra/TWFee.sol +162 -0
  255. package/contracts/infra/TWMinimalFactory.sol +47 -0
  256. package/contracts/infra/TWMultichainRegistry.sol +116 -0
  257. package/contracts/infra/TWProxy.sol +42 -0
  258. package/contracts/infra/TWRegistry.sol +70 -0
  259. package/contracts/infra/TWStatelessFactory.sol +47 -0
  260. package/contracts/infra/forwarder/Forwarder.sol +76 -0
  261. package/contracts/infra/forwarder/ForwarderChainlessDomain.sol +90 -0
  262. package/contracts/infra/forwarder/ForwarderConsumer.sol +25 -0
  263. package/contracts/infra/forwarder/ForwarderEOAOnly.sol +23 -0
  264. package/contracts/infra/interface/IContractDeployer.sol +54 -0
  265. package/contracts/infra/interface/IContractPublisher.sol +128 -0
  266. package/contracts/infra/interface/ITWFee.sol +6 -0
  267. package/contracts/infra/interface/ITWMultichainRegistry.sol +28 -0
  268. package/contracts/infra/interface/ITWRegistry.sol +24 -0
  269. package/contracts/infra/interface/IThirdwebContract.sol +19 -0
  270. package/contracts/infra/interface/IWETH.sol +10 -0
  271. package/contracts/infra/registry/entrypoint/TWMultichainRegistryRouter.sol +61 -0
  272. package/contracts/infra/registry/registry-extension/TWMultichainRegistryLogic.sol +120 -0
  273. package/contracts/infra/registry/registry-extension/TWMultichainRegistryStorage.sol +30 -0
  274. package/contracts/legacy-contracts/extension/BatchMintMetadata_V1.sol +89 -0
  275. package/contracts/legacy-contracts/extension/DropSinglePhase1155_V1.sol +268 -0
  276. package/contracts/legacy-contracts/extension/DropSinglePhase_V1.sol +252 -0
  277. package/contracts/legacy-contracts/extension/LazyMintWithTier_V1.sol +112 -0
  278. package/contracts/legacy-contracts/extension/LazyMint_V1.sol +52 -0
  279. package/contracts/legacy-contracts/extension/PlatformFee_V1.sol +69 -0
  280. package/contracts/legacy-contracts/extension/PrimarySale_V1.sol +53 -0
  281. package/contracts/legacy-contracts/extension/interface/IClaimCondition_V1.sol +54 -0
  282. package/contracts/legacy-contracts/extension/interface/IDropSinglePhase1155_V1.sol +58 -0
  283. package/contracts/legacy-contracts/extension/interface/IDropSinglePhase_V1.sol +54 -0
  284. package/contracts/legacy-contracts/extension/interface/IPlatformFee_V1.sol +21 -0
  285. package/contracts/legacy-contracts/extension/interface/IPrimarySale_V1.sol +21 -0
  286. package/contracts/legacy-contracts/interface/ISignatureMintERC721_V1.sol +18 -0
  287. package/contracts/legacy-contracts/interface/drop/IDropClaimCondition_V2.sol +82 -0
  288. package/contracts/legacy-contracts/interface/drop/IDropERC1155_V2.sol +96 -0
  289. package/contracts/legacy-contracts/interface/drop/IDropERC20_V2.sol +73 -0
  290. package/contracts/legacy-contracts/interface/drop/IDropERC721_V3.sol +98 -0
  291. package/contracts/legacy-contracts/pre-builts/DropERC1155_V2.sol +731 -0
  292. package/contracts/legacy-contracts/pre-builts/DropERC20_V2.sol +521 -0
  293. package/contracts/legacy-contracts/pre-builts/DropERC721_V3.sol +745 -0
  294. package/contracts/legacy-contracts/pre-builts/SignatureDrop_V4.sol +360 -0
  295. package/contracts/legacy-contracts/smart-wallet/interface/IAccountPermissions_V1.sol +115 -0
  296. package/contracts/lib/Address.sol +244 -0
  297. package/contracts/lib/BitMaps.sol +52 -0
  298. package/contracts/lib/BytesLib.sol +18 -0
  299. package/contracts/lib/CurrencyTransferLib.sol +96 -0
  300. package/contracts/lib/FeeType.sol +10 -0
  301. package/contracts/lib/MerkleProof.sol +40 -0
  302. package/contracts/lib/NFTMetadataRenderer.sol +91 -0
  303. package/contracts/lib/StorageSlot.sol +54 -0
  304. package/contracts/lib/StringSet.sol +107 -0
  305. package/contracts/lib/Strings.sol +195 -0
  306. package/contracts/prebuilts/account/dynamic/DynamicAccount.sol +48 -0
  307. package/contracts/prebuilts/account/dynamic/DynamicAccountFactory.sol +61 -0
  308. package/contracts/prebuilts/account/interfaces/IAccount.sol +39 -0
  309. package/contracts/prebuilts/account/interfaces/IAccountCore.sol +11 -0
  310. package/contracts/prebuilts/account/interfaces/IAccountExecute.sol +17 -0
  311. package/contracts/prebuilts/account/interfaces/IAccountFactory.sol +16 -0
  312. package/contracts/prebuilts/account/interfaces/IAccountFactoryCore.sol +40 -0
  313. package/contracts/prebuilts/account/interfaces/IAggregator.sol +41 -0
  314. package/contracts/prebuilts/account/interfaces/IEntryPoint.sol +204 -0
  315. package/contracts/prebuilts/account/interfaces/INonceManager.sol +25 -0
  316. package/contracts/prebuilts/account/interfaces/IOracle.sol +10 -0
  317. package/contracts/prebuilts/account/interfaces/IPaymaster.sol +63 -0
  318. package/contracts/prebuilts/account/interfaces/IStakeManager.sol +94 -0
  319. package/contracts/prebuilts/account/interfaces/PackedUserOperation.sol +28 -0
  320. package/contracts/prebuilts/account/managed/ManagedAccount.sol +33 -0
  321. package/contracts/prebuilts/account/managed/ManagedAccountFactory.sol +68 -0
  322. package/contracts/prebuilts/account/non-upgradeable/Account.sol +169 -0
  323. package/contracts/prebuilts/account/non-upgradeable/AccountFactory.sol +54 -0
  324. package/contracts/prebuilts/account/token-bound-account/TokenBoundAccount.sol +252 -0
  325. package/contracts/prebuilts/account/token-bound-account/erc6551-utils/ERC6551AccountLib.sol +44 -0
  326. package/contracts/prebuilts/account/token-bound-account/erc6551-utils/ERC6551BytecodeLib.sol +20 -0
  327. package/contracts/prebuilts/account/token-bound-account/erc6551-utils/IERC6551Account.sol +51 -0
  328. package/contracts/prebuilts/account/token-paymaster/BasePaymaster.sol +151 -0
  329. package/contracts/prebuilts/account/token-paymaster/TokenPaymaster.sol +212 -0
  330. package/contracts/prebuilts/account/utils/AccountCore.sol +245 -0
  331. package/contracts/prebuilts/account/utils/AccountCoreStorage.sol +21 -0
  332. package/contracts/prebuilts/account/utils/AccountExtension.sol +172 -0
  333. package/contracts/prebuilts/account/utils/AccountSeaportBulkSigSupport.sol +40 -0
  334. package/contracts/prebuilts/account/utils/BaseAccount.sol +106 -0
  335. package/contracts/prebuilts/account/utils/BaseAccountFactory.sol +168 -0
  336. package/contracts/prebuilts/account/utils/EntryPoint.sol +725 -0
  337. package/contracts/prebuilts/account/utils/Exec.sol +56 -0
  338. package/contracts/prebuilts/account/utils/Helpers.sol +88 -0
  339. package/contracts/prebuilts/account/utils/NonceManager.sol +39 -0
  340. package/contracts/prebuilts/account/utils/OracleHelper.sol +154 -0
  341. package/contracts/prebuilts/account/utils/SenderCreator.sol +28 -0
  342. package/contracts/prebuilts/account/utils/StakeManager.sol +126 -0
  343. package/contracts/prebuilts/account/utils/TokenCallbackHandler.sol +55 -0
  344. package/contracts/prebuilts/account/utils/UniswapHelper.sol +119 -0
  345. package/contracts/prebuilts/account/utils/UserOperationLib.sol +127 -0
  346. package/contracts/prebuilts/airdrop/Airdrop.sol +616 -0
  347. package/contracts/prebuilts/drop/DropERC1155.sol +388 -0
  348. package/contracts/prebuilts/drop/DropERC20.sol +262 -0
  349. package/contracts/prebuilts/drop/DropERC721.sol +397 -0
  350. package/contracts/prebuilts/evolving-nfts/EvolvingNFT.sol +101 -0
  351. package/contracts/prebuilts/evolving-nfts/EvolvingNFTLogic.sol +251 -0
  352. package/contracts/prebuilts/evolving-nfts/extension/RulesEngineExtension.sol +26 -0
  353. package/contracts/prebuilts/interface/ILoyaltyCard.sol +27 -0
  354. package/contracts/prebuilts/interface/ILoyaltyPoints.sol +24 -0
  355. package/contracts/prebuilts/interface/IMultiwrap.sol +49 -0
  356. package/contracts/prebuilts/interface/IPack.sol +69 -0
  357. package/contracts/prebuilts/interface/IPackVRFDirect.sol +85 -0
  358. package/contracts/prebuilts/interface/airdrop/IAirdropERC1155.sol +45 -0
  359. package/contracts/prebuilts/interface/airdrop/IAirdropERC1155Claimable.sol +40 -0
  360. package/contracts/prebuilts/interface/airdrop/IAirdropERC20.sol +46 -0
  361. package/contracts/prebuilts/interface/airdrop/IAirdropERC20Claimable.sol +33 -0
  362. package/contracts/prebuilts/interface/airdrop/IAirdropERC721.sol +42 -0
  363. package/contracts/prebuilts/interface/airdrop/IAirdropERC721Claimable.sol +33 -0
  364. package/contracts/prebuilts/interface/drop/IDropClaimCondition.sol +82 -0
  365. package/contracts/prebuilts/interface/drop/IDropERC1155.sol +92 -0
  366. package/contracts/prebuilts/interface/drop/IDropERC20.sol +68 -0
  367. package/contracts/prebuilts/interface/drop/IDropERC721.sol +94 -0
  368. package/contracts/prebuilts/interface/marketplace/IMarketplace.sol +329 -0
  369. package/contracts/prebuilts/interface/staking/IEditionStake.sol +45 -0
  370. package/contracts/prebuilts/interface/staking/INFTStake.sol +45 -0
  371. package/contracts/prebuilts/interface/staking/ITokenStake.sol +46 -0
  372. package/contracts/prebuilts/interface/token/ITokenERC1155.sol +84 -0
  373. package/contracts/prebuilts/interface/token/ITokenERC20.sol +68 -0
  374. package/contracts/prebuilts/interface/token/ITokenERC721.sol +77 -0
  375. package/contracts/prebuilts/loyalty/LoyaltyCard.sol +339 -0
  376. package/contracts/prebuilts/marketplace/IMarketplace.sol +512 -0
  377. package/contracts/prebuilts/marketplace/direct-listings/DirectListingsLogic.sol +579 -0
  378. package/contracts/prebuilts/marketplace/direct-listings/DirectListingsStorage.sol +30 -0
  379. package/contracts/prebuilts/marketplace/english-auctions/EnglishAuctionsLogic.sol +546 -0
  380. package/contracts/prebuilts/marketplace/english-auctions/EnglishAuctionsStorage.sol +30 -0
  381. package/contracts/prebuilts/marketplace/entrypoint/MarketplaceV3.sol +184 -0
  382. package/contracts/prebuilts/marketplace/offers/OffersLogic.sol +358 -0
  383. package/contracts/prebuilts/marketplace/offers/OffersStorage.sol +28 -0
  384. package/contracts/prebuilts/marketplace-legacy/Marketplace.sol +907 -0
  385. package/contracts/prebuilts/multiwrap/Multiwrap.sol +264 -0
  386. package/contracts/prebuilts/open-edition/OpenEditionERC721.sol +268 -0
  387. package/contracts/prebuilts/open-edition/OpenEditionERC721FlatFee.sol +298 -0
  388. package/contracts/prebuilts/pack/Pack.sol +463 -0
  389. package/contracts/prebuilts/pack/PackVRFDirect.sol +516 -0
  390. package/contracts/prebuilts/signature-drop/SignatureDrop.sol +371 -0
  391. package/contracts/prebuilts/split/Split.sol +182 -0
  392. package/contracts/prebuilts/staking/EditionStake.sol +211 -0
  393. package/contracts/prebuilts/staking/NFTStake.sol +201 -0
  394. package/contracts/prebuilts/staking/TokenStake.sol +197 -0
  395. package/contracts/prebuilts/tiered-drop/TieredDrop.sol +607 -0
  396. package/contracts/prebuilts/token/TokenERC1155.sol +576 -0
  397. package/contracts/prebuilts/token/TokenERC20.sol +312 -0
  398. package/contracts/prebuilts/token/TokenERC721.sol +469 -0
  399. package/contracts/prebuilts/unaudited/airdrop/AirdropERC1155.sol +154 -0
  400. package/contracts/prebuilts/unaudited/airdrop/AirdropERC1155Claimable.sol +199 -0
  401. package/contracts/prebuilts/unaudited/airdrop/AirdropERC20.sol +194 -0
  402. package/contracts/prebuilts/unaudited/airdrop/AirdropERC20Claimable.sol +180 -0
  403. package/contracts/prebuilts/unaudited/airdrop/AirdropERC721.sol +143 -0
  404. package/contracts/prebuilts/unaudited/airdrop/AirdropERC721Claimable.sol +197 -0
  405. package/contracts/prebuilts/unaudited/burn-to-claim-drop/BurnToClaimDropERC721.sol +137 -0
  406. package/contracts/prebuilts/unaudited/burn-to-claim-drop/extension/BurnToClaimDrop721Logic.sol +362 -0
  407. package/contracts/prebuilts/unaudited/burn-to-claim-drop/extension/BurnToClaimDrop721Storage.sol +21 -0
  408. package/contracts/prebuilts/unaudited/contract-builder/CoreRouter.sol +60 -0
  409. package/contracts/prebuilts/unaudited/contract-builder/extension/PermissionOverride.sol +52 -0
  410. package/contracts/prebuilts/unaudited/loyalty/LoyaltyPoints.sol +249 -0
  411. package/contracts/prebuilts/vote/VoteERC20.sol +167 -0
  412. package/js/DropERC1155.d.ts +1198 -0
  413. package/js/DropERC1155.js +2 -0
  414. package/js/DropERC1155.js.map +1 -0
  415. package/js/DropERC721.d.ts +1247 -0
  416. package/js/DropERC721.js +2 -0
  417. package/js/DropERC721.js.map +1 -0
  418. package/js/OpenEditionERC721FlatFee.d.ts +1207 -0
  419. package/js/OpenEditionERC721FlatFee.js +2 -0
  420. package/js/OpenEditionERC721FlatFee.js.map +1 -0
  421. package/js/common.d.ts +22 -0
  422. package/js/common.js +2 -0
  423. package/js/common.js.map +1 -0
  424. package/js/factories/DropERC1155__factory.d.ts +1751 -0
  425. package/js/factories/DropERC1155__factory.js +2279 -0
  426. package/js/factories/DropERC1155__factory.js.map +1 -0
  427. package/js/factories/DropERC721__factory.d.ts +1826 -0
  428. package/js/factories/DropERC721__factory.js +2380 -0
  429. package/js/factories/DropERC721__factory.js.map +1 -0
  430. package/js/factories/OpenEditionERC721FlatFee__factory.d.ts +1707 -0
  431. package/js/factories/OpenEditionERC721FlatFee__factory.js +2219 -0
  432. package/js/factories/OpenEditionERC721FlatFee__factory.js.map +1 -0
  433. package/js/factories/index.d.ts +1 -0
  434. package/js/factories/index.js +5 -0
  435. package/js/factories/index.js.map +1 -0
  436. package/js/index.d.ts +3 -0
  437. package/js/index.js +3 -0
  438. package/js/index.js.map +1 -0
  439. package/package.json +74 -0
@@ -0,0 +1,463 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.11;
3
+
4
+ /// @author thirdweb
5
+
6
+ // $$\ $$\ $$\ $$\ $$\
7
+ // $$ | $$ | \__| $$ | $$ |
8
+ // $$$$$$\ $$$$$$$\ $$\ $$$$$$\ $$$$$$$ |$$\ $$\ $$\ $$$$$$\ $$$$$$$\
9
+ // \_$$ _| $$ __$$\ $$ |$$ __$$\ $$ __$$ |$$ | $$ | $$ |$$ __$$\ $$ __$$\
10
+ // $$ | $$ | $$ |$$ |$$ | \__|$$ / $$ |$$ | $$ | $$ |$$$$$$$$ |$$ | $$ |
11
+ // $$ |$$\ $$ | $$ |$$ |$$ | $$ | $$ |$$ | $$ | $$ |$$ ____|$$ | $$ |
12
+ // \$$$$ |$$ | $$ |$$ |$$ | \$$$$$$$ |\$$$$$\$$$$ |\$$$$$$$\ $$$$$$$ |
13
+ // \____/ \__| \__|\__|\__| \_______| \_____\____/ \_______|\_______/
14
+
15
+ // ========== External imports ==========
16
+
17
+ import "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155PausableUpgradeable.sol";
18
+
19
+ import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
20
+ import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol";
21
+ import "@openzeppelin/contracts-upgradeable/interfaces/IERC2981Upgradeable.sol";
22
+ import "@openzeppelin/contracts/interfaces/IERC721Receiver.sol";
23
+ import { IERC1155Receiver } from "@openzeppelin/contracts/interfaces/IERC1155Receiver.sol";
24
+
25
+ // ========== Internal imports ==========
26
+
27
+ import "../interface/IPack.sol";
28
+ import "../../extension/Multicall.sol";
29
+ import "../../external-deps/openzeppelin/metatx/ERC2771ContextUpgradeable.sol";
30
+
31
+ // ========== Features ==========
32
+
33
+ import "../../extension/ContractMetadata.sol";
34
+ import "../../extension/Royalty.sol";
35
+ import "../../extension/Ownable.sol";
36
+ import "../../extension/PermissionsEnumerable.sol";
37
+ import { TokenStore, ERC1155Receiver } from "../../extension/TokenStore.sol";
38
+
39
+ contract Pack is
40
+ Initializable,
41
+ ContractMetadata,
42
+ Ownable,
43
+ Royalty,
44
+ PermissionsEnumerable,
45
+ TokenStore,
46
+ ReentrancyGuardUpgradeable,
47
+ ERC2771ContextUpgradeable,
48
+ Multicall,
49
+ ERC1155Upgradeable,
50
+ IPack
51
+ {
52
+ /*///////////////////////////////////////////////////////////////
53
+ State variables
54
+ //////////////////////////////////////////////////////////////*/
55
+
56
+ bytes32 private constant MODULE_TYPE = bytes32("Pack");
57
+ uint256 private constant VERSION = 2;
58
+
59
+ /// @dev Only transfers to or from TRANSFER_ROLE holders are valid, when transfers are restricted.
60
+ bytes32 private constant TRANSFER_ROLE = keccak256("TRANSFER_ROLE");
61
+ /// @dev Only MINTER_ROLE holders can create packs.
62
+ bytes32 private constant MINTER_ROLE = keccak256("MINTER_ROLE");
63
+ /// @dev Only assets with ASSET_ROLE can be packed, when packing is restricted to particular assets.
64
+ bytes32 private constant ASSET_ROLE = keccak256("ASSET_ROLE");
65
+
66
+ // Token name
67
+ string public name;
68
+
69
+ // Token symbol
70
+ string public symbol;
71
+
72
+ /// @dev The token Id of the next set of packs to be minted.
73
+ uint256 public nextTokenIdToMint;
74
+
75
+ /*///////////////////////////////////////////////////////////////
76
+ Mappings
77
+ //////////////////////////////////////////////////////////////*/
78
+
79
+ /// @dev Mapping from token ID => total circulating supply of token with that ID.
80
+ mapping(uint256 => uint256) public totalSupply;
81
+
82
+ /// @dev Mapping from pack ID => The state of that set of packs.
83
+ mapping(uint256 => PackInfo) private packInfo;
84
+
85
+ /// @dev Checks if pack-creator allowed to add more tokens to a packId; set to false after first transfer
86
+ mapping(uint256 => bool) public canUpdatePack;
87
+
88
+ /*///////////////////////////////////////////////////////////////
89
+ Constructor + initializer logic
90
+ //////////////////////////////////////////////////////////////*/
91
+
92
+ constructor(address _nativeTokenWrapper) TokenStore(_nativeTokenWrapper) initializer {}
93
+
94
+ /// @dev Initializes the contract, like a constructor.
95
+ /* solhint-disable no-unused-vars */
96
+ function initialize(
97
+ address _defaultAdmin,
98
+ string memory _name,
99
+ string memory _symbol,
100
+ string memory _contractURI,
101
+ address[] memory _trustedForwarders,
102
+ address _royaltyRecipient,
103
+ uint256 _royaltyBps
104
+ ) external initializer {
105
+ __ERC1155_init(_contractURI);
106
+
107
+ name = _name;
108
+ symbol = _symbol;
109
+
110
+ _setupContractURI(_contractURI);
111
+ _setupOwner(_defaultAdmin);
112
+ _setupRole(DEFAULT_ADMIN_ROLE, _defaultAdmin);
113
+ _setupRole(MINTER_ROLE, _defaultAdmin);
114
+
115
+ // note: see `onlyRoleWithSwitch` for ASSET_ROLE behaviour.
116
+ _setupRole(ASSET_ROLE, address(0));
117
+ _setupRole(TRANSFER_ROLE, address(0));
118
+
119
+ _setupDefaultRoyaltyInfo(_royaltyRecipient, _royaltyBps);
120
+ }
121
+
122
+ /* solhint-enable no-unused-vars */
123
+
124
+ receive() external payable {
125
+ require(msg.sender == nativeTokenWrapper, "!nativeTokenWrapper.");
126
+ }
127
+
128
+ /*///////////////////////////////////////////////////////////////
129
+ Modifiers
130
+ //////////////////////////////////////////////////////////////*/
131
+
132
+ modifier onlyRoleWithSwitch(bytes32 role) {
133
+ _checkRoleWithSwitch(role, _msgSender());
134
+ _;
135
+ }
136
+
137
+ /*///////////////////////////////////////////////////////////////
138
+ Generic contract logic
139
+ //////////////////////////////////////////////////////////////*/
140
+
141
+ /// @dev Returns the type of the contract.
142
+ function contractType() external pure returns (bytes32) {
143
+ return MODULE_TYPE;
144
+ }
145
+
146
+ /// @dev Returns the version of the contract.
147
+ function contractVersion() external pure returns (uint8) {
148
+ return uint8(VERSION);
149
+ }
150
+
151
+ /*///////////////////////////////////////////////////////////////
152
+ ERC 165 / 1155 / 2981 logic
153
+ //////////////////////////////////////////////////////////////*/
154
+
155
+ /// @dev Returns the URI for a given tokenId.
156
+ function uri(uint256 _tokenId) public view override returns (string memory) {
157
+ return getUriOfBundle(_tokenId);
158
+ }
159
+
160
+ /// @dev See ERC 165
161
+ function supportsInterface(
162
+ bytes4 interfaceId
163
+ ) public view virtual override(ERC1155Receiver, ERC1155Upgradeable, IERC165) returns (bool) {
164
+ return
165
+ super.supportsInterface(interfaceId) ||
166
+ type(IERC2981Upgradeable).interfaceId == interfaceId ||
167
+ type(IERC721Receiver).interfaceId == interfaceId ||
168
+ type(IERC1155Receiver).interfaceId == interfaceId;
169
+ }
170
+
171
+ /*///////////////////////////////////////////////////////////////
172
+ Pack logic: create | open packs.
173
+ //////////////////////////////////////////////////////////////*/
174
+
175
+ /// @dev Creates a pack with the stated contents.
176
+ function createPack(
177
+ Token[] calldata _contents,
178
+ uint256[] calldata _numOfRewardUnits,
179
+ string memory _packUri,
180
+ uint128 _openStartTimestamp,
181
+ uint128 _amountDistributedPerOpen,
182
+ address _recipient
183
+ ) external payable onlyRoleWithSwitch(MINTER_ROLE) nonReentrant returns (uint256 packId, uint256 packTotalSupply) {
184
+ require(_contents.length > 0 && _contents.length == _numOfRewardUnits.length, "!Len");
185
+
186
+ if (!hasRole(ASSET_ROLE, address(0))) {
187
+ for (uint256 i = 0; i < _contents.length; i += 1) {
188
+ _checkRole(ASSET_ROLE, _contents[i].assetContract);
189
+ }
190
+ }
191
+
192
+ packId = nextTokenIdToMint;
193
+ nextTokenIdToMint += 1;
194
+
195
+ packTotalSupply = escrowPackContents(
196
+ _contents,
197
+ _numOfRewardUnits,
198
+ _packUri,
199
+ packId,
200
+ _amountDistributedPerOpen,
201
+ false
202
+ );
203
+
204
+ packInfo[packId].openStartTimestamp = _openStartTimestamp;
205
+ packInfo[packId].amountDistributedPerOpen = _amountDistributedPerOpen;
206
+
207
+ canUpdatePack[packId] = true;
208
+
209
+ _mint(_recipient, packId, packTotalSupply, "");
210
+
211
+ emit PackCreated(packId, _recipient, packTotalSupply);
212
+ }
213
+
214
+ /// @dev Add contents to an existing packId.
215
+ function addPackContents(
216
+ uint256 _packId,
217
+ Token[] calldata _contents,
218
+ uint256[] calldata _numOfRewardUnits,
219
+ address _recipient
220
+ )
221
+ external
222
+ payable
223
+ onlyRoleWithSwitch(MINTER_ROLE)
224
+ nonReentrant
225
+ returns (uint256 packTotalSupply, uint256 newSupplyAdded)
226
+ {
227
+ require(canUpdatePack[_packId], "!Allowed");
228
+ require(_contents.length > 0 && _contents.length == _numOfRewardUnits.length, "!Len");
229
+ require(balanceOf(_recipient, _packId) != 0, "!Bal");
230
+
231
+ if (!hasRole(ASSET_ROLE, address(0))) {
232
+ for (uint256 i = 0; i < _contents.length; i += 1) {
233
+ _checkRole(ASSET_ROLE, _contents[i].assetContract);
234
+ }
235
+ }
236
+
237
+ uint256 amountPerOpen = packInfo[_packId].amountDistributedPerOpen;
238
+
239
+ newSupplyAdded = escrowPackContents(_contents, _numOfRewardUnits, "", _packId, amountPerOpen, true);
240
+ packTotalSupply = totalSupply[_packId] + newSupplyAdded;
241
+
242
+ _mint(_recipient, _packId, newSupplyAdded, "");
243
+
244
+ emit PackUpdated(_packId, _recipient, newSupplyAdded);
245
+ }
246
+
247
+ /// @notice Lets a pack owner open packs and receive the packs' reward units.
248
+ function openPack(uint256 _packId, uint256 _amountToOpen) external nonReentrant returns (Token[] memory) {
249
+ address opener = _msgSender();
250
+
251
+ require(opener == tx.origin, "!EOA");
252
+ require(balanceOf(opener, _packId) >= _amountToOpen, "!Bal");
253
+
254
+ PackInfo memory pack = packInfo[_packId];
255
+ require(pack.openStartTimestamp <= block.timestamp, "cant open");
256
+
257
+ Token[] memory rewardUnits = getRewardUnits(_packId, _amountToOpen, pack.amountDistributedPerOpen, pack);
258
+
259
+ _burn(opener, _packId, _amountToOpen);
260
+
261
+ _transferTokenBatch(address(this), opener, rewardUnits);
262
+
263
+ emit PackOpened(_packId, opener, _amountToOpen, rewardUnits);
264
+
265
+ return rewardUnits;
266
+ }
267
+
268
+ /// @dev Stores assets within the contract.
269
+ function escrowPackContents(
270
+ Token[] calldata _contents,
271
+ uint256[] calldata _numOfRewardUnits,
272
+ string memory _packUri,
273
+ uint256 packId,
274
+ uint256 amountPerOpen,
275
+ bool isUpdate
276
+ ) internal returns (uint256 supplyToMint) {
277
+ uint256 sumOfRewardUnits;
278
+
279
+ for (uint256 i = 0; i < _contents.length; i += 1) {
280
+ require(_contents[i].totalAmount != 0, "0 amt");
281
+ require(_contents[i].totalAmount % _numOfRewardUnits[i] == 0, "!R");
282
+ require(_contents[i].tokenType != TokenType.ERC721 || _contents[i].totalAmount == 1, "!R");
283
+
284
+ sumOfRewardUnits += _numOfRewardUnits[i];
285
+
286
+ packInfo[packId].perUnitAmounts.push(_contents[i].totalAmount / _numOfRewardUnits[i]);
287
+ }
288
+
289
+ require(sumOfRewardUnits % amountPerOpen == 0, "!Amt");
290
+ supplyToMint = sumOfRewardUnits / amountPerOpen;
291
+
292
+ if (isUpdate) {
293
+ for (uint256 i = 0; i < _contents.length; i += 1) {
294
+ _addTokenInBundle(_contents[i], packId);
295
+ }
296
+ _transferTokenBatch(_msgSender(), address(this), _contents);
297
+ } else {
298
+ _storeTokens(_msgSender(), _contents, _packUri, packId);
299
+ }
300
+ }
301
+
302
+ /// @dev Returns the reward units to distribute.
303
+ function getRewardUnits(
304
+ uint256 _packId,
305
+ uint256 _numOfPacksToOpen,
306
+ uint256 _rewardUnitsPerOpen,
307
+ PackInfo memory pack
308
+ ) internal returns (Token[] memory rewardUnits) {
309
+ uint256 numOfRewardUnitsToDistribute = _numOfPacksToOpen * _rewardUnitsPerOpen;
310
+ rewardUnits = new Token[](numOfRewardUnitsToDistribute);
311
+ uint256 totalRewardUnits = totalSupply[_packId] * _rewardUnitsPerOpen;
312
+ uint256 totalRewardKinds = getTokenCountOfBundle(_packId);
313
+
314
+ uint256 random = generateRandomValue();
315
+
316
+ (Token[] memory _token, ) = getPackContents(_packId);
317
+ bool[] memory _isUpdated = new bool[](totalRewardKinds);
318
+ for (uint256 i; i < numOfRewardUnitsToDistribute; ) {
319
+ uint256 randomVal = uint256(keccak256(abi.encode(random, i)));
320
+ uint256 target = randomVal % totalRewardUnits;
321
+ uint256 step;
322
+ for (uint256 j; j < totalRewardKinds; ) {
323
+ uint256 perUnitAmount = pack.perUnitAmounts[j];
324
+ uint256 totalRewardUnitsOfKind = _token[j].totalAmount / perUnitAmount;
325
+ if (target < step + totalRewardUnitsOfKind) {
326
+ _token[j].totalAmount -= perUnitAmount;
327
+ _isUpdated[j] = true;
328
+ rewardUnits[i].assetContract = _token[j].assetContract;
329
+ rewardUnits[i].tokenType = _token[j].tokenType;
330
+ rewardUnits[i].tokenId = _token[j].tokenId;
331
+ rewardUnits[i].totalAmount = perUnitAmount;
332
+ totalRewardUnits -= 1;
333
+ break;
334
+ } else {
335
+ step += totalRewardUnitsOfKind;
336
+ }
337
+ unchecked {
338
+ ++j;
339
+ }
340
+ }
341
+ unchecked {
342
+ ++i;
343
+ }
344
+ }
345
+ for (uint256 i; i < totalRewardKinds; ) {
346
+ if (_isUpdated[i]) {
347
+ _updateTokenInBundle(_token[i], _packId, i);
348
+ }
349
+ unchecked {
350
+ ++i;
351
+ }
352
+ }
353
+ }
354
+
355
+ /*///////////////////////////////////////////////////////////////
356
+ Getter functions
357
+ //////////////////////////////////////////////////////////////*/
358
+
359
+ /// @dev Returns the underlying contents of a pack.
360
+ function getPackContents(
361
+ uint256 _packId
362
+ ) public view returns (Token[] memory contents, uint256[] memory perUnitAmounts) {
363
+ PackInfo memory pack = packInfo[_packId];
364
+ uint256 total = getTokenCountOfBundle(_packId);
365
+ contents = new Token[](total);
366
+ perUnitAmounts = new uint256[](total);
367
+
368
+ for (uint256 i; i < total; ) {
369
+ contents[i] = getTokenOfBundle(_packId, i);
370
+ unchecked {
371
+ ++i;
372
+ }
373
+ }
374
+ perUnitAmounts = pack.perUnitAmounts;
375
+ }
376
+
377
+ /*///////////////////////////////////////////////////////////////
378
+ Internal functions
379
+ //////////////////////////////////////////////////////////////*/
380
+
381
+ /// @dev Returns whether owner can be set in the given execution context.
382
+ function _canSetOwner() internal view override returns (bool) {
383
+ return hasRole(DEFAULT_ADMIN_ROLE, _msgSender());
384
+ }
385
+
386
+ /// @dev Returns whether royalty info can be set in the given execution context.
387
+ function _canSetRoyaltyInfo() internal view override returns (bool) {
388
+ return hasRole(DEFAULT_ADMIN_ROLE, _msgSender());
389
+ }
390
+
391
+ /// @dev Returns whether contract metadata can be set in the given execution context.
392
+ function _canSetContractURI() internal view override returns (bool) {
393
+ return hasRole(DEFAULT_ADMIN_ROLE, _msgSender());
394
+ }
395
+
396
+ /*///////////////////////////////////////////////////////////////
397
+ Miscellaneous
398
+ //////////////////////////////////////////////////////////////*/
399
+
400
+ function generateRandomValue() internal view returns (uint256 random) {
401
+ random = uint256(keccak256(abi.encodePacked(_msgSender(), blockhash(block.number - 1), block.difficulty)));
402
+ }
403
+
404
+ /**
405
+ * @dev See {ERC1155-_beforeTokenTransfer}.
406
+ */
407
+ function _beforeTokenTransfer(
408
+ address operator,
409
+ address from,
410
+ address to,
411
+ uint256[] memory ids,
412
+ uint256[] memory amounts,
413
+ bytes memory data
414
+ ) internal virtual override {
415
+ super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
416
+
417
+ // if transfer is restricted on the contract, we still want to allow burning and minting
418
+ if (!hasRole(TRANSFER_ROLE, address(0)) && from != address(0) && to != address(0)) {
419
+ require(hasRole(TRANSFER_ROLE, from) || hasRole(TRANSFER_ROLE, to), "!TRANSFER_ROLE");
420
+ }
421
+
422
+ if (from == address(0)) {
423
+ for (uint256 i = 0; i < ids.length; ++i) {
424
+ totalSupply[ids[i]] += amounts[i];
425
+ }
426
+ } else {
427
+ for (uint256 i = 0; i < ids.length; ++i) {
428
+ // pack can no longer be updated after first transfer to non-zero address
429
+ if (canUpdatePack[ids[i]] && amounts[i] != 0) {
430
+ canUpdatePack[ids[i]] = false;
431
+ }
432
+ }
433
+ }
434
+
435
+ if (to == address(0)) {
436
+ for (uint256 i = 0; i < ids.length; ++i) {
437
+ totalSupply[ids[i]] -= amounts[i];
438
+ }
439
+ }
440
+ }
441
+
442
+ /// @dev See EIP-2771
443
+ function _msgSender()
444
+ internal
445
+ view
446
+ virtual
447
+ override(ContextUpgradeable, ERC2771ContextUpgradeable, Multicall)
448
+ returns (address sender)
449
+ {
450
+ return ERC2771ContextUpgradeable._msgSender();
451
+ }
452
+
453
+ /// @dev See EIP-2771
454
+ function _msgData()
455
+ internal
456
+ view
457
+ virtual
458
+ override(ContextUpgradeable, ERC2771ContextUpgradeable)
459
+ returns (bytes calldata)
460
+ {
461
+ return ERC2771ContextUpgradeable._msgData();
462
+ }
463
+ }