@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,274 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IVotes} from "@openzeppelin/contracts/governance/utils/IVotes.sol";
6
+
7
+ // libraries
8
+
9
+ import {Checkpoints} from "./Checkpoints.sol";
10
+ import {VotesStorage} from "./VotesStorage.sol";
11
+ import {ECDSA} from "solady/utils/ECDSA.sol";
12
+ import {SafeCastLib} from "solady/utils/SafeCastLib.sol";
13
+
14
+ // contracts
15
+ import {Nonces} from "@towns-protocol/diamond/src/utils/Nonces.sol";
16
+ import {EIP712Base} from "@towns-protocol/diamond/src/utils/cryptography/EIP712Base.sol";
17
+
18
+ /**
19
+ * @dev This is a base abstract contract that tracks voting units, which are a measure of voting
20
+ * power that can be
21
+ * transferred, and provides a system of vote delegation, where an account can delegate its voting
22
+ * units to a sort of
23
+ * "representative" that will pool delegated voting units from different accounts and can then use
24
+ * it to vote in
25
+ * decisions. In fact, voting units _must_ be delegated in order to count as actual votes, and an
26
+ * account has to
27
+ * delegate those votes to itself if it wishes to participate in decisions and does not have a
28
+ * trusted representative.
29
+ *
30
+ * This contract is often combined with a token contract such that voting units correspond to token
31
+ * units. For an
32
+ * example, see {ERC721Votes}.
33
+ *
34
+ * The full history of delegate votes is tracked on-chain so that governance protocols can consider
35
+ * votes as distributed
36
+ * at a particular block number to protect against flash loans and double voting. The opt-in
37
+ * delegate system makes the
38
+ * cost of this history tracking optional.
39
+ *
40
+ * When using this module the derived contract must implement {_getVotingUnits} (for example, make
41
+ * it return
42
+ * {ERC721-balanceOf}), and can use {_transferVotingUnits} to track a change in the distribution of
43
+ * those units (in the
44
+ * previous example, it would be included in {ERC721-_beforeTokenTransfer}).
45
+ *
46
+ */
47
+ abstract contract VotesBase is EIP712Base, Nonces {
48
+ using VotesStorage for VotesStorage.Layout;
49
+ using Checkpoints for Checkpoints.Trace224;
50
+
51
+ // =============================================================
52
+ // EIP 712
53
+ // =============================================================
54
+
55
+ bytes32 private constant _DELEGATION_TYPEHASH =
56
+ keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");
57
+
58
+ // =============================================================
59
+ // ERC 5805
60
+ // =============================================================
61
+
62
+ /**
63
+ * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based
64
+ * checkpoints (and voting), in which case {CLOCK_MODE} should be overridden as well to match.
65
+ */
66
+ function _clock() internal view returns (uint48) {
67
+ return SafeCastLib.toUint48(block.number);
68
+ }
69
+
70
+ /**
71
+ * @dev Machine-readable description of the clock as specified in EIP-6372.
72
+ */
73
+ // solhint-disable-next-line func-name-mixedcase
74
+ function _clockMode() internal view returns (string memory) {
75
+ // Check that the clock was not modified
76
+ require(_clock() == block.number, "Votes: broken clock mode");
77
+ return "mode=blocknumber&from=default";
78
+ }
79
+
80
+ // =============================================================
81
+ // Votes
82
+ // =============================================================
83
+
84
+ /**
85
+ * @dev Returns the current amount of votes that `account` has.
86
+ */
87
+ function _getVotes(address account) internal view returns (uint256) {
88
+ return VotesStorage.layout()._delegateCheckpoints[account].latest();
89
+ }
90
+
91
+ /**
92
+ * @dev Returns the amount of votes that `account` had at a specific moment in the past. If the
93
+ * `clock()` is
94
+ * configured to use block numbers, this will return the value at the end of the corresponding
95
+ * block.
96
+ *
97
+ * Requirements:
98
+ *
99
+ * - `timepoint` must be in the past. If operating using block numbers, the block must be
100
+ * already
101
+ * mined.
102
+ */
103
+ function _getPastVotes(address account, uint256 timepoint) internal view returns (uint256) {
104
+ require(timepoint < _clock(), "Votes: future lookup");
105
+ return
106
+ VotesStorage.layout()._delegateCheckpoints[account].upperLookupRecent(
107
+ SafeCastLib.toUint32(timepoint)
108
+ );
109
+ }
110
+
111
+ /**
112
+ * @dev Returns the total supply of votes available at a specific moment in the past. If the
113
+ * `clock()` is
114
+ * configured to use block numbers, this will return the value at the end of the corresponding
115
+ * block.
116
+ *
117
+ * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all
118
+ * delegated votes.
119
+ * Votes that have not been delegated are still part of total supply, even though they would not
120
+ * participate in a
121
+ * vote.
122
+ *
123
+ * Requirements:
124
+ *
125
+ * - `timepoint` must be in the past. If operating using block numbers, the block must be
126
+ * already
127
+ * mined.
128
+ */
129
+ function _getPastTotalSupply(uint256 timepoint) internal view returns (uint256) {
130
+ require(timepoint < _clock(), "Votes: future lookup");
131
+ return
132
+ VotesStorage.layout()._totalCheckpoints.upperLookupRecent(
133
+ SafeCastLib.toUint32(timepoint)
134
+ );
135
+ }
136
+
137
+ /**
138
+ * @dev Returns the delegate that `account` has chosen.
139
+ */
140
+ function _delegates(address account) internal view returns (address) {
141
+ return VotesStorage.layout()._delegation[account];
142
+ }
143
+
144
+ /**
145
+ * @dev Delegates votes from signer to `delegatee`.
146
+ */
147
+ function _delegateBySig(
148
+ address delegatee,
149
+ uint256 nonce,
150
+ uint256 expiry,
151
+ uint8 v,
152
+ bytes32 r,
153
+ bytes32 s
154
+ ) internal {
155
+ require(block.timestamp <= expiry, "Votes: signature expired");
156
+ address signer = ECDSA.recover(
157
+ _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),
158
+ v,
159
+ r,
160
+ s
161
+ );
162
+
163
+ _useCheckedNonce(signer, nonce);
164
+ _delegate(signer, delegatee);
165
+ }
166
+
167
+ /**
168
+ * @dev Must return the voting units held by an account.
169
+ */
170
+ function _getVotingUnits(address) internal view virtual returns (uint256);
171
+
172
+ // =============================================================
173
+ // Internal
174
+ // =============================================================
175
+
176
+ /**
177
+ * @dev Returns the current total supply of votes.
178
+ */
179
+ function _getTotalSupply() internal view virtual returns (uint256) {
180
+ return VotesStorage.layout()._totalCheckpoints.latest();
181
+ }
182
+
183
+ /**
184
+ * @dev Delegate all of `account`'s voting units to `delegatee`.
185
+ *
186
+ * Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}.
187
+ */
188
+ function _delegate(address account, address delegatee) internal virtual {
189
+ _beforeDelegate(account, delegatee);
190
+
191
+ address oldDelegate = _delegates(account);
192
+ VotesStorage.layout()._delegation[account] = delegatee;
193
+
194
+ emit IVotes.DelegateChanged(account, oldDelegate, delegatee);
195
+ _moveDelegateVotes(oldDelegate, delegatee, _getVotingUnits(account));
196
+
197
+ _afterDelegate(account, delegatee);
198
+ }
199
+
200
+ /**
201
+ * @dev Transfers, mints, or burns voting units. To register a mint, `from` should be zero. To
202
+ * register a burn, `to`
203
+ * should be zero. Total supply of voting units will be adjusted with mints and burns.
204
+ */
205
+ function _transferVotingUnits(address from, address to, uint256 amount) internal virtual {
206
+ if (from == address(0)) {
207
+ _push(VotesStorage.layout()._totalCheckpoints, _add, SafeCastLib.toUint224(amount));
208
+ }
209
+ if (to == address(0)) {
210
+ _push(
211
+ VotesStorage.layout()._totalCheckpoints,
212
+ _subtract,
213
+ SafeCastLib.toUint224(amount)
214
+ );
215
+ }
216
+ _moveDelegateVotes(_delegates(from), _delegates(to), amount);
217
+ }
218
+
219
+ /**
220
+ * @dev Moves delegated votes from one delegate to another.
221
+ */
222
+ function _moveDelegateVotes(address from, address to, uint256 amount) private {
223
+ if (from != to && amount > 0) {
224
+ if (from != address(0)) {
225
+ (uint256 oldValue, uint256 newValue) = _push(
226
+ VotesStorage.layout()._delegateCheckpoints[from],
227
+ _subtract,
228
+ SafeCastLib.toUint224(amount)
229
+ );
230
+ emit IVotes.DelegateVotesChanged(from, oldValue, newValue);
231
+ }
232
+ if (to != address(0)) {
233
+ (uint256 oldValue, uint256 newValue) = _push(
234
+ VotesStorage.layout()._delegateCheckpoints[to],
235
+ _add,
236
+ SafeCastLib.toUint224(amount)
237
+ );
238
+ emit IVotes.DelegateVotesChanged(to, oldValue, newValue);
239
+ }
240
+ }
241
+ }
242
+
243
+ function _push(
244
+ Checkpoints.Trace224 storage store,
245
+ function(uint224, uint224) view returns (uint224) op,
246
+ uint224 delta
247
+ ) private returns (uint224, uint224) {
248
+ return store.push(SafeCastLib.toUint32(_clock()), op(store.latest(), delta));
249
+ }
250
+
251
+ function _add(uint224 a, uint224 b) private pure returns (uint224) {
252
+ return a + b;
253
+ }
254
+
255
+ function _subtract(uint224 a, uint224 b) private pure returns (uint224) {
256
+ return a - b;
257
+ }
258
+
259
+ /**
260
+ * @dev Hook that is called before any delegate operation. This includes {delegate} and
261
+ * {delegateBySig}.
262
+ * @param signer The account that signs the delegation.
263
+ * @param delegatee The account that will be delegated to.
264
+ */
265
+ function _beforeDelegate(address signer, address delegatee) internal virtual {}
266
+
267
+ /**
268
+ * @dev Hook that is called after any delegate operation. This includes {delegate} and
269
+ * {delegateBySig}.
270
+ * @param account The account that has been delegated.
271
+ * @param delegatee The account that has been delegated to.
272
+ */
273
+ function _afterDelegate(address account, address delegatee) internal virtual {}
274
+ }
@@ -0,0 +1,21 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ import {Checkpoints} from "./Checkpoints.sol";
5
+
6
+ library VotesStorage {
7
+ bytes32 internal constant STORAGE_SLOT = keccak256("diamond.facets.governance.votes.storage");
8
+
9
+ struct Layout {
10
+ mapping(address => address) _delegation;
11
+ mapping(address => Checkpoints.Trace224) _delegateCheckpoints;
12
+ Checkpoints.Trace224 _totalCheckpoints;
13
+ }
14
+
15
+ function layout() internal pure returns (Layout storage l) {
16
+ bytes32 position = STORAGE_SLOT;
17
+ assembly {
18
+ l.slot := position
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,38 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+
6
+ // libraries
7
+
8
+ // contracts
9
+
10
+ interface IVotesEnumerable {
11
+ /// @notice Get all delegators who have delegated their voting power
12
+ /// @return Array of delegator addresses
13
+ function getDelegators() external view returns (address[] memory);
14
+
15
+ /// @notice Get the total number of delegators
16
+ /// @return Total number of delegators
17
+ function getDelegatorsCount() external view returns (uint256);
18
+
19
+ /// @notice Get a paginated list of delegators
20
+ /// @param cursor The starting index for pagination
21
+ /// @param size The number of delegators to return
22
+ /// @return delegators Array of delegator addresses for the requested page
23
+ /// @return next The cursor for the next page, returns 0 if no more pages
24
+ function getPaginatedDelegators(
25
+ uint256 cursor,
26
+ uint256 size
27
+ ) external view returns (address[] memory delegators, uint256 next);
28
+
29
+ /// @notice Get all delegators who have delegated their voting power to a specific account
30
+ /// @param account The delegatee address to get delegators for
31
+ /// @return Array of delegator addresses who delegated to the specified account
32
+ function getDelegatorsByDelegatee(address account) external view returns (address[] memory);
33
+
34
+ /// @notice Get the timestamp when a delegator last delegated their voting power
35
+ /// @param account The delegator address to get delegation time for
36
+ /// @return Timestamp of the last delegation, returns 0 if never delegated
37
+ function getDelegationTimeForDelegator(address account) external view returns (uint256);
38
+ }
@@ -0,0 +1,39 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IVotesEnumerable} from "src/diamond/facets/governance/votes/enumerable/IVotesEnumerable.sol";
6
+
7
+ // libraries
8
+ import {VotesEnumerableLib} from "src/diamond/facets/governance/votes/enumerable/VotesEnumerableLib.sol";
9
+
10
+ // contracts
11
+ abstract contract VotesEnumerable is IVotesEnumerable {
12
+ /// @inheritdoc IVotesEnumerable
13
+ function getDelegators() external view returns (address[] memory) {
14
+ return VotesEnumerableLib.getDelegators();
15
+ }
16
+
17
+ /// @inheritdoc IVotesEnumerable
18
+ function getDelegatorsCount() external view returns (uint256) {
19
+ return VotesEnumerableLib.getDelegatorsCount();
20
+ }
21
+
22
+ /// @inheritdoc IVotesEnumerable
23
+ function getPaginatedDelegators(
24
+ uint256 cursor,
25
+ uint256 size
26
+ ) external view returns (address[] memory delegators, uint256 next) {
27
+ return VotesEnumerableLib.getPaginatedDelegators(cursor, size);
28
+ }
29
+
30
+ /// @inheritdoc IVotesEnumerable
31
+ function getDelegatorsByDelegatee(address delegatee) external view returns (address[] memory) {
32
+ return VotesEnumerableLib.getDelegatorsByDelegatee(delegatee);
33
+ }
34
+
35
+ /// @inheritdoc IVotesEnumerable
36
+ function getDelegationTimeForDelegator(address delegator) external view returns (uint256) {
37
+ return VotesEnumerableLib.getDelegationTimeForDelegator(delegator);
38
+ }
39
+ }
@@ -0,0 +1,102 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // libraries
5
+ import {EnumerableSetLib} from "solady/utils/EnumerableSetLib.sol";
6
+ import {FixedPointMathLib} from "solady/utils/FixedPointMathLib.sol";
7
+
8
+ library VotesEnumerableLib {
9
+ using EnumerableSetLib for EnumerableSetLib.AddressSet;
10
+
11
+ struct Layout {
12
+ // Set of all delegators
13
+ EnumerableSetLib.AddressSet delegators;
14
+ // Mapping of delegatee to their delegators
15
+ mapping(address => EnumerableSetLib.AddressSet) delegatorsByDelegatee;
16
+ // Mapping of delegator to their delegation timestamp
17
+ mapping(address => uint256) delegationTimeForDelegator;
18
+ }
19
+
20
+ // keccak256(abi.encode(uint256(keccak256("diamond.facets.governance.votes.enumerable.storage"))
21
+ // -
22
+ // 1)) & ~bytes32(uint256(0xff))
23
+ bytes32 internal constant STORAGE_SLOT =
24
+ 0xed095a1d53cef9e2be0aab14d20856bfa3fbcc76a945321739a0da68a6078e00;
25
+
26
+ function layout() internal pure returns (Layout storage l) {
27
+ assembly {
28
+ l.slot := STORAGE_SLOT
29
+ }
30
+ }
31
+
32
+ function getDelegators() internal view returns (address[] memory) {
33
+ return layout().delegators.values();
34
+ }
35
+
36
+ function getDelegatorsByDelegatee(address account) internal view returns (address[] memory) {
37
+ return layout().delegatorsByDelegatee[account].values();
38
+ }
39
+
40
+ function getDelegationTimeForDelegator(address account) internal view returns (uint256) {
41
+ return layout().delegationTimeForDelegator[account];
42
+ }
43
+
44
+ function getDelegatorsCount() internal view returns (uint256) {
45
+ return layout().delegators.length();
46
+ }
47
+
48
+ function getPaginatedDelegators(
49
+ uint256 cursor,
50
+ uint256 size
51
+ ) internal view returns (address[] memory delegators, uint256 next) {
52
+ Layout storage ds = layout();
53
+ uint256 length = ds.delegators.length();
54
+
55
+ // Return empty array if cursor is out of bounds
56
+ if (cursor >= length) {
57
+ return (new address[](0), 0);
58
+ }
59
+
60
+ // Calculate actual page size (handle last page case)
61
+ uint256 pageSize = FixedPointMathLib.min(size, length - cursor);
62
+
63
+ // Initialize return array
64
+ delegators = new address[](pageSize);
65
+
66
+ // Populate return array
67
+ for (uint256 i = 0; i < pageSize; ++i) {
68
+ delegators[i] = ds.delegators.at(cursor + i);
69
+ }
70
+
71
+ // Set next cursor
72
+ next = (cursor + pageSize) % length;
73
+
74
+ return (delegators, next);
75
+ }
76
+
77
+ function setDelegators(
78
+ address account,
79
+ address newDelegatee,
80
+ address currentDelegatee
81
+ ) internal {
82
+ Layout storage ds = layout();
83
+
84
+ // If current delegatee is address(0), add account to delegators
85
+ if (currentDelegatee == address(0)) {
86
+ ds.delegators.add(account);
87
+ } else {
88
+ // Remove account from current delegatee's delegators
89
+ ds.delegatorsByDelegatee[currentDelegatee].remove(account);
90
+ }
91
+
92
+ if (newDelegatee == address(0)) {
93
+ // Remove account from delegators and reset delegation time
94
+ ds.delegators.remove(account);
95
+ ds.delegationTimeForDelegator[account] = 0;
96
+ } else {
97
+ // Add account to new delegatee's delegators and update timestamp
98
+ ds.delegatorsByDelegatee[newDelegatee].add(account);
99
+ ds.delegationTimeForDelegator[account] = block.timestamp;
100
+ }
101
+ }
102
+ }
@@ -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
+ interface IMetadataBase {
11
+ /// @dev Emitted when the contract URI is changed
12
+ event ContractURIChanged(string uri);
13
+ }
14
+
15
+ interface IMetadata is IMetadataBase {
16
+ /// @dev Returns the contract type
17
+ function contractType() external view returns (bytes32);
18
+
19
+ /// @dev Returns the contract version
20
+ function contractVersion() external view returns (uint32);
21
+
22
+ /// @dev Returns the metadata URI of the contract
23
+ function contractURI() external view returns (string memory);
24
+
25
+ /// @dev Sets the metadata URI of the contract
26
+ function setContractURI(string calldata uri) external;
27
+ }
@@ -0,0 +1,71 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IMetadata} from "./IMetadata.sol";
6
+
7
+ // libraries
8
+
9
+ // contracts
10
+ import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
11
+ import {OwnableBase} from "@towns-protocol/diamond/src/facets/ownable/OwnableBase.sol";
12
+
13
+ contract MetadataFacet is IMetadata, OwnableBase, Facet {
14
+ function __MetadataFacet_init(
15
+ bytes32 _contractType,
16
+ string memory _contractURI
17
+ ) external onlyInitializing {
18
+ __MetadataFacet_init_unchained(_contractType, _contractURI);
19
+ }
20
+
21
+ function __MetadataFacet_init_unchained(
22
+ bytes32 _contractType,
23
+ string memory _contractURI
24
+ ) internal {
25
+ _addInterface(type(IMetadata).interfaceId);
26
+
27
+ MetadataStorage.Layout storage ds = MetadataStorage.layout();
28
+ ds.contractType = _contractType;
29
+ ds.contractURI = _contractURI;
30
+ }
31
+
32
+ function contractType() external view returns (bytes32) {
33
+ return MetadataStorage.layout().contractType;
34
+ }
35
+
36
+ function contractVersion() external view virtual returns (uint32) {
37
+ return _getInitializedVersion();
38
+ }
39
+
40
+ function contractURI() external view returns (string memory) {
41
+ return MetadataStorage.layout().contractURI;
42
+ }
43
+
44
+ function setContractURI(string calldata uri) external onlyOwner {
45
+ MetadataStorage.layout().contractURI = uri;
46
+ emit ContractURIChanged(uri);
47
+ }
48
+ }
49
+
50
+ // =============================================================
51
+ // Storage
52
+ // =============================================================
53
+
54
+ library MetadataStorage {
55
+ struct Layout {
56
+ bytes32 contractType;
57
+ string contractURI;
58
+ }
59
+
60
+ // keccak256(abi.encode(uint256(keccak256("diamond.facets.metadata.storage")) - 1)) &
61
+ // ~bytes32(uint256(0xff))
62
+ bytes32 internal constant STORAGE_SLOT =
63
+ 0xf5e7800d151c04390bdf7c63536bd6072359c9f89940782fbad33a288db56300;
64
+
65
+ function layout() internal pure returns (Layout storage ds) {
66
+ bytes32 slot = STORAGE_SLOT;
67
+ assembly {
68
+ ds.slot := slot
69
+ }
70
+ }
71
+ }
@@ -0,0 +1,51 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IERC5643} from "./IERC5643.sol";
6
+
7
+ // libraries
8
+
9
+ // contracts
10
+
11
+ import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
12
+ import {ERC5643Base} from "src/diamond/facets/token/ERC5643/ERC5643Base.sol";
13
+ import {ERC721ABase} from "src/diamond/facets/token/ERC721A/ERC721ABase.sol";
14
+
15
+ contract ERC5643 is IERC5643, ERC5643Base, ERC721ABase, Facet {
16
+ function __ERC5643_init() external onlyInitializing {
17
+ _addInterface(type(IERC5643).interfaceId);
18
+ }
19
+
20
+ function renewSubscription(uint256 tokenId, uint64 duration) external payable virtual {
21
+ if (duration == 0) revert ERC5643__DurationZero();
22
+ if (!_isApprovedOrOwner(tokenId)) revert ERC5643__NotApprovedOrOwner();
23
+ _renewSubscription(tokenId, duration);
24
+ }
25
+
26
+ function cancelSubscription(uint256 tokenId) external payable virtual {
27
+ if (!_isApprovedOrOwner(tokenId)) revert ERC5643__NotApprovedOrOwner();
28
+ _cancelSubscription(tokenId);
29
+ }
30
+
31
+ function expiresAt(uint256 tokenId) external view returns (uint64) {
32
+ return _expiresAt(tokenId);
33
+ }
34
+
35
+ function isRenewable(uint256 tokenId) external view returns (bool) {
36
+ return _isRenewable(tokenId);
37
+ }
38
+
39
+ // =============================================================
40
+ // Internal
41
+ // =============================================================
42
+
43
+ function _isApprovedOrOwner(uint256 tokenId) internal view returns (bool) {
44
+ address owner = _ownerOf(tokenId);
45
+
46
+ return
47
+ (_msgSenderERC721A() == owner) ||
48
+ _isApprovedForAll(owner, _msgSenderERC721A()) ||
49
+ _getApproved(tokenId) == _msgSenderERC721A();
50
+ }
51
+ }
@@ -0,0 +1,48 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IERC5643Base} from "./IERC5643.sol";
6
+
7
+ // libraries
8
+ import {ERC5643Storage} from "./ERC5643Storage.sol";
9
+
10
+ // contracts
11
+
12
+ abstract contract ERC5643Base is IERC5643Base {
13
+ function _renewSubscription(uint256 tokenId, uint64 duration) internal {
14
+ ERC5643Storage.Layout storage ds = ERC5643Storage.layout();
15
+ uint64 currentExpiration = ds.expiration[tokenId];
16
+
17
+ // Check renewability for existing subscriptions
18
+ if (currentExpiration != 0 && !_isRenewable(tokenId)) {
19
+ revert ERC5643__SubscriptionNotRenewable(tokenId);
20
+ }
21
+
22
+ // Calculate new expiration
23
+ uint64 newExpiration;
24
+ if (currentExpiration > block.timestamp) {
25
+ // Active subscription: extend from current expiration
26
+ newExpiration = currentExpiration + duration;
27
+ } else {
28
+ // New or expired subscription: start from current time
29
+ newExpiration = uint64(block.timestamp) + duration;
30
+ }
31
+
32
+ ds.expiration[tokenId] = newExpiration;
33
+ emit SubscriptionUpdate(tokenId, newExpiration);
34
+ }
35
+
36
+ function _cancelSubscription(uint256 tokenId) internal {
37
+ delete ERC5643Storage.layout().expiration[tokenId];
38
+ emit SubscriptionUpdate(tokenId, 0);
39
+ }
40
+
41
+ function _expiresAt(uint256 tokenId) internal view returns (uint64) {
42
+ return ERC5643Storage.layout().expiration[tokenId];
43
+ }
44
+
45
+ function _isRenewable(uint256) internal view virtual returns (bool) {
46
+ return true;
47
+ }
48
+ }