@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,118 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.24;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IMerkleAirdrop} from "./IMerkleAirdrop.sol";
|
|
6
|
+
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
7
|
+
|
|
8
|
+
// libraries
|
|
9
|
+
|
|
10
|
+
import {MerkleAirdropStorage} from "./MerkleAirdropStorage.sol";
|
|
11
|
+
import {ECDSA} from "solady/utils/ECDSA.sol";
|
|
12
|
+
import {MerkleProofLib} from "solady/utils/MerkleProofLib.sol";
|
|
13
|
+
import {SafeTransferLib} from "solady/utils/SafeTransferLib.sol";
|
|
14
|
+
|
|
15
|
+
// contracts
|
|
16
|
+
|
|
17
|
+
import {Facet} from "@towns-protocol/diamond/src/facets/Facet.sol";
|
|
18
|
+
import {EIP712Base} from "@towns-protocol/diamond/src/utils/cryptography/EIP712Base.sol";
|
|
19
|
+
import {CustomRevert} from "src/utils/libraries/CustomRevert.sol";
|
|
20
|
+
|
|
21
|
+
contract MerkleAirdrop is IMerkleAirdrop, EIP712Base, Facet {
|
|
22
|
+
// keccak256("AirdropClaim(address account,uint256 amount,address receiver)");
|
|
23
|
+
bytes32 private constant MESSAGE_TYPEHASH =
|
|
24
|
+
0x0770323f1f7513b8a3d8df16b4b8fd506e7a76eaf71c03c687683b8d52979b5c;
|
|
25
|
+
|
|
26
|
+
function __MerkleAirdrop_init(bytes32 merkleRoot, IERC20 token) external initializer {
|
|
27
|
+
_addInterface(type(IMerkleAirdrop).interfaceId);
|
|
28
|
+
__MerkleAirdrop_init_unchained(merkleRoot, token);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/// @inheritdoc IMerkleAirdrop
|
|
32
|
+
function getMerkleRoot() public view returns (bytes32) {
|
|
33
|
+
return MerkleAirdropStorage.layout().merkleRoot;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/// @inheritdoc IMerkleAirdrop
|
|
37
|
+
function getToken() public view returns (IERC20) {
|
|
38
|
+
return MerkleAirdropStorage.layout().token;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/// @inheritdoc IMerkleAirdrop
|
|
42
|
+
function getMessageHash(
|
|
43
|
+
address account,
|
|
44
|
+
uint256 amount,
|
|
45
|
+
address receiver
|
|
46
|
+
) public view returns (bytes32) {
|
|
47
|
+
return
|
|
48
|
+
_hashTypedDataV4(
|
|
49
|
+
keccak256(abi.encode(MESSAGE_TYPEHASH, AirdropClaim(account, amount, receiver)))
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/// @inheritdoc IMerkleAirdrop
|
|
54
|
+
function claim(
|
|
55
|
+
address account,
|
|
56
|
+
uint256 amount,
|
|
57
|
+
bytes32[] calldata merkleProof,
|
|
58
|
+
bytes calldata signature,
|
|
59
|
+
address receiver
|
|
60
|
+
) external {
|
|
61
|
+
MerkleAirdropStorage.Layout storage ds = MerkleAirdropStorage.layout();
|
|
62
|
+
|
|
63
|
+
if (ds.claimed[account]) {
|
|
64
|
+
CustomRevert.revertWith(MerkleAirdrop__AlreadyClaimed.selector);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
_validateSignature(account, getMessageHash(account, amount, receiver), signature);
|
|
68
|
+
|
|
69
|
+
// verify merkle proof
|
|
70
|
+
bytes32 leaf = _createLeaf(account, amount);
|
|
71
|
+
if (!MerkleProofLib.verifyCalldata(merkleProof, ds.merkleRoot, leaf)) {
|
|
72
|
+
CustomRevert.revertWith(MerkleAirdrop__InvalidProof.selector);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
ds.claimed[account] = true;
|
|
76
|
+
|
|
77
|
+
address recipient = receiver == address(0) ? account : receiver;
|
|
78
|
+
emit Claimed(account, amount, recipient);
|
|
79
|
+
|
|
80
|
+
SafeTransferLib.safeTransfer(address(ds.token), recipient, amount);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// =============================================================
|
|
84
|
+
// Internal
|
|
85
|
+
// =============================================================
|
|
86
|
+
function __MerkleAirdrop_init_unchained(bytes32 merkleRoot, IERC20 token) internal {
|
|
87
|
+
MerkleAirdropStorage.Layout storage ds = MerkleAirdropStorage.layout();
|
|
88
|
+
ds.merkleRoot = merkleRoot;
|
|
89
|
+
ds.token = token;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function _validateSignature(
|
|
93
|
+
address signer,
|
|
94
|
+
bytes32 digest,
|
|
95
|
+
bytes calldata signature
|
|
96
|
+
) internal view {
|
|
97
|
+
address actualSigner = ECDSA.recoverCalldata(digest, signature);
|
|
98
|
+
if (actualSigner != signer) {
|
|
99
|
+
CustomRevert.revertWith(MerkleAirdrop__InvalidSignature.selector);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function _createLeaf(address account, uint256 amount) internal pure returns (bytes32 leaf) {
|
|
104
|
+
assembly ("memory-safe") {
|
|
105
|
+
// Store the account address at memory location 0
|
|
106
|
+
mstore(0, account)
|
|
107
|
+
// Store the amount at memory location 0x20 (32 bytes after the account address)
|
|
108
|
+
mstore(0x20, amount)
|
|
109
|
+
// Compute the keccak256 hash of the account and amount, and store it at memory location
|
|
110
|
+
// 0
|
|
111
|
+
mstore(0, keccak256(0, 0x40))
|
|
112
|
+
// Compute the keccak256 hash of the previous hash (stored at memory location 0) and
|
|
113
|
+
// store it
|
|
114
|
+
// in the leaf variable
|
|
115
|
+
leaf := keccak256(0, 0x20)
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
6
|
+
|
|
7
|
+
// libraries
|
|
8
|
+
|
|
9
|
+
// contracts
|
|
10
|
+
|
|
11
|
+
library MerkleAirdropStorage {
|
|
12
|
+
// keccak256(abi.encode(uint256(keccak256("merkle.airdrop.storage")) - 1)) &
|
|
13
|
+
// ~bytes32(uint256(0xff))
|
|
14
|
+
bytes32 constant STORAGE_SLOT =
|
|
15
|
+
0x5499e8f18bf9226c15306964dca998d3d8d3ddae851b652336bc6dea221b5200;
|
|
16
|
+
|
|
17
|
+
struct Layout {
|
|
18
|
+
IERC20 token;
|
|
19
|
+
bytes32 merkleRoot;
|
|
20
|
+
mapping(address => bool) claimed;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function layout() internal pure returns (Layout storage ds) {
|
|
24
|
+
bytes32 slot = STORAGE_SLOT;
|
|
25
|
+
assembly {
|
|
26
|
+
ds.slot := slot
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.0;
|
|
3
|
+
|
|
4
|
+
interface AggregatorV3Interface {
|
|
5
|
+
function decimals() external view returns (uint8);
|
|
6
|
+
|
|
7
|
+
function description() external view returns (string memory);
|
|
8
|
+
|
|
9
|
+
function version() external view returns (uint256);
|
|
10
|
+
|
|
11
|
+
// getRoundData and latestRoundData should both raise "No data present"
|
|
12
|
+
// if they do not have data to report, instead of returning unset values
|
|
13
|
+
// which could be misinterpreted as actual reported values.
|
|
14
|
+
function getRoundData(
|
|
15
|
+
uint80 _roundId
|
|
16
|
+
)
|
|
17
|
+
external
|
|
18
|
+
view
|
|
19
|
+
returns (
|
|
20
|
+
uint80 roundId,
|
|
21
|
+
int256 answer,
|
|
22
|
+
uint256 startedAt,
|
|
23
|
+
uint256 updatedAt,
|
|
24
|
+
uint80 answeredInRound
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
function latestRoundData()
|
|
28
|
+
external
|
|
29
|
+
view
|
|
30
|
+
returns (
|
|
31
|
+
uint80 roundId,
|
|
32
|
+
int256 answer,
|
|
33
|
+
uint256 startedAt,
|
|
34
|
+
uint256 updatedAt,
|
|
35
|
+
uint80 answeredInRound
|
|
36
|
+
);
|
|
37
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.8;
|
|
3
|
+
|
|
4
|
+
/// @title Interface for the Multicall utility contract
|
|
5
|
+
interface IMulticall {
|
|
6
|
+
/// @notice batch function calls to the contract and return the results of each
|
|
7
|
+
/// @param data array of function call data payloads
|
|
8
|
+
/// @return results array of function call results
|
|
9
|
+
function multicall(bytes[] calldata data) external returns (bytes[] memory results);
|
|
10
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
import {CustomRevert} from "./CustomRevert.sol";
|
|
5
|
+
|
|
6
|
+
/// @title Basis Points
|
|
7
|
+
/// @notice Library for calculating with basis points
|
|
8
|
+
library BasisPoints {
|
|
9
|
+
using CustomRevert for bytes4;
|
|
10
|
+
|
|
11
|
+
uint256 public constant MAX_BPS = 10_000;
|
|
12
|
+
|
|
13
|
+
error InvalidBasisPoints(uint256 basisPoints);
|
|
14
|
+
|
|
15
|
+
/// @notice Calculate the basis points of a given amount
|
|
16
|
+
/// @param amount The amount to be multiplied by the basis points
|
|
17
|
+
/// @param basisPoints The basis points
|
|
18
|
+
/// @return The amount multiplied by the basis points
|
|
19
|
+
function calculate(uint256 amount, uint256 basisPoints) internal pure returns (uint256) {
|
|
20
|
+
if (basisPoints > MAX_BPS) InvalidBasisPoints.selector.revertWith(basisPoints);
|
|
21
|
+
|
|
22
|
+
return (amount * basisPoints) / MAX_BPS;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
import {CustomRevert} from "src/utils/libraries/CustomRevert.sol";
|
|
5
|
+
import {LibClone} from "solady/utils/LibClone.sol";
|
|
6
|
+
|
|
7
|
+
library Create2Utils {
|
|
8
|
+
address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;
|
|
9
|
+
|
|
10
|
+
error MissingCreate2Factory();
|
|
11
|
+
error Create2AddressDerivationFailed();
|
|
12
|
+
error Create2CallFailed();
|
|
13
|
+
|
|
14
|
+
function create2Deploy(bytes32 salt, bytes memory bytecode) internal returns (address) {
|
|
15
|
+
if (!isContractDeployed(CREATE2_FACTORY)) {
|
|
16
|
+
CustomRevert.revertWith(MissingCreate2Factory.selector);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
address computed = computeCreate2Address(salt, bytecode);
|
|
20
|
+
|
|
21
|
+
if (isContractDeployed(computed)) {
|
|
22
|
+
return computed;
|
|
23
|
+
} else {
|
|
24
|
+
address deployedAt = performCreate2Call(salt, bytecode);
|
|
25
|
+
if (deployedAt != computed) {
|
|
26
|
+
CustomRevert.revertWith(Create2AddressDerivationFailed.selector);
|
|
27
|
+
}
|
|
28
|
+
return deployedAt;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function isContractDeployed(address addr) internal view returns (bool isContract) {
|
|
33
|
+
assembly ("memory-safe") {
|
|
34
|
+
isContract := gt(extcodesize(addr), 0)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function computeCreate2Address(
|
|
39
|
+
bytes32 salt,
|
|
40
|
+
bytes memory bytecode
|
|
41
|
+
) internal pure returns (address) {
|
|
42
|
+
return LibClone.predictDeterministicAddress(keccak256(bytecode), salt, CREATE2_FACTORY);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function performCreate2Call(
|
|
46
|
+
bytes32 salt,
|
|
47
|
+
bytes memory bytecode
|
|
48
|
+
) internal returns (address deployedAt) {
|
|
49
|
+
bytes memory data = abi.encodePacked(salt, bytecode);
|
|
50
|
+
|
|
51
|
+
assembly ("memory-safe") {
|
|
52
|
+
// If call failed, revert with empty data
|
|
53
|
+
if iszero(
|
|
54
|
+
call(
|
|
55
|
+
gas(), // Forward all available gas
|
|
56
|
+
CREATE2_FACTORY, // Address of the CREATE2 factory
|
|
57
|
+
0, // No ETH value
|
|
58
|
+
add(data, 0x20), // Pointer to data (skip length prefix)
|
|
59
|
+
mload(data), // Data size
|
|
60
|
+
0, // Output location
|
|
61
|
+
0x20 // Output size (32 bytes)
|
|
62
|
+
)
|
|
63
|
+
) {
|
|
64
|
+
// Inline revert with empty data
|
|
65
|
+
revert(0, 0)
|
|
66
|
+
}
|
|
67
|
+
deployedAt := shr(96, mload(0))
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (deployedAt == address(0)) {
|
|
71
|
+
CustomRevert.revertWith(Create2CallFailed.selector);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.24;
|
|
3
|
+
|
|
4
|
+
// interfaces
|
|
5
|
+
import {IWETH} from "../interfaces/IWETH.sol";
|
|
6
|
+
|
|
7
|
+
// libraries
|
|
8
|
+
import {SafeTransferLib} from "solady/utils/SafeTransferLib.sol";
|
|
9
|
+
import {CustomRevert} from "./CustomRevert.sol";
|
|
10
|
+
|
|
11
|
+
// contracts
|
|
12
|
+
|
|
13
|
+
library CurrencyTransfer {
|
|
14
|
+
using SafeTransferLib for address;
|
|
15
|
+
using CustomRevert for bytes4;
|
|
16
|
+
|
|
17
|
+
/// @dev The address interpreted as native token of the chain.
|
|
18
|
+
address internal constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
|
|
19
|
+
|
|
20
|
+
/// @dev The ETH transfer has failed.
|
|
21
|
+
error ETHTransferFailed();
|
|
22
|
+
|
|
23
|
+
/// @dev The ERC20 `transferFrom` has failed.
|
|
24
|
+
error TransferFromFailed();
|
|
25
|
+
|
|
26
|
+
/// @dev The ERC20 `transfer` has failed.
|
|
27
|
+
error TransferFailed();
|
|
28
|
+
|
|
29
|
+
/// @dev The `msg.value` does not match the amount.
|
|
30
|
+
error MsgValueMismatch();
|
|
31
|
+
|
|
32
|
+
/// @dev Transfers a given amount of currency.
|
|
33
|
+
/// @param currency The currency to transfer.
|
|
34
|
+
/// @param from The address to transfer from.
|
|
35
|
+
/// @param to The address to transfer to.
|
|
36
|
+
/// @param amount The amount to transfer.
|
|
37
|
+
function transferCurrency(address currency, address from, address to, uint256 amount) internal {
|
|
38
|
+
if (amount == 0) return;
|
|
39
|
+
|
|
40
|
+
if (currency != NATIVE_TOKEN) safeTransferERC20(currency, from, to, amount);
|
|
41
|
+
else safeTransferNativeToken(to, amount);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/// @dev Transfers a given amount of currency. (With native token wrapping)
|
|
45
|
+
/// @param currency The currency to transfer.
|
|
46
|
+
/// @param from The address to transfer from.
|
|
47
|
+
/// @param to The address to transfer to.
|
|
48
|
+
/// @param amount The amount to transfer.
|
|
49
|
+
/// @param _nativeTokenWrapper The address of the native token wrapper.
|
|
50
|
+
function transferCurrencyWithWrapper(
|
|
51
|
+
address currency,
|
|
52
|
+
address from,
|
|
53
|
+
address to,
|
|
54
|
+
uint256 amount,
|
|
55
|
+
address _nativeTokenWrapper
|
|
56
|
+
) internal {
|
|
57
|
+
if (amount == 0) return;
|
|
58
|
+
|
|
59
|
+
if (currency == NATIVE_TOKEN) {
|
|
60
|
+
if (from == address(this)) {
|
|
61
|
+
IWETH(_nativeTokenWrapper).withdraw(amount);
|
|
62
|
+
safeTransferNativeTokenWithWrapper(to, amount, _nativeTokenWrapper);
|
|
63
|
+
} else {
|
|
64
|
+
if (amount != msg.value) MsgValueMismatch.selector.revertWith();
|
|
65
|
+
|
|
66
|
+
if (to == address(this)) IWETH(_nativeTokenWrapper).deposit{value: msg.value}();
|
|
67
|
+
else safeTransferNativeTokenWithWrapper(to, msg.value, _nativeTokenWrapper);
|
|
68
|
+
}
|
|
69
|
+
} else {
|
|
70
|
+
safeTransferERC20(currency, from, to, amount);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/// @dev Transfer `amount` of ERC20 token from `from` to `to`.
|
|
75
|
+
function safeTransferERC20(address token, address from, address to, uint256 amount) internal {
|
|
76
|
+
if (from == to) return;
|
|
77
|
+
|
|
78
|
+
if (from != address(this)) token.safeTransferFrom(from, to, amount);
|
|
79
|
+
else token.safeTransfer(to, amount);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/// @dev Transfers `amount` of native token to `to`.
|
|
83
|
+
function safeTransferNativeToken(address to, uint256 value) internal {
|
|
84
|
+
to.safeTransferETH(value);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/// @dev Transfers `amount` of native token to `to`. (With native token wrapping)
|
|
88
|
+
function safeTransferNativeTokenWithWrapper(
|
|
89
|
+
address to,
|
|
90
|
+
uint256 value,
|
|
91
|
+
address _nativeTokenWrapper
|
|
92
|
+
) internal {
|
|
93
|
+
bool success = to.trySafeTransferETH(value, gasleft());
|
|
94
|
+
if (!success) {
|
|
95
|
+
IWETH(_nativeTokenWrapper).deposit{value: value}();
|
|
96
|
+
_nativeTokenWrapper.safeTransfer(to, value);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.0;
|
|
3
|
+
|
|
4
|
+
/// @title Library for reverting with custom errors efficiently
|
|
5
|
+
/// @notice Contains functions for reverting with custom errors with different argument types
|
|
6
|
+
/// efficiently
|
|
7
|
+
/// @dev To use this library, declare `using CustomRevert for bytes4;` and replace `revert
|
|
8
|
+
/// CustomError()` with
|
|
9
|
+
/// `CustomError.selector.revertWith()`
|
|
10
|
+
/// @dev The functions may tamper with the free memory pointer but it is fine since the call context
|
|
11
|
+
/// is exited immediately
|
|
12
|
+
library CustomRevert {
|
|
13
|
+
/// @dev Reverts with the selector of a custom error in the scratch space
|
|
14
|
+
function revertWith(bytes4 selector) internal pure {
|
|
15
|
+
assembly ("memory-safe") {
|
|
16
|
+
mstore(0, selector)
|
|
17
|
+
revert(0, 0x04)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/// @dev Reverts with a custom error with a uint256 argument in the scratch space
|
|
22
|
+
function revertWith(bytes4 selector, uint256 value) internal pure {
|
|
23
|
+
assembly ("memory-safe") {
|
|
24
|
+
mstore(0, selector)
|
|
25
|
+
mstore(0x04, value)
|
|
26
|
+
revert(0, 0x24)
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/// @dev Reverts with a custom error with an address argument in the scratch space
|
|
31
|
+
function revertWith(bytes4 selector, address addr) internal pure {
|
|
32
|
+
assembly ("memory-safe") {
|
|
33
|
+
mstore(0, selector)
|
|
34
|
+
mstore(0x04, and(addr, 0xffffffffffffffffffffffffffffffffffffffff))
|
|
35
|
+
revert(0, 0x24)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/// @dev Reverts with the legacy error message without additional allocation
|
|
40
|
+
function revertWith(string memory message) internal pure {
|
|
41
|
+
assembly ("memory-safe") {
|
|
42
|
+
mstore(sub(message, 0x40), 0x08c379a0) // Error(string)
|
|
43
|
+
mstore(sub(message, 0x20), 0x20) // abi encoding offset
|
|
44
|
+
// round up to multiple of 32
|
|
45
|
+
let len := and(add(mload(message), 0x1f), not(0x1f))
|
|
46
|
+
revert(sub(message, 0x24), add(len, 0x44))
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.23;
|
|
3
|
+
|
|
4
|
+
import {LibClone} from "solady/utils/LibClone.sol";
|
|
5
|
+
|
|
6
|
+
/// @title Factory for arbitrary code deployment using the "CREATE" and "CREATE2" opcodes
|
|
7
|
+
library Factory {
|
|
8
|
+
/// @notice Emitted when deployment fails
|
|
9
|
+
/// @param revertData Nested revert data
|
|
10
|
+
error Factory__FailedDeployment(bytes revertData);
|
|
11
|
+
|
|
12
|
+
/// @notice deploy contract code using "CREATE" opcode
|
|
13
|
+
/// @param initCode contract initialization code
|
|
14
|
+
/// @return deployment address of deployed contract
|
|
15
|
+
function deploy(bytes memory initCode) internal returns (address deployment) {
|
|
16
|
+
assembly ("memory-safe") {
|
|
17
|
+
deployment := create(0, add(initCode, 0x20), mload(initCode))
|
|
18
|
+
if iszero(deployment) {
|
|
19
|
+
// revert Factory__FailedDeployment(revertData)
|
|
20
|
+
mstore(0, 0x2b1c2246)
|
|
21
|
+
mstore(0x20, 0x20)
|
|
22
|
+
mstore(0x40, returndatasize())
|
|
23
|
+
returndatacopy(0x60, 0, returndatasize())
|
|
24
|
+
// round up to nearest 32 bytes
|
|
25
|
+
let rounded_len := and(not(0x1f), add(0x1f, returndatasize()))
|
|
26
|
+
revert(0x1c, add(0x44, rounded_len))
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/// @notice deploy contract code using "CREATE2" opcode
|
|
32
|
+
/// @dev reverts if deployment is not successful (likely because salt has already been used)
|
|
33
|
+
/// @param initCode contract initialization code
|
|
34
|
+
/// @param salt input for deterministic address calculation
|
|
35
|
+
/// @return deployment address of deployed contract
|
|
36
|
+
function deploy(bytes memory initCode, bytes32 salt) internal returns (address deployment) {
|
|
37
|
+
assembly ("memory-safe") {
|
|
38
|
+
deployment := create2(0, add(initCode, 0x20), mload(initCode), salt)
|
|
39
|
+
if iszero(deployment) {
|
|
40
|
+
// revert Factory__FailedDeployment(revertData)
|
|
41
|
+
mstore(0, 0x2b1c2246)
|
|
42
|
+
mstore(0x20, 0x20)
|
|
43
|
+
mstore(0x40, returndatasize())
|
|
44
|
+
returndatacopy(0x60, 0, returndatasize())
|
|
45
|
+
// round up to nearest 32 bytes
|
|
46
|
+
let rounded_len := and(not(0x1f), add(0x1f, returndatasize()))
|
|
47
|
+
revert(0x1c, add(0x44, rounded_len))
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/// @notice calculate the _deployMetamorphicContract deployment address for a given salt
|
|
53
|
+
/// @param initCodeHash hash of contract initialization code
|
|
54
|
+
/// @param salt input for deterministic address calculation
|
|
55
|
+
/// @return deployment deployment address
|
|
56
|
+
function calculateDeploymentAddress(
|
|
57
|
+
bytes32 initCodeHash,
|
|
58
|
+
bytes32 salt
|
|
59
|
+
) internal view returns (address deployment) {
|
|
60
|
+
deployment = LibClone.predictDeterministicAddress(initCodeHash, salt, address(this));
|
|
61
|
+
assembly {
|
|
62
|
+
// clean the upper 96 bits
|
|
63
|
+
deployment := and(deployment, 0xffffffffffffffffffffffffffffffffffffffff)
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|