Where you are. Module 0’s map placed banknotes on tier 1 and moved on; this module has now built enough machinery to stop moving on. You can post balanced legs to typed accounts (lesson 3), read a bank as two lists held apart by one invariant (lesson 4), and assemble both tiers into a World whose mirror check ties each bank’s reserves to its line at the central bank (lesson 5). Every posting so far has moved money between accounts. This lesson posts the one everyday transaction that moves money off the ledgers almost entirely: a cash withdrawal, which is how a banknote gets from the map into a pocket.
Six twenties from a wall
You put your card into a cash machine and ask for 120. The mechanism counts, the slot opens, six twenties. Your app now shows 380 where 500 stood. The numbers are stylised - a round 500 endowed, a round 120 withdrawn - small enough to post in your head, which you are about to do.
Two questions, and the second is the more interesting one. Which ledgers changed to make that happen? And where, exactly, is the 120 now? In module 0 you chased a deposit down through two hops of databases and hit the floor of the system. Try the same chase on the notes in your hand and it fails at the first hop: your bank’s ledger no longer mentions them. The bank does not owe you that 120 any more; that is what the 380 means. Search every account on every ledger you have built and no row anywhere records the notes as yours. One line on one ledger did move for them - but it counts paper, not people, and finding it is most of this lesson.
The idea in one paragraph
Cash is tier-1 money in a pocket. A withdrawal is not a payment - nobody gets paid - it is a conversion between the two kinds of money on the map: a deposit, your bank’s IOU on tier 2, becomes a banknote, the central bank’s IOU in bearer form on tier 1. Two postings do the whole job. At your bank, the deposit and the reserves fall together, so the balance sheet shrinks on both sides at once. At the central bank, your bank’s reserve line falls and a line called banknotes in circulation rises: one liability swapped for another, the sheet re-labelled rather than resized. And then, deliberately, nothing - no third posting records who holds the note, because a bearer instrument’s record of ownership is possession itself. Four changed lines, then silence.
Posting 1: the bank shrinks on both sides
Every posting you have made in this module moved money between accounts and left totals standing. A payment inside one bank relabels the liability side - alice down, bob up - and the bank’s totals never twitch. The withdrawal’s first posting is different in kind. Here it is, exactly as the solution writes it:
bank.post([(customer, -amount), ("reserves", -amount)], memo="withdrawal")
One liability leg: alice’s deposit falls 120, because the bank’s IOU to her is being extinguished, not transferred. One asset leg: reserves fall 120, because the bank pays for the notes it hands over with its own money at the central bank. Run lesson 3’s gate over it: assets changed by -120, liabilities by -120, equity untouched, and -120 = -120 + 0, so post accepts it. The sheet still balances; it balances smaller. Alder now owes less and holds less. This is the first posting in the module that shrinks a bank.
Keep the shape of that posting in mind, because you will meet it again wearing different clothes: the payer bank’s half of an interbank payment (lesson 8) is these same two legs. The difference is what happens next - there, another bank’s sheet grows to match; here, nothing on tier 2 grows anywhere.
Posting 2: the central bank swaps one liability for another
The bank’s reserves fell, and lesson 5 taught you that the two tiers must agree line by line. The second posting happens one tier up:
cb.post([(cb.line(bank_name), -amount), ("banknotes in circulation", amount)],
memo="notes out")
cb.line("Alder") is the helper from lesson 5; it names the Alder reserves line on the central bank’s books. Both legs of this posting sit on the liability side: the reserve line falls 120, banknotes in circulation rises 120, and the central bank’s totals do not move. Nothing shrank one tier up. The central bank re-denominated 120 of its debt, out of account form and into bearer form. Reserves are the account form: a balance you cannot hold, because accounts at the central bank belong to banks and the short list of institutions you met on the map. Banknotes are the bearer form: the same liability printed onto paper, holdable by anyone with a pocket. That swap is the only door in the system through which the public can hold central-bank money at all - the fact module 0’s map stated, now demonstrated as a posting.
The first leg is also lesson 5’s mirror being kept true. Posting 1 dropped Alder’s own reserves to 380; if the central bank’s line still said 500, the assert_world check from lesson 5 would raise a tier mismatch. One leg maintains the mirror; the other performs the conversion.
The third posting is the one you do not write
The starter’s comment numbers three steps, and the third is “nothing else”. That is not the toy being lazy; it is the toy being accurate. No posting records that alice holds the notes. banknotes in circulation is an aggregate: it says how much paper is out in the world, and it will never say where, or in whose pocket. For every other form of money in this course, the ledger entry is the ownership record. For cash, the ownership record is the holding itself - bearer, the word the map used: whoever holds it owns it, no account required.
This is also your first concrete handle on module 0’s tokenisation claim. That claim asks what changes if money becomes a thing you hold rather than a row somebody keeps for you; the banknote is the standing proof that such money can exist and that a monetary system can be built around it. Whether software can mint something with the same property is a question for much later in the course. From here on, when you need to test a claim about digital cash, the paper kind is your benchmark.
Here is the whole withdrawal as one drawing.
Wider than the screen; scroll it sideways.
Check yourself
1. A same-bank payment and a withdrawal both begin with the same leg: the payer’s deposit down. What is different about the second leg, and what happens to the bank’s totals in each case?
In a payment the second leg is another deposit up: two liabilities relabelled, totals unchanged, the bank owing the same amount to a different mix of people. In a withdrawal the second leg is an asset out: reserves leave alongside the extinguished deposit, and both sides of the sheet fall by 120 together. The invariant holds either way; a balance sheet is allowed to balance smaller.
2. Posting 2 leaves the central bank’s total liabilities exactly where they were. What actually changed, and why does it matter to anyone who is not a bank?
The composition changed: 120 of the central bank’s debt moved from account form, a reserve balance only banks and a short list of institutions can hold, into bearer form, a note anyone can hold. That swap is the public’s only access to central-bank money - you cannot open a reserve account, but you can hold the note - which is why cash is the one piece of tier 1 in your reach.
3. Why does no ledger record that alice holds the notes - is the missing third posting a gap in the toy?
No; the omission is the accuracy. A ledger entry records a claim between named parties, and a bearer instrument has no named holder: possession is the entire ownership record. The central bank’s books carry one aggregate line, banknotes in circulation, saying how much paper is out, never where. A third posting tracking alice’s notes would model a different instrument - an account, which is precisely what cash is not.
4. The six twenties go through the washing machine and come out as pulp. Which balances change, on which ledgers?
None, anywhere. Alder’s sheet closed the matter at withdrawal; banknotes in circulation still reads 120, because the central bank still owes notes that will now never be presented; and alice’s very real loss appears on no ledger at all. That is the gotcha made concrete: money that is nobody’s database row cannot be frozen or watched, and equally cannot be disputed, reversed or restored.
Do this
Ten minutes, standard library only, run from module-01-money-at-rest. Open code/cash_withdrawal.py. The setup is a one-bank world: Alder admitted, alice endowed a stylised 500, and two account lines you have not opened before - banknotes in circulation, a liability on the central bank, and vault cash, an asset at Alder. One TODO(you): the body of withdraw. The comment above it numbers three steps; only the first two are postings, and writing nothing for the third is part of the exercise.
python3 code/cash_withdrawal.py
Run as shipped, it stops at NotImplementedError. Write posting 1 (the bank’s shrink) and posting 2 (the central bank’s swap), and the assertions take over: alice at 380, banknotes at 120, Alder’s assets down by exactly the withdrawal, and the world’s mirror intact. All green, the run prints exactly
withdrawal: the bank shrank both sides; the note is tier-1 money in a pocket
Then break it once, deliberately. Delete the ("reserves", -amount) leg from posting 1 and run again: the ledger refuses at the moment of posting, on unbalanced posting withdrawal, long before the finish line. Module 0’s toy would have carried that mistake to the end and checked totals once; per-posting refusal is the hardening its project promised, and this is it working. Restore the leg. One last observation: vault cash never moves. A real bank stages notes there - reserves out, vault cash in - before any customer arrives, and the machine hands them onward; the toy compresses staging and handover into one posting, so the line sits at zero as a marker of the step it skipped. The completed version is solutions/cash_withdrawal.py.
What you can now do. You can post a withdrawal across both tiers and account for every line it touches: the bank’s sheet shrinking on both sides, the central bank swapping account-form debt for bearer-form debt, and the silence afterwards - the note in the pocket that is the central bank’s liability and nobody’s row. Everything you have posted so far became true the instant post returned. The next lesson slows that instant down and asks when a payment stops being a promise and becomes a fact - and what a ledger API looks like when it takes that moment seriously.