@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,56 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
|
|
6
|
+
import {IPOAP} from "./IPOAP.sol";
|
|
7
|
+
import {ICrossChainEntitlement} from "src/spaces/entitlements/ICrossChainEntitlement.sol";
|
|
8
|
+
// libraries
|
|
9
|
+
|
|
10
|
+
// contracts
|
|
11
|
+
|
|
12
|
+
contract PoapEntitlement is ICrossChainEntitlement {
|
|
13
|
+
IPOAP immutable poapContract;
|
|
14
|
+
|
|
15
|
+
constructor(address poapContractAddress) {
|
|
16
|
+
poapContract = IPOAP(poapContractAddress);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function isEntitled(
|
|
20
|
+
address[] calldata users,
|
|
21
|
+
bytes calldata data
|
|
22
|
+
) external view returns (bool) {
|
|
23
|
+
uint256 eventId = abi.decode(data, (uint256));
|
|
24
|
+
|
|
25
|
+
for (uint256 i = 0; i < users.length; i++) {
|
|
26
|
+
if (_hasEventPoap(users[i], eventId)) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function parameters() external pure returns (Parameter[] memory) {
|
|
34
|
+
Parameter[] memory schema = new Parameter[](1);
|
|
35
|
+
schema[0] = Parameter(
|
|
36
|
+
"eventId",
|
|
37
|
+
"uint256",
|
|
38
|
+
"The ID of the event associated with the POAP token"
|
|
39
|
+
);
|
|
40
|
+
return schema;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// =============================================================
|
|
44
|
+
// Internals
|
|
45
|
+
// =============================================================
|
|
46
|
+
function _hasEventPoap(address user, uint256 eventId) internal view returns (bool) {
|
|
47
|
+
uint256 balance = poapContract.balanceOf(user);
|
|
48
|
+
for (uint256 j = 0; j < balance; j++) {
|
|
49
|
+
(uint256 ownedEventId, ) = poapContract.tokenDetailsOfOwnerByIndex(user, j);
|
|
50
|
+
if (eventId == ownedEventId) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.24;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IEntitlement} from "src/spaces/entitlements/IEntitlement.sol";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @title RuleEntitlement
|
|
9
|
+
* @dev This contract manages entitlement rules based on blockchain operations.
|
|
10
|
+
* The contract maintains a tree-like data structure to combine various types of operations.
|
|
11
|
+
* The tree is implemented as a dynamic array of 'Operation' structs, and is built in post-order
|
|
12
|
+
* fashion.
|
|
13
|
+
*
|
|
14
|
+
* Post-order Tree Structure:
|
|
15
|
+
* In a post-order binary tree, children nodes must be added before their respective parent nodes.
|
|
16
|
+
* The 'LogicalOperation' nodes refer to their child nodes via indices in the 'operations' array.
|
|
17
|
+
* As new LogicalOperation nodes are added, they can only reference existing nodes in the
|
|
18
|
+
* 'operations' array,
|
|
19
|
+
* ensuring a valid post-order tree structure.
|
|
20
|
+
*/
|
|
21
|
+
interface IRuleEntitlementBase {
|
|
22
|
+
// =============================================================
|
|
23
|
+
// Errors
|
|
24
|
+
// =============================================================
|
|
25
|
+
error CheckOperationsLimitReaced(uint256 limit);
|
|
26
|
+
error OperationsLimitReached(uint256 limit);
|
|
27
|
+
error LogicalOperationLimitReached(uint256 limit);
|
|
28
|
+
error InvalidCheckOperationIndex(uint8 operationIndex, uint8 checkOperationsLength);
|
|
29
|
+
error InvalidLogicalOperationIndex(uint8 operationIndex, uint8 logicalOperationsLength);
|
|
30
|
+
error InvalidOperationType(CombinedOperationType opType);
|
|
31
|
+
error InvalidLeftOperationIndex(uint8 leftOperationIndex, uint8 currentOperationIndex);
|
|
32
|
+
error InvalidRightOperationIndex(uint8 rightOperationIndex, uint8 currentOperationIndex);
|
|
33
|
+
|
|
34
|
+
// =============================================================
|
|
35
|
+
// Enums
|
|
36
|
+
// =============================================================
|
|
37
|
+
enum CheckOperationType {
|
|
38
|
+
NONE,
|
|
39
|
+
MOCK,
|
|
40
|
+
ERC20,
|
|
41
|
+
ERC721,
|
|
42
|
+
ERC1155,
|
|
43
|
+
ISENTITLED,
|
|
44
|
+
ETH_BALANCE
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Enum for Operation oneof operation_clause
|
|
48
|
+
enum LogicalOperationType {
|
|
49
|
+
NONE,
|
|
50
|
+
AND,
|
|
51
|
+
OR
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Redefined Operation struct
|
|
55
|
+
enum CombinedOperationType {
|
|
56
|
+
NONE,
|
|
57
|
+
CHECK,
|
|
58
|
+
LOGICAL
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// =============================================================
|
|
62
|
+
// Structs
|
|
63
|
+
// =============================================================
|
|
64
|
+
struct CheckOperation {
|
|
65
|
+
CheckOperationType opType;
|
|
66
|
+
uint256 chainId;
|
|
67
|
+
address contractAddress;
|
|
68
|
+
uint256 threshold;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
struct CheckOperationV2 {
|
|
72
|
+
CheckOperationType opType;
|
|
73
|
+
uint256 chainId;
|
|
74
|
+
address contractAddress;
|
|
75
|
+
bytes params;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
struct LogicalOperation {
|
|
79
|
+
LogicalOperationType logOpType;
|
|
80
|
+
uint8 leftOperationIndex;
|
|
81
|
+
uint8 rightOperationIndex;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
struct Operation {
|
|
85
|
+
CombinedOperationType opType;
|
|
86
|
+
uint8 index; // Index in either checkOperations or logicalOperations arrays
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
struct RuleData {
|
|
90
|
+
Operation[] operations;
|
|
91
|
+
CheckOperation[] checkOperations;
|
|
92
|
+
LogicalOperation[] logicalOperations;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
struct RuleDataV2 {
|
|
96
|
+
Operation[] operations;
|
|
97
|
+
CheckOperationV2[] checkOperations;
|
|
98
|
+
LogicalOperation[] logicalOperations;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
struct Entitlement {
|
|
102
|
+
address grantedBy;
|
|
103
|
+
uint256 grantedTime;
|
|
104
|
+
RuleData data;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
struct EntitlementV2 {
|
|
108
|
+
address grantedBy;
|
|
109
|
+
uint256 grantedTime;
|
|
110
|
+
bytes data;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Parameters are not used in contracts but are defined here for documentation purposes.
|
|
114
|
+
struct MockParams {
|
|
115
|
+
uint256 threshold; // used for testing
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
struct ERC20Params {
|
|
119
|
+
uint256 threshold;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
struct ERC721Params {
|
|
123
|
+
uint256 threshold;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
struct ERC1155Params {
|
|
127
|
+
uint256 threshold;
|
|
128
|
+
uint256 tokenId;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
struct NativeCoinBalanceParams {
|
|
132
|
+
uint256 threshold;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
interface IRuleEntitlementV2 is IRuleEntitlementBase, IEntitlement {
|
|
137
|
+
// =============================================================
|
|
138
|
+
// Functions
|
|
139
|
+
// =============================================================
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* @notice Encodes the RuleData struct into bytes
|
|
143
|
+
* @param data RuleData struct to encode
|
|
144
|
+
* @return Encoded bytes of the RuleData struct
|
|
145
|
+
*/
|
|
146
|
+
function encodeRuleData(RuleDataV2 memory data) external pure returns (bytes memory);
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* @notice Decodes the RuleDataV2 struct from bytes
|
|
150
|
+
* @param roleId Role ID
|
|
151
|
+
* @return data RuleDataV2 struct
|
|
152
|
+
*/
|
|
153
|
+
function getRuleDataV2(uint256 roleId) external view returns (RuleDataV2 memory data);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
interface IRuleEntitlement is IRuleEntitlementBase, IEntitlement {
|
|
157
|
+
// =============================================================
|
|
158
|
+
// Functions
|
|
159
|
+
// =============================================================
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* @notice Encodes the RuleData struct into bytes
|
|
163
|
+
* @param data RuleData struct to encode
|
|
164
|
+
* @return Encoded bytes of the RuleData struct
|
|
165
|
+
*/
|
|
166
|
+
function encodeRuleData(RuleData memory data) external pure returns (bytes memory);
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* @notice Decodes the RuleData struct from bytes
|
|
170
|
+
* @param roleId Role ID
|
|
171
|
+
* @return data RuleData struct
|
|
172
|
+
*/
|
|
173
|
+
function getRuleData(uint256 roleId) external view returns (RuleData memory data);
|
|
174
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @title EntitlementRule
|
|
5
|
+
* @dev This contract manages entitlement rules based on blockchain operations.
|
|
6
|
+
* The contract maintains a tree-like data structure to combine various types of operations.
|
|
7
|
+
* The tree is implemented as a dynamic array of 'Operation' structs, and is built in post-order
|
|
8
|
+
* fashion.
|
|
9
|
+
*
|
|
10
|
+
* Post-order Tree Structure:
|
|
11
|
+
* In a post-order binary tree, children nodes must be added before their respective parent nodes.
|
|
12
|
+
* The 'LogicalOperation' nodes refer to their child nodes via indices in the 'operations' array.
|
|
13
|
+
* As new LogicalOperation nodes are added, they can only reference existing nodes in the
|
|
14
|
+
* 'operations' array,
|
|
15
|
+
* ensuring a valid post-order tree structure.
|
|
16
|
+
*/
|
|
17
|
+
pragma solidity ^0.8.0;
|
|
18
|
+
|
|
19
|
+
// contracts
|
|
20
|
+
import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
|
|
21
|
+
|
|
22
|
+
import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
|
|
23
|
+
import {ContextUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";
|
|
24
|
+
import {ERC165Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol";
|
|
25
|
+
|
|
26
|
+
// libraries
|
|
27
|
+
import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
|
|
28
|
+
|
|
29
|
+
// interfaces
|
|
30
|
+
|
|
31
|
+
import {IRuleEntitlement} from "./IRuleEntitlement.sol";
|
|
32
|
+
import {IEntitlement} from "src/spaces/entitlements/IEntitlement.sol";
|
|
33
|
+
|
|
34
|
+
contract RuleEntitlement is
|
|
35
|
+
Initializable,
|
|
36
|
+
ERC165Upgradeable,
|
|
37
|
+
ContextUpgradeable,
|
|
38
|
+
UUPSUpgradeable,
|
|
39
|
+
IRuleEntitlement
|
|
40
|
+
{
|
|
41
|
+
using EnumerableSet for EnumerableSet.Bytes32Set;
|
|
42
|
+
|
|
43
|
+
mapping(uint256 => Entitlement) internal entitlementsByRoleId;
|
|
44
|
+
|
|
45
|
+
address public SPACE_ADDRESS;
|
|
46
|
+
|
|
47
|
+
string public constant name = "Rule Entitlement";
|
|
48
|
+
string public constant description = "Entitlement for crosschain rules";
|
|
49
|
+
string public constant moduleType = "RuleEntitlement";
|
|
50
|
+
|
|
51
|
+
// Separate storage arrays for CheckOperation and LogicalOperation
|
|
52
|
+
//CheckOperation[] private checkOperations;
|
|
53
|
+
//LogicalOperation[] private logicalOperations;
|
|
54
|
+
|
|
55
|
+
// Dynamic array to store Operation instances
|
|
56
|
+
//Operation[] private operations;
|
|
57
|
+
|
|
58
|
+
/// @custom:oz-upgrades-unsafe-allow constructor
|
|
59
|
+
constructor() {
|
|
60
|
+
_disableInitializers();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function initialize(address _space) public initializer {
|
|
64
|
+
__UUPSUpgradeable_init();
|
|
65
|
+
__ERC165_init();
|
|
66
|
+
__Context_init();
|
|
67
|
+
|
|
68
|
+
SPACE_ADDRESS = _space;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
modifier onlySpace() {
|
|
72
|
+
if (_msgSender() != SPACE_ADDRESS) {
|
|
73
|
+
revert Entitlement__NotAllowed();
|
|
74
|
+
}
|
|
75
|
+
_;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/// @notice allow the contract to be upgraded while retaining state
|
|
79
|
+
/// @param newImplementation address of the new implementation
|
|
80
|
+
function _authorizeUpgrade(address newImplementation) internal override onlySpace {}
|
|
81
|
+
|
|
82
|
+
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
|
|
83
|
+
return
|
|
84
|
+
interfaceId == type(IEntitlement).interfaceId || super.supportsInterface(interfaceId);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// @inheritdoc IEntitlement
|
|
88
|
+
function isCrosschain() external pure override returns (bool) {
|
|
89
|
+
// TODO possible optimization: return false if no crosschain operations
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// @inheritdoc IEntitlement
|
|
94
|
+
function isEntitled(
|
|
95
|
+
bytes32, //channelId,
|
|
96
|
+
address[] memory, //user,
|
|
97
|
+
bytes32 //permission
|
|
98
|
+
) external pure returns (bool) {
|
|
99
|
+
// TODO possible optimization: if there are no crosschain operations, evaluate locally
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// @inheritdoc IEntitlement
|
|
104
|
+
function setEntitlement(uint256 roleId, bytes calldata entitlementData) external onlySpace {
|
|
105
|
+
if (entitlementData.length == 0) return;
|
|
106
|
+
|
|
107
|
+
// equivalent: abi.decode(entitlementData, (RuleData))
|
|
108
|
+
RuleData calldata data;
|
|
109
|
+
assembly {
|
|
110
|
+
// this is a variable length struct, so calldataload(entitlementData.offset) contains
|
|
111
|
+
// the
|
|
112
|
+
// offset from entitlementData.offset at which the struct begins
|
|
113
|
+
data := add(entitlementData.offset, calldataload(entitlementData.offset))
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (data.operations.length == 0) return;
|
|
117
|
+
|
|
118
|
+
// Cache lengths of operations arrays to reduce state access cost
|
|
119
|
+
uint256 operationsLength = data.operations.length;
|
|
120
|
+
uint256 checkOperationsLength = data.checkOperations.length;
|
|
121
|
+
uint256 logicalOperationsLength = data.logicalOperations.length;
|
|
122
|
+
|
|
123
|
+
// Step 1: Validate Operation against CheckOperation and LogicalOperation
|
|
124
|
+
for (uint256 i; i < operationsLength; ++i) {
|
|
125
|
+
CombinedOperationType opType = data.operations[i].opType; // cache the operation type
|
|
126
|
+
uint8 index = data.operations[i].index; // cache the operation index
|
|
127
|
+
|
|
128
|
+
if (opType == CombinedOperationType.CHECK) {
|
|
129
|
+
if (index >= checkOperationsLength) {
|
|
130
|
+
revert InvalidCheckOperationIndex(index, uint8(checkOperationsLength));
|
|
131
|
+
}
|
|
132
|
+
} else if (opType == CombinedOperationType.LOGICAL) {
|
|
133
|
+
// Use custom error in revert statement
|
|
134
|
+
if (index >= logicalOperationsLength) {
|
|
135
|
+
revert InvalidLogicalOperationIndex(index, uint8(logicalOperationsLength));
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Verify the logical operations make a DAG
|
|
139
|
+
LogicalOperation calldata logicalOp = data.logicalOperations[index];
|
|
140
|
+
uint8 leftOperationIndex = logicalOp.leftOperationIndex;
|
|
141
|
+
uint8 rightOperationIndex = logicalOp.rightOperationIndex;
|
|
142
|
+
|
|
143
|
+
// Use custom errors in revert statements
|
|
144
|
+
if (leftOperationIndex >= i) {
|
|
145
|
+
revert InvalidLeftOperationIndex(leftOperationIndex, uint8(i));
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (rightOperationIndex >= i) {
|
|
149
|
+
revert InvalidRightOperationIndex(rightOperationIndex, uint8(i));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
Entitlement storage entitlement = entitlementsByRoleId[roleId];
|
|
155
|
+
entitlement.grantedBy = _msgSender();
|
|
156
|
+
entitlement.grantedTime = block.timestamp;
|
|
157
|
+
entitlement.data = data;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// @inheritdoc IEntitlement
|
|
161
|
+
function removeEntitlement(uint256 roleId) external onlySpace {
|
|
162
|
+
Entitlement storage entitlement = entitlementsByRoleId[roleId];
|
|
163
|
+
if (entitlement.grantedBy == address(0)) {
|
|
164
|
+
revert Entitlement__InvalidValue();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
delete entitlementsByRoleId[roleId];
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// @inheritdoc IEntitlement
|
|
171
|
+
function getEntitlementDataByRoleId(uint256 roleId) external view returns (bytes memory) {
|
|
172
|
+
Entitlement storage entitlement = entitlementsByRoleId[roleId];
|
|
173
|
+
return abi.encode(entitlement.data);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function encodeRuleData(RuleData calldata data) external pure returns (bytes memory) {
|
|
177
|
+
return abi.encode(data);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function getRuleData(uint256 roleId) external view returns (RuleData memory data) {
|
|
181
|
+
return entitlementsByRoleId[roleId].data;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @title RuleEntitlementV2
|
|
5
|
+
* @dev This contract manages entitlement rules based on blockchain operations.
|
|
6
|
+
* The contract maintains a tree-like data structure to combine various types of operations.
|
|
7
|
+
* The tree is implemented as a dynamic array of 'Operation' structs, and is built in post-order
|
|
8
|
+
* fashion.
|
|
9
|
+
*
|
|
10
|
+
* Post-order Tree Structure:
|
|
11
|
+
* In a post-order binary tree, children nodes must be added before their respective parent nodes.
|
|
12
|
+
* The 'LogicalOperation' nodes refer to their child nodes via indices in the 'operations' array.
|
|
13
|
+
* As new LogicalOperation nodes are added, they can only reference existing nodes in the
|
|
14
|
+
* 'operations' array,
|
|
15
|
+
* ensuring a valid post-order tree structure.
|
|
16
|
+
*/
|
|
17
|
+
pragma solidity ^0.8.0;
|
|
18
|
+
|
|
19
|
+
// contracts
|
|
20
|
+
import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
|
|
21
|
+
|
|
22
|
+
import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
|
|
23
|
+
import {ContextUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";
|
|
24
|
+
import {ERC165Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol";
|
|
25
|
+
|
|
26
|
+
// libraries
|
|
27
|
+
|
|
28
|
+
// interfaces
|
|
29
|
+
|
|
30
|
+
import {IRuleEntitlementV2} from "./IRuleEntitlement.sol";
|
|
31
|
+
import {IEntitlement} from "src/spaces/entitlements/IEntitlement.sol";
|
|
32
|
+
|
|
33
|
+
contract RuleEntitlementV2 is
|
|
34
|
+
Initializable,
|
|
35
|
+
ERC165Upgradeable,
|
|
36
|
+
ContextUpgradeable,
|
|
37
|
+
UUPSUpgradeable,
|
|
38
|
+
IRuleEntitlementV2
|
|
39
|
+
{
|
|
40
|
+
mapping(uint256 => Entitlement) internal entitlementsByRoleId;
|
|
41
|
+
address public SPACE_ADDRESS;
|
|
42
|
+
|
|
43
|
+
// TODO: abstract to a base contract
|
|
44
|
+
// keccak256(abi.encode(uint256(keccak256("spaces.entitlements.rule.storage")) - 1)) &
|
|
45
|
+
// ~bytes32(uint256(0xff))
|
|
46
|
+
bytes32 private constant STORAGE_SLOT =
|
|
47
|
+
0xa7ba26993e5aed586ba0b4d511980a49b23ea33e13d5f0920b7e42ae1a27cc00;
|
|
48
|
+
|
|
49
|
+
// @custom:storage-location erc7201:spaces.entitlements.rule.storage
|
|
50
|
+
struct Layout {
|
|
51
|
+
mapping(uint256 => EntitlementV2) entitlementsByRoleIdV2;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
string public constant name = "Rule Entitlement V2";
|
|
55
|
+
string public constant description = "Entitlement for crosschain rules";
|
|
56
|
+
string public constant moduleType = "RuleEntitlementV2";
|
|
57
|
+
bool public constant isCrosschain = true;
|
|
58
|
+
|
|
59
|
+
/// @custom:oz-upgrades-unsafe-allow constructor
|
|
60
|
+
constructor() {
|
|
61
|
+
_disableInitializers();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function initialize(address _space) public initializer {
|
|
65
|
+
__UUPSUpgradeable_init();
|
|
66
|
+
__ERC165_init();
|
|
67
|
+
__Context_init();
|
|
68
|
+
SPACE_ADDRESS = _space;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
modifier onlySpace() {
|
|
72
|
+
if (_msgSender() != SPACE_ADDRESS) {
|
|
73
|
+
revert Entitlement__NotAllowed();
|
|
74
|
+
}
|
|
75
|
+
_;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// =============================================================
|
|
79
|
+
// Admin
|
|
80
|
+
// =============================================================
|
|
81
|
+
|
|
82
|
+
/// @notice allow the contract to be upgraded while retaining state
|
|
83
|
+
/// @param newImplementation address of the new implementation
|
|
84
|
+
function _authorizeUpgrade(address newImplementation) internal override onlySpace {}
|
|
85
|
+
|
|
86
|
+
/// @notice get the storage slot for the contract
|
|
87
|
+
/// @return ds storage slot
|
|
88
|
+
function layout() internal pure returns (Layout storage ds) {
|
|
89
|
+
assembly {
|
|
90
|
+
ds.slot := STORAGE_SLOT
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// =============================================================
|
|
95
|
+
// External
|
|
96
|
+
// =============================================================
|
|
97
|
+
|
|
98
|
+
function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
|
|
99
|
+
return
|
|
100
|
+
interfaceId == type(IEntitlement).interfaceId ||
|
|
101
|
+
interfaceId == type(IRuleEntitlementV2).interfaceId ||
|
|
102
|
+
super.supportsInterface(interfaceId);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// @inheritdoc IEntitlement
|
|
106
|
+
function isEntitled(bytes32, address[] memory, bytes32) external pure returns (bool) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// @inheritdoc IEntitlement
|
|
111
|
+
function setEntitlement(uint256 roleId, bytes calldata entitlementData) external onlySpace {
|
|
112
|
+
_removeRuleDataV1(roleId);
|
|
113
|
+
|
|
114
|
+
// We should never allow the setting of empty rule datas because it can cause the xchain
|
|
115
|
+
// architecture to be invoked when by default a user is not entitled.
|
|
116
|
+
if (entitlementData.length == 0) {
|
|
117
|
+
revert Entitlement__InvalidValue();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// equivalent: abi.decode(entitlementData, (RuleDataV2))
|
|
121
|
+
RuleDataV2 calldata data;
|
|
122
|
+
assembly {
|
|
123
|
+
// this is a variable length struct, so calldataload(entitlementData.offset) contains
|
|
124
|
+
// the
|
|
125
|
+
// offset from entitlementData.offset at which the struct begins
|
|
126
|
+
data := add(entitlementData.offset, calldataload(entitlementData.offset))
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// We should never allow the setting of empty rule datas because it can cause the xchain
|
|
130
|
+
// architecture to be invoked when by default a user is not entitled.
|
|
131
|
+
if (data.operations.length == 0) {
|
|
132
|
+
revert Entitlement__InvalidValue();
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Cache lengths of operations arrays to reduce state access cost
|
|
136
|
+
uint256 operationsLength = data.operations.length;
|
|
137
|
+
uint256 checkOperationsLength = data.checkOperations.length;
|
|
138
|
+
uint256 logicalOperationsLength = data.logicalOperations.length;
|
|
139
|
+
|
|
140
|
+
// Step 1: Validate Operation against CheckOperation and LogicalOperation
|
|
141
|
+
for (uint256 i; i < operationsLength; ++i) {
|
|
142
|
+
CombinedOperationType opType = data.operations[i].opType; // cache the operation type
|
|
143
|
+
uint8 index = data.operations[i].index; // cache the operation index
|
|
144
|
+
|
|
145
|
+
if (opType == CombinedOperationType.CHECK) {
|
|
146
|
+
if (index >= checkOperationsLength) {
|
|
147
|
+
revert InvalidCheckOperationIndex(index, uint8(checkOperationsLength));
|
|
148
|
+
}
|
|
149
|
+
} else if (opType == CombinedOperationType.LOGICAL) {
|
|
150
|
+
// Use custom error in revert statement
|
|
151
|
+
if (index >= logicalOperationsLength) {
|
|
152
|
+
revert InvalidLogicalOperationIndex(index, uint8(logicalOperationsLength));
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Verify the logical operations make a DAG
|
|
156
|
+
LogicalOperation calldata logicalOp = data.logicalOperations[index];
|
|
157
|
+
uint8 leftOperationIndex = logicalOp.leftOperationIndex;
|
|
158
|
+
uint8 rightOperationIndex = logicalOp.rightOperationIndex;
|
|
159
|
+
|
|
160
|
+
// Use custom errors in revert statements
|
|
161
|
+
if (leftOperationIndex >= i) {
|
|
162
|
+
revert InvalidLeftOperationIndex(leftOperationIndex, uint8(i));
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (rightOperationIndex >= i) {
|
|
166
|
+
revert InvalidRightOperationIndex(rightOperationIndex, uint8(i));
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
EntitlementV2 storage entitlement = layout().entitlementsByRoleIdV2[roleId];
|
|
172
|
+
entitlement.grantedBy = _msgSender();
|
|
173
|
+
entitlement.grantedTime = block.timestamp;
|
|
174
|
+
entitlement.data = entitlementData;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// @inheritdoc IEntitlement
|
|
178
|
+
function removeEntitlement(uint256 roleId) external onlySpace {
|
|
179
|
+
Layout storage ds = layout();
|
|
180
|
+
EntitlementV2 storage entitlement = ds.entitlementsByRoleIdV2[roleId];
|
|
181
|
+
|
|
182
|
+
if (entitlement.grantedBy == address(0)) {
|
|
183
|
+
revert Entitlement__InvalidValue();
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
delete ds.entitlementsByRoleIdV2[roleId];
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// @inheritdoc IEntitlement
|
|
190
|
+
function getEntitlementDataByRoleId(uint256 roleId) external view returns (bytes memory) {
|
|
191
|
+
EntitlementV2 storage entitlement = layout().entitlementsByRoleIdV2[roleId];
|
|
192
|
+
return entitlement.data;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function encodeRuleData(RuleDataV2 calldata data) external pure returns (bytes memory) {
|
|
196
|
+
return abi.encode(data);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function getRuleData(uint256 roleId) external view returns (RuleData memory data) {
|
|
200
|
+
return entitlementsByRoleId[roleId].data;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function getRuleDataV2(uint256 roleId) external view returns (RuleDataV2 memory data) {
|
|
204
|
+
bytes storage ruleData = layout().entitlementsByRoleIdV2[roleId].data;
|
|
205
|
+
|
|
206
|
+
if (ruleData.length == 0) return data;
|
|
207
|
+
|
|
208
|
+
return abi.decode(ruleData, (RuleDataV2));
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// =============================================================
|
|
212
|
+
// Internal
|
|
213
|
+
// =============================================================
|
|
214
|
+
function _removeRuleDataV1(uint256 roleId) internal {
|
|
215
|
+
if (entitlementsByRoleId[roleId].grantedBy != address(0)) {
|
|
216
|
+
delete entitlementsByRoleId[roleId];
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.24;
|
|
3
|
+
|
|
4
|
+
import {IEntitlement} from "src/spaces/entitlements/IEntitlement.sol";
|
|
5
|
+
|
|
6
|
+
interface IUserEntitlement is IEntitlement {
|
|
7
|
+
// Constructor is not included in interfaces
|
|
8
|
+
|
|
9
|
+
// Initialize function, if it's intended to be called externally
|
|
10
|
+
function initialize(address _space) external;
|
|
11
|
+
|
|
12
|
+
// Any other external or public functions
|
|
13
|
+
function isEntitled(
|
|
14
|
+
bytes32 channelId,
|
|
15
|
+
address[] memory wallets,
|
|
16
|
+
bytes32 permission
|
|
17
|
+
) external view returns (bool);
|
|
18
|
+
|
|
19
|
+
function setEntitlement(uint256 roleId, bytes calldata entitlementData) external;
|
|
20
|
+
|
|
21
|
+
function removeEntitlement(uint256 roleId) external;
|
|
22
|
+
|
|
23
|
+
function getEntitlementDataByRoleId(uint256 roleId) external view returns (bytes memory);
|
|
24
|
+
}
|