@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,189 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @author thirdweb
5
+
6
+ import "../extension/ContractMetadata.sol";
7
+ import "../extension/Multicall.sol";
8
+ import "../extension/Ownable.sol";
9
+ import "../extension/Staking1155.sol";
10
+
11
+ import "../eip/ERC165.sol";
12
+ import "../eip/interface/IERC20.sol";
13
+ import "../eip/interface/IERC1155Receiver.sol";
14
+
15
+ import { CurrencyTransferLib } from "../lib/CurrencyTransferLib.sol";
16
+
17
+ /**
18
+ *
19
+ * EXTENSION: Staking1155
20
+ *
21
+ * The `Staking1155Base` smart contract implements NFT staking mechanism.
22
+ * Allows users to stake their ERC-1155 NFTs and earn rewards in form of ERC-20 tokens.
23
+ *
24
+ * Following features and implementation setup must be noted:
25
+ *
26
+ * - ERC-1155 NFTs from only one collection can be staked.
27
+ *
28
+ * - Contract admin can choose to give out rewards by either transferring or minting the rewardToken,
29
+ * which is an ERC20 token. See {_mintRewards}.
30
+ *
31
+ * - To implement custom logic for staking, reward calculation, etc. corresponding functions can be
32
+ * overridden from the extension `Staking1155`.
33
+ *
34
+ * - Ownership of the contract, with the ability to restrict certain functions to
35
+ * only be called by the contract's owner.
36
+ *
37
+ * - Multicall capability to perform multiple actions atomically.
38
+ *
39
+ */
40
+
41
+ /// note: This contract is provided as a base contract.
42
+ // This is to support a variety of use-cases that can be build on top of this base.
43
+ //
44
+ // Additional functionality such as deposit functions, reward-minting, etc.
45
+ // must be implemented by the deployer of this contract, as needed for their use-case.
46
+
47
+ contract Staking1155Base is ContractMetadata, Multicall, Ownable, Staking1155, ERC165, IERC1155Receiver {
48
+ /// @dev ERC20 Reward Token address. See {_mintRewards} below.
49
+ address public immutable rewardToken;
50
+
51
+ /// @dev The address of the native token wrapper contract.
52
+ address internal immutable nativeTokenWrapper;
53
+
54
+ /// @dev Total amount of reward tokens in the contract.
55
+ uint256 private rewardTokenBalance;
56
+
57
+ constructor(
58
+ uint80 _defaultTimeUnit,
59
+ address _defaultAdmin,
60
+ uint256 _defaultRewardsPerUnitTime,
61
+ address _stakingToken,
62
+ address _rewardToken,
63
+ address _nativeTokenWrapper
64
+ ) Staking1155(_stakingToken) {
65
+ _setupOwner(_defaultAdmin);
66
+ _setDefaultStakingCondition(_defaultTimeUnit, _defaultRewardsPerUnitTime);
67
+
68
+ rewardToken = _rewardToken;
69
+ nativeTokenWrapper = _nativeTokenWrapper;
70
+ }
71
+
72
+ /// @dev Lets the contract receive ether to unwrap native tokens.
73
+ receive() external payable virtual {
74
+ require(msg.sender == nativeTokenWrapper, "caller not native token wrapper.");
75
+ }
76
+
77
+ /// @dev Admin deposits reward tokens.
78
+ function depositRewardTokens(uint256 _amount) external payable virtual nonReentrant {
79
+ _depositRewardTokens(_amount); // override this for custom logic.
80
+ }
81
+
82
+ /// @dev Admin can withdraw excess reward tokens.
83
+ function withdrawRewardTokens(uint256 _amount) external virtual nonReentrant {
84
+ _withdrawRewardTokens(_amount); // override this for custom logic.
85
+ }
86
+
87
+ /// @notice View total rewards available in the staking contract.
88
+ function getRewardTokenBalance() external view virtual override returns (uint256) {
89
+ return rewardTokenBalance;
90
+ }
91
+
92
+ /*///////////////////////////////////////////////////////////////
93
+ ERC 165 / 721 logic
94
+ //////////////////////////////////////////////////////////////*/
95
+
96
+ function onERC1155Received(address, address, uint256, uint256, bytes calldata) external view returns (bytes4) {
97
+ require(isStaking == 2, "Direct transfer");
98
+ return this.onERC1155Received.selector;
99
+ }
100
+
101
+ function onERC1155BatchReceived(
102
+ address operator,
103
+ address from,
104
+ uint256[] calldata ids,
105
+ uint256[] calldata values,
106
+ bytes calldata data
107
+ ) external virtual returns (bytes4) {}
108
+
109
+ function supportsInterface(bytes4 interfaceId) public view override(ERC165, IERC165) returns (bool) {
110
+ return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
111
+ }
112
+
113
+ /*//////////////////////////////////////////////////////////////
114
+ Minting logic
115
+ //////////////////////////////////////////////////////////////*/
116
+
117
+ /**
118
+ * @dev Mint ERC20 rewards to the staker. Override for custom logic.
119
+ *
120
+ * @param _staker Address for which to calculated rewards.
121
+ * @param _rewards Amount of tokens to be given out as reward.
122
+ *
123
+ */
124
+ function _mintRewards(address _staker, uint256 _rewards) internal virtual override {
125
+ require(_rewards <= rewardTokenBalance, "Not enough reward tokens");
126
+ rewardTokenBalance -= _rewards;
127
+ CurrencyTransferLib.transferCurrencyWithWrapper(
128
+ rewardToken,
129
+ address(this),
130
+ _staker,
131
+ _rewards,
132
+ nativeTokenWrapper
133
+ );
134
+ }
135
+
136
+ /*//////////////////////////////////////////////////////////////
137
+ Other Internal functions
138
+ //////////////////////////////////////////////////////////////*/
139
+
140
+ /// @dev Admin deposits reward tokens -- override for custom logic.
141
+ function _depositRewardTokens(uint256 _amount) internal virtual {
142
+ require(msg.sender == owner(), "Not authorized");
143
+
144
+ address _rewardToken = rewardToken == CurrencyTransferLib.NATIVE_TOKEN ? nativeTokenWrapper : rewardToken;
145
+
146
+ uint256 balanceBefore = IERC20(_rewardToken).balanceOf(address(this));
147
+ CurrencyTransferLib.transferCurrencyWithWrapper(
148
+ rewardToken,
149
+ msg.sender,
150
+ address(this),
151
+ _amount,
152
+ nativeTokenWrapper
153
+ );
154
+ uint256 actualAmount = IERC20(_rewardToken).balanceOf(address(this)) - balanceBefore;
155
+
156
+ rewardTokenBalance += actualAmount;
157
+ }
158
+
159
+ /// @dev Admin can withdraw excess reward tokens -- override for custom logic.
160
+ function _withdrawRewardTokens(uint256 _amount) internal virtual {
161
+ require(msg.sender == owner(), "Not authorized");
162
+
163
+ // to prevent locking of direct-transferred tokens
164
+ rewardTokenBalance = _amount > rewardTokenBalance ? 0 : rewardTokenBalance - _amount;
165
+
166
+ CurrencyTransferLib.transferCurrencyWithWrapper(
167
+ rewardToken,
168
+ address(this),
169
+ msg.sender,
170
+ _amount,
171
+ nativeTokenWrapper
172
+ );
173
+ }
174
+
175
+ /// @dev Returns whether staking restrictions can be set in given execution context.
176
+ function _canSetStakeConditions() internal view virtual override returns (bool) {
177
+ return msg.sender == owner();
178
+ }
179
+
180
+ /// @dev Returns whether contract metadata can be set in the given execution context.
181
+ function _canSetContractURI() internal view virtual override returns (bool) {
182
+ return msg.sender == owner();
183
+ }
184
+
185
+ /// @dev Returns whether owner can be set in the given execution context.
186
+ function _canSetOwner() internal view virtual override returns (bool) {
187
+ return msg.sender == owner();
188
+ }
189
+ }
@@ -0,0 +1,179 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @author thirdweb
5
+
6
+ import "../extension/ContractMetadata.sol";
7
+ import "../extension/Multicall.sol";
8
+ import "../extension/Ownable.sol";
9
+ import "../extension/Staking20.sol";
10
+
11
+ import "../eip/interface/IERC20.sol";
12
+ import "../eip/interface/IERC20Metadata.sol";
13
+
14
+ import { CurrencyTransferLib } from "../lib/CurrencyTransferLib.sol";
15
+
16
+ /**
17
+ *
18
+ * EXTENSION: Staking20
19
+ *
20
+ * The `Staking20Base` smart contract implements Token staking mechanism.
21
+ * Allows users to stake their ERC-20 Tokens and earn rewards in form of another ERC-20 tokens.
22
+ *
23
+ * Following features and implementation setup must be noted:
24
+ *
25
+ * - ERC-20 Tokens from only one contract can be staked.
26
+ *
27
+ * - Contract admin can choose to give out rewards by either transferring or minting the rewardToken,
28
+ * which is ideally a different ERC20 token. See {_mintRewards}.
29
+ *
30
+ * - To implement custom logic for staking, reward calculation, etc. corresponding functions can be
31
+ * overridden from the extension `Staking20`.
32
+ *
33
+ * - Ownership of the contract, with the ability to restrict certain functions to
34
+ * only be called by the contract's owner.
35
+ *
36
+ * - Multicall capability to perform multiple actions atomically.
37
+ *
38
+ */
39
+
40
+ /// note: This contract is provided as a base contract.
41
+ // This is to support a variety of use-cases that can be build on top of this base.
42
+ //
43
+ // Additional functionality such as deposit functions, reward-minting, etc.
44
+ // must be implemented by the deployer of this contract, as needed for their use-case.
45
+
46
+ contract Staking20Base is ContractMetadata, Multicall, Ownable, Staking20 {
47
+ /// @dev ERC20 Reward Token address. See {_mintRewards} below.
48
+ address public immutable rewardToken;
49
+
50
+ /// @dev Total amount of reward tokens in the contract.
51
+ uint256 private rewardTokenBalance;
52
+
53
+ constructor(
54
+ uint80 _timeUnit,
55
+ address _defaultAdmin,
56
+ uint256 _rewardRatioNumerator,
57
+ uint256 _rewardRatioDenominator,
58
+ address _stakingToken,
59
+ address _rewardToken,
60
+ address _nativeTokenWrapper
61
+ )
62
+ Staking20(
63
+ _nativeTokenWrapper,
64
+ _stakingToken,
65
+ IERC20Metadata(_stakingToken).decimals(),
66
+ IERC20Metadata(_rewardToken).decimals()
67
+ )
68
+ {
69
+ _setupOwner(_defaultAdmin);
70
+ _setStakingCondition(_timeUnit, _rewardRatioNumerator, _rewardRatioDenominator);
71
+
72
+ require(_rewardToken != _stakingToken, "Reward Token and Staking Token can't be same.");
73
+ rewardToken = _rewardToken;
74
+ }
75
+
76
+ /// @dev Lets the contract receive ether to unwrap native tokens.
77
+ receive() external payable virtual {
78
+ require(msg.sender == nativeTokenWrapper, "caller not native token wrapper.");
79
+ }
80
+
81
+ /// @dev Admin deposits reward tokens.
82
+ function depositRewardTokens(uint256 _amount) external payable virtual nonReentrant {
83
+ _depositRewardTokens(_amount); // override this for custom logic.
84
+ }
85
+
86
+ /// @dev Admin can withdraw excess reward tokens.
87
+ function withdrawRewardTokens(uint256 _amount) external virtual nonReentrant {
88
+ _withdrawRewardTokens(_amount); // override this for custom logic.
89
+ }
90
+
91
+ /// @notice View total rewards available in the staking contract.
92
+ function getRewardTokenBalance() external view virtual override returns (uint256) {
93
+ return rewardTokenBalance;
94
+ }
95
+
96
+ /*//////////////////////////////////////////////////////////////
97
+ Minting logic
98
+ //////////////////////////////////////////////////////////////*/
99
+
100
+ /**
101
+ * @dev Mint ERC20 rewards to the staker. Override for custom logic.
102
+ *
103
+ * @param _staker Address for which to calculated rewards.
104
+ * @param _rewards Amount of tokens to be given out as reward.
105
+ *
106
+ */
107
+ function _mintRewards(address _staker, uint256 _rewards) internal virtual override {
108
+ require(_rewards <= rewardTokenBalance, "Not enough reward tokens");
109
+ rewardTokenBalance -= _rewards;
110
+ CurrencyTransferLib.transferCurrencyWithWrapper(
111
+ rewardToken,
112
+ address(this),
113
+ _staker,
114
+ _rewards,
115
+ nativeTokenWrapper
116
+ );
117
+ }
118
+
119
+ /*//////////////////////////////////////////////////////////////
120
+ Other Internal functions
121
+ //////////////////////////////////////////////////////////////*/
122
+
123
+ /// @dev Admin deposits reward tokens -- override for custom logic.
124
+ function _depositRewardTokens(uint256 _amount) internal virtual {
125
+ require(msg.sender == owner(), "Not authorized");
126
+
127
+ address _rewardToken = rewardToken == CurrencyTransferLib.NATIVE_TOKEN ? nativeTokenWrapper : rewardToken;
128
+
129
+ uint256 balanceBefore = IERC20(_rewardToken).balanceOf(address(this));
130
+ CurrencyTransferLib.transferCurrencyWithWrapper(
131
+ rewardToken,
132
+ msg.sender,
133
+ address(this),
134
+ _amount,
135
+ nativeTokenWrapper
136
+ );
137
+ uint256 actualAmount = IERC20(_rewardToken).balanceOf(address(this)) - balanceBefore;
138
+
139
+ rewardTokenBalance += actualAmount;
140
+ }
141
+
142
+ /// @dev Admin can withdraw excess reward tokens -- override for custom logic.
143
+ function _withdrawRewardTokens(uint256 _amount) internal virtual {
144
+ require(msg.sender == owner(), "Not authorized");
145
+
146
+ // to prevent locking of direct-transferred tokens
147
+ rewardTokenBalance = _amount > rewardTokenBalance ? 0 : rewardTokenBalance - _amount;
148
+
149
+ CurrencyTransferLib.transferCurrencyWithWrapper(
150
+ rewardToken,
151
+ address(this),
152
+ msg.sender,
153
+ _amount,
154
+ nativeTokenWrapper
155
+ );
156
+
157
+ // The withdrawal shouldn't reduce staking token balance. `>=` accounts for any accidental transfers.
158
+ address _stakingToken = stakingToken == CurrencyTransferLib.NATIVE_TOKEN ? nativeTokenWrapper : stakingToken;
159
+ require(
160
+ IERC20(_stakingToken).balanceOf(address(this)) >= stakingTokenBalance,
161
+ "Staking token balance reduced."
162
+ );
163
+ }
164
+
165
+ /// @dev Returns whether staking restrictions can be set in given execution context.
166
+ function _canSetStakeConditions() internal view virtual override returns (bool) {
167
+ return msg.sender == owner();
168
+ }
169
+
170
+ /// @dev Returns whether contract metadata can be set in the given execution context.
171
+ function _canSetContractURI() internal view virtual override returns (bool) {
172
+ return msg.sender == owner();
173
+ }
174
+
175
+ /// @dev Returns whether owner can be set in the given execution context.
176
+ function _canSetOwner() internal view virtual override returns (bool) {
177
+ return msg.sender == owner();
178
+ }
179
+ }
@@ -0,0 +1,186 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @author thirdweb
5
+
6
+ import "../extension/ContractMetadata.sol";
7
+ import "../extension/Multicall.sol";
8
+ import "../extension/Ownable.sol";
9
+ import "../extension/Staking721.sol";
10
+
11
+ import "../eip/ERC165.sol";
12
+ import "../eip/interface/IERC20.sol";
13
+ import "../eip/interface/IERC721Receiver.sol";
14
+
15
+ import { CurrencyTransferLib } from "../lib/CurrencyTransferLib.sol";
16
+
17
+ /**
18
+ *
19
+ * EXTENSION: Staking721
20
+ *
21
+ * The `Staking721Base` smart contract implements NFT staking mechanism.
22
+ * Allows users to stake their ERC-721 NFTs and earn rewards in form of ERC-20 tokens.
23
+ *
24
+ * Following features and implementation setup must be noted:
25
+ *
26
+ * - ERC-721 NFTs from only one NFT collection can be staked.
27
+ *
28
+ * - Contract admin can choose to give out rewards by either transferring or minting the rewardToken,
29
+ * which is an ERC20 token. See {_mintRewards}.
30
+ *
31
+ * - To implement custom logic for staking, reward calculation, etc. corresponding functions can be
32
+ * overridden from the extension `Staking721`.
33
+ *
34
+ * - Ownership of the contract, with the ability to restrict certain functions to
35
+ * only be called by the contract's owner.
36
+ *
37
+ * - Multicall capability to perform multiple actions atomically.
38
+ *
39
+ */
40
+
41
+ /// note: This contract is provided as a base contract.
42
+ // This is to support a variety of use-cases that can be build on top of this base.
43
+ //
44
+ // Additional functionality such as deposit functions, reward-minting, etc.
45
+ // must be implemented by the deployer of this contract, as needed for their use-case.
46
+
47
+ contract Staking721Base is ContractMetadata, Multicall, Ownable, Staking721, ERC165, IERC721Receiver {
48
+ /// @dev ERC20 Reward Token address. See {_mintRewards} below.
49
+ address public immutable rewardToken;
50
+
51
+ /// @dev The address of the native token wrapper contract.
52
+ address public immutable nativeTokenWrapper;
53
+
54
+ /// @dev Total amount of reward tokens in the contract.
55
+ uint256 private rewardTokenBalance;
56
+
57
+ constructor(
58
+ address _defaultAdmin,
59
+ uint256 _timeUnit,
60
+ uint256 _rewardsPerUnitTime,
61
+ address _stakingToken,
62
+ address _rewardToken,
63
+ address _nativeTokenWrapper
64
+ ) Staking721(_stakingToken) {
65
+ _setupOwner(_defaultAdmin);
66
+ _setStakingCondition(_timeUnit, _rewardsPerUnitTime);
67
+
68
+ rewardToken = _rewardToken;
69
+ nativeTokenWrapper = _nativeTokenWrapper;
70
+ }
71
+
72
+ /// @dev Lets the contract receive ether to unwrap native tokens.
73
+ receive() external payable virtual {
74
+ require(msg.sender == nativeTokenWrapper, "caller not native token wrapper.");
75
+ }
76
+
77
+ /// @dev Admin deposits reward tokens.
78
+ function depositRewardTokens(uint256 _amount) external payable virtual nonReentrant {
79
+ _depositRewardTokens(_amount); // override this for custom logic.
80
+ }
81
+
82
+ /// @dev Admin can withdraw excess reward tokens.
83
+ function withdrawRewardTokens(uint256 _amount) external virtual nonReentrant {
84
+ _withdrawRewardTokens(_amount); // override this for custom logic.
85
+ }
86
+
87
+ /// @notice View total rewards available in the staking contract.
88
+ function getRewardTokenBalance() external view virtual override returns (uint256) {
89
+ return rewardTokenBalance;
90
+ }
91
+
92
+ /*///////////////////////////////////////////////////////////////
93
+ ERC 165 / 721 logic
94
+ //////////////////////////////////////////////////////////////*/
95
+
96
+ function onERC721Received(
97
+ address,
98
+ address,
99
+ uint256,
100
+ bytes calldata
101
+ ) external view virtual override returns (bytes4) {
102
+ require(isStaking == 2, "Direct transfer");
103
+ return this.onERC721Received.selector;
104
+ }
105
+
106
+ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
107
+ return interfaceId == type(IERC721Receiver).interfaceId || super.supportsInterface(interfaceId);
108
+ }
109
+
110
+ /*//////////////////////////////////////////////////////////////
111
+ Minting logic
112
+ //////////////////////////////////////////////////////////////*/
113
+
114
+ /**
115
+ * @dev Mint ERC20 rewards to the staker. Override for custom logic.
116
+ *
117
+ * @param _staker Address for which to calculated rewards.
118
+ * @param _rewards Amount of tokens to be given out as reward.
119
+ *
120
+ */
121
+ function _mintRewards(address _staker, uint256 _rewards) internal virtual override {
122
+ require(_rewards <= rewardTokenBalance, "Not enough reward tokens");
123
+ rewardTokenBalance -= _rewards;
124
+ CurrencyTransferLib.transferCurrencyWithWrapper(
125
+ rewardToken,
126
+ address(this),
127
+ _staker,
128
+ _rewards,
129
+ nativeTokenWrapper
130
+ );
131
+ }
132
+
133
+ /*//////////////////////////////////////////////////////////////
134
+ Other Internal functions
135
+ //////////////////////////////////////////////////////////////*/
136
+
137
+ /// @dev Admin deposits reward tokens -- override for custom logic.
138
+ function _depositRewardTokens(uint256 _amount) internal virtual {
139
+ require(msg.sender == owner(), "Not authorized");
140
+
141
+ address _rewardToken = rewardToken == CurrencyTransferLib.NATIVE_TOKEN ? nativeTokenWrapper : rewardToken;
142
+
143
+ uint256 balanceBefore = IERC20(_rewardToken).balanceOf(address(this));
144
+ CurrencyTransferLib.transferCurrencyWithWrapper(
145
+ rewardToken,
146
+ msg.sender,
147
+ address(this),
148
+ _amount,
149
+ nativeTokenWrapper
150
+ );
151
+ uint256 actualAmount = IERC20(_rewardToken).balanceOf(address(this)) - balanceBefore;
152
+
153
+ rewardTokenBalance += actualAmount;
154
+ }
155
+
156
+ /// @dev Admin can withdraw excess reward tokens -- override for custom logic.
157
+ function _withdrawRewardTokens(uint256 _amount) internal virtual {
158
+ require(msg.sender == owner(), "Not authorized");
159
+
160
+ // to prevent locking of direct-transferred tokens
161
+ rewardTokenBalance = _amount > rewardTokenBalance ? 0 : rewardTokenBalance - _amount;
162
+
163
+ CurrencyTransferLib.transferCurrencyWithWrapper(
164
+ rewardToken,
165
+ address(this),
166
+ msg.sender,
167
+ _amount,
168
+ nativeTokenWrapper
169
+ );
170
+ }
171
+
172
+ /// @dev Returns whether staking restrictions can be set in given execution context.
173
+ function _canSetStakeConditions() internal view virtual override returns (bool) {
174
+ return msg.sender == owner();
175
+ }
176
+
177
+ /// @dev Returns whether contract metadata can be set in the given execution context.
178
+ function _canSetContractURI() internal view virtual override returns (bool) {
179
+ return msg.sender == owner();
180
+ }
181
+
182
+ /// @dev Returns whether owner can be set in the given execution context.
183
+ function _canSetOwner() internal view virtual override returns (bool) {
184
+ return msg.sender == owner();
185
+ }
186
+ }