@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,270 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @author thirdweb
5
+
6
+ import "../interface/plugin/IRouter.sol";
7
+ import "../Multicall.sol";
8
+ import "../../eip/ERC165.sol";
9
+ import "../../external-deps/openzeppelin/utils/EnumerableSet.sol";
10
+
11
+ /**
12
+ * @author thirdweb.com
13
+ */
14
+ library RouterStorage {
15
+ /// @custom:storage-location erc7201:router.storage
16
+ /// @dev keccak256(abi.encode(uint256(keccak256("router.storage")) - 1)) & ~bytes32(uint256(0xff))
17
+ bytes32 public constant ROUTER_STORAGE_POSITION =
18
+ 0x012ef321094c8c682aa635dfdfcd754624a7473f08ad6ac415bb7f35eb12a100;
19
+
20
+ struct Data {
21
+ EnumerableSet.Bytes32Set allSelectors;
22
+ mapping(address => EnumerableSet.Bytes32Set) selectorsForPlugin;
23
+ mapping(bytes4 => IPluginMap.Plugin) pluginForSelector;
24
+ }
25
+
26
+ function routerStorage() internal pure returns (Data storage routerData) {
27
+ bytes32 position = ROUTER_STORAGE_POSITION;
28
+ assembly {
29
+ routerData.slot := position
30
+ }
31
+ }
32
+ }
33
+
34
+ abstract contract Router is Multicall, ERC165, IRouter {
35
+ using EnumerableSet for EnumerableSet.Bytes32Set;
36
+ /*///////////////////////////////////////////////////////////////
37
+ State variables
38
+ //////////////////////////////////////////////////////////////*/
39
+
40
+ address public immutable pluginMap;
41
+
42
+ /*///////////////////////////////////////////////////////////////
43
+ Constructor + initializer logic
44
+ //////////////////////////////////////////////////////////////*/
45
+
46
+ constructor(address _pluginMap) {
47
+ pluginMap = _pluginMap;
48
+ }
49
+
50
+ /*///////////////////////////////////////////////////////////////
51
+ ERC 165
52
+ //////////////////////////////////////////////////////////////*/
53
+
54
+ /**
55
+ * @dev See {IERC165-supportsInterface}.
56
+ */
57
+ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
58
+ return interfaceId == type(IRouter).interfaceId || super.supportsInterface(interfaceId);
59
+ }
60
+
61
+ /*///////////////////////////////////////////////////////////////
62
+ Generic contract logic
63
+ //////////////////////////////////////////////////////////////*/
64
+
65
+ fallback() external payable virtual {
66
+ address _pluginAddress = _getPluginForFunction(msg.sig);
67
+ if (_pluginAddress == address(0)) {
68
+ _pluginAddress = IPluginMap(pluginMap).getPluginForFunction(msg.sig);
69
+ }
70
+ _delegate(_pluginAddress);
71
+ }
72
+
73
+ receive() external payable {}
74
+
75
+ function _delegate(address implementation) internal virtual {
76
+ assembly {
77
+ // Copy msg.data. We take full control of memory in this inline assembly
78
+ // block because it will not return to Solidity code. We overwrite the
79
+ // Solidity scratch pad at memory position 0.
80
+ calldatacopy(0, 0, calldatasize())
81
+
82
+ // Call the implementation.
83
+ // out and outsize are 0 because we don't know the size yet.
84
+ let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
85
+
86
+ // Copy the returned data.
87
+ returndatacopy(0, 0, returndatasize())
88
+
89
+ switch result
90
+ // delegatecall returns 0 on error.
91
+ case 0 {
92
+ revert(0, returndatasize())
93
+ }
94
+ default {
95
+ return(0, returndatasize())
96
+ }
97
+ }
98
+ }
99
+
100
+ /*///////////////////////////////////////////////////////////////
101
+ External functions
102
+ //////////////////////////////////////////////////////////////*/
103
+
104
+ /// @dev Add functionality to the contract.
105
+ function addPlugin(Plugin memory _plugin) external {
106
+ require(_canSetPlugin(), "Router: Not authorized");
107
+
108
+ _addPlugin(_plugin);
109
+ }
110
+
111
+ /// @dev Update or override existing functionality.
112
+ function updatePlugin(Plugin memory _plugin) external {
113
+ require(_canSetPlugin(), "Map: Not authorized");
114
+
115
+ _updatePlugin(_plugin);
116
+ }
117
+
118
+ /// @dev Remove existing functionality from the contract.
119
+ function removePlugin(bytes4 _selector) external {
120
+ require(_canSetPlugin(), "Map: Not authorized");
121
+
122
+ _removePlugin(_selector);
123
+ }
124
+
125
+ /*///////////////////////////////////////////////////////////////
126
+ View functions
127
+ //////////////////////////////////////////////////////////////*/
128
+
129
+ /// @dev View address of the plugged-in functionality contract for a given function signature.
130
+ function getPluginForFunction(bytes4 _selector) public view returns (address) {
131
+ address pluginAddress = _getPluginForFunction(_selector);
132
+
133
+ return pluginAddress != address(0) ? pluginAddress : IPluginMap(pluginMap).getPluginForFunction(_selector);
134
+ }
135
+
136
+ /// @dev View all funtionality as list of function signatures.
137
+ function getAllFunctionsOfPlugin(address _pluginAddress) external view returns (bytes4[] memory registered) {
138
+ RouterStorage.Data storage data = RouterStorage.routerStorage();
139
+
140
+ EnumerableSet.Bytes32Set storage selectorsForPlugin = data.selectorsForPlugin[_pluginAddress];
141
+ bytes4[] memory defaultSelectors = IPluginMap(pluginMap).getAllFunctionsOfPlugin(_pluginAddress);
142
+
143
+ uint256 len = defaultSelectors.length;
144
+ uint256 count = selectorsForPlugin.length() + defaultSelectors.length;
145
+
146
+ for (uint256 i = 0; i < len; i += 1) {
147
+ if (selectorsForPlugin.contains(defaultSelectors[i])) {
148
+ count -= 1;
149
+ defaultSelectors[i] = bytes4(0);
150
+ }
151
+ }
152
+
153
+ registered = new bytes4[](count);
154
+ uint256 index;
155
+
156
+ for (uint256 i = 0; i < len; i += 1) {
157
+ if (defaultSelectors[i] != bytes4(0)) {
158
+ registered[index++] = defaultSelectors[i];
159
+ }
160
+ }
161
+
162
+ len = selectorsForPlugin.length();
163
+ for (uint256 i = 0; i < len; i += 1) {
164
+ registered[index++] = bytes4(data.selectorsForPlugin[_pluginAddress].at(i));
165
+ }
166
+ }
167
+
168
+ /// @dev View all funtionality existing on the contract.
169
+ function getAllPlugins() external view returns (Plugin[] memory registered) {
170
+ RouterStorage.Data storage data = RouterStorage.routerStorage();
171
+
172
+ EnumerableSet.Bytes32Set storage overrideSelectors = data.allSelectors;
173
+ Plugin[] memory defaultPlugins = IPluginMap(pluginMap).getAllPlugins();
174
+
175
+ uint256 overrideSelectorsLen = overrideSelectors.length();
176
+ uint256 defaultPluginsLen = defaultPlugins.length;
177
+
178
+ uint256 totalCount = overrideSelectorsLen + defaultPluginsLen;
179
+
180
+ for (uint256 i = 0; i < overrideSelectorsLen; i += 1) {
181
+ for (uint256 j = 0; j < defaultPluginsLen; j += 1) {
182
+ if (bytes4(overrideSelectors.at(i)) == defaultPlugins[j].functionSelector) {
183
+ totalCount -= 1;
184
+ defaultPlugins[j].functionSelector = bytes4(0);
185
+ }
186
+ }
187
+ }
188
+
189
+ registered = new Plugin[](totalCount);
190
+ uint256 index;
191
+
192
+ for (uint256 i = 0; i < defaultPluginsLen; i += 1) {
193
+ if (defaultPlugins[i].functionSelector != bytes4(0)) {
194
+ registered[index] = defaultPlugins[i];
195
+ index += 1;
196
+ }
197
+ }
198
+
199
+ for (uint256 i = 0; i < overrideSelectorsLen; i += 1) {
200
+ registered[index] = data.pluginForSelector[bytes4(overrideSelectors.at(i))];
201
+ index += 1;
202
+ }
203
+ }
204
+
205
+ /*///////////////////////////////////////////////////////////////
206
+ Internal functions
207
+ //////////////////////////////////////////////////////////////*/
208
+
209
+ /// @dev View address of the plugged-in functionality contract for a given function signature.
210
+ function _getPluginForFunction(bytes4 _selector) public view returns (address) {
211
+ RouterStorage.Data storage data = RouterStorage.routerStorage();
212
+ address _pluginAddress = data.pluginForSelector[_selector].pluginAddress;
213
+
214
+ return _pluginAddress;
215
+ }
216
+
217
+ /// @dev Add functionality to the contract.
218
+ function _addPlugin(Plugin memory _plugin) internal {
219
+ RouterStorage.Data storage data = RouterStorage.routerStorage();
220
+
221
+ // Revert: default plugin exists for function; use updatePlugin instead.
222
+ try IPluginMap(pluginMap).getPluginForFunction(_plugin.functionSelector) returns (address) {
223
+ revert("Router: default plugin exists for function.");
224
+ } catch {
225
+ require(data.allSelectors.add(bytes32(_plugin.functionSelector)), "Router: plugin exists for function.");
226
+ }
227
+
228
+ require(
229
+ _plugin.functionSelector == bytes4(keccak256(abi.encodePacked(_plugin.functionSignature))),
230
+ "Router: fn selector and signature mismatch."
231
+ );
232
+
233
+ data.pluginForSelector[_plugin.functionSelector] = _plugin;
234
+ data.selectorsForPlugin[_plugin.pluginAddress].add(bytes32(_plugin.functionSelector));
235
+
236
+ emit PluginAdded(_plugin.functionSelector, _plugin.pluginAddress);
237
+ }
238
+
239
+ /// @dev Update or override existing functionality.
240
+ function _updatePlugin(Plugin memory _plugin) internal {
241
+ address currentPlugin = getPluginForFunction(_plugin.functionSelector);
242
+ require(
243
+ _plugin.functionSelector == bytes4(keccak256(abi.encodePacked(_plugin.functionSignature))),
244
+ "Router: fn selector and signature mismatch."
245
+ );
246
+
247
+ RouterStorage.Data storage data = RouterStorage.routerStorage();
248
+ data.allSelectors.add(bytes32(_plugin.functionSelector));
249
+ data.pluginForSelector[_plugin.functionSelector] = _plugin;
250
+ data.selectorsForPlugin[currentPlugin].remove(bytes32(_plugin.functionSelector));
251
+ data.selectorsForPlugin[_plugin.pluginAddress].add(bytes32(_plugin.functionSelector));
252
+
253
+ emit PluginUpdated(_plugin.functionSelector, currentPlugin, _plugin.pluginAddress);
254
+ }
255
+
256
+ /// @dev Remove existing functionality from the contract.
257
+ function _removePlugin(bytes4 _selector) internal {
258
+ RouterStorage.Data storage data = RouterStorage.routerStorage();
259
+ address currentPlugin = _getPluginForFunction(_selector);
260
+ require(currentPlugin != address(0), "Router: No plugin available for selector");
261
+
262
+ delete data.pluginForSelector[_selector];
263
+ data.allSelectors.remove(_selector);
264
+ data.selectorsForPlugin[currentPlugin].remove(bytes32(_selector));
265
+
266
+ emit PluginRemoved(_selector, currentPlugin);
267
+ }
268
+
269
+ function _canSetPlugin() internal view virtual returns (bool);
270
+ }
@@ -0,0 +1,26 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @author thirdweb
5
+
6
+ import "./Router.sol";
7
+
8
+ /**
9
+ * @author thirdweb.com
10
+ */
11
+ contract RouterImmutable is Router {
12
+ /*///////////////////////////////////////////////////////////////
13
+ Constructor + initializer logic
14
+ //////////////////////////////////////////////////////////////*/
15
+
16
+ constructor(address _pluginMap) Router(_pluginMap) {}
17
+
18
+ /*///////////////////////////////////////////////////////////////
19
+ Internal functions
20
+ //////////////////////////////////////////////////////////////*/
21
+
22
+ /// @dev Returns whether plug-in can be set in the given execution context.
23
+ function _canSetPlugin() internal pure override returns (bool) {
24
+ return false;
25
+ }
26
+ }
@@ -0,0 +1,121 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @author thirdweb
5
+
6
+ import "../interface/IRoyaltyPayments.sol";
7
+ import "../interface/IRoyaltyEngineV1.sol";
8
+ import { IERC2981 } from "../../eip/interface/IERC2981.sol";
9
+
10
+ library RoyaltyPaymentsStorage {
11
+ /// @custom:storage-location erc7201:royalty.payments.storage
12
+ /// @dev keccak256(abi.encode(uint256(keccak256("royalty.payments.storage")) - 1)) & ~bytes32(uint256(0xff))
13
+ bytes32 public constant ROYALTY_PAYMENTS_STORAGE_POSITION =
14
+ 0xc802b338f3fb784853cf3c808df5ff08335200e394ea2c687d12571a91045000;
15
+
16
+ struct Data {
17
+ /// @dev The address of RoyaltyEngineV1, replacing the one set during construction.
18
+ address royaltyEngineAddressOverride;
19
+ }
20
+
21
+ function royaltyPaymentsStorage() internal pure returns (Data storage royaltyPaymentsData) {
22
+ bytes32 position = ROYALTY_PAYMENTS_STORAGE_POSITION;
23
+ assembly {
24
+ royaltyPaymentsData.slot := position
25
+ }
26
+ }
27
+ }
28
+
29
+ /**
30
+ * @author thirdweb.com
31
+ *
32
+ * @title Royalty Payments
33
+ * @notice Thirdweb's `RoyaltyPayments` is a contract extension to be used with a marketplace contract.
34
+ * It exposes functions for fetching royalty settings for a token.
35
+ * It Supports RoyaltyEngineV1 and RoyaltyRegistry by manifold.xyz.
36
+ */
37
+
38
+ abstract contract RoyaltyPaymentsLogic is IRoyaltyPayments {
39
+ // solhint-disable-next-line var-name-mixedcase
40
+ address immutable ROYALTY_ENGINE_ADDRESS;
41
+
42
+ constructor(address _royaltyEngineAddress) {
43
+ // allow address(0) in case RoyaltyEngineV1 not present on a network
44
+ require(
45
+ _royaltyEngineAddress == address(0) ||
46
+ IERC165(_royaltyEngineAddress).supportsInterface(type(IRoyaltyEngineV1).interfaceId),
47
+ "Doesn't support IRoyaltyEngineV1 interface"
48
+ );
49
+
50
+ ROYALTY_ENGINE_ADDRESS = _royaltyEngineAddress;
51
+ }
52
+
53
+ /**
54
+ * Get the royalty for a given token (address, id) and value amount. Does not cache the bps/amounts. Caches the spec for a given token address
55
+ *
56
+ * @param tokenAddress - The address of the token
57
+ * @param tokenId - The id of the token
58
+ * @param value - The value you wish to get the royalty of
59
+ *
60
+ * returns Two arrays of equal length, royalty recipients and the corresponding amount each recipient should get
61
+ */
62
+ function getRoyalty(
63
+ address tokenAddress,
64
+ uint256 tokenId,
65
+ uint256 value
66
+ ) external returns (address payable[] memory recipients, uint256[] memory amounts) {
67
+ address royaltyEngineAddress = getRoyaltyEngineAddress();
68
+
69
+ if (royaltyEngineAddress == address(0)) {
70
+ try IERC2981(tokenAddress).royaltyInfo(tokenId, value) returns (address recipient, uint256 amount) {
71
+ require(amount < value, "Invalid royalty amount");
72
+
73
+ recipients = new address payable[](1);
74
+ amounts = new uint256[](1);
75
+ recipients[0] = payable(recipient);
76
+ amounts[0] = amount;
77
+ } catch {}
78
+ } else {
79
+ (recipients, amounts) = IRoyaltyEngineV1(royaltyEngineAddress).getRoyalty(tokenAddress, tokenId, value);
80
+ }
81
+ }
82
+
83
+ /**
84
+ * Set or override RoyaltyEngine address
85
+ *
86
+ * @param _royaltyEngineAddress - RoyaltyEngineV1 address
87
+ */
88
+ function setRoyaltyEngine(address _royaltyEngineAddress) external {
89
+ if (!_canSetRoyaltyEngine()) {
90
+ revert("Not authorized");
91
+ }
92
+
93
+ require(
94
+ _royaltyEngineAddress != address(0) &&
95
+ IERC165(_royaltyEngineAddress).supportsInterface(type(IRoyaltyEngineV1).interfaceId),
96
+ "Doesn't support IRoyaltyEngineV1 interface"
97
+ );
98
+
99
+ _setupRoyaltyEngine(_royaltyEngineAddress);
100
+ }
101
+
102
+ /// @dev Returns original or overridden address for RoyaltyEngineV1
103
+ function getRoyaltyEngineAddress() public view returns (address royaltyEngineAddress) {
104
+ RoyaltyPaymentsStorage.Data storage data = RoyaltyPaymentsStorage.royaltyPaymentsStorage();
105
+ address royaltyEngineOverride = data.royaltyEngineAddressOverride;
106
+ royaltyEngineAddress = royaltyEngineOverride != address(0) ? royaltyEngineOverride : ROYALTY_ENGINE_ADDRESS;
107
+ }
108
+
109
+ /// @dev Lets a contract admin update the royalty engine address
110
+ function _setupRoyaltyEngine(address _royaltyEngineAddress) internal {
111
+ RoyaltyPaymentsStorage.Data storage data = RoyaltyPaymentsStorage.royaltyPaymentsStorage();
112
+ address currentAddress = data.royaltyEngineAddressOverride;
113
+
114
+ data.royaltyEngineAddressOverride = _royaltyEngineAddress;
115
+
116
+ emit RoyaltyEngineUpdated(currentAddress, _royaltyEngineAddress);
117
+ }
118
+
119
+ /// @dev Returns whether royalty engine address can be set in the given execution context.
120
+ function _canSetRoyaltyEngine() internal view virtual returns (bool);
121
+ }
@@ -0,0 +1,253 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @author thirdweb
5
+
6
+ import "../interface/IAccountPermissions.sol";
7
+ import "../../external-deps/openzeppelin/utils/cryptography/EIP712.sol";
8
+ import "../../external-deps/openzeppelin/utils/structs/EnumerableSet.sol";
9
+
10
+ library AccountPermissionsStorage {
11
+ /// @custom:storage-location erc7201:account.permissions.storage
12
+ /// @dev keccak256(abi.encode(uint256(keccak256("account.permissions.storage")) - 1)) & ~bytes32(uint256(0xff))
13
+ bytes32 public constant ACCOUNT_PERMISSIONS_STORAGE_POSITION =
14
+ 0x3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def00;
15
+
16
+ struct Data {
17
+ /// @dev The set of all admins of the wallet.
18
+ EnumerableSet.AddressSet allAdmins;
19
+ /// @dev The set of all signers with permission to use the account.
20
+ EnumerableSet.AddressSet allSigners;
21
+ /// @dev Map from address => whether the address is an admin.
22
+ mapping(address => bool) isAdmin;
23
+ /// @dev Map from signer address => active restrictions for that signer.
24
+ mapping(address => IAccountPermissions.SignerPermissionsStatic) signerPermissions;
25
+ /// @dev Map from signer address => approved target the signer can call using the account contract.
26
+ mapping(address => EnumerableSet.AddressSet) approvedTargets;
27
+ /// @dev Mapping from a signed request UID => whether the request is processed.
28
+ mapping(bytes32 => bool) executed;
29
+ }
30
+
31
+ function data() internal pure returns (Data storage data_) {
32
+ bytes32 position = ACCOUNT_PERMISSIONS_STORAGE_POSITION;
33
+ assembly {
34
+ data_.slot := position
35
+ }
36
+ }
37
+ }
38
+
39
+ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
40
+ using ECDSA for bytes32;
41
+ using EnumerableSet for EnumerableSet.AddressSet;
42
+
43
+ bytes32 private constant TYPEHASH =
44
+ keccak256(
45
+ "SignerPermissionRequest(address signer,uint8 isAdmin,address[] approvedTargets,uint256 nativeTokenLimitPerTransaction,uint128 permissionStartTimestamp,uint128 permissionEndTimestamp,uint128 reqValidityStartTimestamp,uint128 reqValidityEndTimestamp,bytes32 uid)"
46
+ );
47
+
48
+ function _onlyAdmin() internal virtual {
49
+ require(isAdmin(msg.sender), "!admin");
50
+ }
51
+
52
+ /*///////////////////////////////////////////////////////////////
53
+ External functions
54
+ //////////////////////////////////////////////////////////////*/
55
+
56
+ /// @notice Sets the permissions for a given signer.
57
+ function setPermissionsForSigner(SignerPermissionRequest calldata _req, bytes calldata _signature) external {
58
+ address targetSigner = _req.signer;
59
+
60
+ require(
61
+ _req.reqValidityStartTimestamp <= block.timestamp && block.timestamp < _req.reqValidityEndTimestamp,
62
+ "!period"
63
+ );
64
+
65
+ (bool success, address signer) = verifySignerPermissionRequest(_req, _signature);
66
+ require(success, "!sig");
67
+
68
+ _accountPermissionsStorage().executed[_req.uid] = true;
69
+
70
+ //isAdmin > 0, set admin or remove admin
71
+ if (_req.isAdmin > 0) {
72
+ //isAdmin = 1, set admin
73
+ //isAdmin > 1, remove admin
74
+ bool _isAdmin = _req.isAdmin == 1;
75
+
76
+ _setAdmin(targetSigner, _isAdmin);
77
+ return;
78
+ }
79
+
80
+ require(!isAdmin(targetSigner), "admin");
81
+
82
+ _accountPermissionsStorage().allSigners.add(targetSigner);
83
+
84
+ _accountPermissionsStorage().signerPermissions[targetSigner] = SignerPermissionsStatic(
85
+ _req.nativeTokenLimitPerTransaction,
86
+ _req.permissionStartTimestamp,
87
+ _req.permissionEndTimestamp
88
+ );
89
+
90
+ address[] memory currentTargets = _accountPermissionsStorage().approvedTargets[targetSigner].values();
91
+ uint256 len = currentTargets.length;
92
+
93
+ for (uint256 i = 0; i < len; i += 1) {
94
+ _accountPermissionsStorage().approvedTargets[targetSigner].remove(currentTargets[i]);
95
+ }
96
+
97
+ len = _req.approvedTargets.length;
98
+ for (uint256 i = 0; i < len; i += 1) {
99
+ _accountPermissionsStorage().approvedTargets[targetSigner].add(_req.approvedTargets[i]);
100
+ }
101
+
102
+ _afterSignerPermissionsUpdate(_req);
103
+
104
+ emit SignerPermissionsUpdated(signer, targetSigner, _req);
105
+ }
106
+
107
+ /*///////////////////////////////////////////////////////////////
108
+ View functions
109
+ //////////////////////////////////////////////////////////////*/
110
+
111
+ /// @notice Returns whether the given account is an admin.
112
+ function isAdmin(address _account) public view virtual returns (bool) {
113
+ return _accountPermissionsStorage().isAdmin[_account];
114
+ }
115
+
116
+ /// @notice Returns whether the given account is an active signer on the account.
117
+ function isActiveSigner(address signer) public view returns (bool) {
118
+ SignerPermissionsStatic memory permissions = _accountPermissionsStorage().signerPermissions[signer];
119
+
120
+ return
121
+ permissions.startTimestamp <= block.timestamp &&
122
+ block.timestamp < permissions.endTimestamp &&
123
+ _accountPermissionsStorage().approvedTargets[signer].length() > 0;
124
+ }
125
+
126
+ /// @notice Returns the restrictions under which a signer can use the smart wallet.
127
+ function getPermissionsForSigner(address signer) external view returns (SignerPermissions memory) {
128
+ SignerPermissionsStatic memory permissions = _accountPermissionsStorage().signerPermissions[signer];
129
+
130
+ return
131
+ SignerPermissions(
132
+ signer,
133
+ _accountPermissionsStorage().approvedTargets[signer].values(),
134
+ permissions.nativeTokenLimitPerTransaction,
135
+ permissions.startTimestamp,
136
+ permissions.endTimestamp
137
+ );
138
+ }
139
+
140
+ /// @dev Verifies that a request is signed by an authorized account.
141
+ function verifySignerPermissionRequest(
142
+ SignerPermissionRequest calldata req,
143
+ bytes calldata signature
144
+ ) public view virtual returns (bool success, address signer) {
145
+ signer = _recoverAddress(_encodeRequest(req), signature);
146
+ success = !_accountPermissionsStorage().executed[req.uid] && isAdmin(signer);
147
+ }
148
+
149
+ /// @notice Returns all active and inactive signers of the account.
150
+ function getAllSigners() external view returns (SignerPermissions[] memory signers) {
151
+ address[] memory allSigners = _accountPermissionsStorage().allSigners.values();
152
+
153
+ uint256 len = allSigners.length;
154
+ signers = new SignerPermissions[](len);
155
+ for (uint256 i = 0; i < len; i += 1) {
156
+ address signer = allSigners[i];
157
+ SignerPermissionsStatic memory permissions = _accountPermissionsStorage().signerPermissions[signer];
158
+
159
+ signers[i] = SignerPermissions(
160
+ signer,
161
+ _accountPermissionsStorage().approvedTargets[signer].values(),
162
+ permissions.nativeTokenLimitPerTransaction,
163
+ permissions.startTimestamp,
164
+ permissions.endTimestamp
165
+ );
166
+ }
167
+ }
168
+
169
+ /// @notice Returns all signers with active permissions to use the account.
170
+ function getAllActiveSigners() external view returns (SignerPermissions[] memory signers) {
171
+ address[] memory allSigners = _accountPermissionsStorage().allSigners.values();
172
+
173
+ uint256 len = allSigners.length;
174
+ uint256 numOfActiveSigners = 0;
175
+
176
+ for (uint256 i = 0; i < len; i += 1) {
177
+ if (isActiveSigner(allSigners[i])) {
178
+ numOfActiveSigners++;
179
+ } else {
180
+ allSigners[i] = address(0);
181
+ }
182
+ }
183
+
184
+ signers = new SignerPermissions[](numOfActiveSigners);
185
+ uint256 index = 0;
186
+ for (uint256 i = 0; i < len; i += 1) {
187
+ if (allSigners[i] != address(0)) {
188
+ address signer = allSigners[i];
189
+ SignerPermissionsStatic memory permissions = _accountPermissionsStorage().signerPermissions[signer];
190
+
191
+ signers[index++] = SignerPermissions(
192
+ signer,
193
+ _accountPermissionsStorage().approvedTargets[signer].values(),
194
+ permissions.nativeTokenLimitPerTransaction,
195
+ permissions.startTimestamp,
196
+ permissions.endTimestamp
197
+ );
198
+ }
199
+ }
200
+ }
201
+
202
+ /// @notice Returns all admins of the account.
203
+ function getAllAdmins() external view returns (address[] memory) {
204
+ return _accountPermissionsStorage().allAdmins.values();
205
+ }
206
+
207
+ /*///////////////////////////////////////////////////////////////
208
+ Internal functions
209
+ //////////////////////////////////////////////////////////////*/
210
+
211
+ /// @notice Runs after every `changeRole` run.
212
+ function _afterSignerPermissionsUpdate(SignerPermissionRequest calldata _req) internal virtual;
213
+
214
+ /// @notice Makes the given account an admin.
215
+ function _setAdmin(address _account, bool _isAdmin) internal virtual {
216
+ _accountPermissionsStorage().isAdmin[_account] = _isAdmin;
217
+
218
+ if (_isAdmin) {
219
+ _accountPermissionsStorage().allAdmins.add(_account);
220
+ } else {
221
+ _accountPermissionsStorage().allAdmins.remove(_account);
222
+ }
223
+
224
+ emit AdminUpdated(_account, _isAdmin);
225
+ }
226
+
227
+ /// @dev Returns the address of the signer of the request.
228
+ function _recoverAddress(bytes memory _encoded, bytes calldata _signature) internal view virtual returns (address) {
229
+ return _hashTypedDataV4(keccak256(_encoded)).recover(_signature);
230
+ }
231
+
232
+ /// @dev Encodes a request for recovery of the signer in `recoverAddress`.
233
+ function _encodeRequest(SignerPermissionRequest calldata _req) internal pure virtual returns (bytes memory) {
234
+ return
235
+ abi.encode(
236
+ TYPEHASH,
237
+ _req.signer,
238
+ _req.isAdmin,
239
+ keccak256(abi.encodePacked(_req.approvedTargets)),
240
+ _req.nativeTokenLimitPerTransaction,
241
+ _req.permissionStartTimestamp,
242
+ _req.permissionEndTimestamp,
243
+ _req.reqValidityStartTimestamp,
244
+ _req.reqValidityEndTimestamp,
245
+ _req.uid
246
+ );
247
+ }
248
+
249
+ /// @dev Returns the AccountPermissions storage.
250
+ function _accountPermissionsStorage() internal pure returns (AccountPermissionsStorage.Data storage data) {
251
+ data = AccountPermissionsStorage.data();
252
+ }
253
+ }