Basis Passport: ваш базис — ваш.
Каждый крипто-налоговый инструмент запирает вашу историю внутри. Мы свою публикуем. Basis Passport — подписанный, версионированный, переносимый файл с полным состоянием вашего базиса со ссылками на доказательства: открытые партии, отчуждения с полной родословной партий, события дохода, открытые решения. Экспортируйте его из любого сохранённого скана ClearBasis, бесплатно, навсегда — даже если вы не заплатите нам ни цента. Импортируйте куда угодно; эта страница — вся спецификация, и реализовать её может любой (включая наших конкурентов).
Формат
Один JSON-документ. Все количества и суммы в USD — десятичные строки (никогда не float: деньги во float — вот как умирает базис). Метки времени — ISO-8601 со смещениями.
{
"format": "basis-passport",
"version": "1.0",
"generator": {"name": "...", "engine_version": "...", "ruleset_version": "..."},
"generated_at": "2026-08-22T18:00:00+00:00",
"open_lots": [
{"wallet": "coinbase", "asset": "ETH", "qty": "1.5",
"unit_basis_usd": "1505.00", "acquired_ts": "2023-01-10T12:00:00+00:00",
"origin_tx": "file.csv:2", "conservative_default": false,
"evidence": [{"source": "coinbase_csv", "ref": "row:2"}]}
],
"disposals": [
{"tx_id": "file.csv:9", "ts": "...", "wallet": "coinbase", "asset": "ETH",
"qty": "1", "proceeds_usd": "1990.00", "kind": "sale",
"allocations": [
{"lot_id": "L0001", "qty": "1", "unit_basis_usd": "1505.00",
"acquired_ts": "...", "conservative_default": false}],
"evidence": [{"source": "coinbase_csv", "ref": "row:9"}]}
],
"income": [
{"tx_id": "...", "ts": "...", "wallet": "...", "asset": "ATOM",
"qty": "5", "fmv_usd": "50.00", "kind": "staking"}
],
"decisions_open": ["D00007"],
"integrity": {"algo": "sha256", "digest": "…64 hex chars…"}
}
Печать целостности
integrity.digest — это SHA-256 от канонического JSON всех полей, кроме самого integrity: ключи отсортированы, разделители (",", ":"), без пробелов, UTF-8. Это печать от подделки, а не секрет: любой может проверить, что паспорт не был изменён в пути, — аккаунт ClearBasis не требуется.
canonical = json.dumps({k: v for k, v in passport.items()
if k != "integrity"},
sort_keys=True, separators=(",", ":"))
assert sha256(canonical.encode()).hexdigest() == passport["integrity"]["digest"]
Семантика, которая имеет значение
conservative_default: true помечает партию или аллокацию, чья стоимость была установлена в $0 из-за отсутствия записей — честный минимум, а не догадка. Импортёры обязаны сохранять этот флаг: он говорит следующему инструменту (и следующему бухгалтеру), какие цифры доказуемы, а какие — заглушки, ожидающие доказательств. Записи evidence указывают на исходные строки/документы, из которых пришла каждая цифра; импортёр, который их отбрасывает, выбрасывает ровно ту часть, что переживает проверку. decisions_open перечисляет неразрешённые вопросы классификации — паспорту разрешено нести честную неопределённость.
Версионирование и лицензия
Семантическое версионирование: добавление полей повышает минорную версию, ломающие изменения — мажорную. Текст этой спецификации и формат свободны для реализации — без лицензии, платы или разрешения; упоминание приветствуется, но не требуется. Исправления и предложения: hello@clearbasis.tax.
Канонический JSON — точно
«Ключи отсортированы, пробелов нет» — этого недостаточно, чтобы заново реализовать печать, и мы выяснили это честным путём: написав вторую реализацию, приведённый ниже проверщик, на JavaScript. Четыре правила, и третье — то самое, которое кусается.
- Ключи отсортированы по возрастанию кодовой точки Unicode.
- Запятая между элементами и двоеточие между ключом и значением, без пробелов нигде.
- Каждый символ вне диапазона 0x20–0x7E экранируется последовательностью \uXXXX, включая 0x7F, а астральные символы — суррогатной парой UTF-16. Python экранирует их по умолчанию, и исходное правило было написано вокруг этого умолчания, не сказав об этом; JSON.stringify и стандартный кодировщик в Go, Rust и Java выдают сырой UTF-8. Поэтому паспорт с диакритикой в имени файла или с символом мошеннического токена во всех языках, кроме Python, давал другой хеш, и другой инструмент сообщил бы о совершенно исправном паспорте как об изменённом. Мы документируем правило, а не переходим на сырой UTF-8, потому что переход сломал бы печать на каждом уже выданном паспорте.
- Полученная ASCII-строка хешируется как UTF-8.
Проверьте паспорт сейчас
Вставьте паспорт или выберите файл. Всё происходит на этой странице: паспорт никуда не загружается, и это работает с выключенной сетью. Это одновременно вторая реализация описанных выше правил — единственное настоящее доказательство их полноты.
Больше бесплатных инструментов: декодер писем IRS · Кто о вас сообщает · Кладбище бирж · Объяснитель транзакций · сам бесплатный скан