@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,516 @@
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
+ import "../../external-deps/chainlink/VRFV2WrapperConsumerBase.sol";
26
+
27
+ // ========== Internal imports ==========
28
+
29
+ import "../interface/IPackVRFDirect.sol";
30
+ import "../../extension/Multicall.sol";
31
+ import "../../external-deps/openzeppelin/metatx/ERC2771ContextUpgradeable.sol";
32
+
33
+ // ========== Features ==========
34
+
35
+ import "../../extension/ContractMetadata.sol";
36
+ import "../../extension/Royalty.sol";
37
+ import "../../extension/Ownable.sol";
38
+ import "../../extension/PermissionsEnumerable.sol";
39
+ import { TokenStore, ERC1155Receiver } from "../../extension/TokenStore.sol";
40
+
41
+ /**
42
+ NOTE: This contract is a work in progress.
43
+ */
44
+
45
+ contract PackVRFDirect is
46
+ Initializable,
47
+ VRFV2WrapperConsumerBase,
48
+ ContractMetadata,
49
+ Ownable,
50
+ Royalty,
51
+ Permissions,
52
+ TokenStore,
53
+ ReentrancyGuardUpgradeable,
54
+ ERC2771ContextUpgradeable,
55
+ Multicall,
56
+ ERC1155Upgradeable,
57
+ IPackVRFDirect
58
+ {
59
+ /*///////////////////////////////////////////////////////////////
60
+ State variables
61
+ //////////////////////////////////////////////////////////////*/
62
+
63
+ bytes32 private constant MODULE_TYPE = bytes32("PackVRFDirect");
64
+ uint256 private constant VERSION = 2;
65
+
66
+ address private immutable forwarder;
67
+
68
+ // Token name
69
+ string public name;
70
+
71
+ // Token symbol
72
+ string public symbol;
73
+
74
+ /// @dev Only MINTER_ROLE holders can create packs.
75
+ bytes32 private minterRole;
76
+
77
+ /// @dev The token Id of the next set of packs to be minted.
78
+ uint256 public nextTokenIdToMint;
79
+
80
+ /*///////////////////////////////////////////////////////////////
81
+ Mappings
82
+ //////////////////////////////////////////////////////////////*/
83
+
84
+ /// @dev Mapping from token ID => total circulating supply of token with that ID.
85
+ mapping(uint256 => uint256) public totalSupply;
86
+
87
+ /// @dev Mapping from pack ID => The state of that set of packs.
88
+ mapping(uint256 => PackInfo) private packInfo;
89
+
90
+ /*///////////////////////////////////////////////////////////////
91
+ VRF state
92
+ //////////////////////////////////////////////////////////////*/
93
+
94
+ uint32 private constant CALLBACKGASLIMIT = 100_000;
95
+ uint16 private constant REQUEST_CONFIRMATIONS = 3;
96
+ uint32 private constant NUMWORDS = 1;
97
+
98
+ struct RequestInfo {
99
+ uint256 packId;
100
+ address opener;
101
+ uint256 amountToOpen;
102
+ uint256[] randomWords;
103
+ bool openOnFulfillRandomness;
104
+ }
105
+
106
+ mapping(uint256 => RequestInfo) private requestInfo;
107
+ mapping(address => uint256) private openerToReqId;
108
+
109
+ /*///////////////////////////////////////////////////////////////
110
+ Constructor + initializer logic
111
+ //////////////////////////////////////////////////////////////*/
112
+
113
+ constructor(
114
+ address _nativeTokenWrapper,
115
+ address _trustedForwarder,
116
+ address _linkTokenAddress,
117
+ address _vrfV2Wrapper
118
+ ) VRFV2WrapperConsumerBase(_linkTokenAddress, _vrfV2Wrapper) TokenStore(_nativeTokenWrapper) initializer {
119
+ forwarder = _trustedForwarder;
120
+ }
121
+
122
+ /// @dev Initializes the contract, like a constructor.
123
+ function initialize(
124
+ address _defaultAdmin,
125
+ string memory _name,
126
+ string memory _symbol,
127
+ string memory _contractURI,
128
+ address[] memory _trustedForwarders,
129
+ address _royaltyRecipient,
130
+ uint256 _royaltyBps
131
+ ) external initializer {
132
+ bytes32 _minterRole = keccak256("MINTER_ROLE");
133
+
134
+ /** note: The immutable state-variable `forwarder` is an EOA-only forwarder,
135
+ * which guards against automated attacks.
136
+ *
137
+ * Use other forwarders only if there's a strong reason to bypass this check.
138
+ */
139
+ address[] memory forwarders = new address[](_trustedForwarders.length + 1);
140
+ uint256 i;
141
+ for (; i < _trustedForwarders.length; i++) {
142
+ forwarders[i] = _trustedForwarders[i];
143
+ }
144
+ forwarders[i] = forwarder;
145
+ __ERC2771Context_init(forwarders);
146
+ __ERC1155_init(_contractURI);
147
+
148
+ name = _name;
149
+ symbol = _symbol;
150
+
151
+ _setupContractURI(_contractURI);
152
+ _setupOwner(_defaultAdmin);
153
+ _setupRole(DEFAULT_ADMIN_ROLE, _defaultAdmin);
154
+ _setupRole(_minterRole, _defaultAdmin);
155
+
156
+ _setupDefaultRoyaltyInfo(_royaltyRecipient, _royaltyBps);
157
+
158
+ minterRole = _minterRole;
159
+ }
160
+
161
+ receive() external payable {
162
+ require(msg.sender == nativeTokenWrapper, "!nativeTokenWrapper.");
163
+ }
164
+
165
+ /*///////////////////////////////////////////////////////////////
166
+ Generic contract logic
167
+ //////////////////////////////////////////////////////////////*/
168
+
169
+ /// @dev Returns the type of the contract.
170
+ function contractType() external pure returns (bytes32) {
171
+ return MODULE_TYPE;
172
+ }
173
+
174
+ /// @dev Returns the version of the contract.
175
+ function contractVersion() external pure returns (uint8) {
176
+ return uint8(VERSION);
177
+ }
178
+
179
+ /*///////////////////////////////////////////////////////////////
180
+ ERC 165 / 1155 / 2981 logic
181
+ //////////////////////////////////////////////////////////////*/
182
+
183
+ /// @dev Returns the URI for a given tokenId.
184
+ function uri(uint256 _tokenId) public view override returns (string memory) {
185
+ return getUriOfBundle(_tokenId);
186
+ }
187
+
188
+ /// @dev See ERC 165
189
+ function supportsInterface(
190
+ bytes4 interfaceId
191
+ ) public view virtual override(ERC1155Receiver, ERC1155Upgradeable, IERC165) returns (bool) {
192
+ return
193
+ super.supportsInterface(interfaceId) ||
194
+ type(IERC2981Upgradeable).interfaceId == interfaceId ||
195
+ type(IERC721Receiver).interfaceId == interfaceId ||
196
+ type(IERC1155Receiver).interfaceId == interfaceId;
197
+ }
198
+
199
+ /*///////////////////////////////////////////////////////////////
200
+ Pack logic: create | open packs.
201
+ //////////////////////////////////////////////////////////////*/
202
+
203
+ /// @dev Creates a pack with the stated contents.
204
+ function createPack(
205
+ Token[] calldata _contents,
206
+ uint256[] calldata _numOfRewardUnits,
207
+ string memory _packUri,
208
+ uint128 _openStartTimestamp,
209
+ uint128 _amountDistributedPerOpen,
210
+ address _recipient
211
+ ) external payable onlyRole(minterRole) nonReentrant returns (uint256 packId, uint256 packTotalSupply) {
212
+ require(_contents.length > 0 && _contents.length == _numOfRewardUnits.length, "!Len");
213
+
214
+ packId = nextTokenIdToMint;
215
+ nextTokenIdToMint += 1;
216
+
217
+ packTotalSupply = escrowPackContents(
218
+ _contents,
219
+ _numOfRewardUnits,
220
+ _packUri,
221
+ packId,
222
+ _amountDistributedPerOpen,
223
+ false
224
+ );
225
+
226
+ packInfo[packId].openStartTimestamp = _openStartTimestamp;
227
+ packInfo[packId].amountDistributedPerOpen = _amountDistributedPerOpen;
228
+
229
+ // canUpdatePack[packId] = true;
230
+
231
+ _mint(_recipient, packId, packTotalSupply, "");
232
+
233
+ emit PackCreated(packId, _recipient, packTotalSupply);
234
+ }
235
+
236
+ /*///////////////////////////////////////////////////////////////
237
+ VRF logic
238
+ //////////////////////////////////////////////////////////////*/
239
+
240
+ function openPackAndClaimRewards(
241
+ uint256 _packId,
242
+ uint256 _amountToOpen,
243
+ uint32 _callBackGasLimit
244
+ ) external returns (uint256) {
245
+ return _requestOpenPack(_packId, _amountToOpen, _callBackGasLimit, true);
246
+ }
247
+
248
+ /// @notice Lets a pack owner open packs and receive the packs' reward units.
249
+ function openPack(uint256 _packId, uint256 _amountToOpen) external returns (uint256) {
250
+ return _requestOpenPack(_packId, _amountToOpen, CALLBACKGASLIMIT, false);
251
+ }
252
+
253
+ function _requestOpenPack(
254
+ uint256 _packId,
255
+ uint256 _amountToOpen,
256
+ uint32 _callBackGasLimit,
257
+ bool _openOnFulfill
258
+ ) internal returns (uint256 requestId) {
259
+ address opener = _msgSender();
260
+
261
+ require(isTrustedForwarder(msg.sender) || opener == tx.origin, "!EOA");
262
+
263
+ require(openerToReqId[opener] == 0, "ReqInFlight");
264
+
265
+ require(_amountToOpen > 0 && balanceOf(opener, _packId) >= _amountToOpen, "!Bal");
266
+ require(packInfo[_packId].openStartTimestamp <= block.timestamp, "!Open");
267
+
268
+ // Transfer packs into the contract.
269
+ _safeTransferFrom(opener, address(this), _packId, _amountToOpen, "");
270
+
271
+ // Request VRF for randomness.
272
+ requestId = requestRandomness(_callBackGasLimit, REQUEST_CONFIRMATIONS, NUMWORDS);
273
+ require(requestId > 0, "!VRF");
274
+
275
+ // Mark request as active; store request parameters.
276
+ requestInfo[requestId].packId = _packId;
277
+ requestInfo[requestId].opener = opener;
278
+ requestInfo[requestId].amountToOpen = _amountToOpen;
279
+ requestInfo[requestId].openOnFulfillRandomness = _openOnFulfill;
280
+ openerToReqId[opener] = requestId;
281
+
282
+ emit PackOpenRequested(opener, _packId, _amountToOpen, requestId);
283
+ }
284
+
285
+ /// @notice Called by Chainlink VRF to fulfill a random number request.
286
+ function fulfillRandomWords(uint256 _requestId, uint256[] memory _randomWords) internal override {
287
+ RequestInfo memory info = requestInfo[_requestId];
288
+
289
+ require(info.randomWords.length == 0, "!Req");
290
+ requestInfo[_requestId].randomWords = _randomWords;
291
+
292
+ emit PackRandomnessFulfilled(info.packId, _requestId);
293
+
294
+ if (info.openOnFulfillRandomness) {
295
+ try PackVRFDirect(payable(address(this))).sendRewardsIndirect(info.opener) {} catch {}
296
+ }
297
+ }
298
+
299
+ /// @notice Returns whether a pack opener is ready to call `claimRewards`.
300
+ function canClaimRewards(address _opener) public view returns (bool) {
301
+ uint256 requestId = openerToReqId[_opener];
302
+ return requestId > 0 && requestInfo[requestId].randomWords.length > 0;
303
+ }
304
+
305
+ /// @notice Lets a pack owner open packs and receive the packs' reward units.
306
+ function claimRewards() external returns (Token[] memory) {
307
+ return _claimRewards(_msgSender());
308
+ }
309
+
310
+ /// @notice Lets a pack owner open packs and receive the packs' reward units.
311
+ function sendRewardsIndirect(address _opener) external {
312
+ require(msg.sender == address(this));
313
+ _claimRewards(_opener);
314
+ }
315
+
316
+ function _claimRewards(address opener) internal returns (Token[] memory) {
317
+ require(isTrustedForwarder(msg.sender) || msg.sender == address(this) || opener == tx.origin, "!EOA");
318
+ require(canClaimRewards(opener), "!ActiveReq");
319
+ uint256 reqId = openerToReqId[opener];
320
+ RequestInfo memory info = requestInfo[reqId];
321
+
322
+ delete openerToReqId[opener];
323
+ delete requestInfo[reqId];
324
+
325
+ PackInfo memory pack = packInfo[info.packId];
326
+
327
+ Token[] memory rewardUnits = getRewardUnits(
328
+ info.randomWords[0],
329
+ info.packId,
330
+ info.amountToOpen,
331
+ pack.amountDistributedPerOpen,
332
+ pack
333
+ );
334
+
335
+ // Burn packs.
336
+ _burn(address(this), info.packId, info.amountToOpen);
337
+
338
+ _transferTokenBatch(address(this), opener, rewardUnits);
339
+
340
+ emit PackOpened(info.packId, opener, info.amountToOpen, rewardUnits);
341
+
342
+ return rewardUnits;
343
+ }
344
+
345
+ /// @dev Stores assets within the contract.
346
+ function escrowPackContents(
347
+ Token[] calldata _contents,
348
+ uint256[] calldata _numOfRewardUnits,
349
+ string memory _packUri,
350
+ uint256 packId,
351
+ uint256 amountPerOpen,
352
+ bool isUpdate
353
+ ) internal returns (uint256 supplyToMint) {
354
+ uint256 sumOfRewardUnits;
355
+
356
+ for (uint256 i = 0; i < _contents.length; i += 1) {
357
+ require(_contents[i].totalAmount != 0, "0 amt");
358
+ require(_contents[i].totalAmount % _numOfRewardUnits[i] == 0, "!R");
359
+ require(_contents[i].tokenType != TokenType.ERC721 || _contents[i].totalAmount == 1, "!R");
360
+
361
+ sumOfRewardUnits += _numOfRewardUnits[i];
362
+
363
+ packInfo[packId].perUnitAmounts.push(_contents[i].totalAmount / _numOfRewardUnits[i]);
364
+ }
365
+
366
+ require(sumOfRewardUnits % amountPerOpen == 0, "!Amt");
367
+ supplyToMint = sumOfRewardUnits / amountPerOpen;
368
+
369
+ if (isUpdate) {
370
+ for (uint256 i = 0; i < _contents.length; i += 1) {
371
+ _addTokenInBundle(_contents[i], packId);
372
+ }
373
+ _transferTokenBatch(_msgSender(), address(this), _contents);
374
+ } else {
375
+ _storeTokens(_msgSender(), _contents, _packUri, packId);
376
+ }
377
+ }
378
+
379
+ /// @dev Returns the reward units to distribute.
380
+ function getRewardUnits(
381
+ uint256 _random,
382
+ uint256 _packId,
383
+ uint256 _numOfPacksToOpen,
384
+ uint256 _rewardUnitsPerOpen,
385
+ PackInfo memory pack
386
+ ) internal returns (Token[] memory rewardUnits) {
387
+ uint256 numOfRewardUnitsToDistribute = _numOfPacksToOpen * _rewardUnitsPerOpen;
388
+ rewardUnits = new Token[](numOfRewardUnitsToDistribute);
389
+ uint256 totalRewardUnits = totalSupply[_packId] * _rewardUnitsPerOpen;
390
+ uint256 totalRewardKinds = getTokenCountOfBundle(_packId);
391
+
392
+ (Token[] memory _token, ) = getPackContents(_packId);
393
+ bool[] memory _isUpdated = new bool[](totalRewardKinds);
394
+ for (uint256 i = 0; i < numOfRewardUnitsToDistribute; i += 1) {
395
+ uint256 randomVal = uint256(keccak256(abi.encode(_random, i)));
396
+ uint256 target = randomVal % totalRewardUnits;
397
+ uint256 step;
398
+
399
+ for (uint256 j = 0; j < totalRewardKinds; j += 1) {
400
+ uint256 totalRewardUnitsOfKind = _token[j].totalAmount / pack.perUnitAmounts[j];
401
+
402
+ if (target < step + totalRewardUnitsOfKind) {
403
+ _token[j].totalAmount -= pack.perUnitAmounts[j];
404
+ _isUpdated[j] = true;
405
+
406
+ rewardUnits[i].assetContract = _token[j].assetContract;
407
+ rewardUnits[i].tokenType = _token[j].tokenType;
408
+ rewardUnits[i].tokenId = _token[j].tokenId;
409
+ rewardUnits[i].totalAmount = pack.perUnitAmounts[j];
410
+
411
+ totalRewardUnits -= 1;
412
+
413
+ break;
414
+ } else {
415
+ step += totalRewardUnitsOfKind;
416
+ }
417
+ }
418
+ }
419
+
420
+ for (uint256 i = 0; i < totalRewardKinds; i += 1) {
421
+ if (_isUpdated[i]) {
422
+ _updateTokenInBundle(_token[i], _packId, i);
423
+ }
424
+ }
425
+ }
426
+
427
+ /*///////////////////////////////////////////////////////////////
428
+ Getter functions
429
+ //////////////////////////////////////////////////////////////*/
430
+
431
+ /// @dev Returns the underlying contents of a pack.
432
+ function getPackContents(
433
+ uint256 _packId
434
+ ) public view returns (Token[] memory contents, uint256[] memory perUnitAmounts) {
435
+ PackInfo memory pack = packInfo[_packId];
436
+ uint256 total = getTokenCountOfBundle(_packId);
437
+ contents = new Token[](total);
438
+ perUnitAmounts = new uint256[](total);
439
+
440
+ for (uint256 i = 0; i < total; i += 1) {
441
+ contents[i] = getTokenOfBundle(_packId, i);
442
+ }
443
+ perUnitAmounts = pack.perUnitAmounts;
444
+ }
445
+
446
+ /*///////////////////////////////////////////////////////////////
447
+ Internal functions
448
+ //////////////////////////////////////////////////////////////*/
449
+
450
+ /// @dev Returns whether owner can be set in the given execution context.
451
+ function _canSetOwner() internal view override returns (bool) {
452
+ return hasRole(DEFAULT_ADMIN_ROLE, _msgSender());
453
+ }
454
+
455
+ /// @dev Returns whether royalty info can be set in the given execution context.
456
+ function _canSetRoyaltyInfo() internal view override returns (bool) {
457
+ return hasRole(DEFAULT_ADMIN_ROLE, _msgSender());
458
+ }
459
+
460
+ /// @dev Returns whether contract metadata can be set in the given execution context.
461
+ function _canSetContractURI() internal view override returns (bool) {
462
+ return hasRole(DEFAULT_ADMIN_ROLE, _msgSender());
463
+ }
464
+
465
+ /*///////////////////////////////////////////////////////////////
466
+ Miscellaneous
467
+ //////////////////////////////////////////////////////////////*/
468
+
469
+ /**
470
+ * @dev See {ERC1155-_beforeTokenTransfer}.
471
+ */
472
+ function _beforeTokenTransfer(
473
+ address operator,
474
+ address from,
475
+ address to,
476
+ uint256[] memory ids,
477
+ uint256[] memory amounts,
478
+ bytes memory data
479
+ ) internal virtual override {
480
+ super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
481
+
482
+ if (from == address(0)) {
483
+ for (uint256 i = 0; i < ids.length; ++i) {
484
+ totalSupply[ids[i]] += amounts[i];
485
+ }
486
+ }
487
+
488
+ if (to == address(0)) {
489
+ for (uint256 i = 0; i < ids.length; ++i) {
490
+ totalSupply[ids[i]] -= amounts[i];
491
+ }
492
+ }
493
+ }
494
+
495
+ /// @dev See EIP-2771
496
+ function _msgSender()
497
+ internal
498
+ view
499
+ virtual
500
+ override(ContextUpgradeable, ERC2771ContextUpgradeable, Multicall)
501
+ returns (address sender)
502
+ {
503
+ return ERC2771ContextUpgradeable._msgSender();
504
+ }
505
+
506
+ /// @dev See EIP-2771
507
+ function _msgData()
508
+ internal
509
+ view
510
+ virtual
511
+ override(ContextUpgradeable, ERC2771ContextUpgradeable)
512
+ returns (bytes calldata)
513
+ {
514
+ return ERC2771ContextUpgradeable._msgData();
515
+ }
516
+ }