@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,396 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+ import {IStreamRegistry} from "./IStreamRegistry.sol";
6
+ import {SetMiniblock, SetStreamReplicationFactor, Stream, StreamWithId} from "src/river/registry/libraries/RegistryStorage.sol";
7
+
8
+ // libraries
9
+ import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
10
+
11
+ import {RiverRegistryErrors} from "src/river/registry/libraries/RegistryErrors.sol";
12
+ import {CustomRevert} from "src/utils/libraries/CustomRevert.sol";
13
+ import {FixedPointMathLib} from "solady/utils/FixedPointMathLib.sol";
14
+
15
+ // contracts
16
+ import {RegistryModifiers} from "src/river/registry/libraries/RegistryStorage.sol";
17
+
18
+ library StreamFlags {
19
+ uint64 internal constant SEALED = 1;
20
+ }
21
+
22
+ contract StreamRegistry is IStreamRegistry, RegistryModifiers {
23
+ using EnumerableSet for EnumerableSet.Bytes32Set;
24
+ using EnumerableSet for EnumerableSet.AddressSet;
25
+ using CustomRevert for string;
26
+
27
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
28
+ /* STREAMS */
29
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
30
+
31
+ /// @inheritdoc IStreamRegistry
32
+ function allocateStream(
33
+ bytes32 streamId,
34
+ address[] calldata nodes,
35
+ bytes32 genesisMiniblockHash,
36
+ bytes calldata genesisMiniblock
37
+ ) external onlyNode(msg.sender) onlyStreamNotExists(streamId) onlyRegisteredNodes(nodes) {
38
+ // Add the stream to the registry
39
+ Stream storage stream = ds.streamById[streamId];
40
+ (stream.lastMiniblockHash, stream.nodes, stream.reserved0) = (
41
+ genesisMiniblockHash,
42
+ nodes,
43
+ _calculateStreamReserved0(stream.reserved0, uint8(nodes.length))
44
+ );
45
+
46
+ ds.streams.add(streamId);
47
+ ds.genesisMiniblockByStreamId[streamId] = genesisMiniblock;
48
+ ds.genesisMiniblockHashByStreamId[streamId] = genesisMiniblockHash;
49
+
50
+ _addStreamIdToNodes(streamId, nodes);
51
+
52
+ _emitStreamUpdated(StreamEventType.Allocate, abi.encode(streamId, stream));
53
+ }
54
+
55
+ /// @inheritdoc IStreamRegistry
56
+ function addStream(
57
+ bytes32 streamId,
58
+ bytes32 genesisMiniblockHash,
59
+ Stream calldata stream
60
+ )
61
+ external
62
+ onlyNode(msg.sender)
63
+ onlyStreamNotExists(streamId)
64
+ onlyRegisteredNodes(stream.nodes)
65
+ {
66
+ ds.streams.add(streamId);
67
+ ds.streamById[streamId] = stream;
68
+ ds.genesisMiniblockHashByStreamId[streamId] = genesisMiniblockHash;
69
+
70
+ _addStreamIdToNodes(streamId, stream.nodes);
71
+
72
+ _emitStreamUpdated(StreamEventType.Create, abi.encode(streamId, stream));
73
+ }
74
+
75
+ function setStreamLastMiniblockBatch(
76
+ SetMiniblock[] calldata miniblocks
77
+ ) external onlyNode(msg.sender) {
78
+ uint256 miniblockCount = miniblocks.length;
79
+
80
+ if (miniblockCount == 0) RiverRegistryErrors.BAD_ARG.revertWith();
81
+
82
+ SetMiniblock[] memory miniblockUpdates = new SetMiniblock[](miniblockCount);
83
+ uint256 streamCount = 0;
84
+
85
+ for (uint256 i; i < miniblockCount; ++i) {
86
+ SetMiniblock calldata miniblock = miniblocks[i];
87
+
88
+ if (!ds.streams.contains(miniblock.streamId)) {
89
+ emit StreamLastMiniblockUpdateFailed(
90
+ miniblock.streamId,
91
+ miniblock.lastMiniblockHash,
92
+ miniblock.lastMiniblockNum,
93
+ RiverRegistryErrors.NOT_FOUND
94
+ );
95
+ continue;
96
+ }
97
+
98
+ Stream storage stream = ds.streamById[miniblock.streamId];
99
+
100
+ // Check if the stream is already sealed using bitwise AND
101
+ if ((stream.flags & StreamFlags.SEALED) != 0) {
102
+ emit StreamLastMiniblockUpdateFailed(
103
+ miniblock.streamId,
104
+ miniblock.lastMiniblockHash,
105
+ miniblock.lastMiniblockNum,
106
+ RiverRegistryErrors.STREAM_SEALED
107
+ );
108
+ continue;
109
+ }
110
+
111
+ // Check if the lastMiniblockNum is the next expected miniblock and
112
+ // the prevMiniblockHash is correct
113
+ if (stream.lastMiniblockNum >= miniblock.lastMiniblockNum) {
114
+ emit StreamLastMiniblockUpdateFailed(
115
+ miniblock.streamId,
116
+ miniblock.lastMiniblockHash,
117
+ miniblock.lastMiniblockNum,
118
+ RiverRegistryErrors.BAD_ARG
119
+ );
120
+ continue;
121
+ }
122
+
123
+ // Delete genesis miniblock bytes if the stream is moving beyond genesis
124
+ if (stream.lastMiniblockNum == 0) {
125
+ delete ds.genesisMiniblockByStreamId[miniblock.streamId];
126
+ }
127
+
128
+ // Update the stream information
129
+ stream.lastMiniblockHash = miniblock.lastMiniblockHash;
130
+ stream.lastMiniblockNum = miniblock.lastMiniblockNum;
131
+
132
+ // Set the sealed flag if requested
133
+ if (miniblock.isSealed) {
134
+ stream.flags |= StreamFlags.SEALED;
135
+ }
136
+
137
+ miniblockUpdates[streamCount++] = miniblock;
138
+ }
139
+
140
+ // overwrite the length of the array
141
+ assembly ("memory-safe") {
142
+ mstore(miniblockUpdates, streamCount)
143
+ }
144
+
145
+ _emitStreamUpdated(StreamEventType.LastMiniblockBatchUpdated, abi.encode(miniblockUpdates));
146
+ }
147
+
148
+ /// @inheritdoc IStreamRegistry
149
+ function placeStreamOnNode(
150
+ bytes32 streamId,
151
+ address nodeAddress
152
+ ) external onlyStream(streamId) onlyNode(msg.sender) {
153
+ Stream storage stream = ds.streamById[streamId];
154
+ address[] storage nodes = stream.nodes;
155
+
156
+ ds.streamIdsByNode[nodeAddress].add(streamId);
157
+
158
+ // validate that the node is not already on the stream
159
+ uint256 nodeCount = nodes.length;
160
+
161
+ for (uint256 i; i < nodeCount; ++i) {
162
+ if (nodes[i] == nodeAddress) {
163
+ RiverRegistryErrors.ALREADY_EXISTS.revertWith();
164
+ }
165
+ }
166
+
167
+ nodes.push(nodeAddress);
168
+ stream.reserved0 = _calculateStreamReserved0(stream.reserved0, uint8(nodes.length));
169
+
170
+ _emitStreamUpdated(StreamEventType.PlacementUpdated, abi.encode(streamId, stream));
171
+ }
172
+
173
+ /// @inheritdoc IStreamRegistry
174
+ function removeStreamFromNode(
175
+ bytes32 streamId,
176
+ address nodeAddress
177
+ ) external onlyStream(streamId) onlyNode(msg.sender) {
178
+ Stream storage stream = ds.streamById[streamId];
179
+ address[] storage nodes = stream.nodes;
180
+
181
+ ds.streamIdsByNode[nodeAddress].remove(streamId);
182
+
183
+ bool found = false;
184
+ uint256 nodeCount = nodes.length;
185
+
186
+ for (uint256 i; i < nodeCount; ++i) {
187
+ if (nodes[i] == nodeAddress) {
188
+ nodes[i] = nodes[nodeCount - 1];
189
+ nodes.pop();
190
+ found = true;
191
+ break;
192
+ }
193
+ }
194
+
195
+ if (!found) RiverRegistryErrors.NODE_NOT_FOUND.revertWith();
196
+
197
+ stream.reserved0 = _calculateStreamReserved0(stream.reserved0, uint8(nodes.length));
198
+
199
+ _emitStreamUpdated(StreamEventType.PlacementUpdated, abi.encode(streamId, stream));
200
+ }
201
+
202
+ /// @inheritdoc IStreamRegistry
203
+ function syncNodesOnStreams(uint256 start, uint256 stop) external {
204
+ uint256 end;
205
+ unchecked {
206
+ uint256 streamCount = ds.streams.length();
207
+ uint256 maxStreamIndex = FixedPointMathLib.min(stop, streamCount);
208
+ uint256 count = FixedPointMathLib.zeroFloorSub(maxStreamIndex, start);
209
+ end = start + count;
210
+ }
211
+
212
+ unchecked {
213
+ for (; start < end; ++start) {
214
+ bytes32 streamId = ds.streams.at(start);
215
+ Stream storage stream = ds.streamById[streamId];
216
+ _addStreamIdToNodes(streamId, stream.nodes);
217
+ }
218
+ }
219
+ }
220
+
221
+ /// @inheritdoc IStreamRegistry
222
+ function setStreamReplicationFactor(
223
+ SetStreamReplicationFactor[] calldata requests
224
+ ) external onlyConfigurationManager(msg.sender) {
225
+ uint256 requestsCount = requests.length;
226
+
227
+ if (requestsCount == 0) RiverRegistryErrors.BAD_ARG.revertWith();
228
+
229
+ for (uint256 i; i < requestsCount; ++i) {
230
+ SetStreamReplicationFactor calldata req = requests[i];
231
+
232
+ if (req.replicationFactor == 0 || req.replicationFactor > req.nodes.length) {
233
+ RiverRegistryErrors.BAD_ARG.revertWith();
234
+ }
235
+
236
+ _verifyStreamIdExists(req.streamId);
237
+ Stream storage stream = ds.streamById[req.streamId];
238
+
239
+ // remove the stream from the existing set of nodes
240
+ _removeStreamIdFromNodes(req.streamId, stream.nodes);
241
+
242
+ // place stream on the new set of nodes
243
+ _addStreamIdToNodes(req.streamId, req.nodes);
244
+
245
+ (stream.nodes, stream.reserved0) = (
246
+ req.nodes,
247
+ _calculateStreamReserved0(stream.reserved0, req.replicationFactor)
248
+ );
249
+
250
+ _emitStreamUpdated(StreamEventType.PlacementUpdated, abi.encode(req.streamId, stream));
251
+ }
252
+ }
253
+
254
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
255
+ /* GETTERS */
256
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
257
+
258
+ /// @inheritdoc IStreamRegistry
259
+ function isStream(bytes32 streamId) external view returns (bool) {
260
+ return ds.streams.contains(streamId);
261
+ }
262
+
263
+ /// @inheritdoc IStreamRegistry
264
+ function getStream(bytes32 streamId) external view returns (Stream memory stream) {
265
+ assembly ("memory-safe") {
266
+ // By default, memory has been implicitly allocated for `stream`.
267
+ // But we don't need this implicitly allocated memory.
268
+ // So we just set the free memory pointer to what it was before `stream` has been
269
+ // allocated.
270
+ mstore(0x40, stream)
271
+ }
272
+ _verifyStreamIdExists(streamId);
273
+ stream = ds.streamById[streamId];
274
+ }
275
+
276
+ /// @inheritdoc IStreamRegistry
277
+ function getStreamWithGenesis(
278
+ bytes32 streamId
279
+ ) external view returns (Stream memory stream, bytes32, bytes memory) {
280
+ assembly ("memory-safe") {
281
+ mstore(0x40, stream)
282
+ }
283
+ _verifyStreamIdExists(streamId);
284
+
285
+ return (
286
+ ds.streamById[streamId],
287
+ ds.genesisMiniblockHashByStreamId[streamId],
288
+ ds.genesisMiniblockByStreamId[streamId]
289
+ );
290
+ }
291
+
292
+ /// @inheritdoc IStreamRegistry
293
+ function getStreamCount() external view returns (uint256) {
294
+ return ds.streams.length();
295
+ }
296
+
297
+ /// @inheritdoc IStreamRegistry
298
+ function getStreamCountOnNode(address nodeAddress) external view returns (uint256 count) {
299
+ count = ds.streamIdsByNode[nodeAddress].length();
300
+ }
301
+
302
+ /// @inheritdoc IStreamRegistry
303
+ function getPaginatedStreamsOnNode(
304
+ address nodeAddress,
305
+ uint256 start,
306
+ uint256 stop
307
+ ) external view returns (StreamWithId[] memory streams) {
308
+ EnumerableSet.Bytes32Set storage streamIds = ds.streamIdsByNode[nodeAddress];
309
+ uint256 streamCount = streamIds.length();
310
+ uint256 maxStreamIndex = FixedPointMathLib.min(stop, streamCount);
311
+ uint256 count = FixedPointMathLib.zeroFloorSub(maxStreamIndex, start);
312
+
313
+ streams = new StreamWithId[](count);
314
+ for (uint256 i; i < count; ++i) {
315
+ StreamWithId memory stream = streams[i];
316
+ unchecked {
317
+ stream.id = streamIds.at(start + i);
318
+ }
319
+ stream.stream = ds.streamById[stream.id];
320
+ }
321
+ }
322
+
323
+ /// @inheritdoc IStreamRegistry
324
+ function getPaginatedStreams(
325
+ uint256 start,
326
+ uint256 stop
327
+ ) external view returns (StreamWithId[] memory, bool) {
328
+ uint256 streamCount = ds.streams.length();
329
+ uint256 maxStreamIndex = FixedPointMathLib.min(stop, streamCount);
330
+ uint256 count = FixedPointMathLib.zeroFloorSub(maxStreamIndex, start);
331
+
332
+ StreamWithId[] memory streams = new StreamWithId[](count);
333
+ for (uint256 i; i < count; ++i) {
334
+ StreamWithId memory stream = streams[i];
335
+ unchecked {
336
+ stream.id = ds.streams.at(start + i);
337
+ }
338
+ stream.stream = ds.streamById[stream.id];
339
+ }
340
+
341
+ return (streams, stop >= streamCount);
342
+ }
343
+
344
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
345
+ /* INTERNAL */
346
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
347
+
348
+ /// @dev Adds a stream id to the nodes
349
+ function _addStreamIdToNodes(bytes32 streamId, address[] storage nodes) internal {
350
+ uint256 nodeCount = nodes.length;
351
+ for (uint256 i; i < nodeCount; ++i) {
352
+ ds.streamIdsByNode[nodes[i]].add(streamId);
353
+ }
354
+ }
355
+
356
+ /// @dev Adds a stream id to the nodes
357
+ function _addStreamIdToNodes(bytes32 streamId, address[] calldata nodes) internal {
358
+ for (uint256 i; i < nodes.length; ++i) {
359
+ ds.streamIdsByNode[nodes[i]].add(streamId);
360
+ }
361
+ }
362
+
363
+ /// @dev Removes a stream id from the nodes
364
+ function _removeStreamIdFromNodes(bytes32 streamId, address[] storage nodes) internal {
365
+ uint256 nodeCount = nodes.length;
366
+ for (uint256 i; i < nodeCount; ++i) {
367
+ ds.streamIdsByNode[nodes[i]].remove(streamId);
368
+ }
369
+ }
370
+
371
+ /// @dev Emits the StreamUpdated event without memory expansion
372
+ function _emitStreamUpdated(StreamEventType eventType, bytes memory data) internal {
373
+ bytes32 topic0 = StreamUpdated.selector;
374
+ assembly ("memory-safe") {
375
+ // cache the word before for abi encoding offset
376
+ let offset := sub(data, 0x20)
377
+ let cache := mload(offset)
378
+ // the event arg is encoded as | 0x20 | data length | data
379
+ mstore(offset, 0x20)
380
+ log2(offset, add(mload(data), 0x40), topic0, eventType)
381
+ mstore(offset, cache)
382
+ }
383
+ }
384
+
385
+ uint64 internal constant STREAM_REPL_FACTOR_MASK = 0xFF;
386
+
387
+ /// @dev helper function to calculate the reserved0 field for the stream with the given
388
+ /// reserved0
389
+ /// and replication factor
390
+ function _calculateStreamReserved0(
391
+ uint64 reserved0,
392
+ uint8 replFactor
393
+ ) internal pure returns (uint64) {
394
+ return (reserved0 & ~STREAM_REPL_FACTOR_MASK) | uint64(replFactor);
395
+ }
396
+ }
@@ -0,0 +1,24 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // interfaces
5
+
6
+ // libraries
7
+
8
+ // contracts
9
+
10
+ library RiverRegistryErrors {
11
+ // =============================================================
12
+ // Errors
13
+ // =============================================================
14
+ string internal constant ALREADY_EXISTS = "ALREADY_EXISTS";
15
+ string internal constant OPERATOR_NOT_FOUND = "OPERATOR_NOT_FOUND";
16
+ string internal constant NODE_NOT_FOUND = "NODE_NOT_FOUND";
17
+ string internal constant NOT_FOUND = "NOT_FOUND";
18
+ string internal constant OUT_OF_BOUNDS = "OUT_OF_BOUNDS";
19
+ string internal constant BAD_ARG = "BAD_ARG";
20
+ string internal constant BAD_AUTH = "BAD_AUTH";
21
+ string internal constant INVALID_STREAM_ID = "INVALID_STREAM_ID";
22
+ string internal constant STREAM_SEALED = "STREAM_SEALED";
23
+ string internal constant NODE_STATE_NOT_ALLOWED = "NODE_STATE_NOT_ALLOWED";
24
+ }
@@ -0,0 +1,181 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.23;
3
+
4
+ // libraries
5
+ import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
6
+
7
+ import {RiverRegistryErrors} from "src/river/registry/libraries/RegistryErrors.sol";
8
+ import {CustomRevert} from "src/utils/libraries/CustomRevert.sol";
9
+
10
+ struct Stream {
11
+ bytes32 lastMiniblockHash; // 32 bytes, slot 0
12
+ uint64 lastMiniblockNum; // 8 bytes, part of slot 1
13
+ uint64 reserved0; // 8 bytes, part of slot 1, last 8 bits are used for replication factor
14
+ uint64 flags; // 8 bytes, part of slot 1
15
+ address[] nodes; // Dynamic array, starts at a new slot
16
+ }
17
+
18
+ struct StreamWithId {
19
+ bytes32 id; // 32 bytes, slot 0
20
+ Stream stream;
21
+ }
22
+
23
+ struct SetMiniblock {
24
+ bytes32 streamId;
25
+ bytes32 prevMiniBlockHash;
26
+ bytes32 lastMiniblockHash;
27
+ uint64 lastMiniblockNum;
28
+ bool isSealed;
29
+ }
30
+
31
+ struct SetStreamReplicationFactor {
32
+ bytes32 streamId;
33
+ address[] nodes;
34
+ uint8 replicationFactor;
35
+ }
36
+
37
+ enum NodeStatus {
38
+ NotInitialized, // Initial entry, node is not contacted in any way
39
+ RemoteOnly, // Node proxies data, does not store any data
40
+ Operational, // Node servers existing data, accepts stream creation
41
+ Failed, // Node crash-exited, can be set by DAO
42
+ Departing, // Node continues to serve traffic, new streams are not allocated, data needs to be
43
+ // moved out to other nodes before grace period.
44
+ Deleted // Final state before RemoveNode can be called
45
+ }
46
+
47
+ struct Node {
48
+ NodeStatus status; // 1 byte (but will be padded to fit into 32 bytes if stored directly)
49
+ string url; // dynamically sized, points to a separate location
50
+ address nodeAddress; // 20 bytes
51
+ address operator; // 20 bytes
52
+ }
53
+
54
+ /**
55
+ * @notice Represents a configuration setting
56
+ * @param key The setting key
57
+ * @param blockNumber The block number on which the setting becomes active
58
+ * @param value The setting value
59
+ */
60
+ struct Setting {
61
+ bytes32 key;
62
+ uint64 blockNumber;
63
+ bytes value;
64
+ }
65
+
66
+ struct AppStorage {
67
+ // Ids of all streams in the system
68
+ EnumerableSet.Bytes32Set streams;
69
+ // Map of streamId to stream struct
70
+ mapping(bytes32 => Stream) streamById;
71
+ // Map of streamId to genesis miniblock bytes, only set if stream's miniblock num is 0
72
+ mapping(bytes32 => bytes) genesisMiniblockByStreamId;
73
+ // Mapf of streamId to genesis miniblock hash
74
+ mapping(bytes32 => bytes32) genesisMiniblockHashByStreamId;
75
+ // Set of addresses of all nodes in the system
76
+ EnumerableSet.AddressSet nodes;
77
+ // Map of node address to node struct
78
+ mapping(address => Node) nodeByAddress;
79
+ // Set of addresses of all operators in the system
80
+ EnumerableSet.AddressSet operators;
81
+ // Set of all configuration keys
82
+ EnumerableSet.Bytes32Set configurationKeys;
83
+ // Set of all configuration settings
84
+ mapping(bytes32 => Setting[]) configuration;
85
+ // Set of addresses of all configuration managers
86
+ EnumerableSet.AddressSet configurationManagers;
87
+ // Deprecated slot. Do not use.
88
+ uint256 deprecatedSlot;
89
+ // Map of node address to its stream ids
90
+ mapping(address => EnumerableSet.Bytes32Set) streamIdsByNode;
91
+ }
92
+
93
+ library RiverRegistryStorage {
94
+ function layout() internal pure returns (AppStorage storage s) {
95
+ assembly {
96
+ s.slot := 0
97
+ }
98
+ }
99
+ }
100
+
101
+ abstract contract RegistryModifiers {
102
+ using EnumerableSet for EnumerableSet.AddressSet;
103
+ using EnumerableSet for EnumerableSet.Bytes32Set;
104
+ using CustomRevert for string;
105
+
106
+ AppStorage internal ds;
107
+
108
+ modifier onlyNode(address node) {
109
+ if (ds.nodeByAddress[node].nodeAddress == address(0)) {
110
+ RiverRegistryErrors.NODE_NOT_FOUND.revertWith();
111
+ }
112
+ _;
113
+ }
114
+
115
+ modifier onlyRegisteredNodes(address[] calldata nodes) {
116
+ _verifyNodes(nodes);
117
+ _;
118
+ }
119
+
120
+ modifier onlyOperator(address operator) {
121
+ if (!ds.operators.contains(operator)) {
122
+ RiverRegistryErrors.BAD_AUTH.revertWith();
123
+ }
124
+ _;
125
+ }
126
+
127
+ modifier onlyStream(bytes32 streamId) {
128
+ _verifyStreamIdExists(streamId);
129
+ _;
130
+ }
131
+
132
+ modifier onlyStreamNotExists(bytes32 streamId) {
133
+ _verifyStreamIdNotExists(streamId);
134
+ _;
135
+ }
136
+
137
+ modifier onlyNodeOperator(address node, address operator) {
138
+ if (ds.nodeByAddress[node].operator != operator) {
139
+ RiverRegistryErrors.BAD_AUTH.revertWith();
140
+ }
141
+ _;
142
+ }
143
+
144
+ modifier configKeyExists(bytes32 key) {
145
+ if (!ds.configurationKeys.contains(key)) {
146
+ RiverRegistryErrors.NOT_FOUND.revertWith();
147
+ }
148
+ _;
149
+ }
150
+
151
+ modifier onlyConfigurationManager(address manager) {
152
+ if (!ds.configurationManagers.contains(manager)) {
153
+ RiverRegistryErrors.BAD_AUTH.revertWith();
154
+ }
155
+ _;
156
+ }
157
+
158
+ /// @dev Verifies that the streamId is in the registry
159
+ function _verifyStreamIdExists(bytes32 streamId) internal view {
160
+ if (!ds.streams.contains(streamId)) {
161
+ RiverRegistryErrors.NOT_FOUND.revertWith();
162
+ }
163
+ }
164
+
165
+ /// @dev Verifies that the streamId is not in the registry
166
+ function _verifyStreamIdNotExists(bytes32 streamId) internal view {
167
+ if (ds.streams.contains(streamId)) {
168
+ RiverRegistryErrors.ALREADY_EXISTS.revertWith();
169
+ }
170
+ }
171
+
172
+ /// @dev Verifies that the nodes are in the registry
173
+ function _verifyNodes(address[] calldata nodes) internal view {
174
+ uint256 nodeCount = nodes.length;
175
+ for (uint256 i; i < nodeCount; ++i) {
176
+ if (!ds.nodes.contains(nodes[i])) {
177
+ RiverRegistryErrors.NODE_NOT_FOUND.revertWith();
178
+ }
179
+ }
180
+ }
181
+ }