@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,215 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @author thirdweb
5
+
6
+ import "./interface/IDropSinglePhase1155.sol";
7
+ import "../lib/MerkleProof.sol";
8
+
9
+ abstract contract DropSinglePhase1155 is IDropSinglePhase1155 {
10
+ /*///////////////////////////////////////////////////////////////
11
+ Mappings
12
+ //////////////////////////////////////////////////////////////*/
13
+
14
+ /// @dev Mapping from tokenId => active claim condition for the tokenId.
15
+ mapping(uint256 => ClaimCondition) public claimCondition;
16
+
17
+ /// @dev Mapping from tokenId => active claim condition's UID.
18
+ mapping(uint256 => bytes32) private conditionId;
19
+
20
+ /**
21
+ * @dev Map from a claim condition uid and account to supply claimed by account.
22
+ */
23
+ mapping(bytes32 => mapping(address => uint256)) private supplyClaimedByWallet;
24
+
25
+ /*///////////////////////////////////////////////////////////////
26
+ Drop logic
27
+ //////////////////////////////////////////////////////////////*/
28
+
29
+ /// @dev Lets an account claim tokens.
30
+ function claim(
31
+ address _receiver,
32
+ uint256 _tokenId,
33
+ uint256 _quantity,
34
+ address _currency,
35
+ uint256 _pricePerToken,
36
+ AllowlistProof calldata _allowlistProof,
37
+ bytes memory _data
38
+ ) public payable virtual override {
39
+ _beforeClaim(_tokenId, _receiver, _quantity, _currency, _pricePerToken, _allowlistProof, _data);
40
+
41
+ ClaimCondition memory condition = claimCondition[_tokenId];
42
+ bytes32 activeConditionId = conditionId[_tokenId];
43
+
44
+ verifyClaim(_tokenId, _dropMsgSender(), _quantity, _currency, _pricePerToken, _allowlistProof);
45
+
46
+ // Update contract state.
47
+ condition.supplyClaimed += _quantity;
48
+ supplyClaimedByWallet[activeConditionId][_dropMsgSender()] += _quantity;
49
+ claimCondition[_tokenId] = condition;
50
+
51
+ // If there's a price, collect price.
52
+ _collectPriceOnClaim(address(0), _quantity, _currency, _pricePerToken);
53
+
54
+ // Mint the relevant NFTs to claimer.
55
+ _transferTokensOnClaim(_receiver, _tokenId, _quantity);
56
+
57
+ emit TokensClaimed(_dropMsgSender(), _receiver, _tokenId, _quantity);
58
+
59
+ _afterClaim(_tokenId, _receiver, _quantity, _currency, _pricePerToken, _allowlistProof, _data);
60
+ }
61
+
62
+ /// @dev Lets a contract admin set claim conditions.
63
+ function setClaimConditions(
64
+ uint256 _tokenId,
65
+ ClaimCondition calldata _condition,
66
+ bool _resetClaimEligibility
67
+ ) external override {
68
+ if (!_canSetClaimConditions()) {
69
+ revert("Not authorized");
70
+ }
71
+
72
+ ClaimCondition memory condition = claimCondition[_tokenId];
73
+ bytes32 targetConditionId = conditionId[_tokenId];
74
+
75
+ uint256 supplyClaimedAlready = condition.supplyClaimed;
76
+
77
+ if (targetConditionId == bytes32(0) || _resetClaimEligibility) {
78
+ supplyClaimedAlready = 0;
79
+ targetConditionId = keccak256(abi.encodePacked(_dropMsgSender(), block.number, _tokenId));
80
+ }
81
+
82
+ if (supplyClaimedAlready > _condition.maxClaimableSupply) {
83
+ revert("max supply claimed");
84
+ }
85
+
86
+ ClaimCondition memory updatedCondition = ClaimCondition({
87
+ startTimestamp: _condition.startTimestamp,
88
+ maxClaimableSupply: _condition.maxClaimableSupply,
89
+ supplyClaimed: supplyClaimedAlready,
90
+ quantityLimitPerWallet: _condition.quantityLimitPerWallet,
91
+ merkleRoot: _condition.merkleRoot,
92
+ pricePerToken: _condition.pricePerToken,
93
+ currency: _condition.currency,
94
+ metadata: _condition.metadata
95
+ });
96
+
97
+ claimCondition[_tokenId] = updatedCondition;
98
+ conditionId[_tokenId] = targetConditionId;
99
+
100
+ emit ClaimConditionUpdated(_tokenId, _condition, _resetClaimEligibility);
101
+ }
102
+
103
+ /// @dev Checks a request to claim NFTs against the active claim condition's criteria.
104
+ function verifyClaim(
105
+ uint256 _tokenId,
106
+ address _claimer,
107
+ uint256 _quantity,
108
+ address _currency,
109
+ uint256 _pricePerToken,
110
+ AllowlistProof calldata _allowlistProof
111
+ ) public view virtual returns (bool isOverride) {
112
+ ClaimCondition memory currentClaimPhase = claimCondition[_tokenId];
113
+ uint256 claimLimit = currentClaimPhase.quantityLimitPerWallet;
114
+ uint256 claimPrice = currentClaimPhase.pricePerToken;
115
+ address claimCurrency = currentClaimPhase.currency;
116
+
117
+ /*
118
+ * Here `isOverride` implies that if the merkle proof verification fails,
119
+ * the claimer would claim through open claim limit instead of allowlisted limit.
120
+ */
121
+ if (currentClaimPhase.merkleRoot != bytes32(0)) {
122
+ (isOverride, ) = MerkleProof.verify(
123
+ _allowlistProof.proof,
124
+ currentClaimPhase.merkleRoot,
125
+ keccak256(
126
+ abi.encodePacked(
127
+ _claimer,
128
+ _allowlistProof.quantityLimitPerWallet,
129
+ _allowlistProof.pricePerToken,
130
+ _allowlistProof.currency
131
+ )
132
+ )
133
+ );
134
+ }
135
+
136
+ if (isOverride) {
137
+ claimLimit = _allowlistProof.quantityLimitPerWallet != 0
138
+ ? _allowlistProof.quantityLimitPerWallet
139
+ : claimLimit;
140
+ claimPrice = _allowlistProof.pricePerToken != type(uint256).max
141
+ ? _allowlistProof.pricePerToken
142
+ : claimPrice;
143
+ claimCurrency = _allowlistProof.pricePerToken != type(uint256).max && _allowlistProof.currency != address(0)
144
+ ? _allowlistProof.currency
145
+ : claimCurrency;
146
+ }
147
+
148
+ uint256 _supplyClaimedByWallet = supplyClaimedByWallet[conditionId[_tokenId]][_claimer];
149
+
150
+ if (_currency != claimCurrency || _pricePerToken != claimPrice) {
151
+ revert("!PriceOrCurrency");
152
+ }
153
+
154
+ if (_quantity == 0 || (_quantity + _supplyClaimedByWallet > claimLimit)) {
155
+ revert("!Qty");
156
+ }
157
+
158
+ if (currentClaimPhase.supplyClaimed + _quantity > currentClaimPhase.maxClaimableSupply) {
159
+ revert("!MaxSupply");
160
+ }
161
+
162
+ if (currentClaimPhase.startTimestamp > block.timestamp) {
163
+ revert("cant claim yet");
164
+ }
165
+ }
166
+
167
+ /// @dev Returns the supply claimed by claimer for active conditionId.
168
+ function getSupplyClaimedByWallet(uint256 _tokenId, address _claimer) public view returns (uint256) {
169
+ return supplyClaimedByWallet[conditionId[_tokenId]][_claimer];
170
+ }
171
+
172
+ /*////////////////////////////////////////////////////////////////////
173
+ Optional hooks that can be implemented in the derived contract
174
+ ///////////////////////////////////////////////////////////////////*/
175
+
176
+ /// @dev Exposes the ability to override the msg sender.
177
+ function _dropMsgSender() internal virtual returns (address) {
178
+ return msg.sender;
179
+ }
180
+
181
+ /// @dev Runs before every `claim` function call.
182
+ function _beforeClaim(
183
+ uint256 _tokenId,
184
+ address _receiver,
185
+ uint256 _quantity,
186
+ address _currency,
187
+ uint256 _pricePerToken,
188
+ AllowlistProof calldata _allowlistProof,
189
+ bytes memory _data
190
+ ) internal virtual {}
191
+
192
+ /// @dev Runs after every `claim` function call.
193
+ function _afterClaim(
194
+ uint256 _tokenId,
195
+ address _receiver,
196
+ uint256 _quantity,
197
+ address _currency,
198
+ uint256 _pricePerToken,
199
+ AllowlistProof calldata _allowlistProof,
200
+ bytes memory _data
201
+ ) internal virtual {}
202
+
203
+ /// @dev Collects and distributes the primary sale value of NFTs being claimed.
204
+ function _collectPriceOnClaim(
205
+ address _primarySaleRecipient,
206
+ uint256 _quantityToClaim,
207
+ address _currency,
208
+ uint256 _pricePerToken
209
+ ) internal virtual;
210
+
211
+ /// @dev Transfers the NFTs being claimed.
212
+ function _transferTokensOnClaim(address _to, uint256 _tokenId, uint256 _quantityBeingClaimed) internal virtual;
213
+
214
+ function _canSetClaimConditions() internal view virtual returns (bool);
215
+ }
@@ -0,0 +1,136 @@
1
+ // SPDX-License-Identifier: Apache 2.0
2
+ pragma solidity ^0.8.0;
3
+
4
+ import "../lib/Address.sol";
5
+
6
+ /**
7
+ * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
8
+ * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
9
+ * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
10
+ * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
11
+ *
12
+ * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
13
+ * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
14
+ * case an upgrade adds a module that needs to be initialized.
15
+ *
16
+ * For example:
17
+ *
18
+ * [.hljs-theme-light.nopadding]
19
+ * ```
20
+ * contract MyToken is ERC20Upgradeable {
21
+ * function initialize() initializer public {
22
+ * __ERC20_init("MyToken", "MTK");
23
+ * }
24
+ * }
25
+ * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
26
+ * function initializeV2() reinitializer(2) public {
27
+ * __ERC20Permit_init("MyToken");
28
+ * }
29
+ * }
30
+ * ```
31
+ *
32
+ * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
33
+ * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
34
+ *
35
+ * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
36
+ * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
37
+ *
38
+ * [CAUTION]
39
+ * ====
40
+ * Avoid leaving a contract uninitialized.
41
+ *
42
+ * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
43
+ * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
44
+ * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
45
+ *
46
+ * [.hljs-theme-light.nopadding]
47
+ * ```
48
+ * /// @custom:oz-upgrades-unsafe-allow constructor
49
+ * constructor() {
50
+ * _disableInitializers();
51
+ * }
52
+ * ```
53
+ * ====
54
+ */
55
+ abstract contract Initializable {
56
+ /**
57
+ * @dev Indicates that the contract has been initialized.
58
+ * @custom:oz-retyped-from bool
59
+ */
60
+ uint8 private _initialized;
61
+
62
+ /**
63
+ * @dev Indicates that the contract is in the process of being initialized.
64
+ */
65
+ bool private _initializing;
66
+
67
+ /**
68
+ * @dev Triggered when the contract has been initialized or reinitialized.
69
+ */
70
+ event Initialized(uint8 version);
71
+
72
+ /**
73
+ * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
74
+ * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.
75
+ */
76
+ modifier initializer() {
77
+ bool isTopLevelCall = !_initializing;
78
+ require(
79
+ (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1),
80
+ "Initializable: contract is already initialized"
81
+ );
82
+ _initialized = 1;
83
+ if (isTopLevelCall) {
84
+ _initializing = true;
85
+ }
86
+ _;
87
+ if (isTopLevelCall) {
88
+ _initializing = false;
89
+ emit Initialized(1);
90
+ }
91
+ }
92
+
93
+ /**
94
+ * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
95
+ * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
96
+ * used to initialize parent contracts.
97
+ *
98
+ * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original
99
+ * initialization step. This is essential to configure modules that are added through upgrades and that require
100
+ * initialization.
101
+ *
102
+ * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
103
+ * a contract, executing them in the right order is up to the developer or operator.
104
+ */
105
+ modifier reinitializer(uint8 version) {
106
+ require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
107
+ _initialized = version;
108
+ _initializing = true;
109
+ _;
110
+ _initializing = false;
111
+ emit Initialized(version);
112
+ }
113
+
114
+ /**
115
+ * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
116
+ * {initializer} and {reinitializer} modifiers, directly or indirectly.
117
+ */
118
+ modifier onlyInitializing() {
119
+ require(_initializing, "Initializable: contract is not initializing");
120
+ _;
121
+ }
122
+
123
+ /**
124
+ * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
125
+ * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
126
+ * to any version. It is recommended to use this to lock implementation contracts that are designed to be called
127
+ * through proxies.
128
+ */
129
+ function _disableInitializers() internal virtual {
130
+ require(!_initializing, "Initializable: contract is initializing");
131
+ if (_initialized < type(uint8).max) {
132
+ _initialized = type(uint8).max;
133
+ emit Initialized(type(uint8).max);
134
+ }
135
+ }
136
+ }
@@ -0,0 +1,56 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @author thirdweb
5
+
6
+ import "./interface/ILazyMint.sol";
7
+ import "./BatchMintMetadata.sol";
8
+
9
+ /**
10
+ * The `LazyMint` is a contract extension for any base NFT contract. It lets you 'lazy mint' any number of NFTs
11
+ * at once. Here, 'lazy mint' means defining the metadata for particular tokenIds of your NFT contract, without actually
12
+ * minting a non-zero balance of NFTs of those tokenIds.
13
+ */
14
+
15
+ abstract contract LazyMint is ILazyMint, BatchMintMetadata {
16
+ /// @dev The sender is not authorized to perform the action
17
+ error LazyMintUnauthorized();
18
+ error LazyMintInvalidAmount();
19
+
20
+ /// @notice The tokenId assigned to the next new NFT to be lazy minted.
21
+ uint256 internal nextTokenIdToLazyMint;
22
+
23
+ /**
24
+ * @notice Lets an authorized address lazy mint a given amount of NFTs.
25
+ *
26
+ * @param _amount The number of NFTs to lazy mint.
27
+ * @param _baseURIForTokens The base URI for the 'n' number of NFTs being lazy minted, where the metadata for each
28
+ * of those NFTs is `${baseURIForTokens}/${tokenId}`.
29
+ * @param _data Additional bytes data to be used at the discretion of the consumer of the contract.
30
+ * @return batchId A unique integer identifier for the batch of NFTs lazy minted together.
31
+ */
32
+ function lazyMint(
33
+ uint256 _amount,
34
+ string calldata _baseURIForTokens,
35
+ bytes calldata _data
36
+ ) public virtual override returns (uint256 batchId) {
37
+ if (!_canLazyMint()) {
38
+ revert LazyMintUnauthorized();
39
+ }
40
+
41
+ if (_amount == 0) {
42
+ revert LazyMintInvalidAmount();
43
+ }
44
+
45
+ uint256 startId = nextTokenIdToLazyMint;
46
+
47
+ (nextTokenIdToLazyMint, batchId) = _batchMintMetadata(startId, _amount, _baseURIForTokens);
48
+
49
+ emit TokensLazyMinted(startId, startId + _amount - 1, _baseURIForTokens, _data);
50
+
51
+ return batchId;
52
+ }
53
+
54
+ /// @dev Returns whether lazy minting can be performed in the given execution context.
55
+ function _canLazyMint() internal view virtual returns (bool);
56
+ }
@@ -0,0 +1,112 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @author thirdweb
5
+
6
+ import "./interface/ILazyMintWithTier.sol";
7
+ import "../extension/BatchMintMetadata.sol";
8
+
9
+ /**
10
+ * The `LazyMint` is a contract extension for any base NFT contract. It lets you 'lazy mint' any number of NFTs
11
+ * at once. Here, 'lazy mint' means defining the metadata for particular tokenIds of your NFT contract, without actually
12
+ * minting a non-zero balance of NFTs of those tokenIds.
13
+ */
14
+
15
+ abstract contract LazyMintWithTier is ILazyMintWithTier, BatchMintMetadata {
16
+ struct TokenRange {
17
+ uint256 startIdInclusive;
18
+ uint256 endIdNonInclusive;
19
+ }
20
+
21
+ struct TierMetadata {
22
+ string tier;
23
+ TokenRange[] ranges;
24
+ string[] baseURIs;
25
+ }
26
+
27
+ /// @notice The tokenId assigned to the next new NFT to be lazy minted.
28
+ uint256 internal nextTokenIdToLazyMint;
29
+
30
+ /// @notice Mapping from a tier -> the token IDs grouped under that tier.
31
+ mapping(string => TokenRange[]) internal tokensInTier;
32
+
33
+ /// @notice A list of tiers used in this contract.
34
+ string[] private tiers;
35
+
36
+ /**
37
+ * @notice Lets an authorized address lazy mint a given amount of NFTs.
38
+ *
39
+ * @param _amount The number of NFTs to lazy mint.
40
+ * @param _baseURIForTokens The base URI for the 'n' number of NFTs being lazy minted, where the metadata for each
41
+ * of those NFTs is `${baseURIForTokens}/${tokenId}`.
42
+ * @param _data Additional bytes data to be used at the discretion of the consumer of the contract.
43
+ * @return batchId A unique integer identifier for the batch of NFTs lazy minted together.
44
+ */
45
+ function lazyMint(
46
+ uint256 _amount,
47
+ string calldata _baseURIForTokens,
48
+ string calldata _tier,
49
+ bytes calldata _data
50
+ ) public virtual override returns (uint256 batchId) {
51
+ if (!_canLazyMint()) {
52
+ revert("Not authorized");
53
+ }
54
+
55
+ if (_amount == 0) {
56
+ revert("0 amt");
57
+ }
58
+
59
+ uint256 startId = nextTokenIdToLazyMint;
60
+
61
+ (nextTokenIdToLazyMint, batchId) = _batchMintMetadata(startId, _amount, _baseURIForTokens);
62
+
63
+ // Handle tier info.
64
+ if (!(tokensInTier[_tier].length > 0)) {
65
+ tiers.push(_tier);
66
+ }
67
+ tokensInTier[_tier].push(TokenRange(startId, batchId));
68
+
69
+ emit TokensLazyMinted(_tier, startId, startId + _amount - 1, _baseURIForTokens, _data);
70
+
71
+ return batchId;
72
+ }
73
+
74
+ /// @notice Returns all metadata lazy minted for the given tier.
75
+ function _getMetadataInTier(
76
+ string memory _tier
77
+ ) private view returns (TokenRange[] memory tokens, string[] memory baseURIs) {
78
+ tokens = tokensInTier[_tier];
79
+
80
+ uint256 len = tokens.length;
81
+ baseURIs = new string[](len);
82
+
83
+ for (uint256 i = 0; i < len; i += 1) {
84
+ baseURIs[i] = _getBaseURI(tokens[i].startIdInclusive);
85
+ }
86
+ }
87
+
88
+ /// @notice Returns all metadata for all tiers created on the contract.
89
+ function getMetadataForAllTiers() external view returns (TierMetadata[] memory metadataForAllTiers) {
90
+ string[] memory allTiers = tiers;
91
+ uint256 len = allTiers.length;
92
+
93
+ metadataForAllTiers = new TierMetadata[](len);
94
+
95
+ for (uint256 i = 0; i < len; i += 1) {
96
+ (TokenRange[] memory tokens, string[] memory baseURIs) = _getMetadataInTier(allTiers[i]);
97
+ metadataForAllTiers[i] = TierMetadata(allTiers[i], tokens, baseURIs);
98
+ }
99
+ }
100
+
101
+ /**
102
+ * @notice Returns whether any metadata is lazy minted for the given tier.
103
+ *
104
+ * @param _tier We check whether this given tier is empty.
105
+ */
106
+ function isTierEmpty(string memory _tier) internal view returns (bool) {
107
+ return tokensInTier[_tier].length == 0;
108
+ }
109
+
110
+ /// @dev Returns whether lazy minting can be performed in the given execution context.
111
+ function _canLazyMint() internal view virtual returns (bool);
112
+ }
@@ -0,0 +1,40 @@
1
+ // SPDX-License-Identifier: Apache 2.0
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @author thirdweb
5
+
6
+ import "../lib/Address.sol";
7
+ import "./interface/IMulticall.sol";
8
+
9
+ /**
10
+ * @dev Provides a function to batch together multiple calls in a single external call.
11
+ *
12
+ * _Available since v4.1._
13
+ */
14
+ contract Multicall is IMulticall {
15
+ /**
16
+ * @notice Receives and executes a batch of function calls on this contract.
17
+ * @dev Receives and executes a batch of function calls on this contract.
18
+ *
19
+ * @param data The bytes data that makes up the batch of function calls to execute.
20
+ * @return results The bytes data that makes up the result of the batch of function calls executed.
21
+ */
22
+ function multicall(bytes[] calldata data) external returns (bytes[] memory results) {
23
+ results = new bytes[](data.length);
24
+ address sender = _msgSender();
25
+ bool isForwarder = msg.sender != sender;
26
+ for (uint256 i = 0; i < data.length; i++) {
27
+ if (isForwarder) {
28
+ results[i] = Address.functionDelegateCall(address(this), abi.encodePacked(data[i], sender));
29
+ } else {
30
+ results[i] = Address.functionDelegateCall(address(this), data[i]);
31
+ }
32
+ }
33
+ return results;
34
+ }
35
+
36
+ /// @notice Returns the sender in the given execution context.
37
+ function _msgSender() internal view virtual returns (address) {
38
+ return msg.sender;
39
+ }
40
+ }
@@ -0,0 +1,58 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.0;
3
+
4
+ import "./interface/INFTMetadata.sol";
5
+
6
+ abstract contract NFTMetadata is INFTMetadata {
7
+ /// @dev The sender is not authorized to perform the action
8
+ error NFTMetadataUnauthorized();
9
+
10
+ /// @dev Invalid token metadata url
11
+ error NFTMetadataInvalidUrl();
12
+
13
+ /// @dev the nft metadata is frozen
14
+ error NFTMetadataFrozen(uint256 tokenId);
15
+
16
+ bool public uriFrozen;
17
+
18
+ mapping(uint256 => string) internal _tokenURI;
19
+
20
+ /// @notice Returns the metadata URI for a given NFT.
21
+ function _getTokenURI(uint256 _tokenId) internal view virtual returns (string memory) {
22
+ return _tokenURI[_tokenId];
23
+ }
24
+
25
+ /// @notice Sets the metadata URI for a given NFT.
26
+ function _setTokenURI(uint256 _tokenId, string memory _uri) internal virtual {
27
+ if (bytes(_uri).length == 0) {
28
+ revert NFTMetadataInvalidUrl();
29
+ }
30
+ _tokenURI[_tokenId] = _uri;
31
+
32
+ emit MetadataUpdate(_tokenId);
33
+ }
34
+
35
+ /// @notice Sets the metadata URI for a given NFT.
36
+ function setTokenURI(uint256 _tokenId, string memory _uri) public virtual {
37
+ if (!_canSetMetadata()) {
38
+ revert NFTMetadataUnauthorized();
39
+ }
40
+ if (uriFrozen) {
41
+ revert NFTMetadataFrozen(_tokenId);
42
+ }
43
+ _setTokenURI(_tokenId, _uri);
44
+ }
45
+
46
+ function freezeMetadata() public virtual {
47
+ if (!_canFreezeMetadata()) {
48
+ revert NFTMetadataUnauthorized();
49
+ }
50
+ uriFrozen = true;
51
+ emit MetadataFrozen();
52
+ }
53
+
54
+ /// @dev Returns whether metadata can be set in the given execution context.
55
+ function _canSetMetadata() internal view virtual returns (bool);
56
+
57
+ function _canFreezeMetadata() internal view virtual returns (bool);
58
+ }
@@ -0,0 +1,22 @@
1
+ // SPDX-License-Identifier: Apache 2.0
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @author thirdweb
5
+
6
+ import "./interface/IOperatorFilterToggle.sol";
7
+
8
+ abstract contract OperatorFilterToggle is IOperatorFilterToggle {
9
+ bool public operatorRestriction;
10
+
11
+ function setOperatorRestriction(bool _restriction) external {
12
+ require(_canSetOperatorRestriction(), "Not authorized to set operator restriction.");
13
+ _setOperatorRestriction(_restriction);
14
+ }
15
+
16
+ function _setOperatorRestriction(bool _restriction) internal {
17
+ operatorRestriction = _restriction;
18
+ emit OperatorRestriction(_restriction);
19
+ }
20
+
21
+ function _canSetOperatorRestriction() internal virtual returns (bool);
22
+ }