@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,50 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.4;
3
+
4
+ import {ReviewStorage} from "./ReviewStorage.sol";
5
+
6
+ interface IReviewBase {
7
+ enum Action {
8
+ Add,
9
+ Update,
10
+ Delete
11
+ }
12
+
13
+ struct Review {
14
+ string comment;
15
+ uint8 rating;
16
+ }
17
+
18
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
19
+ /* CUSTOM ERRORS */
20
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
21
+
22
+ error ReviewFacet__InvalidCommentLength();
23
+ error ReviewFacet__InvalidRating();
24
+ error ReviewFacet__ReviewAlreadyExists();
25
+ error ReviewFacet__ReviewDoesNotExist();
26
+
27
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
28
+ /* EVENTS */
29
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
30
+
31
+ /// @notice Emitted when a review is added
32
+ event ReviewAdded(address indexed user, string comment, uint8 rating);
33
+
34
+ /// @notice Emitted when a review is updated
35
+ event ReviewUpdated(address indexed user, string comment, uint8 rating);
36
+
37
+ /// @notice Emitted when a review is deleted
38
+ event ReviewDeleted(address indexed user);
39
+ }
40
+
41
+ interface IReview is IReviewBase {
42
+ function setReview(Action action, bytes calldata data) external;
43
+
44
+ function getReview(address user) external view returns (ReviewStorage.Content memory);
45
+
46
+ function getAllReviews()
47
+ external
48
+ view
49
+ returns (address[] memory users, ReviewStorage.Content[] memory reviews);
50
+ }
@@ -0,0 +1,105 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IReview} from "./IReview.sol";
6
+
7
+ // libraries
8
+
9
+ import {ReviewStorage} from "./ReviewStorage.sol";
10
+ import {CustomRevert} from "src/utils/libraries/CustomRevert.sol";
11
+ import {EnumerableSetLib} from "solady/utils/EnumerableSetLib.sol";
12
+ import {FixedPointMathLib} from "solady/utils/FixedPointMathLib.sol";
13
+
14
+ // contracts
15
+ import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
16
+ import {Entitled} from "src/spaces/facets/Entitled.sol";
17
+
18
+ contract ReviewFacet is IReview, Entitled, Facet {
19
+ using EnumerableSetLib for EnumerableSetLib.AddressSet;
20
+
21
+ uint256 internal constant DEFAULT_MIN_COMMENT_LENGTH = 10;
22
+ uint256 internal constant DEFAULT_MAX_COMMENT_LENGTH = 4000;
23
+
24
+ function __Review_init() external onlyInitializing {
25
+ _addInterface(type(IReview).interfaceId);
26
+ }
27
+
28
+ function setReview(Action action, bytes calldata data) external {
29
+ _validateMembership(msg.sender);
30
+
31
+ ReviewStorage.Layout storage rs = ReviewStorage.layout();
32
+
33
+ if (action == Action.Add) {
34
+ Review memory newReview = abi.decode(data, (Review));
35
+ _validateReview(newReview);
36
+
37
+ ReviewStorage.Content storage review = rs.reviewByUser[msg.sender];
38
+
39
+ if (review.createdAt != 0) {
40
+ CustomRevert.revertWith(ReviewFacet__ReviewAlreadyExists.selector);
41
+ }
42
+
43
+ (review.comment, review.rating, review.createdAt) = (
44
+ newReview.comment,
45
+ newReview.rating,
46
+ uint40(block.timestamp)
47
+ );
48
+ rs.usersReviewed.add(msg.sender);
49
+
50
+ emit ReviewAdded(msg.sender, newReview.comment, newReview.rating);
51
+ } else if (action == Action.Update) {
52
+ Review memory newReview = abi.decode(data, (Review));
53
+ _validateReview(newReview);
54
+
55
+ ReviewStorage.Content storage review = rs.reviewByUser[msg.sender];
56
+
57
+ if (review.createdAt == 0) {
58
+ CustomRevert.revertWith(ReviewFacet__ReviewDoesNotExist.selector);
59
+ }
60
+
61
+ (review.comment, review.rating, review.updatedAt) = (
62
+ newReview.comment,
63
+ newReview.rating,
64
+ uint40(block.timestamp)
65
+ );
66
+
67
+ emit ReviewUpdated(msg.sender, newReview.comment, newReview.rating);
68
+ } else if (action == Action.Delete) {
69
+ delete rs.reviewByUser[msg.sender];
70
+ rs.usersReviewed.remove(msg.sender);
71
+
72
+ emit ReviewDeleted(msg.sender);
73
+ }
74
+ }
75
+
76
+ function getReview(address user) external view returns (ReviewStorage.Content memory review) {
77
+ assembly ("memory-safe") {
78
+ mstore(0x40, review)
79
+ }
80
+ review = ReviewStorage.layout().reviewByUser[user];
81
+ }
82
+
83
+ function getAllReviews()
84
+ external
85
+ view
86
+ returns (address[] memory users, ReviewStorage.Content[] memory reviews)
87
+ {
88
+ ReviewStorage.Layout storage rs = ReviewStorage.layout();
89
+ users = rs.usersReviewed.values();
90
+ reviews = new ReviewStorage.Content[](users.length);
91
+ for (uint256 i; i < users.length; ++i) {
92
+ reviews[i] = rs.reviewByUser[users[i]];
93
+ }
94
+ }
95
+
96
+ function _validateReview(Review memory review) internal pure {
97
+ uint256 length = bytes(review.comment).length;
98
+ if (length < DEFAULT_MIN_COMMENT_LENGTH || length > DEFAULT_MAX_COMMENT_LENGTH) {
99
+ CustomRevert.revertWith(ReviewFacet__InvalidCommentLength.selector);
100
+ }
101
+ if (review.rating > 5) {
102
+ CustomRevert.revertWith(ReviewFacet__InvalidRating.selector);
103
+ }
104
+ }
105
+ }
@@ -0,0 +1,29 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {EnumerableSetLib} from "solady/utils/EnumerableSetLib.sol";
5
+
6
+ library ReviewStorage {
7
+ // keccak256(abi.encode(uint256(keccak256("spaces.facets.review.storage")) - 1)) &
8
+ // ~bytes32(uint256(0xff))
9
+ bytes32 internal constant STORAGE_SLOT =
10
+ 0x575a00558d547e4e5b6480e3f9afffa169c969028d92350b23fc834c93401100;
11
+
12
+ struct Content {
13
+ string comment;
14
+ uint8 rating;
15
+ uint40 createdAt;
16
+ uint40 updatedAt;
17
+ }
18
+
19
+ struct Layout {
20
+ mapping(address user => Content) reviewByUser;
21
+ EnumerableSetLib.AddressSet usersReviewed;
22
+ }
23
+
24
+ function layout() internal pure returns (Layout storage l) {
25
+ assembly {
26
+ l.slot := STORAGE_SLOT
27
+ }
28
+ }
29
+ }
@@ -0,0 +1,197 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IEntitlement} from "src/spaces/entitlements/IEntitlement.sol";
6
+
7
+ // libraries
8
+
9
+ // contracts
10
+ /// @title IRolesBase
11
+ /// @notice Base interface for role management
12
+ interface IRolesBase {
13
+ /// @notice Struct representing a role
14
+ /// @param id Unique identifier for the role
15
+ /// @param name Name of the role
16
+ /// @param disabled Flag indicating if the role is disabled
17
+ /// @param permissions List of permissions associated with the role
18
+ /// @param entitlements List of entitlements associated with the role
19
+ struct Role {
20
+ uint256 id;
21
+ string name;
22
+ bool disabled;
23
+ string[] permissions;
24
+ IEntitlement[] entitlements;
25
+ }
26
+
27
+ /// @notice Struct for creating an entitlement
28
+ /// @param module The entitlement module
29
+ /// @param data Additional data for the entitlement
30
+ struct CreateEntitlement {
31
+ IEntitlement module;
32
+ bytes data;
33
+ }
34
+
35
+ /// @notice Emitted when a new role is created
36
+ /// @param creator Address of the role creator
37
+ /// @param roleId Unique identifier of the created role
38
+ event RoleCreated(address indexed creator, uint256 indexed roleId);
39
+
40
+ /// @notice Emitted when a role is updated
41
+ /// @param updater Address of the role updater
42
+ /// @param roleId Unique identifier of the updated role
43
+ event RoleUpdated(address indexed updater, uint256 indexed roleId);
44
+
45
+ /// @notice Emitted when a role is removed
46
+ /// @param remover Address of the role remover
47
+ /// @param roleId Unique identifier of the removed role
48
+ event RoleRemoved(address indexed remover, uint256 indexed roleId);
49
+
50
+ /// @notice Emitted when permissions are added to a channel role
51
+ /// @param updater Address of the updater
52
+ /// @param roleId Unique identifier of the role
53
+ /// @param channelId Unique identifier of the channel
54
+ event PermissionsAddedToChannelRole(
55
+ address indexed updater,
56
+ uint256 indexed roleId,
57
+ bytes32 indexed channelId
58
+ );
59
+
60
+ /// @notice Emitted when permissions are removed from a channel role
61
+ /// @param updater Address of the updater
62
+ /// @param roleId Unique identifier of the role
63
+ /// @param channelId Unique identifier of the channel
64
+ event PermissionsRemovedFromChannelRole(
65
+ address indexed updater,
66
+ uint256 indexed roleId,
67
+ bytes32 indexed channelId
68
+ );
69
+
70
+ /// @notice Emitted when permissions are updated for a channel role
71
+ /// @param updater Address of the updater
72
+ /// @param roleId Unique identifier of the role
73
+ /// @param channelId Unique identifier of the channel
74
+ event PermissionsUpdatedForChannelRole(
75
+ address indexed updater,
76
+ uint256 indexed roleId,
77
+ bytes32 indexed channelId
78
+ );
79
+
80
+ // =============================================================
81
+ // Errors
82
+ // =============================================================
83
+ /// @notice Error thrown when a role does not exist
84
+ error Roles__RoleDoesNotExist();
85
+ /// @notice Error thrown when an entitlement already exists
86
+ error Roles__EntitlementAlreadyExists();
87
+ /// @notice Error thrown when an entitlement does not exist
88
+ error Roles__EntitlementDoesNotExist();
89
+ /// @notice Error thrown when an invalid permission is provided
90
+ error Roles__InvalidPermission();
91
+ /// @notice Error thrown when an invalid entitlement address is provided
92
+ error Roles__InvalidEntitlementAddress();
93
+ /// @notice Error thrown when a permission already exists
94
+ error Roles__PermissionAlreadyExists();
95
+ /// @notice Error thrown when a permission does not exist
96
+ error Roles__PermissionDoesNotExist();
97
+ /// @notice Error thrown when attempting to modify an immutable role
98
+ error Roles__RoleIsImmutable();
99
+ }
100
+
101
+ /// @title IRoles
102
+ /// @notice Interface for role management operations
103
+ interface IRoles is IRolesBase {
104
+ /// @notice Creates a new role
105
+ /// @param roleName Name of the role
106
+ /// @param permissions List of permissions for the role
107
+ /// @param entitlements List of entitlements for the role
108
+ /// @return roleId Unique identifier of the created role
109
+ function createRole(
110
+ string calldata roleName,
111
+ string[] calldata permissions,
112
+ CreateEntitlement[] calldata entitlements
113
+ ) external returns (uint256 roleId);
114
+
115
+ /// @notice Retrieves all roles
116
+ /// @return roles Array of all roles
117
+ function getRoles() external view returns (Role[] memory roles);
118
+
119
+ /// @notice Retrieves a role by its ID
120
+ /// @param roleId Unique identifier of the role
121
+ /// @return role The role struct
122
+ function getRoleById(uint256 roleId) external view returns (Role memory role);
123
+
124
+ /// @notice Updates an existing role
125
+ /// @param roleId Unique identifier of the role to update
126
+ /// @param roleName New name for the role
127
+ /// @param permissions New list of permissions for the role
128
+ /// @param entitlements New list of entitlements for the role
129
+ function updateRole(
130
+ uint256 roleId,
131
+ string calldata roleName,
132
+ string[] calldata permissions,
133
+ CreateEntitlement[] calldata entitlements
134
+ ) external;
135
+
136
+ /// @notice Removes a role
137
+ /// @param roleId Unique identifier of the role to remove
138
+ function removeRole(uint256 roleId) external;
139
+
140
+ // permissions
141
+
142
+ /// @notice Adds permissions to a role
143
+ /// @param roleId Unique identifier of the role
144
+ /// @param permissions List of permissions to add
145
+ function addPermissionsToRole(uint256 roleId, string[] calldata permissions) external;
146
+
147
+ /// @notice Removes permissions from a role
148
+ /// @param roleId Unique identifier of the role
149
+ /// @param permissions List of permissions to remove
150
+ function removePermissionsFromRole(uint256 roleId, string[] calldata permissions) external;
151
+
152
+ /// @notice Retrieves permissions for a role
153
+ /// @param roleId Unique identifier of the role
154
+ /// @return permissions List of permissions for the role
155
+ function getPermissionsByRoleId(
156
+ uint256 roleId
157
+ ) external view returns (string[] memory permissions);
158
+
159
+ // entitlements
160
+
161
+ /// @notice Adds an entitlement to a role
162
+ /// @param roleId Unique identifier of the role
163
+ /// @param entitlement Entitlement to add
164
+ function addRoleToEntitlement(uint256 roleId, CreateEntitlement calldata entitlement) external;
165
+
166
+ /// @notice Removes an entitlement from a role
167
+ /// @param roleId Unique identifier of the role
168
+ /// @param entitlement Entitlement to remove
169
+ function removeRoleFromEntitlement(
170
+ uint256 roleId,
171
+ CreateEntitlement calldata entitlement
172
+ ) external;
173
+
174
+ /// @notice Sets channel permission overrides for a role
175
+ /// @param roleId Unique identifier of the role
176
+ /// @param channelId Unique identifier of the channel
177
+ /// @param permissions List of permissions to set as overrides
178
+ function setChannelPermissionOverrides(
179
+ uint256 roleId,
180
+ bytes32 channelId,
181
+ string[] calldata permissions
182
+ ) external;
183
+
184
+ /// @notice Retrieves channel permission overrides for a role
185
+ /// @param roleId Unique identifier of the role
186
+ /// @param channelId Unique identifier of the channel
187
+ /// @return permissions List of permission overrides for the channel
188
+ function getChannelPermissionOverrides(
189
+ uint256 roleId,
190
+ bytes32 channelId
191
+ ) external view returns (string[] memory permissions);
192
+
193
+ /// @notice Clears channel permission overrides for a role
194
+ /// @param roleId Unique identifier of the role
195
+ /// @param channelId Unique identifier of the channel
196
+ function clearChannelPermissionOverrides(uint256 roleId, bytes32 channelId) external;
197
+ }
@@ -0,0 +1,123 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IRoles} from "./IRoles.sol";
6
+
7
+ // libraries
8
+ import {StringSet} from "../../../utils/libraries/StringSet.sol";
9
+ import {Permissions} from "../Permissions.sol";
10
+ import {RolesStorage} from "./RolesStorage.sol";
11
+
12
+ // contracts
13
+ import {Entitled} from "../Entitled.sol";
14
+ import {RolesBase} from "./RolesBase.sol";
15
+
16
+ contract Roles is IRoles, RolesBase, Entitled {
17
+ using StringSet for StringSet.Set;
18
+ using RolesStorage for RolesStorage.Role;
19
+
20
+ /// @inheritdoc IRoles
21
+ function createRole(
22
+ string calldata roleName,
23
+ string[] calldata permissions,
24
+ CreateEntitlement[] calldata entitlements
25
+ ) external override returns (uint256) {
26
+ _validatePermission(Permissions.ModifySpaceSettings);
27
+ return _createRole(roleName, permissions, entitlements);
28
+ }
29
+
30
+ /// @inheritdoc IRoles
31
+ function getRoles() external view override returns (Role[] memory) {
32
+ return _getRoles();
33
+ }
34
+
35
+ /// @inheritdoc IRoles
36
+ function getRoleById(uint256 roleId) external view override returns (Role memory) {
37
+ _checkRoleExists(roleId);
38
+ return _getRoleById(roleId);
39
+ }
40
+
41
+ /// @inheritdoc IRoles
42
+ function updateRole(
43
+ uint256 roleId,
44
+ string calldata roleName,
45
+ string[] calldata permissions,
46
+ CreateEntitlement[] calldata entitlements
47
+ ) external override {
48
+ _validatePermission(Permissions.ModifySpaceSettings);
49
+ _updateRole(roleId, roleName, permissions, entitlements);
50
+ }
51
+
52
+ /// @inheritdoc IRoles
53
+ function removeRole(uint256 roleId) external override {
54
+ _validatePermission(Permissions.ModifySpaceSettings);
55
+ _removeRole(roleId);
56
+ }
57
+
58
+ // permissions
59
+ /// @inheritdoc IRoles
60
+ function addPermissionsToRole(uint256 roleId, string[] calldata permissions) external override {
61
+ _validatePermission(Permissions.ModifySpaceSettings);
62
+ _checkRoleExists(roleId);
63
+ RolesStorage.layout().roleById[roleId].addPermissions(permissions);
64
+ }
65
+
66
+ /// @inheritdoc IRoles
67
+ function removePermissionsFromRole(
68
+ uint256 roleId,
69
+ string[] calldata permissions
70
+ ) external override {
71
+ _validatePermission(Permissions.ModifySpaceSettings);
72
+ _checkRoleExists(roleId);
73
+ RolesStorage.layout().roleById[roleId].removePermissions(permissions);
74
+ }
75
+
76
+ /// @inheritdoc IRoles
77
+ function getPermissionsByRoleId(
78
+ uint256 roleId
79
+ ) external view override returns (string[] memory permissions) {
80
+ permissions = RolesStorage.layout().roleById[roleId].permissions.values();
81
+ }
82
+
83
+ // entitlements
84
+ /// @inheritdoc IRoles
85
+ function addRoleToEntitlement(uint256 roleId, CreateEntitlement calldata entitlement) external {
86
+ _validatePermission(Permissions.ModifySpaceSettings);
87
+ _addRoleToEntitlement(roleId, entitlement);
88
+ }
89
+
90
+ /// @inheritdoc IRoles
91
+ function removeRoleFromEntitlement(
92
+ uint256 roleId,
93
+ CreateEntitlement calldata entitlement
94
+ ) external {
95
+ _validatePermission(Permissions.ModifySpaceSettings);
96
+ _removeRoleFromEntitlement(roleId, entitlement);
97
+ }
98
+
99
+ // custom channel permission overrides
100
+ /// @inheritdoc IRoles
101
+ function setChannelPermissionOverrides(
102
+ uint256 roleId,
103
+ bytes32 channelId,
104
+ string[] calldata permissions
105
+ ) external {
106
+ _validatePermission(Permissions.ModifySpaceSettings);
107
+ _setChannelPermissionOverrides(roleId, channelId, permissions);
108
+ }
109
+
110
+ /// @inheritdoc IRoles
111
+ function getChannelPermissionOverrides(
112
+ uint256 roleId,
113
+ bytes32 channelId
114
+ ) external view returns (string[] memory permissions) {
115
+ return _getChannelPermissionOverrides(roleId, channelId);
116
+ }
117
+
118
+ /// @inheritdoc IRoles
119
+ function clearChannelPermissionOverrides(uint256 roleId, bytes32 channelId) external {
120
+ _validatePermission(Permissions.ModifySpaceSettings);
121
+ _clearChannelPermissionOverrides(roleId, channelId);
122
+ }
123
+ }