@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,274 @@
|
|
|
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
|
+
// libraries
|
|
8
|
+
|
|
9
|
+
import {Checkpoints} from "./Checkpoints.sol";
|
|
10
|
+
import {VotesStorage} from "./VotesStorage.sol";
|
|
11
|
+
import {ECDSA} from "solady/utils/ECDSA.sol";
|
|
12
|
+
import {SafeCastLib} from "solady/utils/SafeCastLib.sol";
|
|
13
|
+
|
|
14
|
+
// contracts
|
|
15
|
+
import {Nonces} from "@towns-protocol/diamond/src/utils/Nonces.sol";
|
|
16
|
+
import {EIP712Base} from "@towns-protocol/diamond/src/utils/cryptography/EIP712Base.sol";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @dev This is a base abstract contract that tracks voting units, which are a measure of voting
|
|
20
|
+
* power that can be
|
|
21
|
+
* transferred, and provides a system of vote delegation, where an account can delegate its voting
|
|
22
|
+
* units to a sort of
|
|
23
|
+
* "representative" that will pool delegated voting units from different accounts and can then use
|
|
24
|
+
* it to vote in
|
|
25
|
+
* decisions. In fact, voting units _must_ be delegated in order to count as actual votes, and an
|
|
26
|
+
* account has to
|
|
27
|
+
* delegate those votes to itself if it wishes to participate in decisions and does not have a
|
|
28
|
+
* trusted representative.
|
|
29
|
+
*
|
|
30
|
+
* This contract is often combined with a token contract such that voting units correspond to token
|
|
31
|
+
* units. For an
|
|
32
|
+
* example, see {ERC721Votes}.
|
|
33
|
+
*
|
|
34
|
+
* The full history of delegate votes is tracked on-chain so that governance protocols can consider
|
|
35
|
+
* votes as distributed
|
|
36
|
+
* at a particular block number to protect against flash loans and double voting. The opt-in
|
|
37
|
+
* delegate system makes the
|
|
38
|
+
* cost of this history tracking optional.
|
|
39
|
+
*
|
|
40
|
+
* When using this module the derived contract must implement {_getVotingUnits} (for example, make
|
|
41
|
+
* it return
|
|
42
|
+
* {ERC721-balanceOf}), and can use {_transferVotingUnits} to track a change in the distribution of
|
|
43
|
+
* those units (in the
|
|
44
|
+
* previous example, it would be included in {ERC721-_beforeTokenTransfer}).
|
|
45
|
+
*
|
|
46
|
+
*/
|
|
47
|
+
abstract contract VotesBase is EIP712Base, Nonces {
|
|
48
|
+
using VotesStorage for VotesStorage.Layout;
|
|
49
|
+
using Checkpoints for Checkpoints.Trace224;
|
|
50
|
+
|
|
51
|
+
// =============================================================
|
|
52
|
+
// EIP 712
|
|
53
|
+
// =============================================================
|
|
54
|
+
|
|
55
|
+
bytes32 private constant _DELEGATION_TYPEHASH =
|
|
56
|
+
keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");
|
|
57
|
+
|
|
58
|
+
// =============================================================
|
|
59
|
+
// ERC 5805
|
|
60
|
+
// =============================================================
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based
|
|
64
|
+
* checkpoints (and voting), in which case {CLOCK_MODE} should be overridden as well to match.
|
|
65
|
+
*/
|
|
66
|
+
function _clock() internal view returns (uint48) {
|
|
67
|
+
return SafeCastLib.toUint48(block.number);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* @dev Machine-readable description of the clock as specified in EIP-6372.
|
|
72
|
+
*/
|
|
73
|
+
// solhint-disable-next-line func-name-mixedcase
|
|
74
|
+
function _clockMode() internal view returns (string memory) {
|
|
75
|
+
// Check that the clock was not modified
|
|
76
|
+
require(_clock() == block.number, "Votes: broken clock mode");
|
|
77
|
+
return "mode=blocknumber&from=default";
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// =============================================================
|
|
81
|
+
// Votes
|
|
82
|
+
// =============================================================
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* @dev Returns the current amount of votes that `account` has.
|
|
86
|
+
*/
|
|
87
|
+
function _getVotes(address account) internal view returns (uint256) {
|
|
88
|
+
return VotesStorage.layout()._delegateCheckpoints[account].latest();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* @dev Returns the amount of votes that `account` had at a specific moment in the past. If the
|
|
93
|
+
* `clock()` is
|
|
94
|
+
* configured to use block numbers, this will return the value at the end of the corresponding
|
|
95
|
+
* block.
|
|
96
|
+
*
|
|
97
|
+
* Requirements:
|
|
98
|
+
*
|
|
99
|
+
* - `timepoint` must be in the past. If operating using block numbers, the block must be
|
|
100
|
+
* already
|
|
101
|
+
* mined.
|
|
102
|
+
*/
|
|
103
|
+
function _getPastVotes(address account, uint256 timepoint) internal view returns (uint256) {
|
|
104
|
+
require(timepoint < _clock(), "Votes: future lookup");
|
|
105
|
+
return
|
|
106
|
+
VotesStorage.layout()._delegateCheckpoints[account].upperLookupRecent(
|
|
107
|
+
SafeCastLib.toUint32(timepoint)
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* @dev Returns the total supply of votes available at a specific moment in the past. If the
|
|
113
|
+
* `clock()` is
|
|
114
|
+
* configured to use block numbers, this will return the value at the end of the corresponding
|
|
115
|
+
* block.
|
|
116
|
+
*
|
|
117
|
+
* NOTE: This value is the sum of all available votes, which is not necessarily the sum of all
|
|
118
|
+
* delegated votes.
|
|
119
|
+
* Votes that have not been delegated are still part of total supply, even though they would not
|
|
120
|
+
* participate in a
|
|
121
|
+
* vote.
|
|
122
|
+
*
|
|
123
|
+
* Requirements:
|
|
124
|
+
*
|
|
125
|
+
* - `timepoint` must be in the past. If operating using block numbers, the block must be
|
|
126
|
+
* already
|
|
127
|
+
* mined.
|
|
128
|
+
*/
|
|
129
|
+
function _getPastTotalSupply(uint256 timepoint) internal view returns (uint256) {
|
|
130
|
+
require(timepoint < _clock(), "Votes: future lookup");
|
|
131
|
+
return
|
|
132
|
+
VotesStorage.layout()._totalCheckpoints.upperLookupRecent(
|
|
133
|
+
SafeCastLib.toUint32(timepoint)
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* @dev Returns the delegate that `account` has chosen.
|
|
139
|
+
*/
|
|
140
|
+
function _delegates(address account) internal view returns (address) {
|
|
141
|
+
return VotesStorage.layout()._delegation[account];
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* @dev Delegates votes from signer to `delegatee`.
|
|
146
|
+
*/
|
|
147
|
+
function _delegateBySig(
|
|
148
|
+
address delegatee,
|
|
149
|
+
uint256 nonce,
|
|
150
|
+
uint256 expiry,
|
|
151
|
+
uint8 v,
|
|
152
|
+
bytes32 r,
|
|
153
|
+
bytes32 s
|
|
154
|
+
) internal {
|
|
155
|
+
require(block.timestamp <= expiry, "Votes: signature expired");
|
|
156
|
+
address signer = ECDSA.recover(
|
|
157
|
+
_hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),
|
|
158
|
+
v,
|
|
159
|
+
r,
|
|
160
|
+
s
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
_useCheckedNonce(signer, nonce);
|
|
164
|
+
_delegate(signer, delegatee);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* @dev Must return the voting units held by an account.
|
|
169
|
+
*/
|
|
170
|
+
function _getVotingUnits(address) internal view virtual returns (uint256);
|
|
171
|
+
|
|
172
|
+
// =============================================================
|
|
173
|
+
// Internal
|
|
174
|
+
// =============================================================
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* @dev Returns the current total supply of votes.
|
|
178
|
+
*/
|
|
179
|
+
function _getTotalSupply() internal view virtual returns (uint256) {
|
|
180
|
+
return VotesStorage.layout()._totalCheckpoints.latest();
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* @dev Delegate all of `account`'s voting units to `delegatee`.
|
|
185
|
+
*
|
|
186
|
+
* Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}.
|
|
187
|
+
*/
|
|
188
|
+
function _delegate(address account, address delegatee) internal virtual {
|
|
189
|
+
_beforeDelegate(account, delegatee);
|
|
190
|
+
|
|
191
|
+
address oldDelegate = _delegates(account);
|
|
192
|
+
VotesStorage.layout()._delegation[account] = delegatee;
|
|
193
|
+
|
|
194
|
+
emit IVotes.DelegateChanged(account, oldDelegate, delegatee);
|
|
195
|
+
_moveDelegateVotes(oldDelegate, delegatee, _getVotingUnits(account));
|
|
196
|
+
|
|
197
|
+
_afterDelegate(account, delegatee);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* @dev Transfers, mints, or burns voting units. To register a mint, `from` should be zero. To
|
|
202
|
+
* register a burn, `to`
|
|
203
|
+
* should be zero. Total supply of voting units will be adjusted with mints and burns.
|
|
204
|
+
*/
|
|
205
|
+
function _transferVotingUnits(address from, address to, uint256 amount) internal virtual {
|
|
206
|
+
if (from == address(0)) {
|
|
207
|
+
_push(VotesStorage.layout()._totalCheckpoints, _add, SafeCastLib.toUint224(amount));
|
|
208
|
+
}
|
|
209
|
+
if (to == address(0)) {
|
|
210
|
+
_push(
|
|
211
|
+
VotesStorage.layout()._totalCheckpoints,
|
|
212
|
+
_subtract,
|
|
213
|
+
SafeCastLib.toUint224(amount)
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
_moveDelegateVotes(_delegates(from), _delegates(to), amount);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* @dev Moves delegated votes from one delegate to another.
|
|
221
|
+
*/
|
|
222
|
+
function _moveDelegateVotes(address from, address to, uint256 amount) private {
|
|
223
|
+
if (from != to && amount > 0) {
|
|
224
|
+
if (from != address(0)) {
|
|
225
|
+
(uint256 oldValue, uint256 newValue) = _push(
|
|
226
|
+
VotesStorage.layout()._delegateCheckpoints[from],
|
|
227
|
+
_subtract,
|
|
228
|
+
SafeCastLib.toUint224(amount)
|
|
229
|
+
);
|
|
230
|
+
emit IVotes.DelegateVotesChanged(from, oldValue, newValue);
|
|
231
|
+
}
|
|
232
|
+
if (to != address(0)) {
|
|
233
|
+
(uint256 oldValue, uint256 newValue) = _push(
|
|
234
|
+
VotesStorage.layout()._delegateCheckpoints[to],
|
|
235
|
+
_add,
|
|
236
|
+
SafeCastLib.toUint224(amount)
|
|
237
|
+
);
|
|
238
|
+
emit IVotes.DelegateVotesChanged(to, oldValue, newValue);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function _push(
|
|
244
|
+
Checkpoints.Trace224 storage store,
|
|
245
|
+
function(uint224, uint224) view returns (uint224) op,
|
|
246
|
+
uint224 delta
|
|
247
|
+
) private returns (uint224, uint224) {
|
|
248
|
+
return store.push(SafeCastLib.toUint32(_clock()), op(store.latest(), delta));
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
function _add(uint224 a, uint224 b) private pure returns (uint224) {
|
|
252
|
+
return a + b;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
function _subtract(uint224 a, uint224 b) private pure returns (uint224) {
|
|
256
|
+
return a - b;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* @dev Hook that is called before any delegate operation. This includes {delegate} and
|
|
261
|
+
* {delegateBySig}.
|
|
262
|
+
* @param signer The account that signs the delegation.
|
|
263
|
+
* @param delegatee The account that will be delegated to.
|
|
264
|
+
*/
|
|
265
|
+
function _beforeDelegate(address signer, address delegatee) internal virtual {}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* @dev Hook that is called after any delegate operation. This includes {delegate} and
|
|
269
|
+
* {delegateBySig}.
|
|
270
|
+
* @param account The account that has been delegated.
|
|
271
|
+
* @param delegatee The account that has been delegated to.
|
|
272
|
+
*/
|
|
273
|
+
function _afterDelegate(address account, address delegatee) internal virtual {}
|
|
274
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
import {Checkpoints} from "./Checkpoints.sol";
|
|
5
|
+
|
|
6
|
+
library VotesStorage {
|
|
7
|
+
bytes32 internal constant STORAGE_SLOT = keccak256("diamond.facets.governance.votes.storage");
|
|
8
|
+
|
|
9
|
+
struct Layout {
|
|
10
|
+
mapping(address => address) _delegation;
|
|
11
|
+
mapping(address => Checkpoints.Trace224) _delegateCheckpoints;
|
|
12
|
+
Checkpoints.Trace224 _totalCheckpoints;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function layout() internal pure returns (Layout storage l) {
|
|
16
|
+
bytes32 position = STORAGE_SLOT;
|
|
17
|
+
assembly {
|
|
18
|
+
l.slot := position
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
|
|
6
|
+
// libraries
|
|
7
|
+
|
|
8
|
+
// contracts
|
|
9
|
+
|
|
10
|
+
interface IVotesEnumerable {
|
|
11
|
+
/// @notice Get all delegators who have delegated their voting power
|
|
12
|
+
/// @return Array of delegator addresses
|
|
13
|
+
function getDelegators() external view returns (address[] memory);
|
|
14
|
+
|
|
15
|
+
/// @notice Get the total number of delegators
|
|
16
|
+
/// @return Total number of delegators
|
|
17
|
+
function getDelegatorsCount() external view returns (uint256);
|
|
18
|
+
|
|
19
|
+
/// @notice Get a paginated list of delegators
|
|
20
|
+
/// @param cursor The starting index for pagination
|
|
21
|
+
/// @param size The number of delegators to return
|
|
22
|
+
/// @return delegators Array of delegator addresses for the requested page
|
|
23
|
+
/// @return next The cursor for the next page, returns 0 if no more pages
|
|
24
|
+
function getPaginatedDelegators(
|
|
25
|
+
uint256 cursor,
|
|
26
|
+
uint256 size
|
|
27
|
+
) external view returns (address[] memory delegators, uint256 next);
|
|
28
|
+
|
|
29
|
+
/// @notice Get all delegators who have delegated their voting power to a specific account
|
|
30
|
+
/// @param account The delegatee address to get delegators for
|
|
31
|
+
/// @return Array of delegator addresses who delegated to the specified account
|
|
32
|
+
function getDelegatorsByDelegatee(address account) external view returns (address[] memory);
|
|
33
|
+
|
|
34
|
+
/// @notice Get the timestamp when a delegator last delegated their voting power
|
|
35
|
+
/// @param account The delegator address to get delegation time for
|
|
36
|
+
/// @return Timestamp of the last delegation, returns 0 if never delegated
|
|
37
|
+
function getDelegationTimeForDelegator(address account) external view returns (uint256);
|
|
38
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IVotesEnumerable} from "src/diamond/facets/governance/votes/enumerable/IVotesEnumerable.sol";
|
|
6
|
+
|
|
7
|
+
// libraries
|
|
8
|
+
import {VotesEnumerableLib} from "src/diamond/facets/governance/votes/enumerable/VotesEnumerableLib.sol";
|
|
9
|
+
|
|
10
|
+
// contracts
|
|
11
|
+
abstract contract VotesEnumerable is IVotesEnumerable {
|
|
12
|
+
/// @inheritdoc IVotesEnumerable
|
|
13
|
+
function getDelegators() external view returns (address[] memory) {
|
|
14
|
+
return VotesEnumerableLib.getDelegators();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/// @inheritdoc IVotesEnumerable
|
|
18
|
+
function getDelegatorsCount() external view returns (uint256) {
|
|
19
|
+
return VotesEnumerableLib.getDelegatorsCount();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/// @inheritdoc IVotesEnumerable
|
|
23
|
+
function getPaginatedDelegators(
|
|
24
|
+
uint256 cursor,
|
|
25
|
+
uint256 size
|
|
26
|
+
) external view returns (address[] memory delegators, uint256 next) {
|
|
27
|
+
return VotesEnumerableLib.getPaginatedDelegators(cursor, size);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/// @inheritdoc IVotesEnumerable
|
|
31
|
+
function getDelegatorsByDelegatee(address delegatee) external view returns (address[] memory) {
|
|
32
|
+
return VotesEnumerableLib.getDelegatorsByDelegatee(delegatee);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/// @inheritdoc IVotesEnumerable
|
|
36
|
+
function getDelegationTimeForDelegator(address delegator) external view returns (uint256) {
|
|
37
|
+
return VotesEnumerableLib.getDelegationTimeForDelegator(delegator);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// libraries
|
|
5
|
+
import {EnumerableSetLib} from "solady/utils/EnumerableSetLib.sol";
|
|
6
|
+
import {FixedPointMathLib} from "solady/utils/FixedPointMathLib.sol";
|
|
7
|
+
|
|
8
|
+
library VotesEnumerableLib {
|
|
9
|
+
using EnumerableSetLib for EnumerableSetLib.AddressSet;
|
|
10
|
+
|
|
11
|
+
struct Layout {
|
|
12
|
+
// Set of all delegators
|
|
13
|
+
EnumerableSetLib.AddressSet delegators;
|
|
14
|
+
// Mapping of delegatee to their delegators
|
|
15
|
+
mapping(address => EnumerableSetLib.AddressSet) delegatorsByDelegatee;
|
|
16
|
+
// Mapping of delegator to their delegation timestamp
|
|
17
|
+
mapping(address => uint256) delegationTimeForDelegator;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// keccak256(abi.encode(uint256(keccak256("diamond.facets.governance.votes.enumerable.storage"))
|
|
21
|
+
// -
|
|
22
|
+
// 1)) & ~bytes32(uint256(0xff))
|
|
23
|
+
bytes32 internal constant STORAGE_SLOT =
|
|
24
|
+
0xed095a1d53cef9e2be0aab14d20856bfa3fbcc76a945321739a0da68a6078e00;
|
|
25
|
+
|
|
26
|
+
function layout() internal pure returns (Layout storage l) {
|
|
27
|
+
assembly {
|
|
28
|
+
l.slot := STORAGE_SLOT
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function getDelegators() internal view returns (address[] memory) {
|
|
33
|
+
return layout().delegators.values();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function getDelegatorsByDelegatee(address account) internal view returns (address[] memory) {
|
|
37
|
+
return layout().delegatorsByDelegatee[account].values();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function getDelegationTimeForDelegator(address account) internal view returns (uint256) {
|
|
41
|
+
return layout().delegationTimeForDelegator[account];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function getDelegatorsCount() internal view returns (uint256) {
|
|
45
|
+
return layout().delegators.length();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function getPaginatedDelegators(
|
|
49
|
+
uint256 cursor,
|
|
50
|
+
uint256 size
|
|
51
|
+
) internal view returns (address[] memory delegators, uint256 next) {
|
|
52
|
+
Layout storage ds = layout();
|
|
53
|
+
uint256 length = ds.delegators.length();
|
|
54
|
+
|
|
55
|
+
// Return empty array if cursor is out of bounds
|
|
56
|
+
if (cursor >= length) {
|
|
57
|
+
return (new address[](0), 0);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Calculate actual page size (handle last page case)
|
|
61
|
+
uint256 pageSize = FixedPointMathLib.min(size, length - cursor);
|
|
62
|
+
|
|
63
|
+
// Initialize return array
|
|
64
|
+
delegators = new address[](pageSize);
|
|
65
|
+
|
|
66
|
+
// Populate return array
|
|
67
|
+
for (uint256 i = 0; i < pageSize; ++i) {
|
|
68
|
+
delegators[i] = ds.delegators.at(cursor + i);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Set next cursor
|
|
72
|
+
next = (cursor + pageSize) % length;
|
|
73
|
+
|
|
74
|
+
return (delegators, next);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function setDelegators(
|
|
78
|
+
address account,
|
|
79
|
+
address newDelegatee,
|
|
80
|
+
address currentDelegatee
|
|
81
|
+
) internal {
|
|
82
|
+
Layout storage ds = layout();
|
|
83
|
+
|
|
84
|
+
// If current delegatee is address(0), add account to delegators
|
|
85
|
+
if (currentDelegatee == address(0)) {
|
|
86
|
+
ds.delegators.add(account);
|
|
87
|
+
} else {
|
|
88
|
+
// Remove account from current delegatee's delegators
|
|
89
|
+
ds.delegatorsByDelegatee[currentDelegatee].remove(account);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (newDelegatee == address(0)) {
|
|
93
|
+
// Remove account from delegators and reset delegation time
|
|
94
|
+
ds.delegators.remove(account);
|
|
95
|
+
ds.delegationTimeForDelegator[account] = 0;
|
|
96
|
+
} else {
|
|
97
|
+
// Add account to new delegatee's delegators and update timestamp
|
|
98
|
+
ds.delegatorsByDelegatee[newDelegatee].add(account);
|
|
99
|
+
ds.delegationTimeForDelegator[account] = block.timestamp;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
|
|
6
|
+
// libraries
|
|
7
|
+
|
|
8
|
+
// contracts
|
|
9
|
+
|
|
10
|
+
interface IMetadataBase {
|
|
11
|
+
/// @dev Emitted when the contract URI is changed
|
|
12
|
+
event ContractURIChanged(string uri);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
interface IMetadata is IMetadataBase {
|
|
16
|
+
/// @dev Returns the contract type
|
|
17
|
+
function contractType() external view returns (bytes32);
|
|
18
|
+
|
|
19
|
+
/// @dev Returns the contract version
|
|
20
|
+
function contractVersion() external view returns (uint32);
|
|
21
|
+
|
|
22
|
+
/// @dev Returns the metadata URI of the contract
|
|
23
|
+
function contractURI() external view returns (string memory);
|
|
24
|
+
|
|
25
|
+
/// @dev Sets the metadata URI of the contract
|
|
26
|
+
function setContractURI(string calldata uri) external;
|
|
27
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IMetadata} from "./IMetadata.sol";
|
|
6
|
+
|
|
7
|
+
// libraries
|
|
8
|
+
|
|
9
|
+
// contracts
|
|
10
|
+
import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
|
|
11
|
+
import {OwnableBase} from "@towns-protocol/diamond/src/facets/ownable/OwnableBase.sol";
|
|
12
|
+
|
|
13
|
+
contract MetadataFacet is IMetadata, OwnableBase, Facet {
|
|
14
|
+
function __MetadataFacet_init(
|
|
15
|
+
bytes32 _contractType,
|
|
16
|
+
string memory _contractURI
|
|
17
|
+
) external onlyInitializing {
|
|
18
|
+
__MetadataFacet_init_unchained(_contractType, _contractURI);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function __MetadataFacet_init_unchained(
|
|
22
|
+
bytes32 _contractType,
|
|
23
|
+
string memory _contractURI
|
|
24
|
+
) internal {
|
|
25
|
+
_addInterface(type(IMetadata).interfaceId);
|
|
26
|
+
|
|
27
|
+
MetadataStorage.Layout storage ds = MetadataStorage.layout();
|
|
28
|
+
ds.contractType = _contractType;
|
|
29
|
+
ds.contractURI = _contractURI;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function contractType() external view returns (bytes32) {
|
|
33
|
+
return MetadataStorage.layout().contractType;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function contractVersion() external view virtual returns (uint32) {
|
|
37
|
+
return _getInitializedVersion();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function contractURI() external view returns (string memory) {
|
|
41
|
+
return MetadataStorage.layout().contractURI;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function setContractURI(string calldata uri) external onlyOwner {
|
|
45
|
+
MetadataStorage.layout().contractURI = uri;
|
|
46
|
+
emit ContractURIChanged(uri);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// =============================================================
|
|
51
|
+
// Storage
|
|
52
|
+
// =============================================================
|
|
53
|
+
|
|
54
|
+
library MetadataStorage {
|
|
55
|
+
struct Layout {
|
|
56
|
+
bytes32 contractType;
|
|
57
|
+
string contractURI;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// keccak256(abi.encode(uint256(keccak256("diamond.facets.metadata.storage")) - 1)) &
|
|
61
|
+
// ~bytes32(uint256(0xff))
|
|
62
|
+
bytes32 internal constant STORAGE_SLOT =
|
|
63
|
+
0xf5e7800d151c04390bdf7c63536bd6072359c9f89940782fbad33a288db56300;
|
|
64
|
+
|
|
65
|
+
function layout() internal pure returns (Layout storage ds) {
|
|
66
|
+
bytes32 slot = STORAGE_SLOT;
|
|
67
|
+
assembly {
|
|
68
|
+
ds.slot := slot
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IERC5643} from "./IERC5643.sol";
|
|
6
|
+
|
|
7
|
+
// libraries
|
|
8
|
+
|
|
9
|
+
// contracts
|
|
10
|
+
|
|
11
|
+
import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
|
|
12
|
+
import {ERC5643Base} from "src/diamond/facets/token/ERC5643/ERC5643Base.sol";
|
|
13
|
+
import {ERC721ABase} from "src/diamond/facets/token/ERC721A/ERC721ABase.sol";
|
|
14
|
+
|
|
15
|
+
contract ERC5643 is IERC5643, ERC5643Base, ERC721ABase, Facet {
|
|
16
|
+
function __ERC5643_init() external onlyInitializing {
|
|
17
|
+
_addInterface(type(IERC5643).interfaceId);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function renewSubscription(uint256 tokenId, uint64 duration) external payable virtual {
|
|
21
|
+
if (duration == 0) revert ERC5643__DurationZero();
|
|
22
|
+
if (!_isApprovedOrOwner(tokenId)) revert ERC5643__NotApprovedOrOwner();
|
|
23
|
+
_renewSubscription(tokenId, duration);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function cancelSubscription(uint256 tokenId) external payable virtual {
|
|
27
|
+
if (!_isApprovedOrOwner(tokenId)) revert ERC5643__NotApprovedOrOwner();
|
|
28
|
+
_cancelSubscription(tokenId);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function expiresAt(uint256 tokenId) external view returns (uint64) {
|
|
32
|
+
return _expiresAt(tokenId);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function isRenewable(uint256 tokenId) external view returns (bool) {
|
|
36
|
+
return _isRenewable(tokenId);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// =============================================================
|
|
40
|
+
// Internal
|
|
41
|
+
// =============================================================
|
|
42
|
+
|
|
43
|
+
function _isApprovedOrOwner(uint256 tokenId) internal view returns (bool) {
|
|
44
|
+
address owner = _ownerOf(tokenId);
|
|
45
|
+
|
|
46
|
+
return
|
|
47
|
+
(_msgSenderERC721A() == owner) ||
|
|
48
|
+
_isApprovedForAll(owner, _msgSenderERC721A()) ||
|
|
49
|
+
_getApproved(tokenId) == _msgSenderERC721A();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IERC5643Base} from "./IERC5643.sol";
|
|
6
|
+
|
|
7
|
+
// libraries
|
|
8
|
+
import {ERC5643Storage} from "./ERC5643Storage.sol";
|
|
9
|
+
|
|
10
|
+
// contracts
|
|
11
|
+
|
|
12
|
+
abstract contract ERC5643Base is IERC5643Base {
|
|
13
|
+
function _renewSubscription(uint256 tokenId, uint64 duration) internal {
|
|
14
|
+
ERC5643Storage.Layout storage ds = ERC5643Storage.layout();
|
|
15
|
+
uint64 currentExpiration = ds.expiration[tokenId];
|
|
16
|
+
|
|
17
|
+
// Check renewability for existing subscriptions
|
|
18
|
+
if (currentExpiration != 0 && !_isRenewable(tokenId)) {
|
|
19
|
+
revert ERC5643__SubscriptionNotRenewable(tokenId);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Calculate new expiration
|
|
23
|
+
uint64 newExpiration;
|
|
24
|
+
if (currentExpiration > block.timestamp) {
|
|
25
|
+
// Active subscription: extend from current expiration
|
|
26
|
+
newExpiration = currentExpiration + duration;
|
|
27
|
+
} else {
|
|
28
|
+
// New or expired subscription: start from current time
|
|
29
|
+
newExpiration = uint64(block.timestamp) + duration;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
ds.expiration[tokenId] = newExpiration;
|
|
33
|
+
emit SubscriptionUpdate(tokenId, newExpiration);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function _cancelSubscription(uint256 tokenId) internal {
|
|
37
|
+
delete ERC5643Storage.layout().expiration[tokenId];
|
|
38
|
+
emit SubscriptionUpdate(tokenId, 0);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function _expiresAt(uint256 tokenId) internal view returns (uint64) {
|
|
42
|
+
return ERC5643Storage.layout().expiration[tokenId];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function _isRenewable(uint256) internal view virtual returns (bool) {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
}
|