
La presión fiscal sobre las criptomonedas se intensifica en ambos lados del Atlántico. Gobiernos buscan su tajada del pastel digital, mientras los inversores buscan resquicios.
El nuevo panorama regulatorio
Latinoamérica y España avanzan con propuestas que pretenden gravar las ganancias de capital en activos digitales. Los ministerios de hacienda, siempre un paso atrás de la innovación, intentan meter en caja a un ecosistema diseñado para la descentralización. Es el clásico juego del gato y el ratón, pero con blockchain.
El impacto en la adopción
La narrativa es familiar: la regulación llega cuando el mercado ya es demasiado grande para ignorarlo. Los impuestos son la forma más clara en que un Estado reconoce un activo como legítimo, aunque lo haga con la mano extendida. Para el hodler promedio, es una molestia burocrática más. Para los grandes jugadores, un coste de hacer negocios en la economía digital.
La ironía financiera
Los mismos gobiernos que dudaron durante años ahora quieren su parte de las ganancias—una jugada tan predecible como un pump and dump en un shitcoin. La verdadera pregunta no es si gravarán, sino cómo lo harán sin ahogar la gallina de los huevos de oro. La innovación financiera siempre corre más rápido que la legislación, y esta vez no será diferente. Prepárense para declarar, pero no dejen de acumular.
España: las criptomonedas ya son “una casilla más” para Hacienda
En España el cambio ya es una realidad.
Desde hace un par de campañas, la declaración de la renta incluye un apartado específico para monedas virtuales, y la Agencia Tributaria recuerda cada año que las criptos se tratan, a efectos fiscales, igual que las acciones:que van a la base del ahorro del IRPF.
Eso significa que, cuando se vende o intercambia criptomonedas, se tributa según unos tramos progresivos.
Para la renta 2024/2025, las ganancias se gravan entre el 19 % y el 28 %, en función del importe total obtenido durante el año.
Si se pierde dinero, esas minusvalías pueden compensar otras ganancias de la cartera dentro de los límites que marca la ley.
Además de las, hay otros supuestos que Hacienda mira con lupa:
- Recompensas de staking o lending: se consideran rendimientos del capital mobiliario (intereses) y también van a la base del ahorro.
- Airdrops o recompensas promocionales: en general se tratan como ganancias patrimoniales o incluso como rendimientos de trabajo/actividad si forman parte de una colaboración.
- Minería organizada con medios materiales: se considera actividad económica, con sus obligaciones de alta y cotización.
Si solo se “holdea” y no se vende, en principio no hay que declarar ganancias en la renta, porque no se ha producido ninguna transmisión.
Otra cosa es que, por volumen en las criptomonedas más rentables, se entre en el radar de otros impuestos.
Modelos, patrimonios y criptos en el extranjero
La pregunta que muchos se hacen es menos técnica y más directa: “”.
La respuesta corta, y es que cada vez tiene más información. Los exchanges que operan en España ya están obligados a reportar datos, y la normativa europea sobre intercambio automático de información va en la misma dirección.
Si se mantiene más de 50.000 euros en cripto en plataformas extranjeras, entra en juego el Modelo 721, que obliga a informar de esos saldos, de forma similar a lo que ya pasaba con las cuentas y valores fuera de España.
En patrimonios elevados, además, las criptomonedas de todo tipo, incluidas las mejores memecoins computan en el Impuesto sobre el Patrimonio y deben declararse igual que un fondo o una cartera de acciones.
Entonces, ¿por dónde se empieza?
A efectos prácticos, el punto de partida es: compras, ventas, permutas entre criptos, comisiones, ingresos por staking, etc.
Con esos datos, se calcula la ganancia o pérdida aplicando el criterio FIFO (primero en entrar, primero en salir), igual que con las acciones.
A partir de ahí, lo razonable es:
Volcar las ganancias y pérdidas en las casillas de criptomonedas de la renta, dentro de la base del ahorro.
Revisar si tienes saldos significativos en exchanges fuera de España para valorar si te afecta el Modelo 721.
Consultar con un asesor fiscal si haces minería, tienes una actividad cripto recurrente o manejas importes altos; ahí la casuística se complica rápido.
No es el plan de fin de semana más divertido, pero dedicar unas horas a entender cómo declarar criptomonedas puede ahorrar un buen susto con Hacienda dentro de unos meses.
Esta información es general y no sustituye el consejo de un profesional, pero al menos sirve como mapa para no ir totalmente a ciegas.
Leer más:
- NASDAQ y Bitcoin: la pareja que casi siempre sube y baja a la vez
- ChatGPT predice que pasará con Bitcoin en 2026
- Halving de Bitcoin: qué ha pasado siempre 12–24 meses después y qué podría cambiar esta vez
Table of Contents
En este artículo
España: las criptomonedas ya son “una casilla más” para Hacienda
Modelos, patrimonios y criptos en el extranjero
Entonces, ¿por dónde se empieza?
Leer más:
En este artículo
España: las criptomonedas ya son “una casilla más” para Hacienda
Modelos, patrimonios y criptos en el extranjero
Entonces, ¿por dónde se empieza?
Leer más:
window.addEventListener("DOMContentLoaded", () => {
const header = document.querySelector(".header_wrapper");
const pageLegend = document.querySelector('#multiCollapse1');
const pageLegendList = document.querySelector('#multiCollapse2');
const pageLegendCollapse = new bootstrap.Collapse(pageLegend, {toggle: document.querySelector(".toc-sticky").classList.contains('sticky')});
/**
* Changing current title
*/
(function (pageLegend) {
const titleNodes = pageLegend.querySelectorAll('.StepProgress-item__link');
if (!titleNodes.length) return;
const titles = [...titleNodes].map((itm, i) => ({
id: itm.getAttribute('data-id'),
text: itm.textContent,
level: itm.getAttribute('data-level'),
linkNode: itm,
titleNode: document.getElementById(itm.getAttribute('data-id')),
index: i,
}));
/**
* Source: https://www.sitepoint.com/throttle-scroll-events/
* @param {Function} fn
* @param {number} wait
* @returns {(function(): void)|*}
*/
const throttle = (fn, wait) => {
let time = Date.now();
return function () {
if ((time + wait - Date.now()) {
const documentScrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
let current = 0;
// Title
titles.forEach((itm, i) => {
//console.log(itm)
const itmOffsetTop = itm.titleNode ? itm.titleNode.offsetTop - 100 : 0;
if (documentScrollTop >= itmOffsetTop) {
document.getElementById('toc-current-title').innerHTML = itm.text;
document.getElementById('toc-current-title').setAttribute('data-current-id', itm.id);
document.getElementById('toc-current-title').setAttribute('data-current-level', itm.level);
current = i;
}
})
// close all list and open sub list if needed
if (document.querySelector(".toc-sticky").classList.contains('sticky')) {
document.querySelectorAll('.subList-in-progress').forEach((el) => {
el.children[1].classList.remove('show');
el.getElementsByClassName('icon-chevron-down')[0].classList.remove('up');
});
const currentEl = titles[current];
currentEl.linkNode.classList.add('show');
}
titles.forEach((itm, i) => {
itm.linkNode.parentNode.parentNode.classList.remove('current', 'is-done');
if (current > i) {
itm.linkNode.parentNode.parentNode.classList.add('is-done')
};
if (current === i) {
itm.linkNode.parentNode.parentNode.classList.add('current');
};
})
}
changeCurrentTitle();
document.addEventListener('scroll', throttle(changeCurrentTitle, 50));
})(pageLegend);
/**
* Collapse
*/
(function (pageLegend, header) {
const icon = pageLegend.parentNode.querySelector(".collapse-action-btn i");
const collapseToggle = (status) => (e) => {
if (!e.target.isEqualNode(pageLegend)) return;
icon.classList.toggle("up");
const containerHeight = pageLegend.getBoundingClientRect().height;
const showSubtitleContent = () => {
const currentId = document.getElementById('toc-current-title').getAttribute('data-current-id');
const currentLevel = document.getElementById('toc-current-title').getAttribute('data-current-level');
const currentSubTitle = currentLevel == 3 ? document.querySelector(`a[data-id="${currentId}"]`).parentNode.parentNode.parentNode : false;
if (!currentSubTitle) return;
new bootstrap.Collapse(currentSubTitle, {toggle: false}).show();
}
showSubtitleContent();
console.log(status + 'fdsfsd' + containerHeight);
if (status === 'shown' && document.querySelector(".toc-sticky").classList.contains('sticky')) {
document.querySelector('html').classList.remove('overflow-hidden');
pageLegend.classList.add('overflow-auto');
pageLegend.style.height = `calc(100vh - ${header.getBoundingClientRect().height + document.querySelector('.toc-sticky__open').getBoundingClientRect().height + 16}px)`;
} else if (status === 'hide') {
document.querySelector('html').removeClass('overflow-hidden');
pageLegend.classList.remove('overflow-auto');
pageLegend.style.height = 'auto';
}
}
pageLegend.addEventListener('shown.bs.collapse', collapseToggle('shown'));
pageLegend.addEventListener('hide.bs.collapse', collapseToggle('hide'));
})(pageLegend, header);
/**
* Collapse sub-titles
*/
(function (pageLegend) {
const collapseEls = pageLegend.querySelectorAll('.collapse');
collapseEls.forEach(function (el) {
const toggleArrowDirection = function (e) {
if (!e.target.isEqualNode(el)) return;
const id = this.getAttribute('id');
document.querySelector(`.collapse-action-btn[data-bs-target="#${id}"] .icon-chevron-down`).classList.toggle('up');
}
el.addEventListener('shown.bs.collapse', toggleArrowDirection);
el.addEventListener('hide.bs.collapse', toggleArrowDirection);
})
})(pageLegend);
/**
* Collapse main title
*/
(function (pageLegendList) {
const icon = pageLegendList.parentNode.querySelector(".collapse-action-btn i");
const collapseToggle = () => (e) => {
if (!e.target.isEqualNode(pageLegendList)) return;
icon.classList.toggle("up");
}
pageLegendList.addEventListener('shown.bs.collapse', collapseToggle());
pageLegendList.addEventListener('hide.bs.collapse', collapseToggle());
})(pageLegendList);
(function (pageLegendList) {
const collapseEls = pageLegendList.querySelectorAll('.collapse');
collapseEls.forEach(function (el) {
const toggleArrowDirection = function (e) {
if (!e.target.isEqualNode(el)) return;
const id = this.getAttribute('id');
document.querySelector(`.toc-sticky-list .collapse-action-btn[data-bs-target="#${id}"] .icon-chevron-down`).classList.toggle('up');
}
el.addEventListener('shown.bs.collapse', toggleArrowDirection);
el.addEventListener('hide.bs.collapse', toggleArrowDirection);
})
})(pageLegendList);
/**
* Sticky functionality
* Source: https://stackoverflow.com/questions/17893771/javascript-sticky-div-after-scroll
*/
(function (header, pageLegendCollapse) {
// set everything outside the onscroll event (less work per scroll)
const target = document.querySelector(".toc-sticky");
const targetListStatic = document.querySelector(".toc-sticky-list");
if (!target || !header) return;
const headerHeight = header.getBoundingClientRect().height;
const targetHeight = targetListStatic.getBoundingClientRect().height;
// -headerHeight so it won't be jumpy
const stop = targetListStatic.offsetTop + headerHeight + targetHeight;
const docBody =
document.documentElement || document.body.parentNode || document.body;
const hasOffset = window.pageYOffset !== undefined;
const applySticky = function () {
// cross-browser compatible scrollTop.
const scrollTop = hasOffset ? window.pageYOffset : docBody.scrollTop;
// if user scrolls to headerHeight from the top of the target div
if (scrollTop >= stop) {
pageLegendCollapse.hide();
// stick the div
target.classList.add("sticky");
//target.style.marginTop = `${headerHeight}px`;
} else {
pageLegendCollapse.show();
// release the div
target.classList.remove("sticky");
target.style.marginTop = "";
}
}
applySticky();
window.addEventListener('scroll', applySticky);
})(header, pageLegendCollapse);
jQuery('span.show_moretoc').click(function () {
jQuery('span.show_moretoc').hide();
jQuery('.ms_hidetoc').show();
});
});