interface IZapRegistry {
    /** @notice Log when a new `IZap` is registered */
    event ZapRegistered(IZap zap);

    /** @notice Log when an `IZap` is removed */
    event ZapRemoved(string name);

    /**
     * @notice Add a new `IZap` to the registry
     * @dev Should not allow duplicate swaps
     * @param zap The new `IZap`
     */
    function registerZap(IZap zap) external;

    /**
     * @notice Remove an `IZap` from the registry
     * @param name The name of the `IZap` (see `INameIdentifier`)
     */
    function removeZap(string calldata name) external;

    /**
     * @notice Get the names of all registered `IZap`
     * @return An array of `IZap` names
     */
    function zapNames() external view returns (string[] memory);
}
/**
 * @notice For managing a collection of `IZap` contracts
 */
function registerZap(IZap zap) external;

/**
 * @notice Add a new `IZap` to the registry
 * @dev Should not allow duplicate swaps
 * @param zap The new `IZap`
 */