```python
def tally_ballots(events: list) -> dict:
    vote_counts = {}
    standing_votes = {}

    for event in events:
        if event["type"] == "cast":
            voter = event["voter"]
            option = event["option"]
            if voter in standing_votes:
                raise ValueError("Voter already has a standing vote")
            standing_votes[voter] = option
            vote_counts[option] = vote_counts.get(option, 0) + 1
        elif event["type"] == "retract":
            voter = event["voter"]
            if voter not in standing_votes:
                raise ValueError("Voter has no standing vote")
            option = standing_votes.pop(voter)
            vote_counts[option] -= 1
            if vote_counts[option] == 0:
                del vote_counts[option]
        elif event["type"] == "close":
            break
        else:
            raise ValueError("Invalid event type")

    return vote_counts
```