@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,107 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {ICreateSpace} from "./ICreateSpace.sol";
6
+
7
+ // libraries
8
+ import {CreateSpaceLib} from "./CreateSpaceLib.sol";
9
+
10
+ // contracts
11
+ import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
12
+ import {PausableBase} from "@towns-protocol/diamond/src/facets/pausable/PausableBase.sol";
13
+ import {ReentrancyGuard} from "solady/utils/ReentrancyGuard.sol";
14
+
15
+ /// @title CreateSpaceFacet
16
+ /// @notice Facet for creating new spaces with various configurations
17
+ /// @dev Inherits from:
18
+ /// - ICreateSpace: Interface defining space creation methods
19
+ /// - PausableBase: Allows pausing of space creation functionality
20
+ /// - ReentrancyGuard: Prevents reentrancy attacks during space creation
21
+ /// - Facet: Base contract for diamond facets
22
+ contract CreateSpaceFacet is ICreateSpace, PausableBase, ReentrancyGuard, Facet {
23
+ function __CreateSpace_init() external onlyInitializing {
24
+ _addInterface(type(ICreateSpace).interfaceId);
25
+ }
26
+
27
+ function createSpace(
28
+ Action action,
29
+ bytes calldata data
30
+ ) external payable nonReentrant whenNotPaused returns (address) {
31
+ SpaceOptions memory spaceOptions = SpaceOptions({to: msg.sender});
32
+ if (action == Action.CreateBasic) {
33
+ SpaceInfo memory spaceInfo = abi.decode(data, (SpaceInfo));
34
+ return CreateSpaceLib.createSpace(spaceInfo, spaceOptions);
35
+ } else if (action == Action.CreateWithPrepay) {
36
+ CreateSpace memory spaceInfo = abi.decode(data, (CreateSpace));
37
+ return CreateSpaceLib.createSpaceWithPrepay(spaceInfo, spaceOptions);
38
+ } else if (action == Action.CreateWithOptions) {
39
+ CreateSpace memory spaceInfo;
40
+ (spaceInfo, spaceOptions) = abi.decode(data, (CreateSpace, SpaceOptions));
41
+ return CreateSpaceLib.createSpaceWithPrepay(spaceInfo, spaceOptions);
42
+ } else if (action == Action.CreateLegacy) {
43
+ CreateSpaceOld memory spaceInfo = abi.decode(data, (CreateSpaceOld));
44
+ CreateSpace memory newSpaceInfo = _convertLegacySpace(spaceInfo);
45
+ return CreateSpaceLib.createSpaceWithPrepay(newSpaceInfo, spaceOptions);
46
+ } else {
47
+ revert CreateSpaceFacet__InvalidAction();
48
+ }
49
+ }
50
+
51
+ /// @inheritdoc ICreateSpace
52
+ function createSpace(
53
+ SpaceInfo memory spaceInfo
54
+ ) external nonReentrant whenNotPaused returns (address) {
55
+ SpaceOptions memory spaceOptions = SpaceOptions({to: msg.sender});
56
+ return CreateSpaceLib.createSpace(spaceInfo, spaceOptions);
57
+ }
58
+
59
+ /// @inheritdoc ICreateSpace
60
+ function createSpaceV2(
61
+ CreateSpace memory spaceInfo,
62
+ SpaceOptions memory options
63
+ ) external payable nonReentrant whenNotPaused returns (address) {
64
+ return CreateSpaceLib.createSpaceWithPrepay(spaceInfo, options);
65
+ }
66
+
67
+ /// @inheritdoc ICreateSpace
68
+ function createSpaceWithPrepay(
69
+ CreateSpace memory spaceInfo
70
+ ) external payable nonReentrant whenNotPaused returns (address) {
71
+ SpaceOptions memory spaceOptions = SpaceOptions({to: msg.sender});
72
+ return CreateSpaceLib.createSpaceWithPrepay(spaceInfo, spaceOptions);
73
+ }
74
+
75
+ /// @inheritdoc ICreateSpace
76
+ function createSpaceWithPrepay(
77
+ CreateSpaceOld memory spaceInfo
78
+ ) external payable nonReentrant whenNotPaused returns (address) {
79
+ CreateSpace memory newSpaceInfo = _convertLegacySpace(spaceInfo);
80
+ SpaceOptions memory spaceOptions = SpaceOptions({to: msg.sender});
81
+ return CreateSpaceLib.createSpaceWithPrepay(newSpaceInfo, spaceOptions);
82
+ }
83
+
84
+ /// @dev Converts CreateSpaceOld format to CreateSpace format
85
+ function _convertLegacySpace(
86
+ CreateSpaceOld memory spaceInfo
87
+ ) private pure returns (CreateSpace memory) {
88
+ MembershipRequirements memory requirements = MembershipRequirements({
89
+ everyone: spaceInfo.membership.requirements.everyone,
90
+ users: spaceInfo.membership.requirements.users,
91
+ ruleData: spaceInfo.membership.requirements.ruleData,
92
+ syncEntitlements: false
93
+ });
94
+ Membership memory membership = Membership({
95
+ settings: spaceInfo.membership.settings,
96
+ requirements: requirements,
97
+ permissions: spaceInfo.membership.permissions
98
+ });
99
+ return
100
+ CreateSpace({
101
+ metadata: spaceInfo.metadata,
102
+ membership: membership,
103
+ channel: spaceInfo.channel,
104
+ prepay: spaceInfo.prepay
105
+ });
106
+ }
107
+ }
@@ -0,0 +1,335 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {ITokenOwnableBase} from "@towns-protocol/diamond/src/facets/ownable/token/ITokenOwnable.sol";
6
+ import {IManagedProxyBase} from "@towns-protocol/diamond/src/proxy/managed/IManagedProxy.sol";
7
+ import {IProxyManager} from "@towns-protocol/diamond/src/proxy/manager/IProxyManager.sol";
8
+ import {IERC721A} from "../../../diamond/facets/token/ERC721A/IERC721A.sol";
9
+ import {IEntitlement} from "../../../spaces/entitlements/IEntitlement.sol";
10
+ import {IRuleEntitlement} from "../../../spaces/entitlements/rule/IRuleEntitlement.sol";
11
+ import {IUserEntitlement} from "../../../spaces/entitlements/user/IUserEntitlement.sol";
12
+ import {IChannel} from "../../../spaces/facets/channels/IChannel.sol";
13
+ import {IEntitlementsManager} from "../../../spaces/facets/entitlements/IEntitlementsManager.sol";
14
+ import {IMembershipBase} from "../../../spaces/facets/membership/IMembership.sol";
15
+ import {IPrepay} from "../../../spaces/facets/prepay/IPrepay.sol";
16
+ import {IRoles, IRolesBase} from "../../../spaces/facets/roles/IRoles.sol";
17
+ import {IArchitectBase} from "../architect/IArchitect.sol";
18
+
19
+ // libraries
20
+ import {Address} from "@openzeppelin/contracts/utils/Address.sol";
21
+ import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
22
+ import {Permissions} from "../../../spaces/facets/Permissions.sol";
23
+ import {StringSet} from "../../../utils/libraries/StringSet.sol";
24
+ import {Validator} from "../../../utils/libraries/Validator.sol";
25
+ import {ArchitectStorage} from "../architect/ArchitectStorage.sol";
26
+ import {ImplementationStorage} from "../architect/ImplementationStorage.sol";
27
+
28
+ // contracts
29
+ import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
30
+ import {SpaceProxy} from "../../../spaces/facets/proxy/SpaceProxy.sol";
31
+ import {SpaceProxyInitializer} from "../../../spaces/facets/proxy/SpaceProxyInitializer.sol";
32
+ import {Factory} from "../../../utils/libraries/Factory.sol";
33
+ import {PricingModulesBase} from "../architect/pricing/PricingModulesBase.sol";
34
+
35
+ library CreateSpaceLib {
36
+ using StringSet for StringSet.Set;
37
+ using EnumerableSet for EnumerableSet.AddressSet;
38
+
39
+ address internal constant EVERYONE_ADDRESS = address(1);
40
+ string internal constant MINTER_ROLE = "Minter";
41
+ bytes1 internal constant CHANNEL_PREFIX = 0x20;
42
+
43
+ function createSpaceWithPrepay(
44
+ IArchitectBase.CreateSpace memory space,
45
+ IArchitectBase.SpaceOptions memory spaceOptions
46
+ ) internal returns (address spaceAddress) {
47
+ Validator.checkAddress(space.membership.settings.pricingModule);
48
+ Validator.checkAddress(spaceOptions.to);
49
+
50
+ IArchitectBase.SpaceInfo memory spaceInfo = IArchitectBase.SpaceInfo({
51
+ name: space.metadata.name,
52
+ uri: space.metadata.uri,
53
+ shortDescription: space.metadata.shortDescription,
54
+ longDescription: space.metadata.longDescription,
55
+ membership: space.membership,
56
+ channel: space.channel
57
+ });
58
+
59
+ spaceAddress = createSpace(spaceInfo, spaceOptions);
60
+
61
+ if (space.prepay.supply > 0) {
62
+ IPrepay(spaceAddress).prepayMembership{value: msg.value}(space.prepay.supply);
63
+ }
64
+ }
65
+
66
+ function createSpace(
67
+ IArchitectBase.SpaceInfo memory spaceInfo,
68
+ IArchitectBase.SpaceOptions memory spaceOptions
69
+ ) internal returns (address spaceAddress) {
70
+ ArchitectStorage.Layout storage ds = ArchitectStorage.layout();
71
+ ImplementationStorage.Layout storage ims = ImplementationStorage.layout();
72
+
73
+ // get the token id of the next space
74
+ uint256 spaceTokenId = ims.spaceOwnerToken.nextTokenId();
75
+
76
+ // deploy space
77
+ spaceAddress = deploySpace(spaceTokenId, spaceInfo.membership, spaceOptions);
78
+
79
+ // save space info to storage
80
+ unchecked {
81
+ ds.spaceCount++;
82
+ }
83
+
84
+ // save to mappings
85
+ ds.spaceByTokenId[spaceTokenId] = spaceAddress;
86
+ ds.tokenIdBySpace[spaceAddress] = spaceTokenId;
87
+
88
+ // mint token to and transfer to Architect
89
+ ims.spaceOwnerToken.mintSpace(
90
+ spaceInfo.name,
91
+ spaceInfo.uri,
92
+ spaceAddress,
93
+ spaceInfo.shortDescription,
94
+ spaceInfo.longDescription
95
+ );
96
+
97
+ // deploy user entitlement
98
+ IUserEntitlement userEntitlement = IUserEntitlement(
99
+ deployEntitlement(ims.userEntitlement, spaceAddress)
100
+ );
101
+
102
+ // deploy token entitlement
103
+ IRuleEntitlement ruleEntitlement = IRuleEntitlement(
104
+ deployEntitlement(ims.ruleEntitlement, spaceAddress)
105
+ );
106
+
107
+ address[] memory entitlements = new address[](2);
108
+ entitlements[0] = address(userEntitlement);
109
+ entitlements[1] = address(ruleEntitlement);
110
+
111
+ // set entitlements as immutable
112
+ IEntitlementsManager(spaceAddress).addImmutableEntitlements(entitlements);
113
+
114
+ // create minter role with requirements
115
+ string[] memory joinPermissions = new string[](1);
116
+ joinPermissions[0] = Permissions.JoinSpace;
117
+ if (spaceInfo.membership.requirements.everyone) {
118
+ createEveryoneEntitlement(spaceAddress, MINTER_ROLE, joinPermissions, userEntitlement);
119
+ } else {
120
+ createEntitlementForRole(
121
+ spaceAddress,
122
+ MINTER_ROLE,
123
+ joinPermissions,
124
+ spaceInfo.membership.requirements,
125
+ userEntitlement,
126
+ ruleEntitlement
127
+ );
128
+ }
129
+
130
+ uint256 memberRoleId;
131
+
132
+ // if entitlement are synced, create a role with the membership requirements
133
+ if (spaceInfo.membership.requirements.syncEntitlements) {
134
+ memberRoleId = createEntitlementForRole(
135
+ spaceAddress,
136
+ spaceInfo.membership.settings.name,
137
+ spaceInfo.membership.permissions,
138
+ spaceInfo.membership.requirements,
139
+ userEntitlement,
140
+ ruleEntitlement
141
+ );
142
+ } else {
143
+ // else create a role with the everyone entitlement
144
+ memberRoleId = createEveryoneEntitlement(
145
+ spaceAddress,
146
+ spaceInfo.membership.settings.name,
147
+ spaceInfo.membership.permissions,
148
+ userEntitlement
149
+ );
150
+ }
151
+
152
+ // create default channel
153
+ createDefaultChannel(spaceAddress, memberRoleId, spaceInfo.channel);
154
+
155
+ // transfer nft to sender
156
+ IERC721A(address(ims.spaceOwnerToken)).safeTransferFrom(
157
+ address(this),
158
+ spaceOptions.to,
159
+ spaceTokenId
160
+ );
161
+
162
+ // emit event
163
+ emit IArchitectBase.SpaceCreated(spaceOptions.to, spaceTokenId, spaceAddress);
164
+ }
165
+ // =============================================================
166
+ // Internal Channel Helpers
167
+ // =============================================================
168
+
169
+ function createDefaultChannel(
170
+ address space,
171
+ uint256 roleId,
172
+ IArchitectBase.ChannelInfo memory channelInfo
173
+ ) internal {
174
+ uint256[] memory roleIds = new uint256[](1);
175
+ roleIds[0] = roleId;
176
+
177
+ bytes32 defaultChannelId = bytes32(bytes.concat(CHANNEL_PREFIX, bytes20(space)));
178
+
179
+ IChannel(space).createChannel(defaultChannelId, channelInfo.metadata, roleIds);
180
+ }
181
+
182
+ // =============================================================
183
+ // Internal Entitlement Helpers
184
+ // =============================================================
185
+ function createEntitlementForRole(
186
+ address spaceAddress,
187
+ string memory roleName,
188
+ string[] memory permissions,
189
+ IArchitectBase.MembershipRequirements memory requirements,
190
+ IUserEntitlement userEntitlement,
191
+ IRuleEntitlement ruleEntitlement
192
+ ) internal returns (uint256 roleId) {
193
+ uint256 entitlementCount = 0;
194
+ uint256 userReqsLen = requirements.users.length;
195
+ uint256 ruleReqsLen = requirements.ruleData.length;
196
+
197
+ if (userReqsLen > 0) {
198
+ ++entitlementCount;
199
+ }
200
+
201
+ if (ruleReqsLen > 0) {
202
+ ++entitlementCount;
203
+ }
204
+
205
+ IRolesBase.CreateEntitlement[] memory entitlements = new IRolesBase.CreateEntitlement[](
206
+ entitlementCount
207
+ );
208
+
209
+ uint256 entitlementIndex;
210
+
211
+ if (userReqsLen != 0) {
212
+ // validate users
213
+ for (uint256 i; i < userReqsLen; ++i) {
214
+ Validator.checkAddress(requirements.users[i]);
215
+ }
216
+
217
+ entitlements[entitlementIndex++] = IRolesBase.CreateEntitlement({
218
+ module: userEntitlement,
219
+ data: abi.encode(requirements.users)
220
+ });
221
+ }
222
+
223
+ if (ruleReqsLen > 0) {
224
+ entitlements[entitlementIndex++] = IRolesBase.CreateEntitlement({
225
+ module: ruleEntitlement,
226
+ data: requirements.ruleData
227
+ });
228
+ }
229
+
230
+ roleId = createRoleWithEntitlements(spaceAddress, roleName, permissions, entitlements);
231
+ }
232
+
233
+ function createEveryoneEntitlement(
234
+ address spaceAddress,
235
+ string memory roleName,
236
+ string[] memory permissions,
237
+ IUserEntitlement userEntitlement
238
+ ) internal returns (uint256 roleId) {
239
+ address[] memory users = new address[](1);
240
+ users[0] = EVERYONE_ADDRESS;
241
+
242
+ IRolesBase.CreateEntitlement[] memory entitlements = new IRolesBase.CreateEntitlement[](1);
243
+ entitlements[0].module = userEntitlement;
244
+ entitlements[0].data = abi.encode(users);
245
+
246
+ roleId = createRoleWithEntitlements(spaceAddress, roleName, permissions, entitlements);
247
+ }
248
+
249
+ function createRoleWithEntitlements(
250
+ address spaceAddress,
251
+ string memory roleName,
252
+ string[] memory permissions,
253
+ IRolesBase.CreateEntitlement[] memory entitlements
254
+ ) internal returns (uint256 roleId) {
255
+ return IRoles(spaceAddress).createRole(roleName, permissions, entitlements);
256
+ }
257
+
258
+ // =============================================================
259
+ // Deployment Helpers
260
+ // =============================================================
261
+
262
+ function deploySpace(
263
+ uint256 spaceTokenId,
264
+ IArchitectBase.Membership memory membership,
265
+ IArchitectBase.SpaceOptions memory spaceOptions
266
+ ) internal returns (address space) {
267
+ // get deployment info
268
+ (bytes memory initCode, bytes32 salt) = getSpaceDeploymentInfo(
269
+ spaceTokenId,
270
+ membership,
271
+ spaceOptions
272
+ );
273
+ return Factory.deploy(initCode, salt);
274
+ }
275
+
276
+ function deployEntitlement(
277
+ IEntitlement entitlement,
278
+ address spaceAddress
279
+ ) internal returns (address) {
280
+ // calculate init code
281
+ bytes memory initCode = abi.encodePacked(
282
+ type(ERC1967Proxy).creationCode,
283
+ abi.encode(entitlement, abi.encodeCall(IEntitlement.initialize, (spaceAddress)))
284
+ );
285
+
286
+ return Factory.deploy(initCode);
287
+ }
288
+
289
+ function verifyPricingModule(address pricingModule) internal view {
290
+ if (pricingModule == address(0) || !PricingModulesBase.isPricingModule(pricingModule)) {
291
+ revert IArchitectBase.Architect__InvalidPricingModule();
292
+ }
293
+ }
294
+
295
+ function getSpaceDeploymentInfo(
296
+ uint256 spaceTokenId,
297
+ IArchitectBase.Membership memory membership,
298
+ IArchitectBase.SpaceOptions memory spaceOptions
299
+ ) internal view returns (bytes memory initCode, bytes32 salt) {
300
+ verifyPricingModule(membership.settings.pricingModule);
301
+
302
+ address spaceOwnerNFT = address(ImplementationStorage.layout().spaceOwnerToken);
303
+
304
+ // calculate salt
305
+ salt = keccak256(abi.encode(spaceTokenId, block.timestamp, block.number, spaceOwnerNFT));
306
+
307
+ IMembershipBase.Membership memory membershipSettings = membership.settings;
308
+
309
+ address proxyInitializer = address(ImplementationStorage.layout().proxyInitializer);
310
+
311
+ // calculate init code
312
+ initCode = abi.encodePacked(
313
+ type(SpaceProxy).creationCode,
314
+ abi.encode(
315
+ IManagedProxyBase.ManagedProxy({
316
+ managerSelector: IProxyManager.getImplementation.selector,
317
+ manager: address(this)
318
+ }),
319
+ proxyInitializer,
320
+ abi.encodeCall(
321
+ SpaceProxyInitializer.initialize,
322
+ (
323
+ spaceOptions.to,
324
+ address(this),
325
+ ITokenOwnableBase.TokenOwnable({
326
+ collection: spaceOwnerNFT,
327
+ tokenId: spaceTokenId
328
+ }),
329
+ membershipSettings
330
+ )
331
+ )
332
+ )
333
+ );
334
+ }
335
+ }
@@ -0,0 +1,70 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ import {IArchitectBase} from "../architect/IArchitect.sol";
5
+
6
+ interface ICreateSpaceBase {
7
+ /// @notice Action enum for unified space creation dispatch
8
+ /// @dev To encode data for each action:
9
+ /// switch (action) {
10
+ /// case Action.CreateBasic:
11
+ /// data = abi.encode(SpaceInfo memory spaceInfo);
12
+ /// case Action.CreateWithPrepay:
13
+ /// data = abi.encode(CreateSpace memory spaceInfo);
14
+ /// case Action.CreateWithOptions:
15
+ /// data = abi.encode(CreateSpace memory spaceInfo, SpaceOptions memory options);
16
+ /// case Action.CreateLegacy:
17
+ /// data = abi.encode(CreateSpaceOld memory spaceInfo);
18
+ /// }
19
+ enum Action {
20
+ CreateBasic, // Basic space creation with SpaceInfo struct
21
+ CreateWithPrepay, // Space creation with prepaid memberships
22
+ CreateWithOptions, // Space creation with custom deployment options
23
+ CreateLegacy // Legacy space creation for backward compatibility
24
+ }
25
+
26
+ error CreateSpaceFacet__InvalidAction();
27
+ }
28
+
29
+ interface ICreateSpace is IArchitectBase, ICreateSpaceBase {
30
+ /// @notice Unified entry point for creating spaces with different configurations
31
+ /// @param action The type of space creation to perform
32
+ /// @param data ABI-encoded data for the specific action type
33
+ /// @return address The address of the newly created space contract
34
+ function createSpace(Action action, bytes calldata data) external payable returns (address);
35
+
36
+ /// @notice Creates a new space with basic configuration
37
+ /// @param SpaceInfo Struct containing space metadata, membership settings, and channel
38
+ /// configuration
39
+ /// @return address The address of the newly created space contract
40
+ function createSpace(SpaceInfo memory SpaceInfo) external returns (address);
41
+
42
+ /// @notice Creates a new space with prepaid memberships
43
+ /// @param createSpace Struct containing space metadata, membership settings, channel config and
44
+ /// prepay info
45
+ /// @return address The address of the newly created space contract
46
+ /// @dev The msg.value must cover the cost of prepaid memberships
47
+ function createSpaceWithPrepay(
48
+ CreateSpace memory createSpace
49
+ ) external payable returns (address);
50
+
51
+ /// @notice Creates a new space with prepaid memberships and custom deployment options
52
+ /// @param createSpace Struct containing space metadata, membership settings, channel config and
53
+ /// prepay info
54
+ /// @param options Struct containing deployment options like the recipient address
55
+ /// @return address The address of the newly created space contract
56
+ /// @dev The msg.value must cover the cost of prepaid memberships
57
+ function createSpaceV2(
58
+ CreateSpace memory createSpace,
59
+ SpaceOptions memory options
60
+ ) external payable returns (address);
61
+
62
+ /// @notice Legacy function for backwards compatibility with older space creation format
63
+ /// @param spaceInfo Struct containing old format space configuration
64
+ /// @return address The address of the newly created space contract
65
+ /// @dev This function converts the old format to the new format internally
66
+ /// @dev The msg.value must cover the cost of prepaid memberships
67
+ function createSpaceWithPrepay(
68
+ CreateSpaceOld memory spaceInfo
69
+ ) external payable returns (address);
70
+ }
@@ -0,0 +1,53 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IVotes} from "@openzeppelin/contracts/governance/utils/IVotes.sol";
6
+
7
+ /// @notice Represents a condition for feature activation
8
+ /// @dev Used to determine if a feature should be enabled based on token voting power
9
+ /// @param token The address of the token used for voting (must implement IVotes)
10
+ /// @param threshold The minimum number of delegations required to activate the feature
11
+ /// @param active Whether the condition is currently active
12
+ /// @param extraData Additional data that might be used for specialized condition logic
13
+ struct FeatureCondition {
14
+ address token;
15
+ bool active;
16
+ uint256 threshold;
17
+ bytes extraData;
18
+ }
19
+
20
+ /// @title FeatureConditionLib
21
+ library FeatureConditionLib {
22
+ function isValid(FeatureCondition storage condition) internal view returns (bool) {
23
+ return condition.active && condition.token != address(0);
24
+ }
25
+
26
+ /// @notice Gets the voting power of a space for the condition's token
27
+ /// @dev Calls the getVotes function on the token contract
28
+ /// @param condition The condition containing the token address
29
+ /// @param space The address of the space to check votes for
30
+ /// @return The number of votes the space has with the token
31
+ function getVotes(
32
+ FeatureCondition storage condition,
33
+ address space
34
+ ) internal view returns (uint256) {
35
+ return IVotes(condition.token).getVotes(space);
36
+ }
37
+
38
+ /// @notice Checks if the given number of votes meets the condition's threshold
39
+ /// @dev Returns false if condition is inactive, true if threshold is 0, otherwise compares
40
+ /// votes to threshold
41
+ /// @param condition The condition containing the threshold and active status
42
+ /// @param votes The number of votes to check against the threshold
43
+ /// @return True if the condition is met, false otherwise
44
+ function meetsThreshold(
45
+ FeatureCondition storage condition,
46
+ uint256 votes
47
+ ) internal view returns (bool) {
48
+ if (!isValid(condition)) return false;
49
+ uint256 threshold = condition.threshold;
50
+ if (threshold == 0) return true;
51
+ return votes >= threshold;
52
+ }
53
+ }
@@ -0,0 +1,66 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IFeatureManagerFacet} from "./IFeatureManagerFacet.sol";
6
+
7
+ // libraries
8
+ import {FeatureManagerLib} from "./FeatureManagerLib.sol";
9
+ import {FeatureCondition, FeatureConditionLib} from "./FeatureConditionLib.sol";
10
+ // contracts
11
+ import {OwnableBase} from "@towns-protocol/diamond/src/facets/ownable/OwnableBase.sol";
12
+ import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
13
+
14
+ /// @title FeatureManagerFacet
15
+ /// @notice Manages feature conditions and checks for spaces
16
+ /// @dev This facet is responsible for managing feature conditions and checking if a space meets the condition for a feature to be enabled
17
+ contract FeatureManagerFacet is IFeatureManagerFacet, OwnableBase, Facet {
18
+ using FeatureManagerLib for FeatureManagerLib.Layout;
19
+ using FeatureConditionLib for FeatureCondition;
20
+
21
+ function __FeatureManagerFacet_init() external onlyInitializing {
22
+ _addInterface(type(IFeatureManagerFacet).interfaceId);
23
+ }
24
+
25
+ /// @inheritdoc IFeatureManagerFacet
26
+ function setFeatureCondition(
27
+ bytes32 featureId,
28
+ FeatureCondition calldata condition
29
+ ) external onlyOwner {
30
+ FeatureManagerLib.getLayout().setFeatureCondition(featureId, condition);
31
+ emit FeatureConditionSet(featureId, condition);
32
+ }
33
+
34
+ /// @inheritdoc IFeatureManagerFacet
35
+ function getFeatureCondition(
36
+ bytes32 featureId
37
+ ) external view returns (FeatureCondition memory) {
38
+ return FeatureManagerLib.getLayout().getFeatureCondition(featureId);
39
+ }
40
+
41
+ /// @inheritdoc IFeatureManagerFacet
42
+ function getFeatureConditions() external view returns (FeatureCondition[] memory) {
43
+ return FeatureManagerLib.getLayout().getFeatureConditions();
44
+ }
45
+
46
+ /// @inheritdoc IFeatureManagerFacet
47
+ function getFeatureConditionsForSpace(
48
+ address space
49
+ ) external view returns (FeatureCondition[] memory) {
50
+ return FeatureManagerLib.getLayout().getFeatureConditionsForSpace(space);
51
+ }
52
+
53
+ /// @inheritdoc IFeatureManagerFacet
54
+ function disableFeatureCondition(bytes32 featureId) external onlyOwner {
55
+ FeatureManagerLib.getLayout().disableFeatureCondition(featureId);
56
+ emit FeatureConditionDisabled(featureId);
57
+ }
58
+
59
+ /// @inheritdoc IFeatureManagerFacet
60
+ function checkFeatureCondition(bytes32 featureId, address space) external view returns (bool) {
61
+ FeatureCondition storage condition = FeatureManagerLib.getLayout().conditions[featureId];
62
+ if (!condition.isValid()) return false;
63
+ uint256 votes = condition.getVotes(space);
64
+ return condition.meetsThreshold(votes);
65
+ }
66
+ }