<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_distributable( sender: NettingChannelEndState, receiver: NettingChannelEndState, ) -> TokenAmount: """Return the amount of tokens that can be used by the `sender`. The returned value is limited to a UINT256, since that is the representation used in the smart contracts and we cannot use a larger value. The limit is enforced on transferred_amount + locked_amount to avoid overflows. This is an additional security check. """

    _, _, transferred_amount, locked_amount = get_current_balanceproof(sender)

    distributable = get_balance(sender, receiver) - get_amount_locked(sender)

    overflow_limit = max(
        UINT256_MAX - transferred_amount - locked_amount,
        0,
    )

    return TokenAmount(min(overflow_limit, distributable))