LayerCover

ISyndicate

Interface for the Syndicate vault, the core underwriting engine.

View deployed contract addresses in the Contract Addresses section.

The ISyndicate interface defines the interactions for a Syndicate vault. Syndicates are ERC4626-compliant vaults that allow Liquidity Providers (LPs) to deposit capital, which is then allocated to underwriting pools to earn yield from premiums. The architecture uses a merged Hub+Strategy pattern for gas efficiency.

Interface

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol";
import {Types} from "../libraries/helpers/Types.sol";
import {SyndicateTypes} from "../vaults/syndicates/libraries/SyndicateTypes.sol";

/**
 * @title ISyndicate
 * @notice Unified interface for Syndicate vaults (merged Hub+Strategy architecture)
 * @dev Includes vault operations, intent reservations, duration tracking, and snapshots
 */
interface ISyndicate is IERC4626 {
    
    /* =============================
       ===== Initialization =====
       ============================= */

    function initialize(
        address systemRegistry_,
        address asset_,
        address syndicateManager_,
        address feeRecipient_,
        string calldata name_,
        string calldata symbol_,
        address initialOwner_,
        address salvageManager_,
        uint16 performanceFeeBps_
    ) external;

    /* =============================
       ===== Vault Operations =====
       ============================= */

    function idleAssets() external view returns (uint256);
    function effectiveCapacity() external returns (uint256);

    function deallocateFromPool(uint256 poolId) external;
    function allocate(uint256 poolId, uint256 amount) external;

    // Bundled Setters
    function configureVault(SyndicateTypes.VaultConfig calldata config) external;
    function configureManager(SyndicateTypes.ManagerConfig calldata config) external;
    function configureDependencies(SyndicateTypes.DependenciesConfig calldata config) external;

    /* =============================
       ===== Intent Reservations =====
       ============================= */

    function reserveMatchedIntent(
        SyndicateTypes.ReservationParams calldata params
    ) external returns (bytes32 key);
    function cancelReservation(bytes32 key) external;
    function expireReservation(bytes32 key) external;
    function consumeReservation(bytes32 key, uint256 poolId, uint256 coverageAmount, uint32 coverageDuration) external returns (uint256 reservedShares);
    function releaseReservation(bytes32 key, uint256 coverageAmount) external returns (uint256 releasedShares);
    function setSolverMinNonce(address solver, uint96 newMin) external;

    /* =============================
       ===== Duration Tracking =====
       ============================= */

    function setDepositLockPreference(uint32 duration) external;
    function extendLockDuration(uint32 newDuration) external;
    function getSharesUnlockingAt(uint64 unlockTime) external view returns (uint256);
    function availableSharesForExactDuration(uint32 duration) external view returns (uint256);

    /* =============================
       ===== Yield Management =====
       ============================= */

    function harvestYield(uint256 minAmount) external returns (uint256 appliedAmount);
    function upkeep() external;
    function performanceFeeBps() external view returns (uint16);

    /* =============================
       ===== Hooks =====
       ============================= */

    function yieldBoostHook() external view returns (address);
    function reinsuranceHook() external view returns (address);
    function setYieldBoostHook(address hook) external;
    function setReinsuranceHook(address hook) external;

    /* =============================
       ===== Bundled Views =====
       ============================= */

    function getVaultConfig() external view returns (SyndicateTypes.VaultConfig memory);
    function getManagerConfig() external view returns (SyndicateTypes.ManagerConfig memory);
    function getAccountState(address account) external view returns (SyndicateTypes.AccountState memory);
    function getReservation(bytes32 key) external view returns (SyndicateTypes.ReservationView memory);
    function reserveNonces(address solver) external view returns (uint96);
    function getActiveReservationsCount() external view returns (uint256);

    function owner() external view returns (address);
    function syndicateManager() external view returns (address);
    function poolAllocations() external view returns (address);

    /**
     * @notice Receive premium and split with reinsurer if applicable
     * @param premium Total premium amount being distributed
     * @param coverageAmount Total coverage amount that generated this premium  
     * @param reinsuredPortion Amount of coverage backed by reinsurance
     */
    function receivePremiumWithReinsuranceSplit(
        uint256 premium,
        uint256 coverageAmount,
        uint256 reinsuredPortion
    ) external;

    /* =============================
       ===== Salvage Claims =====
       ============================= */

    function distributeSalvage(address salvageToken, uint256 maxRounds) external;
    function initializeSalvageSnapshot(address salvageToken) external;

    /* =============================
       ===== Snapshot Support =====
       ============================= */

    function balanceOfAt(address account, uint256 snapshotId) external view returns (uint256);
    function totalSupplyAt(uint256 snapshotId) external view returns (uint256);

    /* =============================
       ===== Misc & Admin =====
       ============================= */

    function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4);
}

Capital Flow