# AUTOGENERATED DO NOT EDIT

import re
from typing import Callable, Dict, List, Union, Optional
from coinmetrics._schema_base import BOOLEAN, DATE_TIME, DECIMAL, INT, ListDataType, ObjectDataType, STRING, DataType

DynamicSchemaBuilder = Callable[[str, Dict[str, Union[str, List[str]]], ListDataType], Union[ListDataType, ObjectDataType]]

ENDPOINTS = {
  '/blockchain-metadata/locations': ListDataType(
    ObjectDataType({
      'location': STRING,
    })
  ),
  '/blockchain-metadata/owners': ListDataType(
    ObjectDataType({
      'owner_name': STRING,
      'type': STRING,
    })
  ),
  '/blockchain-metadata/tagged-entities': ListDataType(
    ObjectDataType({
      'entity': STRING,
      'owner_name': STRING.nullable(),
      'tag': STRING,
      'location': STRING,
      'type': STRING,
      'tagger_type': STRING,
      'tagger_method': STRING,
      'start_time': STRING.nullable(),
      'end_time': STRING.nullable(),
      'start_block_height': STRING.nullable(),
      'end_block_height': STRING.nullable(),
      'start_block_hash': STRING.nullable(),
      'end_block_hash': STRING.nullable(),
    })
  ),
  '/blockchain-metadata/tags': ListDataType(
    ObjectDataType({
      'tag': STRING,
      'type': STRING,
      'description': STRING.nullable(),
    })
  ),
  '/blockchain-v2/{asset}/accounts': ListDataType(
    ObjectDataType({
      'account': STRING,
      'type': STRING,
      'balance': DECIMAL.nullable(),
      'n_debits': INT.nullable(),
      'n_credits': INT.nullable(),
      'creation_height': INT,
      'creation_block_hash': STRING,
      'creation_time': DATE_TIME,
      'creation_chain_sequence_number': INT,
      'last_chain_sequence_number': INT.nullable(),
      'last_debit_height': INT.nullable(),
      'last_credit_height': INT.nullable(),
    })
  ),
  '/blockchain-v2/{asset}/accounts/{account}/balance-updates': ListDataType(
    ObjectDataType({
      'chain_sequence_number': INT,
      'account': STRING,
      'account_creation_height': INT,
      'change': DECIMAL,
      'rebasing_numerator': DECIMAL.nullable(),
      'rebasing_denominator': DECIMAL.nullable(),
      'rebasing_rounding_mode': STRING.nullable(),
      'previous_balance': DECIMAL,
      'new_balance': DECIMAL,
      'transaction_sequence_number': INT,
      'n_debits': INT,
      'n_credits': INT,
      'previous_debit_height': INT.nullable(),
      'previous_credit_height': INT.nullable(),
      'previous_chain_sequence_number': INT.nullable(),
      'sub_account': ObjectDataType({
        'sub_account': STRING.nullable(),
        'previous_balance': DECIMAL.nullable(),
        'new_balance': DECIMAL.nullable(),
        'n_debits': INT.nullable(),
        'n_credits': INT.nullable(),
        'previous_credit_height': INT.nullable(),
        'previous_debit_height': INT.nullable(),
        'previous_chain_sequence_number': INT.nullable(),
        'total_received': DECIMAL.nullable(),
        'total_sent': DECIMAL.nullable(),
        'creation_height': INT.nullable(),
      }).nullable(),
      'stale': STRING.nullable(),
      'block_hash': STRING,
      'height': INT,
      'consensus_time': DATE_TIME,
      'txid': STRING.nullable(),
      'credit': BOOLEAN,
      'total_received': DECIMAL,
      'total_sent': DECIMAL,
    })
  ),
  '/blockchain-v2/{asset}/balance-updates': ListDataType(
    ObjectDataType({
      'chain_sequence_number': INT,
      'account': STRING,
      'account_creation_height': INT,
      'change': DECIMAL,
      'rebasing_numerator': DECIMAL.nullable(),
      'rebasing_denominator': DECIMAL.nullable(),
      'rebasing_rounding_mode': STRING.nullable(),
      'previous_balance': DECIMAL,
      'new_balance': DECIMAL,
      'transaction_sequence_number': INT,
      'n_debits': INT,
      'n_credits': INT,
      'previous_debit_height': INT.nullable(),
      'previous_credit_height': INT.nullable(),
      'previous_chain_sequence_number': INT.nullable(),
      'sub_account': ObjectDataType({
        'sub_account': STRING.nullable(),
        'previous_balance': DECIMAL.nullable(),
        'new_balance': DECIMAL.nullable(),
        'n_debits': INT.nullable(),
        'n_credits': INT.nullable(),
        'previous_credit_height': INT.nullable(),
        'previous_debit_height': INT.nullable(),
        'previous_chain_sequence_number': INT.nullable(),
        'total_received': DECIMAL.nullable(),
        'total_sent': DECIMAL.nullable(),
        'creation_height': INT.nullable(),
      }).nullable(),
      'stale': STRING.nullable(),
      'block_hash': STRING,
      'height': INT,
      'consensus_time': DATE_TIME,
      'txid': STRING.nullable(),
      'credit': BOOLEAN,
      'total_received': DECIMAL,
      'total_sent': DECIMAL,
    })
  ),
  '/blockchain-v2/{asset}/blocks': ListDataType(
    ObjectDataType({
      'block_hash': STRING,
      'parent_block_hash': STRING.nullable(),
      'height': INT,
      'consensus_time': DATE_TIME,
      'miner_time': DATE_TIME,
      'nonce': STRING.nullable(),
      'extra_data': STRING.nullable(),
      'n_transactions': INT,
      'n_balance_updates': INT,
      'version': STRING.nullable(),
      'difficulty': DECIMAL.nullable(),
      'physical_size': INT.nullable(),
      'consensus_size': INT.nullable(),
      'consensus_size_limit': INT.nullable(),
      'stale': STRING.nullable(),
    })
  ),
  '/blockchain-v2/{asset}/blocks/{block_hash}': ObjectDataType({
    'block_hash': STRING,
    'parent_block_hash': STRING.nullable(),
    'height': INT,
    'consensus_time': DATE_TIME,
    'miner_time': DATE_TIME,
    'nonce': STRING.nullable(),
    'extra_data': STRING.nullable(),
    'n_transactions': INT,
    'n_balance_updates': INT,
    'version': STRING.nullable(),
    'difficulty': DECIMAL.nullable(),
    'physical_size': INT.nullable(),
    'consensus_size': INT.nullable(),
    'consensus_size_limit': INT.nullable(),
    'stale': STRING.nullable(),
    'transactions': ListDataType(
      ObjectDataType({
        'txid': STRING,
        'consensus_time': DATE_TIME,
        'miner_time': DATE_TIME.nullable(),
        'tx_position': INT,
        'min_chain_sequence_number': INT.nullable(),
        'max_chain_sequence_number': INT.nullable(),
        'n_balance_updates': INT,
        'amount': DECIMAL,
        'stale': STRING.nullable(),
        'balance_updates': ListDataType(
          ObjectDataType({
            'chain_sequence_number': INT,
            'account': STRING,
            'account_creation_height': INT,
            'change': DECIMAL,
            'rebasing_numerator': DECIMAL.nullable(),
            'rebasing_denominator': DECIMAL.nullable(),
            'rebasing_rounding_mode': STRING.nullable(),
            'previous_balance': DECIMAL,
            'new_balance': DECIMAL,
            'transaction_sequence_number': INT,
            'n_debits': INT,
            'n_credits': INT,
            'previous_debit_height': INT.nullable(),
            'previous_credit_height': INT.nullable(),
            'previous_chain_sequence_number': INT.nullable(),
            'sub_account': ObjectDataType({
              'sub_account': STRING.nullable(),
              'previous_balance': DECIMAL.nullable(),
              'new_balance': DECIMAL.nullable(),
              'n_debits': INT.nullable(),
              'n_credits': INT.nullable(),
              'previous_credit_height': INT.nullable(),
              'previous_debit_height': INT.nullable(),
              'previous_chain_sequence_number': INT.nullable(),
              'total_received': DECIMAL.nullable(),
              'total_sent': DECIMAL.nullable(),
              'creation_height': INT.nullable(),
            }).nullable(),
            'stale': STRING.nullable(),
          })
        ).nullable(),
      })
    ).nullable(),
    'balance_updates': ListDataType(
      ObjectDataType({
        'chain_sequence_number': INT,
        'account': STRING,
        'account_creation_height': INT,
        'change': DECIMAL,
        'rebasing_numerator': DECIMAL.nullable(),
        'rebasing_denominator': DECIMAL.nullable(),
        'rebasing_rounding_mode': STRING.nullable(),
        'previous_balance': DECIMAL,
        'new_balance': DECIMAL,
        'transaction_sequence_number': INT,
        'n_debits': INT,
        'n_credits': INT,
        'previous_debit_height': INT.nullable(),
        'previous_credit_height': INT.nullable(),
        'previous_chain_sequence_number': INT.nullable(),
        'sub_account': ObjectDataType({
          'sub_account': STRING.nullable(),
          'previous_balance': DECIMAL.nullable(),
          'new_balance': DECIMAL.nullable(),
          'n_debits': INT.nullable(),
          'n_credits': INT.nullable(),
          'previous_credit_height': INT.nullable(),
          'previous_debit_height': INT.nullable(),
          'previous_chain_sequence_number': INT.nullable(),
          'total_received': DECIMAL.nullable(),
          'total_sent': DECIMAL.nullable(),
          'creation_height': INT.nullable(),
        }).nullable(),
        'stale': STRING.nullable(),
      })
    ).nullable(),
  }),
  '/blockchain-v2/{asset}/blocks/{block_hash}/transactions/{txid}': ObjectDataType({
    'txid': STRING,
    'consensus_time': DATE_TIME,
    'miner_time': DATE_TIME.nullable(),
    'tx_position': INT,
    'min_chain_sequence_number': INT.nullable(),
    'max_chain_sequence_number': INT.nullable(),
    'n_balance_updates': INT,
    'amount': DECIMAL,
    'stale': STRING.nullable(),
    'block_hash': STRING,
    'height': INT,
    'version': STRING.nullable(),
    'physical_size': DECIMAL.nullable(),
    'consensus_size': DECIMAL.nullable(),
    'fee': DECIMAL.nullable(),
    'balance_updates': ListDataType(
      ObjectDataType({
        'chain_sequence_number': INT,
        'account': STRING,
        'account_creation_height': INT,
        'change': DECIMAL,
        'rebasing_numerator': DECIMAL.nullable(),
        'rebasing_denominator': DECIMAL.nullable(),
        'rebasing_rounding_mode': STRING.nullable(),
        'previous_balance': DECIMAL,
        'new_balance': DECIMAL,
        'transaction_sequence_number': INT,
        'n_debits': INT,
        'n_credits': INT,
        'previous_debit_height': INT.nullable(),
        'previous_credit_height': INT.nullable(),
        'previous_chain_sequence_number': INT.nullable(),
        'sub_account': ObjectDataType({
          'sub_account': STRING.nullable(),
          'previous_balance': DECIMAL.nullable(),
          'new_balance': DECIMAL.nullable(),
          'n_debits': INT.nullable(),
          'n_credits': INT.nullable(),
          'previous_credit_height': INT.nullable(),
          'previous_debit_height': INT.nullable(),
          'previous_chain_sequence_number': INT.nullable(),
          'total_received': DECIMAL.nullable(),
          'total_sent': DECIMAL.nullable(),
          'creation_height': INT.nullable(),
        }).nullable(),
        'stale': STRING.nullable(),
      })
    ).nullable(),
  }),
  '/blockchain-v2/{asset}/rebasing-changes': ListDataType(
    ObjectDataType({
      'chain_sequence_number': INT,
      'block_hash': STRING,
      'height': INT,
      'consensus_time': DATE_TIME,
      'txid': STRING.nullable(),
      'transaction_sequence_number': INT.nullable(),
      'previous_rebasing_numerator': DECIMAL,
      'previous_rebasing_denominator': DECIMAL,
      'previous_rebasing_rounding_mode': STRING,
      'new_rebasing_numerator': DECIMAL,
      'new_rebasing_denominator': DECIMAL,
      'new_rebasing_rounding_mode': STRING,
      'stale': STRING.nullable(),
    })
  ),
  '/blockchain-v2/{asset}/sub-accounts': ListDataType(
    ObjectDataType({
      'sub_account': STRING,
      'account': STRING,
      'type': STRING,
      'creation_height': INT,
      'creation_time': DATE_TIME,
      'creation_chain_sequence_number': INT,
      'creation_block_hash': STRING,
      'balance': DECIMAL.nullable(),
    })
  ),
  '/blockchain-v2/{asset}/transactions': ListDataType(
    ObjectDataType({
      'txid': STRING,
      'consensus_time': DATE_TIME,
      'miner_time': DATE_TIME.nullable(),
      'tx_position': INT,
      'min_chain_sequence_number': INT.nullable(),
      'max_chain_sequence_number': INT.nullable(),
      'n_balance_updates': INT,
      'amount': DECIMAL,
      'stale': STRING.nullable(),
      'block_hash': STRING,
      'height': INT,
      'version': STRING.nullable(),
      'physical_size': DECIMAL.nullable(),
      'consensus_size': DECIMAL.nullable(),
      'fee': DECIMAL.nullable(),
    })
  ),
  '/blockchain-v2/{asset}/transactions/{txid}': ObjectDataType({
    'txid': STRING,
    'consensus_time': DATE_TIME,
    'miner_time': DATE_TIME.nullable(),
    'tx_position': INT,
    'min_chain_sequence_number': INT.nullable(),
    'max_chain_sequence_number': INT.nullable(),
    'n_balance_updates': INT,
    'amount': DECIMAL,
    'stale': STRING.nullable(),
    'block_hash': STRING,
    'height': INT,
    'version': STRING.nullable(),
    'physical_size': DECIMAL.nullable(),
    'consensus_size': DECIMAL.nullable(),
    'fee': DECIMAL.nullable(),
    'balance_updates': ListDataType(
      ObjectDataType({
        'chain_sequence_number': INT,
        'account': STRING,
        'account_creation_height': INT,
        'change': DECIMAL,
        'rebasing_numerator': DECIMAL.nullable(),
        'rebasing_denominator': DECIMAL.nullable(),
        'rebasing_rounding_mode': STRING.nullable(),
        'previous_balance': DECIMAL,
        'new_balance': DECIMAL,
        'transaction_sequence_number': INT,
        'n_debits': INT,
        'n_credits': INT,
        'previous_debit_height': INT.nullable(),
        'previous_credit_height': INT.nullable(),
        'previous_chain_sequence_number': INT.nullable(),
        'sub_account': ObjectDataType({
          'sub_account': STRING.nullable(),
          'previous_balance': DECIMAL.nullable(),
          'new_balance': DECIMAL.nullable(),
          'n_debits': INT.nullable(),
          'n_credits': INT.nullable(),
          'previous_credit_height': INT.nullable(),
          'previous_debit_height': INT.nullable(),
          'previous_chain_sequence_number': INT.nullable(),
          'total_received': DECIMAL.nullable(),
          'total_sent': DECIMAL.nullable(),
          'creation_height': INT.nullable(),
        }).nullable(),
        'stale': STRING.nullable(),
      })
    ).nullable(),
  }),
  '/blockchain/{asset}/transaction-tracker': ListDataType(
    ObjectDataType({
      'txid': STRING,
      'time': DATE_TIME,
      'first_seen_time': DATE_TIME,
      'status': STRING,
      'status_update_time': DATE_TIME,
      'mempool_approx_queue_position': STRING.nullable(),
      'next_block_approx_settlement_probability_pct': DECIMAL.nullable(),
      'block_hash': STRING.nullable(),
      'height': INT.nullable(),
      'n_confirmations': INT.nullable(),
      'status_updates': ListDataType(
        ObjectDataType({
          'time': DATE_TIME,
          'status': STRING,
          'block_hash': STRING.nullable(),
          'height': INT.nullable(),
          'removal_reason': STRING.nullable(),
          'replacement_txid': STRING.nullable(),
        })
      ),
      'details': ObjectDataType({
        'version': STRING.nullable(),
        'amount': DECIMAL,
        'replace_by_fee_supported': BOOLEAN.nullable(),
        'fee': DECIMAL.nullable(),
        'feerate': DECIMAL.nullable(),
        'mempool_feerate_mean_at_first_seen_time': DECIMAL.nullable(),
        'mempool_feerate_min_at_first_seen_time': DECIMAL.nullable(),
        'consensus_size': DECIMAL.nullable(),
        'physical_size': DECIMAL.nullable(),
      }),
      'geo': ListDataType(
        ObjectDataType({
          'location': STRING,
          'seen_time': DATE_TIME,
        })
      ).nullable(),
      'replacement_for_txid': STRING.nullable(),
      'inputs': ListDataType(
        ObjectDataType({
          'address': STRING,
        })
      ).nullable(),
      'outputs': ListDataType(
        ObjectDataType({
          'address': STRING,
        })
      ).nullable(),
    })
  ),
  '/catalog-all-v2/asset-chains': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all-v2/asset-metrics': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
              'min_height': INT.nullable(),
              'max_height': INT.nullable(),
              'min_hash': STRING.nullable(),
              'max_hash': STRING.nullable(),
              'community': BOOLEAN.nullable(),
              'experimental': BOOLEAN.nullable(),
            })
          ),
        })
      ),
    })
  ),
  '/catalog-all-v2/blockchain-v2/accounts': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog-all-v2/blockchain-v2/balance-updates': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog-all-v2/blockchain-v2/blocks': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog-all-v2/blockchain-v2/rebasing-changes': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog-all-v2/blockchain-v2/transactions': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog-all-v2/exchange-asset-metrics': ListDataType(
    ObjectDataType({
      'exchange_asset': STRING,
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ),
    })
  ),
  '/catalog-all-v2/exchange-metrics': ListDataType(
    ObjectDataType({
      'exchange': STRING,
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ),
    })
  ),
  '/catalog-all-v2/exchange-pair-metrics': ListDataType(
    ObjectDataType({
      'exchange_pair': STRING,
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ),
    })
  ),
  '/catalog-all-v2/index-candles': ListDataType(
    ObjectDataType({
      'index': STRING,
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ).nullable(),
    })
  ),
  '/catalog-all-v2/index-levels': ListDataType(
    ObjectDataType({
      'index': STRING,
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ),
    })
  ),
  '/catalog-all-v2/institution-metrics': ListDataType(
    ObjectDataType({
      'institution': STRING,
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ),
    })
  ),
  '/catalog-all-v2/market-candles': ListDataType(
    ObjectDataType({
      'market': STRING,
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ).nullable(),
    })
  ),
  '/catalog-all-v2/market-contract-prices': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all-v2/market-funding-rates': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all-v2/market-funding-rates-predicted': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all-v2/market-greeks': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all-v2/market-implied-volatility': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all-v2/market-liquidations': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all-v2/market-metrics': ListDataType(
    ObjectDataType({
      'market': STRING,
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ),
    })
  ),
  '/catalog-all-v2/market-openinterest': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all-v2/market-orderbooks': ListDataType(
    ObjectDataType({
      'market': STRING,
      'depths': ListDataType(
        ObjectDataType({
          'depth': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ),
    })
  ),
  '/catalog-all-v2/market-quotes': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all-v2/market-trades': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all-v2/mempool-feerates': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all-v2/mining-pool-tips-summary': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all-v2/pair-candles': ListDataType(
    ObjectDataType({
      'pair': STRING,
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ).nullable(),
    })
  ),
  '/catalog-all-v2/pair-metrics': ListDataType(
    ObjectDataType({
      'pair': STRING,
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ),
    })
  ),
  '/catalog-all-v2/transaction-tracker': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all/asset-alerts': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'name': STRING,
      'conditions': ListDataType(
        ObjectDataType({
          'description': STRING,
          'threshold': STRING.nullable(),
          'constituents': ListDataType(
            STRING
          ),
        })
      ),
    })
  ),
  '/catalog-all/asset-chains': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all/asset-metrics': ListDataType(
    ObjectDataType({
      'metric': STRING,
      'full_name': STRING,
      'description': STRING,
      'product': STRING,
      'category': STRING,
      'subcategory': STRING,
      'unit': STRING,
      'data_type': STRING,
      'type': STRING,
      'reviewable': BOOLEAN.nullable(),
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'assets': ListDataType(
            STRING
          ),
        })
      ),
      'display_name': STRING.nullable(),
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog-all/assets': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'full_name': STRING,
      'experimental': BOOLEAN.nullable(),
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
              'min_height': INT.nullable(),
              'max_height': INT.nullable(),
              'min_hash': STRING.nullable(),
              'max_hash': STRING.nullable(),
              'community': BOOLEAN.nullable(),
              'experimental': BOOLEAN.nullable(),
            })
          ),
        })
      ).nullable(),
      'exchanges': ListDataType(
        STRING
      ),
      'markets': ListDataType(
        STRING
      ),
      'atlas': BOOLEAN.nullable(),
    })
  ),
  '/catalog-all/exchange-asset-metrics': ListDataType(
    ObjectDataType({
      'metric': STRING,
      'full_name': STRING,
      'description': STRING,
      'product': STRING,
      'category': STRING,
      'subcategory': STRING,
      'unit': STRING,
      'data_type': STRING,
      'type': STRING,
      'reviewable': BOOLEAN.nullable(),
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'exchange_assets': ListDataType(
            STRING
          ),
        })
      ),
      'display_name': STRING.nullable(),
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog-all/exchange-assets': ListDataType(
    ObjectDataType({
      'exchange_asset': STRING.nullable(),
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ).nullable(),
    })
  ),
  '/catalog-all/exchange-metrics': ListDataType(
    ObjectDataType({
      'metric': STRING,
      'full_name': STRING,
      'description': STRING,
      'product': STRING,
      'category': STRING,
      'subcategory': STRING,
      'unit': STRING,
      'data_type': STRING,
      'type': STRING,
      'reviewable': BOOLEAN.nullable(),
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'exchanges': ListDataType(
            STRING
          ),
        })
      ),
      'display_name': STRING.nullable(),
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog-all/exchanges': ListDataType(
    ObjectDataType({
      'exchange': STRING,
      'markets': ListDataType(
        STRING
      ),
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ).nullable(),
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all/index-candles': ListDataType(
    ObjectDataType({
      'index': STRING,
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ).nullable(),
    })
  ),
  '/catalog-all/indexes': ListDataType(
    ObjectDataType({
      'index': STRING,
      'full_name': STRING,
      'description': STRING,
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ),
      'type': STRING.nullable(),
    })
  ),
  '/catalog-all/institution-metrics': ListDataType(
    ObjectDataType({
      'metric': STRING,
      'full_name': STRING,
      'description': STRING,
      'product': STRING,
      'category': STRING,
      'subcategory': STRING,
      'unit': STRING,
      'data_type': STRING,
      'type': STRING,
      'reviewable': BOOLEAN.nullable(),
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'institutions': ListDataType(
            STRING
          ),
        })
      ),
      'display_name': STRING.nullable(),
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog-all/institutions': ListDataType(
    ObjectDataType({
      'institution': STRING,
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ).nullable(),
    })
  ),
  '/catalog-all/market-candles': ListDataType(
    ObjectDataType({
      'market': STRING,
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ).nullable(),
    })
  ),
  '/catalog-all/market-contract-prices': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all/market-funding-rates': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all/market-greeks': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all/market-implied-volatility': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all/market-liquidations': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all/market-metrics': ListDataType(
    ObjectDataType({
      'market': STRING,
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ),
    })
  ),
  '/catalog-all/market-openinterest': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all/market-orderbooks': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
      'depths': ListDataType(
        ObjectDataType({
          'depth': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ),
    })
  ),
  '/catalog-all/market-quotes': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all/market-trades': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all/markets': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
      'trades': ObjectDataType({
        'min_time': DATE_TIME,
        'max_time': DATE_TIME,
      }).nullable(),
      'orderbooks': ObjectDataType({
        'min_time': DATE_TIME,
        'max_time': DATE_TIME,
      }).nullable(),
      'quotes': ObjectDataType({
        'min_time': DATE_TIME,
        'max_time': DATE_TIME,
      }).nullable(),
      'funding_rates': ObjectDataType({
        'min_time': DATE_TIME,
        'max_time': DATE_TIME,
      }).nullable(),
      'openinterest': ObjectDataType({
        'min_time': DATE_TIME,
        'max_time': DATE_TIME,
      }).nullable(),
      'liquidations': ObjectDataType({
        'min_time': DATE_TIME,
        'max_time': DATE_TIME,
      }).nullable(),
      'exchange': STRING,
      'base': STRING.nullable(),
      'quote': STRING.nullable(),
      'symbol': STRING.nullable(),
      'type': STRING,
      'size_asset': STRING.nullable(),
      'margin_asset': STRING.nullable(),
      'strike': DECIMAL.nullable(),
      'option_contract_type': STRING.nullable(),
      'is_european': BOOLEAN.nullable(),
      'contract_size': DECIMAL.nullable(),
      'tick_size': DECIMAL.nullable(),
      'listing': DATE_TIME.nullable(),
      'expiration': DATE_TIME.nullable(),
      'settlement_price': DECIMAL.nullable(),
      'pool_config_id': STRING.nullable(),
      'contract_address': STRING.nullable(),
      'fee': DECIMAL.nullable(),
      'base_address': STRING.nullable(),
      'quote_address': STRING.nullable(),
      'status': STRING.nullable(),
      'order_amount_increment': DECIMAL.nullable(),
      'order_amount_min': DECIMAL.nullable(),
      'order_amount_max': DECIMAL.nullable(),
      'order_price_increment': DECIMAL.nullable(),
      'order_price_min': DECIMAL.nullable(),
      'order_price_max': DECIMAL.nullable(),
      'order_size_min': DECIMAL.nullable(),
      'order_taker_fee': DECIMAL.nullable(),
      'order_maker_fee': DECIMAL.nullable(),
      'margin_trading_enabled': BOOLEAN.nullable(),
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog-all/mempool-feerates': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all/metrics': ListDataType(
    ObjectDataType({
      'metric': STRING,
      'full_name': STRING,
      'description': STRING,
      'category': STRING,
      'subcategory': STRING,
      'unit': STRING,
      'data_type': STRING,
      'type': STRING,
      'reviewable': BOOLEAN.nullable(),
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'assets': ListDataType(
            STRING
          ),
        })
      ),
      'display_name': STRING.nullable(),
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog-all/mining-pool-tips-summary': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-all/pair-candles': ListDataType(
    ObjectDataType({
      'pair': STRING,
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ).nullable(),
    })
  ),
  '/catalog-all/pair-metrics': ListDataType(
    ObjectDataType({
      'metric': STRING,
      'full_name': STRING,
      'description': STRING,
      'product': STRING,
      'category': STRING,
      'subcategory': STRING,
      'unit': STRING,
      'data_type': STRING,
      'type': STRING,
      'reviewable': BOOLEAN.nullable(),
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'pairs': ListDataType(
            STRING
          ),
        })
      ),
      'display_name': STRING.nullable(),
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog-all/pairs': ListDataType(
    ObjectDataType({
      'pair': STRING,
      'full_name': STRING.nullable(),
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ).nullable(),
    })
  ),
  '/catalog-all/transaction-tracker': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-v2/asset-chains': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-v2/asset-metrics': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
              'min_height': INT.nullable(),
              'max_height': INT.nullable(),
              'min_hash': STRING.nullable(),
              'max_hash': STRING.nullable(),
              'community': BOOLEAN.nullable(),
              'experimental': BOOLEAN.nullable(),
            })
          ),
        })
      ),
    })
  ),
  '/catalog-v2/blockchain-v2/accounts': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog-v2/blockchain-v2/balance-updates': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog-v2/blockchain-v2/blocks': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog-v2/blockchain-v2/rebasing-changes': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog-v2/blockchain-v2/transactions': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog-v2/exchange-asset-metrics': ListDataType(
    ObjectDataType({
      'exchange_asset': STRING,
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ),
    })
  ),
  '/catalog-v2/exchange-metrics': ListDataType(
    ObjectDataType({
      'exchange': STRING,
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ),
    })
  ),
  '/catalog-v2/exchange-pair-metrics': ListDataType(
    ObjectDataType({
      'exchange_pair': STRING,
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ),
    })
  ),
  '/catalog-v2/index-candles': ListDataType(
    ObjectDataType({
      'index': STRING,
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ).nullable(),
    })
  ),
  '/catalog-v2/index-levels': ListDataType(
    ObjectDataType({
      'index': STRING,
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ),
    })
  ),
  '/catalog-v2/institution-metrics': ListDataType(
    ObjectDataType({
      'institution': STRING,
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ),
    })
  ),
  '/catalog-v2/market-candles': ListDataType(
    ObjectDataType({
      'market': STRING,
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ).nullable(),
    })
  ),
  '/catalog-v2/market-contract-prices': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-v2/market-funding-rates': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-v2/market-funding-rates-predicted': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-v2/market-greeks': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-v2/market-implied-volatility': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-v2/market-liquidations': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-v2/market-metrics': ListDataType(
    ObjectDataType({
      'market': STRING,
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ),
    })
  ),
  '/catalog-v2/market-openinterest': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-v2/market-orderbooks': ListDataType(
    ObjectDataType({
      'market': STRING,
      'depths': ListDataType(
        ObjectDataType({
          'depth': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ),
    })
  ),
  '/catalog-v2/market-quotes': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-v2/market-trades': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-v2/mempool-feerates': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-v2/mining-pool-tips-summary': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog-v2/pair-candles': ListDataType(
    ObjectDataType({
      'pair': STRING,
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ).nullable(),
    })
  ),
  '/catalog-v2/pair-metrics': ListDataType(
    ObjectDataType({
      'pair': STRING,
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ),
    })
  ),
  '/catalog-v2/transaction-tracker': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog/asset-alerts': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'name': STRING,
      'conditions': ListDataType(
        ObjectDataType({
          'description': STRING,
          'threshold': STRING.nullable(),
          'constituents': ListDataType(
            STRING
          ),
        })
      ),
    })
  ),
  '/catalog/asset-chains': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog/asset-metrics': ListDataType(
    ObjectDataType({
      'metric': STRING,
      'full_name': STRING,
      'description': STRING,
      'product': STRING,
      'category': STRING,
      'subcategory': STRING,
      'unit': STRING,
      'data_type': STRING,
      'type': STRING,
      'reviewable': BOOLEAN.nullable(),
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'assets': ListDataType(
            STRING
          ),
        })
      ),
      'display_name': STRING.nullable(),
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog/assets': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'full_name': STRING,
      'experimental': BOOLEAN.nullable(),
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
              'min_height': INT.nullable(),
              'max_height': INT.nullable(),
              'min_hash': STRING.nullable(),
              'max_hash': STRING.nullable(),
              'community': BOOLEAN.nullable(),
              'experimental': BOOLEAN.nullable(),
            })
          ),
        })
      ).nullable(),
      'exchanges': ListDataType(
        STRING
      ),
      'markets': ListDataType(
        STRING
      ),
      'atlas': BOOLEAN.nullable(),
    })
  ),
  '/catalog/exchange-asset-metrics': ListDataType(
    ObjectDataType({
      'metric': STRING,
      'full_name': STRING,
      'description': STRING,
      'product': STRING,
      'category': STRING,
      'subcategory': STRING,
      'unit': STRING,
      'data_type': STRING,
      'type': STRING,
      'reviewable': BOOLEAN.nullable(),
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'exchange_assets': ListDataType(
            STRING
          ),
        })
      ),
      'display_name': STRING.nullable(),
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog/exchange-assets': ListDataType(
    ObjectDataType({
      'exchange_asset': STRING.nullable(),
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ).nullable(),
    })
  ),
  '/catalog/exchange-metrics': ListDataType(
    ObjectDataType({
      'metric': STRING,
      'full_name': STRING,
      'description': STRING,
      'product': STRING,
      'category': STRING,
      'subcategory': STRING,
      'unit': STRING,
      'data_type': STRING,
      'type': STRING,
      'reviewable': BOOLEAN.nullable(),
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'exchanges': ListDataType(
            STRING
          ),
        })
      ),
      'display_name': STRING.nullable(),
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog/exchanges': ListDataType(
    ObjectDataType({
      'exchange': STRING,
      'markets': ListDataType(
        STRING
      ),
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ).nullable(),
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog/index-candles': ListDataType(
    ObjectDataType({
      'index': STRING,
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ).nullable(),
    })
  ),
  '/catalog/indexes': ListDataType(
    ObjectDataType({
      'index': STRING,
      'full_name': STRING,
      'description': STRING,
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ),
      'type': STRING.nullable(),
    })
  ),
  '/catalog/institution-metrics': ListDataType(
    ObjectDataType({
      'metric': STRING,
      'full_name': STRING,
      'description': STRING,
      'product': STRING,
      'category': STRING,
      'subcategory': STRING,
      'unit': STRING,
      'data_type': STRING,
      'type': STRING,
      'reviewable': BOOLEAN.nullable(),
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'institutions': ListDataType(
            STRING
          ),
        })
      ),
      'display_name': STRING.nullable(),
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog/institutions': ListDataType(
    ObjectDataType({
      'institution': STRING,
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ).nullable(),
    })
  ),
  '/catalog/market-candles': ListDataType(
    ObjectDataType({
      'market': STRING,
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ).nullable(),
    })
  ),
  '/catalog/market-contract-prices': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog/market-funding-rates': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog/market-greeks': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog/market-implied-volatility': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog/market-liquidations': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog/market-metrics': ListDataType(
    ObjectDataType({
      'market': STRING,
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ),
    })
  ),
  '/catalog/market-openinterest': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog/market-orderbooks': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
      'depths': ListDataType(
        ObjectDataType({
          'depth': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ),
    })
  ),
  '/catalog/market-quotes': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog/market-trades': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog/markets': ListDataType(
    ObjectDataType({
      'market': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
      'trades': ObjectDataType({
        'min_time': DATE_TIME,
        'max_time': DATE_TIME,
      }).nullable(),
      'orderbooks': ObjectDataType({
        'min_time': DATE_TIME,
        'max_time': DATE_TIME,
      }).nullable(),
      'quotes': ObjectDataType({
        'min_time': DATE_TIME,
        'max_time': DATE_TIME,
      }).nullable(),
      'funding_rates': ObjectDataType({
        'min_time': DATE_TIME,
        'max_time': DATE_TIME,
      }).nullable(),
      'openinterest': ObjectDataType({
        'min_time': DATE_TIME,
        'max_time': DATE_TIME,
      }).nullable(),
      'liquidations': ObjectDataType({
        'min_time': DATE_TIME,
        'max_time': DATE_TIME,
      }).nullable(),
      'exchange': STRING,
      'base': STRING.nullable(),
      'quote': STRING.nullable(),
      'symbol': STRING.nullable(),
      'type': STRING,
      'size_asset': STRING.nullable(),
      'margin_asset': STRING.nullable(),
      'strike': DECIMAL.nullable(),
      'option_contract_type': STRING.nullable(),
      'is_european': BOOLEAN.nullable(),
      'contract_size': DECIMAL.nullable(),
      'tick_size': DECIMAL.nullable(),
      'listing': DATE_TIME.nullable(),
      'expiration': DATE_TIME.nullable(),
      'settlement_price': DECIMAL.nullable(),
      'pool_config_id': STRING.nullable(),
      'contract_address': STRING.nullable(),
      'fee': DECIMAL.nullable(),
      'base_address': STRING.nullable(),
      'quote_address': STRING.nullable(),
      'status': STRING.nullable(),
      'order_amount_increment': DECIMAL.nullable(),
      'order_amount_min': DECIMAL.nullable(),
      'order_amount_max': DECIMAL.nullable(),
      'order_price_increment': DECIMAL.nullable(),
      'order_price_min': DECIMAL.nullable(),
      'order_price_max': DECIMAL.nullable(),
      'order_size_min': DECIMAL.nullable(),
      'order_taker_fee': DECIMAL.nullable(),
      'order_maker_fee': DECIMAL.nullable(),
      'margin_trading_enabled': BOOLEAN.nullable(),
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog/mempool-feerates': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog/metrics': ListDataType(
    ObjectDataType({
      'metric': STRING,
      'full_name': STRING,
      'description': STRING,
      'category': STRING,
      'subcategory': STRING,
      'unit': STRING,
      'data_type': STRING,
      'type': STRING,
      'reviewable': BOOLEAN.nullable(),
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'assets': ListDataType(
            STRING
          ),
        })
      ),
      'display_name': STRING.nullable(),
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog/mining-pool-tips-summary': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/catalog/pair-candles': ListDataType(
    ObjectDataType({
      'pair': STRING,
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'min_time': DATE_TIME,
          'max_time': DATE_TIME,
        })
      ).nullable(),
    })
  ),
  '/catalog/pair-metrics': ListDataType(
    ObjectDataType({
      'metric': STRING,
      'full_name': STRING,
      'description': STRING,
      'product': STRING,
      'category': STRING,
      'subcategory': STRING,
      'unit': STRING,
      'data_type': STRING,
      'type': STRING,
      'reviewable': BOOLEAN.nullable(),
      'frequencies': ListDataType(
        ObjectDataType({
          'frequency': STRING,
          'pairs': ListDataType(
            STRING
          ),
        })
      ),
      'display_name': STRING.nullable(),
      'experimental': BOOLEAN.nullable(),
    })
  ),
  '/catalog/pairs': ListDataType(
    ObjectDataType({
      'pair': STRING,
      'full_name': STRING.nullable(),
      'metrics': ListDataType(
        ObjectDataType({
          'metric': STRING,
          'frequencies': ListDataType(
            ObjectDataType({
              'frequency': STRING,
              'min_time': DATE_TIME,
              'max_time': DATE_TIME,
            })
          ),
        })
      ).nullable(),
    })
  ),
  '/catalog/transaction-tracker': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'min_time': DATE_TIME,
      'max_time': DATE_TIME,
    })
  ),
  '/constituent-snapshots/asset-metrics': ListDataType(
    ObjectDataType({
      'time': DATE_TIME,
    })
  ),
  '/constituent-timeframes/asset-metrics': ListDataType(
    ObjectDataType({
      'start_time': DATE_TIME,
      'end_time': DATE_TIME.nullable(),
    })
  ),
  '/jobs': ListDataType(
    ObjectDataType({
      'id': STRING,
      'status': STRING,
      'creation_time': STRING,
      'completion_time': STRING.nullable(),
      'expiration_time': STRING.nullable(),
      'error': ObjectDataType({
        'type': STRING,
        'message': STRING.nullable(),
      }).nullable(),
      'results': ListDataType(
        ObjectDataType({
          'url': STRING,
        })
      ).nullable(),
      'warnings': ListDataType(
        STRING
      ),
    })
  ),
  '/profile/assets': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'full_name': STRING,
      'description': STRING,
      'overview': STRING,
      'token_purpose': ListDataType(
        STRING
      ),
      'project_team': STRING.nullable(),
      'foundation': STRING.nullable(),
      'website': STRING.nullable(),
      'whitepaper_url': STRING.nullable(),
      'creation_date': DATE_TIME,
      'token_generation_event_supply': STRING.nullable(),
      'supply_cap': INT.nullable(),
      'initial_supply_token_distribution': ListDataType(
        ObjectDataType({
          'initial_supply_allocation': INT.nullable(),
          'initial_supply_distribution': STRING.nullable(),
        })
      ).nullable(),
      'vesting_schedule': ListDataType(
        ObjectDataType({
          'vesting_schedule_allocation': STRING.nullable(),
          'vesting_schedule_cliff': STRING.nullable(),
          'vesting_schedule_total_unlock_time': DATE_TIME.nullable(),
        })
      ).nullable(),
      'new_token_issuance_recipient': ListDataType(
        STRING
      ),
      'issuing_networks': ListDataType(
        STRING
      ),
      'bridged_networks': ListDataType(
        STRING
      ),
      'issuance_schedule_changes': STRING.nullable(),
      'significant_historical_changes': ListDataType(
        ObjectDataType({
          'date': STRING.nullable(),
          'details': STRING.nullable(),
        })
      ).nullable(),
      'upgrade_history': ListDataType(
        ObjectDataType({
          'date': STRING.nullable(),
          'details': STRING.nullable(),
        })
      ).nullable(),
      'blog_updates': STRING.nullable(),
      'project_github_repository': ListDataType(
        STRING
      ),
      'asset_regulation': STRING.nullable(),
      'asset_regulated_products': ListDataType(
        STRING
      ),
      'etp_custodians': ListDataType(
        STRING
      ),
    })
  ),
  '/profile/networks': ListDataType(
    ObjectDataType({
      'full_name': STRING,
      'network': STRING,
      'overview': STRING.nullable(),
      'consensus_mechanism': STRING.nullable(),
      'hashing_algorithm': STRING.nullable(),
      'transaction_finality': STRING.nullable(),
      'available_clients': ListDataType(
        STRING
      ),
      'smart_contract_deployment': STRING.nullable(),
      'foundation': ListDataType(
        STRING
      ),
      'founding_team_identity': STRING.nullable(),
      'repository': ListDataType(
        ObjectDataType({
          'github_repository': STRING.nullable(),
          'github_url': STRING.nullable(),
        })
      ).nullable(),
      'transaction_visibility': STRING.nullable(),
      'native_fee_token': STRING.nullable(),
      'significant_historical_changes': ListDataType(
        ObjectDataType({
          'date': STRING.nullable(),
          'details': STRING.nullable(),
        })
      ).nullable(),
      'upgrade_history': ListDataType(
        ObjectDataType({
          'date': STRING.nullable(),
          'details': STRING.nullable(),
        })
      ).nullable(),
      'rollup_info': ListDataType(
        ObjectDataType({
          'rollup_type': STRING.nullable(),
          'state_validation': STRING.nullable(),
        })
      ).nullable(),
      'modular_or_monolithic': STRING,
      'network_scaling_solution': STRING.nullable(),
      'type_of_network': STRING.nullable(),
      'chain_explorers': ListDataType(
        STRING
      ),
    })
  ),
  '/reference-data/asset-metrics': ListDataType(
    ObjectDataType({
      'metric': STRING,
      'full_name': STRING,
      'description': STRING,
      'product': STRING,
      'category': STRING,
      'subcategory': STRING,
      'unit': STRING,
      'data_type': STRING,
      'type': STRING,
      'reviewable': BOOLEAN.nullable(),
      'display_name': STRING.nullable(),
      'experimental': BOOLEAN.nullable(),
      'constituent_snapshots_url': STRING.nullable(),
      'constituent_timeframes_url': STRING.nullable(),
      'docs_url': STRING.nullable(),
    })
  ),
  '/reference-data/assets': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'full_name': STRING,
      'talos': ListDataType(
        ObjectDataType({
          'cm_ext_asset': STRING.nullable(),
          'cm_ext_asset_by_id': STRING.nullable(),
          'symbol': STRING.nullable(),
          'currency_id': STRING.nullable(),
          'description': STRING.nullable(),
          'alias_for_currency': STRING.nullable(),
          'alias_for_chain_symbol': STRING.nullable(),
        })
      ).nullable(),
    })
  ),
  '/reference-data/exchange-asset-metrics': ListDataType(
    ObjectDataType({
      'metric': STRING,
      'full_name': STRING,
      'description': STRING,
      'product': STRING,
      'category': STRING,
      'subcategory': STRING,
      'unit': STRING,
      'data_type': STRING,
      'type': STRING,
      'reviewable': BOOLEAN.nullable(),
      'display_name': STRING.nullable(),
      'experimental': BOOLEAN.nullable(),
      'constituent_snapshots_url': STRING.nullable(),
      'constituent_timeframes_url': STRING.nullable(),
      'docs_url': STRING.nullable(),
    })
  ),
  '/reference-data/exchange-metrics': ListDataType(
    ObjectDataType({
      'metric': STRING,
      'full_name': STRING,
      'description': STRING,
      'product': STRING,
      'category': STRING,
      'subcategory': STRING,
      'unit': STRING,
      'data_type': STRING,
      'type': STRING,
      'reviewable': BOOLEAN.nullable(),
      'display_name': STRING.nullable(),
      'experimental': BOOLEAN.nullable(),
      'constituent_snapshots_url': STRING.nullable(),
      'constituent_timeframes_url': STRING.nullable(),
      'docs_url': STRING.nullable(),
    })
  ),
  '/reference-data/exchange-pair-metrics': ListDataType(
    ObjectDataType({
      'metric': STRING,
      'full_name': STRING,
      'description': STRING,
      'product': STRING,
      'category': STRING,
      'subcategory': STRING,
      'unit': STRING,
      'data_type': STRING,
      'type': STRING,
      'reviewable': BOOLEAN.nullable(),
      'display_name': STRING.nullable(),
      'experimental': BOOLEAN.nullable(),
      'constituent_snapshots_url': STRING.nullable(),
      'constituent_timeframes_url': STRING.nullable(),
      'docs_url': STRING.nullable(),
    })
  ),
  '/reference-data/exchanges': ListDataType(
    ObjectDataType({
      'exchange': STRING,
      'full_name': STRING,
      'talos': ListDataType(
        ObjectDataType({
          'cm_ext_exchange': STRING.nullable(),
          'cm_ext_exchange_by_id': STRING.nullable(),
          'market': STRING.nullable(),
          'market_id': INT.nullable(),
          'display_name': STRING.nullable(),
          'short_name': STRING.nullable(),
          'type': STRING.nullable(),
          'color': STRING.nullable(),
          'depth_type': STRING.nullable(),
          'capabilities': ObjectDataType({
            'transfers': BOOLEAN.nullable(),
            'market_data': BOOLEAN.nullable(),
            'orders': BOOLEAN.nullable(),
            'balances': BOOLEAN.nullable(),
          }).nullable(),
          'flags': ObjectDataType({
            'supports_margin_cost': BOOLEAN.nullable(),
            'supports_reduce_only': BOOLEAN.nullable(),
            'supports_native_counter_currency': BOOLEAN.nullable(),
            'orders_fill_at_requested_price': BOOLEAN.nullable(),
            'supports_exchange_credit': BOOLEAN.nullable(),
          }).nullable(),
          'supported_time_in_force': ListDataType(
            STRING
          ),
        })
      ).nullable(),
    })
  ),
  '/reference-data/indexes': ListDataType(
    ObjectDataType({
      'index': STRING,
      'full_name': STRING,
      'description': STRING.nullable(),
      'type': STRING.nullable(),
    })
  ),
  '/reference-data/institution-metrics': ListDataType(
    ObjectDataType({
      'metric': STRING,
      'full_name': STRING,
      'description': STRING,
      'product': STRING,
      'category': STRING,
      'subcategory': STRING,
      'unit': STRING,
      'data_type': STRING,
      'type': STRING,
      'reviewable': BOOLEAN.nullable(),
      'display_name': STRING.nullable(),
      'experimental': BOOLEAN.nullable(),
      'constituent_snapshots_url': STRING.nullable(),
      'constituent_timeframes_url': STRING.nullable(),
      'docs_url': STRING.nullable(),
    })
  ),
  '/reference-data/market-metrics': ListDataType(
    ObjectDataType({
      'metric': STRING,
      'full_name': STRING,
      'description': STRING,
      'product': STRING,
      'category': STRING,
      'subcategory': STRING,
      'unit': STRING,
      'data_type': STRING,
      'type': STRING,
      'reviewable': BOOLEAN.nullable(),
      'display_name': STRING.nullable(),
      'experimental': BOOLEAN.nullable(),
      'constituent_snapshots_url': STRING.nullable(),
      'constituent_timeframes_url': STRING.nullable(),
      'docs_url': STRING.nullable(),
    })
  ),
  '/reference-data/markets': ListDataType(
    ObjectDataType({
      'market': STRING,
      'exchange': STRING,
      'base': STRING.nullable(),
      'quote': STRING.nullable(),
      'pair': STRING.nullable(),
      'symbol': STRING.nullable(),
      'type': STRING,
      'size_asset': STRING.nullable(),
      'margin_asset': STRING.nullable(),
      'strike': DECIMAL.nullable(),
      'option_contract_type': STRING.nullable(),
      'is_european': BOOLEAN.nullable(),
      'contract_size': DECIMAL.nullable(),
      'tick_size': DECIMAL.nullable(),
      'multiplier_size': DECIMAL.nullable(),
      'listing': DATE_TIME.nullable(),
      'expiration': DATE_TIME.nullable(),
      'settlement_price': DECIMAL.nullable(),
      'pool_config_id': STRING.nullable(),
      'contract_address': STRING.nullable(),
      'fee': DECIMAL.nullable(),
      'price_includes_fee': BOOLEAN.nullable(),
      'variable_fee': BOOLEAN.nullable(),
      'base_address': STRING.nullable(),
      'quote_address': STRING.nullable(),
      'status': STRING.nullable(),
      'order_amount_increment': DECIMAL.nullable(),
      'order_amount_min': DECIMAL.nullable(),
      'order_amount_max': DECIMAL.nullable(),
      'order_price_increment': DECIMAL.nullable(),
      'order_price_min': DECIMAL.nullable(),
      'order_price_max': DECIMAL.nullable(),
      'order_size_min': DECIMAL.nullable(),
      'order_taker_fee': DECIMAL.nullable(),
      'order_maker_fee': DECIMAL.nullable(),
      'margin_trading_enabled': BOOLEAN.nullable(),
      'experimental': BOOLEAN.nullable(),
      'base_native': STRING.nullable(),
      'quote_native': STRING.nullable(),
      'talos': ListDataType(
        ObjectDataType({
          'cm_ext_market': STRING.nullable(),
          'cm_ext_market_by_id': STRING.nullable(),
          'market': STRING.nullable(),
          'market_id': INT.nullable(),
          'symbol': STRING.nullable(),
          'security_id': INT.nullable(),
          'market_symbol': STRING.nullable(),
          'product_type': STRING.nullable(),
          'base_currency_id': INT.nullable(),
          'quote_currency_id': INT.nullable(),
          'end_time': STRING.nullable(),
          'display_name': STRING.nullable(),
          'normal_size': STRING.nullable(),
          'description': STRING.nullable(),
          'base_currency': STRING.nullable(),
          'quote_currency': STRING.nullable(),
          'counter_currency': STRING.nullable(),
          'option_type': STRING.nullable(),
          'strike_price': DECIMAL.nullable(),
          'settlement_currency': STRING.nullable(),
          'notional_multiplier': STRING.nullable(),
          'expiration': STRING.nullable(),
          'settle_value_type': STRING.nullable(),
          'size_buckets': ListDataType(
            ObjectDataType({
              'size': STRING.nullable(),
            })
          ).nullable(),
          'position_currency_id': INT.nullable(),
          'underlying_security_id': INT.nullable(),
          'underlying_quote_currency': STRING.nullable(),
          'underlying_code': STRING.nullable(),
        })
      ).nullable(),
    })
  ),
  '/reference-data/pair-metrics': ListDataType(
    ObjectDataType({
      'metric': STRING,
      'full_name': STRING,
      'description': STRING,
      'product': STRING,
      'category': STRING,
      'subcategory': STRING,
      'unit': STRING,
      'data_type': STRING,
      'type': STRING,
      'reviewable': BOOLEAN.nullable(),
      'display_name': STRING.nullable(),
      'experimental': BOOLEAN.nullable(),
      'constituent_snapshots_url': STRING.nullable(),
      'constituent_timeframes_url': STRING.nullable(),
      'docs_url': STRING.nullable(),
    })
  ),
  '/reference-data/pairs': ListDataType(
    ObjectDataType({
      'pair': STRING,
      'full_name': STRING,
    })
  ),
  '/security-master/assets': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'code': STRING.nullable(),
      'description': STRING.nullable(),
      'overview': STRING.nullable(),
      'website': STRING.nullable(),
      'whitepaper': STRING.nullable(),
      'decimals': STRING.nullable(),
      'creation_date': STRING.nullable(),
      'type': STRING.nullable(),
      'parent_asset': STRING.nullable(),
      'pricing_asset': STRING.nullable(),
      'erc20_token_contract': STRING.nullable(),
      'fiat': BOOLEAN.nullable(),
    })
  ),
  '/security-master/markets': ListDataType(
    ObjectDataType({
      'market': STRING,
      'code': STRING.nullable(),
      'pair': STRING.nullable(),
      'trades_min_time': STRING.nullable(),
      'trades_max_time': STRING.nullable(),
      'orderbooks_min_time': STRING.nullable(),
      'orderbooks_max_time': STRING.nullable(),
      'quotes_min_time': STRING.nullable(),
      'quotes_max_time': STRING.nullable(),
      'funding_rates_min_time': STRING.nullable(),
      'funding_rates_max_time': STRING.nullable(),
      'openinterest_min_time': STRING.nullable(),
      'openinterest_max_time': STRING.nullable(),
      'liquidations_min_time': STRING.nullable(),
      'liquidations_max_time': STRING.nullable(),
      'exchange': STRING,
      'base': STRING.nullable(),
      'quote': STRING.nullable(),
      'symbol': STRING.nullable(),
      'type': STRING,
      'size_asset': STRING.nullable(),
      'margin_asset': STRING.nullable(),
      'strike': DECIMAL.nullable(),
      'option_contract_type': STRING.nullable(),
      'is_european': BOOLEAN.nullable(),
      'contract_size': DECIMAL.nullable(),
      'tick_size': DECIMAL.nullable(),
      'multiplier_size': DECIMAL.nullable(),
      'listing': DATE_TIME.nullable(),
      'expiration': DATE_TIME.nullable(),
      'settlement_price': DECIMAL.nullable(),
      'pool_config_id': STRING.nullable(),
      'contract_address': STRING.nullable(),
      'fee': DECIMAL.nullable(),
      'price_includes_fee': BOOLEAN.nullable(),
      'variable_fee': BOOLEAN.nullable(),
      'base_address': STRING.nullable(),
      'quote_address': STRING.nullable(),
      'status': STRING.nullable(),
      'order_amount_increment': DECIMAL.nullable(),
      'order_amount_min': DECIMAL.nullable(),
      'order_amount_max': DECIMAL.nullable(),
      'order_price_increment': DECIMAL.nullable(),
      'order_price_min': DECIMAL.nullable(),
      'order_price_max': DECIMAL.nullable(),
      'order_size_min': DECIMAL.nullable(),
      'order_taker_fee': DECIMAL.nullable(),
      'order_maker_fee': DECIMAL.nullable(),
      'margin_trading_enabled': BOOLEAN.nullable(),
      'experimental': BOOLEAN.nullable(),
      'price_open': DECIMAL.nullable(),
      'price_close': DECIMAL.nullable(),
      'price_high': DECIMAL.nullable(),
      'price_low': DECIMAL.nullable(),
      'vwap': DECIMAL.nullable(),
      'volume': DECIMAL.nullable(),
      'candle_usd_volume': DECIMAL.nullable(),
      'candle_trades_count': INT.nullable(),
      'base_native': STRING.nullable(),
      'quote_native': STRING.nullable(),
    })
  ),
  '/taxonomy-metadata/assets': ListDataType(
    ObjectDataType({
      'taxonomy_version': STRING,
      'taxonomy_start_time': DATE_TIME,
      'taxonomy_end_time': DATE_TIME.nullable(),
      'subsectors': ListDataType(
        ObjectDataType({
          'class_id': STRING.nullable(),
          'class': STRING.nullable(),
          'sector_id': STRING.nullable(),
          'sector': STRING.nullable(),
          'subsector_id': STRING.nullable(),
          'subsector': STRING.nullable(),
        })
      ),
    })
  ),
  '/taxonomy/assets': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'full_name': STRING,
      'taxonomy_version': STRING,
      'updated_at_taxonomy_version': STRING,
      'classification_start_time': DATE_TIME,
      'classification_end_time': DATE_TIME.nullable(),
      'class_id': STRING,
      'class': STRING,
      'sector_id': STRING,
      'sector': STRING,
      'subsector_id': STRING,
      'subsector': STRING,
    })
  ),
  '/timeseries/asset-alerts': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'time': DATE_TIME,
      'block_height': INT.nullable(),
      'alert': STRING,
      'value': STRING.nullable(),
      'threshold': STRING.nullable(),
      'status': STRING,
    })
  ),
  '/timeseries/asset-chains': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'time': DATE_TIME,
      'chains_count': INT,
      'blocks_count_at_tip': INT,
      'reorg': STRING.nullable(),
      'reorg_depth': INT.nullable(),
      'chains': ListDataType(
        ListDataType(
          ObjectDataType({
            'time': DATE_TIME,
            'hash': STRING,
            'height': INT,
          })
        )
      ),
    })
  ),
  '/timeseries/asset-metrics': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'time': DATE_TIME,
    })
  ),
  '/timeseries/defi-balance-sheets': ListDataType(
    ObjectDataType({
      'defi_protocol': STRING,
      'block_height': INT,
      'time': DATE_TIME,
      'assets_total_usd': DECIMAL,
      'assets_total_count': INT,
      'liabilities_total_usd': DECIMAL,
      'liabilities_total_count': INT,
      'loans_lent_total_usd': DECIMAL,
      'tvl_total_usd': DECIMAL,
      'net_working_capital_usd': DECIMAL,
      'protocol_utilization_ratio': DECIMAL.nullable(),
      'liquid_supply_ratio': DECIMAL.nullable(),
      'current_ratio': DECIMAL.nullable(),
      'debt_to_assets_ratio': DECIMAL.nullable(),
      'assets': ListDataType(
        ObjectDataType({
          'asset': STRING,
          'total_units': DECIMAL,
          'loans_lent_units': DECIMAL.nullable(),
          'tvl_units': DECIMAL.nullable(),
          'total_usd': DECIMAL.nullable(),
          'loans_lent_usd': DECIMAL.nullable(),
          'tvl_usd': DECIMAL.nullable(),
          'total_share': DECIMAL.nullable(),
          'loans_lent_share': DECIMAL.nullable(),
          'tvl_share': DECIMAL.nullable(),
        })
      ),
      'liabilities': ListDataType(
        ObjectDataType({
          'asset': STRING,
          'total_units': DECIMAL,
          'total_usd': DECIMAL.nullable(),
          'total_share': DECIMAL.nullable(),
        })
      ),
    })
  ),
  '/timeseries/exchange-asset-metrics': ListDataType(
    ObjectDataType({
      'exchange_asset': STRING,
      'time': DATE_TIME,
    })
  ),
  '/timeseries/exchange-metrics': ListDataType(
    ObjectDataType({
      'exchange': STRING,
      'time': DATE_TIME,
    })
  ),
  '/timeseries/exchange-pair-metrics': ListDataType(
    ObjectDataType({
      'exchange_pair': STRING,
      'time': DATE_TIME,
    })
  ),
  '/timeseries/index-candles': ListDataType(
    ObjectDataType({
      'index': STRING,
      'time': DATE_TIME,
      'price_open': DECIMAL,
      'price_close': DECIMAL,
      'price_high': DECIMAL,
      'price_low': DECIMAL,
      'candle_trades_count': INT,
    })
  ),
  '/timeseries/index-constituents': ListDataType(
    ObjectDataType({
      'index': STRING,
      'time': DATE_TIME,
      'constituents': ListDataType(
        ObjectDataType({
          'asset': STRING.nullable(),
          'weight': DECIMAL.nullable(),
          'price': DECIMAL.nullable(),
          'quantity': DECIMAL.nullable(),
          'weight_basis_value': DECIMAL.nullable(),
        })
      ),
    })
  ),
  '/timeseries/index-levels': ListDataType(
    ObjectDataType({
      'index': STRING,
      'time': DATE_TIME,
      'level': DECIMAL,
      'verification': ObjectDataType({
        'timestamp': DATE_TIME.nullable(),
        'level': DECIMAL.nullable(),
        'signature': STRING,
      }).nullable(),
    })
  ),
  '/timeseries/institution-metrics': ListDataType(
    ObjectDataType({
      'institution': STRING,
      'time': DATE_TIME,
    })
  ),
  '/timeseries/market-candles': ListDataType(
    ObjectDataType({
      'market': STRING,
      'time': DATE_TIME,
      'price_open': DECIMAL,
      'price_close': DECIMAL,
      'price_high': DECIMAL,
      'price_low': DECIMAL,
      'vwap': DECIMAL,
      'volume': DECIMAL,
      'candle_usd_volume': DECIMAL,
      'candle_trades_count': INT,
    })
  ),
  '/timeseries/market-contract-prices': ListDataType(
    ObjectDataType({
      'market': STRING,
      'time': DATE_TIME,
      'mark_price': DECIMAL.nullable(),
      'index_price': DECIMAL.nullable(),
      'settlement_price_estimated': DECIMAL.nullable(),
      'database_time': DATE_TIME,
      'exchange_time': DATE_TIME.nullable(),
    })
  ),
  '/timeseries/market-funding-rates': ListDataType(
    ObjectDataType({
      'market': STRING,
      'time': DATE_TIME,
      'rate': DECIMAL.nullable(),
      'period': STRING.nullable(),
      'interval': STRING.nullable(),
      'database_time': DATE_TIME,
    })
  ),
  '/timeseries/market-funding-rates-predicted': ListDataType(
    ObjectDataType({
      'market': STRING,
      'time': DATE_TIME,
      'rate_predicted': DECIMAL,
      'rate_time': DATE_TIME.nullable(),
      'database_time': DATE_TIME,
    })
  ),
  '/timeseries/market-greeks': ListDataType(
    ObjectDataType({
      'market': STRING,
      'time': DATE_TIME,
      'vega': DECIMAL.nullable(),
      'theta': DECIMAL.nullable(),
      'rho': DECIMAL.nullable(),
      'delta': DECIMAL.nullable(),
      'gamma': DECIMAL.nullable(),
      'database_time': DATE_TIME,
      'exchange_time': DATE_TIME.nullable(),
    })
  ),
  '/timeseries/market-implied-volatility': ListDataType(
    ObjectDataType({
      'market': STRING,
      'time': DATE_TIME,
      'iv_trade': DECIMAL.nullable(),
      'iv_bid': DECIMAL.nullable(),
      'iv_ask': DECIMAL.nullable(),
      'iv_mark': DECIMAL.nullable(),
      'database_time': DATE_TIME,
      'exchange_time': DATE_TIME.nullable(),
    })
  ),
  '/timeseries/market-liquidations': ListDataType(
    ObjectDataType({
      'market': STRING,
      'time': DATE_TIME,
      'coin_metrics_id': STRING,
      'amount': DECIMAL,
      'price': DECIMAL,
      'side': STRING.nullable(),
      'type': STRING,
      'database_time': DATE_TIME,
    })
  ),
  '/timeseries/market-metrics': ListDataType(
    ObjectDataType({
      'market': STRING,
      'time': DATE_TIME,
    })
  ),
  '/timeseries/market-openinterest': ListDataType(
    ObjectDataType({
      'market': STRING,
      'time': DATE_TIME,
      'contract_count': INT,
      'value_usd': DECIMAL,
      'database_time': DATE_TIME,
      'exchange_time': DATE_TIME.nullable(),
    })
  ),
  '/timeseries/market-orderbooks': ListDataType(
    ObjectDataType({
      'market': STRING,
      'time': DATE_TIME,
      'coin_metrics_id': STRING,
      'asks': ListDataType(
        ObjectDataType({
          'price': DECIMAL,
          'size': DECIMAL,
        })
      ),
      'bids': ListDataType(
        ObjectDataType({
          'price': DECIMAL,
          'size': DECIMAL,
        })
      ),
      'database_time': DATE_TIME,
      'collect_time': DATE_TIME.nullable(),
    })
  ),
  '/timeseries/market-quotes': ListDataType(
    ObjectDataType({
      'market': STRING,
      'time': DATE_TIME,
      'coin_metrics_id': STRING,
      'ask_price': DECIMAL.nullable(),
      'ask_size': DECIMAL.nullable(),
      'bid_price': DECIMAL.nullable(),
      'bid_size': DECIMAL.nullable(),
    })
  ),
  '/timeseries/market-trades': ListDataType(
    ObjectDataType({
      'market': STRING,
      'time': DATE_TIME,
      'coin_metrics_id': STRING,
      'amount': DECIMAL,
      'price': DECIMAL,
      'side': STRING.nullable(),
      'block_hash': STRING.nullable(),
      'block_height': INT.nullable(),
      'txid': STRING.nullable(),
      'initiator': STRING.nullable(),
      'sender': STRING.nullable(),
      'beneficiary': STRING.nullable(),
      'database_time': DATE_TIME,
      'mark_price': DECIMAL.nullable(),
      'index_price': DECIMAL.nullable(),
      'iv_trade': DECIMAL.nullable(),
      'liquidation': STRING.nullable(),
    })
  ),
  '/timeseries/mempool-feerates': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'time': DATE_TIME,
      'feerates': ListDataType(
        ObjectDataType({
          'feerate': DECIMAL,
          'count': INT,
          'consensus_size': DECIMAL,
          'physical_size': DECIMAL.nullable(),
          'fees': DECIMAL,
        })
      ),
    })
  ),
  '/timeseries/mining-pool-tips-summary': ListDataType(
    ObjectDataType({
      'asset': STRING,
      'time': DATE_TIME,
      'tips_count': INT,
      'block_hashes_at_tip': INT,
      'tips': ListDataType(
        ObjectDataType({
          'last_time': DATE_TIME,
          'height': INT,
          'hash': STRING,
          'pool_count': INT,
        })
      ),
    })
  ),
  '/timeseries/pair-candles': ListDataType(
    ObjectDataType({
      'pair': STRING,
      'time': DATE_TIME,
      'price_open': DECIMAL,
      'price_close': DECIMAL,
      'price_high': DECIMAL,
      'price_low': DECIMAL,
    })
  ),
  '/timeseries/pair-metrics': ListDataType(
    ObjectDataType({
      'pair': STRING,
      'time': DATE_TIME,
    })
  ),
}

DYNAMIC_SCHEMA_BUILDERS: Dict[str, Optional[DynamicSchemaBuilder]] = {
  '/constituent-snapshots/asset-metrics': None,
  '/constituent-timeframes/asset-metrics': None,
  '/timeseries/asset-metrics': None,
  '/timeseries/exchange-asset-metrics': None,
  '/timeseries/exchange-metrics': None,
  '/timeseries/exchange-pair-metrics': None,
  '/timeseries/institution-metrics': None,
  '/timeseries/market-metrics': None,
  '/timeseries/pair-metrics': None,
}

ENDPOINT_PATH_PATTERNS = {
  '/blockchain-v2/{asset}/accounts': re.compile('^/blockchain\\-v2/(?P<asset>[^/]+)/accounts$'),
  '/blockchain-v2/{asset}/accounts/{account}/balance-updates': re.compile('^/blockchain\\-v2/(?P<asset>[^/]+)/accounts/(?P<account>[^/]+)/balance\\-updates$'),
  '/blockchain-v2/{asset}/balance-updates': re.compile('^/blockchain\\-v2/(?P<asset>[^/]+)/balance\\-updates$'),
  '/blockchain-v2/{asset}/blocks': re.compile('^/blockchain\\-v2/(?P<asset>[^/]+)/blocks$'),
  '/blockchain-v2/{asset}/blocks/{block_hash}': re.compile('^/blockchain\\-v2/(?P<asset>[^/]+)/blocks/(?P<block_hash>[^/]+)$'),
  '/blockchain-v2/{asset}/blocks/{block_hash}/transactions/{txid}': re.compile('^/blockchain\\-v2/(?P<asset>[^/]+)/blocks/(?P<block_hash>[^/]+)/transactions/(?P<txid>[^/]+)$'),
  '/blockchain-v2/{asset}/rebasing-changes': re.compile('^/blockchain\\-v2/(?P<asset>[^/]+)/rebasing\\-changes$'),
  '/blockchain-v2/{asset}/sub-accounts': re.compile('^/blockchain\\-v2/(?P<asset>[^/]+)/sub\\-accounts$'),
  '/blockchain-v2/{asset}/transactions': re.compile('^/blockchain\\-v2/(?P<asset>[^/]+)/transactions$'),
  '/blockchain-v2/{asset}/transactions/{txid}': re.compile('^/blockchain\\-v2/(?P<asset>[^/]+)/transactions/(?P<txid>[^/]+)$'),
  '/blockchain/{asset}/transaction-tracker': re.compile('^/blockchain/(?P<asset>[^/]+)/transaction\\-tracker$'),
}
