@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,272 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IPlatformRequirements} from "../../../factory/facets/platform/requirements/IPlatformRequirements.sol";
|
|
6
|
+
import {IPricingModules} from "../../../factory/facets/architect/pricing/IPricingModules.sol";
|
|
7
|
+
import {IMembershipBase} from "./IMembership.sol";
|
|
8
|
+
import {IMembershipPricing} from "./pricing/IMembershipPricing.sol";
|
|
9
|
+
|
|
10
|
+
// libraries
|
|
11
|
+
import {FixedPointMathLib} from "solady/utils/FixedPointMathLib.sol";
|
|
12
|
+
import {SafeTransferLib} from "solady/utils/SafeTransferLib.sol";
|
|
13
|
+
import {BasisPoints} from "../../../utils/libraries/BasisPoints.sol";
|
|
14
|
+
import {CurrencyTransfer} from "../../../utils/libraries/CurrencyTransfer.sol";
|
|
15
|
+
import {CustomRevert} from "../../../utils/libraries/CustomRevert.sol";
|
|
16
|
+
import {MembershipStorage} from "./MembershipStorage.sol";
|
|
17
|
+
|
|
18
|
+
abstract contract MembershipBase is IMembershipBase {
|
|
19
|
+
using CustomRevert for bytes4;
|
|
20
|
+
using SafeTransferLib for address;
|
|
21
|
+
|
|
22
|
+
function __MembershipBase_init(Membership memory info, address spaceFactory) internal {
|
|
23
|
+
MembershipStorage.Layout storage ds = MembershipStorage.layout();
|
|
24
|
+
|
|
25
|
+
ds.spaceFactory = spaceFactory;
|
|
26
|
+
ds.pricingModule = info.pricingModule;
|
|
27
|
+
ds.membershipCurrency = CurrencyTransfer.NATIVE_TOKEN;
|
|
28
|
+
ds.membershipMaxSupply = info.maxSupply;
|
|
29
|
+
|
|
30
|
+
if (info.freeAllocation > 0) {
|
|
31
|
+
_verifyFreeAllocation(info.freeAllocation);
|
|
32
|
+
ds.freeAllocation = info.freeAllocation;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
ds.freeAllocationEnabled = true;
|
|
36
|
+
|
|
37
|
+
if (info.price > 0) {
|
|
38
|
+
_verifyPrice(info.price);
|
|
39
|
+
IMembershipPricing(info.pricingModule).setPrice(info.price);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (info.duration > 0) {
|
|
43
|
+
_verifyDuration(info.duration);
|
|
44
|
+
ds.membershipDuration = info.duration;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
49
|
+
/* MEMBERSHIP */
|
|
50
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
51
|
+
|
|
52
|
+
function _collectProtocolFee(
|
|
53
|
+
address payer,
|
|
54
|
+
uint256 membershipPrice
|
|
55
|
+
) internal returns (uint256 protocolFee) {
|
|
56
|
+
protocolFee = _getProtocolFee(membershipPrice);
|
|
57
|
+
|
|
58
|
+
// transfer the platform fee to the platform fee recipient
|
|
59
|
+
CurrencyTransfer.transferCurrency(
|
|
60
|
+
_getMembershipCurrency(),
|
|
61
|
+
payer, // from
|
|
62
|
+
_getPlatformRequirements().getFeeRecipient(), // to
|
|
63
|
+
protocolFee
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function _getProtocolFee(uint256 membershipPrice) internal view returns (uint256) {
|
|
68
|
+
IPlatformRequirements platform = _getPlatformRequirements();
|
|
69
|
+
|
|
70
|
+
uint256 minPrice = platform.getMembershipMinPrice();
|
|
71
|
+
|
|
72
|
+
if (membershipPrice < minPrice) return platform.getMembershipFee();
|
|
73
|
+
|
|
74
|
+
return BasisPoints.calculate(membershipPrice, platform.getMembershipBps());
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function _transferIn(address from, uint256 amount) internal returns (uint256) {
|
|
78
|
+
MembershipStorage.Layout storage ds = MembershipStorage.layout();
|
|
79
|
+
|
|
80
|
+
// get the currency being used for membership
|
|
81
|
+
address currency = _getMembershipCurrency();
|
|
82
|
+
|
|
83
|
+
if (currency == CurrencyTransfer.NATIVE_TOKEN) {
|
|
84
|
+
ds.tokenBalance += amount;
|
|
85
|
+
return amount;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// handle erc20 tokens
|
|
89
|
+
uint256 balanceBefore = currency.balanceOf(address(this));
|
|
90
|
+
CurrencyTransfer.safeTransferERC20(currency, from, address(this), amount);
|
|
91
|
+
uint256 balanceAfter = currency.balanceOf(address(this));
|
|
92
|
+
|
|
93
|
+
// Calculate the amount of tokens transferred
|
|
94
|
+
uint256 finalAmount = balanceAfter - balanceBefore;
|
|
95
|
+
if (finalAmount != amount) Membership__InsufficientPayment.selector.revertWith();
|
|
96
|
+
|
|
97
|
+
ds.tokenBalance += finalAmount;
|
|
98
|
+
return finalAmount;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function _getCreatorBalance() internal view returns (uint256) {
|
|
102
|
+
return MembershipStorage.layout().tokenBalance;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function _setCreatorBalance(uint256 newBalance) internal {
|
|
106
|
+
MembershipStorage.layout().tokenBalance = newBalance;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
110
|
+
/* DURATION */
|
|
111
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
112
|
+
|
|
113
|
+
function _verifyDuration(uint64 duration) internal view {
|
|
114
|
+
uint256 maxDuration = _getPlatformRequirements().getMembershipDuration();
|
|
115
|
+
|
|
116
|
+
if (duration == 0) Membership__InvalidDuration.selector.revertWith();
|
|
117
|
+
|
|
118
|
+
if (duration > maxDuration) Membership__InvalidDuration.selector.revertWith();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function _getMembershipDuration() internal view returns (uint64 duration) {
|
|
122
|
+
duration = MembershipStorage.layout().membershipDuration;
|
|
123
|
+
|
|
124
|
+
if (duration == 0) duration = _getPlatformRequirements().getMembershipDuration();
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function _setMembershipDuration(uint64 duration) internal {
|
|
128
|
+
_verifyDuration(duration);
|
|
129
|
+
MembershipStorage.layout().membershipDuration = duration;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
133
|
+
/* PRICING MODULE */
|
|
134
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
135
|
+
|
|
136
|
+
function _verifyPricingModule(address pricingModule) internal view {
|
|
137
|
+
if (pricingModule == address(0)) Membership__InvalidPricingModule.selector.revertWith();
|
|
138
|
+
|
|
139
|
+
if (!IPricingModules(_getSpaceFactory()).isPricingModule(pricingModule)) {
|
|
140
|
+
Membership__InvalidPricingModule.selector.revertWith();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function _setPricingModule(address newPricingModule) internal {
|
|
145
|
+
MembershipStorage.layout().pricingModule = newPricingModule;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function _getPricingModule() internal view returns (address) {
|
|
149
|
+
return MembershipStorage.layout().pricingModule;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
153
|
+
/* PRICING */
|
|
154
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
155
|
+
|
|
156
|
+
function _verifyPrice(uint256 newPrice) internal view {
|
|
157
|
+
uint256 minFee = _getPlatformRequirements().getMembershipFee();
|
|
158
|
+
if (newPrice < minFee) Membership__PriceTooLow.selector.revertWith();
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/// @dev Makes it virtual to allow other pricing strategies
|
|
162
|
+
function _getMembershipPrice(
|
|
163
|
+
uint256 totalSupply
|
|
164
|
+
) internal view virtual returns (uint256 membershipPrice) {
|
|
165
|
+
// get free allocation
|
|
166
|
+
uint256 freeAllocation = _getMembershipFreeAllocation();
|
|
167
|
+
address pricingModule = _getPricingModule();
|
|
168
|
+
|
|
169
|
+
IPlatformRequirements platform = _getPlatformRequirements();
|
|
170
|
+
|
|
171
|
+
if (pricingModule == address(0)) return platform.getMembershipFee();
|
|
172
|
+
|
|
173
|
+
membershipPrice = IMembershipPricing(pricingModule).getPrice(freeAllocation, totalSupply);
|
|
174
|
+
uint256 minPrice = platform.getMembershipMinPrice();
|
|
175
|
+
if (membershipPrice < minPrice) return platform.getMembershipFee();
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function _setMembershipRenewalPrice(uint256 tokenId, uint256 pricePaid) internal {
|
|
179
|
+
MembershipStorage.layout().renewalPriceByTokenId[tokenId] = pricePaid;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function _getMembershipRenewalPrice(
|
|
183
|
+
uint256 tokenId,
|
|
184
|
+
uint256 totalSupply
|
|
185
|
+
) internal view returns (uint256) {
|
|
186
|
+
MembershipStorage.Layout storage ds = MembershipStorage.layout();
|
|
187
|
+
IPlatformRequirements platform = _getPlatformRequirements();
|
|
188
|
+
|
|
189
|
+
uint256 minFee = platform.getMembershipFee();
|
|
190
|
+
uint256 renewalPrice = ds.renewalPriceByTokenId[tokenId];
|
|
191
|
+
|
|
192
|
+
if (renewalPrice != 0) return FixedPointMathLib.max(renewalPrice, minFee);
|
|
193
|
+
|
|
194
|
+
uint256 price = _getMembershipPrice(totalSupply);
|
|
195
|
+
return FixedPointMathLib.max(price, minFee);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
199
|
+
/* ALLOCATION */
|
|
200
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
201
|
+
|
|
202
|
+
function _verifyFreeAllocation(uint256 newAllocation) internal view {
|
|
203
|
+
// verify newLimit is not more than the allowed platform limit
|
|
204
|
+
if (newAllocation > _getPlatformRequirements().getMembershipMintLimit()) {
|
|
205
|
+
Membership__InvalidFreeAllocation.selector.revertWith();
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function _setMembershipFreeAllocation(uint256 newAllocation) internal {
|
|
210
|
+
MembershipStorage.Layout storage ds = MembershipStorage.layout();
|
|
211
|
+
ds.freeAllocation = newAllocation;
|
|
212
|
+
ds.freeAllocationEnabled = true;
|
|
213
|
+
emit MembershipFreeAllocationUpdated(newAllocation);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function _getMembershipFreeAllocation() internal view returns (uint256) {
|
|
217
|
+
MembershipStorage.Layout storage ds = MembershipStorage.layout();
|
|
218
|
+
|
|
219
|
+
if (ds.freeAllocationEnabled) return ds.freeAllocation;
|
|
220
|
+
|
|
221
|
+
return _getPlatformRequirements().getMembershipMintLimit();
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
225
|
+
/* SUPPLY LIMIT */
|
|
226
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
227
|
+
|
|
228
|
+
function _verifyMaxSupply(uint256 newLimit, uint256 totalSupply) internal pure {
|
|
229
|
+
// if the new limit is less than the current total supply, revert
|
|
230
|
+
if (newLimit < totalSupply) Membership__InvalidMaxSupply.selector.revertWith();
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function _setMembershipSupplyLimit(uint256 newLimit) internal {
|
|
234
|
+
MembershipStorage.layout().membershipMaxSupply = newLimit;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function _getMembershipSupplyLimit() internal view returns (uint256) {
|
|
238
|
+
return MembershipStorage.layout().membershipMaxSupply;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
242
|
+
/* CURRENCY */
|
|
243
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
244
|
+
|
|
245
|
+
function _getMembershipCurrency() internal view returns (address) {
|
|
246
|
+
return MembershipStorage.layout().membershipCurrency;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
250
|
+
/* FACTORY */
|
|
251
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
252
|
+
|
|
253
|
+
function _getSpaceFactory() internal view returns (address) {
|
|
254
|
+
return MembershipStorage.layout().spaceFactory;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
function _getPlatformRequirements() internal view returns (IPlatformRequirements) {
|
|
258
|
+
return IPlatformRequirements(_getSpaceFactory());
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
262
|
+
/* IMAGE */
|
|
263
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
264
|
+
|
|
265
|
+
function _getMembershipImage() internal view returns (string memory) {
|
|
266
|
+
return MembershipStorage.layout().membershipImage;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
function _setMembershipImage(string memory image) internal {
|
|
270
|
+
MembershipStorage.layout().membershipImage = image;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IMembership} from "./IMembership.sol";
|
|
6
|
+
import {IMembershipPricing} from "./pricing/IMembershipPricing.sol";
|
|
7
|
+
|
|
8
|
+
// libraries
|
|
9
|
+
import {CustomRevert} from "../../../utils/libraries/CustomRevert.sol";
|
|
10
|
+
|
|
11
|
+
// contracts
|
|
12
|
+
import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
|
|
13
|
+
import {ReentrancyGuard} from "solady/utils/ReentrancyGuard.sol";
|
|
14
|
+
import {MembershipJoin} from "./join/MembershipJoin.sol";
|
|
15
|
+
|
|
16
|
+
contract MembershipFacet is IMembership, MembershipJoin, ReentrancyGuard, Facet {
|
|
17
|
+
using CustomRevert for bytes4;
|
|
18
|
+
|
|
19
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
20
|
+
/* JOIN */
|
|
21
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
22
|
+
|
|
23
|
+
/// @inheritdoc IMembership
|
|
24
|
+
function joinSpace(JoinType action, bytes calldata data) external payable nonReentrant {
|
|
25
|
+
if (action == JoinType.Basic) {
|
|
26
|
+
address receiver = abi.decode(data, (address));
|
|
27
|
+
_joinSpace(receiver);
|
|
28
|
+
} else if (action == JoinType.WithReferral) {
|
|
29
|
+
(address receiver, ReferralTypes memory referral) = abi.decode(
|
|
30
|
+
data,
|
|
31
|
+
(address, ReferralTypes)
|
|
32
|
+
);
|
|
33
|
+
_joinSpaceWithReferral(receiver, referral);
|
|
34
|
+
} else {
|
|
35
|
+
Membership__InvalidAction.selector.revertWith();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/// @inheritdoc IMembership
|
|
40
|
+
function joinSpace(address receiver) external payable nonReentrant {
|
|
41
|
+
_joinSpace(receiver);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/// @inheritdoc IMembership
|
|
45
|
+
function joinSpaceWithReferral(
|
|
46
|
+
address receiver,
|
|
47
|
+
ReferralTypes memory referral
|
|
48
|
+
) external payable nonReentrant {
|
|
49
|
+
_joinSpaceWithReferral(receiver, referral);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
53
|
+
/* RENEWAL */
|
|
54
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
55
|
+
|
|
56
|
+
/// @inheritdoc IMembership
|
|
57
|
+
function renewMembership(uint256 tokenId) external payable nonReentrant {
|
|
58
|
+
_renewMembership(msg.sender, tokenId);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/// @inheritdoc IMembership
|
|
62
|
+
function expiresAt(uint256 tokenId) external view returns (uint256) {
|
|
63
|
+
return _expiresAt(tokenId);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
67
|
+
/* DURATION */
|
|
68
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
69
|
+
|
|
70
|
+
/// @inheritdoc IMembership
|
|
71
|
+
function setMembershipDuration(uint64 duration) external onlyOwner {
|
|
72
|
+
_setMembershipDuration(duration);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/// @inheritdoc IMembership
|
|
76
|
+
function getMembershipDuration() external view returns (uint64) {
|
|
77
|
+
return _getMembershipDuration();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
81
|
+
/* PRICING MODULE */
|
|
82
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
83
|
+
|
|
84
|
+
/// @inheritdoc IMembership
|
|
85
|
+
function setMembershipPricingModule(address pricingModule) external onlyOwner {
|
|
86
|
+
_verifyPricingModule(pricingModule);
|
|
87
|
+
_setPricingModule(pricingModule);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/// @inheritdoc IMembership
|
|
91
|
+
function getMembershipPricingModule() external view returns (address) {
|
|
92
|
+
return _getPricingModule();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
96
|
+
/* PRICING */
|
|
97
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
98
|
+
|
|
99
|
+
/// @inheritdoc IMembership
|
|
100
|
+
function setMembershipPrice(uint256 newPrice) external onlyOwner {
|
|
101
|
+
_verifyPrice(newPrice);
|
|
102
|
+
IMembershipPricing(_getPricingModule()).setPrice(newPrice);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/// @inheritdoc IMembership
|
|
106
|
+
function getMembershipPrice() external view returns (uint256) {
|
|
107
|
+
return _getMembershipPrice(_totalSupply());
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/// @inheritdoc IMembership
|
|
111
|
+
function getMembershipRenewalPrice(uint256 tokenId) external view returns (uint256) {
|
|
112
|
+
return _getMembershipRenewalPrice(tokenId, _totalSupply());
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/// @inheritdoc IMembership
|
|
116
|
+
function getProtocolFee() external view returns (uint256) {
|
|
117
|
+
return _getProtocolFee(_getMembershipPrice(_totalSupply()));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
121
|
+
/* ALLOCATION */
|
|
122
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
123
|
+
|
|
124
|
+
/// @inheritdoc IMembership
|
|
125
|
+
function setMembershipFreeAllocation(uint256 newAllocation) external onlyOwner {
|
|
126
|
+
// get current supply limit
|
|
127
|
+
uint256 currentSupplyLimit = _getMembershipSupplyLimit();
|
|
128
|
+
|
|
129
|
+
// verify newLimit is not more than the max supply limit
|
|
130
|
+
if (currentSupplyLimit != 0 && newAllocation > currentSupplyLimit) {
|
|
131
|
+
Membership__InvalidFreeAllocation.selector.revertWith();
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// verify newLimit is not more than the allowed platform limit
|
|
135
|
+
_verifyFreeAllocation(newAllocation);
|
|
136
|
+
_setMembershipFreeAllocation(newAllocation);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/// @inheritdoc IMembership
|
|
140
|
+
function getMembershipFreeAllocation() external view returns (uint256) {
|
|
141
|
+
return _getMembershipFreeAllocation();
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
145
|
+
/* SUPPLY LIMIT */
|
|
146
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
147
|
+
|
|
148
|
+
/// @inheritdoc IMembership
|
|
149
|
+
function setMembershipLimit(uint256 newLimit) external onlyOwner {
|
|
150
|
+
_verifyMaxSupply(newLimit, _totalSupply());
|
|
151
|
+
_setMembershipSupplyLimit(newLimit);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/// @inheritdoc IMembership
|
|
155
|
+
function getMembershipLimit() external view returns (uint256) {
|
|
156
|
+
return _getMembershipSupplyLimit();
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
160
|
+
/* IMAGE */
|
|
161
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
162
|
+
|
|
163
|
+
/// @inheritdoc IMembership
|
|
164
|
+
function setMembershipImage(string calldata newImage) external onlyOwner {
|
|
165
|
+
_setMembershipImage(newImage);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/// @inheritdoc IMembership
|
|
169
|
+
function getMembershipImage() external view returns (string memory) {
|
|
170
|
+
return _getMembershipImage();
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
174
|
+
/* GETTERS */
|
|
175
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
176
|
+
|
|
177
|
+
/// @inheritdoc IMembership
|
|
178
|
+
function getMembershipCurrency() external view returns (address) {
|
|
179
|
+
return _getMembershipCurrency();
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/// @inheritdoc IMembership
|
|
183
|
+
function getSpaceFactory() external view returns (address) {
|
|
184
|
+
return _getSpaceFactory();
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/// @inheritdoc IMembership
|
|
188
|
+
function revenue() external view returns (uint256) {
|
|
189
|
+
return address(this).balance;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
|
|
6
|
+
// libraries
|
|
7
|
+
|
|
8
|
+
// contracts
|
|
9
|
+
|
|
10
|
+
library MembershipStorage {
|
|
11
|
+
// keccak256(abi.encode(uint256(keccak256("spaces.facets.membership.storage")) - 1)) &
|
|
12
|
+
// ~bytes32(uint256(0xff))
|
|
13
|
+
bytes32 public constant STORAGE_SLOT =
|
|
14
|
+
0xc21004fcc619240a31f006438274d15cd813308303284436eef6055f0fdcb600;
|
|
15
|
+
|
|
16
|
+
struct Layout {
|
|
17
|
+
mapping(uint256 => address) deprecatedMemberByTokenId;
|
|
18
|
+
mapping(address => uint256) deprecatedTokenIdByMember;
|
|
19
|
+
uint256 membershipPrice;
|
|
20
|
+
uint256 membershipMaxSupply;
|
|
21
|
+
address membershipCurrency;
|
|
22
|
+
address membershipFeeRecipient;
|
|
23
|
+
address spaceFactory;
|
|
24
|
+
uint64 membershipDuration;
|
|
25
|
+
uint256 freeAllocation;
|
|
26
|
+
address pricingModule;
|
|
27
|
+
mapping(uint256 => uint256) renewalPriceByTokenId;
|
|
28
|
+
uint256 tokenBalance;
|
|
29
|
+
mapping(bytes32 => address) pendingJoinRequests;
|
|
30
|
+
string membershipImage;
|
|
31
|
+
bool freeAllocationEnabled;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function layout() internal pure returns (Layout storage l) {
|
|
35
|
+
bytes32 slot = STORAGE_SLOT;
|
|
36
|
+
assembly {
|
|
37
|
+
l.slot := slot
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|