@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,177 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IChannelBase} from "./IChannel.sol";
|
|
6
|
+
|
|
7
|
+
// libraries
|
|
8
|
+
import {CustomRevert} from "../../../utils/libraries/CustomRevert.sol";
|
|
9
|
+
import {ChannelStorage} from "./ChannelStorage.sol";
|
|
10
|
+
import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
|
|
11
|
+
import {LibString} from "solady/utils/LibString.sol";
|
|
12
|
+
|
|
13
|
+
// contracts
|
|
14
|
+
|
|
15
|
+
library ChannelService {
|
|
16
|
+
using EnumerableSet for EnumerableSet.UintSet;
|
|
17
|
+
using EnumerableSet for EnumerableSet.Bytes32Set;
|
|
18
|
+
using ChannelStorage for ChannelStorage.Layout;
|
|
19
|
+
using CustomRevert for bytes4;
|
|
20
|
+
using LibString for string;
|
|
21
|
+
|
|
22
|
+
// =============================================================
|
|
23
|
+
// CRUD Operations
|
|
24
|
+
// =============================================================
|
|
25
|
+
|
|
26
|
+
function createChannel(
|
|
27
|
+
bytes32 channelId,
|
|
28
|
+
string calldata metadata,
|
|
29
|
+
uint256[] memory roleIds
|
|
30
|
+
) internal {
|
|
31
|
+
checkChannel(channelId);
|
|
32
|
+
|
|
33
|
+
ChannelStorage.Layout storage channel = ChannelStorage.layout();
|
|
34
|
+
|
|
35
|
+
channel.channelIds.add(channelId);
|
|
36
|
+
ChannelStorage.Channel storage channelInfo = channel.channelById[channelId];
|
|
37
|
+
(channelInfo.id, channelInfo.metadata) = (channelId, metadata);
|
|
38
|
+
|
|
39
|
+
EnumerableSet.UintSet storage roles = channel.rolesByChannelId[channelId];
|
|
40
|
+
for (uint256 i; i < roleIds.length; ++i) {
|
|
41
|
+
// check if role already exists in channel
|
|
42
|
+
if (roles.contains(roleIds[i])) {
|
|
43
|
+
IChannelBase.ChannelService__RoleAlreadyExists.selector.revertWith();
|
|
44
|
+
}
|
|
45
|
+
roles.add(roleIds[i]);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function getChannel(
|
|
50
|
+
bytes32 channelId
|
|
51
|
+
) internal view returns (bytes32 id, string memory metadata, bool disabled) {
|
|
52
|
+
checkChannelExists(channelId);
|
|
53
|
+
|
|
54
|
+
ChannelStorage.Layout storage channel = ChannelStorage.layout();
|
|
55
|
+
ChannelStorage.Channel storage channelInfo = channel.channelById[channelId];
|
|
56
|
+
|
|
57
|
+
id = channelInfo.id;
|
|
58
|
+
metadata = channelInfo.metadata;
|
|
59
|
+
disabled = channelInfo.disabled;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function updateChannel(bytes32 channelId, string calldata metadata, bool disabled) internal {
|
|
63
|
+
checkChannelExists(channelId);
|
|
64
|
+
|
|
65
|
+
ChannelStorage.Layout storage channel = ChannelStorage.layout();
|
|
66
|
+
ChannelStorage.Channel storage channelInfo = channel.channelById[channelId];
|
|
67
|
+
|
|
68
|
+
if (bytes(metadata).length > 0 && !metadata.eq(channelInfo.metadata)) {
|
|
69
|
+
channelInfo.metadata = metadata;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (channelInfo.disabled != disabled) {
|
|
73
|
+
channelInfo.disabled = disabled;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function removeChannel(bytes32 channelId) internal {
|
|
78
|
+
checkChannelExists(channelId);
|
|
79
|
+
|
|
80
|
+
ChannelStorage.Layout storage channel = ChannelStorage.layout();
|
|
81
|
+
|
|
82
|
+
channel.channelIds.remove(channelId);
|
|
83
|
+
delete channel.channelById[channelId];
|
|
84
|
+
|
|
85
|
+
// remove all roles from channel
|
|
86
|
+
channel.rolesByChannelId[channelId].clear();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function getChannelIds() internal view returns (bytes32[] memory) {
|
|
90
|
+
ChannelStorage.Layout storage channel = ChannelStorage.layout();
|
|
91
|
+
return channel.channelIds.values();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function getChannelIdsByRole(
|
|
95
|
+
uint256 roleId
|
|
96
|
+
) internal view returns (bytes32[] memory channelIds) {
|
|
97
|
+
ChannelStorage.Layout storage channel = ChannelStorage.layout();
|
|
98
|
+
|
|
99
|
+
uint256 potentialChannelsLength = channel.channelIds.length();
|
|
100
|
+
uint256 count = 0;
|
|
101
|
+
|
|
102
|
+
channelIds = new bytes32[](potentialChannelsLength);
|
|
103
|
+
|
|
104
|
+
for (uint256 i; i < potentialChannelsLength; ++i) {
|
|
105
|
+
bytes32 channelId = channel.channelIds.at(i);
|
|
106
|
+
|
|
107
|
+
if (channel.rolesByChannelId[channelId].contains(roleId)) {
|
|
108
|
+
unchecked {
|
|
109
|
+
channelIds[count++] = channelId;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// resize the array to the actual number of channels
|
|
115
|
+
assembly ("memory-safe") {
|
|
116
|
+
mstore(channelIds, count)
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function addRoleToChannel(bytes32 channelId, uint256 roleId) internal {
|
|
121
|
+
checkChannelExists(channelId);
|
|
122
|
+
checkChannelNotDisabled(channelId);
|
|
123
|
+
|
|
124
|
+
// check role isn't in channel already
|
|
125
|
+
ChannelStorage.Layout storage channel = ChannelStorage.layout();
|
|
126
|
+
EnumerableSet.UintSet storage roles = channel.rolesByChannelId[channelId];
|
|
127
|
+
if (roles.contains(roleId)) {
|
|
128
|
+
IChannelBase.ChannelService__RoleAlreadyExists.selector.revertWith();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
roles.add(roleId);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function removeRoleFromChannel(bytes32 channelId, uint256 roleId) internal {
|
|
135
|
+
checkChannelExists(channelId);
|
|
136
|
+
checkChannelNotDisabled(channelId);
|
|
137
|
+
|
|
138
|
+
// check role exists in channel
|
|
139
|
+
ChannelStorage.Layout storage channel = ChannelStorage.layout();
|
|
140
|
+
EnumerableSet.UintSet storage roles = channel.rolesByChannelId[channelId];
|
|
141
|
+
if (!roles.contains(roleId)) {
|
|
142
|
+
IChannelBase.ChannelService__RoleDoesNotExist.selector.revertWith();
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
roles.remove(roleId);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function getRolesByChannel(bytes32 channelId) internal view returns (uint256[] memory) {
|
|
149
|
+
checkChannelExists(channelId);
|
|
150
|
+
ChannelStorage.Layout storage channel = ChannelStorage.layout();
|
|
151
|
+
return channel.rolesByChannelId[channelId].values();
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// =============================================================
|
|
155
|
+
// Validators
|
|
156
|
+
// =============================================================
|
|
157
|
+
|
|
158
|
+
function checkChannelNotDisabled(bytes32 channelId) internal view {
|
|
159
|
+
if (ChannelStorage.layout().channelById[channelId].disabled) {
|
|
160
|
+
IChannelBase.ChannelService__ChannelDisabled.selector.revertWith();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function checkChannel(bytes32 channelId) internal view {
|
|
165
|
+
// check that channel exists
|
|
166
|
+
if (ChannelStorage.layout().channelIds.contains(channelId)) {
|
|
167
|
+
IChannelBase.ChannelService__ChannelAlreadyExists.selector.revertWith();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function checkChannelExists(bytes32 channelId) internal view {
|
|
172
|
+
// check that channel exists
|
|
173
|
+
if (!ChannelStorage.layout().channelIds.contains(channelId)) {
|
|
174
|
+
IChannelBase.ChannelService__ChannelDoesNotExist.selector.revertWith();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
|
|
6
|
+
// libraries
|
|
7
|
+
import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
|
|
8
|
+
|
|
9
|
+
// contracts
|
|
10
|
+
|
|
11
|
+
library ChannelStorage {
|
|
12
|
+
// keccak256(abi.encode(uint256(keccak256("spaces.facets.channel.storage")) - 1)) &
|
|
13
|
+
// ~bytes32(uint256(0xff))
|
|
14
|
+
bytes32 internal constant STORAGE_SLOT =
|
|
15
|
+
0x804ad633258ac9b908ae115a2763b3f6e04be3b1165402c872b25af518504300;
|
|
16
|
+
|
|
17
|
+
struct Channel {
|
|
18
|
+
bytes32 id;
|
|
19
|
+
bool disabled;
|
|
20
|
+
string metadata;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
struct Layout {
|
|
24
|
+
EnumerableSet.Bytes32Set channelIds;
|
|
25
|
+
mapping(bytes32 channelId => Channel) channelById;
|
|
26
|
+
mapping(bytes32 channelId => EnumerableSet.UintSet) rolesByChannelId;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function layout() internal pure returns (Layout storage ds) {
|
|
30
|
+
assembly {
|
|
31
|
+
ds.slot := STORAGE_SLOT
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IChannel} from "./IChannel.sol";
|
|
6
|
+
|
|
7
|
+
// libraries
|
|
8
|
+
import {Permissions} from "src/spaces/facets/Permissions.sol";
|
|
9
|
+
|
|
10
|
+
// contracts
|
|
11
|
+
|
|
12
|
+
import {ChannelBase} from "./ChannelBase.sol";
|
|
13
|
+
import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
|
|
14
|
+
import {Entitled} from "src/spaces/facets/Entitled.sol";
|
|
15
|
+
import {RolesBase} from "src/spaces/facets/roles/RolesBase.sol";
|
|
16
|
+
|
|
17
|
+
contract Channels is IChannel, ChannelBase, RolesBase, Entitled, Facet {
|
|
18
|
+
function createChannel(
|
|
19
|
+
bytes32 channelId,
|
|
20
|
+
string calldata metadata,
|
|
21
|
+
uint256[] calldata roleIds
|
|
22
|
+
) external {
|
|
23
|
+
_validatePermission(Permissions.AddRemoveChannels);
|
|
24
|
+
_createChannel(channelId, metadata, roleIds);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function createChannelWithOverridePermissions(
|
|
28
|
+
bytes32 channelId,
|
|
29
|
+
string calldata metadata,
|
|
30
|
+
RolePermissions[] calldata rolePermissions
|
|
31
|
+
) external {
|
|
32
|
+
_validatePermission(Permissions.AddRemoveChannels);
|
|
33
|
+
|
|
34
|
+
uint256[] memory roleIds = new uint256[](rolePermissions.length);
|
|
35
|
+
for (uint256 i; i < rolePermissions.length; ++i) {
|
|
36
|
+
roleIds[i] = rolePermissions[i].roleId;
|
|
37
|
+
}
|
|
38
|
+
_createChannel(channelId, metadata, roleIds);
|
|
39
|
+
|
|
40
|
+
for (uint256 i; i < rolePermissions.length; ++i) {
|
|
41
|
+
_setChannelPermissionOverrides(
|
|
42
|
+
rolePermissions[i].roleId,
|
|
43
|
+
channelId,
|
|
44
|
+
rolePermissions[i].permissions
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function getChannel(bytes32 channelId) external view returns (Channel memory channel) {
|
|
50
|
+
return _getChannel(channelId);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function getChannels() external view returns (Channel[] memory channels) {
|
|
54
|
+
return _getChannels();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function updateChannel(bytes32 channelId, string calldata metadata, bool disabled) external {
|
|
58
|
+
_validatePermission(Permissions.AddRemoveChannels);
|
|
59
|
+
_updateChannel(channelId, metadata, disabled);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function removeChannel(bytes32 channelId) external {
|
|
63
|
+
_validatePermission(Permissions.AddRemoveChannels);
|
|
64
|
+
_removeChannel(channelId);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function addRoleToChannel(bytes32 channelId, uint256 roleId) external {
|
|
68
|
+
_validatePermission(Permissions.AddRemoveChannels);
|
|
69
|
+
_addRoleToChannel(channelId, roleId);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function getRolesByChannel(bytes32 channelId) external view returns (uint256[] memory roleIds) {
|
|
73
|
+
return _getRolesByChannel(channelId);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function removeRoleFromChannel(bytes32 channelId, uint256 roleId) external {
|
|
77
|
+
_validatePermission(Permissions.AddRemoveChannels);
|
|
78
|
+
_removeRoleFromChannel(channelId, roleId);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
|
|
6
|
+
// libraries
|
|
7
|
+
|
|
8
|
+
// contracts
|
|
9
|
+
interface IChannelBase {
|
|
10
|
+
// =============================================================
|
|
11
|
+
// Structs
|
|
12
|
+
// =============================================================
|
|
13
|
+
struct Channel {
|
|
14
|
+
bytes32 id;
|
|
15
|
+
bool disabled;
|
|
16
|
+
string metadata;
|
|
17
|
+
uint256[] roleIds;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
struct RolePermissions {
|
|
21
|
+
uint256 roleId;
|
|
22
|
+
string[] permissions;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// =============================================================
|
|
26
|
+
// Events
|
|
27
|
+
// =============================================================
|
|
28
|
+
event ChannelCreated(address indexed caller, bytes32 channelId);
|
|
29
|
+
event ChannelUpdated(address indexed caller, bytes32 channelId);
|
|
30
|
+
event ChannelRemoved(address indexed caller, bytes32 channelId);
|
|
31
|
+
event ChannelRoleAdded(address indexed caller, bytes32 channelId, uint256 roleId);
|
|
32
|
+
event ChannelRoleRemoved(address indexed caller, bytes32 channelId, uint256 roleId);
|
|
33
|
+
|
|
34
|
+
// =============================================================
|
|
35
|
+
// Errors
|
|
36
|
+
// =============================================================
|
|
37
|
+
error ChannelService__ChannelAlreadyExists();
|
|
38
|
+
error ChannelService__ChannelDoesNotExist();
|
|
39
|
+
error ChannelService__ChannelDisabled();
|
|
40
|
+
error ChannelService__RoleAlreadyExists();
|
|
41
|
+
error ChannelService__RoleDoesNotExist();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
interface IChannel is IChannelBase {
|
|
45
|
+
/// @notice creates a channel
|
|
46
|
+
/// @param channelId the channelId of the channel
|
|
47
|
+
/// @param metadata the metadata of the channel
|
|
48
|
+
/// @param roleIds the roleIds to add to the channel
|
|
49
|
+
function createChannel(
|
|
50
|
+
bytes32 channelId,
|
|
51
|
+
string calldata metadata,
|
|
52
|
+
uint256[] calldata roleIds
|
|
53
|
+
) external;
|
|
54
|
+
|
|
55
|
+
/// @notice creates a channel with override permissions
|
|
56
|
+
/// @param channelId the channelId of the channel
|
|
57
|
+
/// @param metadata the metadata of the channel
|
|
58
|
+
/// @param rolePermissions the rolePermissions (role->permissions[])[] to add to the channel
|
|
59
|
+
function createChannelWithOverridePermissions(
|
|
60
|
+
bytes32 channelId,
|
|
61
|
+
string calldata metadata,
|
|
62
|
+
RolePermissions[] calldata rolePermissions
|
|
63
|
+
) external;
|
|
64
|
+
|
|
65
|
+
/// @notice gets a channel
|
|
66
|
+
/// @param channelId the channelId to get
|
|
67
|
+
/// @return channel the channel
|
|
68
|
+
function getChannel(bytes32 channelId) external view returns (Channel memory channel);
|
|
69
|
+
|
|
70
|
+
/// @notice gets all channels
|
|
71
|
+
/// @return channels an array of all channels
|
|
72
|
+
function getChannels() external view returns (Channel[] memory channels);
|
|
73
|
+
|
|
74
|
+
/// @notice updates a channel
|
|
75
|
+
/// @param channelId the channelId to update
|
|
76
|
+
/// @param metadata the new metadata of the channel
|
|
77
|
+
/// @param disabled whether or not the channel is disabled
|
|
78
|
+
function updateChannel(bytes32 channelId, string calldata metadata, bool disabled) external;
|
|
79
|
+
|
|
80
|
+
/// @notice removes a channel
|
|
81
|
+
/// @param channelId the channelId to remove
|
|
82
|
+
function removeChannel(bytes32 channelId) external;
|
|
83
|
+
|
|
84
|
+
/// @notice gets all roles for a channel
|
|
85
|
+
/// @param channelId the channelId to get the roles for
|
|
86
|
+
/// @return roleIds an array of roleIds for the channel
|
|
87
|
+
function getRolesByChannel(bytes32 channelId) external view returns (uint256[] memory roleIds);
|
|
88
|
+
|
|
89
|
+
/// @notice adds a role to a channel
|
|
90
|
+
/// @param channelId the channelId to add the role to
|
|
91
|
+
/// @param roleId the roleId to add to the channel
|
|
92
|
+
function addRoleToChannel(bytes32 channelId, uint256 roleId) external;
|
|
93
|
+
|
|
94
|
+
/// @notice removes a role from a channel
|
|
95
|
+
/// @param channelId the channelId to remove the role from
|
|
96
|
+
/// @param roleId the roleId to remove from the channel
|
|
97
|
+
function removeRoleFromChannel(bytes32 channelId, uint256 roleId) external;
|
|
98
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IDispatcherBase} from "./IDispatcher.sol";
|
|
6
|
+
|
|
7
|
+
// libraries
|
|
8
|
+
import {StoragePointer} from "@towns-protocol/diamond/src/libraries/StoragePointer.sol";
|
|
9
|
+
import {CustomRevert} from "../../../utils/libraries/CustomRevert.sol";
|
|
10
|
+
|
|
11
|
+
// contracts
|
|
12
|
+
import {DispatcherStorage} from "./DispatcherStorage.sol";
|
|
13
|
+
|
|
14
|
+
abstract contract DispatcherBase is IDispatcherBase {
|
|
15
|
+
using CustomRevert for bytes4;
|
|
16
|
+
using StoragePointer for mapping(bytes32 => bytes);
|
|
17
|
+
|
|
18
|
+
function _deleteCapturedData(bytes32 transactionId) internal {
|
|
19
|
+
DispatcherStorage.Layout storage ds = DispatcherStorage.layout();
|
|
20
|
+
delete ds.transactionData.get(transactionId).value;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function _getCapturedData(bytes32 transactionId) internal view returns (bytes storage) {
|
|
24
|
+
DispatcherStorage.Layout storage ds = DispatcherStorage.layout();
|
|
25
|
+
return ds.transactionData.get(transactionId).value;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function _captureValue(bytes32 transactionId) internal {
|
|
29
|
+
DispatcherStorage.Layout storage ds = DispatcherStorage.layout();
|
|
30
|
+
ds.transactionBalance[transactionId] += msg.value;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function _releaseCapturedValue(bytes32 transactionId, uint256 value) internal {
|
|
34
|
+
DispatcherStorage.Layout storage ds = DispatcherStorage.layout();
|
|
35
|
+
ds.transactionBalance[transactionId] -= value;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function _getCapturedValue(bytes32 transactionId) internal view returns (uint256) {
|
|
39
|
+
DispatcherStorage.Layout storage ds = DispatcherStorage.layout();
|
|
40
|
+
return ds.transactionBalance[transactionId];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function _dispatchNonce(bytes32 keyHash) internal view returns (uint256) {
|
|
44
|
+
DispatcherStorage.Layout storage ds = DispatcherStorage.layout();
|
|
45
|
+
return ds.transactionNonce[keyHash];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function _useDispatchNonce(bytes32 keyHash) internal returns (uint256) {
|
|
49
|
+
DispatcherStorage.Layout storage ds = DispatcherStorage.layout();
|
|
50
|
+
return ds.transactionNonce[keyHash]++;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function _makeDispatchInputSeed(
|
|
54
|
+
bytes32 keyHash,
|
|
55
|
+
address requester,
|
|
56
|
+
uint256 nonce
|
|
57
|
+
) internal pure returns (uint256) {
|
|
58
|
+
return uint256(keccak256(abi.encode(keyHash, requester, nonce)));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function _makeDispatchId(bytes32 keyHash, uint256 inputSeed) internal pure returns (bytes32) {
|
|
62
|
+
return keccak256(abi.encodePacked(keyHash, inputSeed));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function _registerTransaction(
|
|
66
|
+
address sender,
|
|
67
|
+
bytes memory data
|
|
68
|
+
) internal returns (bytes32 transactionId) {
|
|
69
|
+
bytes32 keyHash = keccak256(abi.encodePacked(sender, block.number));
|
|
70
|
+
|
|
71
|
+
transactionId = _makeDispatchId(
|
|
72
|
+
keyHash,
|
|
73
|
+
_makeDispatchInputSeed(keyHash, sender, _useDispatchNonce(keyHash))
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
DispatcherStorage.Layout storage ds = DispatcherStorage.layout();
|
|
77
|
+
StoragePointer.Bytes storage capturedDataRef = ds.transactionData.get(transactionId);
|
|
78
|
+
// revert if the transaction already exists
|
|
79
|
+
if (capturedDataRef.value.length > 0) {
|
|
80
|
+
Dispatcher__TransactionAlreadyExists.selector.revertWith();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
capturedDataRef.value = data;
|
|
84
|
+
if (msg.value != 0) _captureValue(transactionId);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
library DispatcherStorage {
|
|
5
|
+
// keccak256(abi.encode(uint256(keccak256("spaces.facets.dispatcher.storage")) - 1)) &
|
|
6
|
+
// ~bytes32(uint256(0xff))
|
|
7
|
+
bytes32 internal constant STORAGE_SLOT =
|
|
8
|
+
0x34516f6fe09a043d57f1ff579a303a7ae85314751c77b4eb1a55837604a86e00;
|
|
9
|
+
|
|
10
|
+
struct Layout {
|
|
11
|
+
mapping(bytes32 => uint256) transactionNonce;
|
|
12
|
+
mapping(bytes32 => uint256) transactionBalance;
|
|
13
|
+
mapping(bytes32 => bytes) transactionData;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function layout() internal pure returns (Layout storage l) {
|
|
17
|
+
assembly {
|
|
18
|
+
l.slot := STORAGE_SLOT
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IEntitlementsManager} from "./IEntitlementsManager.sol";
|
|
6
|
+
|
|
7
|
+
// libraries
|
|
8
|
+
|
|
9
|
+
// contracts
|
|
10
|
+
|
|
11
|
+
import {Entitled} from "../Entitled.sol";
|
|
12
|
+
import {EntitlementsManagerBase} from "./EntitlementsManagerBase.sol";
|
|
13
|
+
|
|
14
|
+
contract EntitlementsManager is IEntitlementsManager, EntitlementsManagerBase, Entitled {
|
|
15
|
+
function addImmutableEntitlements(address[] calldata entitlements) external onlyOwner {
|
|
16
|
+
_addImmutableEntitlements(entitlements);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function addEntitlementModule(address entitlement) external onlyOwner {
|
|
20
|
+
_addEntitlementModule(entitlement);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function removeEntitlementModule(address entitlement) external onlyOwner {
|
|
24
|
+
_removeEntitlementModule(entitlement);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function getEntitlements() external view returns (Entitlement[] memory) {
|
|
28
|
+
return _getEntitlements();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function getEntitlement(address entitlement) external view returns (Entitlement memory) {
|
|
32
|
+
return _getEntitlement(entitlement);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function isEntitledToSpace(
|
|
36
|
+
address user,
|
|
37
|
+
string calldata permission
|
|
38
|
+
) external view returns (bool) {
|
|
39
|
+
return _isEntitledToSpace(user, permission);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function isEntitledToChannel(
|
|
43
|
+
bytes32 channelId,
|
|
44
|
+
address user,
|
|
45
|
+
string calldata permission
|
|
46
|
+
) external view returns (bool) {
|
|
47
|
+
return _isEntitledToChannel(channelId, user, bytes32(bytes(permission)));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IEntitlementsManagerBase} from "./IEntitlementsManager.sol";
|
|
6
|
+
|
|
7
|
+
// libraries
|
|
8
|
+
import {EntitlementsManagerService} from "src/spaces/facets/entitlements/EntitlementsManagerService.sol";
|
|
9
|
+
|
|
10
|
+
// contracts
|
|
11
|
+
|
|
12
|
+
contract EntitlementsManagerBase is IEntitlementsManagerBase {
|
|
13
|
+
function _addImmutableEntitlements(address[] calldata entitlements) internal {
|
|
14
|
+
for (uint256 i; i < entitlements.length; ++i) {
|
|
15
|
+
EntitlementsManagerService.validateEntitlement(entitlements[i]);
|
|
16
|
+
EntitlementsManagerService.addEntitlement(entitlements[i], true);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function _addEntitlementModule(address entitlement) internal {
|
|
21
|
+
// validate permission
|
|
22
|
+
|
|
23
|
+
// validate entitlement
|
|
24
|
+
EntitlementsManagerService.validateEntitlement(entitlement);
|
|
25
|
+
|
|
26
|
+
// set entitlement
|
|
27
|
+
EntitlementsManagerService.addEntitlement(entitlement, false);
|
|
28
|
+
|
|
29
|
+
// emit event
|
|
30
|
+
emit EntitlementModuleAdded(msg.sender, entitlement);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function _removeEntitlementModule(address entitlement) internal {
|
|
34
|
+
// validate permission
|
|
35
|
+
|
|
36
|
+
// validate entitlement
|
|
37
|
+
EntitlementsManagerService.validateEntitlement(entitlement);
|
|
38
|
+
|
|
39
|
+
// set entitlement
|
|
40
|
+
EntitlementsManagerService.removeEntitlement(entitlement);
|
|
41
|
+
|
|
42
|
+
// emit event
|
|
43
|
+
emit EntitlementModuleRemoved(msg.sender, entitlement);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function _getEntitlement(
|
|
47
|
+
address entitlement
|
|
48
|
+
) internal view returns (Entitlement memory module) {
|
|
49
|
+
EntitlementsManagerService.validateEntitlement(entitlement);
|
|
50
|
+
|
|
51
|
+
(
|
|
52
|
+
string memory name,
|
|
53
|
+
address entitlementAddress,
|
|
54
|
+
string memory moduleType,
|
|
55
|
+
bool isImmutable
|
|
56
|
+
) = EntitlementsManagerService.getEntitlement(entitlement);
|
|
57
|
+
|
|
58
|
+
module = Entitlement({
|
|
59
|
+
name: name,
|
|
60
|
+
moduleAddress: entitlementAddress,
|
|
61
|
+
moduleType: moduleType,
|
|
62
|
+
isImmutable: isImmutable
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function _getEntitlements() internal view returns (Entitlement[] memory modules) {
|
|
67
|
+
address[] memory entitlements = EntitlementsManagerService.getEntitlements();
|
|
68
|
+
|
|
69
|
+
modules = new Entitlement[](entitlements.length);
|
|
70
|
+
|
|
71
|
+
for (uint256 i; i < entitlements.length; ++i) {
|
|
72
|
+
(
|
|
73
|
+
string memory name,
|
|
74
|
+
address entitlementAddress,
|
|
75
|
+
string memory moduleType,
|
|
76
|
+
bool isImmutable
|
|
77
|
+
) = EntitlementsManagerService.getEntitlement(entitlements[i]);
|
|
78
|
+
|
|
79
|
+
modules[i] = Entitlement({
|
|
80
|
+
name: name,
|
|
81
|
+
moduleAddress: entitlementAddress,
|
|
82
|
+
moduleType: moduleType,
|
|
83
|
+
isImmutable: isImmutable
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|