@towns-protocol/contracts 0.0.302

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 (396) hide show
  1. package/LICENSE.txt +21 -0
  2. package/README.md +206 -0
  3. package/docs/permitAndStake_integration_guide.md +266 -0
  4. package/docs/swap_integration_guide.md +591 -0
  5. package/package.json +57 -0
  6. package/scripts/common/DeployBase.s.sol +26 -0
  7. package/scripts/common/DeployFacet.s.sol +7 -0
  8. package/scripts/common/Deployer.s.sol +33 -0
  9. package/scripts/common/Interaction.s.sol +51 -0
  10. package/scripts/deployments/diamonds/DeployAppRegistry.s.sol +168 -0
  11. package/scripts/deployments/diamonds/DeployBaseRegistry.s.sol +263 -0
  12. package/scripts/deployments/diamonds/DeployRiverAirdrop.s.sol +203 -0
  13. package/scripts/deployments/diamonds/DeployRiverMigration.s.sol +129 -0
  14. package/scripts/deployments/diamonds/DeployRiverRegistry.s.sol +175 -0
  15. package/scripts/deployments/diamonds/DeploySpace.s.sol +285 -0
  16. package/scripts/deployments/diamonds/DeploySpaceFactory.s.sol +416 -0
  17. package/scripts/deployments/diamonds/DeploySpaceOwner.s.sol +183 -0
  18. package/scripts/deployments/diamonds/DeploySwapRouter.s.sol +176 -0
  19. package/scripts/deployments/diamonds/IDiamondInitHelper.sol +11 -0
  20. package/scripts/deployments/facets/DeployAppAccount.s.sol +51 -0
  21. package/scripts/deployments/facets/DeployAppRegistryFacet.s.sol +69 -0
  22. package/scripts/deployments/facets/DeployArchitect.s.sol +51 -0
  23. package/scripts/deployments/facets/DeployAttestationRegistry.s.sol +36 -0
  24. package/scripts/deployments/facets/DeployBanning.s.sol +30 -0
  25. package/scripts/deployments/facets/DeployChannels.s.sol +35 -0
  26. package/scripts/deployments/facets/DeployCreateSpace.s.sol +42 -0
  27. package/scripts/deployments/facets/DeployDropFacet.s.sol +49 -0
  28. package/scripts/deployments/facets/DeployERC721A.s.sol +48 -0
  29. package/scripts/deployments/facets/DeployERC721ANonTransferable.s.sol +49 -0
  30. package/scripts/deployments/facets/DeployERC721AQueryable.s.sol +30 -0
  31. package/scripts/deployments/facets/DeployEntitlementChecker.s.sol +49 -0
  32. package/scripts/deployments/facets/DeployEntitlementDataQueryable.s.sol +29 -0
  33. package/scripts/deployments/facets/DeployEntitlementsManager.s.sol +33 -0
  34. package/scripts/deployments/facets/DeployExecutorFacet.s.sol +60 -0
  35. package/scripts/deployments/facets/DeployFeatureManager.s.sol +38 -0
  36. package/scripts/deployments/facets/DeployGuardianFacet.s.sol +39 -0
  37. package/scripts/deployments/facets/DeployImplementationRegistry.s.sol +36 -0
  38. package/scripts/deployments/facets/DeployMainnetDelegation.s.sol +43 -0
  39. package/scripts/deployments/facets/DeployMembership.s.sol +77 -0
  40. package/scripts/deployments/facets/DeployMembershipMetadata.s.sol +30 -0
  41. package/scripts/deployments/facets/DeployMembershipToken.s.sol +47 -0
  42. package/scripts/deployments/facets/DeployMerkleAirdrop.s.sol +37 -0
  43. package/scripts/deployments/facets/DeployMetadata.s.sol +39 -0
  44. package/scripts/deployments/facets/DeployMockLegacyArchitect.s.sol +33 -0
  45. package/scripts/deployments/facets/DeployNodeOperator.s.sol +49 -0
  46. package/scripts/deployments/facets/DeployNodeRegistry.s.sol +37 -0
  47. package/scripts/deployments/facets/DeployOperatorRegistry.s.sol +36 -0
  48. package/scripts/deployments/facets/DeployPartnerRegistry.s.sol +41 -0
  49. package/scripts/deployments/facets/DeployPlatformRequirements.s.sol +75 -0
  50. package/scripts/deployments/facets/DeployPrepayFacet.s.sol +31 -0
  51. package/scripts/deployments/facets/DeployPricingModules.s.sol +36 -0
  52. package/scripts/deployments/facets/DeployReferrals.s.sol +34 -0
  53. package/scripts/deployments/facets/DeployReviewFacet.s.sol +31 -0
  54. package/scripts/deployments/facets/DeployRewardsDistributionV2.s.sol +76 -0
  55. package/scripts/deployments/facets/DeployRiverConfig.s.sol +41 -0
  56. package/scripts/deployments/facets/DeployRoles.s.sol +48 -0
  57. package/scripts/deployments/facets/DeploySchemaRegistry.s.sol +35 -0
  58. package/scripts/deployments/facets/DeploySignerFacet.s.sol +47 -0
  59. package/scripts/deployments/facets/DeploySimpleApp.s.sol +10 -0
  60. package/scripts/deployments/facets/DeploySpaceDelegation.s.sol +43 -0
  61. package/scripts/deployments/facets/DeploySpaceEntitlementGated.s.sol +31 -0
  62. package/scripts/deployments/facets/DeploySpaceFactoryInit.s.sol +33 -0
  63. package/scripts/deployments/facets/DeploySpaceOwnerFacet.s.sol +71 -0
  64. package/scripts/deployments/facets/DeployStreamRegistry.s.sol +50 -0
  65. package/scripts/deployments/facets/DeploySwapFacet.s.sol +33 -0
  66. package/scripts/deployments/facets/DeploySwapRouterFacet.s.sol +38 -0
  67. package/scripts/deployments/facets/DeployTipping.s.sol +31 -0
  68. package/scripts/deployments/facets/DeployTokenMigration.s.sol +40 -0
  69. package/scripts/deployments/facets/DeployTownsPoints.s.sol +53 -0
  70. package/scripts/deployments/facets/DeployTreasury.s.sol +30 -0
  71. package/scripts/deployments/facets/DeployUpgradeableBeacon.s.sol +34 -0
  72. package/scripts/deployments/facets/DeployWalletLink.s.sol +56 -0
  73. package/scripts/deployments/facets/DeployXChain.s.sol +35 -0
  74. package/scripts/deployments/utils/DeployAccountFactory.s.sol +40 -0
  75. package/scripts/deployments/utils/DeployEntitlementGatedExample.s.sol +23 -0
  76. package/scripts/deployments/utils/DeployEntrypoint.s.sol +28 -0
  77. package/scripts/deployments/utils/DeployMember.s.sol +95 -0
  78. package/scripts/deployments/utils/DeployMockDiamond.s.sol +7 -0
  79. package/scripts/deployments/utils/DeployMockERC20.s.sol +24 -0
  80. package/scripts/deployments/utils/DeployMockERC721A.s.sol +45 -0
  81. package/scripts/deployments/utils/DeployMockLegacyMembership.s.sol +29 -0
  82. package/scripts/deployments/utils/DeployMockMessenger.s.sol +42 -0
  83. package/scripts/deployments/utils/DeployMockNFT.s.sol +86 -0
  84. package/scripts/deployments/utils/DeployPoapEntitlement.s.sol +16 -0
  85. package/scripts/deployments/utils/DeployProxyBatchDelegation.s.sol +112 -0
  86. package/scripts/deployments/utils/DeploySpaceProxyInitializer.s.sol +28 -0
  87. package/scripts/deployments/utils/DeployTieredLogPricingV2.s.sol +23 -0
  88. package/scripts/deployments/utils/DeployTieredLogPricingV3.s.sol +23 -0
  89. package/scripts/deployments/utils/DeployTownsBase.s.sol +95 -0
  90. package/scripts/deployments/utils/DeployTownsMainnet.s.sol +66 -0
  91. package/scripts/deployments/utils/DeployTownsMulti.s.sol +53 -0
  92. package/scripts/deployments/utils/DeployWrappedTowns.s.sol +52 -0
  93. package/scripts/deployments/utils/LibLayerZeroValues.sol +34 -0
  94. package/scripts/deployments/utils/pricing/TieredLogPricing.s.sol +45 -0
  95. package/scripts/interactions/InteractAirdrop.s.sol +57 -0
  96. package/scripts/interactions/InteractAlphaPost.s.sol +32 -0
  97. package/scripts/interactions/InteractAlphaSparse.s.sol +173 -0
  98. package/scripts/interactions/InteractBaseAlpha.s.sol +84 -0
  99. package/scripts/interactions/InteractBaseBridge.s.sol +48 -0
  100. package/scripts/interactions/InteractBridgeLayerZero.s.sol +102 -0
  101. package/scripts/interactions/InteractClaimCondition.s.sol +56 -0
  102. package/scripts/interactions/InteractCreateSpace.s.sol +50 -0
  103. package/scripts/interactions/InteractDiamondCut.s.sol +47 -0
  104. package/scripts/interactions/InteractDropFacet.s.sol +32 -0
  105. package/scripts/interactions/InteractEnableNewSnapshotFormat.s.sol +27 -0
  106. package/scripts/interactions/InteractEnableNode2NodeAuth.s.sol +27 -0
  107. package/scripts/interactions/InteractMembership.s.sol +42 -0
  108. package/scripts/interactions/InteractMockERC721A.s.sol +20 -0
  109. package/scripts/interactions/InteractNodeOperators.s.sol +41 -0
  110. package/scripts/interactions/InteractPostDeploy.s.sol +59 -0
  111. package/scripts/interactions/InteractPrepay.s.sol +30 -0
  112. package/scripts/interactions/InteractRegisterApp.s.sol +61 -0
  113. package/scripts/interactions/InteractRiverAlpha.s.sol +30 -0
  114. package/scripts/interactions/InteractRiverAlphaSparse.s.sol +117 -0
  115. package/scripts/interactions/InteractRiverMainnet.s.sol +27 -0
  116. package/scripts/interactions/InteractRiverRegistry.s.sol +36 -0
  117. package/scripts/interactions/InteractRiverRegistrySetBlocklist.s.sol +30 -0
  118. package/scripts/interactions/InteractRiverRegistrySetFreq.s.sol +27 -0
  119. package/scripts/interactions/InteractRiverRegistrySetRepl.s.sol +30 -0
  120. package/scripts/interactions/InteractSetDefaultUri.s.sol +20 -0
  121. package/scripts/interactions/InteractSetDefaultUriLocalhost.s.sol +19 -0
  122. package/scripts/interactions/InteractTransferOwnership.s.sol +21 -0
  123. package/scripts/interactions/InteractUpdateMbRecencyCheck.s.sol +27 -0
  124. package/scripts/interactions/InteractUpdateMediaChunkCount.s.sol +27 -0
  125. package/scripts/interactions/InteractUpdateMediaChunkSize.s.sol +27 -0
  126. package/scripts/interactions/helpers/AlphaHelper.sol +149 -0
  127. package/scripts/interactions/helpers/RiverConfigValues.sol +22 -0
  128. package/scripts/interactions/interfaces/IL1StandardBridge.sol +35 -0
  129. package/scripts/interactions/interfaces/IL2StandardBridge.sol +69 -0
  130. package/src/airdrop/drop/DropBase.sol +210 -0
  131. package/src/airdrop/drop/DropClaim.sol +55 -0
  132. package/src/airdrop/drop/DropFacet.sol +176 -0
  133. package/src/airdrop/drop/DropGroup.sol +111 -0
  134. package/src/airdrop/drop/DropStorage.sol +23 -0
  135. package/src/airdrop/drop/IDropFacet.sol +136 -0
  136. package/src/airdrop/points/CheckIn.sol +71 -0
  137. package/src/airdrop/points/ITownsPoints.sol +64 -0
  138. package/src/airdrop/points/TownsPoints.sol +196 -0
  139. package/src/airdrop/points/TownsPointsStorage.sol +22 -0
  140. package/src/apps/BaseApp.sol +62 -0
  141. package/src/apps/ITownsApp.sol +28 -0
  142. package/src/apps/SchemaResolver.sol +170 -0
  143. package/src/apps/facets/attest/AttestationBase.sol +335 -0
  144. package/src/apps/facets/attest/AttestationLib.sol +64 -0
  145. package/src/apps/facets/attest/AttestationRegistry.sol +39 -0
  146. package/src/apps/facets/attest/AttestationStorage.sol +35 -0
  147. package/src/apps/facets/attest/IAttestationRegistry.sol +43 -0
  148. package/src/apps/facets/registry/AppRegistryBase.sol +403 -0
  149. package/src/apps/facets/registry/AppRegistryFacet.sol +173 -0
  150. package/src/apps/facets/registry/AppRegistryStorage.sol +53 -0
  151. package/src/apps/facets/registry/IAppRegistry.sol +159 -0
  152. package/src/apps/facets/schema/ISchema.sol +14 -0
  153. package/src/apps/facets/schema/SchemaBase.sol +88 -0
  154. package/src/apps/facets/schema/SchemaLib.sol +14 -0
  155. package/src/apps/facets/schema/SchemaRegistry.sol +51 -0
  156. package/src/apps/facets/schema/SchemaStorage.sol +34 -0
  157. package/src/apps/helpers/ISimpleApp.sol +51 -0
  158. package/src/apps/helpers/SimpleApp.sol +97 -0
  159. package/src/apps/helpers/SimpleAppStorage.sol +27 -0
  160. package/src/base/registry/facets/checker/EntitlementChecker.sol +237 -0
  161. package/src/base/registry/facets/checker/EntitlementCheckerStorage.sol +28 -0
  162. package/src/base/registry/facets/checker/IEntitlementChecker.sol +95 -0
  163. package/src/base/registry/facets/delegation/ISpaceDelegation.sol +69 -0
  164. package/src/base/registry/facets/delegation/SpaceDelegationFacet.sol +250 -0
  165. package/src/base/registry/facets/delegation/SpaceDelegationStorage.sol +35 -0
  166. package/src/base/registry/facets/distribution/v1/IRewardsDistribution.sol +51 -0
  167. package/src/base/registry/facets/distribution/v1/RewardsDistribution.sol +439 -0
  168. package/src/base/registry/facets/distribution/v1/RewardsDistributionStorage.sol +32 -0
  169. package/src/base/registry/facets/distribution/v2/DelegationProxy.sol +53 -0
  170. package/src/base/registry/facets/distribution/v2/IRewardsDistribution.sol +372 -0
  171. package/src/base/registry/facets/distribution/v2/RewardsDistributionBase.sol +299 -0
  172. package/src/base/registry/facets/distribution/v2/RewardsDistributionStorage.sol +37 -0
  173. package/src/base/registry/facets/distribution/v2/RewardsDistributionV2.sol +392 -0
  174. package/src/base/registry/facets/distribution/v2/StakingRewards.sol +466 -0
  175. package/src/base/registry/facets/mainnet/ICrossDomainMessenger.sol +58 -0
  176. package/src/base/registry/facets/mainnet/IMainnetDelegation.sol +127 -0
  177. package/src/base/registry/facets/mainnet/MainnetDelegation.sol +119 -0
  178. package/src/base/registry/facets/mainnet/MainnetDelegationBase.sol +274 -0
  179. package/src/base/registry/facets/mainnet/MainnetDelegationStorage.sol +36 -0
  180. package/src/base/registry/facets/operator/INodeOperator.sol +91 -0
  181. package/src/base/registry/facets/operator/NodeOperatorFacet.sol +189 -0
  182. package/src/base/registry/facets/operator/NodeOperatorStorage.sol +39 -0
  183. package/src/base/registry/facets/xchain/IXChain.sol +54 -0
  184. package/src/base/registry/facets/xchain/XChain.sol +158 -0
  185. package/src/base/registry/facets/xchain/XChainCheckLib.sol +105 -0
  186. package/src/base/registry/facets/xchain/XChainLib.sol +46 -0
  187. package/src/diamond/facets/beacon/UpgradeableBeacon.sol +38 -0
  188. package/src/diamond/facets/beacon/UpgradeableBeaconFacet.sol +34 -0
  189. package/src/diamond/facets/governance/votes/Checkpoints.sol +642 -0
  190. package/src/diamond/facets/governance/votes/Votes.sol +63 -0
  191. package/src/diamond/facets/governance/votes/VotesBase.sol +274 -0
  192. package/src/diamond/facets/governance/votes/VotesStorage.sol +21 -0
  193. package/src/diamond/facets/governance/votes/enumerable/IVotesEnumerable.sol +38 -0
  194. package/src/diamond/facets/governance/votes/enumerable/VotesEnumerable.sol +39 -0
  195. package/src/diamond/facets/governance/votes/enumerable/VotesEnumerableLib.sol +102 -0
  196. package/src/diamond/facets/metadata/IMetadata.sol +27 -0
  197. package/src/diamond/facets/metadata/MetadataFacet.sol +71 -0
  198. package/src/diamond/facets/token/ERC5643/ERC5643.sol +51 -0
  199. package/src/diamond/facets/token/ERC5643/ERC5643Base.sol +48 -0
  200. package/src/diamond/facets/token/ERC5643/ERC5643Storage.sol +26 -0
  201. package/src/diamond/facets/token/ERC5643/IERC5643.sol +44 -0
  202. package/src/diamond/facets/token/ERC721A/ERC721A.sol +270 -0
  203. package/src/diamond/facets/token/ERC721A/ERC721ABase.sol +829 -0
  204. package/src/diamond/facets/token/ERC721A/ERC721ANonTransferable.sol +21 -0
  205. package/src/diamond/facets/token/ERC721A/ERC721AStorage.sol +115 -0
  206. package/src/diamond/facets/token/ERC721A/IERC721A.sol +283 -0
  207. package/src/diamond/facets/token/ERC721A/extensions/ERC721AQueryable.sol +134 -0
  208. package/src/diamond/facets/token/ERC721A/extensions/IERC721AQueryable.sol +83 -0
  209. package/src/diamond/utils/Context.sol +19 -0
  210. package/src/factory/SpaceFactoryInit.sol +17 -0
  211. package/src/factory/facets/architect/Architect.sol +98 -0
  212. package/src/factory/facets/architect/ArchitectBase.sol +95 -0
  213. package/src/factory/facets/architect/ArchitectStorage.sol +28 -0
  214. package/src/factory/facets/architect/IArchitect.sol +155 -0
  215. package/src/factory/facets/architect/ImplementationStorage.sol +42 -0
  216. package/src/factory/facets/architect/pricing/IPricingModules.sol +41 -0
  217. package/src/factory/facets/architect/pricing/PricingModulesBase.sol +89 -0
  218. package/src/factory/facets/architect/pricing/PricingModulesFacet.sol +40 -0
  219. package/src/factory/facets/architect/pricing/PricingModulesStorage.sol +30 -0
  220. package/src/factory/facets/create/CreateSpace.sol +107 -0
  221. package/src/factory/facets/create/CreateSpaceLib.sol +335 -0
  222. package/src/factory/facets/create/ICreateSpace.sol +70 -0
  223. package/src/factory/facets/feature/FeatureConditionLib.sol +53 -0
  224. package/src/factory/facets/feature/FeatureManagerFacet.sol +66 -0
  225. package/src/factory/facets/feature/FeatureManagerLib.sol +168 -0
  226. package/src/factory/facets/feature/IFeatureManagerFacet.sol +73 -0
  227. package/src/factory/facets/partner/IPartnerRegistry.sol +56 -0
  228. package/src/factory/facets/partner/PartnerRegistry.sol +57 -0
  229. package/src/factory/facets/partner/PartnerRegistryBase.sol +132 -0
  230. package/src/factory/facets/partner/PartnerRegistryStorage.sol +40 -0
  231. package/src/factory/facets/platform/requirements/IPlatformRequirements.sol +143 -0
  232. package/src/factory/facets/platform/requirements/PlatformRequirementsBase.sol +124 -0
  233. package/src/factory/facets/platform/requirements/PlatformRequirementsFacet.sol +122 -0
  234. package/src/factory/facets/platform/requirements/PlatformRequirementsStorage.sol +41 -0
  235. package/src/factory/facets/registry/IImplementationRegistry.sol +46 -0
  236. package/src/factory/facets/registry/ImplementationRegistry.sol +64 -0
  237. package/src/factory/facets/registry/ImplementationRegistryStorage.sol +28 -0
  238. package/src/factory/facets/wallet-link/IWalletLink.sol +218 -0
  239. package/src/factory/facets/wallet-link/WalletLink.sol +108 -0
  240. package/src/factory/facets/wallet-link/WalletLinkBase.sol +492 -0
  241. package/src/factory/facets/wallet-link/interfaces/IDelegateRegistry.sol +63 -0
  242. package/src/factory/facets/wallet-link/interfaces/IDelegateRegistryV1.sol +35 -0
  243. package/src/factory/facets/wallet-link/interfaces/ISCL_EIP6565.sol +24 -0
  244. package/src/factory/facets/wallet-link/libraries/SolanaUtils.sol +161 -0
  245. package/src/factory/facets/wallet-link/libraries/WalletLib.sol +62 -0
  246. package/src/river/registry/facets/config/IRiverConfig.sol +117 -0
  247. package/src/river/registry/facets/config/RiverConfig.sol +174 -0
  248. package/src/river/registry/facets/node/INodeRegistry.sol +69 -0
  249. package/src/river/registry/facets/node/NodeRegistry.sol +143 -0
  250. package/src/river/registry/facets/operator/IOperatorRegistry.sol +28 -0
  251. package/src/river/registry/facets/operator/OperatorRegistry.sol +86 -0
  252. package/src/river/registry/facets/stream/IStreamRegistry.sol +184 -0
  253. package/src/river/registry/facets/stream/StreamRegistry.sol +396 -0
  254. package/src/river/registry/libraries/RegistryErrors.sol +24 -0
  255. package/src/river/registry/libraries/RegistryStorage.sol +181 -0
  256. package/src/router/ISwapRouter.sol +226 -0
  257. package/src/router/Permit2Hash.sol +92 -0
  258. package/src/router/SwapRouter.sol +463 -0
  259. package/src/router/SwapRouterStorage.sol +21 -0
  260. package/src/spaces/entitlements/ICrossChainEntitlement.sol +22 -0
  261. package/src/spaces/entitlements/IEntitlement.sol +61 -0
  262. package/src/spaces/entitlements/PolymarketEntitlement.sol +79 -0
  263. package/src/spaces/entitlements/poap/IPOAP.sol +26 -0
  264. package/src/spaces/entitlements/poap/PoapEntitlement.sol +56 -0
  265. package/src/spaces/entitlements/rule/IRuleEntitlement.sol +174 -0
  266. package/src/spaces/entitlements/rule/RuleEntitlement.sol +183 -0
  267. package/src/spaces/entitlements/rule/RuleEntitlementV2.sol +219 -0
  268. package/src/spaces/entitlements/user/IUserEntitlement.sol +24 -0
  269. package/src/spaces/entitlements/user/UserEntitlement.sol +273 -0
  270. package/src/spaces/facets/DependencyLib.sol +60 -0
  271. package/src/spaces/facets/Entitled.sol +172 -0
  272. package/src/spaces/facets/Permissions.sol +21 -0
  273. package/src/spaces/facets/account/AppAccount.sol +93 -0
  274. package/src/spaces/facets/account/AppAccountBase.sol +275 -0
  275. package/src/spaces/facets/account/AppAccountStorage.sol +63 -0
  276. package/src/spaces/facets/account/IAppAccount.sol +71 -0
  277. package/src/spaces/facets/account/SignerFacet.sol +26 -0
  278. package/src/spaces/facets/banning/Banning.sol +41 -0
  279. package/src/spaces/facets/banning/BanningBase.sol +33 -0
  280. package/src/spaces/facets/banning/BanningStorage.sol +23 -0
  281. package/src/spaces/facets/banning/IBanning.sol +35 -0
  282. package/src/spaces/facets/channels/ChannelBase.sol +87 -0
  283. package/src/spaces/facets/channels/ChannelService.sol +177 -0
  284. package/src/spaces/facets/channels/ChannelStorage.sol +34 -0
  285. package/src/spaces/facets/channels/Channels.sol +80 -0
  286. package/src/spaces/facets/channels/IChannel.sol +98 -0
  287. package/src/spaces/facets/dispatcher/DispatcherBase.sol +86 -0
  288. package/src/spaces/facets/dispatcher/DispatcherStorage.sol +21 -0
  289. package/src/spaces/facets/dispatcher/IDispatcher.sol +6 -0
  290. package/src/spaces/facets/entitlements/EntitlementsManager.sol +49 -0
  291. package/src/spaces/facets/entitlements/EntitlementsManagerBase.sol +87 -0
  292. package/src/spaces/facets/entitlements/EntitlementsManagerService.sol +142 -0
  293. package/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol +34 -0
  294. package/src/spaces/facets/entitlements/IEntitlementsManager.sol +67 -0
  295. package/src/spaces/facets/entitlements/extensions/EntitlementDataQueryable.sol +153 -0
  296. package/src/spaces/facets/entitlements/extensions/IEntitlementDataQueryable.sol +32 -0
  297. package/src/spaces/facets/executor/ExecutorBase.sol +564 -0
  298. package/src/spaces/facets/executor/ExecutorFacet.sol +178 -0
  299. package/src/spaces/facets/executor/ExecutorStorage.sol +99 -0
  300. package/src/spaces/facets/executor/GroupLib.sol +128 -0
  301. package/src/spaces/facets/executor/IExecutor.sol +287 -0
  302. package/src/spaces/facets/executor/hooks/HookBase.sol +172 -0
  303. package/src/spaces/facets/executor/hooks/HookLib.sol +38 -0
  304. package/src/spaces/facets/executor/hooks/IHookBase.sol +48 -0
  305. package/src/spaces/facets/gated/EntitlementGated.sol +59 -0
  306. package/src/spaces/facets/gated/EntitlementGatedBase.sol +324 -0
  307. package/src/spaces/facets/gated/EntitlementGatedStorage.sol +29 -0
  308. package/src/spaces/facets/gated/IEntitlementGated.sol +55 -0
  309. package/src/spaces/facets/guardian/GuardianBase.sol +80 -0
  310. package/src/spaces/facets/guardian/GuardianFacet.sol +43 -0
  311. package/src/spaces/facets/guardian/GuardianStorage.sol +27 -0
  312. package/src/spaces/facets/guardian/IGuardian.sol +54 -0
  313. package/src/spaces/facets/membership/IMembership.sol +216 -0
  314. package/src/spaces/facets/membership/MembershipBase.sol +272 -0
  315. package/src/spaces/facets/membership/MembershipFacet.sol +191 -0
  316. package/src/spaces/facets/membership/MembershipStorage.sol +40 -0
  317. package/src/spaces/facets/membership/join/MembershipJoin.sol +547 -0
  318. package/src/spaces/facets/membership/metadata/IMembershipMetadata.sol +9 -0
  319. package/src/spaces/facets/membership/metadata/MembershipMetadata.sol +32 -0
  320. package/src/spaces/facets/membership/pricing/IMembershipPricing.sol +18 -0
  321. package/src/spaces/facets/membership/pricing/fixed/FixedPricing.sol +29 -0
  322. package/src/spaces/facets/membership/pricing/fixed/FixedPricingStorage.sol +27 -0
  323. package/src/spaces/facets/membership/pricing/tiered/TieredLogPricingOracleV2.sol +148 -0
  324. package/src/spaces/facets/membership/pricing/tiered/TieredLogPricingOracleV3.sol +137 -0
  325. package/src/spaces/facets/membership/token/MembershipToken.sol +25 -0
  326. package/src/spaces/facets/owner/ISpaceOwner.sol +85 -0
  327. package/src/spaces/facets/owner/SpaceOwner.sol +174 -0
  328. package/src/spaces/facets/owner/SpaceOwnerBase.sol +121 -0
  329. package/src/spaces/facets/owner/SpaceOwnerStorage.sol +41 -0
  330. package/src/spaces/facets/owner/SpaceOwnerUriBase.sol +54 -0
  331. package/src/spaces/facets/points/PointsBase.sol +35 -0
  332. package/src/spaces/facets/prepay/IPrepay.sol +43 -0
  333. package/src/spaces/facets/prepay/PrepayBase.sol +27 -0
  334. package/src/spaces/facets/prepay/PrepayFacet.sol +59 -0
  335. package/src/spaces/facets/prepay/PrepayStorage.sol +26 -0
  336. package/src/spaces/facets/proxy/ISpaceProxyInitializer.sol +21 -0
  337. package/src/spaces/facets/proxy/SpaceProxy.sol +15 -0
  338. package/src/spaces/facets/proxy/SpaceProxyInitializer.sol +55 -0
  339. package/src/spaces/facets/referrals/IReferrals.sol +98 -0
  340. package/src/spaces/facets/referrals/ReferralsBase.sol +81 -0
  341. package/src/spaces/facets/referrals/ReferralsFacet.sol +65 -0
  342. package/src/spaces/facets/referrals/ReferralsStorage.sol +36 -0
  343. package/src/spaces/facets/review/IReview.sol +50 -0
  344. package/src/spaces/facets/review/ReviewFacet.sol +105 -0
  345. package/src/spaces/facets/review/ReviewStorage.sol +29 -0
  346. package/src/spaces/facets/roles/IRoles.sol +197 -0
  347. package/src/spaces/facets/roles/Roles.sol +123 -0
  348. package/src/spaces/facets/roles/RolesBase.sol +420 -0
  349. package/src/spaces/facets/roles/RolesStorage.sol +132 -0
  350. package/src/spaces/facets/swap/ISwapFacet.sol +91 -0
  351. package/src/spaces/facets/swap/SwapFacet.sol +290 -0
  352. package/src/spaces/facets/swap/SwapFacetStorage.sol +24 -0
  353. package/src/spaces/facets/tipping/ITipping.sol +80 -0
  354. package/src/spaces/facets/tipping/TippingBase.sol +73 -0
  355. package/src/spaces/facets/tipping/TippingFacet.sol +123 -0
  356. package/src/spaces/facets/treasury/ITreasury.sol +64 -0
  357. package/src/spaces/facets/treasury/Treasury.sol +82 -0
  358. package/src/spaces/facets/xchain/SpaceEntitlementGated.sol +62 -0
  359. package/src/tokens/Member.sol +246 -0
  360. package/src/tokens/lock/ILock.sol +42 -0
  361. package/src/tokens/lock/LockBase.sol +64 -0
  362. package/src/tokens/lock/LockFacet.sol +44 -0
  363. package/src/tokens/lock/LockStorage.sol +26 -0
  364. package/src/tokens/mainnet/claimer/AuthorizedClaimerStorage.sol +26 -0
  365. package/src/tokens/mainnet/claimer/AuthorizedClaimers.sol +84 -0
  366. package/src/tokens/mainnet/claimer/IAuthorizedClaimers.sol +36 -0
  367. package/src/tokens/mainnet/delegation/ProxyBatchDelegation.sol +86 -0
  368. package/src/tokens/migration/ITokenMigration.sol +35 -0
  369. package/src/tokens/migration/TokenMigrationFacet.sol +86 -0
  370. package/src/tokens/migration/TokenMigrationStorage.sol +27 -0
  371. package/src/tokens/towns/base/IERC7802.sol +30 -0
  372. package/src/tokens/towns/base/IOptimismMintableERC20.sol +31 -0
  373. package/src/tokens/towns/base/ISemver.sol +13 -0
  374. package/src/tokens/towns/base/Towns.sol +283 -0
  375. package/src/tokens/towns/base/TownsDeployer.sol +32 -0
  376. package/src/tokens/towns/base/TownsLib.sol +31 -0
  377. package/src/tokens/towns/base/versions/TownsV2.sol +15 -0
  378. package/src/tokens/towns/mainnet/ITowns.sol +56 -0
  379. package/src/tokens/towns/mainnet/Towns.sol +220 -0
  380. package/src/tokens/towns/mainnet/libs/TokenInflationLib.sol +89 -0
  381. package/src/tokens/towns/multichain/Towns.sol +19 -0
  382. package/src/tokens/towns/multichain/wTowns.sol +18 -0
  383. package/src/utils/Airdrop.sol +156 -0
  384. package/src/utils/airdrop/merkle/IMerkleAirdrop.sol +55 -0
  385. package/src/utils/airdrop/merkle/MerkleAirdrop.sol +118 -0
  386. package/src/utils/airdrop/merkle/MerkleAirdropStorage.sol +29 -0
  387. package/src/utils/interfaces/AggregatorV3Interface.sol +37 -0
  388. package/src/utils/interfaces/IMulticall.sol +10 -0
  389. package/src/utils/interfaces/IWETH.sol +10 -0
  390. package/src/utils/libraries/BasisPoints.sol +24 -0
  391. package/src/utils/libraries/Create2Utils.sol +74 -0
  392. package/src/utils/libraries/CurrencyTransfer.sol +99 -0
  393. package/src/utils/libraries/CustomRevert.sol +49 -0
  394. package/src/utils/libraries/Factory.sol +66 -0
  395. package/src/utils/libraries/StringSet.sol +190 -0
  396. package/src/utils/libraries/Validator.sol +31 -0
@@ -0,0 +1,272 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IPlatformRequirements} from "../../../factory/facets/platform/requirements/IPlatformRequirements.sol";
6
+ import {IPricingModules} from "../../../factory/facets/architect/pricing/IPricingModules.sol";
7
+ import {IMembershipBase} from "./IMembership.sol";
8
+ import {IMembershipPricing} from "./pricing/IMembershipPricing.sol";
9
+
10
+ // libraries
11
+ import {FixedPointMathLib} from "solady/utils/FixedPointMathLib.sol";
12
+ import {SafeTransferLib} from "solady/utils/SafeTransferLib.sol";
13
+ import {BasisPoints} from "../../../utils/libraries/BasisPoints.sol";
14
+ import {CurrencyTransfer} from "../../../utils/libraries/CurrencyTransfer.sol";
15
+ import {CustomRevert} from "../../../utils/libraries/CustomRevert.sol";
16
+ import {MembershipStorage} from "./MembershipStorage.sol";
17
+
18
+ abstract contract MembershipBase is IMembershipBase {
19
+ using CustomRevert for bytes4;
20
+ using SafeTransferLib for address;
21
+
22
+ function __MembershipBase_init(Membership memory info, address spaceFactory) internal {
23
+ MembershipStorage.Layout storage ds = MembershipStorage.layout();
24
+
25
+ ds.spaceFactory = spaceFactory;
26
+ ds.pricingModule = info.pricingModule;
27
+ ds.membershipCurrency = CurrencyTransfer.NATIVE_TOKEN;
28
+ ds.membershipMaxSupply = info.maxSupply;
29
+
30
+ if (info.freeAllocation > 0) {
31
+ _verifyFreeAllocation(info.freeAllocation);
32
+ ds.freeAllocation = info.freeAllocation;
33
+ }
34
+
35
+ ds.freeAllocationEnabled = true;
36
+
37
+ if (info.price > 0) {
38
+ _verifyPrice(info.price);
39
+ IMembershipPricing(info.pricingModule).setPrice(info.price);
40
+ }
41
+
42
+ if (info.duration > 0) {
43
+ _verifyDuration(info.duration);
44
+ ds.membershipDuration = info.duration;
45
+ }
46
+ }
47
+
48
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
49
+ /* MEMBERSHIP */
50
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
51
+
52
+ function _collectProtocolFee(
53
+ address payer,
54
+ uint256 membershipPrice
55
+ ) internal returns (uint256 protocolFee) {
56
+ protocolFee = _getProtocolFee(membershipPrice);
57
+
58
+ // transfer the platform fee to the platform fee recipient
59
+ CurrencyTransfer.transferCurrency(
60
+ _getMembershipCurrency(),
61
+ payer, // from
62
+ _getPlatformRequirements().getFeeRecipient(), // to
63
+ protocolFee
64
+ );
65
+ }
66
+
67
+ function _getProtocolFee(uint256 membershipPrice) internal view returns (uint256) {
68
+ IPlatformRequirements platform = _getPlatformRequirements();
69
+
70
+ uint256 minPrice = platform.getMembershipMinPrice();
71
+
72
+ if (membershipPrice < minPrice) return platform.getMembershipFee();
73
+
74
+ return BasisPoints.calculate(membershipPrice, platform.getMembershipBps());
75
+ }
76
+
77
+ function _transferIn(address from, uint256 amount) internal returns (uint256) {
78
+ MembershipStorage.Layout storage ds = MembershipStorage.layout();
79
+
80
+ // get the currency being used for membership
81
+ address currency = _getMembershipCurrency();
82
+
83
+ if (currency == CurrencyTransfer.NATIVE_TOKEN) {
84
+ ds.tokenBalance += amount;
85
+ return amount;
86
+ }
87
+
88
+ // handle erc20 tokens
89
+ uint256 balanceBefore = currency.balanceOf(address(this));
90
+ CurrencyTransfer.safeTransferERC20(currency, from, address(this), amount);
91
+ uint256 balanceAfter = currency.balanceOf(address(this));
92
+
93
+ // Calculate the amount of tokens transferred
94
+ uint256 finalAmount = balanceAfter - balanceBefore;
95
+ if (finalAmount != amount) Membership__InsufficientPayment.selector.revertWith();
96
+
97
+ ds.tokenBalance += finalAmount;
98
+ return finalAmount;
99
+ }
100
+
101
+ function _getCreatorBalance() internal view returns (uint256) {
102
+ return MembershipStorage.layout().tokenBalance;
103
+ }
104
+
105
+ function _setCreatorBalance(uint256 newBalance) internal {
106
+ MembershipStorage.layout().tokenBalance = newBalance;
107
+ }
108
+
109
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
110
+ /* DURATION */
111
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
112
+
113
+ function _verifyDuration(uint64 duration) internal view {
114
+ uint256 maxDuration = _getPlatformRequirements().getMembershipDuration();
115
+
116
+ if (duration == 0) Membership__InvalidDuration.selector.revertWith();
117
+
118
+ if (duration > maxDuration) Membership__InvalidDuration.selector.revertWith();
119
+ }
120
+
121
+ function _getMembershipDuration() internal view returns (uint64 duration) {
122
+ duration = MembershipStorage.layout().membershipDuration;
123
+
124
+ if (duration == 0) duration = _getPlatformRequirements().getMembershipDuration();
125
+ }
126
+
127
+ function _setMembershipDuration(uint64 duration) internal {
128
+ _verifyDuration(duration);
129
+ MembershipStorage.layout().membershipDuration = duration;
130
+ }
131
+
132
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
133
+ /* PRICING MODULE */
134
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
135
+
136
+ function _verifyPricingModule(address pricingModule) internal view {
137
+ if (pricingModule == address(0)) Membership__InvalidPricingModule.selector.revertWith();
138
+
139
+ if (!IPricingModules(_getSpaceFactory()).isPricingModule(pricingModule)) {
140
+ Membership__InvalidPricingModule.selector.revertWith();
141
+ }
142
+ }
143
+
144
+ function _setPricingModule(address newPricingModule) internal {
145
+ MembershipStorage.layout().pricingModule = newPricingModule;
146
+ }
147
+
148
+ function _getPricingModule() internal view returns (address) {
149
+ return MembershipStorage.layout().pricingModule;
150
+ }
151
+
152
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
153
+ /* PRICING */
154
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
155
+
156
+ function _verifyPrice(uint256 newPrice) internal view {
157
+ uint256 minFee = _getPlatformRequirements().getMembershipFee();
158
+ if (newPrice < minFee) Membership__PriceTooLow.selector.revertWith();
159
+ }
160
+
161
+ /// @dev Makes it virtual to allow other pricing strategies
162
+ function _getMembershipPrice(
163
+ uint256 totalSupply
164
+ ) internal view virtual returns (uint256 membershipPrice) {
165
+ // get free allocation
166
+ uint256 freeAllocation = _getMembershipFreeAllocation();
167
+ address pricingModule = _getPricingModule();
168
+
169
+ IPlatformRequirements platform = _getPlatformRequirements();
170
+
171
+ if (pricingModule == address(0)) return platform.getMembershipFee();
172
+
173
+ membershipPrice = IMembershipPricing(pricingModule).getPrice(freeAllocation, totalSupply);
174
+ uint256 minPrice = platform.getMembershipMinPrice();
175
+ if (membershipPrice < minPrice) return platform.getMembershipFee();
176
+ }
177
+
178
+ function _setMembershipRenewalPrice(uint256 tokenId, uint256 pricePaid) internal {
179
+ MembershipStorage.layout().renewalPriceByTokenId[tokenId] = pricePaid;
180
+ }
181
+
182
+ function _getMembershipRenewalPrice(
183
+ uint256 tokenId,
184
+ uint256 totalSupply
185
+ ) internal view returns (uint256) {
186
+ MembershipStorage.Layout storage ds = MembershipStorage.layout();
187
+ IPlatformRequirements platform = _getPlatformRequirements();
188
+
189
+ uint256 minFee = platform.getMembershipFee();
190
+ uint256 renewalPrice = ds.renewalPriceByTokenId[tokenId];
191
+
192
+ if (renewalPrice != 0) return FixedPointMathLib.max(renewalPrice, minFee);
193
+
194
+ uint256 price = _getMembershipPrice(totalSupply);
195
+ return FixedPointMathLib.max(price, minFee);
196
+ }
197
+
198
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
199
+ /* ALLOCATION */
200
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
201
+
202
+ function _verifyFreeAllocation(uint256 newAllocation) internal view {
203
+ // verify newLimit is not more than the allowed platform limit
204
+ if (newAllocation > _getPlatformRequirements().getMembershipMintLimit()) {
205
+ Membership__InvalidFreeAllocation.selector.revertWith();
206
+ }
207
+ }
208
+
209
+ function _setMembershipFreeAllocation(uint256 newAllocation) internal {
210
+ MembershipStorage.Layout storage ds = MembershipStorage.layout();
211
+ ds.freeAllocation = newAllocation;
212
+ ds.freeAllocationEnabled = true;
213
+ emit MembershipFreeAllocationUpdated(newAllocation);
214
+ }
215
+
216
+ function _getMembershipFreeAllocation() internal view returns (uint256) {
217
+ MembershipStorage.Layout storage ds = MembershipStorage.layout();
218
+
219
+ if (ds.freeAllocationEnabled) return ds.freeAllocation;
220
+
221
+ return _getPlatformRequirements().getMembershipMintLimit();
222
+ }
223
+
224
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
225
+ /* SUPPLY LIMIT */
226
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
227
+
228
+ function _verifyMaxSupply(uint256 newLimit, uint256 totalSupply) internal pure {
229
+ // if the new limit is less than the current total supply, revert
230
+ if (newLimit < totalSupply) Membership__InvalidMaxSupply.selector.revertWith();
231
+ }
232
+
233
+ function _setMembershipSupplyLimit(uint256 newLimit) internal {
234
+ MembershipStorage.layout().membershipMaxSupply = newLimit;
235
+ }
236
+
237
+ function _getMembershipSupplyLimit() internal view returns (uint256) {
238
+ return MembershipStorage.layout().membershipMaxSupply;
239
+ }
240
+
241
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
242
+ /* CURRENCY */
243
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
244
+
245
+ function _getMembershipCurrency() internal view returns (address) {
246
+ return MembershipStorage.layout().membershipCurrency;
247
+ }
248
+
249
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
250
+ /* FACTORY */
251
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
252
+
253
+ function _getSpaceFactory() internal view returns (address) {
254
+ return MembershipStorage.layout().spaceFactory;
255
+ }
256
+
257
+ function _getPlatformRequirements() internal view returns (IPlatformRequirements) {
258
+ return IPlatformRequirements(_getSpaceFactory());
259
+ }
260
+
261
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
262
+ /* IMAGE */
263
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
264
+
265
+ function _getMembershipImage() internal view returns (string memory) {
266
+ return MembershipStorage.layout().membershipImage;
267
+ }
268
+
269
+ function _setMembershipImage(string memory image) internal {
270
+ MembershipStorage.layout().membershipImage = image;
271
+ }
272
+ }
@@ -0,0 +1,191 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IMembership} from "./IMembership.sol";
6
+ import {IMembershipPricing} from "./pricing/IMembershipPricing.sol";
7
+
8
+ // libraries
9
+ import {CustomRevert} from "../../../utils/libraries/CustomRevert.sol";
10
+
11
+ // contracts
12
+ import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
13
+ import {ReentrancyGuard} from "solady/utils/ReentrancyGuard.sol";
14
+ import {MembershipJoin} from "./join/MembershipJoin.sol";
15
+
16
+ contract MembershipFacet is IMembership, MembershipJoin, ReentrancyGuard, Facet {
17
+ using CustomRevert for bytes4;
18
+
19
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
20
+ /* JOIN */
21
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
22
+
23
+ /// @inheritdoc IMembership
24
+ function joinSpace(JoinType action, bytes calldata data) external payable nonReentrant {
25
+ if (action == JoinType.Basic) {
26
+ address receiver = abi.decode(data, (address));
27
+ _joinSpace(receiver);
28
+ } else if (action == JoinType.WithReferral) {
29
+ (address receiver, ReferralTypes memory referral) = abi.decode(
30
+ data,
31
+ (address, ReferralTypes)
32
+ );
33
+ _joinSpaceWithReferral(receiver, referral);
34
+ } else {
35
+ Membership__InvalidAction.selector.revertWith();
36
+ }
37
+ }
38
+
39
+ /// @inheritdoc IMembership
40
+ function joinSpace(address receiver) external payable nonReentrant {
41
+ _joinSpace(receiver);
42
+ }
43
+
44
+ /// @inheritdoc IMembership
45
+ function joinSpaceWithReferral(
46
+ address receiver,
47
+ ReferralTypes memory referral
48
+ ) external payable nonReentrant {
49
+ _joinSpaceWithReferral(receiver, referral);
50
+ }
51
+
52
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
53
+ /* RENEWAL */
54
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
55
+
56
+ /// @inheritdoc IMembership
57
+ function renewMembership(uint256 tokenId) external payable nonReentrant {
58
+ _renewMembership(msg.sender, tokenId);
59
+ }
60
+
61
+ /// @inheritdoc IMembership
62
+ function expiresAt(uint256 tokenId) external view returns (uint256) {
63
+ return _expiresAt(tokenId);
64
+ }
65
+
66
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
67
+ /* DURATION */
68
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
69
+
70
+ /// @inheritdoc IMembership
71
+ function setMembershipDuration(uint64 duration) external onlyOwner {
72
+ _setMembershipDuration(duration);
73
+ }
74
+
75
+ /// @inheritdoc IMembership
76
+ function getMembershipDuration() external view returns (uint64) {
77
+ return _getMembershipDuration();
78
+ }
79
+
80
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
81
+ /* PRICING MODULE */
82
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
83
+
84
+ /// @inheritdoc IMembership
85
+ function setMembershipPricingModule(address pricingModule) external onlyOwner {
86
+ _verifyPricingModule(pricingModule);
87
+ _setPricingModule(pricingModule);
88
+ }
89
+
90
+ /// @inheritdoc IMembership
91
+ function getMembershipPricingModule() external view returns (address) {
92
+ return _getPricingModule();
93
+ }
94
+
95
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
96
+ /* PRICING */
97
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
98
+
99
+ /// @inheritdoc IMembership
100
+ function setMembershipPrice(uint256 newPrice) external onlyOwner {
101
+ _verifyPrice(newPrice);
102
+ IMembershipPricing(_getPricingModule()).setPrice(newPrice);
103
+ }
104
+
105
+ /// @inheritdoc IMembership
106
+ function getMembershipPrice() external view returns (uint256) {
107
+ return _getMembershipPrice(_totalSupply());
108
+ }
109
+
110
+ /// @inheritdoc IMembership
111
+ function getMembershipRenewalPrice(uint256 tokenId) external view returns (uint256) {
112
+ return _getMembershipRenewalPrice(tokenId, _totalSupply());
113
+ }
114
+
115
+ /// @inheritdoc IMembership
116
+ function getProtocolFee() external view returns (uint256) {
117
+ return _getProtocolFee(_getMembershipPrice(_totalSupply()));
118
+ }
119
+
120
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
121
+ /* ALLOCATION */
122
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
123
+
124
+ /// @inheritdoc IMembership
125
+ function setMembershipFreeAllocation(uint256 newAllocation) external onlyOwner {
126
+ // get current supply limit
127
+ uint256 currentSupplyLimit = _getMembershipSupplyLimit();
128
+
129
+ // verify newLimit is not more than the max supply limit
130
+ if (currentSupplyLimit != 0 && newAllocation > currentSupplyLimit) {
131
+ Membership__InvalidFreeAllocation.selector.revertWith();
132
+ }
133
+
134
+ // verify newLimit is not more than the allowed platform limit
135
+ _verifyFreeAllocation(newAllocation);
136
+ _setMembershipFreeAllocation(newAllocation);
137
+ }
138
+
139
+ /// @inheritdoc IMembership
140
+ function getMembershipFreeAllocation() external view returns (uint256) {
141
+ return _getMembershipFreeAllocation();
142
+ }
143
+
144
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
145
+ /* SUPPLY LIMIT */
146
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
147
+
148
+ /// @inheritdoc IMembership
149
+ function setMembershipLimit(uint256 newLimit) external onlyOwner {
150
+ _verifyMaxSupply(newLimit, _totalSupply());
151
+ _setMembershipSupplyLimit(newLimit);
152
+ }
153
+
154
+ /// @inheritdoc IMembership
155
+ function getMembershipLimit() external view returns (uint256) {
156
+ return _getMembershipSupplyLimit();
157
+ }
158
+
159
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
160
+ /* IMAGE */
161
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
162
+
163
+ /// @inheritdoc IMembership
164
+ function setMembershipImage(string calldata newImage) external onlyOwner {
165
+ _setMembershipImage(newImage);
166
+ }
167
+
168
+ /// @inheritdoc IMembership
169
+ function getMembershipImage() external view returns (string memory) {
170
+ return _getMembershipImage();
171
+ }
172
+
173
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
174
+ /* GETTERS */
175
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
176
+
177
+ /// @inheritdoc IMembership
178
+ function getMembershipCurrency() external view returns (address) {
179
+ return _getMembershipCurrency();
180
+ }
181
+
182
+ /// @inheritdoc IMembership
183
+ function getSpaceFactory() external view returns (address) {
184
+ return _getSpaceFactory();
185
+ }
186
+
187
+ /// @inheritdoc IMembership
188
+ function revenue() external view returns (uint256) {
189
+ return address(this).balance;
190
+ }
191
+ }
@@ -0,0 +1,40 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+
6
+ // libraries
7
+
8
+ // contracts
9
+
10
+ library MembershipStorage {
11
+ // keccak256(abi.encode(uint256(keccak256("spaces.facets.membership.storage")) - 1)) &
12
+ // ~bytes32(uint256(0xff))
13
+ bytes32 public constant STORAGE_SLOT =
14
+ 0xc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb600;
15
+
16
+ struct Layout {
17
+ mapping(uint256 => address) deprecatedMemberByTokenId;
18
+ mapping(address => uint256) deprecatedTokenIdByMember;
19
+ uint256 membershipPrice;
20
+ uint256 membershipMaxSupply;
21
+ address membershipCurrency;
22
+ address membershipFeeRecipient;
23
+ address spaceFactory;
24
+ uint64 membershipDuration;
25
+ uint256 freeAllocation;
26
+ address pricingModule;
27
+ mapping(uint256 => uint256) renewalPriceByTokenId;
28
+ uint256 tokenBalance;
29
+ mapping(bytes32 => address) pendingJoinRequests;
30
+ string membershipImage;
31
+ bool freeAllocationEnabled;
32
+ }
33
+
34
+ function layout() internal pure returns (Layout storage l) {
35
+ bytes32 slot = STORAGE_SLOT;
36
+ assembly {
37
+ l.slot := slot
38
+ }
39
+ }
40
+ }