# BackingManager: rTokens might not be redeemable when protocol is paused due to missing token allowance

BackingManager.grantRTokenAllowance is gated by notPausedOrFrozen, so if an ERC20 was never allowance-granted before a pause, RToken.redeem reverts, blocking redemptions during pause.

- Payout: Contest reward
- Severity: medium
- Program: Reserve
- Credited: HollaDieWaldfee
- Disclosed: 2023-04-27
- Write-up quality: 6/10
- Original: https://github.com/code-423n4/2023-01-reserve-findings/issues/16
- Library page: https://bugbountylibrary.com/r/c4%3A2023-01-reserve%3AM-25
- Tags: domain:web3 impact:dos kind:contest platform:code4rena sev:medium tech:evm tech:solidity technique:source-review vuln:access-control vuln:business-logic

**Target:** BackingManager / RToken redemption allowance (Solidity contracts)
**Root cause:** grantRTokenAllowance uses notPausedOrFrozen while RToken.redeem is allowed during pause; redemption needs the allowance to have been granted beforehand, which cannot happen once paused.
**Steps:**
1. Deploy rToken backed by AToken; issue rToken so AToken sits in BackingManager.
2. Enter paused state before any redemption, so grantRTokenAllowance(AToken) was never called.
3. Call `RToken.redeem(...)` while paused; transferFrom BackingManager fails due to zero allowance.
4. grantRTokenAllowance cannot be called because of `notPausedOrFrozen`, so redemption stays blocked until unpause.
**How found:** Read system-design docs stating redeem is allowed while paused, then traced RToken.redeem's dependency on BackingManager.grantRTokenAllowance and noticed the modifier mismatch (notPausedOrFrozen vs redeem's pause exemption).
**Insight:** When a protocol documents which functions remain callable during pause, enumerate every external call those functions make and check each callee's pause modifier — a prerequisite setter gated by pause can silently break the exempted path.
