@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,364 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.11;
3
+
4
+ /// @author thirdweb
5
+
6
+ import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol";
7
+ import "../external-deps/openzeppelin/utils/math/SafeMath.sol";
8
+ import "../eip/interface/IERC721.sol";
9
+
10
+ import "./interface/IStaking721.sol";
11
+
12
+ abstract contract Staking721Upgradeable is ReentrancyGuardUpgradeable, IStaking721 {
13
+ /*///////////////////////////////////////////////////////////////
14
+ State variables / Mappings
15
+ //////////////////////////////////////////////////////////////*/
16
+
17
+ ///@dev Address of ERC721 NFT contract -- staked tokens belong to this contract.
18
+ address public stakingToken;
19
+
20
+ /// @dev Flag to check direct transfers of staking tokens.
21
+ uint8 internal isStaking = 1;
22
+
23
+ ///@dev Next staking condition Id. Tracks number of conditon updates so far.
24
+ uint64 private nextConditionId;
25
+
26
+ ///@dev List of token-ids ever staked.
27
+ uint256[] public indexedTokens;
28
+
29
+ /// @dev List of accounts that have staked their NFTs.
30
+ address[] public stakersArray;
31
+
32
+ ///@dev Mapping from token-id to whether it is indexed or not.
33
+ mapping(uint256 => bool) public isIndexed;
34
+
35
+ ///@dev Mapping from staker address to Staker struct. See {struct IStaking721.Staker}.
36
+ mapping(address => Staker) public stakers;
37
+
38
+ /// @dev Mapping from staked token-id to staker address.
39
+ mapping(uint256 => address) public stakerAddress;
40
+
41
+ ///@dev Mapping from condition Id to staking condition. See {struct IStaking721.StakingCondition}
42
+ mapping(uint256 => StakingCondition) private stakingConditions;
43
+
44
+ function __Staking721_init(address _stakingToken) internal onlyInitializing {
45
+ __ReentrancyGuard_init();
46
+
47
+ require(address(_stakingToken) != address(0), "collection address 0");
48
+ stakingToken = _stakingToken;
49
+ }
50
+
51
+ /*///////////////////////////////////////////////////////////////
52
+ External/Public Functions
53
+ //////////////////////////////////////////////////////////////*/
54
+
55
+ /**
56
+ * @notice Stake ERC721 Tokens.
57
+ *
58
+ * @dev See {_stake}. Override that to implement custom logic.
59
+ *
60
+ * @param _tokenIds List of tokens to stake.
61
+ */
62
+ function stake(uint256[] calldata _tokenIds) external nonReentrant {
63
+ _stake(_tokenIds);
64
+ }
65
+
66
+ /**
67
+ * @notice Withdraw staked tokens.
68
+ *
69
+ * @dev See {_withdraw}. Override that to implement custom logic.
70
+ *
71
+ * @param _tokenIds List of tokens to withdraw.
72
+ */
73
+ function withdraw(uint256[] calldata _tokenIds) external nonReentrant {
74
+ _withdraw(_tokenIds);
75
+ }
76
+
77
+ /**
78
+ * @notice Claim accumulated rewards.
79
+ *
80
+ * @dev See {_claimRewards}. Override that to implement custom logic.
81
+ * See {_calculateRewards} for reward-calculation logic.
82
+ */
83
+ function claimRewards() external nonReentrant {
84
+ _claimRewards();
85
+ }
86
+
87
+ /**
88
+ * @notice Set time unit. Set as a number of seconds.
89
+ * Could be specified as -- x * 1 hours, x * 1 days, etc.
90
+ *
91
+ * @dev Only admin/authorized-account can call it.
92
+ *
93
+ *
94
+ * @param _timeUnit New time unit.
95
+ */
96
+ function setTimeUnit(uint256 _timeUnit) external virtual {
97
+ if (!_canSetStakeConditions()) {
98
+ revert("Not authorized");
99
+ }
100
+
101
+ StakingCondition memory condition = stakingConditions[nextConditionId - 1];
102
+ require(_timeUnit != condition.timeUnit, "Time-unit unchanged.");
103
+
104
+ _setStakingCondition(_timeUnit, condition.rewardsPerUnitTime);
105
+
106
+ emit UpdatedTimeUnit(condition.timeUnit, _timeUnit);
107
+ }
108
+
109
+ /**
110
+ * @notice Set rewards per unit of time.
111
+ * Interpreted as x rewards per second/per day/etc based on time-unit.
112
+ *
113
+ * @dev Only admin/authorized-account can call it.
114
+ *
115
+ *
116
+ * @param _rewardsPerUnitTime New rewards per unit time.
117
+ */
118
+ function setRewardsPerUnitTime(uint256 _rewardsPerUnitTime) external virtual {
119
+ if (!_canSetStakeConditions()) {
120
+ revert("Not authorized");
121
+ }
122
+
123
+ StakingCondition memory condition = stakingConditions[nextConditionId - 1];
124
+ require(_rewardsPerUnitTime != condition.rewardsPerUnitTime, "Reward unchanged.");
125
+
126
+ _setStakingCondition(condition.timeUnit, _rewardsPerUnitTime);
127
+
128
+ emit UpdatedRewardsPerUnitTime(condition.rewardsPerUnitTime, _rewardsPerUnitTime);
129
+ }
130
+
131
+ /**
132
+ * @notice View amount staked and total rewards for a user.
133
+ *
134
+ * @param _staker Address for which to calculated rewards.
135
+ * @return _tokensStaked List of token-ids staked by staker.
136
+ * @return _rewards Available reward amount.
137
+ */
138
+ function getStakeInfo(
139
+ address _staker
140
+ ) external view virtual returns (uint256[] memory _tokensStaked, uint256 _rewards) {
141
+ uint256[] memory _indexedTokens = indexedTokens;
142
+ bool[] memory _isStakerToken = new bool[](_indexedTokens.length);
143
+ uint256 indexedTokenCount = _indexedTokens.length;
144
+ uint256 stakerTokenCount = 0;
145
+
146
+ for (uint256 i = 0; i < indexedTokenCount; i++) {
147
+ _isStakerToken[i] = stakerAddress[_indexedTokens[i]] == _staker;
148
+ if (_isStakerToken[i]) stakerTokenCount += 1;
149
+ }
150
+
151
+ _tokensStaked = new uint256[](stakerTokenCount);
152
+ uint256 count = 0;
153
+ for (uint256 i = 0; i < indexedTokenCount; i++) {
154
+ if (_isStakerToken[i]) {
155
+ _tokensStaked[count] = _indexedTokens[i];
156
+ count += 1;
157
+ }
158
+ }
159
+
160
+ _rewards = _availableRewards(_staker);
161
+ }
162
+
163
+ function getTimeUnit() public view returns (uint256 _timeUnit) {
164
+ _timeUnit = stakingConditions[nextConditionId - 1].timeUnit;
165
+ }
166
+
167
+ function getRewardsPerUnitTime() public view returns (uint256 _rewardsPerUnitTime) {
168
+ _rewardsPerUnitTime = stakingConditions[nextConditionId - 1].rewardsPerUnitTime;
169
+ }
170
+
171
+ /*///////////////////////////////////////////////////////////////
172
+ Internal Functions
173
+ //////////////////////////////////////////////////////////////*/
174
+
175
+ /// @dev Staking logic. Override to add custom logic.
176
+ function _stake(uint256[] calldata _tokenIds) internal virtual {
177
+ uint64 len = uint64(_tokenIds.length);
178
+ require(len != 0, "Staking 0 tokens");
179
+
180
+ address _stakingToken = stakingToken;
181
+
182
+ if (stakers[_stakeMsgSender()].amountStaked > 0) {
183
+ _updateUnclaimedRewardsForStaker(_stakeMsgSender());
184
+ } else {
185
+ stakersArray.push(_stakeMsgSender());
186
+ stakers[_stakeMsgSender()].timeOfLastUpdate = uint128(block.timestamp);
187
+ stakers[_stakeMsgSender()].conditionIdOflastUpdate = nextConditionId - 1;
188
+ }
189
+ for (uint256 i = 0; i < len; ++i) {
190
+ isStaking = 2;
191
+ IERC721(_stakingToken).safeTransferFrom(_stakeMsgSender(), address(this), _tokenIds[i]);
192
+ isStaking = 1;
193
+
194
+ stakerAddress[_tokenIds[i]] = _stakeMsgSender();
195
+
196
+ if (!isIndexed[_tokenIds[i]]) {
197
+ isIndexed[_tokenIds[i]] = true;
198
+ indexedTokens.push(_tokenIds[i]);
199
+ }
200
+ }
201
+ stakers[_stakeMsgSender()].amountStaked += len;
202
+
203
+ emit TokensStaked(_stakeMsgSender(), _tokenIds);
204
+ }
205
+
206
+ /// @dev Withdraw logic. Override to add custom logic.
207
+ function _withdraw(uint256[] calldata _tokenIds) internal virtual {
208
+ uint256 _amountStaked = stakers[_stakeMsgSender()].amountStaked;
209
+ uint64 len = uint64(_tokenIds.length);
210
+ require(len != 0, "Withdrawing 0 tokens");
211
+ require(_amountStaked >= len, "Withdrawing more than staked");
212
+
213
+ address _stakingToken = stakingToken;
214
+
215
+ _updateUnclaimedRewardsForStaker(_stakeMsgSender());
216
+
217
+ if (_amountStaked == len) {
218
+ address[] memory _stakersArray = stakersArray;
219
+ for (uint256 i = 0; i < _stakersArray.length; ++i) {
220
+ if (_stakersArray[i] == _stakeMsgSender()) {
221
+ stakersArray[i] = _stakersArray[_stakersArray.length - 1];
222
+ stakersArray.pop();
223
+ break;
224
+ }
225
+ }
226
+ }
227
+ stakers[_stakeMsgSender()].amountStaked -= len;
228
+
229
+ for (uint256 i = 0; i < len; ++i) {
230
+ require(stakerAddress[_tokenIds[i]] == _stakeMsgSender(), "Not staker");
231
+ stakerAddress[_tokenIds[i]] = address(0);
232
+ IERC721(_stakingToken).safeTransferFrom(address(this), _stakeMsgSender(), _tokenIds[i]);
233
+ }
234
+
235
+ emit TokensWithdrawn(_stakeMsgSender(), _tokenIds);
236
+ }
237
+
238
+ /// @dev Logic for claiming rewards. Override to add custom logic.
239
+ function _claimRewards() internal virtual {
240
+ uint256 rewards = stakers[_stakeMsgSender()].unclaimedRewards + _calculateRewards(_stakeMsgSender());
241
+
242
+ require(rewards != 0, "No rewards");
243
+
244
+ stakers[_stakeMsgSender()].timeOfLastUpdate = uint128(block.timestamp);
245
+ stakers[_stakeMsgSender()].unclaimedRewards = 0;
246
+ stakers[_stakeMsgSender()].conditionIdOflastUpdate = nextConditionId - 1;
247
+
248
+ _mintRewards(_stakeMsgSender(), rewards);
249
+
250
+ emit RewardsClaimed(_stakeMsgSender(), rewards);
251
+ }
252
+
253
+ /// @dev View available rewards for a user.
254
+ function _availableRewards(address _user) internal view virtual returns (uint256 _rewards) {
255
+ if (stakers[_user].amountStaked == 0) {
256
+ _rewards = stakers[_user].unclaimedRewards;
257
+ } else {
258
+ _rewards = stakers[_user].unclaimedRewards + _calculateRewards(_user);
259
+ }
260
+ }
261
+
262
+ /// @dev Update unclaimed rewards for a users. Called for every state change for a user.
263
+ function _updateUnclaimedRewardsForStaker(address _staker) internal virtual {
264
+ uint256 rewards = _calculateRewards(_staker);
265
+ stakers[_staker].unclaimedRewards += rewards;
266
+ stakers[_staker].timeOfLastUpdate = uint128(block.timestamp);
267
+ stakers[_staker].conditionIdOflastUpdate = nextConditionId - 1;
268
+ }
269
+
270
+ /// @dev Set staking conditions.
271
+ function _setStakingCondition(uint256 _timeUnit, uint256 _rewardsPerUnitTime) internal virtual {
272
+ require(_timeUnit != 0, "time-unit can't be 0");
273
+ uint256 conditionId = nextConditionId;
274
+ nextConditionId += 1;
275
+
276
+ stakingConditions[conditionId] = StakingCondition({
277
+ timeUnit: _timeUnit,
278
+ rewardsPerUnitTime: _rewardsPerUnitTime,
279
+ startTimestamp: block.timestamp,
280
+ endTimestamp: 0
281
+ });
282
+
283
+ if (conditionId > 0) {
284
+ stakingConditions[conditionId - 1].endTimestamp = block.timestamp;
285
+ }
286
+ }
287
+
288
+ /// @dev Calculate rewards for a staker.
289
+ function _calculateRewards(address _staker) internal view virtual returns (uint256 _rewards) {
290
+ Staker memory staker = stakers[_staker];
291
+
292
+ uint256 _stakerConditionId = staker.conditionIdOflastUpdate;
293
+ uint256 _nextConditionId = nextConditionId;
294
+
295
+ for (uint256 i = _stakerConditionId; i < _nextConditionId; i += 1) {
296
+ StakingCondition memory condition = stakingConditions[i];
297
+
298
+ uint256 startTime = i != _stakerConditionId ? condition.startTimestamp : staker.timeOfLastUpdate;
299
+ uint256 endTime = condition.endTimestamp != 0 ? condition.endTimestamp : block.timestamp;
300
+
301
+ (bool noOverflowProduct, uint256 rewardsProduct) = SafeMath.tryMul(
302
+ (endTime - startTime) * staker.amountStaked,
303
+ condition.rewardsPerUnitTime
304
+ );
305
+ (bool noOverflowSum, uint256 rewardsSum) = SafeMath.tryAdd(_rewards, rewardsProduct / condition.timeUnit);
306
+
307
+ _rewards = noOverflowProduct && noOverflowSum ? rewardsSum : _rewards;
308
+ }
309
+ }
310
+
311
+ /*////////////////////////////////////////////////////////////////////
312
+ Optional hooks that can be implemented in the derived contract
313
+ ///////////////////////////////////////////////////////////////////*/
314
+
315
+ /// @dev Exposes the ability to override the msg sender -- support ERC2771.
316
+ function _stakeMsgSender() internal virtual returns (address) {
317
+ return msg.sender;
318
+ }
319
+
320
+ /*///////////////////////////////////////////////////////////////
321
+ Virtual functions to be implemented in derived contract
322
+ //////////////////////////////////////////////////////////////*/
323
+
324
+ /**
325
+ * @notice View total rewards available in the staking contract.
326
+ *
327
+ */
328
+ function getRewardTokenBalance() external view virtual returns (uint256 _rewardsAvailableInContract);
329
+
330
+ /**
331
+ * @dev Mint/Transfer ERC20 rewards to the staker. Must override.
332
+ *
333
+ * @param _staker Address for which to calculated rewards.
334
+ * @param _rewards Amount of tokens to be given out as reward.
335
+ *
336
+ * For example, override as below to mint ERC20 rewards:
337
+ *
338
+ * ```
339
+ * function _mintRewards(address _staker, uint256 _rewards) internal override {
340
+ *
341
+ * TokenERC20(rewardTokenAddress).mintTo(_staker, _rewards);
342
+ *
343
+ * }
344
+ * ```
345
+ */
346
+ function _mintRewards(address _staker, uint256 _rewards) internal virtual;
347
+
348
+ /**
349
+ * @dev Returns whether staking restrictions can be set in given execution context.
350
+ * Must override.
351
+ *
352
+ *
353
+ * For example, override as below to restrict access to admin:
354
+ *
355
+ * ```
356
+ * function _canSetStakeConditions() internal override {
357
+ *
358
+ * return msg.sender == adminAddress;
359
+ *
360
+ * }
361
+ * ```
362
+ */
363
+ function _canSetStakeConditions() internal view virtual returns (bool);
364
+ }
@@ -0,0 +1,130 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @author thirdweb
5
+
6
+ import "./interface/ITokenBundle.sol";
7
+ import { CurrencyTransferLib } from "../lib/CurrencyTransferLib.sol";
8
+
9
+ interface IERC165 {
10
+ function supportsInterface(bytes4 interfaceId) external view returns (bool);
11
+ }
12
+
13
+ /**
14
+ * @title Token Bundle
15
+ * @notice `TokenBundle` contract extension allows bundling-up of ERC20/ERC721/ERC1155 and native-tokan assets
16
+ * in a data structure, and provides logic for setting/getting IDs and URIs for created bundles.
17
+ * @dev See {ITokenBundle}
18
+ */
19
+
20
+ abstract contract TokenBundle is ITokenBundle {
21
+ /// @dev Mapping from bundle UID => bundle info.
22
+ mapping(uint256 => BundleInfo) private bundle;
23
+
24
+ /// @dev Returns the total number of assets in a particular bundle.
25
+ function getTokenCountOfBundle(uint256 _bundleId) public view returns (uint256) {
26
+ return bundle[_bundleId].count;
27
+ }
28
+
29
+ /// @dev Returns an asset contained in a particular bundle, at a particular index.
30
+ function getTokenOfBundle(uint256 _bundleId, uint256 index) public view returns (Token memory) {
31
+ return bundle[_bundleId].tokens[index];
32
+ }
33
+
34
+ /// @dev Returns the uri of a particular bundle.
35
+ function getUriOfBundle(uint256 _bundleId) public view returns (string memory) {
36
+ return bundle[_bundleId].uri;
37
+ }
38
+
39
+ /// @dev Lets the calling contract create a bundle, by passing in a list of tokens and a unique id.
40
+ function _createBundle(Token[] calldata _tokensToBind, uint256 _bundleId) internal {
41
+ uint256 targetCount = _tokensToBind.length;
42
+
43
+ require(targetCount > 0, "!Tokens");
44
+ require(bundle[_bundleId].count == 0, "id exists");
45
+
46
+ for (uint256 i = 0; i < targetCount; i += 1) {
47
+ _checkTokenType(_tokensToBind[i]);
48
+ bundle[_bundleId].tokens[i] = _tokensToBind[i];
49
+ }
50
+
51
+ bundle[_bundleId].count = targetCount;
52
+ }
53
+
54
+ /// @dev Lets the calling contract update a bundle, by passing in a list of tokens and a unique id.
55
+ function _updateBundle(Token[] memory _tokensToBind, uint256 _bundleId) internal {
56
+ require(_tokensToBind.length > 0, "!Tokens");
57
+
58
+ uint256 currentCount = bundle[_bundleId].count;
59
+ uint256 targetCount = _tokensToBind.length;
60
+ uint256 check = currentCount > targetCount ? currentCount : targetCount;
61
+
62
+ for (uint256 i = 0; i < check; i += 1) {
63
+ if (i < targetCount) {
64
+ _checkTokenType(_tokensToBind[i]);
65
+ bundle[_bundleId].tokens[i] = _tokensToBind[i];
66
+ } else if (i < currentCount) {
67
+ delete bundle[_bundleId].tokens[i];
68
+ }
69
+ }
70
+
71
+ bundle[_bundleId].count = targetCount;
72
+ }
73
+
74
+ /// @dev Lets the calling contract add a token to a bundle for a unique bundle id and index.
75
+ function _addTokenInBundle(Token memory _tokenToBind, uint256 _bundleId) internal {
76
+ _checkTokenType(_tokenToBind);
77
+ uint256 id = bundle[_bundleId].count;
78
+
79
+ bundle[_bundleId].tokens[id] = _tokenToBind;
80
+ bundle[_bundleId].count += 1;
81
+ }
82
+
83
+ /// @dev Lets the calling contract update a token in a bundle for a unique bundle id and index.
84
+ function _updateTokenInBundle(Token memory _tokenToBind, uint256 _bundleId, uint256 _index) internal {
85
+ require(_index < bundle[_bundleId].count, "index DNE");
86
+ _checkTokenType(_tokenToBind);
87
+ bundle[_bundleId].tokens[_index] = _tokenToBind;
88
+ }
89
+
90
+ /// @dev Checks if the type of asset-contract is same as the TokenType specified.
91
+ function _checkTokenType(Token memory _token) internal view {
92
+ if (_token.tokenType == TokenType.ERC721) {
93
+ try IERC165(_token.assetContract).supportsInterface(0x80ac58cd) returns (bool supported721) {
94
+ require(supported721, "!TokenType");
95
+ } catch {
96
+ revert("!TokenType");
97
+ }
98
+ } else if (_token.tokenType == TokenType.ERC1155) {
99
+ try IERC165(_token.assetContract).supportsInterface(0xd9b67a26) returns (bool supported1155) {
100
+ require(supported1155, "!TokenType");
101
+ } catch {
102
+ revert("!TokenType");
103
+ }
104
+ } else if (_token.tokenType == TokenType.ERC20) {
105
+ if (_token.assetContract != CurrencyTransferLib.NATIVE_TOKEN) {
106
+ // 0x36372b07
107
+ try IERC165(_token.assetContract).supportsInterface(0x80ac58cd) returns (bool supported721) {
108
+ require(!supported721, "!TokenType");
109
+
110
+ try IERC165(_token.assetContract).supportsInterface(0xd9b67a26) returns (bool supported1155) {
111
+ require(!supported1155, "!TokenType");
112
+ } catch Error(string memory) {} catch {}
113
+ } catch Error(string memory) {} catch {}
114
+ }
115
+ }
116
+ }
117
+
118
+ /// @dev Lets the calling contract set/update the uri of a particular bundle.
119
+ function _setUriOfBundle(string memory _uri, uint256 _bundleId) internal {
120
+ bundle[_bundleId].uri = _uri;
121
+ }
122
+
123
+ /// @dev Lets the calling contract delete a particular bundle.
124
+ function _deleteBundle(uint256 _bundleId) internal {
125
+ for (uint256 i = 0; i < bundle[_bundleId].count; i += 1) {
126
+ delete bundle[_bundleId].tokens[i];
127
+ }
128
+ bundle[_bundleId].count = 0;
129
+ }
130
+ }
@@ -0,0 +1,97 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @author thirdweb
5
+
6
+ // ========== External imports ==========
7
+
8
+ import "../eip/interface/IERC1155.sol";
9
+ import "../eip/interface/IERC721.sol";
10
+
11
+ import "../external-deps/openzeppelin/utils/ERC1155/ERC1155Holder.sol";
12
+ import "../external-deps/openzeppelin/utils/ERC721/ERC721Holder.sol";
13
+
14
+ // ========== Internal imports ==========
15
+
16
+ import { TokenBundle, ITokenBundle } from "./TokenBundle.sol";
17
+ import { CurrencyTransferLib } from "../lib/CurrencyTransferLib.sol";
18
+
19
+ /**
20
+ * @title Token Store
21
+ * @notice `TokenStore` contract extension allows bundling-up of ERC20/ERC721/ERC1155 and native-tokan assets
22
+ * and provides logic for storing, releasing, and transferring them from the extending contract.
23
+ * @dev See {CurrencyTransferLib}
24
+ */
25
+
26
+ contract TokenStore is TokenBundle, ERC721Holder, ERC1155Holder {
27
+ /// @dev The address of the native token wrapper contract.
28
+ address internal immutable nativeTokenWrapper;
29
+
30
+ constructor(address _nativeTokenWrapper) {
31
+ nativeTokenWrapper = _nativeTokenWrapper;
32
+ }
33
+
34
+ /// @dev Store / escrow multiple ERC1155, ERC721, ERC20 tokens.
35
+ function _storeTokens(
36
+ address _tokenOwner,
37
+ Token[] calldata _tokens,
38
+ string memory _uriForTokens,
39
+ uint256 _idForTokens
40
+ ) internal {
41
+ _createBundle(_tokens, _idForTokens);
42
+ _setUriOfBundle(_uriForTokens, _idForTokens);
43
+ _transferTokenBatch(_tokenOwner, address(this), _tokens);
44
+ }
45
+
46
+ /// @dev Release stored / escrowed ERC1155, ERC721, ERC20 tokens.
47
+ function _releaseTokens(address _recipient, uint256 _idForContent) internal {
48
+ uint256 count = getTokenCountOfBundle(_idForContent);
49
+ Token[] memory tokensToRelease = new Token[](count);
50
+
51
+ for (uint256 i = 0; i < count; i += 1) {
52
+ tokensToRelease[i] = getTokenOfBundle(_idForContent, i);
53
+ }
54
+
55
+ _deleteBundle(_idForContent);
56
+
57
+ _transferTokenBatch(address(this), _recipient, tokensToRelease);
58
+ }
59
+
60
+ /// @dev Transfers an arbitrary ERC20 / ERC721 / ERC1155 token.
61
+ function _transferToken(address _from, address _to, Token memory _token) internal {
62
+ if (_token.tokenType == TokenType.ERC20) {
63
+ CurrencyTransferLib.transferCurrencyWithWrapper(
64
+ _token.assetContract,
65
+ _from,
66
+ _to,
67
+ _token.totalAmount,
68
+ nativeTokenWrapper
69
+ );
70
+ } else if (_token.tokenType == TokenType.ERC721) {
71
+ IERC721(_token.assetContract).safeTransferFrom(_from, _to, _token.tokenId);
72
+ } else if (_token.tokenType == TokenType.ERC1155) {
73
+ IERC1155(_token.assetContract).safeTransferFrom(_from, _to, _token.tokenId, _token.totalAmount, "");
74
+ }
75
+ }
76
+
77
+ /// @dev Transfers multiple arbitrary ERC20 / ERC721 / ERC1155 tokens.
78
+ function _transferTokenBatch(address _from, address _to, Token[] memory _tokens) internal {
79
+ uint256 nativeTokenValue;
80
+ for (uint256 i = 0; i < _tokens.length; i += 1) {
81
+ if (_tokens[i].assetContract == CurrencyTransferLib.NATIVE_TOKEN && _to == address(this)) {
82
+ nativeTokenValue += _tokens[i].totalAmount;
83
+ } else {
84
+ _transferToken(_from, _to, _tokens[i]);
85
+ }
86
+ }
87
+ if (nativeTokenValue != 0) {
88
+ Token memory _nativeToken = Token({
89
+ assetContract: CurrencyTransferLib.NATIVE_TOKEN,
90
+ tokenType: ITokenBundle.TokenType.ERC20,
91
+ tokenId: 0,
92
+ totalAmount: nativeTokenValue
93
+ });
94
+ _transferToken(_from, _to, _nativeToken);
95
+ }
96
+ }
97
+ }
@@ -0,0 +1,95 @@
1
+ // SPDX-License-Identifier: Apache 2.0
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @author thirdweb
5
+
6
+ import "../external-deps/openzeppelin/proxy/IERC1822Proxiable.sol";
7
+ import "../external-deps/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol";
8
+
9
+ /**
10
+ * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an
11
+ * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.
12
+ *
13
+ * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is
14
+ * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing
15
+ * `UUPSUpgradeable` with a custom implementation of upgrades.
16
+ *
17
+ * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.
18
+ *
19
+ * _Available since v4.1._
20
+ */
21
+ abstract contract Upgradeable is IERC1822Proxiable, ERC1967Upgrade {
22
+ /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment
23
+ address private immutable __self = address(this);
24
+
25
+ /**
26
+ * @dev Check that the execution is being performed through a delegatecall call and that the execution context is
27
+ * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case
28
+ * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a
29
+ * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to
30
+ * fail.
31
+ */
32
+ modifier onlyProxy() {
33
+ require(address(this) != __self, "Function must be called through delegatecall");
34
+ require(_getImplementation() == __self, "Function must be called through active proxy");
35
+ _;
36
+ }
37
+
38
+ /**
39
+ * @dev Check that the execution is not being performed through a delegate call. This allows a function to be
40
+ * callable on the implementing contract but not through proxies.
41
+ */
42
+ modifier notDelegated() {
43
+ require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall");
44
+ _;
45
+ }
46
+
47
+ /**
48
+ * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the
49
+ * implementation. It is used to validate that the this implementation remains valid after an upgrade.
50
+ *
51
+ * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
52
+ * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
53
+ * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.
54
+ */
55
+ function proxiableUUID() external view virtual override notDelegated returns (bytes32) {
56
+ return _IMPLEMENTATION_SLOT;
57
+ }
58
+
59
+ /**
60
+ * @dev Upgrade the implementation of the proxy to `newImplementation`.
61
+ *
62
+ * Calls {_authorizeUpgrade}.
63
+ *
64
+ * Emits an {Upgraded} event.
65
+ */
66
+ function upgradeTo(address newImplementation) external virtual onlyProxy {
67
+ _authorizeUpgrade(newImplementation);
68
+ _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);
69
+ }
70
+
71
+ /**
72
+ * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call
73
+ * encoded in `data`.
74
+ *
75
+ * Calls {_authorizeUpgrade}.
76
+ *
77
+ * Emits an {Upgraded} event.
78
+ */
79
+ function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {
80
+ _authorizeUpgrade(newImplementation);
81
+ _upgradeToAndCallUUPS(newImplementation, data, true);
82
+ }
83
+
84
+ /**
85
+ * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by
86
+ * {upgradeTo} and {upgradeToAndCall}.
87
+ *
88
+ * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.
89
+ *
90
+ * ```solidity
91
+ * function _authorizeUpgrade(address) internal override onlyOwner {}
92
+ * ```
93
+ */
94
+ function _authorizeUpgrade(address newImplementation) internal virtual;
95
+ }