@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.
- package/LICENSE.txt +21 -0
- package/README.md +206 -0
- package/docs/permitAndStake_integration_guide.md +266 -0
- package/docs/swap_integration_guide.md +591 -0
- package/package.json +57 -0
- package/scripts/common/DeployBase.s.sol +26 -0
- package/scripts/common/DeployFacet.s.sol +7 -0
- package/scripts/common/Deployer.s.sol +33 -0
- package/scripts/common/Interaction.s.sol +51 -0
- package/scripts/deployments/diamonds/DeployAppRegistry.s.sol +168 -0
- package/scripts/deployments/diamonds/DeployBaseRegistry.s.sol +263 -0
- package/scripts/deployments/diamonds/DeployRiverAirdrop.s.sol +203 -0
- package/scripts/deployments/diamonds/DeployRiverMigration.s.sol +129 -0
- package/scripts/deployments/diamonds/DeployRiverRegistry.s.sol +175 -0
- package/scripts/deployments/diamonds/DeploySpace.s.sol +285 -0
- package/scripts/deployments/diamonds/DeploySpaceFactory.s.sol +416 -0
- package/scripts/deployments/diamonds/DeploySpaceOwner.s.sol +183 -0
- package/scripts/deployments/diamonds/DeploySwapRouter.s.sol +176 -0
- package/scripts/deployments/diamonds/IDiamondInitHelper.sol +11 -0
- package/scripts/deployments/facets/DeployAppAccount.s.sol +51 -0
- package/scripts/deployments/facets/DeployAppRegistryFacet.s.sol +69 -0
- package/scripts/deployments/facets/DeployArchitect.s.sol +51 -0
- package/scripts/deployments/facets/DeployAttestationRegistry.s.sol +36 -0
- package/scripts/deployments/facets/DeployBanning.s.sol +30 -0
- package/scripts/deployments/facets/DeployChannels.s.sol +35 -0
- package/scripts/deployments/facets/DeployCreateSpace.s.sol +42 -0
- package/scripts/deployments/facets/DeployDropFacet.s.sol +49 -0
- package/scripts/deployments/facets/DeployERC721A.s.sol +48 -0
- package/scripts/deployments/facets/DeployERC721ANonTransferable.s.sol +49 -0
- package/scripts/deployments/facets/DeployERC721AQueryable.s.sol +30 -0
- package/scripts/deployments/facets/DeployEntitlementChecker.s.sol +49 -0
- package/scripts/deployments/facets/DeployEntitlementDataQueryable.s.sol +29 -0
- package/scripts/deployments/facets/DeployEntitlementsManager.s.sol +33 -0
- package/scripts/deployments/facets/DeployExecutorFacet.s.sol +60 -0
- package/scripts/deployments/facets/DeployFeatureManager.s.sol +38 -0
- package/scripts/deployments/facets/DeployGuardianFacet.s.sol +39 -0
- package/scripts/deployments/facets/DeployImplementationRegistry.s.sol +36 -0
- package/scripts/deployments/facets/DeployMainnetDelegation.s.sol +43 -0
- package/scripts/deployments/facets/DeployMembership.s.sol +77 -0
- package/scripts/deployments/facets/DeployMembershipMetadata.s.sol +30 -0
- package/scripts/deployments/facets/DeployMembershipToken.s.sol +47 -0
- package/scripts/deployments/facets/DeployMerkleAirdrop.s.sol +37 -0
- package/scripts/deployments/facets/DeployMetadata.s.sol +39 -0
- package/scripts/deployments/facets/DeployMockLegacyArchitect.s.sol +33 -0
- package/scripts/deployments/facets/DeployNodeOperator.s.sol +49 -0
- package/scripts/deployments/facets/DeployNodeRegistry.s.sol +37 -0
- package/scripts/deployments/facets/DeployOperatorRegistry.s.sol +36 -0
- package/scripts/deployments/facets/DeployPartnerRegistry.s.sol +41 -0
- package/scripts/deployments/facets/DeployPlatformRequirements.s.sol +75 -0
- package/scripts/deployments/facets/DeployPrepayFacet.s.sol +31 -0
- package/scripts/deployments/facets/DeployPricingModules.s.sol +36 -0
- package/scripts/deployments/facets/DeployReferrals.s.sol +34 -0
- package/scripts/deployments/facets/DeployReviewFacet.s.sol +31 -0
- package/scripts/deployments/facets/DeployRewardsDistributionV2.s.sol +76 -0
- package/scripts/deployments/facets/DeployRiverConfig.s.sol +41 -0
- package/scripts/deployments/facets/DeployRoles.s.sol +48 -0
- package/scripts/deployments/facets/DeploySchemaRegistry.s.sol +35 -0
- package/scripts/deployments/facets/DeploySignerFacet.s.sol +47 -0
- package/scripts/deployments/facets/DeploySimpleApp.s.sol +10 -0
- package/scripts/deployments/facets/DeploySpaceDelegation.s.sol +43 -0
- package/scripts/deployments/facets/DeploySpaceEntitlementGated.s.sol +31 -0
- package/scripts/deployments/facets/DeploySpaceFactoryInit.s.sol +33 -0
- package/scripts/deployments/facets/DeploySpaceOwnerFacet.s.sol +71 -0
- package/scripts/deployments/facets/DeployStreamRegistry.s.sol +50 -0
- package/scripts/deployments/facets/DeploySwapFacet.s.sol +33 -0
- package/scripts/deployments/facets/DeploySwapRouterFacet.s.sol +38 -0
- package/scripts/deployments/facets/DeployTipping.s.sol +31 -0
- package/scripts/deployments/facets/DeployTokenMigration.s.sol +40 -0
- package/scripts/deployments/facets/DeployTownsPoints.s.sol +53 -0
- package/scripts/deployments/facets/DeployTreasury.s.sol +30 -0
- package/scripts/deployments/facets/DeployUpgradeableBeacon.s.sol +34 -0
- package/scripts/deployments/facets/DeployWalletLink.s.sol +56 -0
- package/scripts/deployments/facets/DeployXChain.s.sol +35 -0
- package/scripts/deployments/utils/DeployAccountFactory.s.sol +40 -0
- package/scripts/deployments/utils/DeployEntitlementGatedExample.s.sol +23 -0
- package/scripts/deployments/utils/DeployEntrypoint.s.sol +28 -0
- package/scripts/deployments/utils/DeployMember.s.sol +95 -0
- package/scripts/deployments/utils/DeployMockDiamond.s.sol +7 -0
- package/scripts/deployments/utils/DeployMockERC20.s.sol +24 -0
- package/scripts/deployments/utils/DeployMockERC721A.s.sol +45 -0
- package/scripts/deployments/utils/DeployMockLegacyMembership.s.sol +29 -0
- package/scripts/deployments/utils/DeployMockMessenger.s.sol +42 -0
- package/scripts/deployments/utils/DeployMockNFT.s.sol +86 -0
- package/scripts/deployments/utils/DeployPoapEntitlement.s.sol +16 -0
- package/scripts/deployments/utils/DeployProxyBatchDelegation.s.sol +112 -0
- package/scripts/deployments/utils/DeploySpaceProxyInitializer.s.sol +28 -0
- package/scripts/deployments/utils/DeployTieredLogPricingV2.s.sol +23 -0
- package/scripts/deployments/utils/DeployTieredLogPricingV3.s.sol +23 -0
- package/scripts/deployments/utils/DeployTownsBase.s.sol +95 -0
- package/scripts/deployments/utils/DeployTownsMainnet.s.sol +66 -0
- package/scripts/deployments/utils/DeployTownsMulti.s.sol +53 -0
- package/scripts/deployments/utils/DeployWrappedTowns.s.sol +52 -0
- package/scripts/deployments/utils/LibLayerZeroValues.sol +34 -0
- package/scripts/deployments/utils/pricing/TieredLogPricing.s.sol +45 -0
- package/scripts/interactions/InteractAirdrop.s.sol +57 -0
- package/scripts/interactions/InteractAlphaPost.s.sol +32 -0
- package/scripts/interactions/InteractAlphaSparse.s.sol +173 -0
- package/scripts/interactions/InteractBaseAlpha.s.sol +84 -0
- package/scripts/interactions/InteractBaseBridge.s.sol +48 -0
- package/scripts/interactions/InteractBridgeLayerZero.s.sol +102 -0
- package/scripts/interactions/InteractClaimCondition.s.sol +56 -0
- package/scripts/interactions/InteractCreateSpace.s.sol +50 -0
- package/scripts/interactions/InteractDiamondCut.s.sol +47 -0
- package/scripts/interactions/InteractDropFacet.s.sol +32 -0
- package/scripts/interactions/InteractEnableNewSnapshotFormat.s.sol +27 -0
- package/scripts/interactions/InteractEnableNode2NodeAuth.s.sol +27 -0
- package/scripts/interactions/InteractMembership.s.sol +42 -0
- package/scripts/interactions/InteractMockERC721A.s.sol +20 -0
- package/scripts/interactions/InteractNodeOperators.s.sol +41 -0
- package/scripts/interactions/InteractPostDeploy.s.sol +59 -0
- package/scripts/interactions/InteractPrepay.s.sol +30 -0
- package/scripts/interactions/InteractRegisterApp.s.sol +61 -0
- package/scripts/interactions/InteractRiverAlpha.s.sol +30 -0
- package/scripts/interactions/InteractRiverAlphaSparse.s.sol +117 -0
- package/scripts/interactions/InteractRiverMainnet.s.sol +27 -0
- package/scripts/interactions/InteractRiverRegistry.s.sol +36 -0
- package/scripts/interactions/InteractRiverRegistrySetBlocklist.s.sol +30 -0
- package/scripts/interactions/InteractRiverRegistrySetFreq.s.sol +27 -0
- package/scripts/interactions/InteractRiverRegistrySetRepl.s.sol +30 -0
- package/scripts/interactions/InteractSetDefaultUri.s.sol +20 -0
- package/scripts/interactions/InteractSetDefaultUriLocalhost.s.sol +19 -0
- package/scripts/interactions/InteractTransferOwnership.s.sol +21 -0
- package/scripts/interactions/InteractUpdateMbRecencyCheck.s.sol +27 -0
- package/scripts/interactions/InteractUpdateMediaChunkCount.s.sol +27 -0
- package/scripts/interactions/InteractUpdateMediaChunkSize.s.sol +27 -0
- package/scripts/interactions/helpers/AlphaHelper.sol +149 -0
- package/scripts/interactions/helpers/RiverConfigValues.sol +22 -0
- package/scripts/interactions/interfaces/IL1StandardBridge.sol +35 -0
- package/scripts/interactions/interfaces/IL2StandardBridge.sol +69 -0
- package/src/airdrop/drop/DropBase.sol +210 -0
- package/src/airdrop/drop/DropClaim.sol +55 -0
- package/src/airdrop/drop/DropFacet.sol +176 -0
- package/src/airdrop/drop/DropGroup.sol +111 -0
- package/src/airdrop/drop/DropStorage.sol +23 -0
- package/src/airdrop/drop/IDropFacet.sol +136 -0
- package/src/airdrop/points/CheckIn.sol +71 -0
- package/src/airdrop/points/ITownsPoints.sol +64 -0
- package/src/airdrop/points/TownsPoints.sol +196 -0
- package/src/airdrop/points/TownsPointsStorage.sol +22 -0
- package/src/apps/BaseApp.sol +62 -0
- package/src/apps/ITownsApp.sol +28 -0
- package/src/apps/SchemaResolver.sol +170 -0
- package/src/apps/facets/attest/AttestationBase.sol +335 -0
- package/src/apps/facets/attest/AttestationLib.sol +64 -0
- package/src/apps/facets/attest/AttestationRegistry.sol +39 -0
- package/src/apps/facets/attest/AttestationStorage.sol +35 -0
- package/src/apps/facets/attest/IAttestationRegistry.sol +43 -0
- package/src/apps/facets/registry/AppRegistryBase.sol +403 -0
- package/src/apps/facets/registry/AppRegistryFacet.sol +173 -0
- package/src/apps/facets/registry/AppRegistryStorage.sol +53 -0
- package/src/apps/facets/registry/IAppRegistry.sol +159 -0
- package/src/apps/facets/schema/ISchema.sol +14 -0
- package/src/apps/facets/schema/SchemaBase.sol +88 -0
- package/src/apps/facets/schema/SchemaLib.sol +14 -0
- package/src/apps/facets/schema/SchemaRegistry.sol +51 -0
- package/src/apps/facets/schema/SchemaStorage.sol +34 -0
- package/src/apps/helpers/ISimpleApp.sol +51 -0
- package/src/apps/helpers/SimpleApp.sol +97 -0
- package/src/apps/helpers/SimpleAppStorage.sol +27 -0
- package/src/base/registry/facets/checker/EntitlementChecker.sol +237 -0
- package/src/base/registry/facets/checker/EntitlementCheckerStorage.sol +28 -0
- package/src/base/registry/facets/checker/IEntitlementChecker.sol +95 -0
- package/src/base/registry/facets/delegation/ISpaceDelegation.sol +69 -0
- package/src/base/registry/facets/delegation/SpaceDelegationFacet.sol +250 -0
- package/src/base/registry/facets/delegation/SpaceDelegationStorage.sol +35 -0
- package/src/base/registry/facets/distribution/v1/IRewardsDistribution.sol +51 -0
- package/src/base/registry/facets/distribution/v1/RewardsDistribution.sol +439 -0
- package/src/base/registry/facets/distribution/v1/RewardsDistributionStorage.sol +32 -0
- package/src/base/registry/facets/distribution/v2/DelegationProxy.sol +53 -0
- package/src/base/registry/facets/distribution/v2/IRewardsDistribution.sol +372 -0
- package/src/base/registry/facets/distribution/v2/RewardsDistributionBase.sol +299 -0
- package/src/base/registry/facets/distribution/v2/RewardsDistributionStorage.sol +37 -0
- package/src/base/registry/facets/distribution/v2/RewardsDistributionV2.sol +392 -0
- package/src/base/registry/facets/distribution/v2/StakingRewards.sol +466 -0
- package/src/base/registry/facets/mainnet/ICrossDomainMessenger.sol +58 -0
- package/src/base/registry/facets/mainnet/IMainnetDelegation.sol +127 -0
- package/src/base/registry/facets/mainnet/MainnetDelegation.sol +119 -0
- package/src/base/registry/facets/mainnet/MainnetDelegationBase.sol +274 -0
- package/src/base/registry/facets/mainnet/MainnetDelegationStorage.sol +36 -0
- package/src/base/registry/facets/operator/INodeOperator.sol +91 -0
- package/src/base/registry/facets/operator/NodeOperatorFacet.sol +189 -0
- package/src/base/registry/facets/operator/NodeOperatorStorage.sol +39 -0
- package/src/base/registry/facets/xchain/IXChain.sol +54 -0
- package/src/base/registry/facets/xchain/XChain.sol +158 -0
- package/src/base/registry/facets/xchain/XChainCheckLib.sol +105 -0
- package/src/base/registry/facets/xchain/XChainLib.sol +46 -0
- package/src/diamond/facets/beacon/UpgradeableBeacon.sol +38 -0
- package/src/diamond/facets/beacon/UpgradeableBeaconFacet.sol +34 -0
- package/src/diamond/facets/governance/votes/Checkpoints.sol +642 -0
- package/src/diamond/facets/governance/votes/Votes.sol +63 -0
- package/src/diamond/facets/governance/votes/VotesBase.sol +274 -0
- package/src/diamond/facets/governance/votes/VotesStorage.sol +21 -0
- package/src/diamond/facets/governance/votes/enumerable/IVotesEnumerable.sol +38 -0
- package/src/diamond/facets/governance/votes/enumerable/VotesEnumerable.sol +39 -0
- package/src/diamond/facets/governance/votes/enumerable/VotesEnumerableLib.sol +102 -0
- package/src/diamond/facets/metadata/IMetadata.sol +27 -0
- package/src/diamond/facets/metadata/MetadataFacet.sol +71 -0
- package/src/diamond/facets/token/ERC5643/ERC5643.sol +51 -0
- package/src/diamond/facets/token/ERC5643/ERC5643Base.sol +48 -0
- package/src/diamond/facets/token/ERC5643/ERC5643Storage.sol +26 -0
- package/src/diamond/facets/token/ERC5643/IERC5643.sol +44 -0
- package/src/diamond/facets/token/ERC721A/ERC721A.sol +270 -0
- package/src/diamond/facets/token/ERC721A/ERC721ABase.sol +829 -0
- package/src/diamond/facets/token/ERC721A/ERC721ANonTransferable.sol +21 -0
- package/src/diamond/facets/token/ERC721A/ERC721AStorage.sol +115 -0
- package/src/diamond/facets/token/ERC721A/IERC721A.sol +283 -0
- package/src/diamond/facets/token/ERC721A/extensions/ERC721AQueryable.sol +134 -0
- package/src/diamond/facets/token/ERC721A/extensions/IERC721AQueryable.sol +83 -0
- package/src/diamond/utils/Context.sol +19 -0
- package/src/factory/SpaceFactoryInit.sol +17 -0
- package/src/factory/facets/architect/Architect.sol +98 -0
- package/src/factory/facets/architect/ArchitectBase.sol +95 -0
- package/src/factory/facets/architect/ArchitectStorage.sol +28 -0
- package/src/factory/facets/architect/IArchitect.sol +155 -0
- package/src/factory/facets/architect/ImplementationStorage.sol +42 -0
- package/src/factory/facets/architect/pricing/IPricingModules.sol +41 -0
- package/src/factory/facets/architect/pricing/PricingModulesBase.sol +89 -0
- package/src/factory/facets/architect/pricing/PricingModulesFacet.sol +40 -0
- package/src/factory/facets/architect/pricing/PricingModulesStorage.sol +30 -0
- package/src/factory/facets/create/CreateSpace.sol +107 -0
- package/src/factory/facets/create/CreateSpaceLib.sol +335 -0
- package/src/factory/facets/create/ICreateSpace.sol +70 -0
- package/src/factory/facets/feature/FeatureConditionLib.sol +53 -0
- package/src/factory/facets/feature/FeatureManagerFacet.sol +66 -0
- package/src/factory/facets/feature/FeatureManagerLib.sol +168 -0
- package/src/factory/facets/feature/IFeatureManagerFacet.sol +73 -0
- package/src/factory/facets/partner/IPartnerRegistry.sol +56 -0
- package/src/factory/facets/partner/PartnerRegistry.sol +57 -0
- package/src/factory/facets/partner/PartnerRegistryBase.sol +132 -0
- package/src/factory/facets/partner/PartnerRegistryStorage.sol +40 -0
- package/src/factory/facets/platform/requirements/IPlatformRequirements.sol +143 -0
- package/src/factory/facets/platform/requirements/PlatformRequirementsBase.sol +124 -0
- package/src/factory/facets/platform/requirements/PlatformRequirementsFacet.sol +122 -0
- package/src/factory/facets/platform/requirements/PlatformRequirementsStorage.sol +41 -0
- package/src/factory/facets/registry/IImplementationRegistry.sol +46 -0
- package/src/factory/facets/registry/ImplementationRegistry.sol +64 -0
- package/src/factory/facets/registry/ImplementationRegistryStorage.sol +28 -0
- package/src/factory/facets/wallet-link/IWalletLink.sol +218 -0
- package/src/factory/facets/wallet-link/WalletLink.sol +108 -0
- package/src/factory/facets/wallet-link/WalletLinkBase.sol +492 -0
- package/src/factory/facets/wallet-link/interfaces/IDelegateRegistry.sol +63 -0
- package/src/factory/facets/wallet-link/interfaces/IDelegateRegistryV1.sol +35 -0
- package/src/factory/facets/wallet-link/interfaces/ISCL_EIP6565.sol +24 -0
- package/src/factory/facets/wallet-link/libraries/SolanaUtils.sol +161 -0
- package/src/factory/facets/wallet-link/libraries/WalletLib.sol +62 -0
- package/src/river/registry/facets/config/IRiverConfig.sol +117 -0
- package/src/river/registry/facets/config/RiverConfig.sol +174 -0
- package/src/river/registry/facets/node/INodeRegistry.sol +69 -0
- package/src/river/registry/facets/node/NodeRegistry.sol +143 -0
- package/src/river/registry/facets/operator/IOperatorRegistry.sol +28 -0
- package/src/river/registry/facets/operator/OperatorRegistry.sol +86 -0
- package/src/river/registry/facets/stream/IStreamRegistry.sol +184 -0
- package/src/river/registry/facets/stream/StreamRegistry.sol +396 -0
- package/src/river/registry/libraries/RegistryErrors.sol +24 -0
- package/src/river/registry/libraries/RegistryStorage.sol +181 -0
- package/src/router/ISwapRouter.sol +226 -0
- package/src/router/Permit2Hash.sol +92 -0
- package/src/router/SwapRouter.sol +463 -0
- package/src/router/SwapRouterStorage.sol +21 -0
- package/src/spaces/entitlements/ICrossChainEntitlement.sol +22 -0
- package/src/spaces/entitlements/IEntitlement.sol +61 -0
- package/src/spaces/entitlements/PolymarketEntitlement.sol +79 -0
- package/src/spaces/entitlements/poap/IPOAP.sol +26 -0
- package/src/spaces/entitlements/poap/PoapEntitlement.sol +56 -0
- package/src/spaces/entitlements/rule/IRuleEntitlement.sol +174 -0
- package/src/spaces/entitlements/rule/RuleEntitlement.sol +183 -0
- package/src/spaces/entitlements/rule/RuleEntitlementV2.sol +219 -0
- package/src/spaces/entitlements/user/IUserEntitlement.sol +24 -0
- package/src/spaces/entitlements/user/UserEntitlement.sol +273 -0
- package/src/spaces/facets/DependencyLib.sol +60 -0
- package/src/spaces/facets/Entitled.sol +172 -0
- package/src/spaces/facets/Permissions.sol +21 -0
- package/src/spaces/facets/account/AppAccount.sol +93 -0
- package/src/spaces/facets/account/AppAccountBase.sol +275 -0
- package/src/spaces/facets/account/AppAccountStorage.sol +63 -0
- package/src/spaces/facets/account/IAppAccount.sol +71 -0
- package/src/spaces/facets/account/SignerFacet.sol +26 -0
- package/src/spaces/facets/banning/Banning.sol +41 -0
- package/src/spaces/facets/banning/BanningBase.sol +33 -0
- package/src/spaces/facets/banning/BanningStorage.sol +23 -0
- package/src/spaces/facets/banning/IBanning.sol +35 -0
- package/src/spaces/facets/channels/ChannelBase.sol +87 -0
- package/src/spaces/facets/channels/ChannelService.sol +177 -0
- package/src/spaces/facets/channels/ChannelStorage.sol +34 -0
- package/src/spaces/facets/channels/Channels.sol +80 -0
- package/src/spaces/facets/channels/IChannel.sol +98 -0
- package/src/spaces/facets/dispatcher/DispatcherBase.sol +86 -0
- package/src/spaces/facets/dispatcher/DispatcherStorage.sol +21 -0
- package/src/spaces/facets/dispatcher/IDispatcher.sol +6 -0
- package/src/spaces/facets/entitlements/EntitlementsManager.sol +49 -0
- package/src/spaces/facets/entitlements/EntitlementsManagerBase.sol +87 -0
- package/src/spaces/facets/entitlements/EntitlementsManagerService.sol +142 -0
- package/src/spaces/facets/entitlements/EntitlementsManagerStorage.sol +34 -0
- package/src/spaces/facets/entitlements/IEntitlementsManager.sol +67 -0
- package/src/spaces/facets/entitlements/extensions/EntitlementDataQueryable.sol +153 -0
- package/src/spaces/facets/entitlements/extensions/IEntitlementDataQueryable.sol +32 -0
- package/src/spaces/facets/executor/ExecutorBase.sol +564 -0
- package/src/spaces/facets/executor/ExecutorFacet.sol +178 -0
- package/src/spaces/facets/executor/ExecutorStorage.sol +99 -0
- package/src/spaces/facets/executor/GroupLib.sol +128 -0
- package/src/spaces/facets/executor/IExecutor.sol +287 -0
- package/src/spaces/facets/executor/hooks/HookBase.sol +172 -0
- package/src/spaces/facets/executor/hooks/HookLib.sol +38 -0
- package/src/spaces/facets/executor/hooks/IHookBase.sol +48 -0
- package/src/spaces/facets/gated/EntitlementGated.sol +59 -0
- package/src/spaces/facets/gated/EntitlementGatedBase.sol +324 -0
- package/src/spaces/facets/gated/EntitlementGatedStorage.sol +29 -0
- package/src/spaces/facets/gated/IEntitlementGated.sol +55 -0
- package/src/spaces/facets/guardian/GuardianBase.sol +80 -0
- package/src/spaces/facets/guardian/GuardianFacet.sol +43 -0
- package/src/spaces/facets/guardian/GuardianStorage.sol +27 -0
- package/src/spaces/facets/guardian/IGuardian.sol +54 -0
- package/src/spaces/facets/membership/IMembership.sol +216 -0
- package/src/spaces/facets/membership/MembershipBase.sol +272 -0
- package/src/spaces/facets/membership/MembershipFacet.sol +191 -0
- package/src/spaces/facets/membership/MembershipStorage.sol +40 -0
- package/src/spaces/facets/membership/join/MembershipJoin.sol +547 -0
- package/src/spaces/facets/membership/metadata/IMembershipMetadata.sol +9 -0
- package/src/spaces/facets/membership/metadata/MembershipMetadata.sol +32 -0
- package/src/spaces/facets/membership/pricing/IMembershipPricing.sol +18 -0
- package/src/spaces/facets/membership/pricing/fixed/FixedPricing.sol +29 -0
- package/src/spaces/facets/membership/pricing/fixed/FixedPricingStorage.sol +27 -0
- package/src/spaces/facets/membership/pricing/tiered/TieredLogPricingOracleV2.sol +148 -0
- package/src/spaces/facets/membership/pricing/tiered/TieredLogPricingOracleV3.sol +137 -0
- package/src/spaces/facets/membership/token/MembershipToken.sol +25 -0
- package/src/spaces/facets/owner/ISpaceOwner.sol +85 -0
- package/src/spaces/facets/owner/SpaceOwner.sol +174 -0
- package/src/spaces/facets/owner/SpaceOwnerBase.sol +121 -0
- package/src/spaces/facets/owner/SpaceOwnerStorage.sol +41 -0
- package/src/spaces/facets/owner/SpaceOwnerUriBase.sol +54 -0
- package/src/spaces/facets/points/PointsBase.sol +35 -0
- package/src/spaces/facets/prepay/IPrepay.sol +43 -0
- package/src/spaces/facets/prepay/PrepayBase.sol +27 -0
- package/src/spaces/facets/prepay/PrepayFacet.sol +59 -0
- package/src/spaces/facets/prepay/PrepayStorage.sol +26 -0
- package/src/spaces/facets/proxy/ISpaceProxyInitializer.sol +21 -0
- package/src/spaces/facets/proxy/SpaceProxy.sol +15 -0
- package/src/spaces/facets/proxy/SpaceProxyInitializer.sol +55 -0
- package/src/spaces/facets/referrals/IReferrals.sol +98 -0
- package/src/spaces/facets/referrals/ReferralsBase.sol +81 -0
- package/src/spaces/facets/referrals/ReferralsFacet.sol +65 -0
- package/src/spaces/facets/referrals/ReferralsStorage.sol +36 -0
- package/src/spaces/facets/review/IReview.sol +50 -0
- package/src/spaces/facets/review/ReviewFacet.sol +105 -0
- package/src/spaces/facets/review/ReviewStorage.sol +29 -0
- package/src/spaces/facets/roles/IRoles.sol +197 -0
- package/src/spaces/facets/roles/Roles.sol +123 -0
- package/src/spaces/facets/roles/RolesBase.sol +420 -0
- package/src/spaces/facets/roles/RolesStorage.sol +132 -0
- package/src/spaces/facets/swap/ISwapFacet.sol +91 -0
- package/src/spaces/facets/swap/SwapFacet.sol +290 -0
- package/src/spaces/facets/swap/SwapFacetStorage.sol +24 -0
- package/src/spaces/facets/tipping/ITipping.sol +80 -0
- package/src/spaces/facets/tipping/TippingBase.sol +73 -0
- package/src/spaces/facets/tipping/TippingFacet.sol +123 -0
- package/src/spaces/facets/treasury/ITreasury.sol +64 -0
- package/src/spaces/facets/treasury/Treasury.sol +82 -0
- package/src/spaces/facets/xchain/SpaceEntitlementGated.sol +62 -0
- package/src/tokens/Member.sol +246 -0
- package/src/tokens/lock/ILock.sol +42 -0
- package/src/tokens/lock/LockBase.sol +64 -0
- package/src/tokens/lock/LockFacet.sol +44 -0
- package/src/tokens/lock/LockStorage.sol +26 -0
- package/src/tokens/mainnet/claimer/AuthorizedClaimerStorage.sol +26 -0
- package/src/tokens/mainnet/claimer/AuthorizedClaimers.sol +84 -0
- package/src/tokens/mainnet/claimer/IAuthorizedClaimers.sol +36 -0
- package/src/tokens/mainnet/delegation/ProxyBatchDelegation.sol +86 -0
- package/src/tokens/migration/ITokenMigration.sol +35 -0
- package/src/tokens/migration/TokenMigrationFacet.sol +86 -0
- package/src/tokens/migration/TokenMigrationStorage.sol +27 -0
- package/src/tokens/towns/base/IERC7802.sol +30 -0
- package/src/tokens/towns/base/IOptimismMintableERC20.sol +31 -0
- package/src/tokens/towns/base/ISemver.sol +13 -0
- package/src/tokens/towns/base/Towns.sol +283 -0
- package/src/tokens/towns/base/TownsDeployer.sol +32 -0
- package/src/tokens/towns/base/TownsLib.sol +31 -0
- package/src/tokens/towns/base/versions/TownsV2.sol +15 -0
- package/src/tokens/towns/mainnet/ITowns.sol +56 -0
- package/src/tokens/towns/mainnet/Towns.sol +220 -0
- package/src/tokens/towns/mainnet/libs/TokenInflationLib.sol +89 -0
- package/src/tokens/towns/multichain/Towns.sol +19 -0
- package/src/tokens/towns/multichain/wTowns.sol +18 -0
- package/src/utils/Airdrop.sol +156 -0
- package/src/utils/airdrop/merkle/IMerkleAirdrop.sol +55 -0
- package/src/utils/airdrop/merkle/MerkleAirdrop.sol +118 -0
- package/src/utils/airdrop/merkle/MerkleAirdropStorage.sol +29 -0
- package/src/utils/interfaces/AggregatorV3Interface.sol +37 -0
- package/src/utils/interfaces/IMulticall.sol +10 -0
- package/src/utils/interfaces/IWETH.sol +10 -0
- package/src/utils/libraries/BasisPoints.sol +24 -0
- package/src/utils/libraries/Create2Utils.sol +74 -0
- package/src/utils/libraries/CurrencyTransfer.sol +99 -0
- package/src/utils/libraries/CustomRevert.sol +49 -0
- package/src/utils/libraries/Factory.sol +66 -0
- package/src/utils/libraries/StringSet.sol +190 -0
- 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
|
+
}
|