osteel / dime
在英国计算您的加密资产税
Requires
- php: ^8.2
- ext-bcmath: *
Requires (Dev)
- brick/date-time: ^0.5.1
- eventsauce/eventsauce: ^3.4
- eventsauce/message-repository-for-illuminate: ^1.0
- eventsauce/object-hydrator: ^1.3
- eventsauce/pest-utilities: ^3.4
- fakerphp/faker: ^1.21.0
- illuminate/console: ^10.17
- illuminate/database: ^10.13
- intonate/tinker-zero: ^1.2
- laravel-zero/framework: ^10.0
- laravel-zero/phar-updater: ^1.3
- laravel/pint: ^1.6
- laravel/prompts: ^0.1.5
- mockery/mockery: ^1.5.1
- nunomaduro/termwind: ^1.15
- pestphp/pest: ^2.5
- pestphp/pest-plugin-mock: ^2.0
- phpoffice/phpspreadsheet: ^1.28
- phpstan/extension-installer: ^1.2
- phpstan/phpstan: ^1.10.6
- rector/rector: ^0.18.0
- tomasvotruba/type-coverage: ^0.2.0
README
在英国计算您的加密资产税
关于
Dime 是一款开源的命令行工具,用 PHP 编写,用于计算您在英国的加密资产税。
它接受交易表格作为输入,并返回每个纳税年度相应的税额。
Dime 主要面向已经熟悉英国 加密资产税规则 并希望以保护隐私的方式完成税务申报的人。
Dime 是由 Yannick Chenot 开发的一个项目,也是一篇 博客系列 的主题。
免责声明
本程序版权所有(C)2022 Yannick Chenot。
本程序是免费软件:您可以按照自由软件基金会发布的GNU Affero通用公共许可证的条款重新分发和/或修改,许可证版本为3,或者(根据您的选择)任何更高版本。
本程序以希望对您有用为目的进行分发,但没有任何保证;甚至没有关于适销性或适用于特定目的的暗示性保证。有关更多信息,请参阅GNU Affero通用公共许可证。
在使用本程序之前,您应咨询专业会计师。
目录
安装
独立应用程序 🧪
注意
这是一个实验性功能。如果应用程序的行为不符合预期,请打开一个问题。
下载适用于您操作系统的二进制文件
您可以直接使用应用程序
$ chmod +x dime-<YOUR-OS>
$ ./dime-<YOUR-OS>
或者您可能希望将其移动到系统PATH
中的目录
$ chmod +x dime-<YOUR-OS>
$ mv dime-<YOUR-OS> /usr/local/bin/dime
现在您可以从任何地方运行dime
,而不是./dime-<YOUR-OS>
。
Composer
重要
您可以通过Composer安装 Dime。
$ composer global require osteel/dime
一旦脚本运行完成,您应该可以从任何地方运行 dime
来使用应用程序。
如果不可以,请确保~/.composer/vendor/bin
目录已添加到系统PATH
中。
演示如何
如果还没有,请将以下行添加到您的 Bash 配置文件中(通常是~/.bash_profile
,~/.bashrc
,~/.zshrc
等)
$ export PATH=~/.composer/vendor/bin:$PATH
如果文件不存在,请创建它。
在您刚刚更新的文件上运行以下命令以使更改生效
$ source ~/.bash_profile
PHAR (Linux / Unix / macOS)
重要
需要PHP 8.2和BCMath扩展。
从最新版本下载PHAR存档。
您可以直接使用应用程序
$ php dime
或者您可能希望将其移动到系统PATH
中的目录
$ chmod +x dime
$ mv dime /usr/local/bin/dime
现在您可以从任何地方直接运行dime
,而不仅仅是php dime
。
Docker
重要
需要Docker和sh或Bash。
下载此shell脚本并立即使用它
$ sh dime.sh
它将下载Dime的Docker镜像并将命令传递给它。
您可能还想将脚本移动到系统PATH
目录中。
$ chmod +x dime.sh
$ mv dime.sh /usr/local/bin/dime
现在您可以从任何地方运行dime
。
使用方法
不输入参数调用可执行文件以显示Dime菜单。
$ dime
以下是主要命令的简要描述。
处理交易
将您的交易电子表格传递给process
命令
$ dime process transactions.csv
它将验证并处理每笔交易,并显示相应的税额或报告任何错误。
提示
每次您更新电子表格时都需要运行此命令。
请参阅电子表格格式部分了解如何报告您的交易。
审查税年
一旦处理完交易电子表格,您就可以随时查看相应的税额,而无需再次运行process
命令。
列出可用的税年和选择一个进行审查
$ dime review
审查特定的税年
$ dime review 2015-2016
在不指定税年的情况下调用review
命令也会显示您的当前法定货币余额(您存入和取出的法定货币金额之间的差额)。
电子表格格式
这是一个示例CSV文件,您可以将其作为起点。然而,建议您阅读本节以确保正确报告。
您的电子表格至少必须包含以下列
列名不区分大小写,列可以以任何顺序排列。程序将忽略额外的列。
日期
期望的日期格式为DD/MM/YYYY
(例如21/10/2015
)。
您还可以指定交易的时间,尽管Dime不需要它。
操作
接受值:receive
、send
、swap
和transfer
。
每种操作都需要不同列具有值(见下文详细说明)。您还可以使用示例CSV文件作为指南。
接收
此操作用于您未提供任何东西而接收加密资产的情况。例如,当有人赠送您一些加密资产,或者当您获得或申领空投时,这种情况就会发生。
receive
交易需要Market value
、Received asset
和Received quantity
列的值。
发送
此操作用于您发送加密资产而未收到其他加密资产或一些法定货币的情况。例如,当您赠送某人一些加密资产,或者当您使用加密资产支付产品或服务时,这种情况就会发生。
send
交易需要Market value
、Sent asset
和Sent quantity
列的值。
交换
此操作用于交易,您用加密资产(或某些法定货币)交换另一种加密资产(或某些法定货币)。例如,当您在交易所购买某些加密货币时,或者当您出售某些加密货币,或者您交换一种加密资产以换取另一种资产时,都会发生这种情况。
在任何情况下,交易至少有一方必须是加密资产。
swap
交易需要填写 市场价值
、接收资产
、接收数量
、发送资产
和 发送数量
列的值。
转账
此操作用于将您控制的钱包之间的加密资产进行转账。例如,当您从交易所提取某些加密货币并将其发送到您的硬件钱包时,就会发生这种情况。
transfer
交易需要填写 发送资产
和 发送数量
列的值。
市场价值
交易的市场价值是在交易发生时用英镑表示的价值。
市场价值是 Dime 计算规则的核心,因此正确报告它至关重要。
规则
当交易包含发送资产(且不是转账——转账不需要市场价值)时,您必须使用发送资产的报告数量作为交易的市场价值(请参阅下文中的发送数量部分,了解如何正确报告它)。
重要
在出售资产以换取某些法定货币时,特别要小心。使用接收的法定货币金额作为市场价值可能很诱人,但如果收取了费用,实际市场价值是接收金额加上费用的市场价值。
当交易不包含发送资产(即 receive
交易)时,交易的市场价值是接收资产的市场价值。
如何查找市场价值
有几种方法可以确定交易的市场价值。
记住,当交易包含发送资产时,其市场价值优先
- 如果发送资产是法定金额,则将其用作市场价值;
- 如果在交易所执行交易,则使用交易发生时该资产的交易所汇率;
- 如果使用去中心化协议,则使用相应区块链浏览器报告的值(例如,在此处,查看 已转移代币 部分中的值之间括号内的值);
- 如果上述任何一种都不适用,请在 CoinMarketCap 或 CoinGecko 等价格跟踪网站上查找该资产。
提示
如果上述任何金额是以外币表示的,请使用 HMRC 的 汇率 将其转换为英镑。
有时,即使交易包含发送资产,其价格也没有任何跟踪。在这种情况下,如果为此费用支付了费用,则使用接收资产的市场价值加上费用的市场价值。
在某些情况下,交易的资产价格没有在任何地方跟踪。在这种情况下,您应该确定资产的实际市场价值,尽管没有明确的指导。
发送资产
对于 send
、swap
和 transfer
交易,必须指定发送资产。
以下是每个相关列的详细信息。
发送资产
这是发送资产的符号或标记(例如,比特币的 BTC
或英镑的 GBP
)。
如果资产是 NFT,则可以使用任何您喜欢的字符串值,只要它在您的电子表格中是唯一的。我通常选择集合的 ID 加上项目的编号(例如,这个 CryptoPunk 的 ID 将是 0xb47e3cd837ddf8e4c57f05d70ab865de6e193bbb/1008
)。
发送数量
发送的数量。对于NFT,这将是1
。
尽可能精确,并报告所有可用的十进制位。
重要
当发送资产和费用的货币相同时(例如,两种情况下都是GBP),且费用数量已从发送数量中扣除,发送数量必须排除费用数量。
- 示例 #1:如果您向交易所发送50英镑,并在交易中花费了全部金额,并产生0.50英镑的费用,发送数量为49.5。
- 示例 #2:如果您在交易所用1个比特币交换10个以太坊,交易产生0.01比特币的费用,发送数量为0.99。
发送资产是非同质化资产
发送的资产是否为NFT。这是一个布尔值,可以是true
、yes
、y
和1
中的任何一个。如果您的电子表格软件允许您在单元格中插入复选框,请使用该功能。
接收资产
对于receive
和swap
交易,必须指定接收资产。
以下是每个相关列的详细信息。
接收资产
这是接收资产的符号或代币(例如,比特币的BTC
或英镑的GBP
)。
如果资产是 NFT,则可以使用任何您喜欢的字符串值,只要它在您的电子表格中是唯一的。我通常选择集合的 ID 加上项目的编号(例如,这个 CryptoPunk 的 ID 将是 0xb47e3cd837ddf8e4c57f05d70ab865de6e193bbb/1008
)。
接收数量
接收的数量。对于NFT,这将是1
。
尽可能精确,并报告所有可用的十进制位。
接收资产是非同质化资产
接收的资产是否为NFT。这是一个布尔值,可以是true
、yes
、y
和1
中的任何一个。如果您的电子表格软件允许您在单元格中插入复选框,请使用该功能。
费用
虽然相关值是可选的,但大多数交易都会产生费用。
必须根据上下文使用不同的值
- 如果交易是在链上进行的(例如,通过去中心化协议执行),请使用区块链的费用(即区块链浏览器报告的费用);
- 如果在交易所进行了交易,即使存在相应的链上交易,也请使用交易所的费用。
后者之所以这样做,是因为交易所通常会估算费用将有多少,并据此收费。这个金额几乎总是与实际费用不同,但您仍将被收取这个金额。
提示
确保不要报告您未支付的费用。例如,如果您收到了由代币发行者发送的空投,并且交易包括费用,发行者支付了该费用,而不是您,因此您不需要报告它。
以下是每个费用相关列的详细信息。
费用货币
这是用于支付费用的资产符号(或代币)(例如,比特币的BTC
或英镑的GBP
)。
费用数量
用于费用的数量。
尽可能精确,并报告所有可用的十进制位。
费用市值
费用市值是指交易时的英镑价值。有关详细信息,请参阅市值。
收入
某些交易被认为是HMRC的收入。一个典型的例子是由于某些过去的活动而收到的空投。
例如,如果您在2021年11月之前购买了ENS域名,您将作为其空投的一部分收到一些ENS代币。这是一项基于过去的行为的奖励,HMRC认为这是收入。
收入
列是一个布尔值,可以是true
、yes
、y
和1
中的任何一个。如果您的电子表格软件允许您在单元格中插入复选框,请使用该功能。
摘要
以下是重要规则摘要
- 始终在可用的情况下使用发送资产的市场价值,即使接收资产是法定金额;
- 转账不需要市场价值;
- 当发送资产和费用的货币相同时,发送数量必须排除费用数量;
- 发送资产的市场价值必须基于报告的发送数量;
- 在
receive
交易中,市场价值是接收资产的市场价值; - 使用HMRC的汇率将外币金额转换为英镑。
如果你已经读到这儿,你现在应该意识到报告交易有点繁琐。Dime让你对报告有更多的控制权,但代价是这需要你做得很好。
换句话说,返回的税务数字只和电子表格的准确性一样好。
特殊情况
以下是需要以特定方式报告以便正确处理的边缘案例列表。
从几个其他NFT铸造NFT
详情
一些收藏允许你收集可以组合起来通过一个锻造铸造新NFT的NFT。在实践中,这意味着在单个交易中交换多个NFT以换取另一个NFT。由于NFT是独特的,没有简单的方法将此类交易报告为单个电子表格行。
在Dime中完成此操作的方法是将交易分成与创建新NFT所涉及的NFT数量一样多的交易。
想象一下,你购买了三个描绘动物的不同的NFT。一个是狮子(市场价值200英镑),另一个是山羊(100英镑),第三个是蛇(150英镑)。然后你将它们组合起来铸造一个描绘独角兽的新NFT,实际上是将三个初始NFT交换成新NFT。
你不会报告单个交易,而是在你的电子表格中报告以下交易
- 将狮子NFT交换成独角兽NFT(市场价值200英镑);
- 将山羊NFT交换成独角兽NFT(市场价值100英镑);
- 将蛇NFT交换成独角兽NFT(市场价值150英镑)。
虽然表达为三个不同的交易,但Dime将识别出在每种情况下都会收到独角兽NFT,并相应地更新其成本基础(这里的总额为450英镑)。
如何工作
Dime处理你的电子表格中的交易,并将其与它计算出的税务数字一起保存在本地SQLite数据库中。
数据库文件位于你的用户目录的.dime
文件夹中
$ ls ~/.dime/database.sqlite
所有操作都在本地进行——你的交易永远不会离开你的电脑。
架构的详细描述在这里可以找到这里。
维护
升级和删除Dime取决于你最初是如何安装它的。
升级
如果你通过Composer安装了Dime,这是升级到小版本(例如v1.1
)的方法
$ composer global update osteel/dime
到主要版本(例如v2.0
)
$ composer global require osteel/dime
如果你通过下载PHAR存档安装了Dime
$ dime self-update
如果你通过Docker安装了Dime
$ docker pull ghcr.io/osteel/dime:latest
删除
如果你通过Composer安装了Dime
$ composer global remove osteel/dime
如果你通过下载PHAR存档安装了Dime,你需要手动将其从其位置删除,例如
$ rm /usr/local/bin/dime
如果你通过Docker安装了Dime
$ dime delete
在所有情况下,你还需要删除.dime
文件夹(除非你想要保留数据库)
$ rm -r ~/.dime
问题报告
目前我不接受功能请求(尽管我会查看拉取请求——请参阅下面的贡献),但我也会尝试解决与报告数字相关的任何问题。
如果Dime看起来没有原因就崩溃,或者返回看起来不正确的数字,请使用相关模板在此提交问题。
此外,您可以随时为与程序相关的内容(例如税务规则、如何在电子表格中报告某些内容等)打开一个讨论。我不能保证我会亲自回复,但其他人可能会。
贡献
在此阶段,我不会接受功能请求,但欢迎提交拉取请求。有关详细信息,请参阅CONTRIBUTING。
此外,在开始任何重大工作之前,请确保打开一个讨论,以避免失望。