@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,124 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IPlatformRequirementsBase} from "./IPlatformRequirements.sol";
6
+
7
+ // libraries
8
+ import {PlatformRequirementsStorage} from "./PlatformRequirementsStorage.sol";
9
+ import {BasisPoints} from "src/utils/libraries/BasisPoints.sol";
10
+ import {CustomRevert} from "src/utils/libraries/CustomRevert.sol";
11
+
12
+ // contracts
13
+
14
+ abstract contract PlatformRequirementsBase is IPlatformRequirementsBase {
15
+ using CustomRevert for bytes4;
16
+
17
+ // Denominator
18
+ function _getDenominator() internal pure virtual returns (uint256) {
19
+ return 10_000;
20
+ }
21
+
22
+ // Fee Recipient
23
+ function _setFeeRecipient(address recipient) internal {
24
+ if (recipient == address(0)) {
25
+ Platform__InvalidFeeRecipient.selector.revertWith();
26
+ }
27
+
28
+ PlatformRequirementsStorage.layout().feeRecipient = recipient;
29
+
30
+ emit PlatformFeeRecipientSet(recipient);
31
+ }
32
+
33
+ function _getFeeRecipient() internal view returns (address) {
34
+ return PlatformRequirementsStorage.layout().feeRecipient;
35
+ }
36
+
37
+ // Membership BPS
38
+ function _setMembershipBps(uint16 bps) internal {
39
+ if (bps > BasisPoints.MAX_BPS) {
40
+ Platform__InvalidMembershipBps.selector.revertWith();
41
+ }
42
+
43
+ PlatformRequirementsStorage.layout().membershipBps = bps;
44
+ emit PlatformMembershipBpsSet(bps);
45
+ }
46
+
47
+ function _getMembershipBps() internal view returns (uint16) {
48
+ return PlatformRequirementsStorage.layout().membershipBps;
49
+ }
50
+
51
+ // Membership Fee
52
+ function _setMembershipFee(uint256 fee) internal {
53
+ PlatformRequirementsStorage.layout().membershipFee = fee;
54
+ emit PlatformMembershipFeeSet(fee);
55
+ }
56
+
57
+ function _getMembershipFee() internal view returns (uint256) {
58
+ return PlatformRequirementsStorage.layout().membershipFee;
59
+ }
60
+
61
+ // Membership Mint Limit
62
+ function _setMembershipMintLimit(uint256 limit) internal {
63
+ if (limit == 0) Platform__InvalidMembershipMintLimit.selector.revertWith();
64
+
65
+ PlatformRequirementsStorage.layout().membershipMintLimit = limit;
66
+ emit PlatformMembershipMintLimitSet(limit);
67
+ }
68
+
69
+ function _getMembershipMintLimit() internal view returns (uint256) {
70
+ return PlatformRequirementsStorage.layout().membershipMintLimit;
71
+ }
72
+
73
+ // Membership Duration
74
+ function _setMembershipDuration(uint64 duration) internal {
75
+ if (duration == 0) {
76
+ Platform__InvalidMembershipDuration.selector.revertWith();
77
+ }
78
+
79
+ PlatformRequirementsStorage.layout().membershipDuration = duration;
80
+ emit PlatformMembershipDurationSet(duration);
81
+ }
82
+
83
+ function _getMembershipDuration() internal view returns (uint64) {
84
+ return PlatformRequirementsStorage.layout().membershipDuration;
85
+ }
86
+
87
+ // Membership Min Price
88
+ function _setMembershipMinPrice(uint256 minPrice) internal {
89
+ if (minPrice == 0) {
90
+ Platform__InvalidMembershipMinPrice.selector.revertWith();
91
+ }
92
+
93
+ PlatformRequirementsStorage.layout().membershipMinPrice = minPrice;
94
+ emit PlatformMembershipMinPriceSet(minPrice);
95
+ }
96
+
97
+ function _getMembershipMinPrice() internal view returns (uint256) {
98
+ return PlatformRequirementsStorage.layout().membershipMinPrice;
99
+ }
100
+
101
+ function _setSwapFees(uint16 protocolBps, uint16 posterBps) internal {
102
+ if (posterBps > BasisPoints.MAX_BPS || protocolBps > BasisPoints.MAX_BPS) {
103
+ Platform__InvalidSwapFeeBps.selector.revertWith();
104
+ }
105
+ PlatformRequirementsStorage.Layout storage $ = PlatformRequirementsStorage.layout();
106
+ ($.swapProtocolBps, $.swapPosterBps) = (protocolBps, posterBps);
107
+ emit PlatformSwapFeesSet(protocolBps, posterBps);
108
+ }
109
+
110
+ function _getSwapFees() internal view returns (uint16 protocolBps, uint16 posterBps) {
111
+ PlatformRequirementsStorage.Layout storage $ = PlatformRequirementsStorage.layout();
112
+ return ($.swapProtocolBps, $.swapPosterBps);
113
+ }
114
+
115
+ function _setRouterWhitelisted(address router, bool whitelisted) internal {
116
+ PlatformRequirementsStorage.Layout storage $ = PlatformRequirementsStorage.layout();
117
+ $.whitelistedRouters[router] = whitelisted;
118
+ emit RouterWhitelistUpdated(router, whitelisted);
119
+ }
120
+
121
+ function _isRouterWhitelisted(address router) internal view returns (bool) {
122
+ return PlatformRequirementsStorage.layout().whitelistedRouters[router];
123
+ }
124
+ }
@@ -0,0 +1,122 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IPlatformRequirements} from "./IPlatformRequirements.sol";
6
+
7
+ // libraries
8
+
9
+ // contracts
10
+
11
+ import {PlatformRequirementsBase} from "./PlatformRequirementsBase.sol";
12
+ import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
13
+ import {OwnableBase} from "@towns-protocol/diamond/src/facets/ownable/OwnableBase.sol";
14
+
15
+ contract PlatformRequirementsFacet is
16
+ IPlatformRequirements,
17
+ PlatformRequirementsBase,
18
+ OwnableBase,
19
+ Facet
20
+ {
21
+ function __PlatformRequirements_init(
22
+ address feeRecipient,
23
+ uint16 membershipBps,
24
+ uint256 membershipFee,
25
+ uint256 membershipMintLimit,
26
+ uint64 membershipDuration,
27
+ uint256 membershipMinPrice
28
+ ) external onlyInitializing {
29
+ _addInterface(type(IPlatformRequirements).interfaceId);
30
+ _setFeeRecipient(feeRecipient);
31
+ _setMembershipBps(membershipBps);
32
+ _setMembershipFee(membershipFee);
33
+ _setMembershipMintLimit(membershipMintLimit);
34
+ _setMembershipDuration(membershipDuration);
35
+ _setMembershipMinPrice(membershipMinPrice);
36
+ }
37
+
38
+ /// @inheritdoc IPlatformRequirements
39
+ function getFeeRecipient() external view returns (address) {
40
+ return _getFeeRecipient();
41
+ }
42
+
43
+ /// @inheritdoc IPlatformRequirements
44
+ function getMembershipBps() external view returns (uint16) {
45
+ return _getMembershipBps();
46
+ }
47
+
48
+ /// @inheritdoc IPlatformRequirements
49
+ function getMembershipFee() external view returns (uint256) {
50
+ return _getMembershipFee();
51
+ }
52
+
53
+ /// @inheritdoc IPlatformRequirements
54
+ function getMembershipMintLimit() external view returns (uint256) {
55
+ return _getMembershipMintLimit();
56
+ }
57
+
58
+ /// @inheritdoc IPlatformRequirements
59
+ function getMembershipDuration() external view returns (uint64) {
60
+ return _getMembershipDuration();
61
+ }
62
+
63
+ /// @inheritdoc IPlatformRequirements
64
+ function setMembershipMinPrice(uint256 minPrice) external onlyOwner {
65
+ _setMembershipMinPrice(minPrice);
66
+ }
67
+
68
+ /// @inheritdoc IPlatformRequirements
69
+ function getMembershipMinPrice() external view returns (uint256) {
70
+ return _getMembershipMinPrice();
71
+ }
72
+
73
+ /// @inheritdoc IPlatformRequirements
74
+ function setFeeRecipient(address recipient) external onlyOwner {
75
+ _setFeeRecipient(recipient);
76
+ }
77
+
78
+ /// @inheritdoc IPlatformRequirements
79
+ function setMembershipBps(uint16 bps) external onlyOwner {
80
+ _setMembershipBps(bps);
81
+ }
82
+
83
+ /// @inheritdoc IPlatformRequirements
84
+ function setMembershipFee(uint256 fee) external onlyOwner {
85
+ _setMembershipFee(fee);
86
+ }
87
+
88
+ /// @inheritdoc IPlatformRequirements
89
+ function setMembershipMintLimit(uint256 limit) external onlyOwner {
90
+ _setMembershipMintLimit(limit);
91
+ }
92
+
93
+ /// @inheritdoc IPlatformRequirements
94
+ function setMembershipDuration(uint64 duration) external onlyOwner {
95
+ _setMembershipDuration(duration);
96
+ }
97
+
98
+ /// @inheritdoc IPlatformRequirements
99
+ function getDenominator() external pure returns (uint256) {
100
+ return _getDenominator();
101
+ }
102
+
103
+ /// @inheritdoc IPlatformRequirements
104
+ function getSwapFees() external view returns (uint16 protocolBps, uint16 posterBps) {
105
+ return _getSwapFees();
106
+ }
107
+
108
+ /// @inheritdoc IPlatformRequirements
109
+ function setSwapFees(uint16 protocolBps, uint16 posterBps) external onlyOwner {
110
+ _setSwapFees(protocolBps, posterBps);
111
+ }
112
+
113
+ /// @inheritdoc IPlatformRequirements
114
+ function isRouterWhitelisted(address router) external view returns (bool) {
115
+ return _isRouterWhitelisted(router);
116
+ }
117
+
118
+ /// @inheritdoc IPlatformRequirements
119
+ function setRouterWhitelisted(address router, bool whitelisted) external onlyOwner {
120
+ _setRouterWhitelisted(router, whitelisted);
121
+ }
122
+ }
@@ -0,0 +1,41 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+
6
+ // libraries
7
+
8
+ // contracts
9
+
10
+ library PlatformRequirementsStorage {
11
+ // keccak256(abi.encode(uint256(keccak256("spaces.facets.platform.requirements.storage")) - 1))
12
+ // &
13
+ // ~bytes32(uint256(0xff))
14
+ bytes32 internal constant STORAGE_SLOT =
15
+ 0xb29a817dd0719f30ad87abc8dff26e6354077e5b46bf38f34d5ac48732860d00;
16
+
17
+ struct Layout {
18
+ // slot 0
19
+ uint256 membershipFee;
20
+ // slot 1
21
+ uint256 membershipMintLimit;
22
+ // slot 2
23
+ address feeRecipient;
24
+ uint64 membershipDuration;
25
+ uint16 membershipBps;
26
+ // slot 3
27
+ uint256 membershipMinPrice;
28
+ // slot 4
29
+ uint16 swapProtocolBps;
30
+ uint16 swapPosterBps;
31
+ // slot 5
32
+ mapping(address => bool) whitelistedRouters;
33
+ }
34
+
35
+ function layout() internal pure returns (Layout storage l) {
36
+ bytes32 slot = STORAGE_SLOT;
37
+ assembly {
38
+ l.slot := slot
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,46 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+
6
+ // libraries
7
+
8
+ // contracts
9
+ interface IImplementationRegistryBase {
10
+ // =============================================================
11
+ // Errors
12
+ // =============================================================
13
+ error InvalidContractType();
14
+ error InvalidVersion();
15
+
16
+ // =============================================================
17
+ // Events
18
+ // =============================================================
19
+ event ImplementationAdded(address implementation, bytes32 contractType, uint32 version);
20
+ event ImplementationApproved(address implementation, bool approved);
21
+ }
22
+
23
+ interface IImplementationRegistry is IImplementationRegistryBase {
24
+ /// @notice Add an implementation to the registry
25
+ /// @param implementation The address of the implementation
26
+ function addImplementation(address implementation) external;
27
+
28
+ /// @notice Approve or disapprove an implementation
29
+ /// @param implementation The address of the implementation
30
+ /// @param approval The approval status
31
+ function approveImplementation(address implementation, bool approval) external;
32
+
33
+ /// @notice Get an implementation by contract type and version
34
+ /// @param contractType The contract type
35
+ /// @param version The version
36
+ /// @return The address of the implementation
37
+ function getImplementation(
38
+ bytes32 contractType,
39
+ uint32 version
40
+ ) external view returns (address);
41
+
42
+ /// @notice Get the latest implementation by contract type
43
+ /// @param contractType The contract type
44
+ /// @return The address of the latest implementation
45
+ function getLatestImplementation(bytes32 contractType) external view returns (address);
46
+ }
@@ -0,0 +1,64 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IMetadata} from "src/diamond/facets/metadata/IMetadata.sol";
6
+ import {IImplementationRegistry} from "src/factory/facets/registry/IImplementationRegistry.sol";
7
+
8
+ // libraries
9
+ import {ImplementationRegistryStorage} from "./ImplementationRegistryStorage.sol";
10
+
11
+ // contracts
12
+
13
+ import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
14
+ import {OwnableBase} from "@towns-protocol/diamond/src/facets/ownable/OwnableBase.sol";
15
+
16
+ contract ImplementationRegistryFacet is IImplementationRegistry, OwnableBase, Facet {
17
+ function __ImplementationRegistry_init() external {
18
+ _addInterface(type(IImplementationRegistry).interfaceId);
19
+ }
20
+
21
+ /// @inheritdoc IImplementationRegistry
22
+ function addImplementation(address implementation) external onlyOwner {
23
+ IMetadata metadata = IMetadata(implementation);
24
+
25
+ bytes32 contractType = metadata.contractType();
26
+ if (contractType == bytes32(0)) revert InvalidContractType();
27
+
28
+ ImplementationRegistryStorage.Layout storage ds = ImplementationRegistryStorage.layout();
29
+
30
+ uint32 version = metadata.contractVersion();
31
+ uint32 currentVersion = ds.currentVersion[contractType];
32
+
33
+ if (version <= currentVersion) revert InvalidVersion();
34
+
35
+ ds.implementation[contractType][version] = implementation;
36
+ ds.currentVersion[contractType] = version;
37
+ ds.approved[implementation] = true;
38
+
39
+ emit ImplementationAdded(implementation, contractType, version);
40
+ }
41
+
42
+ /// @inheritdoc IImplementationRegistry
43
+ function approveImplementation(address implementation, bool approval) external onlyOwner {
44
+ ImplementationRegistryStorage.Layout storage ds = ImplementationRegistryStorage.layout();
45
+
46
+ ds.approved[implementation] = approval;
47
+
48
+ emit ImplementationApproved(implementation, approval);
49
+ }
50
+
51
+ /// @inheritdoc IImplementationRegistry
52
+ function getImplementation(
53
+ bytes32 contractType,
54
+ uint32 version
55
+ ) external view returns (address) {
56
+ return ImplementationRegistryStorage.layout().implementation[contractType][version];
57
+ }
58
+
59
+ /// @inheritdoc IImplementationRegistry
60
+ function getLatestImplementation(bytes32 contractType) external view returns (address) {
61
+ ImplementationRegistryStorage.Layout storage ds = ImplementationRegistryStorage.layout();
62
+ return ds.implementation[contractType][ds.currentVersion[contractType]];
63
+ }
64
+ }
@@ -0,0 +1,28 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+
6
+ // libraries
7
+
8
+ // contracts
9
+
10
+ library ImplementationRegistryStorage {
11
+ // keccak256(abi.encode(uint256(keccak256("factory.facets.registry.storage")) - 1)) &
12
+ // ~bytes32(uint256(0xff))
13
+ bytes32 internal constant STORAGE_SLOT =
14
+ 0x31d1d65d94f3e9d7ffc7a93cc3bd1ee24d47f432e2c4fc10a5d92f8e2dd98900;
15
+
16
+ struct Layout {
17
+ mapping(address => bool) approved;
18
+ mapping(bytes32 => uint32) currentVersion;
19
+ mapping(bytes32 => mapping(uint32 => address)) implementation;
20
+ }
21
+
22
+ function layout() internal pure returns (Layout storage ds) {
23
+ bytes32 slot = STORAGE_SLOT;
24
+ assembly {
25
+ ds.slot := slot
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,218 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+
6
+ // libraries
7
+ import {WalletLib} from "./libraries/WalletLib.sol";
8
+ // contracts
9
+
10
+ interface IWalletLinkBase {
11
+ // =============================================================
12
+ // Structs
13
+ // =============================================================
14
+
15
+ /// @notice Struct for EVM only linked wallets
16
+ struct LinkedWallet {
17
+ address addr;
18
+ bytes signature;
19
+ string message;
20
+ }
21
+
22
+ struct VMSpecificData {
23
+ string key;
24
+ bytes value;
25
+ }
26
+
27
+ /// @notice Struct for non-EVM linked wallets
28
+ struct NonEVMLinkedWallet {
29
+ WalletLib.Wallet wallet;
30
+ bytes signature; // Signature in the VM's native format
31
+ string message; // Message that was signed
32
+ VMSpecificData[] extraData; // Flexible array for VM-specific requirements
33
+ }
34
+
35
+ /// @notice Struct for Solana wallet linking requirements
36
+ /// @dev This will be encoded in extraData for Solana wallets with key being "extPubKey"
37
+ /// SolanaSpecificData memory solanaSpecificData = abi.decode(
38
+ /// nonEVMWallet.extraData[0].value,
39
+ /// (SolanaSpecificData)
40
+ /// );
41
+ struct SolanaSpecificData {
42
+ uint256[5] extPubKey; // Extended public key for Solana
43
+ }
44
+
45
+ struct WalletQueryOptions {
46
+ bool includeDelegations;
47
+ }
48
+
49
+ // =============================================================
50
+ // Events
51
+ // =============================================================
52
+
53
+ /// @notice Emitted when a user links their wallet to a rootKey
54
+ event LinkWalletToRootKey(address indexed wallet, address indexed rootKey);
55
+
56
+ /// @notice Emitted when two wallets are unlinked
57
+ event RemoveLink(address indexed wallet, address indexed secondWallet);
58
+
59
+ /// @notice Emitted when a default wallet is set for a root key
60
+ event SetDefaultWallet(address indexed rootKey, address indexed defaultWallet);
61
+
62
+ /// @notice Emitted when a non-EVM wallet is linked to a root key
63
+ event LinkNonEVMWalletToRootWallet(bytes32 indexed walletHash, address indexed rootKey);
64
+
65
+ /// @notice Emitted when a non-EVM wallet is removed from a root key
66
+ event RemoveNonEVMWalletLink(bytes32 indexed walletHash, address indexed rootKey);
67
+
68
+ // =============================================================
69
+ // Errors
70
+ // =============================================================
71
+ error WalletLink__InvalidAddress();
72
+ error WalletLink__LinkAlreadyExists(address wallet, address rootKey);
73
+ error WalletLink__LinkedToAnotherRootKey(address wallet, address rootKey);
74
+ error WalletLink__InvalidSignature();
75
+ error WalletLink__NotLinked(address wallet, address rootKey);
76
+ error WalletLink__CannotRemoveRootWallet();
77
+ error WalletLink__CannotLinkToSelf();
78
+ error WalletLink__CannotLinkToRootWallet(address wallet, address rootKey);
79
+ error WalletLink__DefaultWalletAlreadySet();
80
+ error WalletLink__MaxLinkedWalletsReached();
81
+ error WalletLink__CannotRemoveDefaultWallet();
82
+ error WalletLink__UnsupportedVMType();
83
+ error WalletLink__InvalidVMSpecificData(string key, bytes value);
84
+ error WalletLink__InvalidMessage();
85
+ error WalletLink__NonEVMWalletAlreadyLinked(string wallet, address rootKey);
86
+ error WalletLink__InvalidNonEVMAddress();
87
+ error WalletLink__RootKeyMismatch(address callerRootKey, address rootKey);
88
+ error WalletLink__NonEVMWalletNotLinked(string wallet, address rootKey);
89
+ error WalletLink__AddressMismatch();
90
+ }
91
+
92
+ interface IWalletLink is IWalletLinkBase {
93
+ /**
94
+ * @notice Link caller wallet to a root wallet
95
+ * @param rootWallet the root wallet that the caller is linking to
96
+ * @param nonce a nonce used to prevent replay attacks, nonce must always be higher than previous nonce
97
+ */
98
+ function linkCallerToRootKey(LinkedWallet memory rootWallet, uint256 nonce) external;
99
+
100
+ /**
101
+ * @notice Link a wallet to a root wallet
102
+ * @param wallet the wallet being linked to the root wallet
103
+ * @param rootWallet the root wallet that the caller is linking to
104
+ * @param nonce a nonce used to prevent replay attacks, nonce must always be higher than previous nonce
105
+ */
106
+ function linkWalletToRootKey(
107
+ LinkedWallet memory wallet,
108
+ LinkedWallet memory rootWallet,
109
+ uint256 nonce
110
+ ) external;
111
+
112
+ /**
113
+ * @notice Link a non-EVM wallet to a root wallet
114
+ * @param wallet the wallet being linked to the root wallet
115
+ * @param nonce a nonce used to prevent replay attacks, nonce must always be higher than previous nonce
116
+ * @dev The function can only be called by an already linked wallet
117
+ */
118
+ function linkNonEVMWalletToRootKey(NonEVMLinkedWallet calldata wallet, uint256 nonce) external;
119
+
120
+ /**
121
+ * @notice Remove a non-EVM wallet link from a root wallet
122
+ * @param wallet the wallet being removed from the root wallet
123
+ * @param nonce a nonce used to prevent replay attacks, nonce must always be higher than previous nonce
124
+ * @dev The function can only be called by an already linked wallet
125
+ */
126
+ function removeNonEVMWalletLink(WalletLib.Wallet memory wallet, uint256 nonce) external;
127
+
128
+ /**
129
+ * @notice Called via the rootkey signing a message to a remove a wallet from itself
130
+ * @param wallet the wallet being unlinked from the sending wallet
131
+ */
132
+ function removeLink(address wallet, LinkedWallet memory rootWallet, uint256 nonce) external;
133
+
134
+ /**
135
+ * @notice Remove the caller's link to their root key
136
+ */
137
+ function removeCallerLink() external;
138
+
139
+ /**
140
+ * @notice Set the default wallet by the root wallet
141
+ * @param defaultWallet the wallet being set as the default wallet
142
+ * @dev A wallet can only be set as the default wallet if it is already linked to the root wallet
143
+ * @dev The default wallet can only be an EVM wallet for now
144
+ */
145
+ function setDefaultWallet(address defaultWallet) external;
146
+
147
+ // =============================================================
148
+ // External - Read
149
+ // =============================================================
150
+
151
+ /**
152
+ * @notice Returns the default wallet for a root key
153
+ * @param rootKey the public key of the users rootkey to find associated wallets for
154
+ * @return defaultWallet the default wallet for the root key
155
+ */
156
+ function getDefaultWallet(address rootKey) external view returns (address);
157
+
158
+ /**
159
+ * @notice Returns all wallets linked to a root key
160
+ * @param rootKey the public key of the users rootkey to find associated wallets for
161
+ * @return wallets an array of ethereum wallets linked to this root key
162
+ */
163
+ function getWalletsByRootKey(address rootKey) external view returns (address[] memory wallets);
164
+
165
+ /**
166
+ * @notice Returns all wallets linked to a root key with their metadata
167
+ * @param rootKey the public key of the users rootkey to find associated wallets for
168
+ * @return wallets an array of wallets with their metadata
169
+ */
170
+ function getAllWalletsByRootKey(
171
+ address rootKey
172
+ ) external view returns (WalletLib.Wallet[] memory wallets);
173
+
174
+ /**
175
+ * @notice Returns the root key for a given wallet
176
+ * @param wallet the ethereum wallet to find associated root key for
177
+ * @return rootKey the rootkey that this wallet is linked to
178
+ */
179
+ function getRootKeyForWallet(address wallet) external view returns (address rootKey);
180
+
181
+ /**
182
+ * @notice checks if a root key and wallet are linked
183
+ * @param rootKey the public key of the users rootkey to check
184
+ * @param wallet the ethereum wallet to check
185
+ * @return areLinked boolean if they are linked together
186
+ */
187
+ function checkIfLinked(address rootKey, address wallet) external view returns (bool);
188
+
189
+ /**
190
+ * @notice checks if a root key and non-EVM wallet are linked
191
+ * @param rootKey the public key of the users rootkey to check
192
+ * @param walletHash the hash of the non-EVM wallet to check
193
+ * @return areLinked boolean if they are linked together
194
+ */
195
+ function checkIfNonEVMWalletLinked(
196
+ address rootKey,
197
+ bytes32 walletHash
198
+ ) external view returns (bool);
199
+
200
+ /**
201
+ * @notice gets the latest nonce for a rootkey to use a higher one for next link action
202
+ * @param rootKey the public key of the users rootkey to check
203
+ */
204
+ function getLatestNonceForRootKey(address rootKey) external view returns (uint256);
205
+
206
+ /**
207
+ * @notice gets the dependency address for a given dependency label
208
+ * @param dependency the dependency label to get
209
+ */
210
+ function getDependency(bytes32 dependency) external view returns (address);
211
+
212
+ /**
213
+ * @notice sets the dependency address for a given dependency label
214
+ * @param dependency the dependency label to set
215
+ * @param dependencyAddress the dependency address to set
216
+ */
217
+ function setDependency(bytes32 dependency, address dependencyAddress) external;
218
+ }