@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,124 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IPlatformRequirementsBase} from "./IPlatformRequirements.sol";
|
|
6
|
+
|
|
7
|
+
// libraries
|
|
8
|
+
import {PlatformRequirementsStorage} from "./PlatformRequirementsStorage.sol";
|
|
9
|
+
import {BasisPoints} from "src/utils/libraries/BasisPoints.sol";
|
|
10
|
+
import {CustomRevert} from "src/utils/libraries/CustomRevert.sol";
|
|
11
|
+
|
|
12
|
+
// contracts
|
|
13
|
+
|
|
14
|
+
abstract contract PlatformRequirementsBase is IPlatformRequirementsBase {
|
|
15
|
+
using CustomRevert for bytes4;
|
|
16
|
+
|
|
17
|
+
// Denominator
|
|
18
|
+
function _getDenominator() internal pure virtual returns (uint256) {
|
|
19
|
+
return 10_000;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Fee Recipient
|
|
23
|
+
function _setFeeRecipient(address recipient) internal {
|
|
24
|
+
if (recipient == address(0)) {
|
|
25
|
+
Platform__InvalidFeeRecipient.selector.revertWith();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
PlatformRequirementsStorage.layout().feeRecipient = recipient;
|
|
29
|
+
|
|
30
|
+
emit PlatformFeeRecipientSet(recipient);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function _getFeeRecipient() internal view returns (address) {
|
|
34
|
+
return PlatformRequirementsStorage.layout().feeRecipient;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Membership BPS
|
|
38
|
+
function _setMembershipBps(uint16 bps) internal {
|
|
39
|
+
if (bps > BasisPoints.MAX_BPS) {
|
|
40
|
+
Platform__InvalidMembershipBps.selector.revertWith();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
PlatformRequirementsStorage.layout().membershipBps = bps;
|
|
44
|
+
emit PlatformMembershipBpsSet(bps);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function _getMembershipBps() internal view returns (uint16) {
|
|
48
|
+
return PlatformRequirementsStorage.layout().membershipBps;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Membership Fee
|
|
52
|
+
function _setMembershipFee(uint256 fee) internal {
|
|
53
|
+
PlatformRequirementsStorage.layout().membershipFee = fee;
|
|
54
|
+
emit PlatformMembershipFeeSet(fee);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function _getMembershipFee() internal view returns (uint256) {
|
|
58
|
+
return PlatformRequirementsStorage.layout().membershipFee;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Membership Mint Limit
|
|
62
|
+
function _setMembershipMintLimit(uint256 limit) internal {
|
|
63
|
+
if (limit == 0) Platform__InvalidMembershipMintLimit.selector.revertWith();
|
|
64
|
+
|
|
65
|
+
PlatformRequirementsStorage.layout().membershipMintLimit = limit;
|
|
66
|
+
emit PlatformMembershipMintLimitSet(limit);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function _getMembershipMintLimit() internal view returns (uint256) {
|
|
70
|
+
return PlatformRequirementsStorage.layout().membershipMintLimit;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Membership Duration
|
|
74
|
+
function _setMembershipDuration(uint64 duration) internal {
|
|
75
|
+
if (duration == 0) {
|
|
76
|
+
Platform__InvalidMembershipDuration.selector.revertWith();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
PlatformRequirementsStorage.layout().membershipDuration = duration;
|
|
80
|
+
emit PlatformMembershipDurationSet(duration);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function _getMembershipDuration() internal view returns (uint64) {
|
|
84
|
+
return PlatformRequirementsStorage.layout().membershipDuration;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Membership Min Price
|
|
88
|
+
function _setMembershipMinPrice(uint256 minPrice) internal {
|
|
89
|
+
if (minPrice == 0) {
|
|
90
|
+
Platform__InvalidMembershipMinPrice.selector.revertWith();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
PlatformRequirementsStorage.layout().membershipMinPrice = minPrice;
|
|
94
|
+
emit PlatformMembershipMinPriceSet(minPrice);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function _getMembershipMinPrice() internal view returns (uint256) {
|
|
98
|
+
return PlatformRequirementsStorage.layout().membershipMinPrice;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function _setSwapFees(uint16 protocolBps, uint16 posterBps) internal {
|
|
102
|
+
if (posterBps > BasisPoints.MAX_BPS || protocolBps > BasisPoints.MAX_BPS) {
|
|
103
|
+
Platform__InvalidSwapFeeBps.selector.revertWith();
|
|
104
|
+
}
|
|
105
|
+
PlatformRequirementsStorage.Layout storage $ = PlatformRequirementsStorage.layout();
|
|
106
|
+
($.swapProtocolBps, $.swapPosterBps) = (protocolBps, posterBps);
|
|
107
|
+
emit PlatformSwapFeesSet(protocolBps, posterBps);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function _getSwapFees() internal view returns (uint16 protocolBps, uint16 posterBps) {
|
|
111
|
+
PlatformRequirementsStorage.Layout storage $ = PlatformRequirementsStorage.layout();
|
|
112
|
+
return ($.swapProtocolBps, $.swapPosterBps);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function _setRouterWhitelisted(address router, bool whitelisted) internal {
|
|
116
|
+
PlatformRequirementsStorage.Layout storage $ = PlatformRequirementsStorage.layout();
|
|
117
|
+
$.whitelistedRouters[router] = whitelisted;
|
|
118
|
+
emit RouterWhitelistUpdated(router, whitelisted);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function _isRouterWhitelisted(address router) internal view returns (bool) {
|
|
122
|
+
return PlatformRequirementsStorage.layout().whitelistedRouters[router];
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IPlatformRequirements} from "./IPlatformRequirements.sol";
|
|
6
|
+
|
|
7
|
+
// libraries
|
|
8
|
+
|
|
9
|
+
// contracts
|
|
10
|
+
|
|
11
|
+
import {PlatformRequirementsBase} from "./PlatformRequirementsBase.sol";
|
|
12
|
+
import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
|
|
13
|
+
import {OwnableBase} from "@towns-protocol/diamond/src/facets/ownable/OwnableBase.sol";
|
|
14
|
+
|
|
15
|
+
contract PlatformRequirementsFacet is
|
|
16
|
+
IPlatformRequirements,
|
|
17
|
+
PlatformRequirementsBase,
|
|
18
|
+
OwnableBase,
|
|
19
|
+
Facet
|
|
20
|
+
{
|
|
21
|
+
function __PlatformRequirements_init(
|
|
22
|
+
address feeRecipient,
|
|
23
|
+
uint16 membershipBps,
|
|
24
|
+
uint256 membershipFee,
|
|
25
|
+
uint256 membershipMintLimit,
|
|
26
|
+
uint64 membershipDuration,
|
|
27
|
+
uint256 membershipMinPrice
|
|
28
|
+
) external onlyInitializing {
|
|
29
|
+
_addInterface(type(IPlatformRequirements).interfaceId);
|
|
30
|
+
_setFeeRecipient(feeRecipient);
|
|
31
|
+
_setMembershipBps(membershipBps);
|
|
32
|
+
_setMembershipFee(membershipFee);
|
|
33
|
+
_setMembershipMintLimit(membershipMintLimit);
|
|
34
|
+
_setMembershipDuration(membershipDuration);
|
|
35
|
+
_setMembershipMinPrice(membershipMinPrice);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/// @inheritdoc IPlatformRequirements
|
|
39
|
+
function getFeeRecipient() external view returns (address) {
|
|
40
|
+
return _getFeeRecipient();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/// @inheritdoc IPlatformRequirements
|
|
44
|
+
function getMembershipBps() external view returns (uint16) {
|
|
45
|
+
return _getMembershipBps();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/// @inheritdoc IPlatformRequirements
|
|
49
|
+
function getMembershipFee() external view returns (uint256) {
|
|
50
|
+
return _getMembershipFee();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/// @inheritdoc IPlatformRequirements
|
|
54
|
+
function getMembershipMintLimit() external view returns (uint256) {
|
|
55
|
+
return _getMembershipMintLimit();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/// @inheritdoc IPlatformRequirements
|
|
59
|
+
function getMembershipDuration() external view returns (uint64) {
|
|
60
|
+
return _getMembershipDuration();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/// @inheritdoc IPlatformRequirements
|
|
64
|
+
function setMembershipMinPrice(uint256 minPrice) external onlyOwner {
|
|
65
|
+
_setMembershipMinPrice(minPrice);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/// @inheritdoc IPlatformRequirements
|
|
69
|
+
function getMembershipMinPrice() external view returns (uint256) {
|
|
70
|
+
return _getMembershipMinPrice();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/// @inheritdoc IPlatformRequirements
|
|
74
|
+
function setFeeRecipient(address recipient) external onlyOwner {
|
|
75
|
+
_setFeeRecipient(recipient);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/// @inheritdoc IPlatformRequirements
|
|
79
|
+
function setMembershipBps(uint16 bps) external onlyOwner {
|
|
80
|
+
_setMembershipBps(bps);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/// @inheritdoc IPlatformRequirements
|
|
84
|
+
function setMembershipFee(uint256 fee) external onlyOwner {
|
|
85
|
+
_setMembershipFee(fee);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/// @inheritdoc IPlatformRequirements
|
|
89
|
+
function setMembershipMintLimit(uint256 limit) external onlyOwner {
|
|
90
|
+
_setMembershipMintLimit(limit);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/// @inheritdoc IPlatformRequirements
|
|
94
|
+
function setMembershipDuration(uint64 duration) external onlyOwner {
|
|
95
|
+
_setMembershipDuration(duration);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/// @inheritdoc IPlatformRequirements
|
|
99
|
+
function getDenominator() external pure returns (uint256) {
|
|
100
|
+
return _getDenominator();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/// @inheritdoc IPlatformRequirements
|
|
104
|
+
function getSwapFees() external view returns (uint16 protocolBps, uint16 posterBps) {
|
|
105
|
+
return _getSwapFees();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/// @inheritdoc IPlatformRequirements
|
|
109
|
+
function setSwapFees(uint16 protocolBps, uint16 posterBps) external onlyOwner {
|
|
110
|
+
_setSwapFees(protocolBps, posterBps);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/// @inheritdoc IPlatformRequirements
|
|
114
|
+
function isRouterWhitelisted(address router) external view returns (bool) {
|
|
115
|
+
return _isRouterWhitelisted(router);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/// @inheritdoc IPlatformRequirements
|
|
119
|
+
function setRouterWhitelisted(address router, bool whitelisted) external onlyOwner {
|
|
120
|
+
_setRouterWhitelisted(router, whitelisted);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
|
|
6
|
+
// libraries
|
|
7
|
+
|
|
8
|
+
// contracts
|
|
9
|
+
|
|
10
|
+
library PlatformRequirementsStorage {
|
|
11
|
+
// keccak256(abi.encode(uint256(keccak256("spaces.facets.platform.requirements.storage")) - 1))
|
|
12
|
+
// &
|
|
13
|
+
// ~bytes32(uint256(0xff))
|
|
14
|
+
bytes32 internal constant STORAGE_SLOT =
|
|
15
|
+
0xb29a817dd0719f30ad87abc8dff26e6354077e5b46bf38f34d5ac48732860d00;
|
|
16
|
+
|
|
17
|
+
struct Layout {
|
|
18
|
+
// slot 0
|
|
19
|
+
uint256 membershipFee;
|
|
20
|
+
// slot 1
|
|
21
|
+
uint256 membershipMintLimit;
|
|
22
|
+
// slot 2
|
|
23
|
+
address feeRecipient;
|
|
24
|
+
uint64 membershipDuration;
|
|
25
|
+
uint16 membershipBps;
|
|
26
|
+
// slot 3
|
|
27
|
+
uint256 membershipMinPrice;
|
|
28
|
+
// slot 4
|
|
29
|
+
uint16 swapProtocolBps;
|
|
30
|
+
uint16 swapPosterBps;
|
|
31
|
+
// slot 5
|
|
32
|
+
mapping(address => bool) whitelistedRouters;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function layout() internal pure returns (Layout storage l) {
|
|
36
|
+
bytes32 slot = STORAGE_SLOT;
|
|
37
|
+
assembly {
|
|
38
|
+
l.slot := slot
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
|
|
6
|
+
// libraries
|
|
7
|
+
|
|
8
|
+
// contracts
|
|
9
|
+
interface IImplementationRegistryBase {
|
|
10
|
+
// =============================================================
|
|
11
|
+
// Errors
|
|
12
|
+
// =============================================================
|
|
13
|
+
error InvalidContractType();
|
|
14
|
+
error InvalidVersion();
|
|
15
|
+
|
|
16
|
+
// =============================================================
|
|
17
|
+
// Events
|
|
18
|
+
// =============================================================
|
|
19
|
+
event ImplementationAdded(address implementation, bytes32 contractType, uint32 version);
|
|
20
|
+
event ImplementationApproved(address implementation, bool approved);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface IImplementationRegistry is IImplementationRegistryBase {
|
|
24
|
+
/// @notice Add an implementation to the registry
|
|
25
|
+
/// @param implementation The address of the implementation
|
|
26
|
+
function addImplementation(address implementation) external;
|
|
27
|
+
|
|
28
|
+
/// @notice Approve or disapprove an implementation
|
|
29
|
+
/// @param implementation The address of the implementation
|
|
30
|
+
/// @param approval The approval status
|
|
31
|
+
function approveImplementation(address implementation, bool approval) external;
|
|
32
|
+
|
|
33
|
+
/// @notice Get an implementation by contract type and version
|
|
34
|
+
/// @param contractType The contract type
|
|
35
|
+
/// @param version The version
|
|
36
|
+
/// @return The address of the implementation
|
|
37
|
+
function getImplementation(
|
|
38
|
+
bytes32 contractType,
|
|
39
|
+
uint32 version
|
|
40
|
+
) external view returns (address);
|
|
41
|
+
|
|
42
|
+
/// @notice Get the latest implementation by contract type
|
|
43
|
+
/// @param contractType The contract type
|
|
44
|
+
/// @return The address of the latest implementation
|
|
45
|
+
function getLatestImplementation(bytes32 contractType) external view returns (address);
|
|
46
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IMetadata} from "src/diamond/facets/metadata/IMetadata.sol";
|
|
6
|
+
import {IImplementationRegistry} from "src/factory/facets/registry/IImplementationRegistry.sol";
|
|
7
|
+
|
|
8
|
+
// libraries
|
|
9
|
+
import {ImplementationRegistryStorage} from "./ImplementationRegistryStorage.sol";
|
|
10
|
+
|
|
11
|
+
// contracts
|
|
12
|
+
|
|
13
|
+
import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
|
|
14
|
+
import {OwnableBase} from "@towns-protocol/diamond/src/facets/ownable/OwnableBase.sol";
|
|
15
|
+
|
|
16
|
+
contract ImplementationRegistryFacet is IImplementationRegistry, OwnableBase, Facet {
|
|
17
|
+
function __ImplementationRegistry_init() external {
|
|
18
|
+
_addInterface(type(IImplementationRegistry).interfaceId);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/// @inheritdoc IImplementationRegistry
|
|
22
|
+
function addImplementation(address implementation) external onlyOwner {
|
|
23
|
+
IMetadata metadata = IMetadata(implementation);
|
|
24
|
+
|
|
25
|
+
bytes32 contractType = metadata.contractType();
|
|
26
|
+
if (contractType == bytes32(0)) revert InvalidContractType();
|
|
27
|
+
|
|
28
|
+
ImplementationRegistryStorage.Layout storage ds = ImplementationRegistryStorage.layout();
|
|
29
|
+
|
|
30
|
+
uint32 version = metadata.contractVersion();
|
|
31
|
+
uint32 currentVersion = ds.currentVersion[contractType];
|
|
32
|
+
|
|
33
|
+
if (version <= currentVersion) revert InvalidVersion();
|
|
34
|
+
|
|
35
|
+
ds.implementation[contractType][version] = implementation;
|
|
36
|
+
ds.currentVersion[contractType] = version;
|
|
37
|
+
ds.approved[implementation] = true;
|
|
38
|
+
|
|
39
|
+
emit ImplementationAdded(implementation, contractType, version);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/// @inheritdoc IImplementationRegistry
|
|
43
|
+
function approveImplementation(address implementation, bool approval) external onlyOwner {
|
|
44
|
+
ImplementationRegistryStorage.Layout storage ds = ImplementationRegistryStorage.layout();
|
|
45
|
+
|
|
46
|
+
ds.approved[implementation] = approval;
|
|
47
|
+
|
|
48
|
+
emit ImplementationApproved(implementation, approval);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/// @inheritdoc IImplementationRegistry
|
|
52
|
+
function getImplementation(
|
|
53
|
+
bytes32 contractType,
|
|
54
|
+
uint32 version
|
|
55
|
+
) external view returns (address) {
|
|
56
|
+
return ImplementationRegistryStorage.layout().implementation[contractType][version];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/// @inheritdoc IImplementationRegistry
|
|
60
|
+
function getLatestImplementation(bytes32 contractType) external view returns (address) {
|
|
61
|
+
ImplementationRegistryStorage.Layout storage ds = ImplementationRegistryStorage.layout();
|
|
62
|
+
return ds.implementation[contractType][ds.currentVersion[contractType]];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
|
|
6
|
+
// libraries
|
|
7
|
+
|
|
8
|
+
// contracts
|
|
9
|
+
|
|
10
|
+
library ImplementationRegistryStorage {
|
|
11
|
+
// keccak256(abi.encode(uint256(keccak256("factory.facets.registry.storage")) - 1)) &
|
|
12
|
+
// ~bytes32(uint256(0xff))
|
|
13
|
+
bytes32 internal constant STORAGE_SLOT =
|
|
14
|
+
0x31d1d65d94f3e9d7ffc7a93cc3bd1ee24d47f432e2c4fc10a5d92f8e2dd98900;
|
|
15
|
+
|
|
16
|
+
struct Layout {
|
|
17
|
+
mapping(address => bool) approved;
|
|
18
|
+
mapping(bytes32 => uint32) currentVersion;
|
|
19
|
+
mapping(bytes32 => mapping(uint32 => address)) implementation;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function layout() internal pure returns (Layout storage ds) {
|
|
23
|
+
bytes32 slot = STORAGE_SLOT;
|
|
24
|
+
assembly {
|
|
25
|
+
ds.slot := slot
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
|
|
6
|
+
// libraries
|
|
7
|
+
import {WalletLib} from "./libraries/WalletLib.sol";
|
|
8
|
+
// contracts
|
|
9
|
+
|
|
10
|
+
interface IWalletLinkBase {
|
|
11
|
+
// =============================================================
|
|
12
|
+
// Structs
|
|
13
|
+
// =============================================================
|
|
14
|
+
|
|
15
|
+
/// @notice Struct for EVM only linked wallets
|
|
16
|
+
struct LinkedWallet {
|
|
17
|
+
address addr;
|
|
18
|
+
bytes signature;
|
|
19
|
+
string message;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
struct VMSpecificData {
|
|
23
|
+
string key;
|
|
24
|
+
bytes value;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/// @notice Struct for non-EVM linked wallets
|
|
28
|
+
struct NonEVMLinkedWallet {
|
|
29
|
+
WalletLib.Wallet wallet;
|
|
30
|
+
bytes signature; // Signature in the VM's native format
|
|
31
|
+
string message; // Message that was signed
|
|
32
|
+
VMSpecificData[] extraData; // Flexible array for VM-specific requirements
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/// @notice Struct for Solana wallet linking requirements
|
|
36
|
+
/// @dev This will be encoded in extraData for Solana wallets with key being "extPubKey"
|
|
37
|
+
/// SolanaSpecificData memory solanaSpecificData = abi.decode(
|
|
38
|
+
/// nonEVMWallet.extraData[0].value,
|
|
39
|
+
/// (SolanaSpecificData)
|
|
40
|
+
/// );
|
|
41
|
+
struct SolanaSpecificData {
|
|
42
|
+
uint256[5] extPubKey; // Extended public key for Solana
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
struct WalletQueryOptions {
|
|
46
|
+
bool includeDelegations;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// =============================================================
|
|
50
|
+
// Events
|
|
51
|
+
// =============================================================
|
|
52
|
+
|
|
53
|
+
/// @notice Emitted when a user links their wallet to a rootKey
|
|
54
|
+
event LinkWalletToRootKey(address indexed wallet, address indexed rootKey);
|
|
55
|
+
|
|
56
|
+
/// @notice Emitted when two wallets are unlinked
|
|
57
|
+
event RemoveLink(address indexed wallet, address indexed secondWallet);
|
|
58
|
+
|
|
59
|
+
/// @notice Emitted when a default wallet is set for a root key
|
|
60
|
+
event SetDefaultWallet(address indexed rootKey, address indexed defaultWallet);
|
|
61
|
+
|
|
62
|
+
/// @notice Emitted when a non-EVM wallet is linked to a root key
|
|
63
|
+
event LinkNonEVMWalletToRootWallet(bytes32 indexed walletHash, address indexed rootKey);
|
|
64
|
+
|
|
65
|
+
/// @notice Emitted when a non-EVM wallet is removed from a root key
|
|
66
|
+
event RemoveNonEVMWalletLink(bytes32 indexed walletHash, address indexed rootKey);
|
|
67
|
+
|
|
68
|
+
// =============================================================
|
|
69
|
+
// Errors
|
|
70
|
+
// =============================================================
|
|
71
|
+
error WalletLink__InvalidAddress();
|
|
72
|
+
error WalletLink__LinkAlreadyExists(address wallet, address rootKey);
|
|
73
|
+
error WalletLink__LinkedToAnotherRootKey(address wallet, address rootKey);
|
|
74
|
+
error WalletLink__InvalidSignature();
|
|
75
|
+
error WalletLink__NotLinked(address wallet, address rootKey);
|
|
76
|
+
error WalletLink__CannotRemoveRootWallet();
|
|
77
|
+
error WalletLink__CannotLinkToSelf();
|
|
78
|
+
error WalletLink__CannotLinkToRootWallet(address wallet, address rootKey);
|
|
79
|
+
error WalletLink__DefaultWalletAlreadySet();
|
|
80
|
+
error WalletLink__MaxLinkedWalletsReached();
|
|
81
|
+
error WalletLink__CannotRemoveDefaultWallet();
|
|
82
|
+
error WalletLink__UnsupportedVMType();
|
|
83
|
+
error WalletLink__InvalidVMSpecificData(string key, bytes value);
|
|
84
|
+
error WalletLink__InvalidMessage();
|
|
85
|
+
error WalletLink__NonEVMWalletAlreadyLinked(string wallet, address rootKey);
|
|
86
|
+
error WalletLink__InvalidNonEVMAddress();
|
|
87
|
+
error WalletLink__RootKeyMismatch(address callerRootKey, address rootKey);
|
|
88
|
+
error WalletLink__NonEVMWalletNotLinked(string wallet, address rootKey);
|
|
89
|
+
error WalletLink__AddressMismatch();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
interface IWalletLink is IWalletLinkBase {
|
|
93
|
+
/**
|
|
94
|
+
* @notice Link caller wallet to a root wallet
|
|
95
|
+
* @param rootWallet the root wallet that the caller is linking to
|
|
96
|
+
* @param nonce a nonce used to prevent replay attacks, nonce must always be higher than previous nonce
|
|
97
|
+
*/
|
|
98
|
+
function linkCallerToRootKey(LinkedWallet memory rootWallet, uint256 nonce) external;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* @notice Link a wallet to a root wallet
|
|
102
|
+
* @param wallet the wallet being linked to the root wallet
|
|
103
|
+
* @param rootWallet the root wallet that the caller is linking to
|
|
104
|
+
* @param nonce a nonce used to prevent replay attacks, nonce must always be higher than previous nonce
|
|
105
|
+
*/
|
|
106
|
+
function linkWalletToRootKey(
|
|
107
|
+
LinkedWallet memory wallet,
|
|
108
|
+
LinkedWallet memory rootWallet,
|
|
109
|
+
uint256 nonce
|
|
110
|
+
) external;
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* @notice Link a non-EVM wallet to a root wallet
|
|
114
|
+
* @param wallet the wallet being linked to the root wallet
|
|
115
|
+
* @param nonce a nonce used to prevent replay attacks, nonce must always be higher than previous nonce
|
|
116
|
+
* @dev The function can only be called by an already linked wallet
|
|
117
|
+
*/
|
|
118
|
+
function linkNonEVMWalletToRootKey(NonEVMLinkedWallet calldata wallet, uint256 nonce) external;
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* @notice Remove a non-EVM wallet link from a root wallet
|
|
122
|
+
* @param wallet the wallet being removed from the root wallet
|
|
123
|
+
* @param nonce a nonce used to prevent replay attacks, nonce must always be higher than previous nonce
|
|
124
|
+
* @dev The function can only be called by an already linked wallet
|
|
125
|
+
*/
|
|
126
|
+
function removeNonEVMWalletLink(WalletLib.Wallet memory wallet, uint256 nonce) external;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* @notice Called via the rootkey signing a message to a remove a wallet from itself
|
|
130
|
+
* @param wallet the wallet being unlinked from the sending wallet
|
|
131
|
+
*/
|
|
132
|
+
function removeLink(address wallet, LinkedWallet memory rootWallet, uint256 nonce) external;
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* @notice Remove the caller's link to their root key
|
|
136
|
+
*/
|
|
137
|
+
function removeCallerLink() external;
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* @notice Set the default wallet by the root wallet
|
|
141
|
+
* @param defaultWallet the wallet being set as the default wallet
|
|
142
|
+
* @dev A wallet can only be set as the default wallet if it is already linked to the root wallet
|
|
143
|
+
* @dev The default wallet can only be an EVM wallet for now
|
|
144
|
+
*/
|
|
145
|
+
function setDefaultWallet(address defaultWallet) external;
|
|
146
|
+
|
|
147
|
+
// =============================================================
|
|
148
|
+
// External - Read
|
|
149
|
+
// =============================================================
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* @notice Returns the default wallet for a root key
|
|
153
|
+
* @param rootKey the public key of the users rootkey to find associated wallets for
|
|
154
|
+
* @return defaultWallet the default wallet for the root key
|
|
155
|
+
*/
|
|
156
|
+
function getDefaultWallet(address rootKey) external view returns (address);
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* @notice Returns all wallets linked to a root key
|
|
160
|
+
* @param rootKey the public key of the users rootkey to find associated wallets for
|
|
161
|
+
* @return wallets an array of ethereum wallets linked to this root key
|
|
162
|
+
*/
|
|
163
|
+
function getWalletsByRootKey(address rootKey) external view returns (address[] memory wallets);
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* @notice Returns all wallets linked to a root key with their metadata
|
|
167
|
+
* @param rootKey the public key of the users rootkey to find associated wallets for
|
|
168
|
+
* @return wallets an array of wallets with their metadata
|
|
169
|
+
*/
|
|
170
|
+
function getAllWalletsByRootKey(
|
|
171
|
+
address rootKey
|
|
172
|
+
) external view returns (WalletLib.Wallet[] memory wallets);
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* @notice Returns the root key for a given wallet
|
|
176
|
+
* @param wallet the ethereum wallet to find associated root key for
|
|
177
|
+
* @return rootKey the rootkey that this wallet is linked to
|
|
178
|
+
*/
|
|
179
|
+
function getRootKeyForWallet(address wallet) external view returns (address rootKey);
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* @notice checks if a root key and wallet are linked
|
|
183
|
+
* @param rootKey the public key of the users rootkey to check
|
|
184
|
+
* @param wallet the ethereum wallet to check
|
|
185
|
+
* @return areLinked boolean if they are linked together
|
|
186
|
+
*/
|
|
187
|
+
function checkIfLinked(address rootKey, address wallet) external view returns (bool);
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* @notice checks if a root key and non-EVM wallet are linked
|
|
191
|
+
* @param rootKey the public key of the users rootkey to check
|
|
192
|
+
* @param walletHash the hash of the non-EVM wallet to check
|
|
193
|
+
* @return areLinked boolean if they are linked together
|
|
194
|
+
*/
|
|
195
|
+
function checkIfNonEVMWalletLinked(
|
|
196
|
+
address rootKey,
|
|
197
|
+
bytes32 walletHash
|
|
198
|
+
) external view returns (bool);
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* @notice gets the latest nonce for a rootkey to use a higher one for next link action
|
|
202
|
+
* @param rootKey the public key of the users rootkey to check
|
|
203
|
+
*/
|
|
204
|
+
function getLatestNonceForRootKey(address rootKey) external view returns (uint256);
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* @notice gets the dependency address for a given dependency label
|
|
208
|
+
* @param dependency the dependency label to get
|
|
209
|
+
*/
|
|
210
|
+
function getDependency(bytes32 dependency) external view returns (address);
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* @notice sets the dependency address for a given dependency label
|
|
214
|
+
* @param dependency the dependency label to set
|
|
215
|
+
* @param dependencyAddress the dependency address to set
|
|
216
|
+
*/
|
|
217
|
+
function setDependency(bytes32 dependency, address dependencyAddress) external;
|
|
218
|
+
}
|