@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,107 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {ICreateSpace} from "./ICreateSpace.sol";
|
|
6
|
+
|
|
7
|
+
// libraries
|
|
8
|
+
import {CreateSpaceLib} from "./CreateSpaceLib.sol";
|
|
9
|
+
|
|
10
|
+
// contracts
|
|
11
|
+
import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
|
|
12
|
+
import {PausableBase} from "@towns-protocol/diamond/src/facets/pausable/PausableBase.sol";
|
|
13
|
+
import {ReentrancyGuard} from "solady/utils/ReentrancyGuard.sol";
|
|
14
|
+
|
|
15
|
+
/// @title CreateSpaceFacet
|
|
16
|
+
/// @notice Facet for creating new spaces with various configurations
|
|
17
|
+
/// @dev Inherits from:
|
|
18
|
+
/// - ICreateSpace: Interface defining space creation methods
|
|
19
|
+
/// - PausableBase: Allows pausing of space creation functionality
|
|
20
|
+
/// - ReentrancyGuard: Prevents reentrancy attacks during space creation
|
|
21
|
+
/// - Facet: Base contract for diamond facets
|
|
22
|
+
contract CreateSpaceFacet is ICreateSpace, PausableBase, ReentrancyGuard, Facet {
|
|
23
|
+
function __CreateSpace_init() external onlyInitializing {
|
|
24
|
+
_addInterface(type(ICreateSpace).interfaceId);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function createSpace(
|
|
28
|
+
Action action,
|
|
29
|
+
bytes calldata data
|
|
30
|
+
) external payable nonReentrant whenNotPaused returns (address) {
|
|
31
|
+
SpaceOptions memory spaceOptions = SpaceOptions({to: msg.sender});
|
|
32
|
+
if (action == Action.CreateBasic) {
|
|
33
|
+
SpaceInfo memory spaceInfo = abi.decode(data, (SpaceInfo));
|
|
34
|
+
return CreateSpaceLib.createSpace(spaceInfo, spaceOptions);
|
|
35
|
+
} else if (action == Action.CreateWithPrepay) {
|
|
36
|
+
CreateSpace memory spaceInfo = abi.decode(data, (CreateSpace));
|
|
37
|
+
return CreateSpaceLib.createSpaceWithPrepay(spaceInfo, spaceOptions);
|
|
38
|
+
} else if (action == Action.CreateWithOptions) {
|
|
39
|
+
CreateSpace memory spaceInfo;
|
|
40
|
+
(spaceInfo, spaceOptions) = abi.decode(data, (CreateSpace, SpaceOptions));
|
|
41
|
+
return CreateSpaceLib.createSpaceWithPrepay(spaceInfo, spaceOptions);
|
|
42
|
+
} else if (action == Action.CreateLegacy) {
|
|
43
|
+
CreateSpaceOld memory spaceInfo = abi.decode(data, (CreateSpaceOld));
|
|
44
|
+
CreateSpace memory newSpaceInfo = _convertLegacySpace(spaceInfo);
|
|
45
|
+
return CreateSpaceLib.createSpaceWithPrepay(newSpaceInfo, spaceOptions);
|
|
46
|
+
} else {
|
|
47
|
+
revert CreateSpaceFacet__InvalidAction();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/// @inheritdoc ICreateSpace
|
|
52
|
+
function createSpace(
|
|
53
|
+
SpaceInfo memory spaceInfo
|
|
54
|
+
) external nonReentrant whenNotPaused returns (address) {
|
|
55
|
+
SpaceOptions memory spaceOptions = SpaceOptions({to: msg.sender});
|
|
56
|
+
return CreateSpaceLib.createSpace(spaceInfo, spaceOptions);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/// @inheritdoc ICreateSpace
|
|
60
|
+
function createSpaceV2(
|
|
61
|
+
CreateSpace memory spaceInfo,
|
|
62
|
+
SpaceOptions memory options
|
|
63
|
+
) external payable nonReentrant whenNotPaused returns (address) {
|
|
64
|
+
return CreateSpaceLib.createSpaceWithPrepay(spaceInfo, options);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/// @inheritdoc ICreateSpace
|
|
68
|
+
function createSpaceWithPrepay(
|
|
69
|
+
CreateSpace memory spaceInfo
|
|
70
|
+
) external payable nonReentrant whenNotPaused returns (address) {
|
|
71
|
+
SpaceOptions memory spaceOptions = SpaceOptions({to: msg.sender});
|
|
72
|
+
return CreateSpaceLib.createSpaceWithPrepay(spaceInfo, spaceOptions);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/// @inheritdoc ICreateSpace
|
|
76
|
+
function createSpaceWithPrepay(
|
|
77
|
+
CreateSpaceOld memory spaceInfo
|
|
78
|
+
) external payable nonReentrant whenNotPaused returns (address) {
|
|
79
|
+
CreateSpace memory newSpaceInfo = _convertLegacySpace(spaceInfo);
|
|
80
|
+
SpaceOptions memory spaceOptions = SpaceOptions({to: msg.sender});
|
|
81
|
+
return CreateSpaceLib.createSpaceWithPrepay(newSpaceInfo, spaceOptions);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/// @dev Converts CreateSpaceOld format to CreateSpace format
|
|
85
|
+
function _convertLegacySpace(
|
|
86
|
+
CreateSpaceOld memory spaceInfo
|
|
87
|
+
) private pure returns (CreateSpace memory) {
|
|
88
|
+
MembershipRequirements memory requirements = MembershipRequirements({
|
|
89
|
+
everyone: spaceInfo.membership.requirements.everyone,
|
|
90
|
+
users: spaceInfo.membership.requirements.users,
|
|
91
|
+
ruleData: spaceInfo.membership.requirements.ruleData,
|
|
92
|
+
syncEntitlements: false
|
|
93
|
+
});
|
|
94
|
+
Membership memory membership = Membership({
|
|
95
|
+
settings: spaceInfo.membership.settings,
|
|
96
|
+
requirements: requirements,
|
|
97
|
+
permissions: spaceInfo.membership.permissions
|
|
98
|
+
});
|
|
99
|
+
return
|
|
100
|
+
CreateSpace({
|
|
101
|
+
metadata: spaceInfo.metadata,
|
|
102
|
+
membership: membership,
|
|
103
|
+
channel: spaceInfo.channel,
|
|
104
|
+
prepay: spaceInfo.prepay
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {ITokenOwnableBase} from "@towns-protocol/diamond/src/facets/ownable/token/ITokenOwnable.sol";
|
|
6
|
+
import {IManagedProxyBase} from "@towns-protocol/diamond/src/proxy/managed/IManagedProxy.sol";
|
|
7
|
+
import {IProxyManager} from "@towns-protocol/diamond/src/proxy/manager/IProxyManager.sol";
|
|
8
|
+
import {IERC721A} from "../../../diamond/facets/token/ERC721A/IERC721A.sol";
|
|
9
|
+
import {IEntitlement} from "../../../spaces/entitlements/IEntitlement.sol";
|
|
10
|
+
import {IRuleEntitlement} from "../../../spaces/entitlements/rule/IRuleEntitlement.sol";
|
|
11
|
+
import {IUserEntitlement} from "../../../spaces/entitlements/user/IUserEntitlement.sol";
|
|
12
|
+
import {IChannel} from "../../../spaces/facets/channels/IChannel.sol";
|
|
13
|
+
import {IEntitlementsManager} from "../../../spaces/facets/entitlements/IEntitlementsManager.sol";
|
|
14
|
+
import {IMembershipBase} from "../../../spaces/facets/membership/IMembership.sol";
|
|
15
|
+
import {IPrepay} from "../../../spaces/facets/prepay/IPrepay.sol";
|
|
16
|
+
import {IRoles, IRolesBase} from "../../../spaces/facets/roles/IRoles.sol";
|
|
17
|
+
import {IArchitectBase} from "../architect/IArchitect.sol";
|
|
18
|
+
|
|
19
|
+
// libraries
|
|
20
|
+
import {Address} from "@openzeppelin/contracts/utils/Address.sol";
|
|
21
|
+
import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
|
|
22
|
+
import {Permissions} from "../../../spaces/facets/Permissions.sol";
|
|
23
|
+
import {StringSet} from "../../../utils/libraries/StringSet.sol";
|
|
24
|
+
import {Validator} from "../../../utils/libraries/Validator.sol";
|
|
25
|
+
import {ArchitectStorage} from "../architect/ArchitectStorage.sol";
|
|
26
|
+
import {ImplementationStorage} from "../architect/ImplementationStorage.sol";
|
|
27
|
+
|
|
28
|
+
// contracts
|
|
29
|
+
import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
|
|
30
|
+
import {SpaceProxy} from "../../../spaces/facets/proxy/SpaceProxy.sol";
|
|
31
|
+
import {SpaceProxyInitializer} from "../../../spaces/facets/proxy/SpaceProxyInitializer.sol";
|
|
32
|
+
import {Factory} from "../../../utils/libraries/Factory.sol";
|
|
33
|
+
import {PricingModulesBase} from "../architect/pricing/PricingModulesBase.sol";
|
|
34
|
+
|
|
35
|
+
library CreateSpaceLib {
|
|
36
|
+
using StringSet for StringSet.Set;
|
|
37
|
+
using EnumerableSet for EnumerableSet.AddressSet;
|
|
38
|
+
|
|
39
|
+
address internal constant EVERYONE_ADDRESS = address(1);
|
|
40
|
+
string internal constant MINTER_ROLE = "Minter";
|
|
41
|
+
bytes1 internal constant CHANNEL_PREFIX = 0x20;
|
|
42
|
+
|
|
43
|
+
function createSpaceWithPrepay(
|
|
44
|
+
IArchitectBase.CreateSpace memory space,
|
|
45
|
+
IArchitectBase.SpaceOptions memory spaceOptions
|
|
46
|
+
) internal returns (address spaceAddress) {
|
|
47
|
+
Validator.checkAddress(space.membership.settings.pricingModule);
|
|
48
|
+
Validator.checkAddress(spaceOptions.to);
|
|
49
|
+
|
|
50
|
+
IArchitectBase.SpaceInfo memory spaceInfo = IArchitectBase.SpaceInfo({
|
|
51
|
+
name: space.metadata.name,
|
|
52
|
+
uri: space.metadata.uri,
|
|
53
|
+
shortDescription: space.metadata.shortDescription,
|
|
54
|
+
longDescription: space.metadata.longDescription,
|
|
55
|
+
membership: space.membership,
|
|
56
|
+
channel: space.channel
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
spaceAddress = createSpace(spaceInfo, spaceOptions);
|
|
60
|
+
|
|
61
|
+
if (space.prepay.supply > 0) {
|
|
62
|
+
IPrepay(spaceAddress).prepayMembership{value: msg.value}(space.prepay.supply);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function createSpace(
|
|
67
|
+
IArchitectBase.SpaceInfo memory spaceInfo,
|
|
68
|
+
IArchitectBase.SpaceOptions memory spaceOptions
|
|
69
|
+
) internal returns (address spaceAddress) {
|
|
70
|
+
ArchitectStorage.Layout storage ds = ArchitectStorage.layout();
|
|
71
|
+
ImplementationStorage.Layout storage ims = ImplementationStorage.layout();
|
|
72
|
+
|
|
73
|
+
// get the token id of the next space
|
|
74
|
+
uint256 spaceTokenId = ims.spaceOwnerToken.nextTokenId();
|
|
75
|
+
|
|
76
|
+
// deploy space
|
|
77
|
+
spaceAddress = deploySpace(spaceTokenId, spaceInfo.membership, spaceOptions);
|
|
78
|
+
|
|
79
|
+
// save space info to storage
|
|
80
|
+
unchecked {
|
|
81
|
+
ds.spaceCount++;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// save to mappings
|
|
85
|
+
ds.spaceByTokenId[spaceTokenId] = spaceAddress;
|
|
86
|
+
ds.tokenIdBySpace[spaceAddress] = spaceTokenId;
|
|
87
|
+
|
|
88
|
+
// mint token to and transfer to Architect
|
|
89
|
+
ims.spaceOwnerToken.mintSpace(
|
|
90
|
+
spaceInfo.name,
|
|
91
|
+
spaceInfo.uri,
|
|
92
|
+
spaceAddress,
|
|
93
|
+
spaceInfo.shortDescription,
|
|
94
|
+
spaceInfo.longDescription
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
// deploy user entitlement
|
|
98
|
+
IUserEntitlement userEntitlement = IUserEntitlement(
|
|
99
|
+
deployEntitlement(ims.userEntitlement, spaceAddress)
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
// deploy token entitlement
|
|
103
|
+
IRuleEntitlement ruleEntitlement = IRuleEntitlement(
|
|
104
|
+
deployEntitlement(ims.ruleEntitlement, spaceAddress)
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
address[] memory entitlements = new address[](2);
|
|
108
|
+
entitlements[0] = address(userEntitlement);
|
|
109
|
+
entitlements[1] = address(ruleEntitlement);
|
|
110
|
+
|
|
111
|
+
// set entitlements as immutable
|
|
112
|
+
IEntitlementsManager(spaceAddress).addImmutableEntitlements(entitlements);
|
|
113
|
+
|
|
114
|
+
// create minter role with requirements
|
|
115
|
+
string[] memory joinPermissions = new string[](1);
|
|
116
|
+
joinPermissions[0] = Permissions.JoinSpace;
|
|
117
|
+
if (spaceInfo.membership.requirements.everyone) {
|
|
118
|
+
createEveryoneEntitlement(spaceAddress, MINTER_ROLE, joinPermissions, userEntitlement);
|
|
119
|
+
} else {
|
|
120
|
+
createEntitlementForRole(
|
|
121
|
+
spaceAddress,
|
|
122
|
+
MINTER_ROLE,
|
|
123
|
+
joinPermissions,
|
|
124
|
+
spaceInfo.membership.requirements,
|
|
125
|
+
userEntitlement,
|
|
126
|
+
ruleEntitlement
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
uint256 memberRoleId;
|
|
131
|
+
|
|
132
|
+
// if entitlement are synced, create a role with the membership requirements
|
|
133
|
+
if (spaceInfo.membership.requirements.syncEntitlements) {
|
|
134
|
+
memberRoleId = createEntitlementForRole(
|
|
135
|
+
spaceAddress,
|
|
136
|
+
spaceInfo.membership.settings.name,
|
|
137
|
+
spaceInfo.membership.permissions,
|
|
138
|
+
spaceInfo.membership.requirements,
|
|
139
|
+
userEntitlement,
|
|
140
|
+
ruleEntitlement
|
|
141
|
+
);
|
|
142
|
+
} else {
|
|
143
|
+
// else create a role with the everyone entitlement
|
|
144
|
+
memberRoleId = createEveryoneEntitlement(
|
|
145
|
+
spaceAddress,
|
|
146
|
+
spaceInfo.membership.settings.name,
|
|
147
|
+
spaceInfo.membership.permissions,
|
|
148
|
+
userEntitlement
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// create default channel
|
|
153
|
+
createDefaultChannel(spaceAddress, memberRoleId, spaceInfo.channel);
|
|
154
|
+
|
|
155
|
+
// transfer nft to sender
|
|
156
|
+
IERC721A(address(ims.spaceOwnerToken)).safeTransferFrom(
|
|
157
|
+
address(this),
|
|
158
|
+
spaceOptions.to,
|
|
159
|
+
spaceTokenId
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
// emit event
|
|
163
|
+
emit IArchitectBase.SpaceCreated(spaceOptions.to, spaceTokenId, spaceAddress);
|
|
164
|
+
}
|
|
165
|
+
// =============================================================
|
|
166
|
+
// Internal Channel Helpers
|
|
167
|
+
// =============================================================
|
|
168
|
+
|
|
169
|
+
function createDefaultChannel(
|
|
170
|
+
address space,
|
|
171
|
+
uint256 roleId,
|
|
172
|
+
IArchitectBase.ChannelInfo memory channelInfo
|
|
173
|
+
) internal {
|
|
174
|
+
uint256[] memory roleIds = new uint256[](1);
|
|
175
|
+
roleIds[0] = roleId;
|
|
176
|
+
|
|
177
|
+
bytes32 defaultChannelId = bytes32(bytes.concat(CHANNEL_PREFIX, bytes20(space)));
|
|
178
|
+
|
|
179
|
+
IChannel(space).createChannel(defaultChannelId, channelInfo.metadata, roleIds);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// =============================================================
|
|
183
|
+
// Internal Entitlement Helpers
|
|
184
|
+
// =============================================================
|
|
185
|
+
function createEntitlementForRole(
|
|
186
|
+
address spaceAddress,
|
|
187
|
+
string memory roleName,
|
|
188
|
+
string[] memory permissions,
|
|
189
|
+
IArchitectBase.MembershipRequirements memory requirements,
|
|
190
|
+
IUserEntitlement userEntitlement,
|
|
191
|
+
IRuleEntitlement ruleEntitlement
|
|
192
|
+
) internal returns (uint256 roleId) {
|
|
193
|
+
uint256 entitlementCount = 0;
|
|
194
|
+
uint256 userReqsLen = requirements.users.length;
|
|
195
|
+
uint256 ruleReqsLen = requirements.ruleData.length;
|
|
196
|
+
|
|
197
|
+
if (userReqsLen > 0) {
|
|
198
|
+
++entitlementCount;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if (ruleReqsLen > 0) {
|
|
202
|
+
++entitlementCount;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
IRolesBase.CreateEntitlement[] memory entitlements = new IRolesBase.CreateEntitlement[](
|
|
206
|
+
entitlementCount
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
uint256 entitlementIndex;
|
|
210
|
+
|
|
211
|
+
if (userReqsLen != 0) {
|
|
212
|
+
// validate users
|
|
213
|
+
for (uint256 i; i < userReqsLen; ++i) {
|
|
214
|
+
Validator.checkAddress(requirements.users[i]);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
entitlements[entitlementIndex++] = IRolesBase.CreateEntitlement({
|
|
218
|
+
module: userEntitlement,
|
|
219
|
+
data: abi.encode(requirements.users)
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
if (ruleReqsLen > 0) {
|
|
224
|
+
entitlements[entitlementIndex++] = IRolesBase.CreateEntitlement({
|
|
225
|
+
module: ruleEntitlement,
|
|
226
|
+
data: requirements.ruleData
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
roleId = createRoleWithEntitlements(spaceAddress, roleName, permissions, entitlements);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function createEveryoneEntitlement(
|
|
234
|
+
address spaceAddress,
|
|
235
|
+
string memory roleName,
|
|
236
|
+
string[] memory permissions,
|
|
237
|
+
IUserEntitlement userEntitlement
|
|
238
|
+
) internal returns (uint256 roleId) {
|
|
239
|
+
address[] memory users = new address[](1);
|
|
240
|
+
users[0] = EVERYONE_ADDRESS;
|
|
241
|
+
|
|
242
|
+
IRolesBase.CreateEntitlement[] memory entitlements = new IRolesBase.CreateEntitlement[](1);
|
|
243
|
+
entitlements[0].module = userEntitlement;
|
|
244
|
+
entitlements[0].data = abi.encode(users);
|
|
245
|
+
|
|
246
|
+
roleId = createRoleWithEntitlements(spaceAddress, roleName, permissions, entitlements);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function createRoleWithEntitlements(
|
|
250
|
+
address spaceAddress,
|
|
251
|
+
string memory roleName,
|
|
252
|
+
string[] memory permissions,
|
|
253
|
+
IRolesBase.CreateEntitlement[] memory entitlements
|
|
254
|
+
) internal returns (uint256 roleId) {
|
|
255
|
+
return IRoles(spaceAddress).createRole(roleName, permissions, entitlements);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// =============================================================
|
|
259
|
+
// Deployment Helpers
|
|
260
|
+
// =============================================================
|
|
261
|
+
|
|
262
|
+
function deploySpace(
|
|
263
|
+
uint256 spaceTokenId,
|
|
264
|
+
IArchitectBase.Membership memory membership,
|
|
265
|
+
IArchitectBase.SpaceOptions memory spaceOptions
|
|
266
|
+
) internal returns (address space) {
|
|
267
|
+
// get deployment info
|
|
268
|
+
(bytes memory initCode, bytes32 salt) = getSpaceDeploymentInfo(
|
|
269
|
+
spaceTokenId,
|
|
270
|
+
membership,
|
|
271
|
+
spaceOptions
|
|
272
|
+
);
|
|
273
|
+
return Factory.deploy(initCode, salt);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
function deployEntitlement(
|
|
277
|
+
IEntitlement entitlement,
|
|
278
|
+
address spaceAddress
|
|
279
|
+
) internal returns (address) {
|
|
280
|
+
// calculate init code
|
|
281
|
+
bytes memory initCode = abi.encodePacked(
|
|
282
|
+
type(ERC1967Proxy).creationCode,
|
|
283
|
+
abi.encode(entitlement, abi.encodeCall(IEntitlement.initialize, (spaceAddress)))
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
return Factory.deploy(initCode);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
function verifyPricingModule(address pricingModule) internal view {
|
|
290
|
+
if (pricingModule == address(0) || !PricingModulesBase.isPricingModule(pricingModule)) {
|
|
291
|
+
revert IArchitectBase.Architect__InvalidPricingModule();
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
function getSpaceDeploymentInfo(
|
|
296
|
+
uint256 spaceTokenId,
|
|
297
|
+
IArchitectBase.Membership memory membership,
|
|
298
|
+
IArchitectBase.SpaceOptions memory spaceOptions
|
|
299
|
+
) internal view returns (bytes memory initCode, bytes32 salt) {
|
|
300
|
+
verifyPricingModule(membership.settings.pricingModule);
|
|
301
|
+
|
|
302
|
+
address spaceOwnerNFT = address(ImplementationStorage.layout().spaceOwnerToken);
|
|
303
|
+
|
|
304
|
+
// calculate salt
|
|
305
|
+
salt = keccak256(abi.encode(spaceTokenId, block.timestamp, block.number, spaceOwnerNFT));
|
|
306
|
+
|
|
307
|
+
IMembershipBase.Membership memory membershipSettings = membership.settings;
|
|
308
|
+
|
|
309
|
+
address proxyInitializer = address(ImplementationStorage.layout().proxyInitializer);
|
|
310
|
+
|
|
311
|
+
// calculate init code
|
|
312
|
+
initCode = abi.encodePacked(
|
|
313
|
+
type(SpaceProxy).creationCode,
|
|
314
|
+
abi.encode(
|
|
315
|
+
IManagedProxyBase.ManagedProxy({
|
|
316
|
+
managerSelector: IProxyManager.getImplementation.selector,
|
|
317
|
+
manager: address(this)
|
|
318
|
+
}),
|
|
319
|
+
proxyInitializer,
|
|
320
|
+
abi.encodeCall(
|
|
321
|
+
SpaceProxyInitializer.initialize,
|
|
322
|
+
(
|
|
323
|
+
spaceOptions.to,
|
|
324
|
+
address(this),
|
|
325
|
+
ITokenOwnableBase.TokenOwnable({
|
|
326
|
+
collection: spaceOwnerNFT,
|
|
327
|
+
tokenId: spaceTokenId
|
|
328
|
+
}),
|
|
329
|
+
membershipSettings
|
|
330
|
+
)
|
|
331
|
+
)
|
|
332
|
+
)
|
|
333
|
+
);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
import {IArchitectBase} from "../architect/IArchitect.sol";
|
|
5
|
+
|
|
6
|
+
interface ICreateSpaceBase {
|
|
7
|
+
/// @notice Action enum for unified space creation dispatch
|
|
8
|
+
/// @dev To encode data for each action:
|
|
9
|
+
/// switch (action) {
|
|
10
|
+
/// case Action.CreateBasic:
|
|
11
|
+
/// data = abi.encode(SpaceInfo memory spaceInfo);
|
|
12
|
+
/// case Action.CreateWithPrepay:
|
|
13
|
+
/// data = abi.encode(CreateSpace memory spaceInfo);
|
|
14
|
+
/// case Action.CreateWithOptions:
|
|
15
|
+
/// data = abi.encode(CreateSpace memory spaceInfo, SpaceOptions memory options);
|
|
16
|
+
/// case Action.CreateLegacy:
|
|
17
|
+
/// data = abi.encode(CreateSpaceOld memory spaceInfo);
|
|
18
|
+
/// }
|
|
19
|
+
enum Action {
|
|
20
|
+
CreateBasic, // Basic space creation with SpaceInfo struct
|
|
21
|
+
CreateWithPrepay, // Space creation with prepaid memberships
|
|
22
|
+
CreateWithOptions, // Space creation with custom deployment options
|
|
23
|
+
CreateLegacy // Legacy space creation for backward compatibility
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
error CreateSpaceFacet__InvalidAction();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
interface ICreateSpace is IArchitectBase, ICreateSpaceBase {
|
|
30
|
+
/// @notice Unified entry point for creating spaces with different configurations
|
|
31
|
+
/// @param action The type of space creation to perform
|
|
32
|
+
/// @param data ABI-encoded data for the specific action type
|
|
33
|
+
/// @return address The address of the newly created space contract
|
|
34
|
+
function createSpace(Action action, bytes calldata data) external payable returns (address);
|
|
35
|
+
|
|
36
|
+
/// @notice Creates a new space with basic configuration
|
|
37
|
+
/// @param SpaceInfo Struct containing space metadata, membership settings, and channel
|
|
38
|
+
/// configuration
|
|
39
|
+
/// @return address The address of the newly created space contract
|
|
40
|
+
function createSpace(SpaceInfo memory SpaceInfo) external returns (address);
|
|
41
|
+
|
|
42
|
+
/// @notice Creates a new space with prepaid memberships
|
|
43
|
+
/// @param createSpace Struct containing space metadata, membership settings, channel config and
|
|
44
|
+
/// prepay info
|
|
45
|
+
/// @return address The address of the newly created space contract
|
|
46
|
+
/// @dev The msg.value must cover the cost of prepaid memberships
|
|
47
|
+
function createSpaceWithPrepay(
|
|
48
|
+
CreateSpace memory createSpace
|
|
49
|
+
) external payable returns (address);
|
|
50
|
+
|
|
51
|
+
/// @notice Creates a new space with prepaid memberships and custom deployment options
|
|
52
|
+
/// @param createSpace Struct containing space metadata, membership settings, channel config and
|
|
53
|
+
/// prepay info
|
|
54
|
+
/// @param options Struct containing deployment options like the recipient address
|
|
55
|
+
/// @return address The address of the newly created space contract
|
|
56
|
+
/// @dev The msg.value must cover the cost of prepaid memberships
|
|
57
|
+
function createSpaceV2(
|
|
58
|
+
CreateSpace memory createSpace,
|
|
59
|
+
SpaceOptions memory options
|
|
60
|
+
) external payable returns (address);
|
|
61
|
+
|
|
62
|
+
/// @notice Legacy function for backwards compatibility with older space creation format
|
|
63
|
+
/// @param spaceInfo Struct containing old format space configuration
|
|
64
|
+
/// @return address The address of the newly created space contract
|
|
65
|
+
/// @dev This function converts the old format to the new format internally
|
|
66
|
+
/// @dev The msg.value must cover the cost of prepaid memberships
|
|
67
|
+
function createSpaceWithPrepay(
|
|
68
|
+
CreateSpaceOld memory spaceInfo
|
|
69
|
+
) external payable returns (address);
|
|
70
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IVotes} from "@openzeppelin/contracts/governance/utils/IVotes.sol";
|
|
6
|
+
|
|
7
|
+
/// @notice Represents a condition for feature activation
|
|
8
|
+
/// @dev Used to determine if a feature should be enabled based on token voting power
|
|
9
|
+
/// @param token The address of the token used for voting (must implement IVotes)
|
|
10
|
+
/// @param threshold The minimum number of delegations required to activate the feature
|
|
11
|
+
/// @param active Whether the condition is currently active
|
|
12
|
+
/// @param extraData Additional data that might be used for specialized condition logic
|
|
13
|
+
struct FeatureCondition {
|
|
14
|
+
address token;
|
|
15
|
+
bool active;
|
|
16
|
+
uint256 threshold;
|
|
17
|
+
bytes extraData;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/// @title FeatureConditionLib
|
|
21
|
+
library FeatureConditionLib {
|
|
22
|
+
function isValid(FeatureCondition storage condition) internal view returns (bool) {
|
|
23
|
+
return condition.active && condition.token != address(0);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/// @notice Gets the voting power of a space for the condition's token
|
|
27
|
+
/// @dev Calls the getVotes function on the token contract
|
|
28
|
+
/// @param condition The condition containing the token address
|
|
29
|
+
/// @param space The address of the space to check votes for
|
|
30
|
+
/// @return The number of votes the space has with the token
|
|
31
|
+
function getVotes(
|
|
32
|
+
FeatureCondition storage condition,
|
|
33
|
+
address space
|
|
34
|
+
) internal view returns (uint256) {
|
|
35
|
+
return IVotes(condition.token).getVotes(space);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/// @notice Checks if the given number of votes meets the condition's threshold
|
|
39
|
+
/// @dev Returns false if condition is inactive, true if threshold is 0, otherwise compares
|
|
40
|
+
/// votes to threshold
|
|
41
|
+
/// @param condition The condition containing the threshold and active status
|
|
42
|
+
/// @param votes The number of votes to check against the threshold
|
|
43
|
+
/// @return True if the condition is met, false otherwise
|
|
44
|
+
function meetsThreshold(
|
|
45
|
+
FeatureCondition storage condition,
|
|
46
|
+
uint256 votes
|
|
47
|
+
) internal view returns (bool) {
|
|
48
|
+
if (!isValid(condition)) return false;
|
|
49
|
+
uint256 threshold = condition.threshold;
|
|
50
|
+
if (threshold == 0) return true;
|
|
51
|
+
return votes >= threshold;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IFeatureManagerFacet} from "./IFeatureManagerFacet.sol";
|
|
6
|
+
|
|
7
|
+
// libraries
|
|
8
|
+
import {FeatureManagerLib} from "./FeatureManagerLib.sol";
|
|
9
|
+
import {FeatureCondition, FeatureConditionLib} from "./FeatureConditionLib.sol";
|
|
10
|
+
// contracts
|
|
11
|
+
import {OwnableBase} from "@towns-protocol/diamond/src/facets/ownable/OwnableBase.sol";
|
|
12
|
+
import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
|
|
13
|
+
|
|
14
|
+
/// @title FeatureManagerFacet
|
|
15
|
+
/// @notice Manages feature conditions and checks for spaces
|
|
16
|
+
/// @dev This facet is responsible for managing feature conditions and checking if a space meets the condition for a feature to be enabled
|
|
17
|
+
contract FeatureManagerFacet is IFeatureManagerFacet, OwnableBase, Facet {
|
|
18
|
+
using FeatureManagerLib for FeatureManagerLib.Layout;
|
|
19
|
+
using FeatureConditionLib for FeatureCondition;
|
|
20
|
+
|
|
21
|
+
function __FeatureManagerFacet_init() external onlyInitializing {
|
|
22
|
+
_addInterface(type(IFeatureManagerFacet).interfaceId);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/// @inheritdoc IFeatureManagerFacet
|
|
26
|
+
function setFeatureCondition(
|
|
27
|
+
bytes32 featureId,
|
|
28
|
+
FeatureCondition calldata condition
|
|
29
|
+
) external onlyOwner {
|
|
30
|
+
FeatureManagerLib.getLayout().setFeatureCondition(featureId, condition);
|
|
31
|
+
emit FeatureConditionSet(featureId, condition);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/// @inheritdoc IFeatureManagerFacet
|
|
35
|
+
function getFeatureCondition(
|
|
36
|
+
bytes32 featureId
|
|
37
|
+
) external view returns (FeatureCondition memory) {
|
|
38
|
+
return FeatureManagerLib.getLayout().getFeatureCondition(featureId);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/// @inheritdoc IFeatureManagerFacet
|
|
42
|
+
function getFeatureConditions() external view returns (FeatureCondition[] memory) {
|
|
43
|
+
return FeatureManagerLib.getLayout().getFeatureConditions();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/// @inheritdoc IFeatureManagerFacet
|
|
47
|
+
function getFeatureConditionsForSpace(
|
|
48
|
+
address space
|
|
49
|
+
) external view returns (FeatureCondition[] memory) {
|
|
50
|
+
return FeatureManagerLib.getLayout().getFeatureConditionsForSpace(space);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/// @inheritdoc IFeatureManagerFacet
|
|
54
|
+
function disableFeatureCondition(bytes32 featureId) external onlyOwner {
|
|
55
|
+
FeatureManagerLib.getLayout().disableFeatureCondition(featureId);
|
|
56
|
+
emit FeatureConditionDisabled(featureId);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/// @inheritdoc IFeatureManagerFacet
|
|
60
|
+
function checkFeatureCondition(bytes32 featureId, address space) external view returns (bool) {
|
|
61
|
+
FeatureCondition storage condition = FeatureManagerLib.getLayout().conditions[featureId];
|
|
62
|
+
if (!condition.isValid()) return false;
|
|
63
|
+
uint256 votes = condition.getVotes(space);
|
|
64
|
+
return condition.meetsThreshold(votes);
|
|
65
|
+
}
|
|
66
|
+
}
|