tbtc - liquidationInitiator can block purchaseSignerBondsAtAuction indefinitely
When reporting a fraudulent proof the deposits `liquidationInitiator` is set to the entity reporting and proofing the fraud. The deposit that is in a `*_liquidation_in_progress` state can be bought by anyone at an auction calling `purchaseSignerBondsAtAuction`.\\nInstead of receiving a share of the funds the `liquidationInitiator` can decide to intentionally reject the funds by raising an exception causing `initiator.transfer(contractEthBalance)` to throw, blocking the auction and forcing the liquidation to fail. The deposit will stay in one of the `*_liquidation_in_progress` states.\\n```\\n/// @notice Closes an auction and purchases the signer bonds. Payout to buyer, funder, then signers if not fraud\\n/// @dev For interface, reading auctionValue will give a past value. the current is better\\n/// @param \\_d deposit storage pointer\\nfunction purchaseSignerBondsAtAuction(DepositUtils.Deposit storage \\_d) public {\\n    bool \\_wasFraud = \\_d.inFraudLiquidationInProgress();\\n    require(\\_d.inSignerLiquidation(), "No active auction");\\n\\n    \\_d.setLiquidated();\\n    \\_d.logLiquidated();\\n\\n    // send the TBTC to the TDT holder. If the TDT holder is the Vending Machine, burn it to maintain the peg.\\n    address tdtHolder = \\_d.depositOwner();\\n\\n    TBTCToken \\_tbtcToken = TBTCToken(\\_d.TBTCToken);\\n\\n    uint256 lotSizeTbtc = \\_d.lotSizeTbtc();\\n    require(\\_tbtcToken.balanceOf(msg.sender) >= lotSizeTbtc, "Not enough TBTC to cover outstanding debt");\\n\\n    if(tdtHolder == \\_d.VendingMachine){\\n        \\_tbtcToken.burnFrom(msg.sender, lotSizeTbtc);  // burn minimal amount to cover size\\n    }\\n    else{\\n        \\_tbtcToken.transferFrom(msg.sender, tdtHolder, lotSizeTbtc);\\n    }\\n\\n    // Distribute funds to auction buyer\\n    uint256 \\_valueToDistribute = \\_d.auctionValue();\\n    msg.sender.transfer(\\_valueToDistribute);\\n\\n    // Send any TBTC left to the Fee Rebate Token holder\\n    \\_d.distributeFeeRebate();\\n\\n    // For fraud, pay remainder to the liquidation initiator.\\n    // For non-fraud, split 50-50 between initiator and signers. if the transfer amount is 1,\\n    // division will yield a 0 value which causes a revert; instead, \\n    // we simply ignore such a tiny amount and leave some wei dust in escrow\\n    uint256 contractEthBalance = address(this).balance;\\n    address payable initiator = \\_d.liquidationInitiator;\\n\\n    if (initiator == address(0)){\\n        initiator = address(0xdead);\\n    }\\n    if (contractEthBalance > 1) {\\n        if (\\_wasFraud) {\\n            initiator.transfer(contractEthBalance);\\n        } else {\\n            // There will always be a liquidation initiator.\\n            uint256 split = contractEthBalance.div(2);\\n            \\_d.pushFundsToKeepGroup(split);\\n            initiator.transfer(split);\\n        }\\n    }\\n}\\n```\\n
Use a pull vs push funds pattern or use `address.send` instead of `address.transfer` which might leave some funds locked in the contract if it fails.
```\\n/// @notice Closes an auction and purchases the signer bonds. Payout to buyer, funder, then signers if not fraud\\n/// @dev For interface, reading auctionValue will give a past value. the current is better\\n/// @param \\_d deposit storage pointer\\nfunction purchaseSignerBondsAtAuction(DepositUtils.Deposit storage \\_d) public {\\n    bool \\_wasFraud = \\_d.inFraudLiquidationInProgress();\\n    require(\\_d.inSignerLiquidation(), "No active auction");\\n\\n    \\_d.setLiquidated();\\n    \\_d.logLiquidated();\\n\\n    // send the TBTC to the TDT holder. If the TDT holder is the Vending Machine, burn it to maintain the peg.\\n    address tdtHolder = \\_d.depositOwner();\\n\\n    TBTCToken \\_tbtcToken = TBTCToken(\\_d.TBTCToken);\\n\\n    uint256 lotSizeTbtc = \\_d.lotSizeTbtc();\\n    require(\\_tbtcToken.balanceOf(msg.sender) >= lotSizeTbtc, "Not enough TBTC to cover outstanding debt");\\n\\n    if(tdtHolder == \\_d.VendingMachine){\\n        \\_tbtcToken.burnFrom(msg.sender, lotSizeTbtc);  // burn minimal amount to cover size\\n    }\\n    else{\\n        \\_tbtcToken.transferFrom(msg.sender, tdtHolder, lotSizeTbtc);\\n    }\\n\\n    // Distribute funds to auction buyer\\n    uint256 \\_valueToDistribute = \\_d.auctionValue();\\n    msg.sender.transfer(\\_valueToDistribute);\\n\\n    // Send any TBTC left to the Fee Rebate Token holder\\n    \\_d.distributeFeeRebate();\\n\\n    // For fraud, pay remainder to the liquidation initiator.\\n    // For non-fraud, split 50-50 between initiator and signers. if the transfer amount is 1,\\n    // division will yield a 0 value which causes a revert; instead, \\n    // we simply ignore such a tiny amount and leave some wei dust in escrow\\n    uint256 contractEthBalance = address(this).balance;\\n    address payable initiator = \\_d.liquidationInitiator;\\n\\n    if (initiator == address(0)){\\n        initiator = address(0xdead);\\n    }\\n    if (contractEthBalance > 1) {\\n        if (\\_wasFraud) {\\n            initiator.transfer(contractEthBalance);\\n        } else {\\n            // There will always be a liquidation initiator.\\n            uint256 split = contractEthBalance.div(2);\\n            \\_d.pushFundsToKeepGroup(split);\\n            initiator.transfer(split);\\n        }\\n    }\\n}\\n```\\n