contract RecoveryProxy is BimodalProxy {
  using SafeMathLib256 for uint256;

  modifier onlyWhenContractPunished() {
    require(
      hasOutstandingChallenges() || hasMissedCheckpointSubmission(),
      'f');
    _;
  }

  // =========================================================================
  function recoverOnlyParentChainFunds(
    ERC20 token,
    address holder
  )
    public
    onlyWhenContractPunished()
    returns (uint256 reclaimed)
  {
    reclaimed = RecoveryLib.recoverOnlyParentChainFunds(
      ledger,
      token,
      holder);
  }

  function recoverAllFunds(
    ERC20 token,
    address holder,
    bytes32[2] checksums,
    uint64 trail,
    bytes32[] allotmentChain,
    bytes32[] membershipChain,
    uint256[] values,
    uint256[2] LR, // solhint-disable-line func-param-name-mixedcase
    uint256[3] dummyPassiveMark
  )
    public
    onlyWhenContractPunished()
    returns (uint256 recovered)
  {
    recovered = RecoveryLib.recoverAllFunds(
      ledger,
      token,
      holder,
      checksums,
      trail,
      allotmentChain,
      membershipChain,
      values,
      LR,
      dummyPassiveMark);
  }
}
function recoverOnlyParentChainFunds(
  ERC20 token,
  address holder
)
  public
  onlyWhenContractPunished()
  returns (uint256 reclaimed)
{
  reclaimed = RecoveryLib.recoverOnlyParentChainFunds(
    ledger,
    token,
    holder);
}

// =========================================================================