// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import "./FlapVaultSchemas.sol"; interface IVaultFactory { function newVault(address taxToken, address quoteToken, address creator, bytes calldata vaultData) external returns (address vault); function isQuoteTokenSupported(address quoteToken) external view returns (bool supported); } interface IVaultPortalTypes { struct NewTokenV6WithVaultParams { string name; string symbol; string meta; uint8 dexThresh; bytes32 salt; uint8 migratorType; address quoteToken; uint256 quoteAmt; bytes permitData; bytes32 extensionID; bytes extensionData; uint8 dexId; uint8 lpFeeProfile; uint16 buyTaxRate; uint16 sellTaxRate; uint64 taxDuration; uint64 antiFarmerDuration; uint16 mktBps; uint16 deflationBps; uint16 dividendBps; uint16 lpBps; uint256 minimumShareBalance; address dividendToken; address commissionReceiver; uint8 tokenVersion; address vaultFactory; bytes vaultData; } } interface IVaultFactoryValidationV2 { struct LaunchValidationDataV1 { uint8 tokenVersion; address quoteToken; uint16 buyTaxRate; uint16 sellTaxRate; uint16 vaultBps; uint16 deflationBps; uint16 dividendBps; uint16 lpBps; address dividendToken; uint256 minimumShareBalance; } function onBeforeLaunch(bytes calldata validationData) external view returns (bool success, string memory reason); } abstract contract VaultFactoryBaseV2 is IVaultFactory { error UnsupportedChain(uint256 chainId); error LegacyV6ValidationHookNotImplemented(); function vaultDataSchema() public pure virtual returns (VaultDataSchema memory schema); function onBeforeNewTokenV6WithVault(IVaultPortalTypes.NewTokenV6WithVaultParams calldata params) external virtual returns (bool, string memory) { params = params; revert LegacyV6ValidationHookNotImplemented(); } function onBeforeLaunch(bytes calldata validationData) external view virtual returns (bool success, string memory reason) { IVaultFactoryValidationV2.LaunchValidationDataV1 memory data = abi.decode(validationData, (IVaultFactoryValidationV2.LaunchValidationDataV1)); return _validateBeforeLaunch(data); } function _validateBeforeLaunch(IVaultFactoryValidationV2.LaunchValidationDataV1 memory data) internal view virtual returns (bool success, string memory reason) { data = data; return (true, ""); } function factorySpecVersion() public pure returns (string memory) { return "v2.2"; } function tokenCreationPolicies() public pure virtual returns (FactoryPolicy[] memory policies) { return new FactoryPolicy[](0); } function _getVaultPortal() internal view returns (address vaultPortal) { uint256 chainId = block.chainid; if (chainId == 56) { return 0x90497450f2a706f1951b5bdda52B4E5d16f34C06; } else if (chainId == 97) { return 0x027e3704fC5C16522e9393d04C60A3ac5c0d775f; } else if (chainId == 4663) { return 0xe9F7AB7DE8FB8756acbB6a1cd13316a43308197B; } revert UnsupportedChain(chainId); } function _getGuardian() internal view returns (address guardian) { uint256 chainId = block.chainid; if (chainId == 56) { return 0x9e27098dcD8844bcc6287a557E0b4D09C86B8a4b; } else if (chainId == 97) { return 0x76Fa8C526f8Bc27ba6958B76DeEf92a0dbE46950; } else if (chainId == 4663) { return 0x0000b48720d3B4ED6BC5031768B07F2b59270000; } revert UnsupportedChain(chainId); } function _isSupportedVaultPortalCaller() internal view returns (bool) { return msg.sender == _getVaultPortal(); } }