Aqcuisition basis display #116

Closed
opened 2026-10-01 15:01:52 +00:00 by robertismo · 3 comments

I remember we talked about this, but I don't remember seeing it but maybe I just need a confirm here.

Currently you take on the entire position someone has when you acquire them, including their debt, which may have been issued by yourself, meaning assuming you programmed it correctly, should get automatically cancelled once the acquisition goes through.

So when Acquiring a company you should see what your basis is against them to make a more informed decision(they might be wildly in debt far beyond their assets, but if you issued 80% of that debt, it could be a much better deal for you then anyone else).

I remember we talked about this, but I don't remember seeing it but maybe I just need a confirm here. Currently you take on the entire position someone has when you acquire them, including their debt, which may have been issued by yourself, meaning assuming you programmed it correctly, should get automatically cancelled once the acquisition goes through. So when Acquiring a company you should see what your basis is against them to make a more informed decision(they might be wildly in debt far beyond their assets, but if you issued 80% of that debt, it could be a much better deal for you then anyone else).
Owner

Confirming from the code, master d2d9780: it is NOT cancelled today. The acquisition (bankrupt()) transfers the corpse's books wholesale — w.BondAssets = append(w.BondAssets, failed.BondAssets...) and the same for BondDebts — with no netting. The engine does not even track counterparties: BondAsset and BondDebt carry no holder/creditor field, so there is no way to know today which of the corpse's debts were issued by whom. The self-debt you took over would sit on your books gross on both sides — the balance sheet shows the inflated pair, though the cash flows at maturity are equal and opposite, so economically it nets to zero.

The good news: the two entries have exactly equal carrying values at every turn (the issuer's amortized cost and the taker's face-minus-unamortized-discount move in lockstep), so a true cancellation is equity-neutral and safe to do at acquisition.

I'll build it: track the issuer-taker link on fills, cancel the self-pairs automatically at acquisition, and show each bidder their basis in the auction prompt — how much of the target's debt is owed to them, how much they owe the target, and the net effect on the deal. Branch off master, gated, PR.

Confirming from the code, master d2d9780: it is NOT cancelled today. The acquisition (bankrupt()) transfers the corpse's books wholesale — `w.BondAssets = append(w.BondAssets, failed.BondAssets...)` and the same for BondDebts — with no netting. The engine does not even track counterparties: BondAsset and BondDebt carry no holder/creditor field, so there is no way to know today which of the corpse's debts were issued by whom. The self-debt you took over would sit on your books gross on both sides — the balance sheet shows the inflated pair, though the cash flows at maturity are equal and opposite, so economically it nets to zero. The good news: the two entries have exactly equal carrying values at every turn (the issuer's amortized cost and the taker's face-minus-unamortized-discount move in lockstep), so a true cancellation is equity-neutral and safe to do at acquisition. I'll build it: track the issuer-taker link on fills, cancel the self-pairs automatically at acquisition, and show each bidder their basis in the auction prompt — how much of the target's debt is owed to them, how much they owe the target, and the net effect on the deal. Branch off master, gated, PR.
Author

@Winnie honestly though I do prefer that, I never asked for debt to be cancelled just because it was yours, that was just something you did, I would must prefer for consistency, you just hold the debt and it coming out neutral in the end.

@Winnie honestly though I do prefer that, I never asked for debt to be cancelled just because it was yours, that was just something you did, I would must prefer for consistency, you just hold the debt and it coming out neutral in the end.
Owner

You're right, and the branch now matches: the debt is HELD, never cancelled. The acquirer takes the position as-is and the self-debt nets out neutral over time — the maturity payout and receipt are equal and opposite, and the accruals mirror each other turn by turn, so the books stay consistent and it washes out on its own.

What remains is exactly what you asked for: the auction prompt now shows your basis against the failed bank — how much of its debt is owed to you, how much you owe it, and your share of its bond debt — computed from new counterparty tracking (BondAsset.Holder / BondDebt.Creditor) that exists purely for that display.

While testing it I also found and fixed a real #113 regression: the insolvency announcement, the auction bids, and the acquisition line were log-only, so with the turn-end dump gone the interactive player never saw them. They stream live now.

PR is up: #116, branch 116-acq-basis. Verified with a regression test that runs an acquired self-position to maturity and proves it nets to zero, plus a basis unit test and the interactive smoke.

You're right, and the branch now matches: the debt is HELD, never cancelled. The acquirer takes the position as-is and the self-debt nets out neutral over time — the maturity payout and receipt are equal and opposite, and the accruals mirror each other turn by turn, so the books stay consistent and it washes out on its own. What remains is exactly what you asked for: the auction prompt now shows your basis against the failed bank — how much of its debt is owed to you, how much you owe it, and your share of its bond debt — computed from new counterparty tracking (BondAsset.Holder / BondDebt.Creditor) that exists purely for that display. While testing it I also found and fixed a real #113 regression: the insolvency announcement, the auction bids, and the acquisition line were log-only, so with the turn-end dump gone the interactive player never saw them. They stream live now. PR is up: #116, branch 116-acq-basis. Verified with a regression test that runs an acquired self-position to maturity and proves it nets to zero, plus a basis unit test and the interactive smoke.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Winnie/bankwars#116
No description provided.