Este algoritmo é uma ferramenta de cálculo baseada numa interpretação lógica do CIRS e nas orientações dos informativos fiscais vigentes. No entanto, existem nuances legais críticas que exigem intervenção manual do utilizador:
-
Security tokens (valores mobiliários): O algoritmo assume por defeito que os ativos NÃO são valores mobiliários. Se o criptoativo representar uma participação financeira, dívida ou direito a dividendos (ex: tokens de equity, bonds tokenizados), a isenção de 365 dias NÃO se aplica. Estes ativos são sempre tributados (Categoria G), independentemente do tempo de detenção. O utilizador deve assinalar manualmente estes ativos como
isSecurityToken: true. -
Staking e rendimentos em cripto: De acordo com o entendimento do regime fiscal português, os rendimentos gerados e pagos diretamente em criptoativos (como recompensas de staking, lending, airdrops ou yield farming) beneficiam de um regime de suspensão de tributação.
- Quando se aplica? Aplica-se no exato momento em que recebe os tokens na carteira. Como recebeu ativos digitais e não moeda fiduciária (Euros), a AT "congela" a exigência do imposto. Não há qualquer tributação imediata ou obrigação de declarar.
- Como o algoritmo trata isto? Para refletir esta suspensão, o algoritmo regista estas entradas com um
custo de aquisição = 0,00€(custo zero), iniciando aí a contagem do prazo de detenção de 365 dias. - Quando termina a suspensão? A suspensão cessa no momento em que realiza uma alienação onerosa para moeda fiat (venda por Euros, Dólares, etc.) ou compra bens/serviços com esses tokens. Nesse instante, gera liquidez real e o imposto é devido na Categoria G (mais-valias) sobre 100% do valor da venda (já que o custo guardado foi zero), a menos que o ativo tenha sido detido por 365 dias ou mais, caso em que fica legalmente excluído de tributação.
-
Exclusão de NFT do Regime de Criptoativos (Mas sujeito a regras gerais): Conforme o CIRS, os NFT (ativos não fungíveis) estão expressamente excluídos da definição jurídica e do regime fiscal específico dos criptoativos.
- O que o algoritmo faz: O algoritmo ignora o cálculo de mais-valias sobre NFT dentro do motor de cripto, o que significa que eles NÃO beneficiam da isenção de 365 dias nem da neutralidade fiscal em permutas.
- Impacto Fiscal Real: A alienação onerosa de NFT pode ser tributável noutras sedes do CIRS. Se transacionados de forma esporádica por particulares, podem enquadrar-se nas regras gerais de mais-valias de bens móveis ou propriedade intelectual; se transacionados de forma recorrente, configuram rendimento comercial (Categoria B). O utilizador deve isolar estas operações para análise jurídica humana autónoma.
-
Matriz de anexos da declaração de IRS: O cálculo da mais-valia baseia-se na regra FIFO, e o destino de exportação do relatório segue estritamente a estrutura e instruções dos formulários oficiais da Autoridade Tributária, cruzando a natureza do ativo, o prazo de detenção e a jurisdição da entidade:
- Curto prazo (< 365 dias) - Tributáveis (taxa autónoma de 28%):
- Se a operação ocorreu através de uma corretora sediada em Portugal (
type: 'Exchange'ecountryCode: 'PT'): Deve ser declarada no Anexo G, Quadro 18A. - Se a operação ocorreu no estrangeiro ou em carteiras privadas (
type: 'Exchange'comcountryCodediferente de 'PT', ou carteiras ondetypeseja 'Cold Wallet' ou 'Hot Wallet'): Deve ser declarada detalhadamente no Anexo J, Quadro 9.4A.
- Se a operação ocorreu através de uma corretora sediada em Portugal (
- Longo prazo (>= 365 dias) - Não sujeitas a tributação:
- Desde que operados em jurisdições cooperantes, os ganhos com criptoativos comuns detidos por mais de um ano estão excluídos de tributação. Devem ser declarados na totalidade no Anexo G1, Quadro 7 (mais-valias não sujeitas a tributação).
- Curto prazo (< 365 dias) - Tributáveis (taxa autónoma de 28%):
-
Exclusão de atividade profissional (Categoria B / IRC): Este algoritmo abrange única e exclusivamente a gestão de património privado (Categoria G - mais-valias de particulares). Se o utilizador exercer uma atividade comercial ou profissional de compra e venda de criptoativos, mineração em escala industrial, ou se as transações forem efetuadas em nome de uma pessoa coletiva (empresa), os rendimentos enquadram-se na Categoria B (regime simplificado ou contabilidade organizada) ou em sede de IRC. Nestes cenários, aplicam-se regras de determinação de lucro e taxas de tributação totalmente distintas, estando fora do âmbito deste algoritmo.
- Documento técnico: Um algoritmo aberto para a fiscalidade de criptoativos em Portugal
⚠️ Aviso legal e limitações (leitura obrigatória)- Índice
- 1. Objetivo do projeto
- 2. Arquitetura do algoritmo (v1.5.4)
- 3. Tratamento por tipo de transação
- 3.1.
deposit - 3.2.
withdrawal- Caso seja alienação para algo não-cripto (
fiatValue > 0): - Caso seja transferência (
tag = 'transfer'efiatValue=null): - ➤ Caso 1: venda para FIAT (
fiatValue > 0,tag: 'sell') em jurisdição cooperante - ➤ Caso 2: venda para FIAT numa jurisdição não cooperante (paraíso fiscal)
- ➤ Caso 3: venda para FIAT com taxa em cripto
- ➤ Caso 4: transferência entre entidades com taxa (
tag: 'transfer',fiatValue = null)
- Caso seja alienação para algo não-cripto (
- 3.3.
trade(permuta cripto-cripto)
- 3.1.
- 4. Tratamento das taxas
- 5. Tratamento fiscal de NFT
- 6. Tratamento fiscal de DeFi
- 7. Sumário final
- 8. Matriz de exportação de relatórios (IRS)
- 9. Fluxograma das transações
- 🤝 Como Contribuir
- 📄 Licença
Este repositório contém uma especificação técnica aberta e um algoritmo para o cálculo fiscal de mais-valias de criptoativos em Portugal, de acordo com o CIRS.
O objetivo é criar e manter uma "fonte da verdade" lógica e transparente que possa ser:
- Validada por especialistas em fiscalidade e contabilidade.
- Discutida e melhorada pela comunidade.
- Implementada por qualquer desenvolvedor ou aplicação que precise de calcular mais-valias de criptoativos em Portugal.
Este é um projeto de lógica e especificação, não de código. A sua contribuição, seja através de uma issue para apontar uma falha na interpretação da lei ou de um pull request para melhorar este documento, é extremamente bem-vinda.
Este documento descreve um algoritmo fiscal, desenhado para estar em conformidade com o CIRS português, nomeadamente os Artigos 10.º e 43.º. A abordagem segue uma interpretação conservadora, rigorosa e lógica da lei.
O motor opera sobre os seguintes princípios fundamentais:
-
FIFO por entidade depositária (Art. 43.º, n.º 9): O método
FIFO (First-In, First-Out)é aplicado individualmente a cada "entidade depositária" (ex.: exchanges). Todas as carteiras self-custody (frias, quentes, etc.) são tratadas como uma única entidade depositária para efeitos de cálculo, a menos que o utilizador opte por separá-las. -
Transferência entre entidades é um evento neutro: Transferir ativos entre entidades do mesmo titular é uma mera mudança de local de custódia. Não é um evento tributável. O lote transferido mantém custo e data de aquisição originais.
-
Elegibilidade territorial e cláusula anti-abuso (Art. 10.º, n.º 21): Os benefícios de neutralidade fiscal nas permutas e a isenção de mais-valias após 365 dias aplicam-se apenas se a entidade onde se realiza a operação ou a contraparte estiver sediada num país cooperante (Estados-Membros da UE, EEE ou países com convenção de dupla tributação ou acordo de troca de informações com Portugal). Se a jurisdição for considerada não cooperante (paraíso fiscal), todos os benefícios fiscais deixam de se aplicar.
-
Neutralidade fiscal condicionada para permutas cripto-cripto (Art. 10.º, n.º 20): Numa permuta cripto-cripto (ex.: BTC → ETH) realizada numa entidade de jurisdição cooperante, a operação é uma alienação onerosa mas não gera tributação no momento da troca. O novo ativo é considerado uma nova aquisição, com valor de aquisição igual ao valor de aquisição do ativo entregue, e nova data da permuta. Este valor e nova data servirão como base para o cálculo de futuras mais-valias. A contagem dos 365 dias reinicia para o novo ativo recebido. Se ocorrer numa entidade não cooperante, a neutralidade fiscal é revogada e a mais-valia é apurada em euros imediatamente.
-
Rendimentos em cripto (staking/airdrop/rewards/interest): São tratados sob o regime de suspensão de tributação. O custo de aquisição é Zero.
- Fiscalidade: Não são tributados no momento da receção. A tributação ocorre apenas no momento da alienação onerosa (venda para Euros), sendo enquadrada na Categoria G (mais-valias).
- Custo para mais-valias: O
cost basisé 0,00€, garantindo que o valor total da venda futura seja tributável ou isento de acordo com a regra dos 365 dias.
-
Distinção security tokens vs. criptoativos comuns:
- Criptoativos comuns (valores não mobiliários ex: BTC, ETH): Isentos de imposto se detidos por >= 365 dias em jurisdições cooperantes.
- Security tokens (valores mobiliários): Nunca isentos. Sempre tributados à taxa de 28% (ou englobamento), independentemente do tempo de detenção.
O sistema utiliza uma estrutura de pilhas FIFO por entidade: um Map<Entity, Map<Asset, List<Lot>>>, onde a lista de lotes de cada ativo é dinamicamente ordenada pela data de aquisição original para garantir a prioridade do FIFO fiscal
Definição de entidade (Wallet)
Cada entidade (carteira ou exchange) deve ser criada com os seguintes atributos:
name: Nome dado pelo utilizador à carteira (ex: "Kraken", "Ledger Nano X").type: O tipo de carteira. Ex: 'Exchange', 'Cold Wallet', 'Hot Wallet', 'Other'.creationDate: Data em que a carteira foi criada.countryCode: Código ISO-3166 alfa-2 do país onde a entidade está sediada (ex: 'PT', 'IE', 'KY').
O algoritmo calcula os seguintes estados implícitos no momento da transação:
fiscalEligibility: Determinado a partir docountryCode. Consulta uma tabela interna para classificar o país como cooperante (COOPERATING), não cooperante (NON_COOPERATING- paraísos fiscais da lista negra nacional) ou desconhecido. O estado desconhecido suspende o cálculo para obrigar à revisão e intervenção manual.- Destino declarativo: Determinado de forma dinâmica no processamento. Se
typefor 'Exchange' ecountryCodefor 'PT', as mais-valias de curto prazo seguem para o Anexo G. Setypefor 'Exchange' ecountryCodefor diferente de 'PT' (ex: 'IE'), seguem para o Anexo J. Para carteiras pessoais ou DeFi (typeigual a 'Cold Wallet' ou 'Hot Wallet'), o algoritmo assume por defeito ocountryCodede residência do sujeito passivo (ex: 'PT') para efeitos defiscalEligibility, mas encaminha sempre o curto prazo para o Anexo J, uma vez que a custódia não pertence a um intermediário financeiro nacional.
Este modelo representa cada fração de criptoativo armazenada na base de dados local, funcionando como uma pilha cronológica para o método FIFO. Cada lote retém a quantidade disponível, o custo unitário histórico de aquisição e a data original em que o ativo entrou no património do utilizador.
Cada Lot deve ter:
acquisitionDate: Data da operação atual (causada por depósito, permuta ou transferência).costPerUnit: Custo unitário em EUR.amount: Quantidade do ativo.originalAcquisitionDate(opcional): Data da compra original (crucial para a regra dos 365 dias).isSecurityToken(boolean): Define se o ativo está sujeito a tributação obrigatória (sem isenção de 365 dias).
Note
O campo originalAcquisitionDate preserva a data de compra original quando um ativo é transferido entre entidades, impedindo o reinício incorreto do contador dos 365 dias.
Para garantir o estrito cumprimento do Art. 43.º, n.º 8, al. g) do CIRS ("os alienados são os adquiridos há mais tempo"), o algoritmo impõe uma distinção clara entre a prioridade de consumo de um lote e a sua disponibilidade física:
-
Chave de ordenação FIFO (Prioridade): antes de processar qualquer venda ou permuta, a lista cronológica de lotes (
List<Lot>) pertencente à entidade e ao ativo em causa deve ser obrigatoriamente ordenada de forma ascendente pela sua data de aquisição original efetiva:$$\text{Data de ordenação} = \text{originalAcquisitionDate} \ ?? \ \text{acquisitionDate}$$ Isto garante que um lote comprado em 2022, mas transferido para a exchange apenas em 2026, mantenha prioridade absoluta de consumo sobre um lote comprado diretamente na exchange em 2025. -
Filtro de disponibilidade temporal: a data de entrada do lote na carteira específica (
acquisitionDate) não determina a sua antiguidade fiscal, mas atua como um filtro de segurança. O algoritmo apenas considera um lote elegível para consumo se:$$\text{acquisitionDate do lote} \le \text{Data de realização da venda}$$ Este filtro impede que o motor de cálculo consuma retroativamente saldos que ainda não tinham sido movidos para aquela entidade no momento cronológico da operação.
Clique para expandir os esquemas e ficheiros de suporte técnico
Para evitar o crescimento excessivo deste documento com propriedades estritas de engenharia de software, os esquemas de propriedades detalhados dos restantes modelos e payloads foram movidos para a documentação técnica de suporte:Especificação completa de (Wallet)
Especificação completa de (Transaction) - Contém todos os campos de importação de dados e o funcionamento além de feeFiatValue.
Um depósito é sempre uma aquisição que cria um novo lote:
- tag: 'buy':
costPerUnit=fiatValue,acquisitionDate= data da transação. - tag: 'staking', 'airdrop', 'interest', 'rewards', 'defi':
costPerUnit= 0,00€ (suspensão de tributação).acquisitionDate= data da transação (início da contagem dos 365 dias).
originalAcquisitionDate=null.
Exemplo:
- Data: 2023-01-15
- Entidade: Kraken (countryCode: 'IE')
- Ativo: BTC
- Quantidade: 1.0
- Valor em FIAT: 30.000€
Resultado:
- Cria novo lote:
acquisitionDate = 2023-01-15costPerUnit = 30.000€amount = 1.0originalAcquisitionDate = nullisSecurityToken = false
Exemplo:
- Data: 2024-03-10
- Entidade: Ledger (type: 'Cold Wallet')
- Ativo: ETH
- Quantidade: 0.05
Cálculo interno do algoritmo:
- Custo de aquisição = 0,00€
Resultado:
- Cria novo lote:
acquisitionDate = 2024-03-10costPerUnit = 0,00€amount = 0.05originalAcquisitionDate = null
- Ação fiscal: Nenhuma declaração imediata no momento da receção. A tributação ocorrerá apenas na venda deste lote por Euros ou outra moeda fiduciária. Se detido por mais de 365 dias em ambiente cooperante, a venda total estará isenta.
Inclui qualquer alienação para algo não-cripto, como:
- FIAT
- NFT
- Compra de bens ou serviços
- Pagamentos com cartões que gastem a sua cripto
➡️ Evento tributável.
Antes de calcular o prazo de detenção, o algoritmo valida o fiscalEligibility da entidade de origem. Aciona o _calculateFifoForSale na entidade correspondente.
Para cada lote consumido: data de aquisição efetiva = originalAcquisitionDate ?? acquisitionDate
Regra de tributação:
- Se
isSecurityToken == true: Sempre tributável (28% ou englobamento). - Se
isSecurityToken == false:- Se
fiscalEligibility == NON_COOPERATING: Sempre tributável (28% ou englobamento) por força do Artigo 10.º, n.º 21 do CIRS, revogando o benefício da isenção por prazo. - Se
fiscalEligibility == COOPERATING:- Dias detidos < 365: Tributável (28% ou englobamento).
- Dias detidos >= 365: Isento.
- Se
➡️ Evento neutro.
- Consome lotes da entidade de origem.
- Cria lotes na entidade de destino.
- Preserva os seguintes dados inalterados:
costPerUnitoriginalAcquisitionDate(caso seja nulo, herda aacquisitionDatedo lote consumido).isSecurityToken
A data da transferência em si (acquisitionDate do novo local) não influencia os 365 dias.
Exemplo:
- Data: 2024-10-01
- Entidade: Kraken (countryCode: 'IE')
- Ativo: BTC
- Quantidade: 0.5
- Valor em FIAT: 30.000€
- Custo do lote consumido (FIFO): 0.5 × 30.000€ = 15.000€
- Data de aquisição efetiva: 2023-01-15
- Dias detidos: 624 dias → Isento (por ser cooperante, detido por >= 365 dias e não-security)
Cálculo:
- Mais-valia = 30.000€ - 15.000€ = 15.000€
- Tributação: Isento (Encaminhado para o Anexo G1, Quadro 7).
Exemplo:
- Data: 2024-10-01
- Entidade: CaymanExchange (countryCode: 'KY', fiscalEligibility: NON_COOPERATING)
- Ativo: BTC
- Quantidade: 0.5
- Valor em FIAT: 30.000€
- Custo do lote consumido (FIFO): 15.000€
- Data de aquisição efetiva: 2023-01-15
- Dias detidos: 624 dias
Cálculo:
- Mais-valia = 30.000€ - 15.000€ = 15.000€
- Tributação: Tributável à taxa autónoma de 28% no Anexo J, Quadro 9.4A. A isenção dos 365 dias é revogada por força do Art. 10.º, n.º 21.
Exemplo:
- Data: 2024-10-01
- Entidade: Kraken (countryCode: 'IE')
- Ativo: BTC
- Quantidade: 0.5
- Valor em FIAT (Bruto): 30.000€ (Custo de aquisição FIFO: 15.000€)
- Custo de aquisição do lote principal (0.5 BTC): 15.000 € (detido há 180 dias)
- Taxa: 0.001 BTC (valor explicito de mercado: 60€)
- Valorização de mercado:
feeFiatValue= 60€ (calculado offline/online com base na cotação no momento da transação). - Dias detidos do lote principal: 180 dias → Tributável
Cálculo:
-
Tratamento do encargo (Art. 51.º, n.º 1, al. b) CIRS): O montante da despesa dedutível é fixado estritamente pelo valor de mercado no momento da transação (
feeFiatValue= 60€). Este valor abate diretamente ao valor de realização bruto da operação principal.- Valor de Realização Líquido = 30.000€ - 60€ = 29.940€
- Mais-valia Líquida da Operação = 29.940€ - 15.000€ = 14.940€
-
Ajuste de inventário da taxa (Art. 10.º): A fração gasta (0.001 BTC) dá baixa do inventário local pelo seu valor de mercado no momento (60€). Sendo valorizada ao preço do momento da transação, a mais-valia intrínseca da taxa é 0,00€, servindo a operação apenas para o ajuste físico de inventário na pilha FIFO.
Resultado da Operação Principal:
- Total mais-valia combinada tributável: 14.940€ (A despesa de 60€ reduziu o lucro de forma uniforme e coerente, eliminando a anomalia anterior de 15.030€).
- Encaminhamento: Reportado no Anexo J, Quadro 9.4A.
Exemplo:
- Data: 2024-06-01
- Entidade de origem: Kraken (countryCode: 'IE')
- Entidade de destino: Ledger (type: 'Cold Wallet')
- Ativo: BTC
- Quantidade enviada: 0.5
- Taxa de rede cobrada: 0.001 BTC (valor de mercado implícito: 60€)
- Custo do lote de taxa consumido (FIFO): 30€
- Data de aquisição original do lote: 2024-01-15 (< 365 dias)
Resultado:
- Ajuste de inventário da taxa (Art. 10.º): a comissão de rede (0.001 BTC) dá baixa física no inventário local pelo seu valor de mercado no momento (
feeFiatValue= 60 €). Sendo valorizada estritamente pelo custo do serviço no instante da operação, a mais-valia comercial intrínseca da comissão é 0.00 €, eliminando obrigações declarativas autónomas ou impostos sobre a taxa. - Criação do novo lote na Ledger:
acquisitionDate = 2024-06-01costPerUnit = 30.000€amount = 0.499(0.500 enviado - 0.001 de taxa)originalAcquisitionDate = 2024-01-15isSecurityToken= (preservado da origem)
➡️ O montante principal (0.499 BTC) é neutro fiscalmente, servindo a baixa da comissão apenas para manter o inventário físico da pilha FIFO sincronizado.
Important
Impacto na ordenação FIFO: embora o novo lote aterre na Ledger com a propriedade acquisitionDate definida para o dia da transferência (essencial para validar que o saldo só está disponível a partir dessa data), este lote não vai para o fim da fila de consumo. O motor de cálculo, ao ordenar a pilha pela originalAcquisitionDate, garante que estes 0.499 BTC mantêm a sua antiguidade real de 15 de janeiro de 2024, retendo a sua prioridade histórica numa futura venda.
O fluxo lógico depende diretamente da elegibilidade da entidade detentora:
- Se
fiscalEligibility == COOPERATING: ➡️ Evento neutro - Art. 10.º, n.º 20- Consome lotes do ativo entregue através da pilha FIFO.
- Cria um novo lote para o ativo recebido.
- O custo do novo lote herda o custo histórico:
costPerUnit= custo total de aquisição dos lotes entregues dividido pelo novoamount. acquisitionDate= data da permuta atual.originalAcquisitionDate=null(O contador de 365 dias reinicia para zero no novo ativo).isSecurityToken= (mapeado de acordo com a natureza do novo ativo recebido).
- Se
fiscalEligibility == NON_COOPERATING: ➡️ Evento tributável - Art. 10.º, n.º 21 A neutralidade fiscal é completamente revogada. Ocorre o apuramento de mais-valias imediato em euros, calculando a diferença entre o valor de mercado atual do ativo entregue e o seu custo de aquisição. O ativo recebido entra na pilha com uma novaacquisitionDatee o seucostPerUnitatualizado ao preço de mercado.
Exemplo:
- Data: 2024-07-01
- Entidade: Kraken (countryCode: 'IE', COOPERATING)
- Ativo entregue: BTC (0.5) - Custo histórico FIFO: 15.000€
- Ativo recebido: ETH (0.3)
Resultado:
- Cria novo lote de ETH na Kraken:
acquisitionDate = 2024-07-01costPerUnit = 15.000€ / 0.3 = 50.000€/ETHamount = 0.3originalAcquisitionDate = null(o relógio de 365 dias faz reset)isSecurityToken = false
➡️ Evento neutro fiscalmente, não gerando qualquer registo ou obrigação declarativa imediata.
Exemplo:
- Data: 2024-07-01
- Entidade: CaymanExchange (countryCode: 'KY', NON_COOPERATING)
- Ativo entregue: BTC (0.5) - Custo histórico FIFO: 15.000€
- Ativo recebido: ETH (0.3)
- Valor de mercado em Euros do BTC entregue no momento da troca: 25.000€
Resultado:
- Revogação de neutralidade: Apuramento imediato de mais-valia comercial.
- Mais-valia = 25.000€ (valor de mercado de realização) - 15.000€ (custo) = 10.000€
- Ação: Tributável à taxa de 28% no Anexo J, Quadro 9.4A.
- Cria novo lote de ETH na CaymanExchange:
acquisitionDate = 2024-07-01costPerUnit = 25.000€ / 0.3 = 83.333,33€/ETHamount = 0.3originalAcquisitionDate = null
Exemplo:
- Data: 2024-08-15
- Entidade: Binance (type: 'Exchange', countryCode: 'GE')
- Ativo entregue: BTC (1.0) - Custo histórico total: 30.000€
- Ativos recebidos: ETH (0.3) + SOL (0.2)
- Valores de mercado proporcionais calculados no instante da troca:
- Fração ETH: Representa 75% do valor total da transação.
- Fração SOL: Representa 25% do valor total da transação.
Cálculo do custo proporcional distribuído:
- Custo total do BTC entregue a fracionar: 30.000€
- Custo atribuído ao ETH = 75% × 30.000€ = 22.500€
- Custo atribuído ao SOL = 25% × 30.000€ = 7.500€
Resultado:
- Lote de ETH:
acquisitionDate = 2024-08-15costPerUnit = 22.500€ / 0.3 = 75.000€/ETHamount = 0.3originalAcquisitionDate = null
- Lote de SOL:
acquisitionDate = 2024-08-15costPerUnit = 7.500€ / 0.2 = 37.500€/SOLamount = 0.2originalAcquisitionDate = null
➡️ Evento neutro fiscalmente, não gera tributação imediata.
A lógica de tratamento de taxas é offline e determinística, aplicando os princípios gerais de "alienação onerosa" (Art. 10.º) e "apuramento de mais-valias" (Art. 43.º).
➡️ É um encargo puro da alienação, deduzido diretamente na fórmula da mais-valia.
Ao processar uma comissão em criptoativos, o algoritmo rejeita o custo histórico (FIFO) para mensurar a despesa ou para apurar mais-valias sobre a taxa. O encargo dedutível (Art. 51.º, n.º 1, al. b) do CIRS) é determinado pelo valor de mercado em euros no momento da transação, registado no campo feeFiatValue.
Este tratamento é aplicado de forma uniforme em vendas, permutas e transferências, garantindo que o encargo atue como redutor do lucro tributável sem dependência de introdução manual quando exista cotação offline ou online.
Exemplo:
- Venda de 0.5 BTC por 30.000€
- Custo FIFO do principal: 15.000€
- Taxa em FIAT: 50€
Resultado:
- Mais-valia = 30.000€ - 15.000€ - 50€ = 14.950€
- Se tributável (< 365 dias): IRS = 14.950€ × 28% = 4.186€
Ao pagar uma comissão em criptoativos, o algoritmo rejeita o custo histórico (FIFO) para mensurar a despesa ou para apurar mais-valias sobre a taxa. O encargo dedutível (Art. 51.º) é fixado estritamente pelo valor de mercado em Euros no momento da transação (feeFiatValue).
Exemplo:
- Venda de 0.5 BTC por 30.000€
- Custo FIFO do principal: 15.000€
- Taxa gasta: 0.001 BTC
- Valorização de mercado no momento da operação (
feeFiatValue): 60 €
Resultado:
- Mais-valia da operação principal (líquida de encargos) = 30.000€ - 60€ - 15.000€ = 14.940€
- Mais-valia autónoma da micro-alienação da taxa = 0.00€ (a fração de 0.001 BTC dá baixa do inventário cotada ao preço de mercado do momento, anulando ganhos fictícios).
- Total mais-valia combinada = 14.940€
O encargo cumpre o papel fiscal de mitigar o lucro tributável global da operação, garantindo o tratamento idêntico às taxas pagas em moeda fiduciária e corrigindo a anomalia onde o imposto subia para 15.030 €.
Note
Taxas em transferências: Mesmo que a transferência entre entidades do mesmo titular seja neutra fiscalmente, a taxa de rede paga em cripto é processada como uma baixa de inventário pelo valor de mercado do momento (mais-valia zero), garantindo a exatidão física dos lotes e saldos das carteiras sem gerar imposto.
NFT significa Non-Fungible Token (Token não fungível). Representa um certificado digital de propriedade sobre um ativo único, indivisível e não intermutável (ex.: arte digital, colecionáveis, registos de exclusividade).
Não fungível = único e irrepetível. Diferente de moedas ou criptomoedas (como Bitcoin ou Ethereum), que são fungíveis. Um NFT é único - não pode ser trocado por outro igual.
Exemplo:
- Um Bitcoin = outro Bitcoin → fungível.
- Um NFT de uma obra de arte digital = só existe um → não fungível.
Por força da exclusão legal da definição de criptoativos, as transações de NFT não seguem o regime das criptomoedas. Isto implica um tratamento severo pelo algoritmo:
- Revogação de Isenções: Não existe exclusão de tributação após 365 dias de detenção.
- Permutas Tributáveis: Trocar um NFT por outro (ou por ETH) não goza de neutralidade fiscal. É um evento de alienação imediato com apuramento de ganho em Euros baseado no valor de mercado.
Para evitar cálculos errados e proteger o utilizador, o algoritmo implementa uma "Flag de Bloqueio/Alerta" (assetType: 'NFT').
Em vez de aplicar a lógica FIFO de cripto, o motor suspende o processamento da linha e emite um aviso ao utilizador para reporte manual na categoria geral correspondente do IRS (ex: Categoria B se houver cariz profissional, ou mais-valia geral se aplicável), uma vez que a Autoridade Tributária analisa estes ativos pela sua substância (ex: se representa arte digital, propriedade, ou um direito de serviço).
DeFi (Decentralized Finance) engloba serviços financeiros (empréstimos, trocas automatizadas, derivados) executados diretamente através de smart contracts em redes blockchain, sem a presença de intermediários centralizados.
- Staking (delegar tokens para validar redes)
- Lending & Borrowing (emprestar ou pedir emprestado cripto)
- Liquidity pools (fornecer liquidez em exchanges descentralizadas como Uniswap)
- Yield farming (ganhar recompensas por fornecer liquidez)
- Stablecoins (USDC, DAI, etc.)
O CIRS não faz qualquer distinção operacional entre finanças descentralizadas (DeFi) ou centralizadas (CeFi). As regras gerais da Categoria G aplicam-se igualmente à natureza dos ativos movimentados.
- Rendimentos passivos (staking, yield farming): São tratados sob o regime de suspensão de tributação. O custo de aquisição é 0,00€.
- Alienação de ativos DeFi (venda, troca, saque): Mais-valia calculada com FIFO.
- Permutas DeFi (ex.: ETH → LP token): Neutras fiscalmente (Art. 10.º, n.º 20).
- Taxas em DeFi (gas fees): Tratadas como micro-alienações se pagas em cripto.
- Isenção após 365 dias: Aplicável apenas a criptoativos não-mobiliários.
Note
No DeFi o ónus da prova cabe inteiramente ao contribuinte. A Autoridade Tributária (AT) não monitoriza de forma automática as suas wallets privadas ou protocolos descentralizados, pelo que é o titular quem tem de demonstrar a origem, o histórico e o tempo de detenção dos ativos para beneficiar das isenções fiscais.
Como os protocolos DeFi correm em contratos sem localização geográfica tradicional, o algoritmo determina a fiscalEligibility avaliando o type da carteira que assina a transação (Cold/Hot Wallet), herdando o país de residência fiscal do utilizador (ex: 'PT' = COOPERATING). No entanto, o encaminhamento declarativo de curto prazo é sempre remetido para o Anexo J, dada a ausência de intermediário financeiro nacional.
Exemplo:
- Data: 2024-06-15
- Entidade: Uniswap Protocol (
type: 'Hot Wallet') - Ativo: USDC
- Quantidade: 100
- Tipo:
deposit, Tag:defi
Resultado:
- Cria novo lote:
acquisitionDate = 2024-06-15costPerUnit = 0,00€amount = 100originalAcquisitionDate = null
- Ação fiscal: Nenhuma no momento da receção. A tributação ocorrerá apenas na venda por Euros (Categoria G).
Exemplo:
- Data: 2024-07-01
- Entidade: Uniswap
- Ativo entregue: ETH (0.5) + USDC (500)
- Custo histórico total dos lotes entregues: 0.5 × 3.000€ + 500€ = 2.000€
- Ativo recebido: UNI-V2 LP Token (1.0)
Resultado:
- Cria novo lote de LP token:
acquisitionDate = 2024-07-01costPerUnit = 2.000€ / 1.0 = 2.000€/LPamount = 1.0originalAcquisitionDate = null(contador reinicia)
➡️ Evento neutro fiscalmente, permuta cripto-cripto.
Exemplo:
- Data: 2025-01-10
- Entidade: Uniswap
- Ativo: UNI-V2 LP Token (1.0)
- Quantidade: 1.0
- Valor em FIAT (mercado): 2.500€
- Custo do LP Token: 2.000€
- Dias detidos: 193 dias (< 365 dias) → Tributável
Cálculo:
- Mais-valia = 2.500€ - 2.000€ = 500€
- IRS = 500€ × 28% = 140€
Note
Os ativos recebidos de volta (ETH, USDC) entram como novos lotes com custo igual ao seu valor de mercado no dia da retirada (2.500€ no total).
- Ação: Sendo curto prazo numa estrutura sem intermediário nacional, é direcionado para o Anexo J, Quadro 9.4A.
Exemplo:
- Transação DeFi (ex.: staking)
- Taxa paga em ETH: 0.005 ETH
- Valor de mercado da taxa no momento (
feeFiatValue): 15 €
Resultado:
- Tratamento do encargo (Art. 51.º): o montante de 15€ é assumido como a despesa suportada na operação. Se a transação DeFi principal associada for um evento tributável, este valor é deduzido como encargo da alienação.
- Ajuste de inventário: os 0.005 ETH dão baixa da pilha FIFO local com base no valor de mercado (15€), gerando uma mais-valia interna autónoma de 0.00€.
Depósitos: criam novos lotes com o custo real (no caso de uma compra) ou com custo zero (no caso de rendimentos passivos recebidos diretamente em criptoativos).
Alienações para FIAT, bens ou serviços: Curto prazo (< 365 dias) é sempre tributado a 28%. Longo prazo (≥ 365 dias) em países cooperantes é isento. Transações em paraísos fiscais perdem o direito a isenção de longo prazo.
- Se operado em jurisdição cooperante: são tributáveis (Categoria G) se detidos por menos de 365 dias, e estão excluídos de tributação se detidos por 365 dias ou mais (exceto security tokens).
- Se operado em jurisdição não cooperante: Sempre tributável na Categoria G (28%).
Alienações de NFT: São tributados em Portugal, mas estão excluídos do regime especial de criptoativos. Os ganhos obtidos com a sua venda enquadram-se nas regras gerais de mais-valias do IRS
- Vendas ocasionais (Categoria G)
- Atividade profissional (Categoria B)
Security tokens: sempre tributáveis (Categoria G), independentemente do tempo de detenção. Não beneficiam da isenção de longo prazo.
Transferências entre entidades: evento totalmente neutro que apenas altera o local de custódia (self-custody ou exchanges). Preserva a data e o custo de aquisição originais para o cálculo do FIFO.
Permutas (trades): evento fiscalmente neutro (Art. 10.º, n.º 20) apenas se operado em entidades cooperantes - o novo ativo recebido herda o custo de aquisição proporcional do ativo entregue e reinicia a contagem do prazo de 365 dias para zero. Tornam-se tributáveis no momento da troca se efetuadas em entidades de paraísos fiscais.
Taxas (gas fees / comissões): a despesa dedutível (Art. 51.º) é medida pelo seu valor de mercado em euros no momento da operação (feeFiatValue), eliminando o uso de regras FIFO para apurar o montante do encargo. Atua reduzindo o valor de realização da transação principal em vendas, trocas e transferências. A fração de cripto gasta dá baixa do inventário pelo valor do momento (mais-valia comercial da taxa de 0.00 €).
A geração de relatórios de exportação cruza a natureza do ativo, o prazo de detenção e a jurisdição da entidade para o preenchimento correto dos anexos da Autoridade Tributária:
| Natureza do ativo | Prazo de detenção | Entidade com sede em Portugal (type: 'Exchange', countryCode: 'PT') |
Entidade estrangeira cooperante ou carteira pessoal (type: 'Exchange' com countryCode diferente de 'PT', ou carteiras 'Wallet') |
Entidade não cooperante (Paraíso fiscal, fiscalEligibility: NON_COOPERATING) |
|---|---|---|---|---|
| Criptoativo comum | Curto Prazo (< 365 dias) | Anexo G, Quadro 18A (Tributável) | Anexo J, Quadro 9.4A (Tributável) | Anexo J, Quadro 9.4A (Tributável) |
| Criptoativo comum | Longo Prazo (≥ 365 dias) | Anexo G1, Quadro 7 (Isento) | Anexo G1, Quadro 7 (Isento) | Anexo J, Quadro 9.4A (Tributável - Isenção revogada pelo Art 10 n21) |
| Security Token | Qualquer Prazo | Anexo G, Quadro 18A (Tributável) | Anexo J, Quadro 9.4A (Tributável) | Anexo J, Quadro 9.4A (Tributável) |
| NFT | Qualquer prazo | Excluído (Tributavel) | Excluído (Tributavel) | Excluído (Tributavel) |
Note
Fundamentação para o enquadramento de self-custody no Anexo J: as transações executadas a partir de carteiras privadas (como cold wallets ou hot wallets) não possuem um intermediário centralizado estabelecido em território nacional. Em conformidade com a natureza territorial do Anexo J e as diretrizes do Ofício Circulado 20269/2024, estas mais-valias de curto prazo tributáveis são encaminhadas para o Anexo J, utilizando o código do país de residência fiscal do sujeito passivo como a origem declarativa do fluxo monetário.
Important
Necessidade de validação profissional: Embora a presente matriz tente refletir rigorosamente o CIRS e a doutrina administrativa conhecida, o mapeamento automático de anexos deve ser validado por um Contabilista Certificado (CC) ou Advogado Fiscalista antes de ser integrado em ambientes de produção. Isto garante a conformidade com eventuais alterações informais ou restrições técnicas específicas da aplicação web de submissão da Modelo 3 da Autoridade Tributária.
flowchart TD
A[Início: Transação de Cripto] --> B{Tipo de Transação?}
%% DEPÓSITOS
B -->|Deposit<br>Compra| C[Cria novo Lot]
C --> C1{Tag?}
C1 -->|Buy| C2[CostPerUnit = fiatValue,<br> acquisitionDate = data da <br>transação]
C1 -->|Staking/Airdrop/Interest| C3[CostPerUnit = 0,00€<br>Suspensão de Tributação]
C1 -->|DeFi| C4[CostPerUnit = 0,00€<br>Se rendimento em cripto]
%% RETIRADAS / VENDAS
B -->|Withdrawal<br>Alienação não-cripto| D[Evento Tributável]
D --> D0{Jurisdição Cooperante?}
D0 -->|Não| D2[Sempre Tributável<br>Isenção revogada pelo Art 10 n21]
D0 -->|Sim| D1{É Security Token?}
D1 -->|Sim| D2[Sempre Tributável<br> Sem isenção 365 dias]
D1 -->|Não| D3[Verificar Dias Detidos]
D3 -->|< 365 dias| D4[Tributável<br> Cat. G]
D3 -->|>= 365 dias| D5[Isento<br> Cat. G]
D2 & D4 & D5 --> D6[Apurar Mais-Valia FIFO<br> Encaminhar p/ Anexo conforme matriz]
%% TRANSFERÊNCIAS
B -->|Transfer/Transferência| E[Evento Fiscalmente Neutro]
E --> E1[Consumir Lot da<br> entidade de origem]
E1 --> E2[Criar novo Lot na<br> entidade de destino]
E2 --> E3[Preservar costPerUnit,<br> originalAcquisitionDate<br> e isSecurityToken]
%% PERMUTAS / TRADES
B -->|Trade/Permuta| F0{Jurisdição Cooperante?}
F0 -->|Não| F_Tributavel[Revoga Neutralidade<br> Apura Mais-Valia Imediata Cat. G]
F0 -->|Sim| F["Evento Neutro<br> 'Art. 10.º, n.º 20'"]
F --> F1[Consumir Lot do ativo<br> entregue 'FIFO']
F1 --> F2[Criar novo Lot para ativo<br> recebido]
F2 --> F3[CostPerUnit <br>=<br> custo de aquisição<br> dos lotes entregues]
F3 --> F4[acquisitionDate <br>=<br> data da permuta<br> originalAcquisitionDate = null<br> Contador 365 dias REINICIA]
%% DEFI NOMINAL
B -->|DeFi| G[Tratar como<br> staking, LP, ou troca]
G --> G1{Tipo de DeFi?}
G1 -->|Staking/Rewards| G2[CostPerUnit = 0,00€<br>Suspensão de Tributação]
G1 -->|LP/Permuta| G3[CostPerUnit = custo<br> dos ativos entregues<br> Reinicia 365 dias]
G1 -->|Withdrawal LP| G4[Alienação do LP Token<br> Calcular Mais-Valia FIFO]
%% LÓGICA DE TAXAS (Encadeamento Global)
D6 --> H{Taxa Paga?}
E3 --> H
F4 --> H
F_Tributavel --> H
G2 --> H
G3 --> H
G4 --> H
H -->|FIAT| H1[Taxa reduz o valor de<br> realização / encargo]
H -->|CRYPTO| H2[Fixa despesa pelo valor de<br> mercado: feeFiatValue]
H2 --> H3[Deduz feeFiatValue como encargo<br> Art. 51.º da operação principal]
H3 --> H4[Dá baixa física da fração no FIFO<br> Valor de mercado: Mais-valia taxa = 0€]
%% ESTILIZAÇÃO DO GRAPH
style A fill:#f9f,stroke:#333,stroke-width:2px,color:#000
style B fill:#77f,stroke:#333,stroke-width:1px,color:#fff
style C fill:#cff,stroke:#333,stroke-width:1px,color:#000
style D fill:#f88,stroke:#333,stroke-width:1px,color:#000
style E fill:#cff,stroke:#333,stroke-width:1px,color:#000
style F fill:#cff,stroke:#333,stroke-width:1px,color:#000
style F_Tributavel fill:#f88,stroke:#333,stroke-width:1px,color:#000
style G fill:#bbf,stroke:#333,stroke-width:1px,color:#000
style H fill:#fffbcc,stroke:#333,stroke-width:1px,color:#000
style D0 fill:#bbf,stroke:#333,stroke-width:1px,color:#000
style D1 fill:#ff9999,stroke:#333,stroke-width:2px,color:#000
style F0 fill:#bbf,stroke:#333,stroke-width:1px,color:#000
style C1 fill:#bbf,stroke:#333,stroke-width:1px,color:#000
style H3 fill:#bbf,stroke:#333,stroke-width:1px,color:#000
Encontrou uma falha na nossa lógica? Acha que uma interpretação pode ser mais rigorosa?
- Abra uma Issue para iniciar a discussão.
- Se tiver uma sugestão de texto, pode submeter um Pull Request para melhorar este documento.
Este projeto é licenciado sob a MIT License.
Consulta o ficheiro para mais detalhes.