Get token balance of an address

How can I get the token balance of an address? If this is not possible, how can I set up a token so that I can read balances on chain?

Let’s say I have a maximum of 20 users on chain (stored onchain in vec) and I want to distribute 500 tokens in rewards to all the users. However, I want to distribute these rewards proportionally to each user’s balance. How could i do this?
Could I use a closed-loop token to track transfers and mints?
Any code examples I could be pointed to?

It has to be trustless (cannot just pass user balances obtained offchain to a method)

Thanks!