@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,159 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {ISchemaResolver} from "@ethereum-attestation-service/eas-contracts/resolver/ISchemaResolver.sol";
6
+ import {IAppAccount} from "../../../spaces/facets/account/IAppAccount.sol";
7
+ import {ITownsApp} from "../../ITownsApp.sol";
8
+
9
+ // libraries
10
+ import {Attestation} from "@ethereum-attestation-service/eas-contracts/Common.sol";
11
+ import {ExecutionManifest} from "@erc6900/reference-implementation/interfaces/IERC6900ExecutionModule.sol";
12
+
13
+ interface IAppRegistryBase {
14
+ struct AppParams {
15
+ string name;
16
+ bytes32[] permissions;
17
+ address client;
18
+ uint256 installPrice;
19
+ uint48 accessDuration;
20
+ }
21
+
22
+ struct App {
23
+ bytes32 appId;
24
+ address module;
25
+ address owner;
26
+ address client;
27
+ bytes32[] permissions;
28
+ ExecutionManifest manifest;
29
+ uint48 duration;
30
+ }
31
+
32
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
33
+ /* ERRORS */
34
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
35
+ error AppAlreadyRegistered();
36
+ error AppNotRegistered();
37
+ error AppRevoked();
38
+ error AppNotInstalled();
39
+ error NotAppOwner();
40
+ error AppDoesNotImplementInterface();
41
+ error InvalidAppName();
42
+ error InvalidAddressInput();
43
+ error InvalidArrayInput();
44
+ error BannedApp();
45
+ error InvalidAppId();
46
+ error InvalidPrice();
47
+ error InvalidDuration();
48
+ error InsufficientPayment();
49
+ error NotAllowed();
50
+ error ClientAlreadyRegistered();
51
+
52
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
53
+ /* EVENTS */
54
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
55
+ event AppRegistered(address indexed app, bytes32 uid);
56
+ event AppUnregistered(address indexed app, bytes32 uid);
57
+ event AppUpdated(address indexed app, bytes32 uid);
58
+ event AppBanned(address indexed app, bytes32 uid);
59
+ event AppSchemaSet(bytes32 uid);
60
+ event AppCreated(address indexed app, bytes32 uid);
61
+ event AppInstalled(address indexed app, address indexed account, bytes32 indexed appId);
62
+ event AppUninstalled(address indexed app, address indexed account, bytes32 indexed appId);
63
+ event AppRenewed(address indexed app, address indexed account, bytes32 indexed appId);
64
+ }
65
+
66
+ /// @title IAppRegistry Interface
67
+ /// @notice Interface for managing app registrations and permissions
68
+ interface IAppRegistry is IAppRegistryBase {
69
+ /// @notice Get the schema structure used for registering apps
70
+ /// @return The schema structure
71
+ function getAppSchema() external view returns (string memory);
72
+
73
+ /// @notice Get the active schema ID used for app attestations
74
+ /// @return The schema ID
75
+ function getAppSchemaId() external view returns (bytes32);
76
+
77
+ /// @notice Get the attestation for a app
78
+ /// @param appId The app ID
79
+ /// @return The attestation
80
+ function getAppById(bytes32 appId) external view returns (App memory);
81
+
82
+ /// @notice Get the apps price
83
+ /// @param app The app address
84
+ /// @return The price
85
+ function getAppPrice(address app) external view returns (uint256);
86
+
87
+ /// @notice Get the duration of an app
88
+ /// @param app The app address
89
+ /// @return duration The duration of the app
90
+ function getAppDuration(address app) external view returns (uint48);
91
+
92
+ /// @notice Get the current version (attestation UID) for a app
93
+ /// @param app The app address
94
+ /// @return The attestation UID representing the current version
95
+ function getLatestAppId(address app) external view returns (bytes32);
96
+
97
+ /// @notice Get the app address associated with a client
98
+ /// @param client The client address
99
+ /// @return The app address
100
+ function getAppByClient(address client) external view returns (address);
101
+
102
+ /// @notice Check if a app is banned
103
+ /// @param app The app address
104
+ /// @return isBanned True if the app is banned, false otherwise
105
+ function isAppBanned(address app) external view returns (bool);
106
+
107
+ /// @notice Create a new app
108
+ /// @param params The parameters of the app
109
+ /// @return app The app address
110
+ /// @return appId The attestation UID of the registered app
111
+ function createApp(
112
+ AppParams calldata params
113
+ ) external payable returns (address app, bytes32 appId);
114
+
115
+ /// @notice Register a new app with permissions
116
+ /// @param app The app address to register
117
+ /// @param client The client contract address that will use this app
118
+ /// @return appId The attestation UID of the registered app
119
+ function registerApp(ITownsApp app, address client) external payable returns (bytes32 appId);
120
+
121
+ /// @notice Remove a app from the registry
122
+ /// @param appId The app ID to remove
123
+ function removeApp(bytes32 appId) external;
124
+
125
+ /// @notice Renew an app
126
+ /// @param app The app address to renew
127
+ /// @param account The account to renew the app for
128
+ /// @param data The data to pass to the app's onRenewApp function
129
+ function renewApp(ITownsApp app, IAppAccount account, bytes calldata data) external payable;
130
+
131
+ /// @notice Install an app
132
+ /// @param app The app address to install
133
+ /// @param account The account to install the app to
134
+ /// @param data The data to pass to the app's onInstall function
135
+ function installApp(ITownsApp app, IAppAccount account, bytes calldata data) external payable;
136
+
137
+ /// @notice Uninstall an app
138
+ /// @param app The app address to uninstall
139
+ /// @param account The account to uninstall the app from
140
+ /// @param data The data to pass to the app's onUninstall function
141
+ function uninstallApp(ITownsApp app, IAppAccount account, bytes calldata data) external;
142
+
143
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
144
+ /* Admin */
145
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
146
+ /// @notice Set the schema ID used for app registrations
147
+ /// @param schema The new schema
148
+ /// @return The schema ID
149
+ function adminRegisterAppSchema(
150
+ string calldata schema,
151
+ ISchemaResolver resolver,
152
+ bool revocable
153
+ ) external returns (bytes32);
154
+
155
+ /// @notice Ban a app from the registry
156
+ /// @param app The app address to ban
157
+ /// @return The attestation UID that was banned
158
+ function adminBanApp(address app) external returns (bytes32);
159
+ }
@@ -0,0 +1,14 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+
6
+ // libraries
7
+
8
+ // contracts
9
+
10
+ interface ISchemaBase {
11
+ error InvalidSchemaResolver();
12
+ error SchemaAlreadyRegistered();
13
+ error InvalidSchema();
14
+ }
@@ -0,0 +1,88 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {ISchemaRegistry} from "@ethereum-attestation-service/eas-contracts/ISchemaRegistry.sol";
6
+ import {ISchemaResolver} from "@ethereum-attestation-service/eas-contracts/resolver/ISchemaResolver.sol";
7
+ import {IERC165} from "@openzeppelin/contracts/interfaces/IERC165.sol";
8
+ import {ISchemaBase} from "./ISchema.sol";
9
+
10
+ // types
11
+ import {EMPTY_UID} from "@ethereum-attestation-service/eas-contracts/Common.sol";
12
+ import {SchemaRecord} from "@ethereum-attestation-service/eas-contracts/ISchemaRegistry.sol";
13
+
14
+ // libraries
15
+ import {SchemaLib} from "./SchemaLib.sol";
16
+ import {CustomRevert} from "src/utils/libraries/CustomRevert.sol";
17
+ import {SchemaStorage} from "./SchemaStorage.sol";
18
+ // contracts
19
+
20
+ abstract contract SchemaBase is ISchemaBase {
21
+ using CustomRevert for bytes4;
22
+ using SchemaLib for SchemaRecord;
23
+
24
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
25
+ /* Schema Management */
26
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
27
+
28
+ /// @notice Registers a new schema in the registry
29
+ /// @param schema The schema string to register
30
+ /// @param resolver The resolver contract for this schema
31
+ /// @param revocable Whether attestations using this schema can be revoked
32
+ /// @return schemaUID The unique identifier of the registered schema
33
+ /// @dev Reverts if schema is empty, resolver is invalid, or schema is already registered
34
+ function _registerSchema(
35
+ string calldata schema,
36
+ ISchemaResolver resolver,
37
+ bool revocable
38
+ ) internal returns (bytes32 schemaUID) {
39
+ // check empty schema
40
+ if (bytes(schema).length == 0) {
41
+ InvalidSchema.selector.revertWith();
42
+ }
43
+
44
+ checkResolver(resolver);
45
+
46
+ SchemaRecord memory schemaRecord = SchemaRecord({
47
+ uid: EMPTY_UID,
48
+ resolver: resolver,
49
+ revocable: revocable,
50
+ schema: schema
51
+ });
52
+
53
+ SchemaStorage.Layout storage db = SchemaStorage.getLayout();
54
+
55
+ schemaUID = schemaRecord.getUID();
56
+ if (db.schemas[schemaUID].uid != EMPTY_UID) {
57
+ SchemaAlreadyRegistered.selector.revertWith();
58
+ }
59
+
60
+ schemaRecord.uid = schemaUID;
61
+ db.schemas[schemaUID] = schemaRecord;
62
+
63
+ emit ISchemaRegistry.Registered(schemaUID, msg.sender, schemaRecord);
64
+ }
65
+
66
+ /// @notice Retrieves a schema record by its UID
67
+ /// @param uid The unique identifier of the schema
68
+ /// @return The schema record
69
+ function _getSchema(bytes32 uid) internal view returns (SchemaRecord memory) {
70
+ return SchemaStorage.getSchema(uid);
71
+ }
72
+
73
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
74
+ /* Validator Checks */
75
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
76
+
77
+ /// @notice Validates that a resolver implements the required interface
78
+ /// @param resolver The resolver contract to check
79
+ /// @dev Reverts if the resolver doesn't implement ISchemaResolver interface
80
+ function checkResolver(ISchemaResolver resolver) internal view {
81
+ if (
82
+ address(resolver) != address(0) &&
83
+ !IERC165(address(resolver)).supportsInterface(type(ISchemaResolver).interfaceId)
84
+ ) {
85
+ InvalidSchemaResolver.selector.revertWith();
86
+ }
87
+ }
88
+ }
@@ -0,0 +1,14 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // struct
5
+ import {SchemaRecord} from "@ethereum-attestation-service/eas-contracts/ISchemaRegistry.sol";
6
+
7
+ library SchemaLib {
8
+ /// @notice Generates a unique identifier for a schema record
9
+ /// @param self The schema record to generate the UID for
10
+ /// @return The unique identifier for the schema
11
+ function getUID(SchemaRecord memory self) internal pure returns (bytes32) {
12
+ return keccak256(abi.encodePacked(self.schema, self.resolver, self.revocable));
13
+ }
14
+ }
@@ -0,0 +1,51 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {ISchemaRegistry} from "@ethereum-attestation-service/eas-contracts/ISchemaRegistry.sol";
6
+ import {ISchemaResolver} from "@ethereum-attestation-service/eas-contracts/resolver/ISchemaResolver.sol";
7
+
8
+ // libraries
9
+
10
+ // types
11
+ import {SchemaRecord} from "@ethereum-attestation-service/eas-contracts/ISchemaRegistry.sol";
12
+
13
+ // contracts
14
+ import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
15
+ import {OwnableBase} from "@towns-protocol/diamond/src/facets/ownable/OwnableBase.sol";
16
+ import {SchemaBase} from "./SchemaBase.sol";
17
+
18
+ /// @title Schema Registry
19
+ /// @notice A registry for schema records
20
+ /// @dev This contract is used for implementation reference purposes
21
+ contract SchemaRegistry is ISchemaRegistry, SchemaBase, OwnableBase, Facet {
22
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
23
+ /* Schema Management */
24
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
25
+
26
+ /// @notice Returns the full semver contract version.
27
+ /// @return Semver contract version as a string.
28
+ function version() external pure returns (string memory) {
29
+ return "1.0.0";
30
+ }
31
+
32
+ /// @notice Register a schema
33
+ /// @param schema The schema to register e.g. "(address plugin,string pluginType,bool audited)"
34
+ /// @param resolver A contract that will validate the schema whenever someone attests to it
35
+ /// @param revocable Whether the schema is revocable
36
+ /// @return schemaId The UID of the schema
37
+ function register(
38
+ string calldata schema,
39
+ ISchemaResolver resolver,
40
+ bool revocable
41
+ ) external onlyOwner returns (bytes32) {
42
+ return _registerSchema(schema, resolver, revocable);
43
+ }
44
+
45
+ /// @notice Get the schema record for a given schemaId
46
+ /// @param uid The schemaId of the schema
47
+ /// @return The schema record
48
+ function getSchema(bytes32 uid) external view returns (SchemaRecord memory) {
49
+ return _getSchema(uid);
50
+ }
51
+ }
@@ -0,0 +1,34 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+
6
+ // libraries
7
+
8
+ // contracts
9
+
10
+ // structs
11
+ import {SchemaRecord} from "@ethereum-attestation-service/eas-contracts/ISchemaRegistry.sol";
12
+
13
+ library SchemaStorage {
14
+ // keccak256(abi.encode(uint256(keccak256("attestations.module.schema.storage")) - 1)) &
15
+ // ~bytes32(uint256(0xff))
16
+ bytes32 internal constant STORAGE_SLOT =
17
+ 0xfd5bc2b1c92b0a5f91f2b26739da3957fadd042854b0b9b4b07f2b0885d3e400;
18
+
19
+ struct Layout {
20
+ mapping(bytes32 uid => SchemaRecord schema) schemas;
21
+ }
22
+
23
+ /// @notice Returns the storage layout for the schema module
24
+ /// @return ds The storage layout struct
25
+ function getLayout() internal pure returns (Layout storage ds) {
26
+ assembly {
27
+ ds.slot := STORAGE_SLOT
28
+ }
29
+ }
30
+
31
+ function getSchema(bytes32 uid) internal view returns (SchemaRecord memory) {
32
+ return getLayout().schemas[uid];
33
+ }
34
+ }
@@ -0,0 +1,51 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+
6
+ // libraries
7
+
8
+ // contracts
9
+
10
+ interface ISimpleAppBase {
11
+ /// @notice Thrown when the recipient address is the zero address
12
+ error ZeroAddress();
13
+
14
+ /// @notice Thrown when there is no balance to withdraw
15
+ error NoBalanceToWithdraw();
16
+
17
+ /// @notice Emitted when the app is withdrawn
18
+ /// @param recipient The address that received the withdrawal
19
+ /// @param amount The amount of tokens withdrawn
20
+ event Withdrawal(address indexed recipient, uint256 amount);
21
+
22
+ /// @notice Emitted when pricing is updated
23
+ /// @param installPrice The new install price
24
+ /// @param accessDuration The new access duration
25
+ event PricingUpdated(uint256 installPrice, uint48 accessDuration);
26
+ }
27
+
28
+ interface ISimpleApp is ISimpleAppBase {
29
+ /// @notice Withdraws the ETH balance of the app to the recipient
30
+ /// @param recipient The address to withdraw the ETH to
31
+ function withdrawETH(address recipient) external;
32
+
33
+ /// @notice Updates the pricing of the app
34
+ /// @param installPrice The new install price
35
+ /// @param accessDuration The new access duration
36
+ function updatePricing(uint256 installPrice, uint48 accessDuration) external;
37
+
38
+ /// @notice Initializes the app
39
+ /// @param owner The owner of the app
40
+ /// @param appId The ID of the app
41
+ /// @param permissions The permissions of the app
42
+ /// @param installPrice The install price of the app
43
+ /// @param accessDuration The access duration of the app
44
+ function initialize(
45
+ address owner,
46
+ string calldata appId,
47
+ bytes32[] calldata permissions,
48
+ uint256 installPrice,
49
+ uint48 accessDuration
50
+ ) external;
51
+ }
@@ -0,0 +1,97 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {ISimpleApp} from "../../apps/helpers/ISimpleApp.sol";
6
+ import {ITownsApp} from "../../apps/ITownsApp.sol";
7
+ import {IERC6900Module} from "@erc6900/reference-implementation/interfaces/IERC6900Module.sol";
8
+ import {IERC6900ExecutionModule} from "@erc6900/reference-implementation/interfaces/IERC6900ExecutionModule.sol";
9
+
10
+ // contracts
11
+ import {BaseApp} from "../../apps/BaseApp.sol";
12
+ import {Ownable} from "solady/auth/Ownable.sol";
13
+ import {ExecutionManifest} from "@erc6900/reference-implementation/interfaces/IERC6900ExecutionModule.sol";
14
+ import {Initializable} from "solady/utils/Initializable.sol";
15
+
16
+ // libraries
17
+ import {SimpleAppStorage} from "../../apps/helpers/SimpleAppStorage.sol";
18
+ import {CustomRevert} from "../../utils/libraries/CustomRevert.sol";
19
+ import {CurrencyTransfer} from "../../utils/libraries/CurrencyTransfer.sol";
20
+
21
+ contract SimpleApp is ISimpleApp, Ownable, BaseApp, Initializable {
22
+ using CustomRevert for bytes4;
23
+ using SimpleAppStorage for SimpleAppStorage.Layout;
24
+
25
+ /// @inheritdoc ISimpleApp
26
+ function initialize(
27
+ address owner,
28
+ string calldata appId,
29
+ bytes32[] calldata permissions,
30
+ uint256 installPrice,
31
+ uint48 accessDuration
32
+ ) external initializer {
33
+ _setOwner(owner);
34
+ SimpleAppStorage.Layout storage $ = SimpleAppStorage.getLayout();
35
+ $.name = appId;
36
+ $.permissions = permissions;
37
+ $.installPrice = installPrice;
38
+ $.accessDuration = accessDuration;
39
+ }
40
+
41
+ /// @inheritdoc ISimpleApp
42
+ function withdrawETH(address recipient) external onlyOwner {
43
+ if (recipient == address(0)) ZeroAddress.selector.revertWith();
44
+
45
+ uint256 balance = address(this).balance;
46
+ if (balance == 0) NoBalanceToWithdraw.selector.revertWith();
47
+
48
+ CurrencyTransfer.safeTransferNativeToken(recipient, balance);
49
+
50
+ emit Withdrawal(recipient, balance);
51
+ }
52
+
53
+ /// @inheritdoc ISimpleApp
54
+ function updatePricing(uint256 installPrice, uint48 accessDuration) external onlyOwner {
55
+ SimpleAppStorage.Layout storage $ = SimpleAppStorage.getLayout();
56
+
57
+ $.installPrice = installPrice;
58
+ $.accessDuration = accessDuration;
59
+
60
+ emit PricingUpdated(installPrice, accessDuration);
61
+ }
62
+
63
+ /// @inheritdoc ITownsApp
64
+ function requiredPermissions() external view returns (bytes32[] memory) {
65
+ SimpleAppStorage.Layout storage $ = SimpleAppStorage.getLayout();
66
+ return $.permissions;
67
+ }
68
+
69
+ /// @inheritdoc IERC6900Module
70
+ function moduleId() public view returns (string memory) {
71
+ SimpleAppStorage.Layout storage $ = SimpleAppStorage.getLayout();
72
+ return $.name;
73
+ }
74
+
75
+ /// @inheritdoc IERC6900ExecutionModule
76
+ function executionManifest() external pure returns (ExecutionManifest memory) {
77
+ // solhint-disable no-empty-blocks
78
+ }
79
+
80
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
81
+ /* OVERRIDES */
82
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
83
+
84
+ function _installPrice() internal view override returns (uint256) {
85
+ SimpleAppStorage.Layout storage $ = SimpleAppStorage.getLayout();
86
+ return $.installPrice;
87
+ }
88
+
89
+ function _accessDuration() internal view override returns (uint48) {
90
+ SimpleAppStorage.Layout storage $ = SimpleAppStorage.getLayout();
91
+ return $.accessDuration;
92
+ }
93
+
94
+ function _moduleOwner() internal view override returns (address) {
95
+ return owner();
96
+ }
97
+ }
@@ -0,0 +1,27 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+
6
+ // libraries
7
+
8
+ // contracts
9
+
10
+ library SimpleAppStorage {
11
+ // keccak256(abi.encode(uint256(keccak256("simple.app.storage")) - 1)) & ~bytes32(uint256(0xff))
12
+ bytes32 internal constant STORAGE_SLOT =
13
+ 0x83d7ef17df984d8e84ee79017942cb0329f48e2d537ef8c418bc299c6878be00;
14
+
15
+ struct Layout {
16
+ string name;
17
+ bytes32[] permissions;
18
+ uint256 installPrice;
19
+ uint48 accessDuration;
20
+ }
21
+
22
+ function getLayout() internal pure returns (Layout storage l) {
23
+ assembly {
24
+ l.slot := STORAGE_SLOT
25
+ }
26
+ }
27
+ }