@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,159 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {ISchemaResolver} from "@ethereum-attestation-service/eas-contracts/resolver/ISchemaResolver.sol";
|
|
6
|
+
import {IAppAccount} from "../../../spaces/facets/account/IAppAccount.sol";
|
|
7
|
+
import {ITownsApp} from "../../ITownsApp.sol";
|
|
8
|
+
|
|
9
|
+
// libraries
|
|
10
|
+
import {Attestation} from "@ethereum-attestation-service/eas-contracts/Common.sol";
|
|
11
|
+
import {ExecutionManifest} from "@erc6900/reference-implementation/interfaces/IERC6900ExecutionModule.sol";
|
|
12
|
+
|
|
13
|
+
interface IAppRegistryBase {
|
|
14
|
+
struct AppParams {
|
|
15
|
+
string name;
|
|
16
|
+
bytes32[] permissions;
|
|
17
|
+
address client;
|
|
18
|
+
uint256 installPrice;
|
|
19
|
+
uint48 accessDuration;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
struct App {
|
|
23
|
+
bytes32 appId;
|
|
24
|
+
address module;
|
|
25
|
+
address owner;
|
|
26
|
+
address client;
|
|
27
|
+
bytes32[] permissions;
|
|
28
|
+
ExecutionManifest manifest;
|
|
29
|
+
uint48 duration;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
33
|
+
/* ERRORS */
|
|
34
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
35
|
+
error AppAlreadyRegistered();
|
|
36
|
+
error AppNotRegistered();
|
|
37
|
+
error AppRevoked();
|
|
38
|
+
error AppNotInstalled();
|
|
39
|
+
error NotAppOwner();
|
|
40
|
+
error AppDoesNotImplementInterface();
|
|
41
|
+
error InvalidAppName();
|
|
42
|
+
error InvalidAddressInput();
|
|
43
|
+
error InvalidArrayInput();
|
|
44
|
+
error BannedApp();
|
|
45
|
+
error InvalidAppId();
|
|
46
|
+
error InvalidPrice();
|
|
47
|
+
error InvalidDuration();
|
|
48
|
+
error InsufficientPayment();
|
|
49
|
+
error NotAllowed();
|
|
50
|
+
error ClientAlreadyRegistered();
|
|
51
|
+
|
|
52
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
53
|
+
/* EVENTS */
|
|
54
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
55
|
+
event AppRegistered(address indexed app, bytes32 uid);
|
|
56
|
+
event AppUnregistered(address indexed app, bytes32 uid);
|
|
57
|
+
event AppUpdated(address indexed app, bytes32 uid);
|
|
58
|
+
event AppBanned(address indexed app, bytes32 uid);
|
|
59
|
+
event AppSchemaSet(bytes32 uid);
|
|
60
|
+
event AppCreated(address indexed app, bytes32 uid);
|
|
61
|
+
event AppInstalled(address indexed app, address indexed account, bytes32 indexed appId);
|
|
62
|
+
event AppUninstalled(address indexed app, address indexed account, bytes32 indexed appId);
|
|
63
|
+
event AppRenewed(address indexed app, address indexed account, bytes32 indexed appId);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/// @title IAppRegistry Interface
|
|
67
|
+
/// @notice Interface for managing app registrations and permissions
|
|
68
|
+
interface IAppRegistry is IAppRegistryBase {
|
|
69
|
+
/// @notice Get the schema structure used for registering apps
|
|
70
|
+
/// @return The schema structure
|
|
71
|
+
function getAppSchema() external view returns (string memory);
|
|
72
|
+
|
|
73
|
+
/// @notice Get the active schema ID used for app attestations
|
|
74
|
+
/// @return The schema ID
|
|
75
|
+
function getAppSchemaId() external view returns (bytes32);
|
|
76
|
+
|
|
77
|
+
/// @notice Get the attestation for a app
|
|
78
|
+
/// @param appId The app ID
|
|
79
|
+
/// @return The attestation
|
|
80
|
+
function getAppById(bytes32 appId) external view returns (App memory);
|
|
81
|
+
|
|
82
|
+
/// @notice Get the apps price
|
|
83
|
+
/// @param app The app address
|
|
84
|
+
/// @return The price
|
|
85
|
+
function getAppPrice(address app) external view returns (uint256);
|
|
86
|
+
|
|
87
|
+
/// @notice Get the duration of an app
|
|
88
|
+
/// @param app The app address
|
|
89
|
+
/// @return duration The duration of the app
|
|
90
|
+
function getAppDuration(address app) external view returns (uint48);
|
|
91
|
+
|
|
92
|
+
/// @notice Get the current version (attestation UID) for a app
|
|
93
|
+
/// @param app The app address
|
|
94
|
+
/// @return The attestation UID representing the current version
|
|
95
|
+
function getLatestAppId(address app) external view returns (bytes32);
|
|
96
|
+
|
|
97
|
+
/// @notice Get the app address associated with a client
|
|
98
|
+
/// @param client The client address
|
|
99
|
+
/// @return The app address
|
|
100
|
+
function getAppByClient(address client) external view returns (address);
|
|
101
|
+
|
|
102
|
+
/// @notice Check if a app is banned
|
|
103
|
+
/// @param app The app address
|
|
104
|
+
/// @return isBanned True if the app is banned, false otherwise
|
|
105
|
+
function isAppBanned(address app) external view returns (bool);
|
|
106
|
+
|
|
107
|
+
/// @notice Create a new app
|
|
108
|
+
/// @param params The parameters of the app
|
|
109
|
+
/// @return app The app address
|
|
110
|
+
/// @return appId The attestation UID of the registered app
|
|
111
|
+
function createApp(
|
|
112
|
+
AppParams calldata params
|
|
113
|
+
) external payable returns (address app, bytes32 appId);
|
|
114
|
+
|
|
115
|
+
/// @notice Register a new app with permissions
|
|
116
|
+
/// @param app The app address to register
|
|
117
|
+
/// @param client The client contract address that will use this app
|
|
118
|
+
/// @return appId The attestation UID of the registered app
|
|
119
|
+
function registerApp(ITownsApp app, address client) external payable returns (bytes32 appId);
|
|
120
|
+
|
|
121
|
+
/// @notice Remove a app from the registry
|
|
122
|
+
/// @param appId The app ID to remove
|
|
123
|
+
function removeApp(bytes32 appId) external;
|
|
124
|
+
|
|
125
|
+
/// @notice Renew an app
|
|
126
|
+
/// @param app The app address to renew
|
|
127
|
+
/// @param account The account to renew the app for
|
|
128
|
+
/// @param data The data to pass to the app's onRenewApp function
|
|
129
|
+
function renewApp(ITownsApp app, IAppAccount account, bytes calldata data) external payable;
|
|
130
|
+
|
|
131
|
+
/// @notice Install an app
|
|
132
|
+
/// @param app The app address to install
|
|
133
|
+
/// @param account The account to install the app to
|
|
134
|
+
/// @param data The data to pass to the app's onInstall function
|
|
135
|
+
function installApp(ITownsApp app, IAppAccount account, bytes calldata data) external payable;
|
|
136
|
+
|
|
137
|
+
/// @notice Uninstall an app
|
|
138
|
+
/// @param app The app address to uninstall
|
|
139
|
+
/// @param account The account to uninstall the app from
|
|
140
|
+
/// @param data The data to pass to the app's onUninstall function
|
|
141
|
+
function uninstallApp(ITownsApp app, IAppAccount account, bytes calldata data) external;
|
|
142
|
+
|
|
143
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
144
|
+
/* Admin */
|
|
145
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
146
|
+
/// @notice Set the schema ID used for app registrations
|
|
147
|
+
/// @param schema The new schema
|
|
148
|
+
/// @return The schema ID
|
|
149
|
+
function adminRegisterAppSchema(
|
|
150
|
+
string calldata schema,
|
|
151
|
+
ISchemaResolver resolver,
|
|
152
|
+
bool revocable
|
|
153
|
+
) external returns (bytes32);
|
|
154
|
+
|
|
155
|
+
/// @notice Ban a app from the registry
|
|
156
|
+
/// @param app The app address to ban
|
|
157
|
+
/// @return The attestation UID that was banned
|
|
158
|
+
function adminBanApp(address app) external returns (bytes32);
|
|
159
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {ISchemaRegistry} from "@ethereum-attestation-service/eas-contracts/ISchemaRegistry.sol";
|
|
6
|
+
import {ISchemaResolver} from "@ethereum-attestation-service/eas-contracts/resolver/ISchemaResolver.sol";
|
|
7
|
+
import {IERC165} from "@openzeppelin/contracts/interfaces/IERC165.sol";
|
|
8
|
+
import {ISchemaBase} from "./ISchema.sol";
|
|
9
|
+
|
|
10
|
+
// types
|
|
11
|
+
import {EMPTY_UID} from "@ethereum-attestation-service/eas-contracts/Common.sol";
|
|
12
|
+
import {SchemaRecord} from "@ethereum-attestation-service/eas-contracts/ISchemaRegistry.sol";
|
|
13
|
+
|
|
14
|
+
// libraries
|
|
15
|
+
import {SchemaLib} from "./SchemaLib.sol";
|
|
16
|
+
import {CustomRevert} from "src/utils/libraries/CustomRevert.sol";
|
|
17
|
+
import {SchemaStorage} from "./SchemaStorage.sol";
|
|
18
|
+
// contracts
|
|
19
|
+
|
|
20
|
+
abstract contract SchemaBase is ISchemaBase {
|
|
21
|
+
using CustomRevert for bytes4;
|
|
22
|
+
using SchemaLib for SchemaRecord;
|
|
23
|
+
|
|
24
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
25
|
+
/* Schema Management */
|
|
26
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
27
|
+
|
|
28
|
+
/// @notice Registers a new schema in the registry
|
|
29
|
+
/// @param schema The schema string to register
|
|
30
|
+
/// @param resolver The resolver contract for this schema
|
|
31
|
+
/// @param revocable Whether attestations using this schema can be revoked
|
|
32
|
+
/// @return schemaUID The unique identifier of the registered schema
|
|
33
|
+
/// @dev Reverts if schema is empty, resolver is invalid, or schema is already registered
|
|
34
|
+
function _registerSchema(
|
|
35
|
+
string calldata schema,
|
|
36
|
+
ISchemaResolver resolver,
|
|
37
|
+
bool revocable
|
|
38
|
+
) internal returns (bytes32 schemaUID) {
|
|
39
|
+
// check empty schema
|
|
40
|
+
if (bytes(schema).length == 0) {
|
|
41
|
+
InvalidSchema.selector.revertWith();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
checkResolver(resolver);
|
|
45
|
+
|
|
46
|
+
SchemaRecord memory schemaRecord = SchemaRecord({
|
|
47
|
+
uid: EMPTY_UID,
|
|
48
|
+
resolver: resolver,
|
|
49
|
+
revocable: revocable,
|
|
50
|
+
schema: schema
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
SchemaStorage.Layout storage db = SchemaStorage.getLayout();
|
|
54
|
+
|
|
55
|
+
schemaUID = schemaRecord.getUID();
|
|
56
|
+
if (db.schemas[schemaUID].uid != EMPTY_UID) {
|
|
57
|
+
SchemaAlreadyRegistered.selector.revertWith();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
schemaRecord.uid = schemaUID;
|
|
61
|
+
db.schemas[schemaUID] = schemaRecord;
|
|
62
|
+
|
|
63
|
+
emit ISchemaRegistry.Registered(schemaUID, msg.sender, schemaRecord);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/// @notice Retrieves a schema record by its UID
|
|
67
|
+
/// @param uid The unique identifier of the schema
|
|
68
|
+
/// @return The schema record
|
|
69
|
+
function _getSchema(bytes32 uid) internal view returns (SchemaRecord memory) {
|
|
70
|
+
return SchemaStorage.getSchema(uid);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
74
|
+
/* Validator Checks */
|
|
75
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
76
|
+
|
|
77
|
+
/// @notice Validates that a resolver implements the required interface
|
|
78
|
+
/// @param resolver The resolver contract to check
|
|
79
|
+
/// @dev Reverts if the resolver doesn't implement ISchemaResolver interface
|
|
80
|
+
function checkResolver(ISchemaResolver resolver) internal view {
|
|
81
|
+
if (
|
|
82
|
+
address(resolver) != address(0) &&
|
|
83
|
+
!IERC165(address(resolver)).supportsInterface(type(ISchemaResolver).interfaceId)
|
|
84
|
+
) {
|
|
85
|
+
InvalidSchemaResolver.selector.revertWith();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// struct
|
|
5
|
+
import {SchemaRecord} from "@ethereum-attestation-service/eas-contracts/ISchemaRegistry.sol";
|
|
6
|
+
|
|
7
|
+
library SchemaLib {
|
|
8
|
+
/// @notice Generates a unique identifier for a schema record
|
|
9
|
+
/// @param self The schema record to generate the UID for
|
|
10
|
+
/// @return The unique identifier for the schema
|
|
11
|
+
function getUID(SchemaRecord memory self) internal pure returns (bytes32) {
|
|
12
|
+
return keccak256(abi.encodePacked(self.schema, self.resolver, self.revocable));
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {ISchemaRegistry} from "@ethereum-attestation-service/eas-contracts/ISchemaRegistry.sol";
|
|
6
|
+
import {ISchemaResolver} from "@ethereum-attestation-service/eas-contracts/resolver/ISchemaResolver.sol";
|
|
7
|
+
|
|
8
|
+
// libraries
|
|
9
|
+
|
|
10
|
+
// types
|
|
11
|
+
import {SchemaRecord} from "@ethereum-attestation-service/eas-contracts/ISchemaRegistry.sol";
|
|
12
|
+
|
|
13
|
+
// contracts
|
|
14
|
+
import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
|
|
15
|
+
import {OwnableBase} from "@towns-protocol/diamond/src/facets/ownable/OwnableBase.sol";
|
|
16
|
+
import {SchemaBase} from "./SchemaBase.sol";
|
|
17
|
+
|
|
18
|
+
/// @title Schema Registry
|
|
19
|
+
/// @notice A registry for schema records
|
|
20
|
+
/// @dev This contract is used for implementation reference purposes
|
|
21
|
+
contract SchemaRegistry is ISchemaRegistry, SchemaBase, OwnableBase, Facet {
|
|
22
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
23
|
+
/* Schema Management */
|
|
24
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
25
|
+
|
|
26
|
+
/// @notice Returns the full semver contract version.
|
|
27
|
+
/// @return Semver contract version as a string.
|
|
28
|
+
function version() external pure returns (string memory) {
|
|
29
|
+
return "1.0.0";
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/// @notice Register a schema
|
|
33
|
+
/// @param schema The schema to register e.g. "(address plugin,string pluginType,bool audited)"
|
|
34
|
+
/// @param resolver A contract that will validate the schema whenever someone attests to it
|
|
35
|
+
/// @param revocable Whether the schema is revocable
|
|
36
|
+
/// @return schemaId The UID of the schema
|
|
37
|
+
function register(
|
|
38
|
+
string calldata schema,
|
|
39
|
+
ISchemaResolver resolver,
|
|
40
|
+
bool revocable
|
|
41
|
+
) external onlyOwner returns (bytes32) {
|
|
42
|
+
return _registerSchema(schema, resolver, revocable);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/// @notice Get the schema record for a given schemaId
|
|
46
|
+
/// @param uid The schemaId of the schema
|
|
47
|
+
/// @return The schema record
|
|
48
|
+
function getSchema(bytes32 uid) external view returns (SchemaRecord memory) {
|
|
49
|
+
return _getSchema(uid);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
|
|
6
|
+
// libraries
|
|
7
|
+
|
|
8
|
+
// contracts
|
|
9
|
+
|
|
10
|
+
// structs
|
|
11
|
+
import {SchemaRecord} from "@ethereum-attestation-service/eas-contracts/ISchemaRegistry.sol";
|
|
12
|
+
|
|
13
|
+
library SchemaStorage {
|
|
14
|
+
// keccak256(abi.encode(uint256(keccak256("attestations.module.schema.storage")) - 1)) &
|
|
15
|
+
// ~bytes32(uint256(0xff))
|
|
16
|
+
bytes32 internal constant STORAGE_SLOT =
|
|
17
|
+
0xfd5bc2b1c92b0a5f91f2b26739da3957fadd042854b0b9b4b07f2b0885d3e400;
|
|
18
|
+
|
|
19
|
+
struct Layout {
|
|
20
|
+
mapping(bytes32 uid => SchemaRecord schema) schemas;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/// @notice Returns the storage layout for the schema module
|
|
24
|
+
/// @return ds The storage layout struct
|
|
25
|
+
function getLayout() internal pure returns (Layout storage ds) {
|
|
26
|
+
assembly {
|
|
27
|
+
ds.slot := STORAGE_SLOT
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function getSchema(bytes32 uid) internal view returns (SchemaRecord memory) {
|
|
32
|
+
return getLayout().schemas[uid];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
|
|
6
|
+
// libraries
|
|
7
|
+
|
|
8
|
+
// contracts
|
|
9
|
+
|
|
10
|
+
interface ISimpleAppBase {
|
|
11
|
+
/// @notice Thrown when the recipient address is the zero address
|
|
12
|
+
error ZeroAddress();
|
|
13
|
+
|
|
14
|
+
/// @notice Thrown when there is no balance to withdraw
|
|
15
|
+
error NoBalanceToWithdraw();
|
|
16
|
+
|
|
17
|
+
/// @notice Emitted when the app is withdrawn
|
|
18
|
+
/// @param recipient The address that received the withdrawal
|
|
19
|
+
/// @param amount The amount of tokens withdrawn
|
|
20
|
+
event Withdrawal(address indexed recipient, uint256 amount);
|
|
21
|
+
|
|
22
|
+
/// @notice Emitted when pricing is updated
|
|
23
|
+
/// @param installPrice The new install price
|
|
24
|
+
/// @param accessDuration The new access duration
|
|
25
|
+
event PricingUpdated(uint256 installPrice, uint48 accessDuration);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface ISimpleApp is ISimpleAppBase {
|
|
29
|
+
/// @notice Withdraws the ETH balance of the app to the recipient
|
|
30
|
+
/// @param recipient The address to withdraw the ETH to
|
|
31
|
+
function withdrawETH(address recipient) external;
|
|
32
|
+
|
|
33
|
+
/// @notice Updates the pricing of the app
|
|
34
|
+
/// @param installPrice The new install price
|
|
35
|
+
/// @param accessDuration The new access duration
|
|
36
|
+
function updatePricing(uint256 installPrice, uint48 accessDuration) external;
|
|
37
|
+
|
|
38
|
+
/// @notice Initializes the app
|
|
39
|
+
/// @param owner The owner of the app
|
|
40
|
+
/// @param appId The ID of the app
|
|
41
|
+
/// @param permissions The permissions of the app
|
|
42
|
+
/// @param installPrice The install price of the app
|
|
43
|
+
/// @param accessDuration The access duration of the app
|
|
44
|
+
function initialize(
|
|
45
|
+
address owner,
|
|
46
|
+
string calldata appId,
|
|
47
|
+
bytes32[] calldata permissions,
|
|
48
|
+
uint256 installPrice,
|
|
49
|
+
uint48 accessDuration
|
|
50
|
+
) external;
|
|
51
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {ISimpleApp} from "../../apps/helpers/ISimpleApp.sol";
|
|
6
|
+
import {ITownsApp} from "../../apps/ITownsApp.sol";
|
|
7
|
+
import {IERC6900Module} from "@erc6900/reference-implementation/interfaces/IERC6900Module.sol";
|
|
8
|
+
import {IERC6900ExecutionModule} from "@erc6900/reference-implementation/interfaces/IERC6900ExecutionModule.sol";
|
|
9
|
+
|
|
10
|
+
// contracts
|
|
11
|
+
import {BaseApp} from "../../apps/BaseApp.sol";
|
|
12
|
+
import {Ownable} from "solady/auth/Ownable.sol";
|
|
13
|
+
import {ExecutionManifest} from "@erc6900/reference-implementation/interfaces/IERC6900ExecutionModule.sol";
|
|
14
|
+
import {Initializable} from "solady/utils/Initializable.sol";
|
|
15
|
+
|
|
16
|
+
// libraries
|
|
17
|
+
import {SimpleAppStorage} from "../../apps/helpers/SimpleAppStorage.sol";
|
|
18
|
+
import {CustomRevert} from "../../utils/libraries/CustomRevert.sol";
|
|
19
|
+
import {CurrencyTransfer} from "../../utils/libraries/CurrencyTransfer.sol";
|
|
20
|
+
|
|
21
|
+
contract SimpleApp is ISimpleApp, Ownable, BaseApp, Initializable {
|
|
22
|
+
using CustomRevert for bytes4;
|
|
23
|
+
using SimpleAppStorage for SimpleAppStorage.Layout;
|
|
24
|
+
|
|
25
|
+
/// @inheritdoc ISimpleApp
|
|
26
|
+
function initialize(
|
|
27
|
+
address owner,
|
|
28
|
+
string calldata appId,
|
|
29
|
+
bytes32[] calldata permissions,
|
|
30
|
+
uint256 installPrice,
|
|
31
|
+
uint48 accessDuration
|
|
32
|
+
) external initializer {
|
|
33
|
+
_setOwner(owner);
|
|
34
|
+
SimpleAppStorage.Layout storage $ = SimpleAppStorage.getLayout();
|
|
35
|
+
$.name = appId;
|
|
36
|
+
$.permissions = permissions;
|
|
37
|
+
$.installPrice = installPrice;
|
|
38
|
+
$.accessDuration = accessDuration;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/// @inheritdoc ISimpleApp
|
|
42
|
+
function withdrawETH(address recipient) external onlyOwner {
|
|
43
|
+
if (recipient == address(0)) ZeroAddress.selector.revertWith();
|
|
44
|
+
|
|
45
|
+
uint256 balance = address(this).balance;
|
|
46
|
+
if (balance == 0) NoBalanceToWithdraw.selector.revertWith();
|
|
47
|
+
|
|
48
|
+
CurrencyTransfer.safeTransferNativeToken(recipient, balance);
|
|
49
|
+
|
|
50
|
+
emit Withdrawal(recipient, balance);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/// @inheritdoc ISimpleApp
|
|
54
|
+
function updatePricing(uint256 installPrice, uint48 accessDuration) external onlyOwner {
|
|
55
|
+
SimpleAppStorage.Layout storage $ = SimpleAppStorage.getLayout();
|
|
56
|
+
|
|
57
|
+
$.installPrice = installPrice;
|
|
58
|
+
$.accessDuration = accessDuration;
|
|
59
|
+
|
|
60
|
+
emit PricingUpdated(installPrice, accessDuration);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/// @inheritdoc ITownsApp
|
|
64
|
+
function requiredPermissions() external view returns (bytes32[] memory) {
|
|
65
|
+
SimpleAppStorage.Layout storage $ = SimpleAppStorage.getLayout();
|
|
66
|
+
return $.permissions;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/// @inheritdoc IERC6900Module
|
|
70
|
+
function moduleId() public view returns (string memory) {
|
|
71
|
+
SimpleAppStorage.Layout storage $ = SimpleAppStorage.getLayout();
|
|
72
|
+
return $.name;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/// @inheritdoc IERC6900ExecutionModule
|
|
76
|
+
function executionManifest() external pure returns (ExecutionManifest memory) {
|
|
77
|
+
// solhint-disable no-empty-blocks
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
|
|
81
|
+
/* OVERRIDES */
|
|
82
|
+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
|
|
83
|
+
|
|
84
|
+
function _installPrice() internal view override returns (uint256) {
|
|
85
|
+
SimpleAppStorage.Layout storage $ = SimpleAppStorage.getLayout();
|
|
86
|
+
return $.installPrice;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function _accessDuration() internal view override returns (uint48) {
|
|
90
|
+
SimpleAppStorage.Layout storage $ = SimpleAppStorage.getLayout();
|
|
91
|
+
return $.accessDuration;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function _moduleOwner() internal view override returns (address) {
|
|
95
|
+
return owner();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -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
|
+
library SimpleAppStorage {
|
|
11
|
+
// keccak256(abi.encode(uint256(keccak256("simple.app.storage")) - 1)) & ~bytes32(uint256(0xff))
|
|
12
|
+
bytes32 internal constant STORAGE_SLOT =
|
|
13
|
+
0x83d7ef17df984d8e84ee79017942cb0329f48e2d537ef8c418bc299c6878be00;
|
|
14
|
+
|
|
15
|
+
struct Layout {
|
|
16
|
+
string name;
|
|
17
|
+
bytes32[] permissions;
|
|
18
|
+
uint256 installPrice;
|
|
19
|
+
uint48 accessDuration;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function getLayout() internal pure returns (Layout storage l) {
|
|
23
|
+
assembly {
|
|
24
|
+
l.slot := STORAGE_SLOT
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|