@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,564 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // Standard and external types
5
+ import {Time} from "@openzeppelin/contracts/utils/types/Time.sol";
6
+
7
+ // Interfaces
8
+ import {IExecutorBase, Group, Schedule, Target} from "./IExecutor.sol";
9
+
10
+ // Internal libraries
11
+ import {ExecutorStorage} from "./ExecutorStorage.sol";
12
+ import {GroupLib} from "./GroupLib.sol";
13
+ import {CustomRevert} from "../../../utils/libraries/CustomRevert.sol";
14
+
15
+ // External libraries
16
+ import {EnumerableSetLib} from "solady/utils/EnumerableSetLib.sol";
17
+ import {LibCall} from "solady/utils/LibCall.sol";
18
+ import {FixedPointMathLib} from "solady/utils/FixedPointMathLib.sol";
19
+
20
+ abstract contract ExecutorBase is IExecutorBase {
21
+ using CustomRevert for bytes4;
22
+ using EnumerableSetLib for EnumerableSetLib.Uint256Set;
23
+ using Time for Time.Delay;
24
+ using Time for uint32;
25
+ using GroupLib for Group;
26
+
27
+ uint32 private constant DEFAULT_EXPIRATION = 1 weeks;
28
+ uint32 private constant DEFAULT_MIN_SETBACK = 5 days;
29
+
30
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
31
+ /* GROUP MANAGEMENT */
32
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
33
+
34
+ /// @notice Gets the group configuration for a group ID.
35
+ /// @param groupId The ID of the group.
36
+ /// @return The group configuration.
37
+ function _getGroup(bytes32 groupId) internal view returns (Group storage) {
38
+ return ExecutorStorage.getLayout().groups[groupId];
39
+ }
40
+
41
+ /// @notice Creates a new group and marks it as active.
42
+ /// @param groupId The ID of the group to create.
43
+ /// @param status The status to set (active/inactive).
44
+ /// @param expiration Optional timestamp when the group should expire (0 for no expiration).
45
+ function _setGroupStatus(bytes32 groupId, bool status, uint48 expiration) internal {
46
+ Group storage group = _getGroup(groupId);
47
+ group.setStatus(status);
48
+ if (status && expiration > 0) {
49
+ if (expiration <= block.timestamp) revert InvalidExpiration();
50
+ group.expiration = expiration;
51
+ }
52
+ emit GroupStatusSet(groupId, status);
53
+ }
54
+
55
+ function _getGroupExpiration(bytes32 groupId) internal view returns (uint48) {
56
+ return _getGroup(groupId).expiration;
57
+ }
58
+
59
+ /// @notice Creates a new group and marks it as active without expiration.
60
+ /// @param groupId The ID of the group to create.
61
+ /// @param status The status to set (active/inactive).
62
+ function _setGroupStatus(bytes32 groupId, bool status) internal {
63
+ _setGroupStatus(groupId, status, 0);
64
+ }
65
+
66
+ /// @notice Sets or extends the expiration for a group.
67
+ /// @param groupId The ID of the group.
68
+ /// @param expiration The new expiration timestamp.
69
+ function _setGroupExpiration(bytes32 groupId, uint48 expiration) internal {
70
+ if (expiration <= block.timestamp) revert InvalidExpiration();
71
+ Group storage group = _getGroup(groupId);
72
+ group.expiration = expiration;
73
+ emit GroupExpirationSet(groupId, expiration);
74
+ }
75
+
76
+ /// @notice Grants access to a group for an account.
77
+ /// @param groupId The ID of the group.
78
+ /// @param account The account to grant access to.
79
+ /// @param grantDelay The delay before access becomes effective.
80
+ /// @param executionDelay The delay for execution after access is granted.
81
+ /// @return newMember True if the account is a new member, false otherwise.
82
+ function _grantGroupAccess(
83
+ bytes32 groupId,
84
+ address account,
85
+ uint32 grantDelay,
86
+ uint32 executionDelay
87
+ ) internal returns (bool) {
88
+ Group storage group = _getGroup(groupId);
89
+ (bool newMember, uint48 lastAccess) = group.grantAccess(
90
+ account,
91
+ grantDelay,
92
+ executionDelay
93
+ );
94
+
95
+ emit GroupAccessGranted(groupId, account, executionDelay, lastAccess, newMember);
96
+ return newMember;
97
+ }
98
+
99
+ /// @notice Revokes group access from an account.
100
+ /// @param groupId The ID of the group.
101
+ /// @param account The account to revoke access from.
102
+ /// @return revoked True if access was revoked, false otherwise.
103
+ function _revokeGroupAccess(bytes32 groupId, address account) internal returns (bool revoked) {
104
+ revoked = _getGroup(groupId).revokeAccess(account);
105
+
106
+ emit GroupAccessRevoked(groupId, account, revoked);
107
+ }
108
+
109
+ /// @notice Allows an account to renounce its own group access.
110
+ /// @param groupId The ID of the group.
111
+ /// @param account The account renouncing access.
112
+ function _renounceGroupAccess(bytes32 groupId, address account) internal {
113
+ if (account != msg.sender) {
114
+ UnauthorizedRenounce.selector.revertWith();
115
+ }
116
+
117
+ _revokeGroupAccess(groupId, account);
118
+ }
119
+
120
+ /// @notice Sets the guardian for a group.
121
+ /// @param groupId The ID of the group.
122
+ /// @param guardian The guardian role ID.
123
+ function _setGroupGuardian(bytes32 groupId, bytes32 guardian) internal {
124
+ _getGroup(groupId).setGuardian(guardian);
125
+ emit GroupGuardianSet(groupId, guardian);
126
+ }
127
+
128
+ /// @notice Sets the grant delay for a group.
129
+ /// @param groupId The ID of the group.
130
+ /// @param grantDelay The new grant delay.
131
+ /// @param minSetback The minimum setback for the delay.
132
+ function _setGroupGrantDelay(bytes32 groupId, uint32 grantDelay, uint32 minSetback) internal {
133
+ if (minSetback == 0) {
134
+ minSetback = DEFAULT_MIN_SETBACK;
135
+ }
136
+
137
+ _getGroup(groupId).setGrantDelay(grantDelay, minSetback);
138
+ emit GroupGrantDelaySet(groupId, grantDelay);
139
+ }
140
+
141
+ /// @notice Gets the guardian for a group.
142
+ /// @param groupId The ID of the group.
143
+ /// @return The guardian role ID.
144
+ function _getGroupGuardian(bytes32 groupId) internal view returns (bytes32) {
145
+ return _getGroup(groupId).getGuardian();
146
+ }
147
+
148
+ /// @notice Gets the grant delay for a group.
149
+ /// @param groupId The ID of the group.
150
+ /// @return The grant delay in seconds.
151
+ function _getGroupGrantDelay(bytes32 groupId) internal view returns (uint32) {
152
+ return _getGroup(groupId).getGrantDelay();
153
+ }
154
+
155
+ /// @notice Checks if a group is active and not expired.
156
+ /// @param groupId The ID of the group.
157
+ /// @return True if the group is active and not expired.
158
+ function _isGroupActive(bytes32 groupId) internal view returns (bool) {
159
+ Group storage group = _getGroup(groupId);
160
+ if (!group.active) return false;
161
+ if (group.expiration == 0) return true;
162
+ return group.expiration > block.timestamp;
163
+ }
164
+
165
+ /// @notice Checks if an account has access to a group.
166
+ /// @param groupId The ID of the group.
167
+ /// @param account The account to check.
168
+ /// @return isMember True if the account is a member.
169
+ /// @return executionDelay The execution delay for the account.
170
+ /// @return active True if the group is active and not expired.
171
+ function _hasGroupAccess(
172
+ bytes32 groupId,
173
+ address account
174
+ ) internal view returns (bool isMember, uint32 executionDelay, bool active) {
175
+ return ExecutorStorage.hasGroupAccess(groupId, account);
176
+ }
177
+
178
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
179
+ /* ACCESS */
180
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
181
+
182
+ /// @notice Gets access details for an account in a group.
183
+ /// @param groupId The ID of the group.
184
+ /// @param account The account to check.
185
+ /// @return since The timestamp since the account has access.
186
+ /// @return currentDelay The current execution delay.
187
+ /// @return pendingDelay The pending delay.
188
+ /// @return effect The effect timestamp.
189
+ function _getAccess(
190
+ bytes32 groupId,
191
+ address account
192
+ )
193
+ internal
194
+ view
195
+ returns (uint48 since, uint32 currentDelay, uint32 pendingDelay, uint48 effect)
196
+ {
197
+ return _getGroup(groupId).getAccess(account);
198
+ }
199
+
200
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
201
+ /* TARGET MANAGEMENT */
202
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
203
+
204
+ /// @notice Gets the target configuration for a contract.
205
+ /// @param target The target contract.
206
+ /// @return The target configuration.
207
+ function _getTarget(address target) internal view returns (Target storage) {
208
+ return ExecutorStorage.getLayout().targets[target];
209
+ }
210
+
211
+ /// @notice Sets the group for a target function.
212
+ /// @param target The target contract.
213
+ /// @param selector The function selector.
214
+ /// @param groupId The group ID.
215
+ function _setTargetFunctionGroup(address target, bytes4 selector, bytes32 groupId) internal {
216
+ _getTarget(target).allowedGroups[selector] = groupId;
217
+ emit TargetFunctionGroupSet(target, selector, groupId);
218
+ }
219
+
220
+ /// @notice Enables or disables a target function.
221
+ /// @param target The target contract.
222
+ /// @param selector The function selector.
223
+ /// @param disabled True to disable, false to enable.
224
+ function _setTargetFunctionDisabled(address target, bytes4 selector, bool disabled) internal {
225
+ _getTarget(target).disabledFunctions[selector] = disabled;
226
+ emit TargetFunctionDisabledSet(target, selector, disabled);
227
+ }
228
+
229
+ /// @notice Enables or disables a target contract.
230
+ /// @param target The target contract.
231
+ /// @param disabled True to disable, false to enable.
232
+ function _setTargetDisabled(address target, bool disabled) internal {
233
+ _getTarget(target).disabled = disabled;
234
+ emit TargetDisabledSet(target, disabled);
235
+ }
236
+
237
+ /// @notice Gets the group ID for a target function.
238
+ /// @param target The target contract.
239
+ /// @param selector The function selector.
240
+ /// @return The group ID.
241
+ function _getTargetFunctionGroupId(
242
+ address target,
243
+ bytes4 selector
244
+ ) internal view returns (bytes32) {
245
+ return _getTarget(target).allowedGroups[selector];
246
+ }
247
+
248
+ /// @notice Checks if a target contract is disabled.
249
+ /// @param target The target contract.
250
+ /// @return True if disabled.
251
+ function _isTargetDisabled(address target) internal view returns (bool) {
252
+ return _getTarget(target).disabled;
253
+ }
254
+
255
+ /// @notice Checks if a target function is disabled.
256
+ /// @param target The target contract.
257
+ /// @param selector The function selector.
258
+ /// @return True if disabled.
259
+ function _isTargetFunctionDisabled(
260
+ address target,
261
+ bytes4 selector
262
+ ) internal view returns (bool) {
263
+ return _getTarget(target).disabledFunctions[selector];
264
+ }
265
+
266
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
267
+ /* EXECUTION */
268
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
269
+
270
+ /// @notice Gets the schedule for an operation by its id.
271
+ /// @param operationId The operation ID.
272
+ /// @return The schedule storage for the operation.
273
+ function _getSchedule(bytes32 operationId) internal view returns (Schedule storage) {
274
+ return ExecutorStorage.getLayout().schedules[operationId];
275
+ }
276
+
277
+ /// @notice Schedules an execution operation.
278
+ /// @param target The target contract.
279
+ /// @param data The calldata for the operation.
280
+ /// @param when The earliest time the operation can be executed.
281
+ /// @return operationId The ID of the scheduled operation.
282
+ /// @return nonce The operation nonce.
283
+ function _scheduleExecution(
284
+ address target,
285
+ bytes calldata data,
286
+ uint48 when
287
+ ) internal returns (bytes32 operationId, uint32 nonce) {
288
+ address caller = msg.sender;
289
+ bytes4 selector = _getSelector(data);
290
+
291
+ // Fetch restrictions that apply to the caller on the targeted function
292
+ (, uint32 setback) = _canCall(caller, target, selector);
293
+
294
+ uint48 minWhen = Time.timestamp() + setback;
295
+
296
+ // If call with delay is not authorized, or if requested timing is too soon, revert
297
+ if (setback == 0 || (when > 0 && when < minWhen)) {
298
+ UnauthorizedCall.selector.revertWith();
299
+ }
300
+
301
+ when = uint48(FixedPointMathLib.max(when, minWhen));
302
+
303
+ // If caller is authorized, schedule operation
304
+ operationId = _hashOperation(caller, target, data);
305
+
306
+ _checkNotScheduled(operationId);
307
+
308
+ Schedule storage schedule = _getSchedule(operationId);
309
+ unchecked {
310
+ // It's not feasible to overflow the nonce in less than 1000 years
311
+ nonce = schedule.nonce + 1;
312
+ }
313
+
314
+ (schedule.timepoint, schedule.nonce) = (when, nonce);
315
+ emit OperationScheduled(operationId, when, nonce);
316
+ }
317
+
318
+ /// @notice Consumes a scheduled operation, marking it as executed.
319
+ /// @param operationId The operation ID.
320
+ /// @return nonce The operation nonce.
321
+ function _consumeScheduledOp(bytes32 operationId) internal returns (uint32 nonce) {
322
+ Schedule storage schedule = _getSchedule(operationId);
323
+ uint48 timepoint = schedule.timepoint;
324
+ nonce = schedule.nonce;
325
+
326
+ if (timepoint == 0) {
327
+ NotScheduled.selector.revertWith();
328
+ } else if (timepoint > Time.timestamp()) {
329
+ NotReady.selector.revertWith();
330
+ } else if (_isExpired(timepoint, 0)) {
331
+ Expired.selector.revertWith();
332
+ }
333
+
334
+ delete schedule.timepoint; // reset the timepoint, keep the nonce
335
+ emit OperationExecuted(operationId, nonce);
336
+ }
337
+
338
+ /// @notice Cancels a scheduled operation.
339
+ /// @param caller The original caller who scheduled the operation.
340
+ /// @param target The target contract.
341
+ /// @param data The calldata for the operation.
342
+ /// @return nonce The operation nonce.
343
+ function _cancel(
344
+ address caller,
345
+ address target,
346
+ bytes calldata data
347
+ ) internal returns (uint32 nonce) {
348
+ address sender = msg.sender;
349
+ bytes4 selector = _getSelector(data);
350
+
351
+ bytes32 operationId = _hashOperation(caller, target, data);
352
+
353
+ Schedule storage schedule = _getSchedule(operationId);
354
+
355
+ // If the operation is not scheduled, revert
356
+ if (schedule.timepoint == 0) {
357
+ NotScheduled.selector.revertWith();
358
+ } else if (caller != sender) {
359
+ // calls can only be canceled by the account that scheduled them, a global admin, or by
360
+ // a guardian of the required role.
361
+ (bool isGuardian, , ) = _hasGroupAccess(
362
+ _getGroupGuardian(_getTargetFunctionGroupId(target, selector)),
363
+ sender
364
+ );
365
+ bool isOwner = _getOwner() == sender;
366
+ if (!isGuardian && !isOwner) {
367
+ UnauthorizedCancel.selector.revertWith();
368
+ }
369
+ }
370
+
371
+ delete schedule.timepoint; // reset the timepoint, keep the nonce
372
+ nonce = schedule.nonce;
373
+ emit OperationCanceled(operationId, nonce);
374
+ }
375
+
376
+ /// @notice Executes a scheduled or immediate operation.
377
+ /// @param target The target contract.
378
+ /// @param value The ETH value to send.
379
+ /// @param data The calldata for the operation.
380
+ /// @return result The return data from the call.
381
+ /// @return nonce The operation nonce (if scheduled).
382
+ function _execute(
383
+ address target,
384
+ uint256 value,
385
+ bytes calldata data
386
+ ) internal returns (bytes memory result, uint32 nonce) {
387
+ bytes4 selector = _getSelector(data);
388
+
389
+ nonce = _validateExecution(target, selector, data);
390
+
391
+ // Get storage layout
392
+ ExecutorStorage.Layout storage $ = ExecutorStorage.getLayout();
393
+
394
+ // Run pre hooks before execution
395
+ _executePreHooks($, target, selector, value, data);
396
+
397
+ // Set the executionId for the target and selector using transient storage
398
+ bytes32 executionId = _hashExecutionId(target, selector);
399
+ ExecutorStorage.setTransientExecutionId(executionId);
400
+ ExecutorStorage.setTargetExecutionId(target, executionId);
401
+
402
+ // Call the target
403
+ result = LibCall.callContract(target, value, data);
404
+
405
+ // Run post hooks after execution (will run even if execution fails)
406
+ _executePostHooks($, target, selector);
407
+
408
+ // Clear transient storage to prevent composability issues
409
+ ExecutorStorage.clearTransientStorage(target);
410
+ }
411
+
412
+ /// @notice Gets the scheduled timepoint for an operation.
413
+ /// @param id The operation ID.
414
+ /// @return The scheduled timepoint, or 0 if expired.
415
+ function _getScheduleTimepoint(bytes32 id) internal view returns (uint48) {
416
+ uint48 timepoint = _getSchedule(id).timepoint;
417
+ return _isExpired(timepoint, 0) ? 0 : timepoint;
418
+ }
419
+
420
+ /// @dev Checks if the current execution context matches the given only target.
421
+ /// @param target The target contract.
422
+ /// @return True if currently executing.
423
+ function _isTargetExecuting(address target) internal view returns (bool) {
424
+ bytes32 globalId = ExecutorStorage.getTransientExecutionId();
425
+ bytes32 targetId = ExecutorStorage.getTargetExecutionId(target);
426
+ return globalId != 0 && targetId == globalId;
427
+ }
428
+
429
+ /// @notice Computes a unique hash for an operation.
430
+ /// @param caller The caller address.
431
+ /// @param target The target contract.
432
+ /// @param data The calldata for the operation.
433
+ /// @return The operation hash.
434
+ function _hashOperation(
435
+ address caller,
436
+ address target,
437
+ bytes calldata data
438
+ ) internal pure returns (bytes32) {
439
+ return keccak256(abi.encode(caller, target, data));
440
+ }
441
+
442
+ /// @dev Checks that an operation is not already scheduled and not expired.
443
+ /// @param operationId The operation ID.
444
+ function _checkNotScheduled(bytes32 operationId) private view {
445
+ uint48 prevTimepoint = _getSchedule(operationId).timepoint;
446
+
447
+ // If already scheduled and not expired, revert
448
+ if (prevTimepoint != 0 && !_isExpired(prevTimepoint, 0)) {
449
+ AlreadyScheduled.selector.revertWith();
450
+ }
451
+ }
452
+
453
+ function _validateExecution(
454
+ address target,
455
+ bytes4 selector,
456
+ bytes calldata data
457
+ ) private returns (uint32 nonce) {
458
+ // Fetch restrictions that apply to the caller on the targeted function
459
+ (bool allowed, uint32 delay) = _canCall(msg.sender, target, selector);
460
+
461
+ // If call is not authorized, revert
462
+ if (!allowed && delay == 0) {
463
+ UnauthorizedCall.selector.revertWith();
464
+ }
465
+
466
+ bytes32 operationId = _hashOperation(msg.sender, target, data);
467
+
468
+ // If caller is authorized, check operation was scheduled early enough
469
+ // Consume an available schedule even if there is no currently enforced delay
470
+ if (delay != 0 || _getScheduleTimepoint(operationId) != 0) {
471
+ nonce = _consumeScheduledOp(operationId);
472
+ }
473
+ }
474
+
475
+ /// @dev Determines if a caller can invoke a function on a target, and if a delay is required.
476
+ /// Handles both self-calls and external calls.
477
+ /// @param caller The address attempting the call.
478
+ /// @param target The contract being called.
479
+ /// @param selector The function selector being called.
480
+ /// @return allowed True if the call is allowed immediately, false otherwise.
481
+ /// @return delay The required delay before the call is allowed (0 if immediate).
482
+ function _canCall(
483
+ address caller,
484
+ address target,
485
+ bytes4 selector
486
+ ) private view returns (bool allowed, uint32 delay) {
487
+ // Disallow if the target or function is disabled
488
+ if (_isTargetDisabled(target)) {
489
+ return (false, 0);
490
+ }
491
+
492
+ if ((target != address(this) && _isTargetFunctionDisabled(target, selector))) {
493
+ return (false, 0);
494
+ }
495
+
496
+ // Check group permissions for the caller
497
+ bytes32 groupId = _getTargetFunctionGroupId(target, selector);
498
+ (bool isMember, uint32 currentDelay, bool active) = _hasGroupAccess(groupId, caller);
499
+
500
+ // Disallow if group is inactive or allowance exceeded
501
+ if (!active) {
502
+ return (false, 0);
503
+ }
504
+
505
+ // Allow if member and no delay, otherwise require delay
506
+ if (isMember) {
507
+ return (currentDelay == 0, currentDelay);
508
+ }
509
+
510
+ return (false, 0);
511
+ }
512
+
513
+ /// @dev Checks if a timepoint is expired.
514
+ /// @param timepoint The timepoint to check.
515
+ /// @param expiration The expiration duration (0 for default).
516
+ /// @return expired True if expired.
517
+ function _isExpired(uint48 timepoint, uint32 expiration) private view returns (bool expired) {
518
+ uint32 effectiveExpiration = expiration == 0 ? DEFAULT_EXPIRATION : expiration;
519
+ return timepoint + effectiveExpiration <= Time.timestamp();
520
+ }
521
+
522
+ /// @dev Checks if the current execution context matches the given target and selector.
523
+ /// @param target The target contract.
524
+ /// @param selector The function selector.
525
+ /// @return True if currently executing.
526
+ function _isExecuting(address target, bytes4 selector) private view returns (bool) {
527
+ return ExecutorStorage.getTransientExecutionId() == _hashExecutionId(target, selector);
528
+ }
529
+
530
+ /// @dev Computes a unique hash for the execution context.
531
+ /// @param target The target contract.
532
+ /// @param selector The function selector.
533
+ /// @return The execution context hash.
534
+ function _hashExecutionId(address target, bytes4 selector) private pure returns (bytes32) {
535
+ return keccak256(abi.encode(target, selector));
536
+ }
537
+
538
+ /// @dev Extracts the function selector from calldata.
539
+ /// @param data The calldata.
540
+ /// @return The function selector.
541
+ function _getSelector(bytes calldata data) private pure returns (bytes4) {
542
+ if (data.length < 4) InvalidDataLength.selector.revertWith();
543
+ return bytes4(data[0:4]);
544
+ }
545
+
546
+ /// @dev Internal function to get the owner
547
+ function _getOwner() internal view virtual returns (address);
548
+
549
+ /// @dev Internal function to execute pre hooks
550
+ function _executePreHooks(
551
+ ExecutorStorage.Layout storage $,
552
+ address target,
553
+ bytes4 selector,
554
+ uint256 value,
555
+ bytes calldata data
556
+ ) internal virtual {}
557
+
558
+ /// @dev Internal function to execute post hooks
559
+ function _executePostHooks(
560
+ ExecutorStorage.Layout storage $,
561
+ address target,
562
+ bytes4 selector
563
+ ) internal virtual {}
564
+ }