Skip to content

Multi-Token Accounting#

Example of testing a contract that tracks multiple tokens and users.

class TokenAccounting:
    balances: dict[Address, dict[Address, int]]  # token -> user -> amount

    def track_token(self, token: Address, user: Address, amount: int):
        if token not in self.balances:
            self.balances[token] = {}
        if user not in self.balances[token]:
            self.balances[token][user] = 0

        self.balances[token][user] += amount

    @invariant()
    def invariant_token_accounting(self):
        for token, users in self.balances.items():
            for user, amount in users.items():
                assert self.tokens[token].balanceOf(user) == amount