Lesson 3.7.5 · 55 min
MiCA: the EU framework for crypto-assets and their service providers (CASPs)
Since July 1, 2026, nobody can provide crypto-asset services in Spain without authorization under MiCA. This lesson reads the regulation and the documents of ESMA and of the CNMV (Spain's securities market regulator), turns their dates, their services and their minimum capital into code, and processes an extract in the format of the ESMA register to check a provider before trading with it. It is not legal advice.
- Module
- 3.7 · Crypto derivatives and specific strategies
- Duration
- 55 min
- Prerequisites
- 1.2.6 · Crypto: spot, perpetuals, funding and custody, 3.7.4 · ccxt for trading on multiple exchanges
- Author
- Jesús Cuesta
- Updated
Level 3 lessons
3.1 · Futures in depth
3.2 · Futures spreads
- 3.2.1 Calendar spreads, butterflies and condors
- 3.2.2 Intercommodity spreads: crack, spark and crush
- 3.2.3 Rate and index spreads: 2s10s, NOB, NQ/ES and Europe versus the U.S.
- 3.2.4 Hedge ratios: by notional, by DV01 and by volatility
- 3.2.5 Spread data and backtesting: listed, synthetic and legged
- 3.2.6 Seasonality of spreads: multi-year analysis, patterns and traps
3.3 · Advanced forex
3.4 · Option theory and pricing
- 3.4.1 Payoffs, put-call parity and arbitrage bounds
- 3.4.2 Binomial trees, Black-Scholes-Merton, Black-76 and Monte Carlo
- 3.4.3 Greeks: delta, gamma, vega, theta, rho, vanna, volga and charm
- 3.4.4 Implied volatility: Newton-Raphson, Brent, py_vollib and QuantLib
- 3.4.5 Smile, skew and term structure; volatility surface with SVI
- 3.4.6 Realized vs implied volatility; volatility risk premium; VIX and VSTOXX
- 3.4.7 Advanced models: Heston, SABR and local volatility
3.5 · Option structures in Python
- 3.5.1 Directional and vertical structures: call, put, covered call, collar and spreads
- 3.5.2 Volatility and range structures: straddles, strangles, condors and butterflies
- 3.5.3 Calendars, diagonals, ratios, backspreads, risk reversals and jade lizard
- 3.5.4 A custom tool: payoff, aggregate Greeks and scenarios
- 3.5.5 Management: adjustments, rolls, early closes, early assignment and pin risk
3.6 · Systematic volatility and options strategies
3.7 · Crypto derivatives and specific strategies
- 3.7.1 Perpetuals: funding mechanics, mark price and liquidations
- 3.7.2 Funding arbitrage, basis with futures and cross-exchange arbitrage
- 3.7.3 Crypto options, on-chain data and DeFi
- 3.7.4 ccxt for trading on multiple exchanges
- 3.7.5 MiCA: the EU framework for crypto-assets and their service providers (CASPs)
What MiCA regulates and what it leaves out
Regulation (EU) 2023/1114 of the European Parliament and of the Council of May 31, 2023 on markets in crypto-assets (MiCA) was published in the Official Journal of the EU on June 9, 2023 (OJ L 150)1Note 1 · Regulation (EU) 2023/1114 of the European Parliament and of the Council of May 31, 2023 (OJ L 150 of 9.6.2023), Articles 2, 3, 59 to 63, 65, 67, 70, 75, 86 to 92, 109, 110, 143 and 149, and Annex IV, English version on EUR-Lex, accessed on October 22, 2026.. It applies to those who issue, offer to the public or seek admission to trading of crypto-assets, and to those who provide services related to them in the Union (Art. 2(1)). It defines a crypto-asset as “a digital representation of a value or of a right that is able to be transferred and stored electronically using distributed ledger technology or similar technology” (Art. 3(1)(5)) and distinguishes three types:
- E-money token (EMT): purports to maintain a stable value by referencing the value of one official currency (Art. 3(1)(7)). This is the case of stablecoins in dollars or in euros. Title IV.
- Asset-referenced token (ART): purports to maintain a stable value by referencing another value or right, or a combination thereof, including one or more official currencies (Art. 3(1)(6)). Title III.
- Other crypto-assets: the rest, such as the native coins of a network. Offering them requires a white paper (Title II).
And it leaves out, among others, crypto-assets that are unique and non-fungible (Art. 2(3)) and those that are financial instruments, deposits or funds (Art. 2(4)). For a trader, the important exclusion is that of financial instruments: ESMA, in its guidelines on the qualification of crypto-assets as financial instruments, asks for perpetual futures to be treated as derivative contracts and assessed against the criteria of Annex I, Section C, points (4) to (10), of MiFID II (guideline 5)2Note 2 · ESMA, “Final Report. Guidelines on the conditions and criteria for the qualification of crypto-assets as financial instruments”, ESMA75453128700-1323, December 17, 2024, guideline 5, paragraph 47, esma.europa.eu.. The perpetuals, futures and options of lessons 3.7.1 to 3.7.3 are not MiCA services: they are MiFID II instruments.
Mermaid source
flowchart TB
T[Token] --> F{MiFID?}
F -- yes --> M[MiFID II]
F -- no --> U{Unique and NFT?}
U -- yes --> X[Outside MiCA]
U -- no --> E{Ref. 1 currency?}
E -- yes --> EMT[EMT Title IV]
E -- no --> A{Ref. assets?}
A -- yes --> ART[ART Title III]
A -- no --> O[Title II]The tree is a simplification of Articles 2 and 3. In code, with fictitious tokens:
def regimen(t):
"""Simplified tree of Arts. 2 and 3 of MiCA and ESMA guideline 5.
Indicative only: it is not a substitute for a legal analysis."""
if t.get("derivado") or t.get("instrumento_financiero"):
return "outside MiCA: MiFID II (financial instrument)"
if t.get("unico_no_fungible"):
return "outside MiCA (Art. 2(3))"
ref = t.get("referencia")
if ref == "one official currency":
return "e-money token (EMT, Title IV)"
if ref is not None:
return "asset-referenced token (ART, Title III)"
return "other crypto-asset (Title II: white paper)"
tokens = {
"XBQ (native coin of its network)": {},
"USDQ (stable against the dollar)":
{"referencia": "one official currency"},
"basket gold + euro + dollar": {"referencia": "basket"},
"unique digital artwork": {"unico_no_fungible": True},
"tokenized share": {"instrumento_financiero": True},
"perpetual on XBQ": {"derivado": True},
}
for nombre, t in tokens.items():
print(f"{nombre:<32} -> {regimen(t)}")XBQ (native coin of its network) -> other crypto-asset (Title II: white paper)
USDQ (stable against the dollar) -> e-money token (EMT, Title IV)
basket gold + euro + dollar -> asset-referenced token (ART, Title III)
unique digital artwork -> outside MiCA (Art. 2(3))
tokenized share -> outside MiCA: MiFID II (financial instrument)
perpetual on XBQ -> outside MiCA: MiFID II (financial instrument)The truly hard answers (whether a specific token is a financial instrument, whether an algorithmic stablecoin is an EMT or an ART) depend on the rights it grants and on the case-by-case analysis that the ESMA guidelines call for; the tree is for getting your bearings, not for deciding.
The timeline
Article 149 sets the dates: the regulation enters into force 20 days after its publication, Titles III and IV (ARTs and EMTs) apply from June 30, 2024 and the rest from December 30, 20241. Article 143 adds two transitional periods: providers that were providing services under national law before December 30, 2024 may continue “until 1 July 2026 or until they are granted or refused an authorisation […], whichever is sooner” (Art. 143(3)), and operators of trading platforms have until December 31, 2027 for a white paper to exist for the crypto-assets that were already being traded (Art. 143(2)(b)). The figure at the top places them in time:
import io
import numpy as np
import pandas as pd
publicacion = pd.Timestamp("2023-06-09") # OJ L 150
fechas = pd.Series({
"entry into force (Art. 149(1))":
publicacion + pd.Timedelta(days=20),
"Titles III and IV: ART and EMT (Art. 149(3))":
pd.Timestamp("2024-06-30"),
"rest of the regulation (Art. 149(2))": pd.Timestamp("2024-12-30"),
"end of the transitional regime (Art. 143(3))":
pd.Timestamp("2026-07-01"),
"white papers, already traded (Art. 143(2)(b))":
pd.Timestamp("2027-12-31"),
})
hoy = pd.Timestamp("2026-10-22")
pd.DataFrame({"date": fechas.dt.date,
"days until today": (hoy - fechas).dt.days}) date days until today
entry into force (Art. 149(1)) 2023-06-29 1211
Titles III and IV: ART and EMT (Art. 149(3)) 2024-06-30 844
rest of the regulation (Art. 149(2)) 2024-12-30 661
end of the transitional regime (Art. 143(3)) 2026-07-01 113
white papers, already traded (Art. 143(2)(b)) 2027-12-31 -435The computed entry into force (June 9, 2023 plus 20 days) is June 29, 2023, the same date from which Article 149(4) applies the empowerments for implementing measures. Today, October 22, 2026, the regulation has been applying in full for 661 days and the transitional regime ended 113 days ago.
The transitional regime, State by State
Article 143(3) allows each State not to apply the transitional regime or to shorten it if its national framework was less strict. ESMA publishes the list of what each one notified3Note 3 · ESMA, “List of grandfathering periods decided by Member States under Article 143 of Regulation (EU) 2023/1114” (PDF of May 19, 2026), esma.europa.eu, accessed on October 22, 2026.:
meses = {"BE": 18, "BG": 18, "CZ": 18, "DK": 18, "DE": 12, "EE": 18,
"IE": 12, "GR": 18, "ES": 18, "FR": 18, "HR": 18, "IT": 18,
"CY": 18, "LV": 6, "LT": 12, "LU": 18, "HU": 6, "MT": 18,
"NL": 6, "AT": 12, "PL": 6, "PT": 18, "RO": 18, "SI": 6,
"SK": 12, "FI": 6, "SE": 9, "IS": 18, "LI": 18, "NO": 12}
inicio, tope = pd.Timestamp("2024-12-30"), pd.Timestamp("2026-07-01")
fin = {p: tope if m >= 18 else inicio + pd.DateOffset(months=m)
for p, m in meses.items()}
tr = pd.DataFrame({"meses": meses, "fin": fin})
print(tr.groupby("meses").size().rename("países").to_dict())
print("Spain ends:", tr.loc["ES", "fin"].date())
dia = pd.Timestamp("2025-10-01")
print("no transitional regime left on", dia.date(), ":",
sorted(tr.index[tr["fin"] <= dia])){6: 6, 9: 1, 12: 6, 18: 17}
Spain ends: 2026-07-01
no transitional regime left on 2025-10-01 : ['FI', 'HU', 'LV', 'NL', 'PL', 'SE', 'SI']Seventeen EEA States, Spain among them, chose the maximum of 18 months; six set it at 6 months, one at 9 and six at 12. The end dates in the cell for the short periods are approximate (December 30, 2024 plus n months): the exact date is set by each national law, and the ESMA list itself warns that some durations are those the authorities expected and might not yet be in the law. For Spain, the CNMV is explicit: “Since July 1, 2026, only providers authorized by the CNMV or other European authorities may operate in Spain” (translated from the Spanish)4Note 4 · CNMV, “MiCA: Nueva regulación de criptoactivos” (“MiCA: new crypto-asset regulation”, in Spanish), cnmv.es, accessed on October 22, 2026..
Ten services and three capital classes
Article 3(1)(16) lists the crypto-asset services, from point (a) to (j): custody and administration on behalf of clients, operation of a trading platform, exchange for funds, exchange for other crypto-assets, execution of orders, placing, reception and transmission of orders, advice, portfolio management and transfer services on behalf of clients1. The same letters appear in the ESMA register.
Annex IV groups the services into three minimum capital classes: class 1 (EUR 50,000) for execution, placing, transfer, reception and transmission, advice and portfolio management; class 2 (EUR 125,000) if there is also custody or exchange; class 3 (EUR 150,000) if a trading platform is operated. Article 67 requires the greater of that minimum and one quarter of the fixed overheads of the preceding year:
SERVICIOS = {
"a": "custody and administration on behalf of clients",
"b": "operation of a trading platform",
"c": "exchange of crypto-assets for funds",
"d": "exchange of crypto-assets for other crypto-assets",
"e": "execution of orders on behalf of clients",
"f": "placing of crypto-assets",
"g": "reception and transmission of orders",
"h": "providing advice on crypto-assets",
"i": "providing portfolio management on crypto-assets",
"j": "providing transfer services on behalf of clients",
}
def capital_minimo(servicios, gastos_fijos_anuales):
if "b" in servicios:
clase, base = 3, 150_000
elif set(servicios) & {"a", "c", "d"}:
clase, base = 2, 125_000
else:
clase, base = 1, 50_000
return clase, max(base, gastos_fijos_anuales / 4)
casos = {"independent adviser": ("h", 120_000),
"broker that transmits orders": ("eg", 900_000),
"exchange with custody": ("abcdej", 6_000_000)}
for quien, (srv, gastos) in casos.items():
clase, k = capital_minimo(srv, gastos)
print(f"{quien:<29} class {clase}: {k:>12,.0f} EUR")independent adviser class 1: 50,000 EUR
broker that transmits orders class 1: 225,000 EUR
exchange with custody class 3: 1,500,000 EURFor an intermediary with a real structure, the quarter of fixed overheads almost always prevails: the broker in the cell needs EUR 225,000 even though its class is 1, and the exchange, 1.5 million. Capital is a cushion, not a guarantee for the client: as the CNMV points out, there is no investor compensation scheme if a provider goes bust4.
Authorization, notification and passport
Article 59 only allows two types of entities to provide crypto-asset services in the Union: those authorized as CASPs under Article 63, and already supervised entities (credit institutions, central securities depositories, investment firms, market operators, electronic money institutions, UCITS management companies and AIFMs) that notify their authority under Article 60, in general at least 40 working days in advance1. An authorization is valid throughout the Union, through establishment or the free provision of services, without a physical presence in the host State (Art. 59(7)), after notifying the States and the services in advance (Art. 65).
Mermaid source
flowchart TB S[Application Art. 62] --> A[Acknowledgment: 5 days] A --> C[Complete: 25 days] C --> E[Assessment: 40 days] E --> D[Decision] D --> N[Notification: 5] D --> R[ESMA register]
The deadlines of Article 63 are in working days: acknowledgment of receipt within 5, checking that the application is
complete within 25, assessment within 40 from when it is complete (with a suspension of up to 20 if information is
requested) and notification of the decision within 5 more1. With numpy.busday_offset and three 2026 public
holidays as an example (the real list depends on the State and, in Spain, on the autonomous community):
def plazos(presentada, suspension_dias=0, festivos=()):
hab = lambda d, n: np.busday_offset(
np.datetime64(d.date()), n, roll="forward",
holidays=list(festivos))
acuse = hab(presentada, 5)
completa = hab(presentada, 25)
decision = hab(pd.Timestamp(completa), 40 + suspension_dias)
return {"acknowledgment": acuse, "completeness": completa,
"decision": decision,
"notification": hab(pd.Timestamp(decision), 5)}
festivos = ["2026-04-02", "2026-04-03", "2026-05-01"]
for susp in (0, 20):
p = plazos(pd.Timestamp("2026-02-02"), susp, festivos)
print(f"suspension {susp:>2} days:",
{k: str(v) for k, v in p.items()})suspension 0 days: {'acknowledgment': '2026-02-09', 'completeness': '2026-03-09', 'decision': '2026-05-07', 'notification': '2026-05-14'}
suspension 20 days: {'acknowledgment': '2026-02-09', 'completeness': '2026-03-09', 'decision': '2026-06-04', 'notification': '2026-06-11'}An application submitted on February 2, 2026 would get the decision, in the worst case allowed by the regulation, on June 4 and the notification on June 11, days before the end of the transitional regime. That is why many Spanish authorizations in the register are dated June and July 2026. Companies from outside the EU can only serve without authorization clients who come to them on the client's own exclusive initiative, without soliciting them in any way in the Union (Art. 61), and ESMA has published guidelines to delimit that case.
The ESMA register
Articles 109 and 110 task ESMA with a register of white papers, ART and EMT issuers and CASPs, and another,
non-exhaustive one, of entities that provide services without complying with the rules1. While it is being
integrated into its systems, ESMA publishes it as an interim register in five CSV files (OTHER.csv, ARTZZ.csv,
EMTWP.csv, CASPS.csv and NCASP.csv) along with a file describing each field5Note 5 · ESMA, MiCA page, section “Interim MiCA Register” (five CSV files, last updated on October 19, 2026, and
description of the fields),
esma.europa.eu,
accessed on October 22, 2026.. Downloading and summarizing the
CASP file is straightforward:
import io
import urllib.request
import pandas as pd
URL = ("https://www.esma.europa.eu/sites/default/files/2024-12/"
"CASPS.csv")
with urllib.request.urlopen(URL, timeout=30) as r:
casps = pd.read_csv(io.BytesIO(r.read()), dtype=str,
encoding="utf-8-sig")
pais = casps["ae_homeMemberState"].str.strip()
print(len(casps), casps["ae_lei"].nunique(), pais.nunique())
print(pais.value_counts().head(8))
print(casps["ac_legal_basis"].fillna("(empty)").value_counts())With the version of October 19, 2026, the file has 379 entries from 376 distinct LEIs and 27 home States; the 16 Spanish ones have the CNMV as competent authority. Germany accounts for more than a quarter:
The real file also shows why it has to be cleaned before use: a country code with a trailing space (NL ), a legal
basis that is empty in 180 entries and in the rest appears as Article 60, Article 60 - Notification, Article 63 or Article 63 - CASP authorisation, and a list of services in which the letters of the
regulation (“a. providing custody…”) coexist with texts without a letter. To run the code without a network, the next
cell builds a fictitious extract with the same columns and the same defects:
CSV = """ae_competentAuthority,ae_homeMemberState,ae_lei_name,\
ae_lei,ae_lei_cou_code,ae_commercial_name,ae_address,ae_website,\
ae_website_platform,ac_authorisationNotificationDate,\
ac_authorisationEndDate,ac_serviceCode,ac_serviceCode_cou,\
ac_comments,ac_lastupdate,ac_legal_basis
Fictitious Authority of Malta,MT,Alfa Cripto Europa Ltd,\
5299000ALFA0CRIPTO79,MT,Alfa,"Street 1, Valletta",\
https://alfa.example,https://pro.alfa.example,14/03/2025,,\
a. providing custody and administration of crypto-assets on \
behalf of clients | b. operation of a trading platform for \
crypto-assets | c. exchange of crypto-assets for funds | \
d. exchange of crypto-assets for other crypto-assets,\
AT|DE|ES|FR|IT|NL,,02/04/2025,Article 63 - CASP authorisation
Fictitious Authority of Germany,DE ,Banco Cenit AG,\
529900CENIT0BANCO076,DE,Cenit,"Platz 2, Frankfurt",\
https://cenit.example,,05/06/2025,,\
e. execution of orders for crypto-assets on behalf of clients|\
g. reception and transmission of orders for crypto-assets on \
behalf of clients,DE|AT,,05/06/2025,Article 60
Fictitious Authority of Spain,ES,Dedalo Digital SL,\
5299000DEDALO0SL0062,ES,Dedalo,"Calle 3, Madrid",\
https://dedalo.example,,30/06/2026,15/09/2026,\
exchange of crypto-assets for funds | providing transfer services \
for crypto-assets on behalf of clients,ES,withdrawn,15/09/2026,
"""
reg = pd.read_csv(io.StringIO(CSV), dtype=str, encoding="utf-8-sig")
print(reg.shape)
reg[["ae_homeMemberState", "ae_commercial_name",
"ac_authorisationNotificationDate", "ac_authorisationEndDate"]](3, 16)
ae_homeMemberState ae_commercial_name ac_authorisationNotificationDate ac_authorisationEndDate
0 MT Alfa 14/03/2025 NaN
1 DE Cenit 05/06/2025 NaN
2 ES Dedalo 30/06/2026 15/09/2026The dates come as dd/mm/yyyy text and the withdrawal date (ac_authorisationEndDate) is only present for entities
that have lost their authorization. The cleaning trims the country codes, converts the services to letters (by the
letter if there is one and, if not, by the text), splits the passport States on the vertical bar, converts the dates
and extracts the legal basis (60 or 63):
import re
TEXTOS = {
"a": "custody", "b": "trading platform",
"c": "for funds", "d": "for other crypto",
"e": "execution of orders", "f": "placing",
"g": "reception and transmission", "h": "advice",
"i": "portfolio management", "j": "transfer services"}
def codigos(texto):
salida = set()
for parte in re.split(r"\s*\|\s*", texto or ""):
m = re.match(r"\(?([a-j])[.)]\s", parte.strip())
if m:
salida.add(m.group(1))
continue
for k, clave in TEXTOS.items():
if clave in parte.lower():
salida.add(k)
return "".join(sorted(salida))
def limpiar(r):
r = r.copy()
r["pais"] = r["ae_homeMemberState"].str.strip()
r["servicios"] = r["ac_serviceCode"].map(codigos)
r["pasaporte"] = r["ac_serviceCode_cou"].fillna("").str.split("|")
for c in ["ac_authorisationNotificationDate",
"ac_authorisationEndDate"]:
r[c] = pd.to_datetime(r[c], format="%d/%m/%Y")
r["via"] = r["ac_legal_basis"].fillna("").str.extract(
r"(60|63)", expand=False)
return r
limpio = limpiar(reg)
limpio[["pais", "ae_commercial_name", "servicios", "via",
"ac_authorisationEndDate"]] pais ae_commercial_name servicios via ac_authorisationEndDate
0 MT Alfa abcd 63 NaT
1 DE Cenit eg 60 NaT
2 ES Dedalo cj NaN 2026-09-15Alfa (Malta) is authorized under Article 63 for custody, platform and both exchanges; Cenit is a bank that notified under Article 60 for execution and transmission of orders; Dedalo had exchange and transfers, and its authorization was withdrawn on September 15, 2026. Each entity carries its LEI (Legal Entity Identifier, ISO 17442), a 20-character code whose last two digits are check digits: with the ISO 7064 standard (MOD 97-10), the number formed by its characters (letters as 10 to 35) must leave a remainder of 1 when divided by 97:
def lei_valido(lei):
"""ISO 17442: 20 characters and MOD 97-10 (ISO 7064) equal to 1."""
if not re.fullmatch(r"[0-9A-Z]{18}[0-9]{2}", lei or ""):
return False
return int("".join(str(int(c, 36)) for c in lei)) % 97 == 1
def con_control(base18):
n = int("".join(str(int(c, 36)) for c in base18 + "00"))
return base18 + f"{98 - n % 97:02d}"
print(con_control("5299000ALFA0CRIPTO"),
lei_valido("5299000ALFA0CRIPTO79"))
print({n: lei_valido(x) for n, x in
zip(limpio["ae_commercial_name"], limpio["ae_lei"])})
print("one digit changed:", lei_valido("5299000ALFA0CRIPTO78"))5299000ALFA0CRIPTO79 True
{'Alfa': True, 'Cenit': True, 'Dedalo': False}
one digit changed: FalseDedalo's LEI has a typo and fails the check; the algorithm also validates the real LEIs in the register. When joining registers (ESMA, the CNMV, a data vendor), the LEI is the reliable key; the commercial name is not.
Checking a provider before trading
The CNMV recommends verifying in the ESMA and CNMV registers that the provider is authorized, checking which legal entity provides the service (MiCA protections only cover the entity authorized in the EU, not other group companies even if they use the same brand) and consulting its list of unauthorized entities4. Turned into a list of checks on the cleaned extract, with a fictitious list of non-compliant entities:
NCASP = pd.DataFrame({"ae_commercial_name": ["Icaro Trade"],
"ae_website": ["https://icaro.example"]})
def comprobar(nombre, necesito, pais="ES", dia=hoy):
fila = limpio[limpio["ae_commercial_name"] == nombre]
r = {"in the CASP register": not fila.empty,
"not listed as non-compliant":
nombre not in set(NCASP["ae_commercial_name"])}
if fila.empty:
return r
f = fila.iloc[0]
fin = f["ac_authorisationEndDate"]
r["authorization in force"] = pd.isna(fin) or fin > dia
r["services " + necesito] = set(necesito) <= set(f["servicios"])
r[f"operates in {pais}"] = (f["pais"] == pais
or pais in f["pasaporte"])
r["valid LEI"] = lei_valido(f["ae_lei"])
return r
for nombre, necesito in [("Alfa", "cd"), ("Cenit", "cd"),
("Dedalo", "c"), ("Icaro Trade", "c")]:
res = comprobar(nombre, necesito)
fallos = [k for k, ok in res.items() if not ok]
print(f"{nombre:<11} {'OK' if not fallos else 'NO'} {fallos}")Alfa OK []
Cenit NO ['services cd', 'operates in ES']
Dedalo NO ['authorization in force', 'valid LEI']
Icaro Trade NO ['in the CASP register', 'not listed as non-compliant']Alfa passes all of them for exchanging for funds and for other crypto-assets in Spain (it is authorized in Malta and has Spain in its passport). Cenit is registered, but not for those services nor with a passport to Spain. Dedalo is no longer authorized and, in addition, its LEI does not add up, a sign that the register being used has typos. Icaro Trade is not in the register and is on the list of non-compliant entities. The check is not a substitute for reading the contract and consulting the CNMV register, but it does avoid the most frequent mistake: trading with a well-known brand through a company that is not the authorized one.
What changes for a systematic trader
- Custody. A CASP that holds clients' crypto-assets must protect their ownership, especially against its own insolvency, and cannot use them on its own account (Art. 70(1)); client funds other than EMTs are placed with a credit institution or a central bank by the end of the following business day, in segregated accounts (Art. 70(3)). The custodian is liable for the loss of crypto-assets due to an incident attributable to it, up to their market value (Art. 75(8)). This is what was missing in the dedalo case of lesson 3.7.2.
- Market abuse. Title VI (Arts. 86 to 92) prohibits market manipulation and insider dealing in crypto-assets admitted to trading, on and off trading platforms and from inside or outside the Union. A strategy that gives false signals about supply or demand (Art. 91(2)(a)) is manipulation in crypto too: be careful with orders you do not intend to execute and with trades against yourself.
- Derivatives. Perpetuals, futures and options are MiFID II instruments (ESMA guideline 5). Whoever offers them to EU clients needs the corresponding MiFID II authorization, the CASP one is not enough, and for a retail client the MiFID II product and leverage rules apply.
- Supervision in Spain. The CNMV is the competent authority for supervising compliance with MiCA, and the Banco de España (the Spanish central bank) carries out the supervision of EMT and ART issuers4.
- Taxation. It is not a MiCA matter; lesson 7.4.6 covers taxation and the information that providers send to the Spanish tax agency (Hacienda).
Exercises
- With the table of transitional periods, compute which States were still in the transitional regime on January 1, 2026 and how many days each group had left.
Solution
dia = pd.Timestamp("2026-01-01")
vivos = tr[tr["fin"] > dia].copy()
vivos["dias_restantes"] = (vivos["fin"] - dia).dt.days
print(len(vivos), "States")
print(vivos.groupby("meses")["dias_restantes"].first().to_dict())
print(sorted(set(tr.index) - set(vivos.index)))17 States
{18: 181}
['AT', 'DE', 'FI', 'HU', 'IE', 'LT', 'LV', 'NL', 'NO', 'PL', 'SE', 'SI', 'SK']On January 1, 2026 only the 17 States with 18 months were still in the transitional regime, with 181 days ahead until July 1. Those with 6, 9 and 12 months had already ended: those with 12, on December 30, 2025, two days earlier. For a system that traded on several European exchanges, this means that during the first half of 2026 the same provider could already be required to hold an authorization in one country and not in another.
- Add to the extract a fictitious entity “Faro Custodia” authorized in France for custody and transfers (letters
a and j) with a passport to Spain, Italy and Portugal, with a valid LEI generated by you, and check it for custody
(
a) and for exchange for funds (c).
Solution
faro = pd.DataFrame([{
"ae_competentAuthority": "Fictitious Authority of France",
"ae_homeMemberState": "FR",
"ae_lei_name": "Faro Custodia SAS",
"ae_lei": con_control("969500FARO00CUSTOD"),
"ae_commercial_name": "Faro",
"ac_authorisationNotificationDate": "01/07/2026",
"ac_serviceCode": "a. providing custody and administration of "
"crypto-assets on behalf of clients | "
"j. providing transfer services for "
"crypto-assets on behalf of clients",
"ac_serviceCode_cou": "ES|IT|PT",
"ac_legal_basis": "Article 63 - CASP authorisation"}])
limpio = limpiar(pd.concat([reg, faro], ignore_index=True))
print(limpio.loc[limpio["ae_commercial_name"] == "Faro",
["ae_lei", "servicios", "pasaporte"]].to_string())
for necesito in ["a", "c"]:
res = comprobar("Faro", necesito)
print(necesito, [k for k, ok in res.items() if not ok]) ae_lei servicios pasaporte
3 969500FARO00CUSTOD66 aj [ES, IT, PT]
a []
c ['services c']The generated LEI passes the check and the cleaning turns the two services into aj. For custody in Spain, Faro passes
all the checks; for exchange for funds it fails the services check: with that authorization it can hold in custody and
transfer, but not buy or sell crypto-assets to its clients. The register says which services each entity can provide,
not just whether it is authorized.
- A system wants to trade XBQ perpetuals from Spain on an exchange authorized as a CASP in another EU State. List what you would check and why the CASP authorization is not enough.
Solution
First, that the entity you contract with is the authorized one (LEI and legal name in the contract, not the brand) and that it appears in the ESMA register with no withdrawal date, with Spain in its passport and outside the list of non-compliant entities and the CNMV's list. Then, that the authorized services cover what is going to be done with the spot market and custody (letters a, c, d or e, depending on the case). But the perpetual is not a MiCA crypto-asset: according to ESMA guideline 5 it is a MiFID II derivative, so the entity also needs a MiFID II authorization to offer it to EU clients (and, if the client is retail, the MiFID II product and leverage rules). If it only has the CASP one, offering perpetuals to Spanish clients falls outside what that authorization allows. Finally, counterparty risk does not go away: MiCA requires segregation and custody, but there is no investor guarantee fund, and lesson 3.7.2 shows what is lost when an exchange suspends withdrawals.
Footnotes
-
Regulation (EU) 2023/1114 of the European Parliament and of the Council of May 31, 2023 (OJ L 150 of 9.6.2023), Articles 2, 3, 59 to 63, 65, 67, 70, 75, 86 to 92, 109, 110, 143 and 149, and Annex IV, English version on EUR-Lex, accessed on October 22, 2026. ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
ESMA, “Final Report. Guidelines on the conditions and criteria for the qualification of crypto-assets as financial instruments”, ESMA75453128700-1323, December 17, 2024, guideline 5, paragraph 47, esma.europa.eu. ↩
-
ESMA, “List of grandfathering periods decided by Member States under Article 143 of Regulation (EU) 2023/1114” (PDF of May 19, 2026), esma.europa.eu, accessed on October 22, 2026. ↩
-
CNMV, “MiCA: Nueva regulación de criptoactivos” (“MiCA: new crypto-asset regulation”, in Spanish), cnmv.es, accessed on October 22, 2026. ↩ ↩2 ↩3 ↩4
-
ESMA, MiCA page, section “Interim MiCA Register” (five CSV files, last updated on October 19, 2026, and description of the fields), esma.europa.eu, accessed on October 22, 2026. ↩
Each answer is folded under its question
Self-assessment
An exchange that was already operating in Spain under national law before December 30, 2024 has no MiCA authorization on July 15, 2026. Can it keep providing services to clients in Spain?
- AYes, while its application is being processed
- BNo: the transitional regime ends on July 1, 2026 at the latest, and the CNMV says that from that date only authorized providers can operate
- CYes, if it is headquartered outside the EU
- DYes, until December 31, 2027
Show answer
Answer B. No: the transitional regime ends on July 1, 2026 at the latest, and the CNMV says that from that date only authorized providers can operate
Article 143(3) allows it to continue until July 1, 2026 or until authorization is granted or refused, whichever is sooner. Spain chose the maximum period of 18 months. December 31, 2027 is something else: the deadline for white papers of crypto-assets already traded (Art. 143(2)(b)).
Which regime applies to a perpetual future on bitcoin offered to EU clients?
- AMiFID II: the ESMA guidelines ask for perpetuals to be treated as derivative contracts, and MiCA does not apply to crypto-assets that are financial instruments
- BMiCA, because the underlying is a crypto-asset
- CNone
- DThe e-money token regime
Show answer
Answer A. MiFID II: the ESMA guidelines ask for perpetuals to be treated as derivative contracts, and MiCA does not apply to crypto-assets that are financial instruments
Article 2(4) excludes financial instruments from MiCA, and ESMA guideline 5 (December 17, 2024) says perpetuals should be treated as derivatives and assessed against Annex I, Section C, points (4) to (10), of MiFID II. A CASP authorization does not, on its own, cover offering derivatives.
A provider offers custody, exchange for funds and operates a trading platform. Its fixed overheads for the previous year were EUR 400,000. What minimum capital does MiCA require of it?
- AEUR 50,000
- BEUR 125,000
- CEUR 150,000 (class 3), because it is greater than a quarter of its fixed overheads (100,000)
- DEUR 400,000
Show answer
Answer C. EUR 150,000 (class 3), because it is greater than a quarter of its fixed overheads (100,000)
Operating a trading platform puts it in class 3 of Annex IV (EUR 150,000), and Article 67 requires the greater of that minimum and one quarter of the fixed overheads: max(150,000, 100,000) = 150,000.
In the ESMA interim register, a provider is listed with
ac_authorisationEndDate= 15/09/2026. What does it mean?- AThat its authorization starts on that day
- BThat it is the last update of the register
- CThat it has to renew it on that day
- DThat it is the date the authorization was withdrawn: from then on it can no longer provide the services
Show answer
Answer D. That it is the date the authorization was withdrawn: from then on it can no longer provide the services
According to the field description published by ESMA,
ac_authorisationEndDateis the date of withdrawal of the authorization, if any. The authorization date isac_authorisationNotificationDateand the update date,ac_lastupdate.What does MiCA protect when a client trades with a brand that has several companies around the world?
- AAll the companies in the group
- BOnly the legal entity authorized in the EU; that is why you have to check in the contract which company provides the service
- CNone
- DThe companies with the most volume
Show answer
Answer B. Only the legal entity authorized in the EU; that is why you have to check in the contract which company provides the service
The CNMV warns about it explicitly: MiCA protections only apply to the legal entity authorized in the EU, not to other group companies or to entities outside the EU, even if they use the same brand. In addition, there is no investor compensation scheme if the provider goes bust.
Key points
- MiCA (Regulation (EU) 2023/1114) regulates the issuance and offering of crypto-assets (white papers, ARTs and EMTs) and their service providers (CASPs); it leaves out financial instruments, deposits and unique, non-fungible crypto-assets.
- Dates: entry into force on June 29, 2023, Titles III and IV from June 30, 2024, full application from December 30, 2024 and a CASP transitional regime until July 1, 2026 at most (Spain chose the maximum, 18 months).
- There are ten crypto-asset services (points (a) to (j) of Art. 3(1)(16)) and three minimum capital classes: EUR 50,000, 125,000 and 150,000, or a quarter of fixed overheads if greater.
- Providing services requires authorization as a CASP (Art. 63) or, for banks, investment firms and other already supervised entities, a notification (Art. 60); the authorization is valid throughout the EU with the passport of Art. 65.
- The ESMA interim register is five CSV files; reading it requires cleaning country codes, services in mixed formats and dd/mm/yyyy dates, and checking the withdrawal date, the passport and the list of non-compliant entities.
- Perpetuals and other crypto-asset derivatives are MiFID II instruments according to ESMA; Title VI of MiCA prohibits market manipulation and insider dealing also on and off trading platforms.
Resources
Documentation
- EUR-Lex: Regulation (EU) 2023/1114 on markets in crypto-assets (English text)
- ESMA: Markets in Crypto-Assets Regulation (interim register, transitional periods and guidelines)
- ESMA: list of transitional periods decided by Member States (Art. 143(3))
- ESMA: guidelines on the qualification of crypto-assets as financial instruments (December 17, 2024)
- CNMV (Spanish securities regulator): MiCA, new crypto-asset regulation (in Spanish)