contract BaseOverdrawManagement is EternalStorage {
    event MediatorAmountLimitExceeded(address recipient, uint256 value, bytes32 indexed messageId);
    event AmountLimitExceeded(address recipient, uint256 value, bytes32 indexed transactionHash, bytes32 messageId);
    event AssetAboveLimitsFixed(bytes32 indexed messageId, uint256 value, uint256 remaining);

    bytes32 internal constant OUT_OF_LIMIT_AMOUNT = 0x145286dc85799b6fb9fe322391ba2d95683077b2adf34dd576dedc437e537ba7; // keccak256(abi.encodePacked("outOfLimitAmount"))

    /**
     * @dev Total amount coins/tokens that were bridged from the other side and are out of execution limits.
     * @return total amount of all bridge operations above limits.
     */
    function outOfLimitAmount() public view returns (uint256) {
        return uintStorage[OUT_OF_LIMIT_AMOUNT];
    }

    /**
     * @dev Internal function for updating a total amount that is out of execution limits.
     * @param _value new value for the total amount of bridge operations above limits.
     */
    function setOutOfLimitAmount(uint256 _value) internal {
        uintStorage[OUT_OF_LIMIT_AMOUNT] = _value;
    }

    /**
     * @dev Internal function for retrieving information about out-of-limits bridge operation.
     * @param _messageId id of the message that cause above-limits error.
     * @return (address of the receiver, amount of coins/tokens in the bridge operation)
     */
    function txAboveLimits(bytes32 _messageId) internal view returns (address recipient, uint256 value) {
        recipient = addressStorage[keccak256(abi.encodePacked("txOutOfLimitRecipient", _messageId))];
        value = uintStorage[keccak256(abi.encodePacked("txOutOfLimitValue", _messageId))];
    }

    /**
     * @dev Internal function for updating information about tbe out-of-limits bridge operation.
     * @param _recipient receiver specified in the bridge operation.
     * @param _value amount of coins/tokens inside the bridge operation.
     * @param _messageId id of the message that cause above-limits error.
     */
    function setTxAboveLimits(address _recipient, uint256 _value, bytes32 _messageId) internal {
        addressStorage[keccak256(abi.encodePacked("txOutOfLimitRecipient", _messageId))] = _recipient;
        setTxAboveLimitsValue(_value, _messageId);
    }

    /**
     * @dev Internal function for updating information about the remaining value of out-of-limits bridge operation.
     * @param _value amount of coins/tokens inside the bridge operation.
     * @param _messageId id of the message that cause above-limits error.
     */
    function setTxAboveLimitsValue(uint256 _value, bytes32 _messageId) internal {
        uintStorage[keccak256(abi.encodePacked("txOutOfLimitValue", _messageId))] = _value;
    }

    /* solcov ignore next */
    function fixAssetsAboveLimits(bytes32 messageId, bool unlockOnForeign, uint256 valueToUnlock) external;
}
/**
 * @title BaseOverdrawManagement
 * @dev This contract implements basic functionality for tracking execution bridge operations that are out of limits.
 */
function outOfLimitAmount() public view returns (uint256) {
    return uintStorage[OUT_OF_LIMIT_AMOUNT];
}

/**
 * @dev Total amount coins/tokens that were bridged from the other side and are out of execution limits.
 * @return total amount of all bridge operations above limits.
 */