contract NativeOrdersFeature is
    IFeature,
    NativeOrdersSettlement
{
    /// @dev Name of this feature.
    string public constant override FEATURE_NAME = "LimitOrders";
    /// @dev Version of this feature.
    uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 2, 0);

    constructor(
        address zeroExAddress,
        IEtherTokenV06 weth,
        IStaking staking,
        FeeCollectorController feeCollectorController,
        uint32 protocolFeeMultiplier
    )
        public
        NativeOrdersSettlement(
            zeroExAddress,
            weth,
            staking,
            feeCollectorController,
            protocolFeeMultiplier
        )
    {
        // solhint-disable no-empty-blocks
    }

    /// @dev Initialize and register this feature.
    ///      Should be delegatecalled by `Migrate.migrate()`.
    /// @return success `LibMigrate.SUCCESS` on success.
    function migrate()
        external
        returns (bytes4 success)
    {
        _registerFeatureFunction(this.transferProtocolFeesForPools.selector);
        _registerFeatureFunction(this.fillLimitOrder.selector);
        _registerFeatureFunction(this.fillRfqOrder.selector);
        _registerFeatureFunction(this.fillOrKillLimitOrder.selector);
        _registerFeatureFunction(this.fillOrKillRfqOrder.selector);
        _registerFeatureFunction(this._fillLimitOrder.selector);
        _registerFeatureFunction(this._fillRfqOrder.selector);
        _registerFeatureFunction(this.cancelLimitOrder.selector);
        _registerFeatureFunction(this.cancelRfqOrder.selector);
        _registerFeatureFunction(this.batchCancelLimitOrders.selector);
        _registerFeatureFunction(this.batchCancelRfqOrders.selector);
        _registerFeatureFunction(this.cancelPairLimitOrders.selector);
        _registerFeatureFunction(this.cancelPairLimitOrdersWithSigner.selector);
        _registerFeatureFunction(this.batchCancelPairLimitOrders.selector);
        _registerFeatureFunction(this.batchCancelPairLimitOrdersWithSigner.selector);
        _registerFeatureFunction(this.cancelPairRfqOrders.selector);
        _registerFeatureFunction(this.cancelPairRfqOrdersWithSigner.selector);
        _registerFeatureFunction(this.batchCancelPairRfqOrders.selector);
        _registerFeatureFunction(this.batchCancelPairRfqOrdersWithSigner.selector);
        _registerFeatureFunction(this.getLimitOrderInfo.selector);
        _registerFeatureFunction(this.getRfqOrderInfo.selector);
        _registerFeatureFunction(this.getLimitOrderHash.selector);
        _registerFeatureFunction(this.getRfqOrderHash.selector);
        _registerFeatureFunction(this.getProtocolFeeMultiplier.selector);
        _registerFeatureFunction(this.registerAllowedRfqOrigins.selector);
        _registerFeatureFunction(this.getLimitOrderRelevantState.selector);
        _registerFeatureFunction(this.getRfqOrderRelevantState.selector);
        _registerFeatureFunction(this.batchGetLimitOrderRelevantStates.selector);
        _registerFeatureFunction(this.batchGetRfqOrderRelevantStates.selector);
        _registerFeatureFunction(this.registerAllowedOrderSigner.selector);
        _registerFeatureFunction(this.isValidOrderSigner.selector);
        return LibMigrate.MIGRATE_SUCCESS;
    }
}
/// @dev Feature for interacting with limit and RFQ orders.
function migrate()
    external
    returns (bytes4 success)
{
    _registerFeatureFunction(this.transferProtocolFeesForPools.selector);
    _registerFeatureFunction(this.fillLimitOrder.selector);
    _registerFeatureFunction(this.fillRfqOrder.selector);
    _registerFeatureFunction(this.fillOrKillLimitOrder.selector);
    _registerFeatureFunction(this.fillOrKillRfqOrder.selector);
    _registerFeatureFunction(this._fillLimitOrder.selector);
    _registerFeatureFunction(this._fillRfqOrder.selector);
    _registerFeatureFunction(this.cancelLimitOrder.selector);
    _registerFeatureFunction(this.cancelRfqOrder.selector);
    _registerFeatureFunction(this.batchCancelLimitOrders.selector);
    _registerFeatureFunction(this.batchCancelRfqOrders.selector);
    _registerFeatureFunction(this.cancelPairLimitOrders.selector);
    _registerFeatureFunction(this.cancelPairLimitOrdersWithSigner.selector);
    _registerFeatureFunction(this.batchCancelPairLimitOrders.selector);
    _registerFeatureFunction(this.batchCancelPairLimitOrdersWithSigner.selector);
    _registerFeatureFunction(this.cancelPairRfqOrders.selector);
    _registerFeatureFunction(this.cancelPairRfqOrdersWithSigner.selector);
    _registerFeatureFunction(this.batchCancelPairRfqOrders.selector);
    _registerFeatureFunction(this.batchCancelPairRfqOrdersWithSigner.selector);
    _registerFeatureFunction(this.getLimitOrderInfo.selector);
    _registerFeatureFunction(this.getRfqOrderInfo.selector);
    _registerFeatureFunction(this.getLimitOrderHash.selector);
    _registerFeatureFunction(this.getRfqOrderHash.selector);
    _registerFeatureFunction(this.getProtocolFeeMultiplier.selector);
    _registerFeatureFunction(this.registerAllowedRfqOrigins.selector);
    _registerFeatureFunction(this.getLimitOrderRelevantState.selector);
    _registerFeatureFunction(this.getRfqOrderRelevantState.selector);
    _registerFeatureFunction(this.batchGetLimitOrderRelevantStates.selector);
    _registerFeatureFunction(this.batchGetRfqOrderRelevantStates.selector);
    _registerFeatureFunction(this.registerAllowedOrderSigner.selector);
    _registerFeatureFunction(this.isValidOrderSigner.selector);
    return LibMigrate.MIGRATE_SUCCESS;
}

/// @dev Initialize and register this feature.
///      Should be delegatecalled by `Migrate.migrate()`.
/// @return success `LibMigrate.SUCCESS` on success.