@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,576 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.11;
3
+
4
+ /// @author thirdweb
5
+
6
+ // $$\ $$\ $$\ $$\ $$\
7
+ // $$ | $$ | \__| $$ | $$ |
8
+ // $$$$$$\ $$$$$$$\ $$\ $$$$$$\ $$$$$$$ |$$\ $$\ $$\ $$$$$$\ $$$$$$$\
9
+ // \_$$ _| $$ __$$\ $$ |$$ __$$\ $$ __$$ |$$ | $$ | $$ |$$ __$$\ $$ __$$\
10
+ // $$ | $$ | $$ |$$ |$$ | \__|$$ / $$ |$$ | $$ | $$ |$$$$$$$$ |$$ | $$ |
11
+ // $$ |$$\ $$ | $$ |$$ |$$ | $$ | $$ |$$ | $$ | $$ |$$ ____|$$ | $$ |
12
+ // \$$$$ |$$ | $$ |$$ |$$ | \$$$$$$$ |\$$$$$\$$$$ |\$$$$$$$\ $$$$$$$ |
13
+ // \____/ \__| \__|\__|\__| \_______| \_____\____/ \_______|\_______/
14
+
15
+ // Interface
16
+ import { ITokenERC1155 } from "../interface/token/ITokenERC1155.sol";
17
+
18
+ import "../../infra/interface/IThirdwebContract.sol";
19
+ import "../../extension/interface/IPlatformFee.sol";
20
+ import "../../extension/interface/IPrimarySale.sol";
21
+ import "../../extension/interface/IRoyalty.sol";
22
+ import "../../extension/interface/IOwnable.sol";
23
+
24
+ import "../../extension/NFTMetadata.sol";
25
+
26
+ // Token
27
+ import "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol";
28
+
29
+ // Signature utils
30
+ import "@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol";
31
+ import "@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol";
32
+
33
+ // Access Control + security
34
+ import "@openzeppelin/contracts-upgradeable/access/AccessControlEnumerableUpgradeable.sol";
35
+ import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol";
36
+
37
+ // Utils
38
+ import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol";
39
+ import "../../extension/Multicall.sol";
40
+ import "../../lib/CurrencyTransferLib.sol";
41
+ import "../../lib/FeeType.sol";
42
+ import "../../external-deps/openzeppelin/metatx/ERC2771ContextUpgradeable.sol";
43
+
44
+ // Helper interfaces
45
+ import "@openzeppelin/contracts-upgradeable/interfaces/IERC2981Upgradeable.sol";
46
+
47
+ contract TokenERC1155 is
48
+ Initializable,
49
+ IThirdwebContract,
50
+ IOwnable,
51
+ IRoyalty,
52
+ IPrimarySale,
53
+ IPlatformFee,
54
+ EIP712Upgradeable,
55
+ ReentrancyGuardUpgradeable,
56
+ ERC2771ContextUpgradeable,
57
+ Multicall,
58
+ AccessControlEnumerableUpgradeable,
59
+ ERC1155Upgradeable,
60
+ ITokenERC1155,
61
+ NFTMetadata
62
+ {
63
+ using ECDSAUpgradeable for bytes32;
64
+ using StringsUpgradeable for uint256;
65
+
66
+ bytes32 private constant MODULE_TYPE = bytes32("TokenERC1155");
67
+ uint256 private constant VERSION = 1;
68
+
69
+ address public constant DEFAULT_FEE_RECIPIENT = 0x1Af20C6B23373350aD464700B5965CE4B0D2aD94;
70
+ uint16 private constant DEFAULT_FEE_BPS = 100;
71
+
72
+ // Token name
73
+ string public name;
74
+
75
+ // Token symbol
76
+ string public symbol;
77
+
78
+ bytes32 private constant TYPEHASH =
79
+ keccak256(
80
+ "MintRequest(address to,address royaltyRecipient,uint256 royaltyBps,address primarySaleRecipient,uint256 tokenId,string uri,uint256 quantity,uint256 pricePerToken,address currency,uint128 validityStartTimestamp,uint128 validityEndTimestamp,bytes32 uid)"
81
+ );
82
+
83
+ /// @dev Only TRANSFER_ROLE holders can have tokens transferred from or to them, during restricted transfers.
84
+ bytes32 private constant TRANSFER_ROLE = keccak256("TRANSFER_ROLE");
85
+ /// @dev Only MINTER_ROLE holders can sign off on `MintRequest`s.
86
+ bytes32 private constant MINTER_ROLE = keccak256("MINTER_ROLE");
87
+ /// @dev Only METADATA_ROLE holders can update NFT metadata.
88
+ bytes32 private constant METADATA_ROLE = keccak256("METADATA_ROLE");
89
+
90
+ /// @dev Max bps in the thirdweb system
91
+ uint256 private constant MAX_BPS = 10_000;
92
+
93
+ /// @dev Owner of the contract (purpose: OpenSea compatibility, etc.)
94
+ address private _owner;
95
+
96
+ /// @dev The next token ID of the NFT to mint.
97
+ uint256 public nextTokenIdToMint;
98
+
99
+ /// @dev The adress that receives all primary sales value.
100
+ address public primarySaleRecipient;
101
+
102
+ /// @dev The adress that receives all primary sales value.
103
+ address public platformFeeRecipient;
104
+
105
+ /// @dev The recipient of who gets the royalty.
106
+ address private royaltyRecipient;
107
+
108
+ /// @dev The percentage of royalty how much royalty in basis points.
109
+ uint128 private royaltyBps;
110
+
111
+ /// @dev The % of primary sales collected by the contract as fees.
112
+ uint128 private platformFeeBps;
113
+
114
+ /// @dev The flat amount collected by the contract as fees on primary sales.
115
+ uint256 private flatPlatformFee;
116
+
117
+ /// @dev Fee type variants: percentage fee and flat fee
118
+ PlatformFeeType private platformFeeType;
119
+
120
+ /// @dev Contract level metadata.
121
+ string public contractURI;
122
+
123
+ /// @dev Mapping from mint request UID => whether the mint request is processed.
124
+ mapping(bytes32 => bool) private minted;
125
+
126
+ /// @dev Token ID => total circulating supply of tokens with that ID.
127
+ mapping(uint256 => uint256) public totalSupply;
128
+
129
+ /// @dev Token ID => the address of the recipient of primary sales.
130
+ mapping(uint256 => address) public saleRecipientForToken;
131
+
132
+ /// @dev Token ID => royalty recipient and bps for token
133
+ mapping(uint256 => RoyaltyInfo) private royaltyInfoForToken;
134
+
135
+ constructor() initializer {}
136
+
137
+ /// @dev Initializes the contract, like a constructor.
138
+ function initialize(
139
+ address _defaultAdmin,
140
+ string memory _name,
141
+ string memory _symbol,
142
+ string memory _contractURI,
143
+ address[] memory _trustedForwarders,
144
+ address _primarySaleRecipient,
145
+ address _royaltyRecipient,
146
+ uint128 _royaltyBps,
147
+ uint128 _platformFeeBps,
148
+ address _platformFeeRecipient
149
+ ) external initializer {
150
+ // Initialize inherited contracts, most base-like -> most derived.
151
+ __ReentrancyGuard_init();
152
+ __EIP712_init("TokenERC1155", "1");
153
+ __ERC2771Context_init(_trustedForwarders);
154
+ __ERC1155_init("");
155
+
156
+ // Initialize this contract's state.
157
+ name = _name;
158
+ symbol = _symbol;
159
+ royaltyRecipient = _royaltyRecipient;
160
+ royaltyBps = _royaltyBps;
161
+ platformFeeRecipient = _platformFeeRecipient;
162
+ primarySaleRecipient = _primarySaleRecipient;
163
+ contractURI = _contractURI;
164
+
165
+ require(_platformFeeBps <= MAX_BPS, "exceeds MAX_BPS");
166
+ platformFeeBps = _platformFeeBps;
167
+
168
+ // Fee type Bps by default
169
+ platformFeeType = PlatformFeeType.Bps;
170
+
171
+ _owner = _defaultAdmin;
172
+ _setupRole(DEFAULT_ADMIN_ROLE, _defaultAdmin);
173
+ _setupRole(MINTER_ROLE, _defaultAdmin);
174
+ _setupRole(TRANSFER_ROLE, _defaultAdmin);
175
+ _setupRole(TRANSFER_ROLE, address(0));
176
+
177
+ _setupRole(METADATA_ROLE, _defaultAdmin);
178
+ _setRoleAdmin(METADATA_ROLE, METADATA_ROLE);
179
+
180
+ emit PrimarySaleRecipientUpdated(_primarySaleRecipient);
181
+ emit PlatformFeeInfoUpdated(_platformFeeRecipient, _platformFeeBps);
182
+ emit DefaultRoyalty(_royaltyRecipient, _royaltyBps);
183
+ }
184
+
185
+ /// ===== Public functions =====
186
+
187
+ /// @dev Returns the module type of the contract.
188
+ function contractType() external pure returns (bytes32) {
189
+ return MODULE_TYPE;
190
+ }
191
+
192
+ /// @dev Returns the version of the contract.
193
+ function contractVersion() external pure returns (uint8) {
194
+ return uint8(VERSION);
195
+ }
196
+
197
+ /**
198
+ * @dev Returns the address of the current owner.
199
+ */
200
+ function owner() public view returns (address) {
201
+ return hasRole(DEFAULT_ADMIN_ROLE, _owner) ? _owner : address(0);
202
+ }
203
+
204
+ /// @dev Verifies that a mint request is signed by an account holding MINTER_ROLE (at the time of the function call).
205
+ function verify(MintRequest calldata _req, bytes calldata _signature) public view returns (bool, address) {
206
+ address signer = recoverAddress(_req, _signature);
207
+ return (!minted[_req.uid] && hasRole(MINTER_ROLE, signer), signer);
208
+ }
209
+
210
+ /// @dev Returns the URI for a tokenId
211
+ function uri(uint256 _tokenId) public view override returns (string memory) {
212
+ return _tokenURI[_tokenId];
213
+ }
214
+
215
+ /// @dev Lets an account with MINTER_ROLE mint an NFT.
216
+ function mintTo(
217
+ address _to,
218
+ uint256 _tokenId,
219
+ string calldata _uri,
220
+ uint256 _amount
221
+ ) external nonReentrant onlyRole(MINTER_ROLE) {
222
+ uint256 tokenIdToMint;
223
+ if (_tokenId == type(uint256).max) {
224
+ tokenIdToMint = nextTokenIdToMint;
225
+ nextTokenIdToMint += 1;
226
+ } else {
227
+ require(_tokenId < nextTokenIdToMint, "invalid id");
228
+ tokenIdToMint = _tokenId;
229
+ }
230
+
231
+ // `_mintTo` is re-used. `mintTo` just adds a minter role check.
232
+ _mintTo(_to, _uri, tokenIdToMint, _amount);
233
+ }
234
+
235
+ /// ===== External functions =====
236
+
237
+ /// @dev See EIP-2981
238
+ function royaltyInfo(
239
+ uint256 tokenId,
240
+ uint256 salePrice
241
+ ) external view virtual returns (address receiver, uint256 royaltyAmount) {
242
+ (address recipient, uint256 bps) = getRoyaltyInfoForToken(tokenId);
243
+ receiver = recipient;
244
+ royaltyAmount = (salePrice * bps) / MAX_BPS;
245
+ }
246
+
247
+ /// @dev Mints an NFT according to the provided mint request.
248
+ function mintWithSignature(MintRequest calldata _req, bytes calldata _signature) external payable nonReentrant {
249
+ address signer = verifyRequest(_req, _signature);
250
+ address receiver = _req.to;
251
+
252
+ uint256 tokenIdToMint;
253
+ if (_req.tokenId == type(uint256).max) {
254
+ tokenIdToMint = nextTokenIdToMint;
255
+ nextTokenIdToMint += 1;
256
+ } else {
257
+ require(_req.tokenId < nextTokenIdToMint, "invalid id");
258
+ tokenIdToMint = _req.tokenId;
259
+ }
260
+
261
+ if (_req.royaltyRecipient != address(0)) {
262
+ royaltyInfoForToken[tokenIdToMint] = RoyaltyInfo({
263
+ recipient: _req.royaltyRecipient,
264
+ bps: _req.royaltyBps
265
+ });
266
+ }
267
+
268
+ _mintTo(receiver, _req.uri, tokenIdToMint, _req.quantity);
269
+
270
+ collectPrice(_req);
271
+
272
+ emit TokensMintedWithSignature(signer, receiver, tokenIdToMint, _req);
273
+ }
274
+
275
+ // ===== Setter functions =====
276
+
277
+ /// @dev Lets a module admin set the default recipient of all primary sales.
278
+ function setPrimarySaleRecipient(address _saleRecipient) external onlyRole(DEFAULT_ADMIN_ROLE) {
279
+ primarySaleRecipient = _saleRecipient;
280
+ emit PrimarySaleRecipientUpdated(_saleRecipient);
281
+ }
282
+
283
+ /// @dev Lets a module admin update the royalty bps and recipient.
284
+ function setDefaultRoyaltyInfo(
285
+ address _royaltyRecipient,
286
+ uint256 _royaltyBps
287
+ ) external onlyRole(DEFAULT_ADMIN_ROLE) {
288
+ require(_royaltyBps <= MAX_BPS, "exceed royalty bps");
289
+
290
+ royaltyRecipient = _royaltyRecipient;
291
+ royaltyBps = uint128(_royaltyBps);
292
+
293
+ emit DefaultRoyalty(_royaltyRecipient, _royaltyBps);
294
+ }
295
+
296
+ /// @dev Lets a module admin set the royalty recipient for a particular token Id.
297
+ function setRoyaltyInfoForToken(
298
+ uint256 _tokenId,
299
+ address _recipient,
300
+ uint256 _bps
301
+ ) external onlyRole(DEFAULT_ADMIN_ROLE) {
302
+ require(_bps <= MAX_BPS, "exceed royalty bps");
303
+
304
+ royaltyInfoForToken[_tokenId] = RoyaltyInfo({ recipient: _recipient, bps: _bps });
305
+
306
+ emit RoyaltyForToken(_tokenId, _recipient, _bps);
307
+ }
308
+
309
+ /// @dev Lets a module admin update the fees on primary sales.
310
+ function setPlatformFeeInfo(
311
+ address _platformFeeRecipient,
312
+ uint256 _platformFeeBps
313
+ ) external onlyRole(DEFAULT_ADMIN_ROLE) {
314
+ require(_platformFeeBps <= MAX_BPS, "exceeds MAX_BPS");
315
+
316
+ platformFeeBps = uint64(_platformFeeBps);
317
+ platformFeeRecipient = _platformFeeRecipient;
318
+
319
+ emit PlatformFeeInfoUpdated(_platformFeeRecipient, _platformFeeBps);
320
+ }
321
+
322
+ /// @dev Lets a module admin set a flat fee on primary sales.
323
+ function setFlatPlatformFeeInfo(
324
+ address _platformFeeRecipient,
325
+ uint256 _flatFee
326
+ ) external onlyRole(DEFAULT_ADMIN_ROLE) {
327
+ flatPlatformFee = _flatFee;
328
+ platformFeeRecipient = _platformFeeRecipient;
329
+
330
+ emit FlatPlatformFeeUpdated(_platformFeeRecipient, _flatFee);
331
+ }
332
+
333
+ /// @dev Lets a module admin set a flat fee on primary sales.
334
+ function setPlatformFeeType(PlatformFeeType _feeType) external onlyRole(DEFAULT_ADMIN_ROLE) {
335
+ platformFeeType = _feeType;
336
+
337
+ emit PlatformFeeTypeUpdated(_feeType);
338
+ }
339
+
340
+ /// @dev Lets a module admin set a new owner for the contract. The new owner must be a module admin.
341
+ function setOwner(address _newOwner) external onlyRole(DEFAULT_ADMIN_ROLE) {
342
+ require(hasRole(DEFAULT_ADMIN_ROLE, _newOwner), "new owner not module admin.");
343
+ address _prevOwner = _owner;
344
+ _owner = _newOwner;
345
+
346
+ emit OwnerUpdated(_prevOwner, _newOwner);
347
+ }
348
+
349
+ /// @dev Lets a module admin set the URI for contract-level metadata.
350
+ function setContractURI(string calldata _uri) external onlyRole(DEFAULT_ADMIN_ROLE) {
351
+ contractURI = _uri;
352
+ }
353
+
354
+ /// ===== Getter functions =====
355
+
356
+ /// @dev Returns the platform fee bps and recipient.
357
+ function getPlatformFeeInfo() external view returns (address, uint16) {
358
+ return (platformFeeRecipient, uint16(platformFeeBps));
359
+ }
360
+
361
+ /// @dev Returns the flat platform fee and recipient.
362
+ function getFlatPlatformFeeInfo() external view returns (address, uint256) {
363
+ return (platformFeeRecipient, flatPlatformFee);
364
+ }
365
+
366
+ /// @dev Returns the platform fee type.
367
+ function getPlatformFeeType() external view returns (PlatformFeeType) {
368
+ return platformFeeType;
369
+ }
370
+
371
+ /// @dev Returns default royalty info.
372
+ function getDefaultRoyaltyInfo() external view returns (address, uint16) {
373
+ return (royaltyRecipient, uint16(royaltyBps));
374
+ }
375
+
376
+ /// @dev Returns the royalty recipient for a particular token Id.
377
+ function getRoyaltyInfoForToken(uint256 _tokenId) public view returns (address, uint16) {
378
+ RoyaltyInfo memory royaltyForToken = royaltyInfoForToken[_tokenId];
379
+
380
+ return
381
+ royaltyForToken.recipient == address(0)
382
+ ? (royaltyRecipient, uint16(royaltyBps))
383
+ : (royaltyForToken.recipient, uint16(royaltyForToken.bps));
384
+ }
385
+
386
+ /// ===== Internal functions =====
387
+
388
+ /// @dev Mints an NFT to `to`
389
+ function _mintTo(address _to, string calldata _uri, uint256 _tokenId, uint256 _amount) internal {
390
+ if (bytes(_tokenURI[_tokenId]).length == 0) {
391
+ _setTokenURI(_tokenId, _uri);
392
+ }
393
+
394
+ _mint(_to, _tokenId, _amount, "");
395
+
396
+ emit TokensMinted(_to, _tokenId, _tokenURI[_tokenId], _amount);
397
+ }
398
+
399
+ /// @dev Returns the address of the signer of the mint request.
400
+ function recoverAddress(MintRequest calldata _req, bytes calldata _signature) internal view returns (address) {
401
+ return _hashTypedDataV4(keccak256(_encodeRequest(_req))).recover(_signature);
402
+ }
403
+
404
+ /// @dev Resolves 'stack too deep' error in `recoverAddress`.
405
+ function _encodeRequest(MintRequest calldata _req) internal pure returns (bytes memory) {
406
+ return
407
+ bytes.concat(
408
+ abi.encode(
409
+ TYPEHASH,
410
+ _req.to,
411
+ _req.royaltyRecipient,
412
+ _req.royaltyBps,
413
+ _req.primarySaleRecipient,
414
+ _req.tokenId,
415
+ keccak256(bytes(_req.uri))
416
+ ),
417
+ abi.encode(
418
+ _req.quantity,
419
+ _req.pricePerToken,
420
+ _req.currency,
421
+ _req.validityStartTimestamp,
422
+ _req.validityEndTimestamp,
423
+ _req.uid
424
+ )
425
+ );
426
+ }
427
+
428
+ /// @dev Verifies that a mint request is valid.
429
+ function verifyRequest(MintRequest calldata _req, bytes calldata _signature) internal returns (address) {
430
+ (bool success, address signer) = verify(_req, _signature);
431
+ require(success, "invalid signature");
432
+
433
+ require(
434
+ _req.validityStartTimestamp <= block.timestamp && _req.validityEndTimestamp >= block.timestamp,
435
+ "request expired"
436
+ );
437
+ require(_req.to != address(0), "recipient undefined");
438
+ require(_req.quantity > 0, "zero quantity");
439
+
440
+ minted[_req.uid] = true;
441
+
442
+ return signer;
443
+ }
444
+
445
+ /// @dev Collects and distributes the primary sale value of tokens being claimed.
446
+ function collectPrice(MintRequest calldata _req) internal {
447
+ if (_req.pricePerToken == 0) {
448
+ require(msg.value == 0, "!Value");
449
+ return;
450
+ }
451
+
452
+ uint256 totalPrice = _req.pricePerToken * _req.quantity;
453
+ uint256 platformFeesTw = (totalPrice * DEFAULT_FEE_BPS) / MAX_BPS;
454
+ uint256 platformFees = platformFeeType == PlatformFeeType.Flat
455
+ ? flatPlatformFee
456
+ : ((totalPrice * platformFeeBps) / MAX_BPS);
457
+ require(totalPrice >= platformFees + platformFeesTw, "price less than platform fee");
458
+
459
+ if (_req.currency == CurrencyTransferLib.NATIVE_TOKEN) {
460
+ require(msg.value == totalPrice, "must send total price.");
461
+ } else {
462
+ require(msg.value == 0, "msg value not zero");
463
+ }
464
+
465
+ address saleRecipient = _req.primarySaleRecipient == address(0)
466
+ ? primarySaleRecipient
467
+ : _req.primarySaleRecipient;
468
+
469
+ CurrencyTransferLib.transferCurrency(_req.currency, _msgSender(), DEFAULT_FEE_RECIPIENT, platformFeesTw);
470
+ CurrencyTransferLib.transferCurrency(_req.currency, _msgSender(), platformFeeRecipient, platformFees);
471
+ CurrencyTransferLib.transferCurrency(
472
+ _req.currency,
473
+ _msgSender(),
474
+ saleRecipient,
475
+ totalPrice - platformFees - platformFeesTw
476
+ );
477
+ }
478
+
479
+ /// ===== Low-level overrides =====
480
+
481
+ /// @dev Lets a token owner burn the tokens they own (i.e. destroy for good)
482
+ function burn(address account, uint256 id, uint256 value) public virtual {
483
+ require(
484
+ account == _msgSender() || isApprovedForAll(account, _msgSender()),
485
+ "ERC1155: caller is not owner nor approved."
486
+ );
487
+
488
+ _burn(account, id, value);
489
+ }
490
+
491
+ /// @dev Lets a token owner burn multiple tokens they own at once (i.e. destroy for good)
492
+ function burnBatch(address account, uint256[] memory ids, uint256[] memory values) public virtual {
493
+ require(
494
+ account == _msgSender() || isApprovedForAll(account, _msgSender()),
495
+ "ERC1155: caller is not owner nor approved."
496
+ );
497
+
498
+ _burnBatch(account, ids, values);
499
+ }
500
+
501
+ /**
502
+ * @dev See {ERC1155-_beforeTokenTransfer}.
503
+ */
504
+ function _beforeTokenTransfer(
505
+ address operator,
506
+ address from,
507
+ address to,
508
+ uint256[] memory ids,
509
+ uint256[] memory amounts,
510
+ bytes memory data
511
+ ) internal virtual override {
512
+ super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
513
+
514
+ // if transfer is restricted on the contract, we still want to allow burning and minting
515
+ if (!hasRole(TRANSFER_ROLE, address(0)) && from != address(0) && to != address(0)) {
516
+ require(hasRole(TRANSFER_ROLE, from) || hasRole(TRANSFER_ROLE, to), "restricted to TRANSFER_ROLE holders.");
517
+ }
518
+
519
+ if (from == address(0)) {
520
+ for (uint256 i = 0; i < ids.length; ++i) {
521
+ totalSupply[ids[i]] += amounts[i];
522
+ }
523
+ }
524
+
525
+ if (to == address(0)) {
526
+ for (uint256 i = 0; i < ids.length; ++i) {
527
+ totalSupply[ids[i]] -= amounts[i];
528
+ }
529
+ }
530
+ }
531
+
532
+ function supportsInterface(
533
+ bytes4 interfaceId
534
+ )
535
+ public
536
+ view
537
+ virtual
538
+ override(AccessControlEnumerableUpgradeable, ERC1155Upgradeable, IERC165Upgradeable, IERC165)
539
+ returns (bool)
540
+ {
541
+ return
542
+ super.supportsInterface(interfaceId) ||
543
+ interfaceId == type(IERC1155Upgradeable).interfaceId ||
544
+ interfaceId == type(IERC2981Upgradeable).interfaceId;
545
+ }
546
+
547
+ /// @dev Returns whether metadata can be set in the given execution context.
548
+ function _canSetMetadata() internal view virtual override returns (bool) {
549
+ return hasRole(METADATA_ROLE, _msgSender());
550
+ }
551
+
552
+ /// @dev Returns whether metadata can be frozen in the given execution context.
553
+ function _canFreezeMetadata() internal view virtual override returns (bool) {
554
+ return hasRole(METADATA_ROLE, _msgSender());
555
+ }
556
+
557
+ function _msgSender()
558
+ internal
559
+ view
560
+ virtual
561
+ override(ContextUpgradeable, ERC2771ContextUpgradeable, Multicall)
562
+ returns (address sender)
563
+ {
564
+ return ERC2771ContextUpgradeable._msgSender();
565
+ }
566
+
567
+ function _msgData()
568
+ internal
569
+ view
570
+ virtual
571
+ override(ContextUpgradeable, ERC2771ContextUpgradeable)
572
+ returns (bytes calldata)
573
+ {
574
+ return ERC2771ContextUpgradeable._msgData();
575
+ }
576
+ }