@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,731 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.11;
3
+
4
+ /// @author thirdweb
5
+
6
+ // ========== External imports ==========
7
+
8
+ import "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol";
9
+ import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
10
+ import "@openzeppelin/contracts-upgradeable/interfaces/IERC2981Upgradeable.sol";
11
+
12
+ import "@openzeppelin/contracts-upgradeable/utils/structs/BitMapsUpgradeable.sol";
13
+ import "../../extension/Multicall.sol";
14
+ import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol";
15
+
16
+ import "@openzeppelin/contracts-upgradeable/access/AccessControlEnumerableUpgradeable.sol";
17
+ import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol";
18
+
19
+ // ========== Internal imports ==========
20
+
21
+ import "../../infra/interface/IThirdwebContract.sol";
22
+
23
+ // ========== Features ==========
24
+
25
+ import "../../extension/interface/IPlatformFee.sol";
26
+ import "../../extension/interface/IPrimarySale.sol";
27
+ import "../../extension/interface/IRoyalty.sol";
28
+ import "../../extension/interface/IOwnable.sol";
29
+
30
+ import { IDropERC1155_V2 } from "../interface/drop/IDropERC1155_V2.sol";
31
+
32
+ import "../../external-deps/openzeppelin/metatx/ERC2771ContextUpgradeable.sol";
33
+
34
+ import "../../lib/CurrencyTransferLib.sol";
35
+ import "../../lib/FeeType.sol";
36
+ import "../../lib/MerkleProof.sol";
37
+
38
+ contract DropERC1155_V2 is
39
+ Initializable,
40
+ IThirdwebContract,
41
+ IOwnable,
42
+ IRoyalty,
43
+ IPrimarySale,
44
+ IPlatformFee,
45
+ ReentrancyGuardUpgradeable,
46
+ ERC2771ContextUpgradeable,
47
+ Multicall,
48
+ AccessControlEnumerableUpgradeable,
49
+ ERC1155Upgradeable,
50
+ IDropERC1155_V2
51
+ {
52
+ using BitMapsUpgradeable for BitMapsUpgradeable.BitMap;
53
+ using StringsUpgradeable for uint256;
54
+
55
+ /*///////////////////////////////////////////////////////////////
56
+ State variables
57
+ //////////////////////////////////////////////////////////////*/
58
+
59
+ bytes32 private constant MODULE_TYPE = bytes32("DropERC1155");
60
+ uint256 private constant VERSION = 2;
61
+
62
+ // Token name
63
+ string public name;
64
+
65
+ // Token symbol
66
+ string public symbol;
67
+
68
+ /// @dev Only transfers to or from TRANSFER_ROLE holders are valid, when transfers are restricted.
69
+ bytes32 private constant TRANSFER_ROLE = keccak256("TRANSFER_ROLE");
70
+ /// @dev Only MINTER_ROLE holders can lazy mint NFTs.
71
+ bytes32 private constant MINTER_ROLE = keccak256("MINTER_ROLE");
72
+
73
+ /// @dev Max bps in the thirdweb system
74
+ uint256 private constant MAX_BPS = 10_000;
75
+
76
+ /// @dev Owner of the contract (purpose: OpenSea compatibility)
77
+ address private _owner;
78
+
79
+ // @dev The next token ID of the NFT to "lazy mint".
80
+ uint256 public nextTokenIdToMint;
81
+
82
+ /// @dev The address that receives all primary sales value.
83
+ address public primarySaleRecipient;
84
+
85
+ /// @dev The address that receives all platform fees from all sales.
86
+ address private platformFeeRecipient;
87
+
88
+ /// @dev The % of primary sales collected as platform fees.
89
+ uint16 private platformFeeBps;
90
+
91
+ /// @dev The recipient of who gets the royalty.
92
+ address private royaltyRecipient;
93
+
94
+ /// @dev The (default) address that receives all royalty value.
95
+ uint16 private royaltyBps;
96
+
97
+ /// @dev Contract level metadata.
98
+ string public contractURI;
99
+
100
+ /// @dev Largest tokenId of each batch of tokens with the same baseURI
101
+ uint256[] private baseURIIndices;
102
+
103
+ /*///////////////////////////////////////////////////////////////
104
+ Mappings
105
+ //////////////////////////////////////////////////////////////*/
106
+
107
+ /**
108
+ * @dev Mapping from 'Largest tokenId of a batch of tokens with the same baseURI'
109
+ * to base URI for the respective batch of tokens.
110
+ **/
111
+ mapping(uint256 => string) private baseURI;
112
+
113
+ /// @dev Mapping from token ID => total circulating supply of tokens with that ID.
114
+ mapping(uint256 => uint256) public totalSupply;
115
+
116
+ /// @dev Mapping from token ID => maximum possible total circulating supply of tokens with that ID.
117
+ mapping(uint256 => uint256) public maxTotalSupply;
118
+
119
+ /// @dev Mapping from token ID => the set of all claim conditions, at any given moment, for tokens of the token ID.
120
+ mapping(uint256 => ClaimConditionList) public claimCondition;
121
+
122
+ /// @dev Mapping from token ID => the address of the recipient of primary sales.
123
+ mapping(uint256 => address) public saleRecipient;
124
+
125
+ /// @dev Mapping from token ID => royalty recipient and bps for tokens of the token ID.
126
+ mapping(uint256 => RoyaltyInfo) private royaltyInfoForToken;
127
+
128
+ /// @dev Mapping from token ID => claimer wallet address => total number of NFTs of the token ID a wallet has claimed.
129
+ mapping(uint256 => mapping(address => uint256)) public walletClaimCount;
130
+
131
+ /// @dev Mapping from token ID => the max number of NFTs of the token ID a wallet can claim.
132
+ mapping(uint256 => uint256) public maxWalletClaimCount;
133
+
134
+ /*///////////////////////////////////////////////////////////////
135
+ Constructor + initializer logic
136
+ //////////////////////////////////////////////////////////////*/
137
+
138
+ constructor() initializer {}
139
+
140
+ /// @dev Initializes the contract, like a constructor.
141
+ function initialize(
142
+ address _defaultAdmin,
143
+ string memory _name,
144
+ string memory _symbol,
145
+ string memory _contractURI,
146
+ address[] memory _trustedForwarders,
147
+ address _saleRecipient,
148
+ address _royaltyRecipient,
149
+ uint128 _royaltyBps,
150
+ uint128 _platformFeeBps,
151
+ address _platformFeeRecipient
152
+ ) external initializer {
153
+ // Initialize inherited contracts, most base-like -> most derived.
154
+ __ReentrancyGuard_init();
155
+ __ERC2771Context_init_unchained(_trustedForwarders);
156
+ __ERC1155_init_unchained("");
157
+
158
+ // Initialize this contract's state.
159
+ name = _name;
160
+ symbol = _symbol;
161
+ royaltyRecipient = _royaltyRecipient;
162
+ royaltyBps = uint16(_royaltyBps);
163
+ platformFeeRecipient = _platformFeeRecipient;
164
+ primarySaleRecipient = _saleRecipient;
165
+ contractURI = _contractURI;
166
+ platformFeeBps = uint16(_platformFeeBps);
167
+ _owner = _defaultAdmin;
168
+
169
+ _setupRole(DEFAULT_ADMIN_ROLE, _defaultAdmin);
170
+ _setupRole(MINTER_ROLE, _defaultAdmin);
171
+ _setupRole(TRANSFER_ROLE, _defaultAdmin);
172
+ _setupRole(TRANSFER_ROLE, address(0));
173
+ }
174
+
175
+ /*///////////////////////////////////////////////////////////////
176
+ Generic contract logic
177
+ //////////////////////////////////////////////////////////////*/
178
+
179
+ /// @dev Returns the type of the contract.
180
+ function contractType() external pure returns (bytes32) {
181
+ return MODULE_TYPE;
182
+ }
183
+
184
+ /// @dev Returns the version of the contract.
185
+ function contractVersion() external pure returns (uint8) {
186
+ return uint8(VERSION);
187
+ }
188
+
189
+ /**
190
+ * @dev Returns the address of the current owner.
191
+ */
192
+ function owner() public view returns (address) {
193
+ return hasRole(DEFAULT_ADMIN_ROLE, _owner) ? _owner : address(0);
194
+ }
195
+
196
+ /*///////////////////////////////////////////////////////////////
197
+ ERC 165 / 1155 / 2981 logic
198
+ //////////////////////////////////////////////////////////////*/
199
+
200
+ /// @dev Returns the URI for a given tokenId.
201
+ function uri(uint256 _tokenId) public view override returns (string memory _tokenURI) {
202
+ for (uint256 i = 0; i < baseURIIndices.length; i += 1) {
203
+ if (_tokenId < baseURIIndices[i]) {
204
+ return string(abi.encodePacked(baseURI[baseURIIndices[i]], _tokenId.toString()));
205
+ }
206
+ }
207
+
208
+ return "";
209
+ }
210
+
211
+ /// @dev See ERC 165
212
+ function supportsInterface(
213
+ bytes4 interfaceId
214
+ )
215
+ public
216
+ view
217
+ virtual
218
+ override(ERC1155Upgradeable, AccessControlEnumerableUpgradeable, IERC165Upgradeable, IERC165)
219
+ returns (bool)
220
+ {
221
+ return super.supportsInterface(interfaceId) || type(IERC2981Upgradeable).interfaceId == interfaceId;
222
+ }
223
+
224
+ /// @dev Returns the royalty recipient and amount, given a tokenId and sale price.
225
+ function royaltyInfo(
226
+ uint256 tokenId,
227
+ uint256 salePrice
228
+ ) external view virtual returns (address receiver, uint256 royaltyAmount) {
229
+ (address recipient, uint256 bps) = getRoyaltyInfoForToken(tokenId);
230
+ receiver = recipient;
231
+ royaltyAmount = (salePrice * bps) / MAX_BPS;
232
+ }
233
+
234
+ /*///////////////////////////////////////////////////////////////
235
+ Minting logic
236
+ //////////////////////////////////////////////////////////////*/
237
+
238
+ /**
239
+ * @dev Lets an account with `MINTER_ROLE` lazy mint 'n' NFTs.
240
+ * The URIs for each token is the provided `_baseURIForTokens` + `{tokenId}`.
241
+ */
242
+ function lazyMint(uint256 _amount, string calldata _baseURIForTokens) external onlyRole(MINTER_ROLE) {
243
+ uint256 startId = nextTokenIdToMint;
244
+ uint256 baseURIIndex = startId + _amount;
245
+
246
+ nextTokenIdToMint = baseURIIndex;
247
+ baseURI[baseURIIndex] = _baseURIForTokens;
248
+ baseURIIndices.push(baseURIIndex);
249
+
250
+ emit TokensLazyMinted(startId, startId + _amount - 1, _baseURIForTokens);
251
+ }
252
+
253
+ /*///////////////////////////////////////////////////////////////
254
+ Claim logic
255
+ //////////////////////////////////////////////////////////////*/
256
+
257
+ /// @dev Lets an account claim a given quantity of NFTs, of a single tokenId.
258
+ function claim(
259
+ address _receiver,
260
+ uint256 _tokenId,
261
+ uint256 _quantity,
262
+ address _currency,
263
+ uint256 _pricePerToken,
264
+ bytes32[] calldata _proofs,
265
+ uint256 _proofMaxQuantityPerTransaction
266
+ ) external payable nonReentrant {
267
+ require(isTrustedForwarder(msg.sender) || _msgSender() == tx.origin, "BOT");
268
+
269
+ // Get the active claim condition index.
270
+ uint256 activeConditionId = getActiveClaimConditionId(_tokenId);
271
+
272
+ /**
273
+ * We make allowlist checks (i.e. verifyClaimMerkleProof) before verifying the claim's general
274
+ * validity (i.e. verifyClaim) because we give precedence to the check of allow list quantity
275
+ * restriction over the check of the general claim condition's quantityLimitPerTransaction
276
+ * restriction.
277
+ */
278
+
279
+ // Verify inclusion in allowlist.
280
+ (bool validMerkleProof, ) = verifyClaimMerkleProof(
281
+ activeConditionId,
282
+ _msgSender(),
283
+ _tokenId,
284
+ _quantity,
285
+ _proofs,
286
+ _proofMaxQuantityPerTransaction
287
+ );
288
+
289
+ // Verify claim validity. If not valid, revert.
290
+ // when there's allowlist present --> verifyClaimMerkleProof will verify the _proofMaxQuantityPerTransaction value with hashed leaf in the allowlist
291
+ // when there's no allowlist, this check is true --> verifyClaim will check for _quantity being less/equal than the limit
292
+ bool toVerifyMaxQuantityPerTransaction = _proofMaxQuantityPerTransaction == 0 ||
293
+ claimCondition[_tokenId].phases[activeConditionId].merkleRoot == bytes32(0);
294
+ verifyClaim(
295
+ activeConditionId,
296
+ _msgSender(),
297
+ _tokenId,
298
+ _quantity,
299
+ _currency,
300
+ _pricePerToken,
301
+ toVerifyMaxQuantityPerTransaction
302
+ );
303
+
304
+ if (validMerkleProof && _proofMaxQuantityPerTransaction > 0) {
305
+ /**
306
+ * Mark the claimer's use of their position in the allowlist. A spot in an allowlist
307
+ * can be used only once.
308
+ */
309
+ claimCondition[_tokenId].limitMerkleProofClaim[activeConditionId].set(uint256(uint160(_msgSender())));
310
+ }
311
+
312
+ // If there's a price, collect price.
313
+ collectClaimPrice(_quantity, _currency, _pricePerToken, _tokenId);
314
+
315
+ // Mint the relevant tokens to claimer.
316
+ transferClaimedTokens(_receiver, activeConditionId, _tokenId, _quantity);
317
+
318
+ emit TokensClaimed(activeConditionId, _tokenId, _msgSender(), _receiver, _quantity);
319
+ }
320
+
321
+ /// @dev Lets a contract admin (account with `DEFAULT_ADMIN_ROLE`) set claim conditions, for a tokenId.
322
+ function setClaimConditions(
323
+ uint256 _tokenId,
324
+ ClaimCondition[] calldata _phases,
325
+ bool _resetClaimEligibility
326
+ ) external onlyRole(DEFAULT_ADMIN_ROLE) {
327
+ ClaimConditionList storage condition = claimCondition[_tokenId];
328
+ uint256 existingStartIndex = condition.currentStartId;
329
+ uint256 existingPhaseCount = condition.count;
330
+
331
+ /**
332
+ * `limitLastClaimTimestamp` and `limitMerkleProofClaim` are mappings that use a
333
+ * claim condition's UID as a key.
334
+ *
335
+ * If `_resetClaimEligibility == true`, we assign completely new UIDs to the claim
336
+ * conditions in `_phases`, effectively resetting the restrictions on claims expressed
337
+ * by `limitLastClaimTimestamp` and `limitMerkleProofClaim`.
338
+ */
339
+ uint256 newStartIndex = existingStartIndex;
340
+ if (_resetClaimEligibility) {
341
+ newStartIndex = existingStartIndex + existingPhaseCount;
342
+ }
343
+
344
+ condition.count = _phases.length;
345
+ condition.currentStartId = newStartIndex;
346
+
347
+ uint256 lastConditionStartTimestamp;
348
+ for (uint256 i = 0; i < _phases.length; i++) {
349
+ require(
350
+ i == 0 || lastConditionStartTimestamp < _phases[i].startTimestamp,
351
+ "startTimestamp must be in ascending order."
352
+ );
353
+
354
+ uint256 supplyClaimedAlready = condition.phases[newStartIndex + i].supplyClaimed;
355
+ require(supplyClaimedAlready <= _phases[i].maxClaimableSupply, "max supply claimed already");
356
+
357
+ condition.phases[newStartIndex + i] = _phases[i];
358
+ condition.phases[newStartIndex + i].supplyClaimed = supplyClaimedAlready;
359
+
360
+ lastConditionStartTimestamp = _phases[i].startTimestamp;
361
+ }
362
+
363
+ /**
364
+ * Gas refunds (as much as possible)
365
+ *
366
+ * If `_resetClaimEligibility == true`, we assign completely new UIDs to the claim
367
+ * conditions in `_phases`. So, we delete claim conditions with UID < `newStartIndex`.
368
+ *
369
+ * If `_resetClaimEligibility == false`, and there are more existing claim conditions
370
+ * than in `_phases`, we delete the existing claim conditions that don't get replaced
371
+ * by the conditions in `_phases`.
372
+ */
373
+ if (_resetClaimEligibility) {
374
+ for (uint256 i = existingStartIndex; i < newStartIndex; i++) {
375
+ delete condition.phases[i];
376
+ delete condition.limitMerkleProofClaim[i];
377
+ }
378
+ } else {
379
+ if (existingPhaseCount > _phases.length) {
380
+ for (uint256 i = _phases.length; i < existingPhaseCount; i++) {
381
+ delete condition.phases[newStartIndex + i];
382
+ delete condition.limitMerkleProofClaim[newStartIndex + i];
383
+ }
384
+ }
385
+ }
386
+
387
+ emit ClaimConditionsUpdated(_tokenId, _phases);
388
+ }
389
+
390
+ /// @dev Collects and distributes the primary sale value of NFTs being claimed.
391
+ function collectClaimPrice(
392
+ uint256 _quantityToClaim,
393
+ address _currency,
394
+ uint256 _pricePerToken,
395
+ uint256 _tokenId
396
+ ) internal {
397
+ if (_pricePerToken == 0) {
398
+ return;
399
+ }
400
+
401
+ uint256 totalPrice = _quantityToClaim * _pricePerToken;
402
+ uint256 platformFees = (totalPrice * platformFeeBps) / MAX_BPS;
403
+
404
+ if (_currency == CurrencyTransferLib.NATIVE_TOKEN) {
405
+ require(msg.value == totalPrice, "must send total price.");
406
+ }
407
+
408
+ address recipient = saleRecipient[_tokenId] == address(0) ? primarySaleRecipient : saleRecipient[_tokenId];
409
+ CurrencyTransferLib.transferCurrency(_currency, _msgSender(), platformFeeRecipient, platformFees);
410
+ CurrencyTransferLib.transferCurrency(_currency, _msgSender(), recipient, totalPrice - platformFees);
411
+ }
412
+
413
+ /// @dev Transfers the NFTs being claimed.
414
+ function transferClaimedTokens(
415
+ address _to,
416
+ uint256 _conditionId,
417
+ uint256 _tokenId,
418
+ uint256 _quantityBeingClaimed
419
+ ) internal {
420
+ // Update the supply minted under mint condition.
421
+ claimCondition[_tokenId].phases[_conditionId].supplyClaimed += _quantityBeingClaimed;
422
+
423
+ // if transfer claimed tokens is called when to != msg.sender, it'd use msg.sender's limits.
424
+ // behavior would be similar to msg.sender mint for itself, then transfer to `to`.
425
+ claimCondition[_tokenId].limitLastClaimTimestamp[_conditionId][_msgSender()] = block.timestamp;
426
+
427
+ walletClaimCount[_tokenId][_msgSender()] += _quantityBeingClaimed;
428
+
429
+ _mint(_to, _tokenId, _quantityBeingClaimed, "");
430
+ }
431
+
432
+ /// @dev Checks a request to claim NFTs against the active claim condition's criteria.
433
+ function verifyClaim(
434
+ uint256 _conditionId,
435
+ address _claimer,
436
+ uint256 _tokenId,
437
+ uint256 _quantity,
438
+ address _currency,
439
+ uint256 _pricePerToken,
440
+ bool verifyMaxQuantityPerTransaction
441
+ ) public view {
442
+ ClaimCondition memory currentClaimPhase = claimCondition[_tokenId].phases[_conditionId];
443
+
444
+ require(
445
+ _currency == currentClaimPhase.currency && _pricePerToken == currentClaimPhase.pricePerToken,
446
+ "invalid currency or price specified."
447
+ );
448
+ // If we're checking for an allowlist quantity restriction, ignore the general quantity restriction.
449
+ require(
450
+ _quantity > 0 &&
451
+ (!verifyMaxQuantityPerTransaction || _quantity <= currentClaimPhase.quantityLimitPerTransaction),
452
+ "invalid quantity claimed."
453
+ );
454
+ require(
455
+ currentClaimPhase.supplyClaimed + _quantity <= currentClaimPhase.maxClaimableSupply,
456
+ "exceed max mint supply."
457
+ );
458
+ require(
459
+ maxTotalSupply[_tokenId] == 0 || totalSupply[_tokenId] + _quantity <= maxTotalSupply[_tokenId],
460
+ "exceed max total supply"
461
+ );
462
+ require(
463
+ maxWalletClaimCount[_tokenId] == 0 ||
464
+ walletClaimCount[_tokenId][_claimer] + _quantity <= maxWalletClaimCount[_tokenId],
465
+ "exceed claim limit for wallet"
466
+ );
467
+
468
+ (uint256 lastClaimTimestamp, uint256 nextValidClaimTimestamp) = getClaimTimestamp(
469
+ _tokenId,
470
+ _conditionId,
471
+ _claimer
472
+ );
473
+ require(lastClaimTimestamp == 0 || block.timestamp >= nextValidClaimTimestamp, "cannot claim yet.");
474
+ }
475
+
476
+ /// @dev Checks whether a claimer meets the claim condition's allowlist criteria.
477
+ function verifyClaimMerkleProof(
478
+ uint256 _conditionId,
479
+ address _claimer,
480
+ uint256 _tokenId,
481
+ uint256 _quantity,
482
+ bytes32[] calldata _proofs,
483
+ uint256 _proofMaxQuantityPerTransaction
484
+ ) public view returns (bool validMerkleProof, uint256 merkleProofIndex) {
485
+ ClaimCondition memory currentClaimPhase = claimCondition[_tokenId].phases[_conditionId];
486
+
487
+ if (currentClaimPhase.merkleRoot != bytes32(0)) {
488
+ (validMerkleProof, merkleProofIndex) = MerkleProof.verify(
489
+ _proofs,
490
+ currentClaimPhase.merkleRoot,
491
+ keccak256(abi.encodePacked(_claimer, _proofMaxQuantityPerTransaction))
492
+ );
493
+ require(validMerkleProof, "not in whitelist.");
494
+ require(
495
+ !claimCondition[_tokenId].limitMerkleProofClaim[_conditionId].get(uint256(uint160(_claimer))),
496
+ "proof claimed."
497
+ );
498
+ require(
499
+ _proofMaxQuantityPerTransaction == 0 || _quantity <= _proofMaxQuantityPerTransaction,
500
+ "invalid quantity proof."
501
+ );
502
+ }
503
+ }
504
+
505
+ /*///////////////////////////////////////////////////////////////
506
+ Getter functions
507
+ //////////////////////////////////////////////////////////////*/
508
+
509
+ /// @dev At any given moment, returns the uid for the active claim condition, for a given tokenId.
510
+ function getActiveClaimConditionId(uint256 _tokenId) public view returns (uint256) {
511
+ ClaimConditionList storage conditionList = claimCondition[_tokenId];
512
+ for (uint256 i = conditionList.currentStartId + conditionList.count; i > conditionList.currentStartId; i--) {
513
+ if (block.timestamp >= conditionList.phases[i - 1].startTimestamp) {
514
+ return i - 1;
515
+ }
516
+ }
517
+
518
+ revert("no active mint condition.");
519
+ }
520
+
521
+ /// @dev Returns the platform fee recipient and bps.
522
+ function getPlatformFeeInfo() external view returns (address, uint16) {
523
+ return (platformFeeRecipient, uint16(platformFeeBps));
524
+ }
525
+
526
+ /// @dev Returns the default royalty recipient and bps.
527
+ function getDefaultRoyaltyInfo() external view returns (address, uint16) {
528
+ return (royaltyRecipient, uint16(royaltyBps));
529
+ }
530
+
531
+ /// @dev Returns the royalty recipient and bps for a particular token Id.
532
+ function getRoyaltyInfoForToken(uint256 _tokenId) public view returns (address, uint16) {
533
+ RoyaltyInfo memory royaltyForToken = royaltyInfoForToken[_tokenId];
534
+
535
+ return
536
+ royaltyForToken.recipient == address(0)
537
+ ? (royaltyRecipient, uint16(royaltyBps))
538
+ : (royaltyForToken.recipient, uint16(royaltyForToken.bps));
539
+ }
540
+
541
+ /// @dev Returns the timestamp for when a claimer is eligible for claiming NFTs again.
542
+ function getClaimTimestamp(
543
+ uint256 _tokenId,
544
+ uint256 _conditionId,
545
+ address _claimer
546
+ ) public view returns (uint256 lastClaimTimestamp, uint256 nextValidClaimTimestamp) {
547
+ lastClaimTimestamp = claimCondition[_tokenId].limitLastClaimTimestamp[_conditionId][_claimer];
548
+
549
+ unchecked {
550
+ nextValidClaimTimestamp =
551
+ lastClaimTimestamp +
552
+ claimCondition[_tokenId].phases[_conditionId].waitTimeInSecondsBetweenClaims;
553
+
554
+ if (nextValidClaimTimestamp < lastClaimTimestamp) {
555
+ nextValidClaimTimestamp = type(uint256).max;
556
+ }
557
+ }
558
+ }
559
+
560
+ /// @dev Returns the claim condition at the given uid.
561
+ function getClaimConditionById(
562
+ uint256 _tokenId,
563
+ uint256 _conditionId
564
+ ) external view returns (ClaimCondition memory condition) {
565
+ condition = claimCondition[_tokenId].phases[_conditionId];
566
+ }
567
+
568
+ /*///////////////////////////////////////////////////////////////
569
+ Setter functions
570
+ //////////////////////////////////////////////////////////////*/
571
+
572
+ /// @dev Lets a contract admin set a claim count for a wallet.
573
+ function setWalletClaimCount(
574
+ uint256 _tokenId,
575
+ address _claimer,
576
+ uint256 _count
577
+ ) external onlyRole(DEFAULT_ADMIN_ROLE) {
578
+ walletClaimCount[_tokenId][_claimer] = _count;
579
+ emit WalletClaimCountUpdated(_tokenId, _claimer, _count);
580
+ }
581
+
582
+ /// @dev Lets a contract admin set a maximum number of NFTs of a tokenId that can be claimed by any wallet.
583
+ function setMaxWalletClaimCount(uint256 _tokenId, uint256 _count) external onlyRole(DEFAULT_ADMIN_ROLE) {
584
+ maxWalletClaimCount[_tokenId] = _count;
585
+ emit MaxWalletClaimCountUpdated(_tokenId, _count);
586
+ }
587
+
588
+ /// @dev Lets a module admin set a max total supply for token.
589
+ function setMaxTotalSupply(uint256 _tokenId, uint256 _maxTotalSupply) external onlyRole(DEFAULT_ADMIN_ROLE) {
590
+ maxTotalSupply[_tokenId] = _maxTotalSupply;
591
+ emit MaxTotalSupplyUpdated(_tokenId, _maxTotalSupply);
592
+ }
593
+
594
+ /// @dev Lets a contract admin set the recipient for all primary sales.
595
+ function setPrimarySaleRecipient(address _saleRecipient) external onlyRole(DEFAULT_ADMIN_ROLE) {
596
+ primarySaleRecipient = _saleRecipient;
597
+ emit PrimarySaleRecipientUpdated(_saleRecipient);
598
+ }
599
+
600
+ /// @dev Lets a contract admin set the recipient for all primary sales.
601
+ function setSaleRecipientForToken(uint256 _tokenId, address _saleRecipient) external onlyRole(DEFAULT_ADMIN_ROLE) {
602
+ saleRecipient[_tokenId] = _saleRecipient;
603
+ emit SaleRecipientForTokenUpdated(_tokenId, _saleRecipient);
604
+ }
605
+
606
+ /// @dev Lets a contract admin update the default royalty recipient and bps.
607
+ function setDefaultRoyaltyInfo(
608
+ address _royaltyRecipient,
609
+ uint256 _royaltyBps
610
+ ) external onlyRole(DEFAULT_ADMIN_ROLE) {
611
+ require(_royaltyBps <= MAX_BPS, "exceed royalty bps");
612
+
613
+ royaltyRecipient = _royaltyRecipient;
614
+ royaltyBps = uint16(_royaltyBps);
615
+
616
+ emit DefaultRoyalty(_royaltyRecipient, _royaltyBps);
617
+ }
618
+
619
+ /// @dev Lets a contract admin set the royalty recipient and bps for a particular token Id.
620
+ function setRoyaltyInfoForToken(
621
+ uint256 _tokenId,
622
+ address _recipient,
623
+ uint256 _bps
624
+ ) external onlyRole(DEFAULT_ADMIN_ROLE) {
625
+ require(_bps <= MAX_BPS, "exceed royalty bps");
626
+
627
+ royaltyInfoForToken[_tokenId] = RoyaltyInfo({ recipient: _recipient, bps: _bps });
628
+
629
+ emit RoyaltyForToken(_tokenId, _recipient, _bps);
630
+ }
631
+
632
+ /// @dev Lets a contract admin update the platform fee recipient and bps
633
+ function setPlatformFeeInfo(
634
+ address _platformFeeRecipient,
635
+ uint256 _platformFeeBps
636
+ ) external onlyRole(DEFAULT_ADMIN_ROLE) {
637
+ require(_platformFeeBps <= MAX_BPS, "bps <= 10000.");
638
+
639
+ platformFeeBps = uint16(_platformFeeBps);
640
+ platformFeeRecipient = _platformFeeRecipient;
641
+
642
+ emit PlatformFeeInfoUpdated(_platformFeeRecipient, _platformFeeBps);
643
+ }
644
+
645
+ /// @dev Lets a contract admin set a new owner for the contract. The new owner must be a contract admin.
646
+ function setOwner(address _newOwner) external onlyRole(DEFAULT_ADMIN_ROLE) {
647
+ require(hasRole(DEFAULT_ADMIN_ROLE, _newOwner), "new owner not module admin.");
648
+ emit OwnerUpdated(_owner, _newOwner);
649
+ _owner = _newOwner;
650
+ }
651
+
652
+ /// @dev Lets a contract admin set the URI for contract-level metadata.
653
+ function setContractURI(string calldata _uri) external onlyRole(DEFAULT_ADMIN_ROLE) {
654
+ contractURI = _uri;
655
+ }
656
+
657
+ /*///////////////////////////////////////////////////////////////
658
+ Miscellaneous
659
+ //////////////////////////////////////////////////////////////*/
660
+
661
+ /// @dev Lets a token owner burn the tokens they own (i.e. destroy for good)
662
+ function burn(address account, uint256 id, uint256 value) public virtual {
663
+ require(
664
+ account == _msgSender() || isApprovedForAll(account, _msgSender()),
665
+ "ERC1155: caller is not owner nor approved."
666
+ );
667
+
668
+ _burn(account, id, value);
669
+ }
670
+
671
+ /// @dev Lets a token owner burn multiple tokens they own at once (i.e. destroy for good)
672
+ function burnBatch(address account, uint256[] memory ids, uint256[] memory values) public virtual {
673
+ require(
674
+ account == _msgSender() || isApprovedForAll(account, _msgSender()),
675
+ "ERC1155: caller is not owner nor approved."
676
+ );
677
+
678
+ _burnBatch(account, ids, values);
679
+ }
680
+
681
+ /**
682
+ * @dev See {ERC1155-_beforeTokenTransfer}.
683
+ */
684
+ function _beforeTokenTransfer(
685
+ address operator,
686
+ address from,
687
+ address to,
688
+ uint256[] memory ids,
689
+ uint256[] memory amounts,
690
+ bytes memory data
691
+ ) internal virtual override {
692
+ super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
693
+
694
+ // if transfer is restricted on the contract, we still want to allow burning and minting
695
+ if (!hasRole(TRANSFER_ROLE, address(0)) && from != address(0) && to != address(0)) {
696
+ require(hasRole(TRANSFER_ROLE, from) || hasRole(TRANSFER_ROLE, to), "restricted to TRANSFER_ROLE holders.");
697
+ }
698
+
699
+ if (from == address(0)) {
700
+ for (uint256 i = 0; i < ids.length; ++i) {
701
+ totalSupply[ids[i]] += amounts[i];
702
+ }
703
+ }
704
+
705
+ if (to == address(0)) {
706
+ for (uint256 i = 0; i < ids.length; ++i) {
707
+ totalSupply[ids[i]] -= amounts[i];
708
+ }
709
+ }
710
+ }
711
+
712
+ function _msgSender()
713
+ internal
714
+ view
715
+ virtual
716
+ override(ContextUpgradeable, ERC2771ContextUpgradeable, Multicall)
717
+ returns (address sender)
718
+ {
719
+ return ERC2771ContextUpgradeable._msgSender();
720
+ }
721
+
722
+ function _msgData()
723
+ internal
724
+ view
725
+ virtual
726
+ override(ContextUpgradeable, ERC2771ContextUpgradeable)
727
+ returns (bytes calldata)
728
+ {
729
+ return ERC2771ContextUpgradeable._msgData();
730
+ }
731
+ }