Skip to content

Context-Based Balance Tracking Pattern#

Example of testing a token contract with a context-based balance tracking pattern.

class BalanceTracker:
    def track_transfer(self, token, from_: Address, to: Address,
                      amount: int) -> tuple[int, int]:
        before_from = token.balanceOf(from_)
        before_to = token.balanceOf(to)

        yield

        after_from = token.balanceOf(from_)
        after_to = token.balanceOf(to)
        return (before_from - after_from, after_to - before_to)

class BalanceTest(FuzzTest):
    tracker: BalanceTracker

    @flow()
    def flow_transfer(self):
        with self.tracker.track_transfer(self.token, sender, receiver,
                                       amount) as changes:
            self.token.transfer(receiver, amount, from_=sender)

        delta_from, delta_to = changes
        assert delta_from == amount
        assert delta_to == amount