I am writing a program that would monitor changes in balance of a set of Tezos addresses. I did the same for UTXO based coins, and the logic was pretty simple. All of the changes were directly recorded in blocks. I have just started learning Tezos, so I may miss pretty obvious things.
So which operations can change the balance of a Tezos address? Is just retrieving blocks from JSON-RPC enough to see all the changes, or is something like additional processing of smart contracts required?