@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,177 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IChannelBase} from "./IChannel.sol";
6
+
7
+ // libraries
8
+ import {CustomRevert} from "../../../utils/libraries/CustomRevert.sol";
9
+ import {ChannelStorage} from "./ChannelStorage.sol";
10
+ import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
11
+ import {LibString} from "solady/utils/LibString.sol";
12
+
13
+ // contracts
14
+
15
+ library ChannelService {
16
+ using EnumerableSet for EnumerableSet.UintSet;
17
+ using EnumerableSet for EnumerableSet.Bytes32Set;
18
+ using ChannelStorage for ChannelStorage.Layout;
19
+ using CustomRevert for bytes4;
20
+ using LibString for string;
21
+
22
+ // =============================================================
23
+ // CRUD Operations
24
+ // =============================================================
25
+
26
+ function createChannel(
27
+ bytes32 channelId,
28
+ string calldata metadata,
29
+ uint256[] memory roleIds
30
+ ) internal {
31
+ checkChannel(channelId);
32
+
33
+ ChannelStorage.Layout storage channel = ChannelStorage.layout();
34
+
35
+ channel.channelIds.add(channelId);
36
+ ChannelStorage.Channel storage channelInfo = channel.channelById[channelId];
37
+ (channelInfo.id, channelInfo.metadata) = (channelId, metadata);
38
+
39
+ EnumerableSet.UintSet storage roles = channel.rolesByChannelId[channelId];
40
+ for (uint256 i; i < roleIds.length; ++i) {
41
+ // check if role already exists in channel
42
+ if (roles.contains(roleIds[i])) {
43
+ IChannelBase.ChannelService__RoleAlreadyExists.selector.revertWith();
44
+ }
45
+ roles.add(roleIds[i]);
46
+ }
47
+ }
48
+
49
+ function getChannel(
50
+ bytes32 channelId
51
+ ) internal view returns (bytes32 id, string memory metadata, bool disabled) {
52
+ checkChannelExists(channelId);
53
+
54
+ ChannelStorage.Layout storage channel = ChannelStorage.layout();
55
+ ChannelStorage.Channel storage channelInfo = channel.channelById[channelId];
56
+
57
+ id = channelInfo.id;
58
+ metadata = channelInfo.metadata;
59
+ disabled = channelInfo.disabled;
60
+ }
61
+
62
+ function updateChannel(bytes32 channelId, string calldata metadata, bool disabled) internal {
63
+ checkChannelExists(channelId);
64
+
65
+ ChannelStorage.Layout storage channel = ChannelStorage.layout();
66
+ ChannelStorage.Channel storage channelInfo = channel.channelById[channelId];
67
+
68
+ if (bytes(metadata).length > 0 && !metadata.eq(channelInfo.metadata)) {
69
+ channelInfo.metadata = metadata;
70
+ }
71
+
72
+ if (channelInfo.disabled != disabled) {
73
+ channelInfo.disabled = disabled;
74
+ }
75
+ }
76
+
77
+ function removeChannel(bytes32 channelId) internal {
78
+ checkChannelExists(channelId);
79
+
80
+ ChannelStorage.Layout storage channel = ChannelStorage.layout();
81
+
82
+ channel.channelIds.remove(channelId);
83
+ delete channel.channelById[channelId];
84
+
85
+ // remove all roles from channel
86
+ channel.rolesByChannelId[channelId].clear();
87
+ }
88
+
89
+ function getChannelIds() internal view returns (bytes32[] memory) {
90
+ ChannelStorage.Layout storage channel = ChannelStorage.layout();
91
+ return channel.channelIds.values();
92
+ }
93
+
94
+ function getChannelIdsByRole(
95
+ uint256 roleId
96
+ ) internal view returns (bytes32[] memory channelIds) {
97
+ ChannelStorage.Layout storage channel = ChannelStorage.layout();
98
+
99
+ uint256 potentialChannelsLength = channel.channelIds.length();
100
+ uint256 count = 0;
101
+
102
+ channelIds = new bytes32[](potentialChannelsLength);
103
+
104
+ for (uint256 i; i < potentialChannelsLength; ++i) {
105
+ bytes32 channelId = channel.channelIds.at(i);
106
+
107
+ if (channel.rolesByChannelId[channelId].contains(roleId)) {
108
+ unchecked {
109
+ channelIds[count++] = channelId;
110
+ }
111
+ }
112
+ }
113
+
114
+ // resize the array to the actual number of channels
115
+ assembly ("memory-safe") {
116
+ mstore(channelIds, count)
117
+ }
118
+ }
119
+
120
+ function addRoleToChannel(bytes32 channelId, uint256 roleId) internal {
121
+ checkChannelExists(channelId);
122
+ checkChannelNotDisabled(channelId);
123
+
124
+ // check role isn't in channel already
125
+ ChannelStorage.Layout storage channel = ChannelStorage.layout();
126
+ EnumerableSet.UintSet storage roles = channel.rolesByChannelId[channelId];
127
+ if (roles.contains(roleId)) {
128
+ IChannelBase.ChannelService__RoleAlreadyExists.selector.revertWith();
129
+ }
130
+
131
+ roles.add(roleId);
132
+ }
133
+
134
+ function removeRoleFromChannel(bytes32 channelId, uint256 roleId) internal {
135
+ checkChannelExists(channelId);
136
+ checkChannelNotDisabled(channelId);
137
+
138
+ // check role exists in channel
139
+ ChannelStorage.Layout storage channel = ChannelStorage.layout();
140
+ EnumerableSet.UintSet storage roles = channel.rolesByChannelId[channelId];
141
+ if (!roles.contains(roleId)) {
142
+ IChannelBase.ChannelService__RoleDoesNotExist.selector.revertWith();
143
+ }
144
+
145
+ roles.remove(roleId);
146
+ }
147
+
148
+ function getRolesByChannel(bytes32 channelId) internal view returns (uint256[] memory) {
149
+ checkChannelExists(channelId);
150
+ ChannelStorage.Layout storage channel = ChannelStorage.layout();
151
+ return channel.rolesByChannelId[channelId].values();
152
+ }
153
+
154
+ // =============================================================
155
+ // Validators
156
+ // =============================================================
157
+
158
+ function checkChannelNotDisabled(bytes32 channelId) internal view {
159
+ if (ChannelStorage.layout().channelById[channelId].disabled) {
160
+ IChannelBase.ChannelService__ChannelDisabled.selector.revertWith();
161
+ }
162
+ }
163
+
164
+ function checkChannel(bytes32 channelId) internal view {
165
+ // check that channel exists
166
+ if (ChannelStorage.layout().channelIds.contains(channelId)) {
167
+ IChannelBase.ChannelService__ChannelAlreadyExists.selector.revertWith();
168
+ }
169
+ }
170
+
171
+ function checkChannelExists(bytes32 channelId) internal view {
172
+ // check that channel exists
173
+ if (!ChannelStorage.layout().channelIds.contains(channelId)) {
174
+ IChannelBase.ChannelService__ChannelDoesNotExist.selector.revertWith();
175
+ }
176
+ }
177
+ }
@@ -0,0 +1,34 @@
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 ChannelStorage {
12
+ // keccak256(abi.encode(uint256(keccak256("spaces.facets.channel.storage")) - 1)) &
13
+ // ~bytes32(uint256(0xff))
14
+ bytes32 internal constant STORAGE_SLOT =
15
+ 0x804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504300;
16
+
17
+ struct Channel {
18
+ bytes32 id;
19
+ bool disabled;
20
+ string metadata;
21
+ }
22
+
23
+ struct Layout {
24
+ EnumerableSet.Bytes32Set channelIds;
25
+ mapping(bytes32 channelId => Channel) channelById;
26
+ mapping(bytes32 channelId => EnumerableSet.UintSet) rolesByChannelId;
27
+ }
28
+
29
+ function layout() internal pure returns (Layout storage ds) {
30
+ assembly {
31
+ ds.slot := STORAGE_SLOT
32
+ }
33
+ }
34
+ }
@@ -0,0 +1,80 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IChannel} from "./IChannel.sol";
6
+
7
+ // libraries
8
+ import {Permissions} from "src/spaces/facets/Permissions.sol";
9
+
10
+ // contracts
11
+
12
+ import {ChannelBase} from "./ChannelBase.sol";
13
+ import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
14
+ import {Entitled} from "src/spaces/facets/Entitled.sol";
15
+ import {RolesBase} from "src/spaces/facets/roles/RolesBase.sol";
16
+
17
+ contract Channels is IChannel, ChannelBase, RolesBase, Entitled, Facet {
18
+ function createChannel(
19
+ bytes32 channelId,
20
+ string calldata metadata,
21
+ uint256[] calldata roleIds
22
+ ) external {
23
+ _validatePermission(Permissions.AddRemoveChannels);
24
+ _createChannel(channelId, metadata, roleIds);
25
+ }
26
+
27
+ function createChannelWithOverridePermissions(
28
+ bytes32 channelId,
29
+ string calldata metadata,
30
+ RolePermissions[] calldata rolePermissions
31
+ ) external {
32
+ _validatePermission(Permissions.AddRemoveChannels);
33
+
34
+ uint256[] memory roleIds = new uint256[](rolePermissions.length);
35
+ for (uint256 i; i < rolePermissions.length; ++i) {
36
+ roleIds[i] = rolePermissions[i].roleId;
37
+ }
38
+ _createChannel(channelId, metadata, roleIds);
39
+
40
+ for (uint256 i; i < rolePermissions.length; ++i) {
41
+ _setChannelPermissionOverrides(
42
+ rolePermissions[i].roleId,
43
+ channelId,
44
+ rolePermissions[i].permissions
45
+ );
46
+ }
47
+ }
48
+
49
+ function getChannel(bytes32 channelId) external view returns (Channel memory channel) {
50
+ return _getChannel(channelId);
51
+ }
52
+
53
+ function getChannels() external view returns (Channel[] memory channels) {
54
+ return _getChannels();
55
+ }
56
+
57
+ function updateChannel(bytes32 channelId, string calldata metadata, bool disabled) external {
58
+ _validatePermission(Permissions.AddRemoveChannels);
59
+ _updateChannel(channelId, metadata, disabled);
60
+ }
61
+
62
+ function removeChannel(bytes32 channelId) external {
63
+ _validatePermission(Permissions.AddRemoveChannels);
64
+ _removeChannel(channelId);
65
+ }
66
+
67
+ function addRoleToChannel(bytes32 channelId, uint256 roleId) external {
68
+ _validatePermission(Permissions.AddRemoveChannels);
69
+ _addRoleToChannel(channelId, roleId);
70
+ }
71
+
72
+ function getRolesByChannel(bytes32 channelId) external view returns (uint256[] memory roleIds) {
73
+ return _getRolesByChannel(channelId);
74
+ }
75
+
76
+ function removeRoleFromChannel(bytes32 channelId, uint256 roleId) external {
77
+ _validatePermission(Permissions.AddRemoveChannels);
78
+ _removeRoleFromChannel(channelId, roleId);
79
+ }
80
+ }
@@ -0,0 +1,98 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+
6
+ // libraries
7
+
8
+ // contracts
9
+ interface IChannelBase {
10
+ // =============================================================
11
+ // Structs
12
+ // =============================================================
13
+ struct Channel {
14
+ bytes32 id;
15
+ bool disabled;
16
+ string metadata;
17
+ uint256[] roleIds;
18
+ }
19
+
20
+ struct RolePermissions {
21
+ uint256 roleId;
22
+ string[] permissions;
23
+ }
24
+
25
+ // =============================================================
26
+ // Events
27
+ // =============================================================
28
+ event ChannelCreated(address indexed caller, bytes32 channelId);
29
+ event ChannelUpdated(address indexed caller, bytes32 channelId);
30
+ event ChannelRemoved(address indexed caller, bytes32 channelId);
31
+ event ChannelRoleAdded(address indexed caller, bytes32 channelId, uint256 roleId);
32
+ event ChannelRoleRemoved(address indexed caller, bytes32 channelId, uint256 roleId);
33
+
34
+ // =============================================================
35
+ // Errors
36
+ // =============================================================
37
+ error ChannelService__ChannelAlreadyExists();
38
+ error ChannelService__ChannelDoesNotExist();
39
+ error ChannelService__ChannelDisabled();
40
+ error ChannelService__RoleAlreadyExists();
41
+ error ChannelService__RoleDoesNotExist();
42
+ }
43
+
44
+ interface IChannel is IChannelBase {
45
+ /// @notice creates a channel
46
+ /// @param channelId the channelId of the channel
47
+ /// @param metadata the metadata of the channel
48
+ /// @param roleIds the roleIds to add to the channel
49
+ function createChannel(
50
+ bytes32 channelId,
51
+ string calldata metadata,
52
+ uint256[] calldata roleIds
53
+ ) external;
54
+
55
+ /// @notice creates a channel with override permissions
56
+ /// @param channelId the channelId of the channel
57
+ /// @param metadata the metadata of the channel
58
+ /// @param rolePermissions the rolePermissions (role->permissions[])[] to add to the channel
59
+ function createChannelWithOverridePermissions(
60
+ bytes32 channelId,
61
+ string calldata metadata,
62
+ RolePermissions[] calldata rolePermissions
63
+ ) external;
64
+
65
+ /// @notice gets a channel
66
+ /// @param channelId the channelId to get
67
+ /// @return channel the channel
68
+ function getChannel(bytes32 channelId) external view returns (Channel memory channel);
69
+
70
+ /// @notice gets all channels
71
+ /// @return channels an array of all channels
72
+ function getChannels() external view returns (Channel[] memory channels);
73
+
74
+ /// @notice updates a channel
75
+ /// @param channelId the channelId to update
76
+ /// @param metadata the new metadata of the channel
77
+ /// @param disabled whether or not the channel is disabled
78
+ function updateChannel(bytes32 channelId, string calldata metadata, bool disabled) external;
79
+
80
+ /// @notice removes a channel
81
+ /// @param channelId the channelId to remove
82
+ function removeChannel(bytes32 channelId) external;
83
+
84
+ /// @notice gets all roles for a channel
85
+ /// @param channelId the channelId to get the roles for
86
+ /// @return roleIds an array of roleIds for the channel
87
+ function getRolesByChannel(bytes32 channelId) external view returns (uint256[] memory roleIds);
88
+
89
+ /// @notice adds a role to a channel
90
+ /// @param channelId the channelId to add the role to
91
+ /// @param roleId the roleId to add to the channel
92
+ function addRoleToChannel(bytes32 channelId, uint256 roleId) external;
93
+
94
+ /// @notice removes a role from a channel
95
+ /// @param channelId the channelId to remove the role from
96
+ /// @param roleId the roleId to remove from the channel
97
+ function removeRoleFromChannel(bytes32 channelId, uint256 roleId) external;
98
+ }
@@ -0,0 +1,86 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IDispatcherBase} from "./IDispatcher.sol";
6
+
7
+ // libraries
8
+ import {StoragePointer} from "@towns-protocol/diamond/src/libraries/StoragePointer.sol";
9
+ import {CustomRevert} from "../../../utils/libraries/CustomRevert.sol";
10
+
11
+ // contracts
12
+ import {DispatcherStorage} from "./DispatcherStorage.sol";
13
+
14
+ abstract contract DispatcherBase is IDispatcherBase {
15
+ using CustomRevert for bytes4;
16
+ using StoragePointer for mapping(bytes32 => bytes);
17
+
18
+ function _deleteCapturedData(bytes32 transactionId) internal {
19
+ DispatcherStorage.Layout storage ds = DispatcherStorage.layout();
20
+ delete ds.transactionData.get(transactionId).value;
21
+ }
22
+
23
+ function _getCapturedData(bytes32 transactionId) internal view returns (bytes storage) {
24
+ DispatcherStorage.Layout storage ds = DispatcherStorage.layout();
25
+ return ds.transactionData.get(transactionId).value;
26
+ }
27
+
28
+ function _captureValue(bytes32 transactionId) internal {
29
+ DispatcherStorage.Layout storage ds = DispatcherStorage.layout();
30
+ ds.transactionBalance[transactionId] += msg.value;
31
+ }
32
+
33
+ function _releaseCapturedValue(bytes32 transactionId, uint256 value) internal {
34
+ DispatcherStorage.Layout storage ds = DispatcherStorage.layout();
35
+ ds.transactionBalance[transactionId] -= value;
36
+ }
37
+
38
+ function _getCapturedValue(bytes32 transactionId) internal view returns (uint256) {
39
+ DispatcherStorage.Layout storage ds = DispatcherStorage.layout();
40
+ return ds.transactionBalance[transactionId];
41
+ }
42
+
43
+ function _dispatchNonce(bytes32 keyHash) internal view returns (uint256) {
44
+ DispatcherStorage.Layout storage ds = DispatcherStorage.layout();
45
+ return ds.transactionNonce[keyHash];
46
+ }
47
+
48
+ function _useDispatchNonce(bytes32 keyHash) internal returns (uint256) {
49
+ DispatcherStorage.Layout storage ds = DispatcherStorage.layout();
50
+ return ds.transactionNonce[keyHash]++;
51
+ }
52
+
53
+ function _makeDispatchInputSeed(
54
+ bytes32 keyHash,
55
+ address requester,
56
+ uint256 nonce
57
+ ) internal pure returns (uint256) {
58
+ return uint256(keccak256(abi.encode(keyHash, requester, nonce)));
59
+ }
60
+
61
+ function _makeDispatchId(bytes32 keyHash, uint256 inputSeed) internal pure returns (bytes32) {
62
+ return keccak256(abi.encodePacked(keyHash, inputSeed));
63
+ }
64
+
65
+ function _registerTransaction(
66
+ address sender,
67
+ bytes memory data
68
+ ) internal returns (bytes32 transactionId) {
69
+ bytes32 keyHash = keccak256(abi.encodePacked(sender, block.number));
70
+
71
+ transactionId = _makeDispatchId(
72
+ keyHash,
73
+ _makeDispatchInputSeed(keyHash, sender, _useDispatchNonce(keyHash))
74
+ );
75
+
76
+ DispatcherStorage.Layout storage ds = DispatcherStorage.layout();
77
+ StoragePointer.Bytes storage capturedDataRef = ds.transactionData.get(transactionId);
78
+ // revert if the transaction already exists
79
+ if (capturedDataRef.value.length > 0) {
80
+ Dispatcher__TransactionAlreadyExists.selector.revertWith();
81
+ }
82
+
83
+ capturedDataRef.value = data;
84
+ if (msg.value != 0) _captureValue(transactionId);
85
+ }
86
+ }
@@ -0,0 +1,21 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ library DispatcherStorage {
5
+ // keccak256(abi.encode(uint256(keccak256("spaces.facets.dispatcher.storage")) - 1)) &
6
+ // ~bytes32(uint256(0xff))
7
+ bytes32 internal constant STORAGE_SLOT =
8
+ 0x34516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e00;
9
+
10
+ struct Layout {
11
+ mapping(bytes32 => uint256) transactionNonce;
12
+ mapping(bytes32 => uint256) transactionBalance;
13
+ mapping(bytes32 => bytes) transactionData;
14
+ }
15
+
16
+ function layout() internal pure returns (Layout storage l) {
17
+ assembly {
18
+ l.slot := STORAGE_SLOT
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,6 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ interface IDispatcherBase {
5
+ error Dispatcher__TransactionAlreadyExists();
6
+ }
@@ -0,0 +1,49 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IEntitlementsManager} from "./IEntitlementsManager.sol";
6
+
7
+ // libraries
8
+
9
+ // contracts
10
+
11
+ import {Entitled} from "../Entitled.sol";
12
+ import {EntitlementsManagerBase} from "./EntitlementsManagerBase.sol";
13
+
14
+ contract EntitlementsManager is IEntitlementsManager, EntitlementsManagerBase, Entitled {
15
+ function addImmutableEntitlements(address[] calldata entitlements) external onlyOwner {
16
+ _addImmutableEntitlements(entitlements);
17
+ }
18
+
19
+ function addEntitlementModule(address entitlement) external onlyOwner {
20
+ _addEntitlementModule(entitlement);
21
+ }
22
+
23
+ function removeEntitlementModule(address entitlement) external onlyOwner {
24
+ _removeEntitlementModule(entitlement);
25
+ }
26
+
27
+ function getEntitlements() external view returns (Entitlement[] memory) {
28
+ return _getEntitlements();
29
+ }
30
+
31
+ function getEntitlement(address entitlement) external view returns (Entitlement memory) {
32
+ return _getEntitlement(entitlement);
33
+ }
34
+
35
+ function isEntitledToSpace(
36
+ address user,
37
+ string calldata permission
38
+ ) external view returns (bool) {
39
+ return _isEntitledToSpace(user, permission);
40
+ }
41
+
42
+ function isEntitledToChannel(
43
+ bytes32 channelId,
44
+ address user,
45
+ string calldata permission
46
+ ) external view returns (bool) {
47
+ return _isEntitledToChannel(channelId, user, bytes32(bytes(permission)));
48
+ }
49
+ }
@@ -0,0 +1,87 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IEntitlementsManagerBase} from "./IEntitlementsManager.sol";
6
+
7
+ // libraries
8
+ import {EntitlementsManagerService} from "src/spaces/facets/entitlements/EntitlementsManagerService.sol";
9
+
10
+ // contracts
11
+
12
+ contract EntitlementsManagerBase is IEntitlementsManagerBase {
13
+ function _addImmutableEntitlements(address[] calldata entitlements) internal {
14
+ for (uint256 i; i < entitlements.length; ++i) {
15
+ EntitlementsManagerService.validateEntitlement(entitlements[i]);
16
+ EntitlementsManagerService.addEntitlement(entitlements[i], true);
17
+ }
18
+ }
19
+
20
+ function _addEntitlementModule(address entitlement) internal {
21
+ // validate permission
22
+
23
+ // validate entitlement
24
+ EntitlementsManagerService.validateEntitlement(entitlement);
25
+
26
+ // set entitlement
27
+ EntitlementsManagerService.addEntitlement(entitlement, false);
28
+
29
+ // emit event
30
+ emit EntitlementModuleAdded(msg.sender, entitlement);
31
+ }
32
+
33
+ function _removeEntitlementModule(address entitlement) internal {
34
+ // validate permission
35
+
36
+ // validate entitlement
37
+ EntitlementsManagerService.validateEntitlement(entitlement);
38
+
39
+ // set entitlement
40
+ EntitlementsManagerService.removeEntitlement(entitlement);
41
+
42
+ // emit event
43
+ emit EntitlementModuleRemoved(msg.sender, entitlement);
44
+ }
45
+
46
+ function _getEntitlement(
47
+ address entitlement
48
+ ) internal view returns (Entitlement memory module) {
49
+ EntitlementsManagerService.validateEntitlement(entitlement);
50
+
51
+ (
52
+ string memory name,
53
+ address entitlementAddress,
54
+ string memory moduleType,
55
+ bool isImmutable
56
+ ) = EntitlementsManagerService.getEntitlement(entitlement);
57
+
58
+ module = Entitlement({
59
+ name: name,
60
+ moduleAddress: entitlementAddress,
61
+ moduleType: moduleType,
62
+ isImmutable: isImmutable
63
+ });
64
+ }
65
+
66
+ function _getEntitlements() internal view returns (Entitlement[] memory modules) {
67
+ address[] memory entitlements = EntitlementsManagerService.getEntitlements();
68
+
69
+ modules = new Entitlement[](entitlements.length);
70
+
71
+ for (uint256 i; i < entitlements.length; ++i) {
72
+ (
73
+ string memory name,
74
+ address entitlementAddress,
75
+ string memory moduleType,
76
+ bool isImmutable
77
+ ) = EntitlementsManagerService.getEntitlement(entitlements[i]);
78
+
79
+ modules[i] = Entitlement({
80
+ name: name,
81
+ moduleAddress: entitlementAddress,
82
+ moduleType: moduleType,
83
+ isImmutable: isImmutable
84
+ });
85
+ }
86
+ }
87
+ }