@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,56 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+
6
+ import {IPOAP} from "./IPOAP.sol";
7
+ import {ICrossChainEntitlement} from "src/spaces/entitlements/ICrossChainEntitlement.sol";
8
+ // libraries
9
+
10
+ // contracts
11
+
12
+ contract PoapEntitlement is ICrossChainEntitlement {
13
+ IPOAP immutable poapContract;
14
+
15
+ constructor(address poapContractAddress) {
16
+ poapContract = IPOAP(poapContractAddress);
17
+ }
18
+
19
+ function isEntitled(
20
+ address[] calldata users,
21
+ bytes calldata data
22
+ ) external view returns (bool) {
23
+ uint256 eventId = abi.decode(data, (uint256));
24
+
25
+ for (uint256 i = 0; i < users.length; i++) {
26
+ if (_hasEventPoap(users[i], eventId)) {
27
+ return true;
28
+ }
29
+ }
30
+ return false;
31
+ }
32
+
33
+ function parameters() external pure returns (Parameter[] memory) {
34
+ Parameter[] memory schema = new Parameter[](1);
35
+ schema[0] = Parameter(
36
+ "eventId",
37
+ "uint256",
38
+ "The ID of the event associated with the POAP token"
39
+ );
40
+ return schema;
41
+ }
42
+
43
+ // =============================================================
44
+ // Internals
45
+ // =============================================================
46
+ function _hasEventPoap(address user, uint256 eventId) internal view returns (bool) {
47
+ uint256 balance = poapContract.balanceOf(user);
48
+ for (uint256 j = 0; j < balance; j++) {
49
+ (uint256 ownedEventId, ) = poapContract.tokenDetailsOfOwnerByIndex(user, j);
50
+ if (eventId == ownedEventId) {
51
+ return true;
52
+ }
53
+ }
54
+ return false;
55
+ }
56
+ }
@@ -0,0 +1,174 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.24;
3
+
4
+ // interfaces
5
+ import {IEntitlement} from "src/spaces/entitlements/IEntitlement.sol";
6
+
7
+ /**
8
+ * @title RuleEntitlement
9
+ * @dev This contract manages entitlement rules based on blockchain operations.
10
+ * The contract maintains a tree-like data structure to combine various types of operations.
11
+ * The tree is implemented as a dynamic array of 'Operation' structs, and is built in post-order
12
+ * fashion.
13
+ *
14
+ * Post-order Tree Structure:
15
+ * In a post-order binary tree, children nodes must be added before their respective parent nodes.
16
+ * The 'LogicalOperation' nodes refer to their child nodes via indices in the 'operations' array.
17
+ * As new LogicalOperation nodes are added, they can only reference existing nodes in the
18
+ * 'operations' array,
19
+ * ensuring a valid post-order tree structure.
20
+ */
21
+ interface IRuleEntitlementBase {
22
+ // =============================================================
23
+ // Errors
24
+ // =============================================================
25
+ error CheckOperationsLimitReaced(uint256 limit);
26
+ error OperationsLimitReached(uint256 limit);
27
+ error LogicalOperationLimitReached(uint256 limit);
28
+ error InvalidCheckOperationIndex(uint8 operationIndex, uint8 checkOperationsLength);
29
+ error InvalidLogicalOperationIndex(uint8 operationIndex, uint8 logicalOperationsLength);
30
+ error InvalidOperationType(CombinedOperationType opType);
31
+ error InvalidLeftOperationIndex(uint8 leftOperationIndex, uint8 currentOperationIndex);
32
+ error InvalidRightOperationIndex(uint8 rightOperationIndex, uint8 currentOperationIndex);
33
+
34
+ // =============================================================
35
+ // Enums
36
+ // =============================================================
37
+ enum CheckOperationType {
38
+ NONE,
39
+ MOCK,
40
+ ERC20,
41
+ ERC721,
42
+ ERC1155,
43
+ ISENTITLED,
44
+ ETH_BALANCE
45
+ }
46
+
47
+ // Enum for Operation oneof operation_clause
48
+ enum LogicalOperationType {
49
+ NONE,
50
+ AND,
51
+ OR
52
+ }
53
+
54
+ // Redefined Operation struct
55
+ enum CombinedOperationType {
56
+ NONE,
57
+ CHECK,
58
+ LOGICAL
59
+ }
60
+
61
+ // =============================================================
62
+ // Structs
63
+ // =============================================================
64
+ struct CheckOperation {
65
+ CheckOperationType opType;
66
+ uint256 chainId;
67
+ address contractAddress;
68
+ uint256 threshold;
69
+ }
70
+
71
+ struct CheckOperationV2 {
72
+ CheckOperationType opType;
73
+ uint256 chainId;
74
+ address contractAddress;
75
+ bytes params;
76
+ }
77
+
78
+ struct LogicalOperation {
79
+ LogicalOperationType logOpType;
80
+ uint8 leftOperationIndex;
81
+ uint8 rightOperationIndex;
82
+ }
83
+
84
+ struct Operation {
85
+ CombinedOperationType opType;
86
+ uint8 index; // Index in either checkOperations or logicalOperations arrays
87
+ }
88
+
89
+ struct RuleData {
90
+ Operation[] operations;
91
+ CheckOperation[] checkOperations;
92
+ LogicalOperation[] logicalOperations;
93
+ }
94
+
95
+ struct RuleDataV2 {
96
+ Operation[] operations;
97
+ CheckOperationV2[] checkOperations;
98
+ LogicalOperation[] logicalOperations;
99
+ }
100
+
101
+ struct Entitlement {
102
+ address grantedBy;
103
+ uint256 grantedTime;
104
+ RuleData data;
105
+ }
106
+
107
+ struct EntitlementV2 {
108
+ address grantedBy;
109
+ uint256 grantedTime;
110
+ bytes data;
111
+ }
112
+
113
+ // Parameters are not used in contracts but are defined here for documentation purposes.
114
+ struct MockParams {
115
+ uint256 threshold; // used for testing
116
+ }
117
+
118
+ struct ERC20Params {
119
+ uint256 threshold;
120
+ }
121
+
122
+ struct ERC721Params {
123
+ uint256 threshold;
124
+ }
125
+
126
+ struct ERC1155Params {
127
+ uint256 threshold;
128
+ uint256 tokenId;
129
+ }
130
+
131
+ struct NativeCoinBalanceParams {
132
+ uint256 threshold;
133
+ }
134
+ }
135
+
136
+ interface IRuleEntitlementV2 is IRuleEntitlementBase, IEntitlement {
137
+ // =============================================================
138
+ // Functions
139
+ // =============================================================
140
+
141
+ /**
142
+ * @notice Encodes the RuleData struct into bytes
143
+ * @param data RuleData struct to encode
144
+ * @return Encoded bytes of the RuleData struct
145
+ */
146
+ function encodeRuleData(RuleDataV2 memory data) external pure returns (bytes memory);
147
+
148
+ /**
149
+ * @notice Decodes the RuleDataV2 struct from bytes
150
+ * @param roleId Role ID
151
+ * @return data RuleDataV2 struct
152
+ */
153
+ function getRuleDataV2(uint256 roleId) external view returns (RuleDataV2 memory data);
154
+ }
155
+
156
+ interface IRuleEntitlement is IRuleEntitlementBase, IEntitlement {
157
+ // =============================================================
158
+ // Functions
159
+ // =============================================================
160
+
161
+ /**
162
+ * @notice Encodes the RuleData struct into bytes
163
+ * @param data RuleData struct to encode
164
+ * @return Encoded bytes of the RuleData struct
165
+ */
166
+ function encodeRuleData(RuleData memory data) external pure returns (bytes memory);
167
+
168
+ /**
169
+ * @notice Decodes the RuleData struct from bytes
170
+ * @param roleId Role ID
171
+ * @return data RuleData struct
172
+ */
173
+ function getRuleData(uint256 roleId) external view returns (RuleData memory data);
174
+ }
@@ -0,0 +1,183 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ /**
4
+ * @title EntitlementRule
5
+ * @dev This contract manages entitlement rules based on blockchain operations.
6
+ * The contract maintains a tree-like data structure to combine various types of operations.
7
+ * The tree is implemented as a dynamic array of 'Operation' structs, and is built in post-order
8
+ * fashion.
9
+ *
10
+ * Post-order Tree Structure:
11
+ * In a post-order binary tree, children nodes must be added before their respective parent nodes.
12
+ * The 'LogicalOperation' nodes refer to their child nodes via indices in the 'operations' array.
13
+ * As new LogicalOperation nodes are added, they can only reference existing nodes in the
14
+ * 'operations' array,
15
+ * ensuring a valid post-order tree structure.
16
+ */
17
+ pragma solidity ^0.8.0;
18
+
19
+ // contracts
20
+ import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
21
+
22
+ import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
23
+ import {ContextUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";
24
+ import {ERC165Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol";
25
+
26
+ // libraries
27
+ import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
28
+
29
+ // interfaces
30
+
31
+ import {IRuleEntitlement} from "./IRuleEntitlement.sol";
32
+ import {IEntitlement} from "src/spaces/entitlements/IEntitlement.sol";
33
+
34
+ contract RuleEntitlement is
35
+ Initializable,
36
+ ERC165Upgradeable,
37
+ ContextUpgradeable,
38
+ UUPSUpgradeable,
39
+ IRuleEntitlement
40
+ {
41
+ using EnumerableSet for EnumerableSet.Bytes32Set;
42
+
43
+ mapping(uint256 => Entitlement) internal entitlementsByRoleId;
44
+
45
+ address public SPACE_ADDRESS;
46
+
47
+ string public constant name = "Rule Entitlement";
48
+ string public constant description = "Entitlement for crosschain rules";
49
+ string public constant moduleType = "RuleEntitlement";
50
+
51
+ // Separate storage arrays for CheckOperation and LogicalOperation
52
+ //CheckOperation[] private checkOperations;
53
+ //LogicalOperation[] private logicalOperations;
54
+
55
+ // Dynamic array to store Operation instances
56
+ //Operation[] private operations;
57
+
58
+ /// @custom:oz-upgrades-unsafe-allow constructor
59
+ constructor() {
60
+ _disableInitializers();
61
+ }
62
+
63
+ function initialize(address _space) public initializer {
64
+ __UUPSUpgradeable_init();
65
+ __ERC165_init();
66
+ __Context_init();
67
+
68
+ SPACE_ADDRESS = _space;
69
+ }
70
+
71
+ modifier onlySpace() {
72
+ if (_msgSender() != SPACE_ADDRESS) {
73
+ revert Entitlement__NotAllowed();
74
+ }
75
+ _;
76
+ }
77
+
78
+ /// @notice allow the contract to be upgraded while retaining state
79
+ /// @param newImplementation address of the new implementation
80
+ function _authorizeUpgrade(address newImplementation) internal override onlySpace {}
81
+
82
+ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
83
+ return
84
+ interfaceId == type(IEntitlement).interfaceId || super.supportsInterface(interfaceId);
85
+ }
86
+
87
+ // @inheritdoc IEntitlement
88
+ function isCrosschain() external pure override returns (bool) {
89
+ // TODO possible optimization: return false if no crosschain operations
90
+ return true;
91
+ }
92
+
93
+ // @inheritdoc IEntitlement
94
+ function isEntitled(
95
+ bytes32, //channelId,
96
+ address[] memory, //user,
97
+ bytes32 //permission
98
+ ) external pure returns (bool) {
99
+ // TODO possible optimization: if there are no crosschain operations, evaluate locally
100
+ return false;
101
+ }
102
+
103
+ // @inheritdoc IEntitlement
104
+ function setEntitlement(uint256 roleId, bytes calldata entitlementData) external onlySpace {
105
+ if (entitlementData.length == 0) return;
106
+
107
+ // equivalent: abi.decode(entitlementData, (RuleData))
108
+ RuleData calldata data;
109
+ assembly {
110
+ // this is a variable length struct, so calldataload(entitlementData.offset) contains
111
+ // the
112
+ // offset from entitlementData.offset at which the struct begins
113
+ data := add(entitlementData.offset, calldataload(entitlementData.offset))
114
+ }
115
+
116
+ if (data.operations.length == 0) return;
117
+
118
+ // Cache lengths of operations arrays to reduce state access cost
119
+ uint256 operationsLength = data.operations.length;
120
+ uint256 checkOperationsLength = data.checkOperations.length;
121
+ uint256 logicalOperationsLength = data.logicalOperations.length;
122
+
123
+ // Step 1: Validate Operation against CheckOperation and LogicalOperation
124
+ for (uint256 i; i < operationsLength; ++i) {
125
+ CombinedOperationType opType = data.operations[i].opType; // cache the operation type
126
+ uint8 index = data.operations[i].index; // cache the operation index
127
+
128
+ if (opType == CombinedOperationType.CHECK) {
129
+ if (index >= checkOperationsLength) {
130
+ revert InvalidCheckOperationIndex(index, uint8(checkOperationsLength));
131
+ }
132
+ } else if (opType == CombinedOperationType.LOGICAL) {
133
+ // Use custom error in revert statement
134
+ if (index >= logicalOperationsLength) {
135
+ revert InvalidLogicalOperationIndex(index, uint8(logicalOperationsLength));
136
+ }
137
+
138
+ // Verify the logical operations make a DAG
139
+ LogicalOperation calldata logicalOp = data.logicalOperations[index];
140
+ uint8 leftOperationIndex = logicalOp.leftOperationIndex;
141
+ uint8 rightOperationIndex = logicalOp.rightOperationIndex;
142
+
143
+ // Use custom errors in revert statements
144
+ if (leftOperationIndex >= i) {
145
+ revert InvalidLeftOperationIndex(leftOperationIndex, uint8(i));
146
+ }
147
+
148
+ if (rightOperationIndex >= i) {
149
+ revert InvalidRightOperationIndex(rightOperationIndex, uint8(i));
150
+ }
151
+ }
152
+ }
153
+
154
+ Entitlement storage entitlement = entitlementsByRoleId[roleId];
155
+ entitlement.grantedBy = _msgSender();
156
+ entitlement.grantedTime = block.timestamp;
157
+ entitlement.data = data;
158
+ }
159
+
160
+ // @inheritdoc IEntitlement
161
+ function removeEntitlement(uint256 roleId) external onlySpace {
162
+ Entitlement storage entitlement = entitlementsByRoleId[roleId];
163
+ if (entitlement.grantedBy == address(0)) {
164
+ revert Entitlement__InvalidValue();
165
+ }
166
+
167
+ delete entitlementsByRoleId[roleId];
168
+ }
169
+
170
+ // @inheritdoc IEntitlement
171
+ function getEntitlementDataByRoleId(uint256 roleId) external view returns (bytes memory) {
172
+ Entitlement storage entitlement = entitlementsByRoleId[roleId];
173
+ return abi.encode(entitlement.data);
174
+ }
175
+
176
+ function encodeRuleData(RuleData calldata data) external pure returns (bytes memory) {
177
+ return abi.encode(data);
178
+ }
179
+
180
+ function getRuleData(uint256 roleId) external view returns (RuleData memory data) {
181
+ return entitlementsByRoleId[roleId].data;
182
+ }
183
+ }
@@ -0,0 +1,219 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ /**
4
+ * @title RuleEntitlementV2
5
+ * @dev This contract manages entitlement rules based on blockchain operations.
6
+ * The contract maintains a tree-like data structure to combine various types of operations.
7
+ * The tree is implemented as a dynamic array of 'Operation' structs, and is built in post-order
8
+ * fashion.
9
+ *
10
+ * Post-order Tree Structure:
11
+ * In a post-order binary tree, children nodes must be added before their respective parent nodes.
12
+ * The 'LogicalOperation' nodes refer to their child nodes via indices in the 'operations' array.
13
+ * As new LogicalOperation nodes are added, they can only reference existing nodes in the
14
+ * 'operations' array,
15
+ * ensuring a valid post-order tree structure.
16
+ */
17
+ pragma solidity ^0.8.0;
18
+
19
+ // contracts
20
+ import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
21
+
22
+ import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
23
+ import {ContextUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";
24
+ import {ERC165Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol";
25
+
26
+ // libraries
27
+
28
+ // interfaces
29
+
30
+ import {IRuleEntitlementV2} from "./IRuleEntitlement.sol";
31
+ import {IEntitlement} from "src/spaces/entitlements/IEntitlement.sol";
32
+
33
+ contract RuleEntitlementV2 is
34
+ Initializable,
35
+ ERC165Upgradeable,
36
+ ContextUpgradeable,
37
+ UUPSUpgradeable,
38
+ IRuleEntitlementV2
39
+ {
40
+ mapping(uint256 => Entitlement) internal entitlementsByRoleId;
41
+ address public SPACE_ADDRESS;
42
+
43
+ // TODO: abstract to a base contract
44
+ // keccak256(abi.encode(uint256(keccak256("spaces.entitlements.rule.storage")) - 1)) &
45
+ // ~bytes32(uint256(0xff))
46
+ bytes32 private constant STORAGE_SLOT =
47
+ 0xa7ba26993e5aed586ba0b4d511980a49b23ea33e13d5f0920b7e42ae1a27cc00;
48
+
49
+ // @custom:storage-location erc7201:spaces.entitlements.rule.storage
50
+ struct Layout {
51
+ mapping(uint256 => EntitlementV2) entitlementsByRoleIdV2;
52
+ }
53
+
54
+ string public constant name = "Rule Entitlement V2";
55
+ string public constant description = "Entitlement for crosschain rules";
56
+ string public constant moduleType = "RuleEntitlementV2";
57
+ bool public constant isCrosschain = true;
58
+
59
+ /// @custom:oz-upgrades-unsafe-allow constructor
60
+ constructor() {
61
+ _disableInitializers();
62
+ }
63
+
64
+ function initialize(address _space) public initializer {
65
+ __UUPSUpgradeable_init();
66
+ __ERC165_init();
67
+ __Context_init();
68
+ SPACE_ADDRESS = _space;
69
+ }
70
+
71
+ modifier onlySpace() {
72
+ if (_msgSender() != SPACE_ADDRESS) {
73
+ revert Entitlement__NotAllowed();
74
+ }
75
+ _;
76
+ }
77
+
78
+ // =============================================================
79
+ // Admin
80
+ // =============================================================
81
+
82
+ /// @notice allow the contract to be upgraded while retaining state
83
+ /// @param newImplementation address of the new implementation
84
+ function _authorizeUpgrade(address newImplementation) internal override onlySpace {}
85
+
86
+ /// @notice get the storage slot for the contract
87
+ /// @return ds storage slot
88
+ function layout() internal pure returns (Layout storage ds) {
89
+ assembly {
90
+ ds.slot := STORAGE_SLOT
91
+ }
92
+ }
93
+
94
+ // =============================================================
95
+ // External
96
+ // =============================================================
97
+
98
+ function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
99
+ return
100
+ interfaceId == type(IEntitlement).interfaceId ||
101
+ interfaceId == type(IRuleEntitlementV2).interfaceId ||
102
+ super.supportsInterface(interfaceId);
103
+ }
104
+
105
+ // @inheritdoc IEntitlement
106
+ function isEntitled(bytes32, address[] memory, bytes32) external pure returns (bool) {
107
+ return false;
108
+ }
109
+
110
+ // @inheritdoc IEntitlement
111
+ function setEntitlement(uint256 roleId, bytes calldata entitlementData) external onlySpace {
112
+ _removeRuleDataV1(roleId);
113
+
114
+ // We should never allow the setting of empty rule datas because it can cause the xchain
115
+ // architecture to be invoked when by default a user is not entitled.
116
+ if (entitlementData.length == 0) {
117
+ revert Entitlement__InvalidValue();
118
+ }
119
+
120
+ // equivalent: abi.decode(entitlementData, (RuleDataV2))
121
+ RuleDataV2 calldata data;
122
+ assembly {
123
+ // this is a variable length struct, so calldataload(entitlementData.offset) contains
124
+ // the
125
+ // offset from entitlementData.offset at which the struct begins
126
+ data := add(entitlementData.offset, calldataload(entitlementData.offset))
127
+ }
128
+
129
+ // We should never allow the setting of empty rule datas because it can cause the xchain
130
+ // architecture to be invoked when by default a user is not entitled.
131
+ if (data.operations.length == 0) {
132
+ revert Entitlement__InvalidValue();
133
+ }
134
+
135
+ // Cache lengths of operations arrays to reduce state access cost
136
+ uint256 operationsLength = data.operations.length;
137
+ uint256 checkOperationsLength = data.checkOperations.length;
138
+ uint256 logicalOperationsLength = data.logicalOperations.length;
139
+
140
+ // Step 1: Validate Operation against CheckOperation and LogicalOperation
141
+ for (uint256 i; i < operationsLength; ++i) {
142
+ CombinedOperationType opType = data.operations[i].opType; // cache the operation type
143
+ uint8 index = data.operations[i].index; // cache the operation index
144
+
145
+ if (opType == CombinedOperationType.CHECK) {
146
+ if (index >= checkOperationsLength) {
147
+ revert InvalidCheckOperationIndex(index, uint8(checkOperationsLength));
148
+ }
149
+ } else if (opType == CombinedOperationType.LOGICAL) {
150
+ // Use custom error in revert statement
151
+ if (index >= logicalOperationsLength) {
152
+ revert InvalidLogicalOperationIndex(index, uint8(logicalOperationsLength));
153
+ }
154
+
155
+ // Verify the logical operations make a DAG
156
+ LogicalOperation calldata logicalOp = data.logicalOperations[index];
157
+ uint8 leftOperationIndex = logicalOp.leftOperationIndex;
158
+ uint8 rightOperationIndex = logicalOp.rightOperationIndex;
159
+
160
+ // Use custom errors in revert statements
161
+ if (leftOperationIndex >= i) {
162
+ revert InvalidLeftOperationIndex(leftOperationIndex, uint8(i));
163
+ }
164
+
165
+ if (rightOperationIndex >= i) {
166
+ revert InvalidRightOperationIndex(rightOperationIndex, uint8(i));
167
+ }
168
+ }
169
+ }
170
+
171
+ EntitlementV2 storage entitlement = layout().entitlementsByRoleIdV2[roleId];
172
+ entitlement.grantedBy = _msgSender();
173
+ entitlement.grantedTime = block.timestamp;
174
+ entitlement.data = entitlementData;
175
+ }
176
+
177
+ // @inheritdoc IEntitlement
178
+ function removeEntitlement(uint256 roleId) external onlySpace {
179
+ Layout storage ds = layout();
180
+ EntitlementV2 storage entitlement = ds.entitlementsByRoleIdV2[roleId];
181
+
182
+ if (entitlement.grantedBy == address(0)) {
183
+ revert Entitlement__InvalidValue();
184
+ }
185
+
186
+ delete ds.entitlementsByRoleIdV2[roleId];
187
+ }
188
+
189
+ // @inheritdoc IEntitlement
190
+ function getEntitlementDataByRoleId(uint256 roleId) external view returns (bytes memory) {
191
+ EntitlementV2 storage entitlement = layout().entitlementsByRoleIdV2[roleId];
192
+ return entitlement.data;
193
+ }
194
+
195
+ function encodeRuleData(RuleDataV2 calldata data) external pure returns (bytes memory) {
196
+ return abi.encode(data);
197
+ }
198
+
199
+ function getRuleData(uint256 roleId) external view returns (RuleData memory data) {
200
+ return entitlementsByRoleId[roleId].data;
201
+ }
202
+
203
+ function getRuleDataV2(uint256 roleId) external view returns (RuleDataV2 memory data) {
204
+ bytes storage ruleData = layout().entitlementsByRoleIdV2[roleId].data;
205
+
206
+ if (ruleData.length == 0) return data;
207
+
208
+ return abi.decode(ruleData, (RuleDataV2));
209
+ }
210
+
211
+ // =============================================================
212
+ // Internal
213
+ // =============================================================
214
+ function _removeRuleDataV1(uint256 roleId) internal {
215
+ if (entitlementsByRoleId[roleId].grantedBy != address(0)) {
216
+ delete entitlementsByRoleId[roleId];
217
+ }
218
+ }
219
+ }
@@ -0,0 +1,24 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.24;
3
+
4
+ import {IEntitlement} from "src/spaces/entitlements/IEntitlement.sol";
5
+
6
+ interface IUserEntitlement is IEntitlement {
7
+ // Constructor is not included in interfaces
8
+
9
+ // Initialize function, if it's intended to be called externally
10
+ function initialize(address _space) external;
11
+
12
+ // Any other external or public functions
13
+ function isEntitled(
14
+ bytes32 channelId,
15
+ address[] memory wallets,
16
+ bytes32 permission
17
+ ) external view returns (bool);
18
+
19
+ function setEntitlement(uint256 roleId, bytes calldata entitlementData) external;
20
+
21
+ function removeEntitlement(uint256 roleId) external;
22
+
23
+ function getEntitlementDataByRoleId(uint256 roleId) external view returns (bytes memory);
24
+ }