@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,118 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.24;
3
+
4
+ // interfaces
5
+ import {IMerkleAirdrop} from "./IMerkleAirdrop.sol";
6
+ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
7
+
8
+ // libraries
9
+
10
+ import {MerkleAirdropStorage} from "./MerkleAirdropStorage.sol";
11
+ import {ECDSA} from "solady/utils/ECDSA.sol";
12
+ import {MerkleProofLib} from "solady/utils/MerkleProofLib.sol";
13
+ import {SafeTransferLib} from "solady/utils/SafeTransferLib.sol";
14
+
15
+ // contracts
16
+
17
+ import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
18
+ import {EIP712Base} from "@towns-protocol/diamond/src/utils/cryptography/EIP712Base.sol";
19
+ import {CustomRevert} from "src/utils/libraries/CustomRevert.sol";
20
+
21
+ contract MerkleAirdrop is IMerkleAirdrop, EIP712Base, Facet {
22
+ // keccak256("AirdropClaim(address account,uint256 amount,address receiver)");
23
+ bytes32 private constant MESSAGE_TYPEHASH =
24
+ 0x0770323f1f7513b8a3d8df16b4b8fd506e7a76eaf71c03c687683b8d52979b5c;
25
+
26
+ function __MerkleAirdrop_init(bytes32 merkleRoot, IERC20 token) external initializer {
27
+ _addInterface(type(IMerkleAirdrop).interfaceId);
28
+ __MerkleAirdrop_init_unchained(merkleRoot, token);
29
+ }
30
+
31
+ /// @inheritdoc IMerkleAirdrop
32
+ function getMerkleRoot() public view returns (bytes32) {
33
+ return MerkleAirdropStorage.layout().merkleRoot;
34
+ }
35
+
36
+ /// @inheritdoc IMerkleAirdrop
37
+ function getToken() public view returns (IERC20) {
38
+ return MerkleAirdropStorage.layout().token;
39
+ }
40
+
41
+ /// @inheritdoc IMerkleAirdrop
42
+ function getMessageHash(
43
+ address account,
44
+ uint256 amount,
45
+ address receiver
46
+ ) public view returns (bytes32) {
47
+ return
48
+ _hashTypedDataV4(
49
+ keccak256(abi.encode(MESSAGE_TYPEHASH, AirdropClaim(account, amount, receiver)))
50
+ );
51
+ }
52
+
53
+ /// @inheritdoc IMerkleAirdrop
54
+ function claim(
55
+ address account,
56
+ uint256 amount,
57
+ bytes32[] calldata merkleProof,
58
+ bytes calldata signature,
59
+ address receiver
60
+ ) external {
61
+ MerkleAirdropStorage.Layout storage ds = MerkleAirdropStorage.layout();
62
+
63
+ if (ds.claimed[account]) {
64
+ CustomRevert.revertWith(MerkleAirdrop__AlreadyClaimed.selector);
65
+ }
66
+
67
+ _validateSignature(account, getMessageHash(account, amount, receiver), signature);
68
+
69
+ // verify merkle proof
70
+ bytes32 leaf = _createLeaf(account, amount);
71
+ if (!MerkleProofLib.verifyCalldata(merkleProof, ds.merkleRoot, leaf)) {
72
+ CustomRevert.revertWith(MerkleAirdrop__InvalidProof.selector);
73
+ }
74
+
75
+ ds.claimed[account] = true;
76
+
77
+ address recipient = receiver == address(0) ? account : receiver;
78
+ emit Claimed(account, amount, recipient);
79
+
80
+ SafeTransferLib.safeTransfer(address(ds.token), recipient, amount);
81
+ }
82
+
83
+ // =============================================================
84
+ // Internal
85
+ // =============================================================
86
+ function __MerkleAirdrop_init_unchained(bytes32 merkleRoot, IERC20 token) internal {
87
+ MerkleAirdropStorage.Layout storage ds = MerkleAirdropStorage.layout();
88
+ ds.merkleRoot = merkleRoot;
89
+ ds.token = token;
90
+ }
91
+
92
+ function _validateSignature(
93
+ address signer,
94
+ bytes32 digest,
95
+ bytes calldata signature
96
+ ) internal view {
97
+ address actualSigner = ECDSA.recoverCalldata(digest, signature);
98
+ if (actualSigner != signer) {
99
+ CustomRevert.revertWith(MerkleAirdrop__InvalidSignature.selector);
100
+ }
101
+ }
102
+
103
+ function _createLeaf(address account, uint256 amount) internal pure returns (bytes32 leaf) {
104
+ assembly ("memory-safe") {
105
+ // Store the account address at memory location 0
106
+ mstore(0, account)
107
+ // Store the amount at memory location 0x20 (32 bytes after the account address)
108
+ mstore(0x20, amount)
109
+ // Compute the keccak256 hash of the account and amount, and store it at memory location
110
+ // 0
111
+ mstore(0, keccak256(0, 0x40))
112
+ // Compute the keccak256 hash of the previous hash (stored at memory location 0) and
113
+ // store it
114
+ // in the leaf variable
115
+ leaf := keccak256(0, 0x20)
116
+ }
117
+ }
118
+ }
@@ -0,0 +1,29 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
6
+
7
+ // libraries
8
+
9
+ // contracts
10
+
11
+ library MerkleAirdropStorage {
12
+ // keccak256(abi.encode(uint256(keccak256("merkle.airdrop.storage")) - 1)) &
13
+ // ~bytes32(uint256(0xff))
14
+ bytes32 constant STORAGE_SLOT =
15
+ 0x5499e8f18bf9226c15306964dca998d3d8d3ddae851b652336bc6dea221b5200;
16
+
17
+ struct Layout {
18
+ IERC20 token;
19
+ bytes32 merkleRoot;
20
+ mapping(address => bool) claimed;
21
+ }
22
+
23
+ function layout() internal pure returns (Layout storage ds) {
24
+ bytes32 slot = STORAGE_SLOT;
25
+ assembly {
26
+ ds.slot := slot
27
+ }
28
+ }
29
+ }
@@ -0,0 +1,37 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ interface AggregatorV3Interface {
5
+ function decimals() external view returns (uint8);
6
+
7
+ function description() external view returns (string memory);
8
+
9
+ function version() external view returns (uint256);
10
+
11
+ // getRoundData and latestRoundData should both raise "No data present"
12
+ // if they do not have data to report, instead of returning unset values
13
+ // which could be misinterpreted as actual reported values.
14
+ function getRoundData(
15
+ uint80 _roundId
16
+ )
17
+ external
18
+ view
19
+ returns (
20
+ uint80 roundId,
21
+ int256 answer,
22
+ uint256 startedAt,
23
+ uint256 updatedAt,
24
+ uint80 answeredInRound
25
+ );
26
+
27
+ function latestRoundData()
28
+ external
29
+ view
30
+ returns (
31
+ uint80 roundId,
32
+ int256 answer,
33
+ uint256 startedAt,
34
+ uint256 updatedAt,
35
+ uint80 answeredInRound
36
+ );
37
+ }
@@ -0,0 +1,10 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.8;
3
+
4
+ /// @title Interface for the Multicall utility contract
5
+ interface IMulticall {
6
+ /// @notice batch function calls to the contract and return the results of each
7
+ /// @param data array of function call data payloads
8
+ /// @return results array of function call results
9
+ function multicall(bytes[] calldata data) external returns (bytes[] memory results);
10
+ }
@@ -0,0 +1,10 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ interface IWETH {
5
+ function deposit() external payable;
6
+
7
+ function withdraw(uint256 amount) external;
8
+
9
+ function transfer(address to, uint256 value) external returns (bool);
10
+ }
@@ -0,0 +1,24 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ import {CustomRevert} from "./CustomRevert.sol";
5
+
6
+ /// @title Basis Points
7
+ /// @notice Library for calculating with basis points
8
+ library BasisPoints {
9
+ using CustomRevert for bytes4;
10
+
11
+ uint256 public constant MAX_BPS = 10_000;
12
+
13
+ error InvalidBasisPoints(uint256 basisPoints);
14
+
15
+ /// @notice Calculate the basis points of a given amount
16
+ /// @param amount The amount to be multiplied by the basis points
17
+ /// @param basisPoints The basis points
18
+ /// @return The amount multiplied by the basis points
19
+ function calculate(uint256 amount, uint256 basisPoints) internal pure returns (uint256) {
20
+ if (basisPoints > MAX_BPS) InvalidBasisPoints.selector.revertWith(basisPoints);
21
+
22
+ return (amount * basisPoints) / MAX_BPS;
23
+ }
24
+ }
@@ -0,0 +1,74 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ import {CustomRevert} from "src/utils/libraries/CustomRevert.sol";
5
+ import {LibClone} from "solady/utils/LibClone.sol";
6
+
7
+ library Create2Utils {
8
+ address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;
9
+
10
+ error MissingCreate2Factory();
11
+ error Create2AddressDerivationFailed();
12
+ error Create2CallFailed();
13
+
14
+ function create2Deploy(bytes32 salt, bytes memory bytecode) internal returns (address) {
15
+ if (!isContractDeployed(CREATE2_FACTORY)) {
16
+ CustomRevert.revertWith(MissingCreate2Factory.selector);
17
+ }
18
+
19
+ address computed = computeCreate2Address(salt, bytecode);
20
+
21
+ if (isContractDeployed(computed)) {
22
+ return computed;
23
+ } else {
24
+ address deployedAt = performCreate2Call(salt, bytecode);
25
+ if (deployedAt != computed) {
26
+ CustomRevert.revertWith(Create2AddressDerivationFailed.selector);
27
+ }
28
+ return deployedAt;
29
+ }
30
+ }
31
+
32
+ function isContractDeployed(address addr) internal view returns (bool isContract) {
33
+ assembly ("memory-safe") {
34
+ isContract := gt(extcodesize(addr), 0)
35
+ }
36
+ }
37
+
38
+ function computeCreate2Address(
39
+ bytes32 salt,
40
+ bytes memory bytecode
41
+ ) internal pure returns (address) {
42
+ return LibClone.predictDeterministicAddress(keccak256(bytecode), salt, CREATE2_FACTORY);
43
+ }
44
+
45
+ function performCreate2Call(
46
+ bytes32 salt,
47
+ bytes memory bytecode
48
+ ) internal returns (address deployedAt) {
49
+ bytes memory data = abi.encodePacked(salt, bytecode);
50
+
51
+ assembly ("memory-safe") {
52
+ // If call failed, revert with empty data
53
+ if iszero(
54
+ call(
55
+ gas(), // Forward all available gas
56
+ CREATE2_FACTORY, // Address of the CREATE2 factory
57
+ 0, // No ETH value
58
+ add(data, 0x20), // Pointer to data (skip length prefix)
59
+ mload(data), // Data size
60
+ 0, // Output location
61
+ 0x20 // Output size (32 bytes)
62
+ )
63
+ ) {
64
+ // Inline revert with empty data
65
+ revert(0, 0)
66
+ }
67
+ deployedAt := shr(96, mload(0))
68
+ }
69
+
70
+ if (deployedAt == address(0)) {
71
+ CustomRevert.revertWith(Create2CallFailed.selector);
72
+ }
73
+ }
74
+ }
@@ -0,0 +1,99 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.24;
3
+
4
+ // interfaces
5
+ import {IWETH} from "../interfaces/IWETH.sol";
6
+
7
+ // libraries
8
+ import {SafeTransferLib} from "solady/utils/SafeTransferLib.sol";
9
+ import {CustomRevert} from "./CustomRevert.sol";
10
+
11
+ // contracts
12
+
13
+ library CurrencyTransfer {
14
+ using SafeTransferLib for address;
15
+ using CustomRevert for bytes4;
16
+
17
+ /// @dev The address interpreted as native token of the chain.
18
+ address internal constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
19
+
20
+ /// @dev The ETH transfer has failed.
21
+ error ETHTransferFailed();
22
+
23
+ /// @dev The ERC20 `transferFrom` has failed.
24
+ error TransferFromFailed();
25
+
26
+ /// @dev The ERC20 `transfer` has failed.
27
+ error TransferFailed();
28
+
29
+ /// @dev The `msg.value` does not match the amount.
30
+ error MsgValueMismatch();
31
+
32
+ /// @dev Transfers a given amount of currency.
33
+ /// @param currency The currency to transfer.
34
+ /// @param from The address to transfer from.
35
+ /// @param to The address to transfer to.
36
+ /// @param amount The amount to transfer.
37
+ function transferCurrency(address currency, address from, address to, uint256 amount) internal {
38
+ if (amount == 0) return;
39
+
40
+ if (currency != NATIVE_TOKEN) safeTransferERC20(currency, from, to, amount);
41
+ else safeTransferNativeToken(to, amount);
42
+ }
43
+
44
+ /// @dev Transfers a given amount of currency. (With native token wrapping)
45
+ /// @param currency The currency to transfer.
46
+ /// @param from The address to transfer from.
47
+ /// @param to The address to transfer to.
48
+ /// @param amount The amount to transfer.
49
+ /// @param _nativeTokenWrapper The address of the native token wrapper.
50
+ function transferCurrencyWithWrapper(
51
+ address currency,
52
+ address from,
53
+ address to,
54
+ uint256 amount,
55
+ address _nativeTokenWrapper
56
+ ) internal {
57
+ if (amount == 0) return;
58
+
59
+ if (currency == NATIVE_TOKEN) {
60
+ if (from == address(this)) {
61
+ IWETH(_nativeTokenWrapper).withdraw(amount);
62
+ safeTransferNativeTokenWithWrapper(to, amount, _nativeTokenWrapper);
63
+ } else {
64
+ if (amount != msg.value) MsgValueMismatch.selector.revertWith();
65
+
66
+ if (to == address(this)) IWETH(_nativeTokenWrapper).deposit{value: msg.value}();
67
+ else safeTransferNativeTokenWithWrapper(to, msg.value, _nativeTokenWrapper);
68
+ }
69
+ } else {
70
+ safeTransferERC20(currency, from, to, amount);
71
+ }
72
+ }
73
+
74
+ /// @dev Transfer `amount` of ERC20 token from `from` to `to`.
75
+ function safeTransferERC20(address token, address from, address to, uint256 amount) internal {
76
+ if (from == to) return;
77
+
78
+ if (from != address(this)) token.safeTransferFrom(from, to, amount);
79
+ else token.safeTransfer(to, amount);
80
+ }
81
+
82
+ /// @dev Transfers `amount` of native token to `to`.
83
+ function safeTransferNativeToken(address to, uint256 value) internal {
84
+ to.safeTransferETH(value);
85
+ }
86
+
87
+ /// @dev Transfers `amount` of native token to `to`. (With native token wrapping)
88
+ function safeTransferNativeTokenWithWrapper(
89
+ address to,
90
+ uint256 value,
91
+ address _nativeTokenWrapper
92
+ ) internal {
93
+ bool success = to.trySafeTransferETH(value, gasleft());
94
+ if (!success) {
95
+ IWETH(_nativeTokenWrapper).deposit{value: value}();
96
+ _nativeTokenWrapper.safeTransfer(to, value);
97
+ }
98
+ }
99
+ }
@@ -0,0 +1,49 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @title Library for reverting with custom errors efficiently
5
+ /// @notice Contains functions for reverting with custom errors with different argument types
6
+ /// efficiently
7
+ /// @dev To use this library, declare `using CustomRevert for bytes4;` and replace `revert
8
+ /// CustomError()` with
9
+ /// `CustomError.selector.revertWith()`
10
+ /// @dev The functions may tamper with the free memory pointer but it is fine since the call context
11
+ /// is exited immediately
12
+ library CustomRevert {
13
+ /// @dev Reverts with the selector of a custom error in the scratch space
14
+ function revertWith(bytes4 selector) internal pure {
15
+ assembly ("memory-safe") {
16
+ mstore(0, selector)
17
+ revert(0, 0x04)
18
+ }
19
+ }
20
+
21
+ /// @dev Reverts with a custom error with a uint256 argument in the scratch space
22
+ function revertWith(bytes4 selector, uint256 value) internal pure {
23
+ assembly ("memory-safe") {
24
+ mstore(0, selector)
25
+ mstore(0x04, value)
26
+ revert(0, 0x24)
27
+ }
28
+ }
29
+
30
+ /// @dev Reverts with a custom error with an address argument in the scratch space
31
+ function revertWith(bytes4 selector, address addr) internal pure {
32
+ assembly ("memory-safe") {
33
+ mstore(0, selector)
34
+ mstore(0x04, and(addr, 0xffffffffffffffffffffffffffffffffffffffff))
35
+ revert(0, 0x24)
36
+ }
37
+ }
38
+
39
+ /// @dev Reverts with the legacy error message without additional allocation
40
+ function revertWith(string memory message) internal pure {
41
+ assembly ("memory-safe") {
42
+ mstore(sub(message, 0x40), 0x08c379a0) // Error(string)
43
+ mstore(sub(message, 0x20), 0x20) // abi encoding offset
44
+ // round up to multiple of 32
45
+ let len := and(add(mload(message), 0x1f), not(0x1f))
46
+ revert(sub(message, 0x24), add(len, 0x44))
47
+ }
48
+ }
49
+ }
@@ -0,0 +1,66 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ import {LibClone} from "solady/utils/LibClone.sol";
5
+
6
+ /// @title Factory for arbitrary code deployment using the "CREATE" and "CREATE2" opcodes
7
+ library Factory {
8
+ /// @notice Emitted when deployment fails
9
+ /// @param revertData Nested revert data
10
+ error Factory__FailedDeployment(bytes revertData);
11
+
12
+ /// @notice deploy contract code using "CREATE" opcode
13
+ /// @param initCode contract initialization code
14
+ /// @return deployment address of deployed contract
15
+ function deploy(bytes memory initCode) internal returns (address deployment) {
16
+ assembly ("memory-safe") {
17
+ deployment := create(0, add(initCode, 0x20), mload(initCode))
18
+ if iszero(deployment) {
19
+ // revert Factory__FailedDeployment(revertData)
20
+ mstore(0, 0x2b1c2246)
21
+ mstore(0x20, 0x20)
22
+ mstore(0x40, returndatasize())
23
+ returndatacopy(0x60, 0, returndatasize())
24
+ // round up to nearest 32 bytes
25
+ let rounded_len := and(not(0x1f), add(0x1f, returndatasize()))
26
+ revert(0x1c, add(0x44, rounded_len))
27
+ }
28
+ }
29
+ }
30
+
31
+ /// @notice deploy contract code using "CREATE2" opcode
32
+ /// @dev reverts if deployment is not successful (likely because salt has already been used)
33
+ /// @param initCode contract initialization code
34
+ /// @param salt input for deterministic address calculation
35
+ /// @return deployment address of deployed contract
36
+ function deploy(bytes memory initCode, bytes32 salt) internal returns (address deployment) {
37
+ assembly ("memory-safe") {
38
+ deployment := create2(0, add(initCode, 0x20), mload(initCode), salt)
39
+ if iszero(deployment) {
40
+ // revert Factory__FailedDeployment(revertData)
41
+ mstore(0, 0x2b1c2246)
42
+ mstore(0x20, 0x20)
43
+ mstore(0x40, returndatasize())
44
+ returndatacopy(0x60, 0, returndatasize())
45
+ // round up to nearest 32 bytes
46
+ let rounded_len := and(not(0x1f), add(0x1f, returndatasize()))
47
+ revert(0x1c, add(0x44, rounded_len))
48
+ }
49
+ }
50
+ }
51
+
52
+ /// @notice calculate the _deployMetamorphicContract deployment address for a given salt
53
+ /// @param initCodeHash hash of contract initialization code
54
+ /// @param salt input for deterministic address calculation
55
+ /// @return deployment deployment address
56
+ function calculateDeploymentAddress(
57
+ bytes32 initCodeHash,
58
+ bytes32 salt
59
+ ) internal view returns (address deployment) {
60
+ deployment = LibClone.predictDeterministicAddress(initCodeHash, salt, address(this));
61
+ assembly {
62
+ // clean the upper 96 bits
63
+ deployment := and(deployment, 0xffffffffffffffffffffffffffffffffffffffff)
64
+ }
65
+ }
66
+ }