MediumStateful DesignPython 3

Idempotent Ledger

Apply account mutations exactly once while preserving retry-safe request semantics.

30m3 sample tests5 hidden tests

Implement a small account ledger that applies deposits and withdrawals exactly once per request ID.

Requirements

  • Define Ledger.
  • apply(request_id, account_id, amount) applies amount to the account and returns the resulting balance.
  • Positive amounts are deposits. Negative amounts are withdrawals.
  • Request IDs are global to the ledger (not scoped per account).
  • A duplicate request_id returns the same result as the first successful application and must not apply twice.
  • On a duplicate request_id, ignore the retry payload (account_id / amount) and return the stored result.
  • Only successful applications are recorded for idempotency. Failed overdrafts are not recorded, so a later retry with the same id may still succeed after the balance changes.
  • Withdrawals that would make the balance negative raise ValueError.
  • balance(account_id) returns the current account balance, defaulting to zero.

Example

python
1ledger = Ledger() 2assert ledger.apply("d1", "acct", 100) == 100 3assert ledger.apply("d1", "acct", 100) == 100 4assert ledger.apply("w1", "acct", -30) == 70 5assert ledger.balance("acct") == 70

Constraints

  • Use standard-library Python only.
  • Keep all state in memory.

Editor