Учебник по двойной записи

Двойная бухгалтерия — это сложно. Особенно, когда вы используете несколько валют. Мы сделаем это легко.

Представьте, что вы добыли немного биткойнов, получили вознаграждение и хотите его обменять. Вы решили, что BTC мертв, а XRP летит на Луну, поэтому вы нашли приятную маленькую арбитражную возможность, торгуя несколькими символами, и, ей-богу, вы собираетесь воспользоваться этими проклятыми «эффективными» рынками. .

Для целей этой иллюстрации мы просто предположим, что ваши добытые средства имеют нулевую стоимость и не имеют налогового бремени. Но власти захотят увидеть свою долю, как только вы ее обменяете!

Мы также собираемся перевести средства с нашей биржи в наш холодный кошелек, потому что мы не кучка лохов, которые доверяют биржам, чтобы не потерять свои деньги.

Пример сделок

{         EXCHANGE       }{ WALLET }
  BTC => ETH => BAT => XRP => XRP
  own    buy    buy    buy    buy

Довольно просто начать, не так ли? Все, что нам нужно сделать, это записать несколько покупок для каждой транзакции. Мы собираемся перевести BTC в ETH, затем в BAT, затем в XRP-обмен на XRP-кошелек.

Первоначальные заказы

{ id: "A", fromSymbol: "BTC", toSymbol: "ETH", long: true, ... },
{ id: "B", fromSymbol: "ETH", toSymbol: "BAT", long: true, ... },
{ id: "C", fromSymbol: "BAT", toSymbol: "XRP", long: true, ... },
{ id: "D", fromSymbol: "XRP", toSymbol: "XRP", long: true, ... }
 {        EXCHANGE       }{ WALLET }
  BTC => ETH => BAT => XRP => XRP
  own    buy    buy    buy    buy
          A      B      C      D

Но это только первая половина нашей работы. Для каждой покупки также должна быть соответствующая продажа. Мы записали только наши покупки на каждой базовой учетной записи; нам также необходимо зарегистрировать продажу на каждом котируемом счете.

Реальность торговли

{                  EXCHANGE                 }{   WALLET   }
   BTC    =>   ETH    =>   BAT    =>   XRP    =>   XRP
own   sell  buy   sell  buy   sell  buy   sell  buy

Закрытие заказов

{ id: "W", fromSymbol: "ETH", toSymbol: "BTC", long: false, ... },
{ id: "X", fromSymbol: "BAT", toSymbol: "ETH", long: false, ... },
{ id: "Y", fromSymbol: "XRP", toSymbol: "BAT", long: false, ... },
{ id: "Z", fromSymbol: "XRP", toSymbol: "XRP", long: false, ... }
 {                  EXCHANGE                 }{   WALLET   }
   BTC    =>   ETH    =>   BAT    =>   XRP    =>   XRP
own   sell  buy   sell  buy   sell  buy   sell  buy
       W     A     X     B     Y     C     Z     D

Теперь, когда мы создали обе стороны каждой транзакции в нашей книге, нам нужно соединить их друг с другом. Мы собираемся создать много! Многое — это просто lotId и childId. Вот и все! Его единственная цель — подключение транзакций.

Соединение лотов

{ lotId: "W", childId: "A" },
{ lotId: "X", childId: "B" },
{ lotId: "Y", childId: "C" },
{ lotId: "Z", childId: "D" }

Но подождите, мы не подключили все транзакции! Наша цепочка неполная.

Незавершенная цепочка аудита

{                  EXCHANGE                 }{   WALLET   }
   BTC    =>   ETH    =>   BAT    =>   XRP    =>   XRP
own---sell--buy   sell--buy   sell--buy   sell--buy
       W     A     X     B     Y     C     Z     D

Посмотрите на эти пробелы! Также нам нужно подключать транзакции после того, как мы заходим в монету и до того, как выходим. Это позволит нам отслеживать наши затраты и налогооблагаемую прибыль вплоть до нашей первой транзакции.

Много работы!

{ lotId: "W", childId: "A" },
{ lotId: "A", childId: "X" },
{ lotId: "X", childId: "B" },
{ lotId: "B", childId: "Y" },
{ lotId: "Y", childId: "C" },
{ lotId: "C", childId: "Z" },
{ lotId: "Z", childId: "D" }
 {                  EXCHANGE                 }{   WALLET   }
   BTC    =>   ETH    =>   BAT    =>   XRP    =>   XRP
own---sell--buy---sell--buy---sell--buy---sell--buy
       W     A     X     B     Y     C     Z     D

Довольно круто, верно? Но что, если у нас есть частичное исполнение по некоторым сделкам? Как правило, вы можете просто использовать агрегированные суммы из исходного заказа, но мы работаем в условиях высокого риска и строгого соблюдения требований. Записывайте все!

Давайте представим, что наша сделка ETH/BAT на самом деле состояла из трех частичных исполнений.

{                  EXCHANGE                 }{   WALLET   }
   BTC    =>   ETH    =>   BAT    =>   XRP    =>   XRP
                           BAT
                           BAT
own---sell--buy---sell--buy---sell--buy---sell--buy
       W     A     X    BA     Y     C     Z     D
                        BB
                        BC

Думаете, вы знаете, как связать покупки BAT с соответствующими продажами?

Много движущихся частей

{ id: "W", fromSymbol: "ETH", toSymbol: "BTC", long: false, ... },
{ id: "A", fromSymbol: "BTC", toSymbol: "ETH", long: true, ... },
{ id: "X", fromSymbol: "BAT", toSymbol: "ETH", long: false, ... },
{ id: "BA", fromSymbol: "ETH", toSymbol: "BAT", long: true, ... },
{ id: "BB", fromSymbol: "ETH", toSymbol: "BAT", long: true, ... },
{ id: "BC", fromSymbol: "ETH", toSymbol: "BAT", long: true, ... },
{ id: "Y", fromSymbol: "XRP", toSymbol: "BAT", long: false, ... },
{ id: "C", fromSymbol: "BAT", toSymbol: "XRP", long: true, ... },
{ id: "Z", fromSymbol: "XRP", toSymbol: "XRP", long: false, ... },
{ id: "D", fromSymbol: "XRP", toSymbol: "XRP", long: true, ... }
{ lotId: "W", childId: "A" },
{ lotId: "A", childId: "X" },
{ lotId: "X", childId: "BA" },
{ lotId: "X", childId: "BB" },
{ lotId: "X", childId: "BC" },
{ lotId: "BA", childId: "Y" },
{ lotId: "BB", childId: "Y" },
{ lotId: "BC", childId: "Y" },
{ lotId: "Y", childId: "C" },
{ lotId: "C", childId: "Z" },
{ lotId: "Z", childId: "D" }
 {                  EXCHANGE                 }{   WALLET   }
   BTC    =>   ETH    =>   BAT    =>   XRP    =>   XRP
                           BAT
                           BAT
own---sell--buy---sell--buy---sell--buy---sell--buy
       W-----A-----X-----BA----Y-----C-----Z-----D
                   |-----BB----|
                    \----BC---/

Хорошо, а теперь самое сложное. Давайте представим, что у нас уже есть некоторые НДТ, которые мы купили на пике рынка, и мы хотим продать эти НДТ вместо только что купленных, чтобы мы могли потребовать убыток по нашим налогам.

Назовем первоначальную покупку BAT из пиковой транзакции P.

В США это разрешено правилом под названием «конкретная идентификация». Мы можем определить монеты, которые хотим продать, если примем решение в течение двух недель после размещения сделки. В противном случае мы должны придерживаться принципа «первым пришел — первым вышел» или «последний пришел — первым вышел». Мы не можем выбирать!

{                  EXCHANGE                 }{   WALLET   }
   BTC    =>   ETH    =>   BAT    =>   XRP    =>   XRP
                           BAT
                           BAT
own---sell--buy---sell--buy---sell--buy---sell--buy
       W-----A-----X-----BA    Y-----C-----Z-----D
                   |-----BB
                   |-----BC
...>---------------------P

Итак, мы решили, что предпочтем заявить о наших убытках по транзакции P. Мы удалили наши идентификаторы лотов для лотов, связывающих B-покупки с Y-продажами. Итак, теперь мы можем искать наши потерянные участки без идентификатора лота, и мы можем связать те, которые мы найдем, с P.

Тяжелая жизнь

{ lotId: "W", childId: "A" },
{ lotId: "A", childId: "X" },
{ lotId: "X", childId: "BA" },
{ lotId: "X", childId: "BB" },
{ lotId: "X", childId: "BC" },
{ lotId: "BA", childId: "Y" } -> { lotId: "P", childId: "Y" },
{ lotId: "BB", childId: "Y" } ->
{ lotId: "BC", childId: "Y" } -> { lotId: "BC", childId: "Y" },
{ lotId: "Y", childId: "C" },
{ lotId: "C", childId: "Z" },
{ lotId: "Z", childId: "D" }
 {                  EXCHANGE                 }{   WALLET   }
   BTC    =>   ETH    =>   BAT    =>   XRP    =>   XRP
                           BAT
                           BAT
own---sell--buy---sell--buy---sell--buy---sell--buy
       W-----A-----X----BA     Y-----C-----Z-----D
                   |----BB     |
                    \---BC-----|
...>--------------------P-----/

ВОЗ. Что там с БК? Что ж, похоже, у нас не осталось достаточно средств в P, чтобы покрыть все три сделки. Поэтому мы просто повторно подключили Y к BC, чтобы покрыть остальные средства. Итак, теперь и BC, и P являются родителями Y.

Мы проверим, что все учетные записи обнулены, прежде чем сохранить их в базе данных. Этого можно добиться, вытащив всю цепочку лотов и их дочерних элементов, а затем сложив вместе длинные суммы toSymbol и короткие суммы toSymbol.

Для каждой цепочки транзакций, где эта сумма не равна нулю, запишите оставшуюся сумму и символ. Затем проверьте текущий баланс на всех ваших адресах. Оставшееся значение должно равняться всем вашим балансам!

И это в значительной степени покрывает все крайние случаи. Думаете, вы готовы сами создать свою собственную бухгалтерскую книгу с двойной записью?