@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,98 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IArchitect} from "src/factory/facets/architect/IArchitect.sol";
6
+ import {IRuleEntitlement} from "src/spaces/entitlements/rule/IRuleEntitlement.sol";
7
+ import {IRuleEntitlementV2} from "src/spaces/entitlements/rule/IRuleEntitlement.sol";
8
+
9
+ import {IUserEntitlement} from "src/spaces/entitlements/user/IUserEntitlement.sol";
10
+ import {ISpaceOwner} from "src/spaces/facets/owner/ISpaceOwner.sol";
11
+ import {ISpaceProxyInitializer} from "src/spaces/facets/proxy/ISpaceProxyInitializer.sol";
12
+
13
+ // libraries
14
+
15
+ // contracts
16
+ import {ArchitectBase} from "./ArchitectBase.sol";
17
+
18
+ import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
19
+ import {OwnableBase} from "@towns-protocol/diamond/src/facets/ownable/OwnableBase.sol";
20
+ import {PausableBase} from "@towns-protocol/diamond/src/facets/pausable/PausableBase.sol";
21
+ import {ReentrancyGuard} from "solady/utils/ReentrancyGuard.sol";
22
+
23
+ contract Architect is IArchitect, ArchitectBase, OwnableBase, PausableBase, ReentrancyGuard, Facet {
24
+ function __Architect_init(
25
+ ISpaceOwner ownerImplementation,
26
+ IUserEntitlement userEntitlementImplementation,
27
+ IRuleEntitlementV2 ruleEntitlementImplementation,
28
+ IRuleEntitlement legacyRuleEntitlement
29
+ ) external onlyInitializing {
30
+ _setImplementations(
31
+ ownerImplementation,
32
+ userEntitlementImplementation,
33
+ ruleEntitlementImplementation,
34
+ legacyRuleEntitlement
35
+ );
36
+ }
37
+
38
+ // =============================================================
39
+ // Space
40
+ // =============================================================
41
+
42
+ /// @inheritdoc IArchitect
43
+ function getSpaceByTokenId(uint256 tokenId) external view returns (address) {
44
+ return _getSpaceByTokenId(tokenId);
45
+ }
46
+
47
+ /// @inheritdoc IArchitect
48
+ function getTokenIdBySpace(address space) external view returns (uint256) {
49
+ return _getTokenIdBySpace(space);
50
+ }
51
+
52
+ // =============================================================
53
+ // Implementations
54
+ // =============================================================
55
+
56
+ /// @inheritdoc IArchitect
57
+ function setSpaceArchitectImplementations(
58
+ ISpaceOwner spaceToken,
59
+ IUserEntitlement userEntitlementImplementation,
60
+ IRuleEntitlementV2 ruleEntitlementImplementation,
61
+ IRuleEntitlement legacyRuleEntitlement
62
+ ) external onlyOwner {
63
+ _setImplementations(
64
+ spaceToken,
65
+ userEntitlementImplementation,
66
+ ruleEntitlementImplementation,
67
+ legacyRuleEntitlement
68
+ );
69
+ }
70
+
71
+ /// @inheritdoc IArchitect
72
+ function getSpaceArchitectImplementations()
73
+ external
74
+ view
75
+ returns (
76
+ ISpaceOwner spaceToken,
77
+ IUserEntitlement userEntitlementImplementation,
78
+ IRuleEntitlementV2 ruleEntitlementImplementation,
79
+ IRuleEntitlement legacyRuleEntitlement
80
+ )
81
+ {
82
+ return _getImplementations();
83
+ }
84
+
85
+ // =============================================================
86
+ // Proxy Initializer
87
+ // =============================================================
88
+
89
+ /// @inheritdoc IArchitect
90
+ function getProxyInitializer() external view returns (ISpaceProxyInitializer) {
91
+ return _getProxyInitializer();
92
+ }
93
+
94
+ /// @inheritdoc IArchitect
95
+ function setProxyInitializer(ISpaceProxyInitializer proxyInitializer) external onlyOwner {
96
+ _setProxyInitializer(proxyInitializer);
97
+ }
98
+ }
@@ -0,0 +1,95 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IArchitectBase} from "./IArchitect.sol";
6
+
7
+ import {IRuleEntitlement} from "src/spaces/entitlements/rule/IRuleEntitlement.sol";
8
+ import {IRuleEntitlementV2} from "src/spaces/entitlements/rule/IRuleEntitlement.sol";
9
+ import {IUserEntitlement} from "src/spaces/entitlements/user/IUserEntitlement.sol";
10
+ import {ISpaceOwner} from "src/spaces/facets/owner/ISpaceOwner.sol";
11
+ import {ISpaceProxyInitializer} from "src/spaces/facets/proxy/ISpaceProxyInitializer.sol";
12
+
13
+ // libraries
14
+
15
+ import {ArchitectStorage} from "./ArchitectStorage.sol";
16
+ import {ImplementationStorage} from "./ImplementationStorage.sol";
17
+ import {Address} from "@openzeppelin/contracts/utils/Address.sol";
18
+
19
+ // contracts
20
+
21
+ // modules
22
+
23
+ abstract contract ArchitectBase is IArchitectBase {
24
+ // =============================================================
25
+ // Spaces
26
+ // =============================================================
27
+ function _getTokenIdBySpace(address space) internal view returns (uint256) {
28
+ return ArchitectStorage.layout().tokenIdBySpace[space];
29
+ }
30
+
31
+ function _getSpaceByTokenId(uint256 tokenId) internal view returns (address) {
32
+ return ArchitectStorage.layout().spaceByTokenId[tokenId];
33
+ }
34
+
35
+ // =============================================================
36
+ // Implementations
37
+ // =============================================================
38
+
39
+ function _setImplementations(
40
+ ISpaceOwner spaceOwnerToken,
41
+ IUserEntitlement userEntitlement,
42
+ IRuleEntitlementV2 ruleEntitlement,
43
+ IRuleEntitlement legacyRuleEntitlement
44
+ ) internal {
45
+ if (address(spaceOwnerToken).code.length == 0) {
46
+ revert Architect__NotContract();
47
+ }
48
+ if (address(userEntitlement).code.length == 0) {
49
+ revert Architect__NotContract();
50
+ }
51
+ if (address(ruleEntitlement).code.length == 0) {
52
+ revert Architect__NotContract();
53
+ }
54
+
55
+ ImplementationStorage.Layout storage ds = ImplementationStorage.layout();
56
+ ds.spaceOwnerToken = spaceOwnerToken;
57
+ ds.userEntitlement = userEntitlement;
58
+ ds.ruleEntitlement = ruleEntitlement;
59
+ ds.legacyRuleEntitlement = legacyRuleEntitlement;
60
+ }
61
+
62
+ function _getImplementations()
63
+ internal
64
+ view
65
+ returns (
66
+ ISpaceOwner spaceOwnerToken,
67
+ IUserEntitlement userEntitlementImplementation,
68
+ IRuleEntitlementV2 ruleEntitlementImplementation,
69
+ IRuleEntitlement legacyRuleEntitlement
70
+ )
71
+ {
72
+ ImplementationStorage.Layout storage ds = ImplementationStorage.layout();
73
+
74
+ return (
75
+ ds.spaceOwnerToken,
76
+ ds.userEntitlement,
77
+ ds.ruleEntitlement,
78
+ ds.legacyRuleEntitlement
79
+ );
80
+ }
81
+
82
+ // =============================================================
83
+ // Proxy Initializer
84
+ // =============================================================
85
+ function _getProxyInitializer() internal view returns (ISpaceProxyInitializer) {
86
+ return ImplementationStorage.layout().proxyInitializer;
87
+ }
88
+
89
+ function _setProxyInitializer(ISpaceProxyInitializer proxyInitializer) internal {
90
+ ImplementationStorage.Layout storage ds = ImplementationStorage.layout();
91
+ ds.proxyInitializer = proxyInitializer;
92
+
93
+ emit Architect__ProxyInitializerSet(address(proxyInitializer));
94
+ }
95
+ }
@@ -0,0 +1,28 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+
6
+ // contracts
7
+
8
+ library ArchitectStorage {
9
+ // keccak256(abi.encode(uint256(keccak256("spaces.facets.architect.storage")) - 1)) &
10
+ // ~bytes32(uint256(0xff))
11
+ bytes32 internal constant SLOT_POSITION =
12
+ 0x06bd04a817647c31ee485c8a0baab96facd62dbfd4b475796bb17ca2c12f0000;
13
+
14
+ struct Layout {
15
+ uint256 spaceCount;
16
+ mapping(address spaceAddress => uint256 tokenId) tokenIdBySpace;
17
+ mapping(uint256 tokenId => address spaceAddress) spaceByTokenId;
18
+ }
19
+
20
+ function layout() internal pure returns (Layout storage ds) {
21
+ bytes32 position = SLOT_POSITION;
22
+
23
+ // solhint-disable-next-line no-inline-assembly
24
+ assembly {
25
+ ds.slot := position
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,155 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+
6
+ // libraries
7
+
8
+ import {IRuleEntitlement} from "src/spaces/entitlements/rule/IRuleEntitlement.sol";
9
+ import {IRuleEntitlementV2} from "src/spaces/entitlements/rule/IRuleEntitlement.sol";
10
+ import {IUserEntitlement} from "src/spaces/entitlements/user/IUserEntitlement.sol";
11
+ import {IMembershipBase} from "src/spaces/facets/membership/IMembership.sol";
12
+
13
+ import {ISpaceOwner} from "src/spaces/facets/owner/ISpaceOwner.sol";
14
+ import {ISpaceProxyInitializer} from "src/spaces/facets/proxy/ISpaceProxyInitializer.sol";
15
+
16
+ // contracts
17
+ interface IArchitectBase {
18
+ // =============================================================
19
+ // STRUCTS
20
+ // =============================================================
21
+
22
+ struct MembershipRequirementsOld {
23
+ bool everyone;
24
+ address[] users;
25
+ bytes ruleData;
26
+ }
27
+
28
+ struct MembershipOld {
29
+ IMembershipBase.Membership settings;
30
+ MembershipRequirementsOld requirements;
31
+ string[] permissions;
32
+ }
33
+
34
+ struct CreateSpaceOld {
35
+ Metadata metadata;
36
+ MembershipOld membership;
37
+ ChannelInfo channel;
38
+ Prepay prepay;
39
+ }
40
+
41
+ struct SpaceInfo {
42
+ string name;
43
+ string uri;
44
+ string shortDescription;
45
+ string longDescription;
46
+ Membership membership;
47
+ ChannelInfo channel;
48
+ }
49
+
50
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
51
+ /* CreateSpace */
52
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
53
+
54
+ struct MembershipRequirements {
55
+ bool everyone;
56
+ address[] users;
57
+ bytes ruleData;
58
+ bool syncEntitlements;
59
+ }
60
+
61
+ struct Metadata {
62
+ string name;
63
+ string uri;
64
+ string shortDescription;
65
+ string longDescription;
66
+ }
67
+
68
+ struct Membership {
69
+ IMembershipBase.Membership settings;
70
+ MembershipRequirements requirements;
71
+ string[] permissions;
72
+ }
73
+
74
+ struct ChannelInfo {
75
+ string metadata;
76
+ }
77
+
78
+ struct Prepay {
79
+ uint256 supply;
80
+ }
81
+
82
+ struct CreateSpace {
83
+ Metadata metadata;
84
+ Membership membership;
85
+ ChannelInfo channel;
86
+ Prepay prepay;
87
+ }
88
+ /**
89
+ * @notice Options for creating a space
90
+ * @param to Address that will receive the space NFT (defaults to msg.sender if not specified)
91
+ */
92
+
93
+ struct SpaceOptions {
94
+ address to;
95
+ }
96
+
97
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
98
+ /* Events */
99
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
100
+ event SpaceCreated(address indexed owner, uint256 indexed tokenId, address indexed space);
101
+
102
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
103
+ /* Errors */
104
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
105
+
106
+ error Architect__InvalidStringLength();
107
+ error Architect__InvalidNetworkId();
108
+ error Architect__InvalidAddress();
109
+ error Architect__NotContract();
110
+ error Architect__InvalidPricingModule();
111
+
112
+ event Architect__ProxyInitializerSet(address indexed proxyInitializer);
113
+ }
114
+
115
+ interface IArchitect is IArchitectBase {
116
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
117
+ /* Registry */
118
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
119
+ function getSpaceByTokenId(uint256 tokenId) external view returns (address space);
120
+
121
+ function getTokenIdBySpace(address space) external view returns (uint256);
122
+
123
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
124
+ /* Implementations */
125
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
126
+
127
+ function setSpaceArchitectImplementations(
128
+ ISpaceOwner ownerTokenImplementation,
129
+ IUserEntitlement userEntitlementImplementation,
130
+ IRuleEntitlementV2 ruleEntitlementImplementation,
131
+ IRuleEntitlement legacyRuleEntitlement
132
+ ) external;
133
+
134
+ function getSpaceArchitectImplementations()
135
+ external
136
+ view
137
+ returns (
138
+ ISpaceOwner ownerTokenImplementation,
139
+ IUserEntitlement userEntitlementImplementation,
140
+ IRuleEntitlementV2 ruleEntitlementImplementation,
141
+ IRuleEntitlement legacyRuleEntitlement
142
+ );
143
+
144
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
145
+ /* Proxy Initializer */
146
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
147
+ /// @notice Retrieves the current proxy initializer
148
+ /// @return The address of the current ISpaceProxyInitializer contract
149
+ function getProxyInitializer() external view returns (ISpaceProxyInitializer);
150
+
151
+ /// @notice Sets a new proxy initializer
152
+ /// @param proxyInitializer The address of the new ISpaceProxyInitializer contract to be set
153
+ /// @dev This function should only be callable by the contract owner or authorized roles
154
+ function setProxyInitializer(ISpaceProxyInitializer proxyInitializer) external;
155
+ }
@@ -0,0 +1,42 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+
6
+ import {IEntitlementChecker} from "src/base/registry/facets/checker/IEntitlementChecker.sol";
7
+ import {IWalletLink} from "src/factory/facets/wallet-link/IWalletLink.sol";
8
+ import {IRuleEntitlement} from "src/spaces/entitlements/rule/IRuleEntitlement.sol";
9
+ import {IRuleEntitlementV2} from "src/spaces/entitlements/rule/IRuleEntitlement.sol";
10
+ import {IUserEntitlement} from "src/spaces/entitlements/user/IUserEntitlement.sol";
11
+ import {ISpaceOwner} from "src/spaces/facets/owner/ISpaceOwner.sol";
12
+ import {ISpaceProxyInitializer} from "src/spaces/facets/proxy/ISpaceProxyInitializer.sol";
13
+ // libraries
14
+
15
+ // contracts
16
+
17
+ library ImplementationStorage {
18
+ // keccak256(abi.encode(uint256(keccak256("spaces.facets.architect.implementation.storage")) -
19
+ // 1))
20
+ // & ~bytes32(uint256(0xff))
21
+ bytes32 internal constant SLOT_POSITION =
22
+ 0x9e34afa7b4d27d347d25d9d9dab4f1a106fa081382e6c4243e834d093e787d00;
23
+
24
+ struct Layout {
25
+ ISpaceOwner spaceOwnerToken;
26
+ IUserEntitlement userEntitlement;
27
+ IRuleEntitlementV2 ruleEntitlement;
28
+ IWalletLink walletLink;
29
+ IEntitlementChecker entitlementChecker;
30
+ IRuleEntitlement legacyRuleEntitlement;
31
+ ISpaceProxyInitializer proxyInitializer;
32
+ }
33
+
34
+ function layout() internal pure returns (Layout storage ds) {
35
+ bytes32 position = SLOT_POSITION;
36
+
37
+ // solhint-disable-next-line no-inline-assembly
38
+ assembly {
39
+ ds.slot := position
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,41 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+
6
+ // libraries
7
+
8
+ // contracts
9
+
10
+ interface IPricingModulesBase {
11
+ // =============================================================
12
+ // Structs
13
+ // =============================================================
14
+ struct PricingModule {
15
+ string name;
16
+ string description;
17
+ address module;
18
+ }
19
+
20
+ // =============================================================
21
+ // Errors
22
+ // =============================================================
23
+ error InvalidPricingModule(address module);
24
+
25
+ // =============================================================
26
+ // Events
27
+ // =============================================================
28
+ event PricingModuleAdded(address indexed module);
29
+ event PricingModuleUpdated(address indexed module);
30
+ event PricingModuleRemoved(address indexed module);
31
+ }
32
+
33
+ interface IPricingModules is IPricingModulesBase {
34
+ function isPricingModule(address module) external view returns (bool);
35
+
36
+ function addPricingModule(address module) external;
37
+
38
+ function removePricingModule(address module) external;
39
+
40
+ function listPricingModules() external view returns (PricingModule[] memory);
41
+ }
@@ -0,0 +1,89 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+
6
+ import {IPricingModulesBase} from "./IPricingModules.sol";
7
+ import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
8
+ import {IMembershipPricing} from "src/spaces/facets/membership/pricing/IMembershipPricing.sol";
9
+
10
+ // libraries
11
+ import {PricingModulesStorage} from "./PricingModulesStorage.sol";
12
+ import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
13
+ import {CustomRevert} from "src/utils/libraries/CustomRevert.sol";
14
+
15
+ // contracts
16
+
17
+ library PricingModulesBase {
18
+ using EnumerableSet for EnumerableSet.AddressSet;
19
+
20
+ function isPricingModule(address module) internal view returns (bool) {
21
+ PricingModulesStorage.Layout storage ds = PricingModulesStorage.layout();
22
+ return ds.pricingModules.contains(module);
23
+ }
24
+
25
+ function addPricingModule(address module) internal {
26
+ PricingModulesStorage.Layout storage ds = PricingModulesStorage.layout();
27
+
28
+ if (module == address(0)) {
29
+ CustomRevert.revertWith(IPricingModulesBase.InvalidPricingModule.selector, module);
30
+ }
31
+
32
+ if (!verifyInterface(module)) {
33
+ CustomRevert.revertWith(IPricingModulesBase.InvalidPricingModule.selector, module);
34
+ }
35
+
36
+ if (ds.pricingModules.contains(module)) {
37
+ CustomRevert.revertWith(IPricingModulesBase.InvalidPricingModule.selector, module);
38
+ }
39
+
40
+ ds.pricingModules.add(module);
41
+
42
+ emit IPricingModulesBase.PricingModuleAdded(module);
43
+ }
44
+
45
+ function removePricingModule(address module) internal {
46
+ PricingModulesStorage.Layout storage ds = PricingModulesStorage.layout();
47
+
48
+ if (module == address(0)) {
49
+ CustomRevert.revertWith(IPricingModulesBase.InvalidPricingModule.selector, module);
50
+ }
51
+
52
+ // verify module exists
53
+ if (!ds.pricingModules.contains(module)) {
54
+ CustomRevert.revertWith(IPricingModulesBase.InvalidPricingModule.selector, module);
55
+ }
56
+
57
+ ds.pricingModules.remove(module);
58
+
59
+ emit IPricingModulesBase.PricingModuleRemoved(module);
60
+ }
61
+
62
+ function listPricingModules()
63
+ internal
64
+ view
65
+ returns (IPricingModulesBase.PricingModule[] memory)
66
+ {
67
+ PricingModulesStorage.Layout storage ds = PricingModulesStorage.layout();
68
+ uint256 length = ds.pricingModules.length();
69
+ IPricingModulesBase.PricingModule[]
70
+ memory pricingModules = new IPricingModulesBase.PricingModule[](length);
71
+ for (uint256 i = 0; i < length; i++) {
72
+ address moduleAddress = ds.pricingModules.at(i);
73
+ IMembershipPricing module = IMembershipPricing(moduleAddress);
74
+ pricingModules[i] = IPricingModulesBase.PricingModule({
75
+ name: module.name(),
76
+ description: module.description(),
77
+ module: moduleAddress
78
+ });
79
+ }
80
+ return pricingModules;
81
+ }
82
+
83
+ // =============================================================
84
+ // Internal
85
+ // =============================================================
86
+ function verifyInterface(address module) internal view returns (bool) {
87
+ return IERC165(module).supportsInterface(type(IMembershipPricing).interfaceId);
88
+ }
89
+ }
@@ -0,0 +1,40 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IPricingModules} from "./IPricingModules.sol";
6
+
7
+ // contracts
8
+
9
+ import {PricingModulesBase} from "./PricingModulesBase.sol";
10
+ import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
11
+ import {OwnableBase} from "@towns-protocol/diamond/src/facets/ownable/OwnableBase.sol";
12
+
13
+ contract PricingModulesFacet is IPricingModules, OwnableBase, Facet {
14
+ function __PricingModulesFacet_init(address[] memory pricingModules) external onlyInitializing {
15
+ __PricingModulesFacet_init_unchained(pricingModules);
16
+ }
17
+
18
+ function __PricingModulesFacet_init_unchained(address[] memory pricingModules) internal {
19
+ _addInterface(type(IPricingModules).interfaceId);
20
+ for (uint256 i = 0; i < pricingModules.length; i++) {
21
+ PricingModulesBase.addPricingModule(pricingModules[i]);
22
+ }
23
+ }
24
+
25
+ function addPricingModule(address pricingModule) external onlyOwner {
26
+ PricingModulesBase.addPricingModule(pricingModule);
27
+ }
28
+
29
+ function isPricingModule(address module) external view returns (bool) {
30
+ return PricingModulesBase.isPricingModule(module);
31
+ }
32
+
33
+ function removePricingModule(address module) external onlyOwner {
34
+ PricingModulesBase.removePricingModule(module);
35
+ }
36
+
37
+ function listPricingModules() external view returns (PricingModule[] memory) {
38
+ return PricingModulesBase.listPricingModules();
39
+ }
40
+ }
@@ -0,0 +1,30 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+
6
+ // libraries
7
+ import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
8
+
9
+ // contracts
10
+
11
+ library PricingModulesStorage {
12
+ using EnumerableSet for EnumerableSet.AddressSet;
13
+
14
+ // keccak256(abi.encode(uint256(keccak256("spaces.facets.architect.pricing.module.storage")) -
15
+ // 1))
16
+ // & ~bytes32(uint256(0xff))
17
+ bytes32 internal constant SLOT_POSITION =
18
+ 0x6438323c68a77f029335e6433efb7c07e7cd1775df0c27e75bcd3591a8bc5d00;
19
+
20
+ struct Layout {
21
+ // The set of all pricing modules
22
+ EnumerableSet.AddressSet pricingModules;
23
+ }
24
+
25
+ function layout() internal pure returns (Layout storage l) {
26
+ assembly {
27
+ l.slot := SLOT_POSITION
28
+ }
29
+ }
30
+ }